00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00030 #include "common.h"
00031 #include "dsputil.h"
00032 #include "avcodec.h"
00033 #include "mpegvideo.h"
00034 #include "vc9data.h"
00035
00036 #undef NDEBUG
00037 #include <assert.h>
00038
00039 extern const uint32_t ff_table0_dc_lum[120][2], ff_table1_dc_lum[120][2];
00040 extern const uint32_t ff_table0_dc_chroma[120][2], ff_table1_dc_chroma[120][2];
00041 extern VLC ff_msmp4_dc_luma_vlc[2], ff_msmp4_dc_chroma_vlc[2];
00042 #define MB_INTRA_VLC_BITS 9
00043 extern VLC ff_msmp4_mb_i_vlc;
00044 #define DC_VLC_BITS 9
00045 static const uint16_t table_mb_intra[64][2];
00046
00047
00048 #define HAS_ADVANCED_PROFILE 0
00049 #define TRACE 1
00050
00051 #if TRACE
00052 # define INIT_VLC(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \
00053 codes, codes_wrap, codes_size, use_static) \
00054 if (init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \
00055 codes, codes_wrap, codes_size, use_static) < 0) \
00056 { \
00057 av_log(v->s.avctx, AV_LOG_ERROR, "Error for " # vlc " (%i)\n", i); \
00058 return -1; \
00059 }
00060 #else
00061 # define INIT_VLC(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \
00062 codes, codes_wrap, codes_size, use_static) \
00063 init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \
00064 codes, codes_wrap, codes_size, use_static)
00065 #endif
00066
00069 #define PROFILE_SIMPLE 0
00070 #define PROFILE_MAIN 1
00071 #define PROFILE_COMPLEX 2
00072 #define PROFILE_ADVANCED 3
00073
00074
00077 #define QUANT_FRAME_IMPLICIT 0
00078 #define QUANT_FRAME_EXPLICIT 1
00079 #define QUANT_NON_UNIFORM 2
00080 #define QUANT_UNIFORM 3
00081
00082
00083
00085 #define DQPROFILE_FOUR_EDGES 0
00086 #define DQPROFILE_DOUBLE_EDGES 1
00087 #define DQPROFILE_SINGLE_EDGE 2
00088 #define DQPROFILE_ALL_MBS 3
00089
00090
00094 #define DQPROFILE_FOUR_EDGES 0
00095 #define DQSINGLE_BEDGE_LEFT 0
00096 #define DQSINGLE_BEDGE_TOP 1
00097 #define DQSINGLE_BEDGE_RIGHT 2
00098 #define DQSINGLE_BEDGE_BOTTOM 3
00099
00100
00103 #define DQDOUBLE_BEDGE_TOPLEFT 0
00104 #define DQDOUBLE_BEDGE_TOPRIGHT 1
00105 #define DQDOUBLE_BEDGE_BOTTOMRIGHT 2
00106 #define DQDOUBLE_BEDGE_BOTTOMLEFT 3
00107
00108
00111 #define MV_PMODE_1MV_HPEL_BILIN 0
00112 #define MV_PMODE_1MV 1
00113 #define MV_PMODE_1MV_HPEL 2
00114 #define MV_PMODE_MIXED_MV 3
00115 #define MV_PMODE_INTENSITY_COMP 4
00116
00117
00120 #define BMV_TYPE_BACKWARD 0
00121 #define BMV_TYPE_BACKWARD 0
00122 #define BMV_TYPE_FORWARD 1
00123 #define BMV_TYPE_INTERPOLATED 3
00124
00125
00127 static const uint8_t mv_pmode_table[2][5] = {
00128 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV, MV_PMODE_INTENSITY_COMP },
00129 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_INTENSITY_COMP }
00130 };
00131
00133 #define BI_TYPE 7
00134
00135 static const int fps_nr[5] = { 24, 25, 30, 50, 60 },
00136 fps_dr[2] = { 1000, 1001 };
00137 static const uint8_t pquant_table[3][32] = {
00138 {
00139 0, 1, 2, 3, 4, 5, 6, 7, 8, 6, 7, 8, 9, 10, 11, 12,
00140 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31
00141 },
00142 {
00143 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
00144 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
00145 },
00146 {
00147 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
00148 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31
00149 }
00150 };
00151
00156 #define VC9_BFRACTION_VLC_BITS 7
00157 static VLC vc9_bfraction_vlc;
00158 #define VC9_IMODE_VLC_BITS 4
00159 static VLC vc9_imode_vlc;
00160 #define VC9_NORM2_VLC_BITS 3
00161 static VLC vc9_norm2_vlc;
00162 #define VC9_NORM6_VLC_BITS 9
00163 static VLC vc9_norm6_vlc;
00164
00165 #define VC9_TTMB_VLC_BITS 9 //12
00166 static VLC vc9_ttmb_vlc[3];
00167 #define VC9_MV_DIFF_VLC_BITS 9 //15
00168 static VLC vc9_mv_diff_vlc[4];
00169 #define VC9_CBPCY_P_VLC_BITS 9 //14
00170 static VLC vc9_cbpcy_p_vlc[4];
00171 #define VC9_4MV_BLOCK_PATTERN_VLC_BITS 6
00172 static VLC vc9_4mv_block_pattern_vlc[4];
00173 #define VC9_TTBLK_VLC_BITS 5
00174 static VLC vc9_ttblk_vlc[3];
00175 #define VC9_SUBBLKPAT_VLC_BITS 6
00176 static VLC vc9_subblkpat_vlc[3];
00178
00185 typedef struct BitPlane {
00186 uint8_t *data;
00187 int width;
00188 int stride;
00189 int height;
00190 uint8_t is_raw;
00191 } BitPlane;
00192
00197 typedef struct VC9Context{
00198 MpegEncContext s;
00199
00202 int res_sm;
00203 int res_x8;
00204 int multires;
00205 int res_fasttx;
00206 int res_transtab;
00207 int rangered;
00208
00209 int res_rtm_flag;
00210 int reserved;
00211
00212
00213 #if HAS_ADVANCED_PROFILE
00214
00216 int level;
00217 int chromaformat;
00218 int postprocflag;
00219 int broadcast;
00220 int interlace;
00221 int tfcntrflag;
00222 int panscanflag;
00223 int extended_dmv;
00224 int color_prim;
00225 int transfer_char;
00226 int matrix_coef;
00227 int hrd_param_flag;
00228
00229
00230 #endif
00231
00232
00237 int profile;
00238 int frmrtq_postproc;
00239 int bitrtq_postproc;
00240 int fastuvmc;
00241 int extended_mv;
00242 int dquant;
00243 int vstransform;
00244 int overlap;
00245 int quantizer_mode;
00246 int finterpflag;
00247
00248
00251 uint8_t mv_mode;
00252 uint8_t mv_mode2;
00253 int k_x;
00254 int k_y;
00255 uint8_t pq, altpq;
00256
00258 uint8_t dquantfrm;
00259 uint8_t dqprofile;
00260 uint8_t dqsbedge;
00261 uint8_t dqbilevel;
00263
00267 int c_ac_table_index;
00268 int y_ac_table_index;
00269
00270 int ttfrm;
00271 uint8_t ttmbf;
00272 int ttmb;
00273 uint8_t ttblk4x4;
00274
00276 uint8_t lumscale;
00277 uint8_t lumshift;
00279 int16_t bfraction;
00280 uint8_t halfpq;
00281 uint8_t respic;
00282 int buffer_fullness;
00283
00289 uint8_t mvrange;
00290 uint8_t pquantizer;
00291 uint8_t *previous_line_cbpcy;
00292 VLC *cbpcy_vlc;
00293 int tt_index;
00294 BitPlane mv_type_mb_plane;
00295 BitPlane skip_mb_plane;
00296 BitPlane direct_mb_plane;
00297
00300 uint8_t rangeredfrm;
00301 uint8_t interpfrm;
00303
00304 #if HAS_ADVANCED_PROFILE
00305
00307 uint8_t fcm;
00308 uint8_t numpanscanwin;
00309 uint8_t tfcntr;
00310 uint8_t rptfrm, tff, rff;
00311 uint16_t topleftx;
00312 uint16_t toplefty;
00313 uint16_t bottomrightx;
00314 uint16_t bottomrighty;
00315 uint8_t uvsamp;
00316 uint8_t postproc;
00317 int hrd_num_leaky_buckets;
00318 uint8_t bit_rate_exponent;
00319 uint8_t buffer_size_exponent;
00320 BitPlane ac_pred_plane;
00321 BitPlane over_flags_plane;
00322 uint8_t condover;
00323 uint16_t *hrd_rate, *hrd_buffer;
00324 uint8_t *hrd_fullness;
00325 uint8_t range_mapy_flag;
00326 uint8_t range_mapuv_flag;
00327 uint8_t range_mapy;
00328 uint8_t range_mapuv;
00330 #endif
00331 } VC9Context;
00332
00341 static int get_prefix(GetBitContext *gb, int stop, int len)
00342 {
00343 #if 1
00344 int i = 0, tmp = !stop;
00345
00346 while (i != len && tmp != stop)
00347 {
00348 tmp = get_bits(gb, 1);
00349 i++;
00350 }
00351 if (i == len && tmp != stop) return len+1;
00352 return i;
00353 #else
00354 unsigned int buf;
00355 int log;
00356
00357 OPEN_READER(re, gb);
00358 UPDATE_CACHE(re, gb);
00359 buf=GET_CACHE(re, gb);
00360 if (stop) buf = ~buf;
00361
00362 log= av_log2(-buf);
00363 if (log < limit){
00364 LAST_SKIP_BITS(re, gb, log+1);
00365 CLOSE_READER(re, gb);
00366 return log;
00367 }
00368
00369 LAST_SKIP_BITS(re, gb, limit);
00370 CLOSE_READER(re, gb);
00371 return limit;
00372 #endif
00373 }
00374
00380 static int vc9_init_common(VC9Context *v)
00381 {
00382 static int done = 0;
00383 int i = 0;
00384
00385
00386 v->mv_type_mb_plane = (struct BitPlane) { NULL, 0, 0, 0 };
00387 v->direct_mb_plane = (struct BitPlane) { NULL, 0, 0, 0 };
00388 v->skip_mb_plane = (struct BitPlane) { NULL, 0, 0, 0 };
00389 #if HAS_ADVANCED_PROFILE
00390 v->ac_pred_plane = v->over_flags_plane = (struct BitPlane) { NULL, 0, 0, 0 };
00391 v->hrd_rate = v->hrd_buffer = NULL;
00392 #endif
00393
00394
00395 #if 0 // spec -> actual tables converter
00396 for(i=0; i<64; i++){
00397 int code= (vc9_norm6_spec[i][1] << vc9_norm6_spec[i][4]) + vc9_norm6_spec[i][3];
00398 av_log(NULL, AV_LOG_DEBUG, "0x%03X, ", code);
00399 if(i%16==15) av_log(NULL, AV_LOG_DEBUG, "\n");
00400 }
00401 for(i=0; i<64; i++){
00402 int code= vc9_norm6_spec[i][2] + vc9_norm6_spec[i][4];
00403 av_log(NULL, AV_LOG_DEBUG, "%2d, ", code);
00404 if(i%16==15) av_log(NULL, AV_LOG_DEBUG, "\n");
00405 }
00406 #endif
00407 if(!done)
00408 {
00409 done = 1;
00410 INIT_VLC(&vc9_bfraction_vlc, VC9_BFRACTION_VLC_BITS, 23,
00411 vc9_bfraction_bits, 1, 1,
00412 vc9_bfraction_codes, 1, 1, 1);
00413 INIT_VLC(&vc9_norm2_vlc, VC9_NORM2_VLC_BITS, 4,
00414 vc9_norm2_bits, 1, 1,
00415 vc9_norm2_codes, 1, 1, 1);
00416 INIT_VLC(&vc9_norm6_vlc, VC9_NORM6_VLC_BITS, 64,
00417 vc9_norm6_bits, 1, 1,
00418 vc9_norm6_codes, 2, 2, 1);
00419 INIT_VLC(&vc9_imode_vlc, VC9_IMODE_VLC_BITS, 7,
00420 vc9_imode_bits, 1, 1,
00421 vc9_imode_codes, 1, 1, 1);
00422 for (i=0; i<3; i++)
00423 {
00424 INIT_VLC(&vc9_ttmb_vlc[i], VC9_TTMB_VLC_BITS, 16,
00425 vc9_ttmb_bits[i], 1, 1,
00426 vc9_ttmb_codes[i], 2, 2, 1);
00427 INIT_VLC(&vc9_ttblk_vlc[i], VC9_TTBLK_VLC_BITS, 8,
00428 vc9_ttblk_bits[i], 1, 1,
00429 vc9_ttblk_codes[i], 1, 1, 1);
00430 INIT_VLC(&vc9_subblkpat_vlc[i], VC9_SUBBLKPAT_VLC_BITS, 15,
00431 vc9_subblkpat_bits[i], 1, 1,
00432 vc9_subblkpat_codes[i], 1, 1, 1);
00433 }
00434 for(i=0; i<4; i++)
00435 {
00436 INIT_VLC(&vc9_4mv_block_pattern_vlc[i], VC9_4MV_BLOCK_PATTERN_VLC_BITS, 16,
00437 vc9_4mv_block_pattern_bits[i], 1, 1,
00438 vc9_4mv_block_pattern_codes[i], 1, 1, 1);
00439 INIT_VLC(&vc9_cbpcy_p_vlc[i], VC9_CBPCY_P_VLC_BITS, 64,
00440 vc9_cbpcy_p_bits[i], 1, 1,
00441 vc9_cbpcy_p_codes[i], 2, 2, 1);
00442 INIT_VLC(&vc9_mv_diff_vlc[i], VC9_MV_DIFF_VLC_BITS, 73,
00443 vc9_mv_diff_bits[i], 1, 1,
00444 vc9_mv_diff_codes[i], 2, 2, 1);
00445 }
00446 }
00447
00448
00449 v->pq = -1;
00450 v->mvrange = 0;
00451
00452 return 0;
00453 }
00454
00455 #if HAS_ADVANCED_PROFILE
00456
00463 static int decode_hrd(VC9Context *v, GetBitContext *gb)
00464 {
00465 int i, num;
00466
00467 num = 1 + get_bits(gb, 5);
00468
00469
00470 if (v->hrd_rate || num != v->hrd_num_leaky_buckets)
00471 {
00472 av_freep(&v->hrd_rate);
00473 }
00474 if (!v->hrd_rate) v->hrd_rate = av_malloc(num*sizeof(uint16_t));
00475 if (!v->hrd_rate) return -1;
00476
00477
00478 if (v->hrd_buffer || num != v->hrd_num_leaky_buckets)
00479 {
00480 av_freep(&v->hrd_buffer);
00481 }
00482 if (!v->hrd_buffer) v->hrd_buffer = av_malloc(num*sizeof(uint16_t));
00483 if (!v->hrd_buffer)
00484 {
00485 av_freep(&v->hrd_rate);
00486 return -1;
00487 }
00488
00489
00490 if (v->hrd_fullness || num != v->hrd_num_leaky_buckets)
00491 {
00492 av_freep(&v->hrd_buffer);
00493 }
00494 if (!v->hrd_fullness) v->hrd_fullness = av_malloc(num*sizeof(uint8_t));
00495 if (!v->hrd_fullness)
00496 {
00497 av_freep(&v->hrd_rate);
00498 av_freep(&v->hrd_buffer);
00499 return -1;
00500 }
00501 v->hrd_num_leaky_buckets = num;
00502
00503
00504 v->bit_rate_exponent = 6 + get_bits(gb, 4);
00505
00506 v->buffer_size_exponent = 4 + get_bits(gb, 4);
00507
00508 for (i=0; i<num; i++)
00509 {
00510
00511 v->hrd_rate[i] = 1 + get_bits(gb, 16);
00512 if (i && v->hrd_rate[i-1]>=v->hrd_rate[i])
00513 {
00514 av_log(v->s.avctx, AV_LOG_ERROR, "HDR Rates aren't strictly increasing:"
00515 "%i vs %i\n", v->hrd_rate[i-1], v->hrd_rate[i]);
00516 return -1;
00517 }
00518 v->hrd_buffer[i] = 1 + get_bits(gb, 16);
00519 if (i && v->hrd_buffer[i-1]<v->hrd_buffer[i])
00520 {
00521 av_log(v->s.avctx, AV_LOG_ERROR, "HDR Buffers aren't decreasing:"
00522 "%i vs %i\n", v->hrd_buffer[i-1], v->hrd_buffer[i]);
00523 return -1;
00524 }
00525 }
00526 return 0;
00527 }
00528
00537 static int decode_advanced_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
00538 {
00539 VC9Context *v = avctx->priv_data;
00540 int nr, dr, aspect_ratio;
00541
00542 v->postprocflag = get_bits(gb, 1);
00543 v->broadcast = get_bits(gb, 1);
00544 v->interlace = get_bits(gb, 1);
00545
00546 v->tfcntrflag = get_bits(gb, 1);
00547 v->finterpflag = get_bits(gb, 1);
00548 v->panscanflag = get_bits(gb, 1);
00549 v->reserved = get_bits(gb, 1);
00550 if (v->reserved)
00551 {
00552 av_log(avctx, AV_LOG_ERROR, "RESERVED should be 0 (is %i)\n",
00553 v->reserved);
00554 return -1;
00555 }
00556 if (v->extended_mv)
00557 v->extended_dmv = get_bits(gb, 1);
00558
00559
00560 if (get_bits(gb, 1) )
00561 {
00562 avctx->coded_width = get_bits(gb, 12) << 1;
00563 avctx->coded_height = get_bits(gb, 12) << 1;
00564 if ( get_bits(gb, 1) )
00565 {
00566 avctx->width = get_bits(gb, 14);
00567 avctx->height = get_bits(gb, 14);
00568 }
00569
00570
00571 if ( get_bits(gb, 1) )
00572 {
00573 aspect_ratio = get_bits(gb, 4);
00574 if (aspect_ratio == 0x0F)
00575 {
00576 avctx->sample_aspect_ratio.num = 1 + get_bits(gb, 8);
00577 avctx->sample_aspect_ratio.den = 1 + get_bits(gb, 8);
00578 }
00579 else if (aspect_ratio == 0x0E)
00580 {
00581 av_log(avctx, AV_LOG_DEBUG, "Reserved AR found\n");
00582 }
00583 else
00584 {
00585 avctx->sample_aspect_ratio = vc9_pixel_aspect[aspect_ratio];
00586 }
00587 }
00588 }
00589 else
00590 {
00591 avctx->coded_width = avctx->width;
00592 avctx->coded_height = avctx->height;
00593 }
00594
00595
00596 if ( get_bits(gb, 1) )
00597 {
00598 if ( !get_bits(gb, 1) )
00599 {
00600 nr = get_bits(gb, 8);
00601 dr = get_bits(gb, 4);
00602 if (nr<1)
00603 {
00604 av_log(avctx, AV_LOG_ERROR, "0 is forbidden for FRAMERATENR\n");
00605 return -1;
00606 }
00607 if (nr>5)
00608 {
00609 av_log(avctx, AV_LOG_ERROR,
00610 "Reserved FRAMERATENR %i not handled\n", nr);
00611 nr = 5;
00612 }
00613 if (dr<1)
00614 {
00615 av_log(avctx, AV_LOG_ERROR, "0 is forbidden for FRAMERATEDR\n");
00616 return -1;
00617 }
00618 if (dr>2)
00619 {
00620 av_log(avctx, AV_LOG_ERROR,
00621 "Reserved FRAMERATEDR %i not handled\n", dr);
00622 dr = 2;
00623 }
00624 avctx->time_base.num = fps_nr[dr - 1];
00625 avctx->time_base.den = fps_nr[nr - 1];
00626 }
00627 else
00628 {
00629 nr = get_bits(gb, 16);
00630
00631 avctx->time_base.den = 1000000;
00632 avctx->time_base.num = 31250*(1+nr);
00633 }
00634 }
00635
00636
00637 if ( get_bits(gb, 1) )
00638 {
00639
00640
00641 v->color_prim = get_bits(gb, 8);
00642 if (v->color_prim<1)
00643 {
00644 av_log(avctx, AV_LOG_ERROR, "0 for COLOR_PRIM is forbidden\n");
00645 return -1;
00646 }
00647 if (v->color_prim == 3 || v->color_prim>6)
00648 {
00649 av_log(avctx, AV_LOG_DEBUG, "Reserved COLOR_PRIM %i found\n",
00650 v->color_prim);
00651 return -1;
00652 }
00653
00654
00655 v->transfer_char = get_bits(gb, 8);
00656 if (v->transfer_char < 1)
00657 {
00658 av_log(avctx, AV_LOG_ERROR, "0 for TRAMSFER_CHAR is forbidden\n");
00659 return -1;
00660 }
00661 if (v->transfer_char == 3 || v->transfer_char>8)
00662 {
00663 av_log(avctx, AV_LOG_DEBUG, "Reserved TRANSFERT_CHAR %i found\n",
00664 v->color_prim);
00665 return -1;
00666 }
00667
00668
00669 v->matrix_coef = get_bits(gb, 8);
00670 if (v->matrix_coef < 1)
00671 {
00672 av_log(avctx, AV_LOG_ERROR, "0 for MATRIX_COEF is forbidden\n");
00673 return -1;
00674 }
00675 if ((v->matrix_coef > 2 && v->matrix_coef < 6) || v->matrix_coef > 7)
00676 {
00677 av_log(avctx, AV_LOG_DEBUG, "Reserved MATRIX_COEF %i found\n",
00678 v->color_prim);
00679 return -1;
00680 }
00681 }
00682
00683
00684 v->hrd_param_flag = get_bits(gb, 1);
00685 if (v->hrd_param_flag)
00686 {
00687 if (decode_hrd(v, gb) < 0) return -1;
00688 }
00689
00690
00691 v->range_mapy_flag = 0;
00692 v->range_mapuv_flag = 0;
00693
00694 av_log(avctx, AV_LOG_DEBUG, "Advanced profile not supported yet\n");
00695 return -1;
00696 }
00697 #endif
00698
00706 static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
00707 {
00708 VC9Context *v = avctx->priv_data;
00709
00710 av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits(gb, 32));
00711 v->profile = get_bits(gb, 2);
00712 if (v->profile == 2)
00713 {
00714 av_log(avctx, AV_LOG_ERROR, "Profile value 2 is forbidden\n");
00715 return -1;
00716 }
00717
00718 #if HAS_ADVANCED_PROFILE
00719 if (v->profile == PROFILE_ADVANCED)
00720 {
00721 v->level = get_bits(gb, 3);
00722 if(v->level >= 5)
00723 {
00724 av_log(avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
00725 }
00726 v->chromaformat = get_bits(gb, 2);
00727 if (v->chromaformat != 1)
00728 {
00729 av_log(avctx, AV_LOG_ERROR,
00730 "Only 4:2:0 chroma format supported\n");
00731 return -1;
00732 }
00733 }
00734 else
00735 #endif
00736 {
00737 v->res_sm = get_bits(gb, 2);
00738 if (v->res_sm)
00739 {
00740 av_log(avctx, AV_LOG_ERROR,
00741 "Reserved RES_SM=%i is forbidden\n", v->res_sm);
00742 return -1;
00743 }
00744 }
00745
00746
00747 v->frmrtq_postproc = get_bits(gb, 3);
00748
00749 v->bitrtq_postproc = get_bits(gb, 5);
00750 v->s.loop_filter = get_bits(gb, 1);
00751 if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE)
00752 {
00753 av_log(avctx, AV_LOG_ERROR,
00754 "LOOPFILTER shell not be enabled in simple profile\n");
00755 }
00756
00757 #if HAS_ADVANCED_PROFILE
00758 if (v->profile < PROFILE_ADVANCED)
00759 #endif
00760 {
00761 v->res_x8 = get_bits(gb, 1);
00762 if (v->res_x8)
00763 {
00764 av_log(avctx, AV_LOG_ERROR,
00765 "1 for reserved RES_X8 is forbidden\n");
00766
00767 }
00768 v->multires = get_bits(gb, 1);
00769 v->res_fasttx = get_bits(gb, 1);
00770 if (!v->res_fasttx)
00771 {
00772 av_log(avctx, AV_LOG_ERROR,
00773 "0 for reserved RES_FASTTX is forbidden\n");
00774
00775 }
00776 }
00777
00778 v->fastuvmc = get_bits(gb, 1);
00779 if (!v->profile && !v->fastuvmc)
00780 {
00781 av_log(avctx, AV_LOG_ERROR,
00782 "FASTUVMC unavailable in Simple Profile\n");
00783 return -1;
00784 }
00785 v->extended_mv = get_bits(gb, 1);
00786 if (!v->profile && v->extended_mv)
00787 {
00788 av_log(avctx, AV_LOG_ERROR,
00789 "Extended MVs unavailable in Simple Profile\n");
00790 return -1;
00791 }
00792 v->dquant = get_bits(gb, 2);
00793 v->vstransform = get_bits(gb, 1);
00794
00795 #if HAS_ADVANCED_PROFILE
00796 if (v->profile < PROFILE_ADVANCED)
00797 #endif
00798 {
00799 v->res_transtab = get_bits(gb, 1);
00800 if (v->res_transtab)
00801 {
00802 av_log(avctx, AV_LOG_ERROR,
00803 "1 for reserved RES_TRANSTAB is forbidden\n");
00804 return -1;
00805 }
00806 }
00807
00808 v->overlap = get_bits(gb, 1);
00809
00810 #if HAS_ADVANCED_PROFILE
00811 if (v->profile < PROFILE_ADVANCED)
00812 #endif
00813 {
00814 v->s.resync_marker = get_bits(gb, 1);
00815 v->rangered = get_bits(gb, 1);
00816 if (v->rangered && v->profile == PROFILE_SIMPLE)
00817 {
00818 av_log(avctx, AV_LOG_DEBUG,
00819 "RANGERED should be set to 0 in simple profile\n");
00820 }
00821 }
00822
00823 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3);
00824 v->quantizer_mode = get_bits(gb, 2);
00825
00826 #if HAS_ADVANCED_PROFILE
00827 if (v->profile < PROFILE_ADVANCED)
00828 #endif
00829 {
00830 v->finterpflag = get_bits(gb, 1);
00831 v->res_rtm_flag = get_bits(gb, 1);
00832 if (!v->res_rtm_flag)
00833 {
00834 av_log(avctx, AV_LOG_ERROR,
00835 "0 for reserved RES_RTM_FLAG is forbidden\n");
00836
00837 }
00838 #if TRACE
00839 av_log(avctx, AV_LOG_INFO,
00840 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
00841 "LoopFilter=%i, MultiRes=%i, FastUVMV=%i, Extended MV=%i\n"
00842 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
00843 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
00844 v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
00845 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
00846 v->rangered, v->vstransform, v->overlap, v->s.resync_marker,
00847 v->dquant, v->quantizer_mode, avctx->max_b_frames
00848 );
00849 return 0;
00850 #endif
00851 }
00852 #if HAS_ADVANCED_PROFILE
00853 else return decode_advanced_sequence_header(avctx, gb);
00854 #endif
00855 }
00856
00857
00858 #if HAS_ADVANCED_PROFILE
00859
00864 static int advanced_entry_point_process(AVCodecContext *avctx, GetBitContext *gb)
00865 {
00866 VC9Context *v = avctx->priv_data;
00867 int i;
00868 if (v->profile != PROFILE_ADVANCED)
00869 {
00870 av_log(avctx, AV_LOG_ERROR,
00871 "Entry point are only defined in Advanced Profile!\n");
00872 return -1;
00873 }
00874 if (v->hrd_param_flag)
00875 {
00876
00877 av_log(avctx, AV_LOG_DEBUG, "Buffer fullness update\n");
00878 assert(v->hrd_num_leaky_buckets > 0);
00879 for (i=0; i<v->hrd_num_leaky_buckets; i++)
00880 v->hrd_fullness[i] = get_bits(gb, 8);
00881 }
00882 if ((v->range_mapy_flag = get_bits(gb, 1)))
00883 {
00884
00885 av_log(avctx, AV_LOG_DEBUG, "RANGE_MAPY\n");
00886 v->range_mapy = get_bits(gb, 3);
00887 }
00888 if ((v->range_mapuv_flag = get_bits(gb, 1)))
00889 {
00890
00891 av_log(avctx, AV_LOG_DEBUG, "RANGE_MAPUV\n");
00892 v->range_mapuv = get_bits(gb, 3);
00893 }
00894 if (v->panscanflag)
00895 {
00896
00897 v->numpanscanwin = get_bits(gb, 3);
00898 av_log(avctx, AV_LOG_DEBUG, "NUMPANSCANWIN: %u\n", v->numpanscanwin);
00899 }
00900 return 0;
00901 }
00902 #endif
00903
00904
00915 #define IMODE_RAW 0
00916 #define IMODE_NORM2 1
00917 #define IMODE_DIFF2 2
00918 #define IMODE_NORM6 3
00919 #define IMODE_DIFF6 4
00920 #define IMODE_ROWSKIP 5
00921 #define IMODE_COLSKIP 6
00922
00923
00932 int alloc_bitplane(BitPlane *bp, int width, int height)
00933 {
00934 if (!bp || bp->width<0 || bp->height<0) return -1;
00935 bp->data = (uint8_t*)av_malloc(width*height);
00936 if (!bp->data) return -1;
00937 bp->width = bp->stride = width;
00938 bp->height = height;
00939 return 0;
00940 }
00941
00945 void free_bitplane(BitPlane *bp)
00946 {
00947 bp->width = bp->stride = bp->height = 0;
00948 if (bp->data) av_freep(&bp->data);
00949 }
00950
00957 static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
00958 int x, y;
00959
00960 for (y=0; y<height; y++){
00961 if (!get_bits(gb, 1))
00962 memset(plane, 0, width);
00963 else
00964 for (x=0; x<width; x++)
00965 plane[x] = get_bits(gb, 1);
00966 plane += stride;
00967 }
00968 }
00969
00977 static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
00978 int x, y;
00979
00980 for (x=0; x<width; x++){
00981 if (!get_bits(gb, 1))
00982 for (y=0; y<height; y++)
00983 plane[y*stride] = 0;
00984 else
00985 for (y=0; y<height; y++)
00986 plane[y*stride] = get_bits(gb, 1);
00987 plane ++;
00988 }
00989 }
00990
00998 static int bitplane_decoding(BitPlane *bp, VC9Context *v)
00999 {
01000 GetBitContext *gb = &v->s.gb;
01001
01002 int imode, x, y, code, use_vertical_tile, tile_w, tile_h, offset;
01003 uint8_t invert, *planep = bp->data;
01004
01005 invert = get_bits(gb, 1);
01006 imode = get_vlc2(gb, vc9_imode_vlc.table, VC9_IMODE_VLC_BITS, 2);
01007
01008 bp->is_raw = 0;
01009 switch (imode)
01010 {
01011 case IMODE_RAW:
01012
01013 bp->is_raw = 1;
01014 return invert;
01015 case IMODE_DIFF2:
01016 case IMODE_NORM2:
01017 if ((bp->height*bp->width) & 1)
01018 {
01019 *(++planep) = get_bits(gb, 1);
01020 offset = x = 1;
01021 }
01022 else offset = x = 0;
01023
01024 for (y=0; y<bp->height; y++)
01025 {
01026 for(; x<bp->width; x+=2)
01027 {
01028 code = get_vlc2(gb, vc9_norm2_vlc.table, VC9_NORM2_VLC_BITS, 2);
01029 *(++planep) = code&1;
01030 *(++planep) = (code>>1)&1;
01031 }
01032 planep += bp->stride-bp->width;
01033 if ((bp->width-offset)&1)
01034 {
01035 code = get_vlc2(gb, vc9_norm2_vlc.table, VC9_NORM2_VLC_BITS, 2);
01036 *planep = code&1;
01037 planep += bp->stride-bp->width;
01038 *planep = (code>>1)&1;
01039 offset = x = 1;
01040 }
01041 else
01042 {
01043 offset = x = 0;
01044 planep += bp->stride-bp->width;
01045 }
01046 }
01047 break;
01048 case IMODE_DIFF6:
01049 case IMODE_NORM6:
01050 use_vertical_tile= bp->height%3==0 && bp->width%3!=0;
01051 tile_w= use_vertical_tile ? 2 : 3;
01052 tile_h= use_vertical_tile ? 3 : 2;
01053
01054 for(y= bp->height%tile_h; y< bp->height; y+=tile_h){
01055 for(x= bp->width%tile_w; x< bp->width; x+=tile_w){
01056 code = get_vlc2(gb, vc9_norm6_vlc.table, VC9_NORM6_VLC_BITS, 2);
01057 if(code<0){
01058 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
01059 return -1;
01060 }
01061
01062
01063 planep[x + 0*bp->stride]= (code>>0)&1;
01064 planep[x + 1 + 0*bp->stride]= (code>>1)&1;
01065
01066 if(use_vertical_tile){
01067 planep[x + 0 + 1*bp->stride]= (code>>2)&1;
01068 planep[x + 1 + 1*bp->stride]= (code>>3)&1;
01069 planep[x + 0 + 2*bp->stride]= (code>>4)&1;
01070 planep[x + 1 + 2*bp->stride]= (code>>5)&1;
01071 }else{
01072 planep[x + 2 + 0*bp->stride]= (code>>2)&1;
01073 planep[x + 0 + 1*bp->stride]= (code>>3)&1;
01074 planep[x + 1 + 1*bp->stride]= (code>>4)&1;
01075 planep[x + 2 + 1*bp->stride]= (code>>5)&1;
01076 }
01077 }
01078 }
01079
01080 x= bp->width % tile_w;
01081 decode_colskip(bp->data , x, bp->height , bp->stride, &v->s.gb);
01082 decode_rowskip(bp->data+x, bp->width - x, bp->height % tile_h, bp->stride, &v->s.gb);
01083
01084 break;
01085 case IMODE_ROWSKIP:
01086 decode_rowskip(bp->data, bp->width, bp->height, bp->stride, &v->s.gb);
01087 break;
01088 case IMODE_COLSKIP:
01089 decode_colskip(bp->data, bp->width, bp->height, bp->stride, &v->s.gb);
01090 break;
01091 default: break;
01092 }
01093
01094
01095 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6)
01096 {
01097 planep = bp->data;
01098 planep[0] ^= invert;
01099 for (x=1; x<bp->width; x++)
01100 planep[x] ^= planep[x-1];
01101 for (y=1; y<bp->height; y++)
01102 {
01103 planep += bp->stride;
01104 planep[0] ^= planep[-bp->stride];
01105 for (x=1; x<bp->width; x++)
01106 {
01107 if (planep[x-1] != planep[x-bp->stride]) planep[x] ^= invert;
01108 else planep[x] ^= planep[x-1];
01109 }
01110 }
01111 }
01112 else if (invert)
01113 {
01114 planep = bp->data;
01115 for (x=0; x<bp->width*bp->height; x++) planep[x] = !planep[x];
01116 }
01117 return (imode<<1) + invert;
01118 }
01120
01121
01125 static int vop_dquant_decoding(VC9Context *v)
01126 {
01127 GetBitContext *gb = &v->s.gb;
01128 int pqdiff;
01129
01130
01131 if (v->dquant == 2)
01132 {
01133 pqdiff = get_bits(gb, 3);
01134 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
01135 else v->altpq = v->pq + pqdiff + 1;
01136 }
01137 else
01138 {
01139 v->dquantfrm = get_bits(gb, 1);
01140 if ( v->dquantfrm )
01141 {
01142 v->dqprofile = get_bits(gb, 2);
01143 switch (v->dqprofile)
01144 {
01145 case DQPROFILE_SINGLE_EDGE:
01146 case DQPROFILE_DOUBLE_EDGES:
01147 v->dqsbedge = get_bits(gb, 2);
01148 break;
01149 case DQPROFILE_ALL_MBS:
01150 v->dqbilevel = get_bits(gb, 1);
01151 default: break;
01152 }
01153 if (!v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS)
01154 {
01155 pqdiff = get_bits(gb, 3);
01156 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
01157 else v->altpq = v->pq + pqdiff + 1;
01158 }
01159 }
01160 }
01161 return 0;
01162 }
01163
01164
01177 static int decode_b_picture_primary_header(VC9Context *v)
01178 {
01179 GetBitContext *gb = &v->s.gb;
01180 int pqindex;
01181
01182
01183 if (v->profile == PROFILE_SIMPLE)
01184 {
01185 av_log(v->s.avctx, AV_LOG_ERROR, "Found a B frame while in Simple Profile!\n");
01186 return FRAME_SKIPPED;
01187 }
01188 v->bfraction = vc9_bfraction_lut[get_vlc2(gb, vc9_bfraction_vlc.table,
01189 VC9_BFRACTION_VLC_BITS, 2)];
01190 if (v->bfraction < -1)
01191 {
01192 av_log(v->s.avctx, AV_LOG_ERROR, "Invalid BFRaction\n");
01193 return FRAME_SKIPPED;
01194 }
01195 else if (!v->bfraction)
01196 {
01197
01198 v->s.pict_type = BI_TYPE;
01199 v->buffer_fullness = get_bits(gb, 7);
01200 }
01201
01202
01203 pqindex = get_bits(gb, 5);
01204 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
01205 v->pq = pquant_table[0][pqindex];
01206 else
01207 {
01208 v->pq = pquant_table[v->quantizer_mode-1][pqindex];
01209 }
01210 if (pqindex < 9) v->halfpq = get_bits(gb, 1);
01211 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
01212 v->pquantizer = get_bits(gb, 1);
01213 #if HAS_ADVANCED_PROFILE
01214 if (v->profile == PROFILE_ADVANCED)
01215 {
01216 if (v->postprocflag) v->postproc = get_bits(gb, 2);
01217 if (v->extended_mv == 1 && v->s.pict_type != BI_TYPE)
01218 v->mvrange = get_prefix(gb, 0, 3);
01219 }
01220 #endif
01221 else
01222 {
01223 if (v->extended_mv == 1)
01224 v->mvrange = get_prefix(gb, 0, 3);
01225 }
01226
01227 if (v->s.pict_type != BI_TYPE)
01228 {
01229 v->mv_mode = get_bits(gb, 1);
01230 if (v->pq < 13)
01231 {
01232 if (!v->mv_mode)
01233 {
01234 v->mv_mode = get_bits(gb, 2);
01235 if (v->mv_mode)
01236 av_log(v->s.avctx, AV_LOG_ERROR,
01237 "mv_mode for lowquant B frame was %i\n", v->mv_mode);
01238 }
01239 }
01240 else
01241 {
01242 if (!v->mv_mode)
01243 {
01244 if (get_bits(gb, 1))
01245 av_log(v->s.avctx, AV_LOG_ERROR,
01246 "mv_mode for highquant B frame was %i\n", v->mv_mode);
01247 }
01248 v->mv_mode = 1-v->mv_mode;
01249 }
01250 }
01251
01252 return 0;
01253 }
01254
01263 static int decode_b_picture_secondary_header(VC9Context *v)
01264 {
01265 GetBitContext *gb = &v->s.gb;
01266 int status;
01267
01268 status = bitplane_decoding(&v->skip_mb_plane, v);
01269 if (status < 0) return -1;
01270 #if TRACE
01271 if (v->mv_mode == MV_PMODE_MIXED_MV)
01272 {
01273 status = bitplane_decoding(&v->mv_type_mb_plane, v);
01274 if (status < 0)
01275 return -1;
01276 #if TRACE
01277 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
01278 "Imode: %i, Invert: %i\n", status>>1, status&1);
01279 #endif
01280 }
01281
01282
01283 status = bitplane_decoding(&v->direct_mb_plane, v);
01284 if (status < 0) return -1;
01285 #if TRACE
01286 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct plane encoding: "
01287 "Imode: %i, Invert: %i\n", status>>1, status&1);
01288 #endif
01289
01290 av_log(v->s.avctx, AV_LOG_DEBUG, "Skip MB plane encoding: "
01291 "Imode: %i, Invert: %i\n", status>>1, status&1);
01292 #endif
01293
01294
01295 v->s.mv_table_index = get_bits(gb, 2);
01296 v->cbpcy_vlc = &vc9_cbpcy_p_vlc[get_bits(gb, 2)];
01297
01298 if (v->dquant)
01299 {
01300 vop_dquant_decoding(v);
01301 }
01302
01303 if (v->vstransform)
01304 {
01305 v->ttmbf = get_bits(gb, 1);
01306 if (v->ttmbf)
01307 {
01308 v->ttfrm = get_bits(gb, 2);
01309 av_log(v->s.avctx, AV_LOG_INFO, "Transform used: %ix%i\n",
01310 (v->ttfrm & 2) ? 4 : 8, (v->ttfrm & 1) ? 4 : 8);
01311 }
01312 }
01313
01314 return 0;
01315 }
01316
01323 static int decode_i_picture_primary_header(VC9Context *v)
01324 {
01325 GetBitContext *gb = &v->s.gb;
01326 int pqindex;
01327
01328
01329
01330 if (v->profile < PROFILE_ADVANCED && get_bits(gb, 7))
01331 {
01332 av_log(v->s.avctx, AV_LOG_DEBUG, "I BufferFullness not 0\n");
01333 }
01334
01335
01336 pqindex = get_bits(gb, 5);
01337 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
01338 v->pq = pquant_table[0][pqindex];
01339 else
01340 {
01341 v->pq = pquant_table[v->quantizer_mode-1][pqindex];
01342 }
01343 if (pqindex < 9) v->halfpq = get_bits(gb, 1);
01344 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
01345 v->pquantizer = get_bits(gb, 1);
01346 av_log(v->s.avctx, AV_LOG_DEBUG, "I frame: QP=%i (+%i/2)\n",
01347 v->pq, v->halfpq);
01348 return 0;
01349 }
01350
01357 static int decode_i_picture_secondary_header(VC9Context *v)
01358 {
01359 #if HAS_ADVANCED_PROFILE
01360 int status;
01361 if (v->profile == PROFILE_ADVANCED)
01362 {
01363 v->s.ac_pred = get_bits(&v->s.gb, 1);
01364 if (v->postprocflag) v->postproc = get_bits(&v->s.gb, 1);
01365
01366 if (v->overlap && v->pq<9)
01367 {
01368 v->condover = get_bits(&v->s.gb, 1);
01369 if (v->condover)
01370 {
01371 v->condover = 2+get_bits(&v->s.gb, 1);
01372 if (v->condover == 3)
01373 {
01374 status = bitplane_decoding(&v->over_flags_plane, v);
01375 if (status < 0) return -1;
01376 # if TRACE
01377 av_log(v->s.avctx, AV_LOG_DEBUG, "Overflags plane encoding: "
01378 "Imode: %i, Invert: %i\n", status>>1, status&1);
01379 # endif
01380 }
01381 }
01382 }
01383 }
01384 #endif
01385
01386
01387 return 0;
01388 }
01389
01396 static int decode_p_picture_primary_header(VC9Context *v)
01397 {
01398
01399 GetBitContext *gb = &v->s.gb;
01400 int lowquant, pqindex;
01401
01402 pqindex = get_bits(gb, 5);
01403 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
01404 v->pq = pquant_table[0][pqindex];
01405 else
01406 {
01407 v->pq = pquant_table[v->quantizer_mode-1][pqindex];
01408 }
01409 if (pqindex < 9) v->halfpq = get_bits(gb, 1);
01410 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
01411 v->pquantizer = get_bits(gb, 1);
01412 av_log(v->s.avctx, AV_LOG_DEBUG, "P Frame: QP=%i (+%i/2)\n",
01413 v->pq, v->halfpq);
01414 if (v->extended_mv == 1) v->mvrange = get_prefix(gb, 0, 3);
01415 #if HAS_ADVANCED_PROFILE
01416 if (v->profile == PROFILE_ADVANCED)
01417 {
01418 if (v->postprocflag) v->postproc = get_bits(gb, 1);
01419 }
01420 else
01421 #endif
01422 if (v->multires) v->respic = get_bits(gb, 2);
01423 lowquant = (v->pquantizer>12) ? 0 : 1;
01424 v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)];
01425 if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
01426 {
01427 v->mv_mode2 = mv_pmode_table[lowquant][get_prefix(gb, 1, 3)];
01428 v->lumscale = get_bits(gb, 6);
01429 v->lumshift = get_bits(gb, 6);
01430 }
01431 return 0;
01432 }
01433
01440 static int decode_p_picture_secondary_header(VC9Context *v)
01441 {
01442 GetBitContext *gb = &v->s.gb;
01443 int status = 0;
01444 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
01445 v->mv_mode2 == MV_PMODE_MIXED_MV)
01446 || v->mv_mode == MV_PMODE_MIXED_MV)
01447 {
01448 status = bitplane_decoding(&v->mv_type_mb_plane, v);
01449 if (status < 0) return -1;
01450 #if TRACE
01451 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
01452 "Imode: %i, Invert: %i\n", status>>1, status&1);
01453 #endif
01454 }
01455
01456 status = bitplane_decoding(&v->skip_mb_plane, v);
01457 if (status < 0) return -1;
01458 #if TRACE
01459 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
01460 "Imode: %i, Invert: %i\n", status>>1, status&1);
01461 #endif
01462
01463
01464 v->s.mv_table_index =get_bits(gb, 2);
01465 v->cbpcy_vlc = &vc9_cbpcy_p_vlc[get_bits(gb, 2)];
01466
01467 if (v->dquant)
01468 {
01469 av_log(v->s.avctx, AV_LOG_INFO, "VOP DQuant info\n");
01470 vop_dquant_decoding(v);
01471 }
01472
01473 v->ttfrm = 0;
01474 if (v->vstransform)
01475 {
01476 v->ttmbf = get_bits(gb, 1);
01477 if (v->ttmbf)
01478 {
01479 v->ttfrm = get_bits(gb, 2);
01480 av_log(v->s.avctx, AV_LOG_INFO, "Transform used: %ix%i\n",
01481 (v->ttfrm & 2) ? 4 : 8, (v->ttfrm & 1) ? 4 : 8);
01482 }
01483 }
01484
01485 return 0;
01486 }
01488
01489
01490
01506 static int standard_decode_picture_primary_header(VC9Context *v)
01507 {
01508 GetBitContext *gb = &v->s.gb;
01509 int status = 0;
01510
01511 if (v->finterpflag) v->interpfrm = get_bits(gb, 1);
01512 skip_bits(gb, 2);
01513 if (v->rangered) v->rangeredfrm = get_bits(gb, 1);
01514 v->s.pict_type = get_bits(gb, 1);
01515 if (v->s.avctx->max_b_frames)
01516 {
01517 if (!v->s.pict_type)
01518 {
01519 if (get_bits(gb, 1)) v->s.pict_type = I_TYPE;
01520 else v->s.pict_type = B_TYPE;
01521 }
01522 else v->s.pict_type = P_TYPE;
01523 }
01524 else v->s.pict_type++;
01525
01526 switch (v->s.pict_type)
01527 {
01528 case I_TYPE: status = decode_i_picture_primary_header(v); break;
01529 case P_TYPE: status = decode_p_picture_primary_header(v); break;
01530 case BI_TYPE:
01531 case B_TYPE: status = decode_b_picture_primary_header(v); break;
01532 }
01533
01534 if (status == FRAME_SKIPPED)
01535 {
01536 av_log(v->s.avctx, AV_LOG_INFO, "Skipping frame...\n");
01537 return status;
01538 }
01539 return 0;
01540 }
01541
01547 static int standard_decode_picture_secondary_header(VC9Context *v)
01548 {
01549 GetBitContext *gb = &v->s.gb;
01550 int status = 0;
01551
01552 switch (v->s.pict_type)
01553 {
01554 case P_TYPE: status = decode_p_picture_secondary_header(v); break;
01555 case B_TYPE: status = decode_b_picture_secondary_header(v); break;
01556 case BI_TYPE:
01557 case I_TYPE: break;
01558 }
01559 if (status < 0) return FRAME_SKIPPED;
01560
01561
01562 v->c_ac_table_index = decode012(gb);
01563 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
01564 {
01565 v->y_ac_table_index = decode012(gb);
01566 }
01567
01568 v->s.dc_table_index = decode012(gb);
01569
01570 return 0;
01571 }
01573
01574 #if HAS_ADVANCED_PROFILE
01575
01587 static int advanced_decode_picture_primary_header(VC9Context *v)
01588 {
01589 GetBitContext *gb = &v->s.gb;
01590 static const int type_table[4] = { P_TYPE, B_TYPE, I_TYPE, BI_TYPE };
01591 int type;
01592
01593 if (v->interlace)
01594 {
01595 v->fcm = get_bits(gb, 1);
01596 if (v->fcm) v->fcm = 2+get_bits(gb, 1);
01597 }
01598
01599 type = get_prefix(gb, 0, 4);
01600 if (type > 4 || type < 0) return FRAME_SKIPPED;
01601 v->s.pict_type = type_table[type];
01602 av_log(v->s.avctx, AV_LOG_INFO, "AP Frame Type: %i\n", v->s.pict_type);
01603
01604 if (v->tfcntrflag) v->tfcntr = get_bits(gb, 8);
01605 if (v->broadcast)
01606 {
01607 if (!v->interlace) v->rptfrm = get_bits(gb, 2);
01608 else
01609 {
01610 v->tff = get_bits(gb, 1);
01611 v->rff = get_bits(gb, 1);
01612 }
01613 }
01614
01615 if (v->panscanflag)
01616 {
01617 #if 0
01618 for (i=0; i<v->numpanscanwin; i++)
01619 {
01620 v->topleftx[i] = get_bits(gb, 16);
01621 v->toplefty[i] = get_bits(gb, 16);
01622 v->bottomrightx[i] = get_bits(gb, 16);
01623 v->bottomrighty[i] = get_bits(gb, 16);
01624 }
01625 #else
01626 skip_bits(gb, 16*4*v->numpanscanwin);
01627 #endif
01628 }
01629 v->s.no_rounding = !get_bits(gb, 1);
01630 v->uvsamp = get_bits(gb, 1);
01631 if (v->finterpflag == 1) v->interpfrm = get_bits(gb, 1);
01632
01633 switch(v->s.pict_type)
01634 {
01635 case I_TYPE: if (decode_i_picture_primary_header(v) < 0) return -1;
01636 case P_TYPE: if (decode_p_picture_primary_header(v) < 0) return -1;
01637 case BI_TYPE:
01638 case B_TYPE: if (decode_b_picture_primary_header(v) < 0) return FRAME_SKIPPED;
01639 default: return -1;
01640 }
01641 }
01642
01647 static int advanced_decode_picture_secondary_header(VC9Context *v)
01648 {
01649 GetBitContext *gb = &v->s.gb;
01650 int status = 0;
01651
01652 switch(v->s.pict_type)
01653 {
01654 case P_TYPE: status = decode_p_picture_secondary_header(v); break;
01655 case B_TYPE: status = decode_b_picture_secondary_header(v); break;
01656 case BI_TYPE:
01657 case I_TYPE: status = decode_i_picture_secondary_header(v); break;
01658 }
01659 if (status<0) return FRAME_SKIPPED;
01660
01661
01662 v->c_ac_table_index = decode012(gb);
01663 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
01664 {
01665 v->y_ac_table_index = decode012(gb);
01666 }
01667
01668 v->s.dc_table_index = decode012(gb);
01669
01670 return 0;
01671 }
01672 #endif
01673
01674
01675
01689 #define GET_MQUANT() \
01690 if (v->dquantfrm) \
01691 { \
01692 if (v->dqprofile == DQPROFILE_ALL_MBS) \
01693 { \
01694 if (v->dqbilevel) \
01695 { \
01696 mquant = (get_bits(gb, 1)) ? v->pq : v->altpq; \
01697 } \
01698 else \
01699 { \
01700 mqdiff = get_bits(gb, 3); \
01701 if (mqdiff != 7) mquant = v->pq + mqdiff; \
01702 else mquant = get_bits(gb, 5); \
01703 } \
01704 } \
01705 else mquant = v->pq; \
01706 }
01707
01716 #define GET_MVDATA(_dmv_x, _dmv_y) \
01717 index = 1 + get_vlc2(gb, vc9_mv_diff_vlc[s->mv_table_index].table,\
01718 VC9_MV_DIFF_VLC_BITS, 2); \
01719 if (index > 36) \
01720 { \
01721 mb_has_coeffs = 1; \
01722 index -= 37; \
01723 } \
01724 else mb_has_coeffs = 0; \
01725 s->mb_intra = 0; \
01726 if (!index) { _dmv_x = _dmv_y = 0; } \
01727 else if (index == 35) \
01728 { \
01729 _dmv_x = get_bits(gb, v->k_x); \
01730 _dmv_y = get_bits(gb, v->k_y); \
01731 s->mb_intra = 1; \
01732 } \
01733 else \
01734 { \
01735 index1 = index%6; \
01736 if (s->mspel && index1 == 5) val = 1; \
01737 else val = 0; \
01738 val = get_bits(gb, size_table[index1] - val); \
01739 sign = 0 - (val&1); \
01740 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
01741 \
01742 index1 = index/6; \
01743 if (s->mspel && index1 == 5) val = 1; \
01744 else val = 0; \
01745 val = get_bits(gb, size_table[index1] - val); \
01746 sign = 0 - (val&1); \
01747 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
01748 }
01749
01759 static inline int vc9_pred_dc(MpegEncContext *s, int n,
01760 uint16_t **dc_val_ptr, int *dir_ptr)
01761 {
01762 int a, b, c, wrap, pred, scale;
01763 int16_t *dc_val;
01764 static const uint16_t dcpred[31] = {
01765 1024, 512, 341, 256, 205, 171, 146, 128,
01766 114, 102, 93, 85, 79, 73, 68, 64,
01767 60, 57, 54, 51, 49, 47, 45, 43,
01768 41, 39, 38, 37, 35, 34, 33
01769 };
01770
01771
01772 if (n < 4) scale = s->y_dc_scale;
01773 else scale = s->c_dc_scale;
01774
01775 wrap = s->block_wrap[n];
01776 dc_val= s->dc_val[0] + s->block_index[n];
01777
01778
01779
01780
01781 a = dc_val[ - 1];
01782 b = dc_val[ - 1 - wrap];
01783 c = dc_val[ - wrap];
01784
01785
01786
01787
01788 if ((s->pict_type == I_TYPE || s->pict_type == BI_TYPE) &&
01789 1 )
01790 {
01791
01792 if (s->first_slice_line && n!=2) b=c=dcpred[scale];
01793 if (s->mb_x == 0) b=a=dcpred[scale];
01794 }
01795 else
01796 {
01797
01798 if (s->first_slice_line && n!=2) b=c=0;
01799 if (s->mb_x == 0) b=a=0;
01800
01801
01802 if (0)
01803 {
01804
01805 *dc_val_ptr = &dc_val[0];
01806 dir_ptr = 0;
01807 return a;
01808 }
01809 }
01810
01811 if (abs(a - b) <= abs(b - c)) {
01812 pred = c;
01813 *dir_ptr = 1;
01814 } else {
01815 pred = a;
01816 *dir_ptr = 0;
01817 }
01818
01819
01820 *dc_val_ptr = &dc_val[0];
01821 return pred;
01822 }
01823
01835 int vc9_decode_block(VC9Context *v, DCTELEM block[64], int n, int coded, int mquant)
01836 {
01837 GetBitContext *gb = &v->s.gb;
01838 MpegEncContext *s = &v->s;
01839 int ttblk;
01840 int subblkpat;
01841 int dc_pred_dir;
01842 int run_diff, i;
01843
01844
01845 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant );
01846
01847
01848 s->y_dc_scale = s->y_dc_scale_table[mquant];
01849 s->c_dc_scale = s->c_dc_scale_table[mquant];
01850
01851 if (s->mb_intra)
01852 {
01853 int dcdiff;
01854 uint16_t *dc_val;
01855
01856
01857 if (n < 4) {
01858 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
01859 } else {
01860 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
01861 }
01862 if (dcdiff < 0){
01863 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
01864 return -1;
01865 }
01866 if (dcdiff)
01867 {
01868 if (dcdiff == 119 )
01869 {
01870
01871 if (mquant == 1) dcdiff = get_bits(gb, 10);
01872 else if (mquant == 2) dcdiff = get_bits(gb, 9);
01873 else dcdiff = get_bits(gb, 8);
01874 }
01875 else
01876 {
01877 if (mquant == 1)
01878 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
01879 else if (mquant == 2)
01880 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
01881 }
01882 if (get_bits(gb, 1))
01883 dcdiff = -dcdiff;
01884 }
01885
01886
01887 dcdiff += vc9_pred_dc(s, n, &dc_val, &dc_pred_dir);
01888 *dc_val = dcdiff;
01889
01890
01891 if (n < 4) {
01892 block[0] = dcdiff * s->y_dc_scale;
01893 } else {
01894 block[0] = dcdiff * s->c_dc_scale;
01895 }
01896 if (block[0] < 0) {
01897 #if TRACE
01898
01899 #endif
01900
01901 }
01902
01903 run_diff = 0;
01904 i = 0;
01905 if (!coded) {
01906 goto not_coded;
01907 }
01908 }
01909 else
01910 {
01911 mquant = v->pq;
01912
01913
01914 if (v->ttmb < 8)
01915 ttblk = get_vlc2(gb, vc9_ttblk_vlc[v->tt_index].table, VC9_TTBLK_VLC_BITS, 2);
01916 else
01917 ttblk = 0;
01918
01919
01920 if (ttblk == v->ttblk4x4)
01921 subblkpat = 1+get_vlc2(gb, vc9_subblkpat_vlc[v->tt_index].table,
01922 VC9_SUBBLKPAT_VLC_BITS, 2);
01923 else
01924 subblkpat = decode012(gb);
01925 }
01926
01927
01928 i = 63;
01929
01930
01931 not_coded:
01932 if (s->mb_intra) {
01933 mpeg4_pred_ac(s, block, n, dc_pred_dir);
01934 if (s->ac_pred) {
01935 i = 63;
01936 }
01937 }
01938 if(i>0) i=63;
01939 s->block_last_index[n] = i;
01940 return 0;
01941 }
01942
01944
01945
01953 static inline int vc9_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
01954 {
01955 int xy, wrap, pred, a, b, c;
01956
01957 xy = s->block_index[n];
01958 wrap = s->b8_stride;
01959
01960
01961
01962
01963 a = s->coded_block[xy - 1 ];
01964 b = s->coded_block[xy - 1 - wrap];
01965 c = s->coded_block[xy - wrap];
01966
01967 if (b == c) {
01968 pred = a;
01969 } else {
01970 pred = c;
01971 }
01972
01973
01974 *coded_block_ptr = &s->coded_block[xy];
01975
01976 return pred;
01977 }
01978
01982 int vc9_decode_i_mb(VC9Context *v, DCTELEM block[6][64])
01983 {
01984 int i, cbp, val;
01985 uint8_t *coded_val;
01986 uint32_t * const mb_type_ptr= &v->s.current_picture.mb_type[ v->s.mb_x + v->s.mb_y*v->s.mb_stride ];
01987
01988 v->s.mb_intra = 1;
01989 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
01990 if (cbp < 0) return -1;
01991 v->s.ac_pred = get_bits(&v->s.gb, 1);
01992
01993 for (i=0; i<6; i++)
01994 {
01995 val = ((cbp >> (5 - i)) & 1);
01996 if (i < 4) {
01997 int pred = vc9_coded_block_pred(&v->s, i, &coded_val);
01998 val = val ^ pred;
01999 *coded_val = val;
02000 }
02001 cbp |= val << (5 - i);
02002 if (vc9_decode_block(v, block[i], i, val, v->pq) < 0)
02003 {
02004 av_log(v->s.avctx, AV_LOG_ERROR,
02005 "\nerror while decoding block: %d x %d (%d)\n", v->s.mb_x, v->s.mb_y, i);
02006 return -1;
02007 }
02008 }
02009 return 0;
02010 }
02011
02016 int vc9_decode_p_mb(VC9Context *v, DCTELEM block[6][64])
02017 {
02018 MpegEncContext *s = &v->s;
02019 GetBitContext *gb = &s->gb;
02020 int i, mb_offset = s->mb_x + s->mb_y*s->mb_width;
02021 int cbp;
02022 int hybrid_pred;
02023 int mv_mode_bit = 0;
02024 int mqdiff, mquant;
02025 int ttmb;
02026 int status;
02027 uint8_t *coded_val;
02028
02029 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 },
02030 offset_table[6] = { 0, 1, 3, 7, 15, 31 };
02031 int mb_has_coeffs = 1;
02032 int dmv_x, dmv_y;
02033 int index, index1;
02034 int val, sign;
02035
02036 mquant = v->pq;
02037
02038 if (v->mv_type_mb_plane.is_raw)
02039 v->mv_type_mb_plane.data[mb_offset] = get_bits(gb, 1);
02040 if (v->skip_mb_plane.is_raw)
02041 v->skip_mb_plane.data[mb_offset] = get_bits(gb, 1);
02042 if (!mv_mode_bit)
02043 {
02044 if (!v->skip_mb_plane.data[mb_offset])
02045 {
02046 GET_MVDATA(dmv_x, dmv_y);
02047
02048
02049 if (v->mv_mode == MV_PMODE_1MV ||
02050 v->mv_mode == MV_PMODE_MIXED_MV)
02051 hybrid_pred = get_bits(gb, 1);
02052
02053 if (s->mb_intra && !mb_has_coeffs)
02054 {
02055 GET_MQUANT();
02056 s->ac_pred = get_bits(gb, 1);
02057
02058 cbp = 0;
02059 for (i=0; i<6; i++)
02060 {
02061 s->coded_block[s->block_index[i]] = 0;
02062 vc9_decode_block(v, block[i], i, 0, mquant);
02063 }
02064 return 0;
02065 }
02066 else if (mb_has_coeffs)
02067 {
02068 if (s->mb_intra) s->ac_pred = get_bits(gb, 1);
02069 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC9_CBPCY_P_VLC_BITS, 2);
02070 GET_MQUANT();
02071 }
02072 else
02073 {
02074 mquant = v->pq;
02075
02076
02077 cbp = 0;
02078 }
02079
02080 if (!v->ttmbf)
02081 ttmb = get_vlc2(gb, vc9_ttmb_vlc[v->tt_index].table,
02082 VC9_TTMB_VLC_BITS, 12);
02083
02084 for (i=0; i<6; i++)
02085 {
02086 val = ((cbp >> (5 - i)) & 1);
02087 if (i < 4) {
02088 int pred = vc9_coded_block_pred(&v->s, i, &coded_val);
02089 val = val ^ pred;
02090 *coded_val = val;
02091 }
02092 vc9_decode_block(v, block[i], i, val, mquant);
02093 }
02094 }
02095 else
02096 {
02097
02098 if (v->mv_mode == MV_PMODE_1MV ||
02099 v->mv_mode == MV_PMODE_MIXED_MV)
02100 hybrid_pred = get_bits(gb, 1);
02101
02102
02103 return 0;
02104 }
02105 }
02106 else
02107 {
02108 if (!v->skip_mb_plane.data[mb_offset] )
02109 {
02110
02111 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC9_CBPCY_P_VLC_BITS, 2);
02112 for (i=0; i<6; i++)
02113 {
02114 val = ((cbp >> (5 - i)) & 1);
02115 if (i < 4) {
02116 int pred = vc9_coded_block_pred(&v->s, i, &coded_val);
02117 val = val ^ pred;
02118 *coded_val = val;
02119 }
02120 if (i<4 && val)
02121 {
02122 GET_MVDATA(dmv_x, dmv_y);
02123 }
02124 if (v->mv_mode == MV_PMODE_MIXED_MV )
02125 hybrid_pred = get_bits(gb, 1);
02126 GET_MQUANT();
02127
02128 if (s->mb_intra &&
02129 index )
02130 s->ac_pred = get_bits(gb, 1);
02131 if (!v->ttmbf)
02132 ttmb = get_vlc2(gb, vc9_ttmb_vlc[v->tt_index].table,
02133 VC9_TTMB_VLC_BITS, 12);
02134 status = vc9_decode_block(v, block[i], i, val, mquant);
02135 }
02136 return status;
02137 }
02138 else
02139 {
02140
02141 for (i=0; i<4; i++)
02142 {
02143 if (v->mv_mode == MV_PMODE_MIXED_MV )
02144 hybrid_pred = get_bits(gb, 1);
02145 vc9_decode_block(v, block[i], i, 0, v->pq);
02146 }
02147 vc9_decode_block(v, block[4], 4, 0, v->pq);
02148 vc9_decode_block(v, block[5], 5, 0, v->pq);
02149
02150 return 0;
02151 }
02152 }
02153
02154
02155 return -1;
02156 }
02157
02163 int vc9_decode_b_mb(VC9Context *v, DCTELEM block[6][64])
02164 {
02165 MpegEncContext *s = &v->s;
02166 GetBitContext *gb = &v->s.gb;
02167 int mb_offset, i ;
02168 int b_mv_type = BMV_TYPE_BACKWARD;
02169 int mquant, mqdiff;
02170 int ttmb;
02171
02172 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 },
02173 offset_table[6] = { 0, 1, 3, 7, 15, 31 };
02174 int mb_has_coeffs = 1;
02175 int dmv1_x, dmv1_y, dmv2_x, dmv2_y;
02176 int index, index1;
02177 int val, sign;
02178
02179 mb_offset = s->mb_width*s->mb_y + s->mb_x;
02180
02181 if (v->direct_mb_plane.is_raw)
02182 v->direct_mb_plane.data[mb_offset] = get_bits(gb, 1);
02183 if (v->skip_mb_plane.is_raw)
02184 v->skip_mb_plane.data[mb_offset] = get_bits(gb, 1);
02185
02186 if (!v->direct_mb_plane.data[mb_offset])
02187 {
02188 if (v->skip_mb_plane.data[mb_offset])
02189 {
02190 b_mv_type = decode012(gb);
02191 if (v->bfraction > 420 &&
02192 b_mv_type < 3) b_mv_type = 1-b_mv_type;
02193 }
02194 else
02195 {
02196 GET_MVDATA(dmv1_x, dmv1_y);
02197 if (!s->mb_intra )
02198 {
02199 b_mv_type = decode012(gb);
02200 if (v->bfraction > 420 &&
02201 b_mv_type < 3) b_mv_type = 1-b_mv_type;
02202 }
02203 }
02204 }
02205 if (!v->skip_mb_plane.data[mb_offset])
02206 {
02207 if (mb_has_coeffs )
02208 {
02209 GET_MQUANT();
02210 if (s->mb_intra )
02211 s->ac_pred = get_bits(gb, 1);
02212 }
02213 else
02214 {
02215
02216 if (b_mv_type == BMV_TYPE_INTERPOLATED)
02217 {
02218 GET_MVDATA(dmv2_x, dmv2_y);
02219 mquant = v->pq;
02220 }
02221
02222 if (mb_has_coeffs )
02223 {
02224 if (s->mb_intra )
02225 s->ac_pred = get_bits(gb, 1);
02226 GET_MQUANT();
02227 }
02228 }
02229 }
02230
02231
02232 if (v->ttmbf)
02233 ttmb = get_vlc2(gb, vc9_ttmb_vlc[v->tt_index].table,
02234 VC9_TTMB_VLC_BITS, 12);
02235
02236
02237 for (i=0; i<6; i++)
02238 {
02239 vc9_decode_block(v, block[i], i, 0 , mquant);
02240 }
02241 return 0;
02242 }
02243
02248 static int standard_decode_mbs(VC9Context *v)
02249 {
02250 MpegEncContext *s = &v->s;
02251
02252
02253 if (v->pq < 5)
02254 {
02255 v->tt_index = 0;
02256 v->ttblk4x4 = 3;
02257 }
02258 else if (v->pq < 13)
02259 {
02260 v->tt_index = 1;
02261 v->ttblk4x4 = 3;
02262 }
02263 else
02264 {
02265 v->tt_index = 2;
02266 v->ttblk4x4 = 2;
02267 }
02268
02269 if (s->pict_type != I_TYPE)
02270 {
02271
02272 switch (v->mvrange)
02273 {
02274 case 1: v->k_x = 10; v->k_y = 9; break;
02275 case 2: v->k_x = 12; v->k_y = 10; break;
02276 case 3: v->k_x = 13; v->k_y = 11; break;
02277 default: v->k_x = 9; v->k_y = 8; break;
02278 }
02279
02280 s->mspel = v->mv_mode & 1;
02281 v->k_x -= s->mspel;
02282 v->k_y -= s->mspel;
02283 }
02284
02285 for (s->mb_y=0; s->mb_y<s->mb_height; s->mb_y++)
02286 {
02287 for (s->mb_x=0; s->mb_x<s->mb_width; s->mb_x++)
02288 {
02289
02290
02291 switch (s->pict_type)
02292 {
02293 case I_TYPE: vc9_decode_i_mb(v, s->block); break;
02294 case P_TYPE: vc9_decode_p_mb(v, s->block); break;
02295 case BI_TYPE:
02296 case B_TYPE: vc9_decode_b_mb(v, s->block); break;
02297 }
02298 }
02299
02300 }
02301 return 0;
02302 }
02304
02305 #if HAS_ADVANCED_PROFILE
02306
02313 static int advanced_decode_i_mbs(VC9Context *v)
02314 {
02315 MpegEncContext *s = &v->s;
02316 GetBitContext *gb = &v->s.gb;
02317 int mqdiff, mquant, mb_offset = 0, over_flags_mb = 0;
02318
02319 for (s->mb_y=0; s->mb_y<s->mb_height; s->mb_y++)
02320 {
02321 for (s->mb_x=0; s->mb_x<s->mb_width; s->mb_x++)
02322 {
02323 if (v->ac_pred_plane.is_raw)
02324 s->ac_pred = get_bits(gb, 1);
02325 else
02326 s->ac_pred = v->ac_pred_plane.data[mb_offset];
02327 if (v->condover == 3 && v->over_flags_plane.is_raw)
02328 over_flags_mb = get_bits(gb, 1);
02329 GET_MQUANT();
02330
02331
02332 }
02333 mb_offset++;
02334 }
02335 return 0;
02336 }
02338 #endif
02339
02344 static int vc9_decode_init(AVCodecContext *avctx)
02345 {
02346 VC9Context *v = avctx->priv_data;
02347 MpegEncContext *s = &v->s;
02348 GetBitContext gb;
02349
02350 if (!avctx->extradata_size || !avctx->extradata) return -1;
02351 avctx->pix_fmt = PIX_FMT_YUV420P;
02352 v->s.avctx = avctx;
02353
02354 if(ff_h263_decode_init(avctx) < 0)
02355 return -1;
02356 if (vc9_init_common(v) < 0) return -1;
02357
02358 av_log(avctx, AV_LOG_INFO, "This decoder is not supposed to produce picture. Dont report this as a bug!\n");
02359
02360 avctx->coded_width = avctx->width;
02361 avctx->coded_height = avctx->height;
02362 if (avctx->codec_id == CODEC_ID_WMV3)
02363 {
02364 int count = 0;
02365
02366
02367
02368
02369
02370
02371 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
02372
02373 if (decode_sequence_header(avctx, &gb) < 0)
02374 return -1;
02375
02376 count = avctx->extradata_size*8 - get_bits_count(&gb);
02377 if (count>0)
02378 {
02379 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
02380 count, get_bits(&gb, count));
02381 }
02382 else if (count < 0)
02383 {
02384 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
02385 }
02386 }
02387 avctx->has_b_frames= !!(avctx->max_b_frames);
02388
02389 s->mb_width = (avctx->coded_width+15)>>4;
02390 s->mb_height = (avctx->coded_height+15)>>4;
02391
02392
02393 if (alloc_bitplane(&v->mv_type_mb_plane, s->mb_width, s->mb_height) < 0)
02394 return -1;
02395 if (alloc_bitplane(&v->mv_type_mb_plane, s->mb_width, s->mb_height) < 0)
02396 return -1;
02397 if (alloc_bitplane(&v->skip_mb_plane, s->mb_width, s->mb_height) < 0)
02398 return -1;
02399 if (alloc_bitplane(&v->direct_mb_plane, s->mb_width, s->mb_height) < 0)
02400 return -1;
02401
02402
02403 v->previous_line_cbpcy = (uint8_t *)av_malloc(s->mb_stride*4);
02404 if (!v->previous_line_cbpcy) return -1;
02405
02406 #if HAS_ADVANCED_PROFILE
02407 if (v->profile == PROFILE_ADVANCED)
02408 {
02409 if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
02410 return -1;
02411 if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
02412 return -1;
02413 }
02414 #endif
02415
02416 return 0;
02417 }
02418
02423 static int vc9_decode_frame(AVCodecContext *avctx,
02424 void *data, int *data_size,
02425 uint8_t *buf, int buf_size)
02426 {
02427 VC9Context *v = avctx->priv_data;
02428 MpegEncContext *s = &v->s;
02429 int ret = FRAME_SKIPPED, len;
02430 AVFrame *pict = data;
02431 uint8_t *tmp_buf;
02432 v->s.avctx = avctx;
02433
02434
02435 if (!buf_size) return 0;
02436
02437 len = avpicture_get_size(avctx->pix_fmt, avctx->width,
02438 avctx->height);
02439 tmp_buf = (uint8_t *)av_mallocz(len);
02440 avpicture_fill((AVPicture *)pict, tmp_buf, avctx->pix_fmt,
02441 avctx->width, avctx->height);
02442
02443 if (avctx->codec_id == CODEC_ID_VC9)
02444 {
02445 #if 0
02446
02447
02448 uint32_t scp = 0;
02449 int scs = 0, i = 0;
02450
02451 while (i < buf_size)
02452 {
02453 for (; i < buf_size && scp != 0x000001; i++)
02454 scp = ((scp<<8)|buf[i])&0xffffff;
02455
02456 if (scp != 0x000001)
02457 break;
02458
02459 scs = buf[i++];
02460
02461 init_get_bits(gb, buf+i, (buf_size-i)*8);
02462
02463 switch(scs)
02464 {
02465 case 0x0A:
02466 return 0;
02467 case 0x0B:
02468 av_log(avctx, AV_LOG_ERROR, "Slice coding not supported\n");
02469 return -1;
02470 case 0x0C:
02471 av_log(avctx, AV_LOG_ERROR, "Interlaced coding not supported\n");
02472 return -1;
02473 case 0x0D:
02474 break;
02475 case 0x0E:
02476 if (v->profile < PROFILE_ADVANCED)
02477 av_log(avctx, AV_LOG_ERROR,
02478 "Found an entry point in profile %i\n", v->profile);
02479 advanced_entry_point_process(avctx, gb);
02480 break;
02481 case 0x0F:
02482 decode_sequence_header(avctx, gb);
02483 break;
02484 default:
02485 av_log(avctx, AV_LOG_ERROR,
02486 "Unsupported IDU suffix %lX\n", scs);
02487 }
02488
02489 i += get_bits_count(gb)*8;
02490 }
02491 #else
02492 av_abort();
02493 #endif
02494 }
02495 else
02496 init_get_bits(&v->s.gb, buf, buf_size*8);
02497
02498 s->flags= avctx->flags;
02499 s->flags2= avctx->flags2;
02500
02501
02502 if (buf_size == 0) {
02503
02504 if (s->low_delay==0 && s->next_picture_ptr) {
02505 *pict= *(AVFrame*)s->next_picture_ptr;
02506 s->next_picture_ptr= NULL;
02507
02508 *data_size = sizeof(AVFrame);
02509 }
02510
02511 return 0;
02512 }
02513
02514
02515 s->bitstream_buffer_size=0;
02516
02517 if (!s->context_initialized) {
02518 if (MPV_common_init(s) < 0)
02519 return -1;
02520 }
02521
02522
02523 if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
02524 s->current_picture_ptr= &s->picture[ff_find_unused_picture(s, 0)];
02525 }
02526 #if HAS_ADVANCED_PROFILE
02527 if (v->profile == PROFILE_ADVANCED)
02528 ret= advanced_decode_picture_primary_header(v);
02529 else
02530 #endif
02531 ret= standard_decode_picture_primary_header(v);
02532 if (ret == FRAME_SKIPPED) return buf_size;
02533
02534 if (ret < 0){
02535 av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
02536 return -1;
02537 }
02538
02539
02540
02541
02542 if (v->profile < PROFILE_ADVANCED && v->multires){
02543
02544 }
02545
02546
02547
02548 s->current_picture.pict_type= s->pict_type;
02549 s->current_picture.key_frame= s->pict_type == I_TYPE;
02550
02551
02552 if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable))
02553 return buf_size;
02554
02555 if(avctx->hurry_up && s->pict_type==B_TYPE)
02556 return buf_size;
02557
02558 if(avctx->hurry_up>=5)
02559 return buf_size;
02560
02561 if(s->next_p_frame_damaged){
02562 if(s->pict_type==B_TYPE)
02563 return buf_size;
02564 else
02565 s->next_p_frame_damaged=0;
02566 }
02567
02568 if(MPV_frame_start(s, avctx) < 0)
02569 return -1;
02570
02571 ff_er_frame_start(s);
02572
02573
02574 #if HAS_ADVANCED_PROFILE
02575 if (v->profile == PROFILE_ADVANCED)
02576 ret= advanced_decode_picture_secondary_header(v);
02577 else
02578 #endif
02579 ret = standard_decode_picture_secondary_header(v);
02580 if (ret<0) return FRAME_SKIPPED;
02581
02582
02583 #if HAS_ADVANCED_PROFILE
02584 if (v->profile == PROFILE_ADVANCED)
02585 {
02586 switch(s->pict_type)
02587 {
02588 case I_TYPE: ret = advanced_decode_i_mbs(v); break;
02589 case P_TYPE: ret = decode_p_mbs(v); break;
02590 case B_TYPE:
02591 case BI_TYPE: ret = decode_b_mbs(v); break;
02592 default: ret = FRAME_SKIPPED;
02593 }
02594 if (ret == FRAME_SKIPPED) return buf_size;
02595 }
02596 else
02597 #endif
02598 {
02599 ret = standard_decode_mbs(v);
02600 if (ret == FRAME_SKIPPED) return buf_size;
02601 }
02602
02603 ff_er_frame_end(s);
02604
02605 MPV_frame_end(s);
02606
02607 assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
02608 assert(s->current_picture.pict_type == s->pict_type);
02609 if(s->pict_type==B_TYPE || s->low_delay){
02610 *pict= *(AVFrame*)&s->current_picture;
02611 ff_print_debug_info(s, pict);
02612 } else {
02613 *pict= *(AVFrame*)&s->last_picture;
02614 if(pict)
02615 ff_print_debug_info(s, pict);
02616 }
02617
02618
02619
02620 avctx->frame_number = s->picture_number - 1;
02621
02622
02623 if(s->last_picture_ptr || s->low_delay)
02624 *data_size = sizeof(AVFrame);
02625
02626 av_log(avctx, AV_LOG_DEBUG, "Consumed %i/%i bits\n",
02627 get_bits_count(&s->gb), buf_size*8);
02628
02629
02630 *data_size = len;
02631 return buf_size;
02632 }
02633
02637 static int vc9_decode_end(AVCodecContext *avctx)
02638 {
02639 VC9Context *v = avctx->priv_data;
02640
02641 #if HAS_ADVANCED_PROFILE
02642 av_freep(&v->hrd_rate);
02643 av_freep(&v->hrd_buffer);
02644 #endif
02645 MPV_common_end(&v->s);
02646 free_bitplane(&v->mv_type_mb_plane);
02647 free_bitplane(&v->skip_mb_plane);
02648 free_bitplane(&v->direct_mb_plane);
02649 return 0;
02650 }
02651
02652 AVCodec vc9_decoder = {
02653 "vc9",
02654 CODEC_TYPE_VIDEO,
02655 CODEC_ID_VC9,
02656 sizeof(VC9Context),
02657 vc9_decode_init,
02658 NULL,
02659 vc9_decode_end,
02660 vc9_decode_frame,
02661 CODEC_CAP_DELAY,
02662 NULL
02663 };
02664
02665 AVCodec wmv3_decoder = {
02666 "wmv3",
02667 CODEC_TYPE_VIDEO,
02668 CODEC_ID_WMV3,
02669 sizeof(VC9Context),
02670 vc9_decode_init,
02671 NULL,
02672 vc9_decode_end,
02673 vc9_decode_frame,
02674 CODEC_CAP_DELAY,
02675 NULL
02676 };