00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00030 #include "internal.h"
00031 #include "dsputil.h"
00032 #include "avcodec.h"
00033 #include "mpegvideo.h"
00034 #include "vc1.h"
00035 #include "vc1data.h"
00036 #include "msmpeg4data.h"
00037 #include "unary.h"
00038 #include "simple_idct.h"
00039
00040 #undef NDEBUG
00041 #include <assert.h>
00042
00043
00054 enum Imode {
00055 IMODE_RAW,
00056 IMODE_NORM2,
00057 IMODE_DIFF2,
00058 IMODE_NORM6,
00059 IMODE_DIFF6,
00060 IMODE_ROWSKIP,
00061 IMODE_COLSKIP
00062 };
00064
00071 static void decode_rowskip(uint8_t* plane, int width, int height, int stride,
00072 GetBitContext *gb)
00073 {
00074 int x, y;
00075
00076 for (y = 0; y < height; y++) {
00077 if (!get_bits1(gb))
00078 memset(plane, 0, width);
00079 else
00080 for (x = 0; x < width; x++)
00081 plane[x] = get_bits1(gb);
00082 plane += stride;
00083 }
00084 }
00085
00093 static void decode_colskip(uint8_t* plane, int width, int height, int stride,
00094 GetBitContext *gb)
00095 {
00096 int x, y;
00097
00098 for (x = 0; x < width; x++) {
00099 if (!get_bits1(gb))
00100 for (y = 0; y < height; y++)
00101 plane[y*stride] = 0;
00102 else
00103 for (y = 0; y < height; y++)
00104 plane[y*stride] = get_bits1(gb);
00105 plane ++;
00106 }
00107 }
00108
00116 static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v)
00117 {
00118 GetBitContext *gb = &v->s.gb;
00119
00120 int imode, x, y, code, offset;
00121 uint8_t invert, *planep = data;
00122 int width, height, stride;
00123
00124 width = v->s.mb_width;
00125 height = v->s.mb_height >> v->field_mode;
00126 stride = v->s.mb_stride;
00127 invert = get_bits1(gb);
00128 imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1);
00129
00130 *raw_flag = 0;
00131 switch (imode) {
00132 case IMODE_RAW:
00133
00134 *raw_flag = 1;
00135 return invert;
00136 case IMODE_DIFF2:
00137 case IMODE_NORM2:
00138 if ((height * width) & 1) {
00139 *planep++ = get_bits1(gb);
00140 offset = 1;
00141 }
00142 else
00143 offset = 0;
00144
00145 for (y = offset; y < height * width; y += 2) {
00146 code = get_vlc2(gb, ff_vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1);
00147 *planep++ = code & 1;
00148 offset++;
00149 if (offset == width) {
00150 offset = 0;
00151 planep += stride - width;
00152 }
00153 *planep++ = code >> 1;
00154 offset++;
00155 if (offset == width) {
00156 offset = 0;
00157 planep += stride - width;
00158 }
00159 }
00160 break;
00161 case IMODE_DIFF6:
00162 case IMODE_NORM6:
00163 if (!(height % 3) && (width % 3)) {
00164 for (y = 0; y < height; y += 3) {
00165 for (x = width & 1; x < width; x += 2) {
00166 code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
00167 if (code < 0) {
00168 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
00169 return -1;
00170 }
00171 planep[x + 0] = (code >> 0) & 1;
00172 planep[x + 1] = (code >> 1) & 1;
00173 planep[x + 0 + stride] = (code >> 2) & 1;
00174 planep[x + 1 + stride] = (code >> 3) & 1;
00175 planep[x + 0 + stride * 2] = (code >> 4) & 1;
00176 planep[x + 1 + stride * 2] = (code >> 5) & 1;
00177 }
00178 planep += stride * 3;
00179 }
00180 if (width & 1)
00181 decode_colskip(data, 1, height, stride, &v->s.gb);
00182 } else {
00183 planep += (height & 1) * stride;
00184 for (y = height & 1; y < height; y += 2) {
00185 for (x = width % 3; x < width; x += 3) {
00186 code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
00187 if (code < 0) {
00188 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
00189 return -1;
00190 }
00191 planep[x + 0] = (code >> 0) & 1;
00192 planep[x + 1] = (code >> 1) & 1;
00193 planep[x + 2] = (code >> 2) & 1;
00194 planep[x + 0 + stride] = (code >> 3) & 1;
00195 planep[x + 1 + stride] = (code >> 4) & 1;
00196 planep[x + 2 + stride] = (code >> 5) & 1;
00197 }
00198 planep += stride * 2;
00199 }
00200 x = width % 3;
00201 if (x)
00202 decode_colskip(data, x, height, stride, &v->s.gb);
00203 if (height & 1)
00204 decode_rowskip(data + x, width - x, 1, stride, &v->s.gb);
00205 }
00206 break;
00207 case IMODE_ROWSKIP:
00208 decode_rowskip(data, width, height, stride, &v->s.gb);
00209 break;
00210 case IMODE_COLSKIP:
00211 decode_colskip(data, width, height, stride, &v->s.gb);
00212 break;
00213 default:
00214 break;
00215 }
00216
00217
00218 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6) {
00219 planep = data;
00220 planep[0] ^= invert;
00221 for (x = 1; x < width; x++)
00222 planep[x] ^= planep[x-1];
00223 for (y = 1; y < height; y++) {
00224 planep += stride;
00225 planep[0] ^= planep[-stride];
00226 for (x = 1; x < width; x++) {
00227 if (planep[x-1] != planep[x-stride]) planep[x] ^= invert;
00228 else planep[x] ^= planep[x-1];
00229 }
00230 }
00231 } else if (invert) {
00232 planep = data;
00233 for (x = 0; x < stride * height; x++)
00234 planep[x] = !planep[x];
00235 }
00236 return (imode << 1) + invert;
00237 }
00238
00240
00241
00245 static int vop_dquant_decoding(VC1Context *v)
00246 {
00247 GetBitContext *gb = &v->s.gb;
00248 int pqdiff;
00249
00250
00251 if (v->dquant == 2) {
00252 pqdiff = get_bits(gb, 3);
00253 if (pqdiff == 7)
00254 v->altpq = get_bits(gb, 5);
00255 else
00256 v->altpq = v->pq + pqdiff + 1;
00257 } else {
00258 v->dquantfrm = get_bits1(gb);
00259 if (v->dquantfrm) {
00260 v->dqprofile = get_bits(gb, 2);
00261 switch (v->dqprofile) {
00262 case DQPROFILE_SINGLE_EDGE:
00263 case DQPROFILE_DOUBLE_EDGES:
00264 v->dqsbedge = get_bits(gb, 2);
00265 break;
00266 case DQPROFILE_ALL_MBS:
00267 v->dqbilevel = get_bits1(gb);
00268 if (!v->dqbilevel)
00269 v->halfpq = 0;
00270 default:
00271 break;
00272 }
00273 if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) {
00274 pqdiff = get_bits(gb, 3);
00275 if (pqdiff == 7)
00276 v->altpq = get_bits(gb, 5);
00277 else
00278 v->altpq = v->pq + pqdiff + 1;
00279 }
00280 }
00281 }
00282 return 0;
00283 }
00284
00285 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb);
00286
00294 int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
00295 {
00296 av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits_long(gb, 32));
00297 v->profile = get_bits(gb, 2);
00298 if (v->profile == PROFILE_COMPLEX) {
00299 av_log(avctx, AV_LOG_WARNING, "WMV3 Complex Profile is not fully supported\n");
00300 }
00301
00302 if (v->profile == PROFILE_ADVANCED) {
00303 v->zz_8x4 = ff_vc1_adv_progressive_8x4_zz;
00304 v->zz_4x8 = ff_vc1_adv_progressive_4x8_zz;
00305 return decode_sequence_header_adv(v, gb);
00306 } else {
00307 v->zz_8x4 = ff_wmv2_scantableA;
00308 v->zz_4x8 = ff_wmv2_scantableB;
00309 v->res_y411 = get_bits1(gb);
00310 v->res_sprite = get_bits1(gb);
00311 if (v->res_y411) {
00312 av_log(avctx, AV_LOG_ERROR,
00313 "Old interlaced mode is not supported\n");
00314 return -1;
00315 }
00316 }
00317
00318
00319 v->frmrtq_postproc = get_bits(gb, 3);
00320
00321 v->bitrtq_postproc = get_bits(gb, 5);
00322 v->s.loop_filter = get_bits1(gb);
00323 if (v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE) {
00324 av_log(avctx, AV_LOG_ERROR,
00325 "LOOPFILTER shall not be enabled in Simple Profile\n");
00326 }
00327 if (v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
00328 v->s.loop_filter = 0;
00329
00330 v->res_x8 = get_bits1(gb);
00331 v->multires = get_bits1(gb);
00332 v->res_fasttx = get_bits1(gb);
00333 if (!v->res_fasttx) {
00334 v->vc1dsp.vc1_inv_trans_8x8 = ff_simple_idct_8;
00335 v->vc1dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
00336 v->vc1dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
00337 v->vc1dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
00338 v->vc1dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add_8;
00339 v->vc1dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
00340 v->vc1dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
00341 v->vc1dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
00342 }
00343
00344 v->fastuvmc = get_bits1(gb);
00345 if (!v->profile && !v->fastuvmc) {
00346 av_log(avctx, AV_LOG_ERROR,
00347 "FASTUVMC unavailable in Simple Profile\n");
00348 return -1;
00349 }
00350 v->extended_mv = get_bits1(gb);
00351 if (!v->profile && v->extended_mv)
00352 {
00353 av_log(avctx, AV_LOG_ERROR,
00354 "Extended MVs unavailable in Simple Profile\n");
00355 return -1;
00356 }
00357 v->dquant = get_bits(gb, 2);
00358 v->vstransform = get_bits1(gb);
00359
00360 v->res_transtab = get_bits1(gb);
00361 if (v->res_transtab)
00362 {
00363 av_log(avctx, AV_LOG_ERROR,
00364 "1 for reserved RES_TRANSTAB is forbidden\n");
00365 return -1;
00366 }
00367
00368 v->overlap = get_bits1(gb);
00369
00370 v->s.resync_marker = get_bits1(gb);
00371 v->rangered = get_bits1(gb);
00372 if (v->rangered && v->profile == PROFILE_SIMPLE) {
00373 av_log(avctx, AV_LOG_INFO,
00374 "RANGERED should be set to 0 in Simple Profile\n");
00375 }
00376
00377 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3);
00378 v->quantizer_mode = get_bits(gb, 2);
00379
00380 v->finterpflag = get_bits1(gb);
00381
00382 if (v->res_sprite) {
00383 int w = get_bits(gb, 11);
00384 int h = get_bits(gb, 11);
00385 avcodec_set_dimensions(v->s.avctx, w, h);
00386 skip_bits(gb, 5);
00387 v->res_x8 = get_bits1(gb);
00388 if (get_bits1(gb)) {
00389 av_log(avctx, AV_LOG_ERROR, "Unsupported sprite feature\n");
00390 return -1;
00391 }
00392 skip_bits(gb, 3);
00393 v->res_rtm_flag = 0;
00394 } else {
00395 v->res_rtm_flag = get_bits1(gb);
00396 }
00397 if (!v->res_rtm_flag) {
00398 av_log(avctx, AV_LOG_ERROR,
00399 "Old WMV3 version detected, some frames may be decoded incorrectly\n");
00400
00401 }
00402
00403 if (!v->res_fasttx)
00404 skip_bits(gb, 16);
00405 av_log(avctx, AV_LOG_DEBUG,
00406 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
00407 "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
00408 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
00409 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
00410 v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
00411 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
00412 v->rangered, v->vstransform, v->overlap, v->s.resync_marker,
00413 v->dquant, v->quantizer_mode, avctx->max_b_frames);
00414 return 0;
00415 }
00416
00417 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
00418 {
00419 v->res_rtm_flag = 1;
00420 v->level = get_bits(gb, 3);
00421 if (v->level >= 5) {
00422 av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
00423 }
00424 v->chromaformat = get_bits(gb, 2);
00425 if (v->chromaformat != 1) {
00426 av_log(v->s.avctx, AV_LOG_ERROR,
00427 "Only 4:2:0 chroma format supported\n");
00428 return -1;
00429 }
00430
00431
00432 v->frmrtq_postproc = get_bits(gb, 3);
00433
00434 v->bitrtq_postproc = get_bits(gb, 5);
00435 v->postprocflag = get_bits1(gb);
00436
00437 v->max_coded_width = (get_bits(gb, 12) + 1) << 1;
00438 v->max_coded_height = (get_bits(gb, 12) + 1) << 1;
00439 v->broadcast = get_bits1(gb);
00440 v->interlace = get_bits1(gb);
00441 v->tfcntrflag = get_bits1(gb);
00442 v->finterpflag = get_bits1(gb);
00443 skip_bits1(gb);
00444
00445 av_log(v->s.avctx, AV_LOG_DEBUG,
00446 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
00447 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
00448 "TFCTRflag=%i, FINTERPflag=%i\n",
00449 v->level, v->frmrtq_postproc, v->bitrtq_postproc,
00450 v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
00451 v->tfcntrflag, v->finterpflag);
00452
00453 v->psf = get_bits1(gb);
00454 if (v->psf) {
00455 av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n");
00456 return -1;
00457 }
00458 v->s.max_b_frames = v->s.avctx->max_b_frames = 7;
00459 if (get_bits1(gb)) {
00460 int w, h, ar = 0;
00461 av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n");
00462 w = get_bits(gb, 14) + 1;
00463 h = get_bits(gb, 14) + 1;
00464 av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h);
00465 if (get_bits1(gb))
00466 ar = get_bits(gb, 4);
00467 if (ar && ar < 14) {
00468 v->s.avctx->sample_aspect_ratio = ff_vc1_pixel_aspect[ar];
00469 } else if (ar == 15) {
00470 w = get_bits(gb, 8) + 1;
00471 h = get_bits(gb, 8) + 1;
00472 v->s.avctx->sample_aspect_ratio = (AVRational){w, h};
00473 } else {
00474 av_reduce(&v->s.avctx->sample_aspect_ratio.num,
00475 &v->s.avctx->sample_aspect_ratio.den,
00476 v->s.avctx->height * w,
00477 v->s.avctx->width * h,
00478 1 << 30);
00479 }
00480 av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect: %i:%i\n",
00481 v->s.avctx->sample_aspect_ratio.num,
00482 v->s.avctx->sample_aspect_ratio.den);
00483
00484 if (get_bits1(gb)) {
00485 if (get_bits1(gb)) {
00486 v->s.avctx->time_base.num = 32;
00487 v->s.avctx->time_base.den = get_bits(gb, 16) + 1;
00488 } else {
00489 int nr, dr;
00490 nr = get_bits(gb, 8);
00491 dr = get_bits(gb, 4);
00492 if (nr > 0 && nr < 8 && dr > 0 && dr < 3) {
00493 v->s.avctx->time_base.num = ff_vc1_fps_dr[dr - 1];
00494 v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000;
00495 }
00496 }
00497 if (v->broadcast) {
00498 v->s.avctx->time_base.den *= 2;
00499 v->s.avctx->ticks_per_frame = 2;
00500 }
00501 }
00502
00503 if (get_bits1(gb)) {
00504 v->s.avctx->color_primaries = get_bits(gb, 8);
00505 v->s.avctx->color_trc = get_bits(gb, 8);
00506 v->s.avctx->colorspace = get_bits(gb, 8);
00507 v->s.avctx->color_range = AVCOL_RANGE_MPEG;
00508 }
00509 }
00510
00511 v->hrd_param_flag = get_bits1(gb);
00512 if (v->hrd_param_flag) {
00513 int i;
00514 v->hrd_num_leaky_buckets = get_bits(gb, 5);
00515 skip_bits(gb, 4);
00516 skip_bits(gb, 4);
00517 for (i = 0; i < v->hrd_num_leaky_buckets; i++) {
00518 skip_bits(gb, 16);
00519 skip_bits(gb, 16);
00520 }
00521 }
00522 return 0;
00523 }
00524
00525 int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
00526 {
00527 int i;
00528 int w,h;
00529
00530 av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32));
00531 v->broken_link = get_bits1(gb);
00532 v->closed_entry = get_bits1(gb);
00533 v->panscanflag = get_bits1(gb);
00534 v->refdist_flag = get_bits1(gb);
00535 v->s.loop_filter = get_bits1(gb);
00536 if (v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
00537 v->s.loop_filter = 0;
00538 v->fastuvmc = get_bits1(gb);
00539 v->extended_mv = get_bits1(gb);
00540 v->dquant = get_bits(gb, 2);
00541 v->vstransform = get_bits1(gb);
00542 v->overlap = get_bits1(gb);
00543 v->quantizer_mode = get_bits(gb, 2);
00544
00545 if (v->hrd_param_flag) {
00546 for (i = 0; i < v->hrd_num_leaky_buckets; i++) {
00547 skip_bits(gb, 8);
00548 }
00549 }
00550
00551 if(get_bits1(gb)){
00552 w = (get_bits(gb, 12)+1)<<1;
00553 h = (get_bits(gb, 12)+1)<<1;
00554 } else {
00555 w = v->max_coded_width;
00556 h = v->max_coded_height;
00557 }
00558 avcodec_set_dimensions(avctx, w, h);
00559 if (v->extended_mv)
00560 v->extended_dmv = get_bits1(gb);
00561 if ((v->range_mapy_flag = get_bits1(gb))) {
00562 av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n");
00563 v->range_mapy = get_bits(gb, 3);
00564 }
00565 if ((v->range_mapuv_flag = get_bits1(gb))) {
00566 av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n");
00567 v->range_mapuv = get_bits(gb, 3);
00568 }
00569
00570 av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
00571 "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
00572 "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
00573 "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n",
00574 v->broken_link, v->closed_entry, v->panscanflag, v->refdist_flag, v->s.loop_filter,
00575 v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode);
00576
00577 return 0;
00578 }
00579
00580 int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
00581 {
00582 int pqindex, lowquant, status;
00583
00584 if (v->finterpflag)
00585 v->interpfrm = get_bits1(gb);
00586 if (!v->s.avctx->codec)
00587 return -1;
00588 if (v->s.avctx->codec_id == AV_CODEC_ID_MSS2)
00589 v->respic =
00590 v->rangered =
00591 v->multires = get_bits(gb, 2) == 1;
00592 else
00593 skip_bits(gb, 2);
00594 v->rangeredfrm = 0;
00595 if (v->rangered)
00596 v->rangeredfrm = get_bits1(gb);
00597 v->s.pict_type = get_bits1(gb);
00598 if (v->s.avctx->max_b_frames) {
00599 if (!v->s.pict_type) {
00600 if (get_bits1(gb))
00601 v->s.pict_type = AV_PICTURE_TYPE_I;
00602 else
00603 v->s.pict_type = AV_PICTURE_TYPE_B;
00604 } else
00605 v->s.pict_type = AV_PICTURE_TYPE_P;
00606 } else
00607 v->s.pict_type = v->s.pict_type ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
00608
00609 v->bi_type = 0;
00610 if (v->s.pict_type == AV_PICTURE_TYPE_B) {
00611 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
00612 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
00613 if (v->bfraction == 0) {
00614 v->s.pict_type = AV_PICTURE_TYPE_BI;
00615 }
00616 }
00617 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
00618 skip_bits(gb, 7);
00619
00620 if (v->parse_only)
00621 return 0;
00622
00623
00624 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
00625 v->rnd = 1;
00626 if (v->s.pict_type == AV_PICTURE_TYPE_P)
00627 v->rnd ^= 1;
00628
00629
00630 pqindex = get_bits(gb, 5);
00631 if (!pqindex)
00632 return -1;
00633 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
00634 v->pq = ff_vc1_pquant_table[0][pqindex];
00635 else
00636 v->pq = ff_vc1_pquant_table[1][pqindex];
00637
00638 v->pquantizer = 1;
00639 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
00640 v->pquantizer = pqindex < 9;
00641 if (v->quantizer_mode == QUANT_NON_UNIFORM)
00642 v->pquantizer = 0;
00643 v->pqindex = pqindex;
00644 if (pqindex < 9)
00645 v->halfpq = get_bits1(gb);
00646 else
00647 v->halfpq = 0;
00648 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
00649 v->pquantizer = get_bits1(gb);
00650 v->dquantfrm = 0;
00651 if (v->extended_mv == 1)
00652 v->mvrange = get_unary(gb, 0, 3);
00653 v->k_x = v->mvrange + 9 + (v->mvrange >> 1);
00654 v->k_y = v->mvrange + 8;
00655 v->range_x = 1 << (v->k_x - 1);
00656 v->range_y = 1 << (v->k_y - 1);
00657 if (v->multires && v->s.pict_type != AV_PICTURE_TYPE_B)
00658 v->respic = get_bits(gb, 2);
00659
00660 if (v->res_x8 && (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)) {
00661 v->x8_type = get_bits1(gb);
00662 } else
00663 v->x8_type = 0;
00664 av_dlog(v->s.avctx, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
00665 (v->s.pict_type == AV_PICTURE_TYPE_P) ? 'P' : ((v->s.pict_type == AV_PICTURE_TYPE_I) ? 'I' : 'B'),
00666 pqindex, v->pq, v->halfpq, v->rangeredfrm);
00667
00668 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_P)
00669 v->use_ic = 0;
00670
00671 switch (v->s.pict_type) {
00672 case AV_PICTURE_TYPE_P:
00673 if (v->pq < 5) v->tt_index = 0;
00674 else if (v->pq < 13) v->tt_index = 1;
00675 else v->tt_index = 2;
00676
00677 lowquant = (v->pq > 12) ? 0 : 1;
00678 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)];
00679 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
00680 int scale, shift, i;
00681 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)];
00682 v->lumscale = get_bits(gb, 6);
00683 v->lumshift = get_bits(gb, 6);
00684 v->use_ic = 1;
00685
00686 if (!v->lumscale) {
00687 scale = -64;
00688 shift = (255 - v->lumshift * 2) << 6;
00689 if (v->lumshift > 31)
00690 shift += 128 << 6;
00691 } else {
00692 scale = v->lumscale + 32;
00693 if (v->lumshift > 31)
00694 shift = (v->lumshift - 64) << 6;
00695 else
00696 shift = v->lumshift << 6;
00697 }
00698 for (i = 0; i < 256; i++) {
00699 v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6);
00700 v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
00701 }
00702 }
00703 v->qs_last = v->s.quarter_sample;
00704 if (v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
00705 v->s.quarter_sample = 0;
00706 else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
00707 if (v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
00708 v->s.quarter_sample = 0;
00709 else
00710 v->s.quarter_sample = 1;
00711 } else
00712 v->s.quarter_sample = 1;
00713 v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
00714
00715 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
00716 v->mv_mode2 == MV_PMODE_MIXED_MV) ||
00717 v->mv_mode == MV_PMODE_MIXED_MV) {
00718 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
00719 if (status < 0)
00720 return -1;
00721 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
00722 "Imode: %i, Invert: %i\n", status>>1, status&1);
00723 } else {
00724 v->mv_type_is_raw = 0;
00725 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
00726 }
00727 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
00728 if (status < 0)
00729 return -1;
00730 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
00731 "Imode: %i, Invert: %i\n", status>>1, status&1);
00732
00733
00734 v->s.mv_table_index = get_bits(gb, 2);
00735 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
00736
00737 if (v->dquant) {
00738 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
00739 vop_dquant_decoding(v);
00740 }
00741
00742 v->ttfrm = 0;
00743 if (v->vstransform) {
00744 v->ttmbf = get_bits1(gb);
00745 if (v->ttmbf) {
00746 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
00747 }
00748 } else {
00749 v->ttmbf = 1;
00750 v->ttfrm = TT_8X8;
00751 }
00752 break;
00753 case AV_PICTURE_TYPE_B:
00754 if (v->pq < 5) v->tt_index = 0;
00755 else if (v->pq < 13) v->tt_index = 1;
00756 else v->tt_index = 2;
00757
00758 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
00759 v->qs_last = v->s.quarter_sample;
00760 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
00761 v->s.mspel = v->s.quarter_sample;
00762
00763 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
00764 if (status < 0)
00765 return -1;
00766 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
00767 "Imode: %i, Invert: %i\n", status>>1, status&1);
00768 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
00769 if (status < 0)
00770 return -1;
00771 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
00772 "Imode: %i, Invert: %i\n", status>>1, status&1);
00773
00774 v->s.mv_table_index = get_bits(gb, 2);
00775 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
00776
00777 if (v->dquant) {
00778 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
00779 vop_dquant_decoding(v);
00780 }
00781
00782 v->ttfrm = 0;
00783 if (v->vstransform) {
00784 v->ttmbf = get_bits1(gb);
00785 if (v->ttmbf) {
00786 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
00787 }
00788 } else {
00789 v->ttmbf = 1;
00790 v->ttfrm = TT_8X8;
00791 }
00792 break;
00793 }
00794
00795 if (!v->x8_type) {
00796
00797 v->c_ac_table_index = decode012(gb);
00798 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) {
00799 v->y_ac_table_index = decode012(gb);
00800 }
00801
00802 v->s.dc_table_index = get_bits1(gb);
00803 }
00804
00805 if (v->s.pict_type == AV_PICTURE_TYPE_BI) {
00806 v->s.pict_type = AV_PICTURE_TYPE_B;
00807 v->bi_type = 1;
00808 }
00809 return 0;
00810 }
00811
00812
00813 #define INIT_LUT(lumscale, lumshift, luty, lutuv) \
00814 if (!lumscale) { \
00815 scale = -64; \
00816 shift = (255 - lumshift * 2) << 6; \
00817 if (lumshift > 31) \
00818 shift += 128 << 6; \
00819 } else { \
00820 scale = lumscale + 32; \
00821 if (lumshift > 31) \
00822 shift = (lumshift - 64) << 6; \
00823 else \
00824 shift = lumshift << 6; \
00825 } \
00826 for (i = 0; i < 256; i++) { \
00827 luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6); \
00828 lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6); \
00829 }
00830
00831 int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
00832 {
00833 int pqindex, lowquant;
00834 int status;
00835 int mbmodetab, imvtab, icbptab, twomvbptab, fourmvbptab;
00836 int scale, shift, i;
00837 int field_mode, fcm;
00838
00839 v->numref=0;
00840 v->p_frame_skipped = 0;
00841 if (v->second_field) {
00842 if(v->fcm!=2 || v->field_mode!=1)
00843 return -1;
00844 v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
00845 if (v->fptype & 4)
00846 v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
00847 v->s.current_picture_ptr->f.pict_type = v->s.pict_type;
00848 if (!v->pic_header_flag)
00849 goto parse_common_info;
00850 }
00851
00852 field_mode = 0;
00853 if (v->interlace) {
00854 fcm = decode012(gb);
00855 if (fcm) {
00856 if (fcm == ILACE_FIELD)
00857 field_mode = 1;
00858 if (!v->warn_interlaced++)
00859 av_log(v->s.avctx, AV_LOG_ERROR,
00860 "Interlaced frames/fields support is incomplete\n");
00861 }
00862 } else {
00863 fcm = PROGRESSIVE;
00864 }
00865 if (!v->first_pic_header_flag && v->field_mode != field_mode)
00866 return -1;
00867 v->field_mode = field_mode;
00868 v->fcm = fcm;
00869
00870 if (v->field_mode) {
00871 v->fptype = get_bits(gb, 3);
00872 v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
00873 if (v->fptype & 4)
00874 v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
00875 } else {
00876 switch (get_unary(gb, 0, 4)) {
00877 case 0:
00878 v->s.pict_type = AV_PICTURE_TYPE_P;
00879 break;
00880 case 1:
00881 v->s.pict_type = AV_PICTURE_TYPE_B;
00882 break;
00883 case 2:
00884 v->s.pict_type = AV_PICTURE_TYPE_I;
00885 break;
00886 case 3:
00887 v->s.pict_type = AV_PICTURE_TYPE_BI;
00888 break;
00889 case 4:
00890 v->s.pict_type = AV_PICTURE_TYPE_P;
00891 v->p_frame_skipped = 1;
00892 break;
00893 }
00894 }
00895 if (v->tfcntrflag)
00896 skip_bits(gb, 8);
00897 if (v->broadcast) {
00898 if (!v->interlace || v->psf) {
00899 v->rptfrm = get_bits(gb, 2);
00900 } else {
00901 v->tff = get_bits1(gb);
00902 v->rff = get_bits1(gb);
00903 }
00904 }
00905 if (v->panscanflag) {
00906 av_log_missing_feature(v->s.avctx, "Pan-scan", 0);
00907
00908 }
00909 if (v->p_frame_skipped) {
00910 return 0;
00911 }
00912 v->rnd = get_bits1(gb);
00913 if (v->interlace)
00914 v->uvsamp = get_bits1(gb);
00915 if(!ff_vc1_bfraction_vlc.table)
00916 return 0;
00917 if (v->field_mode) {
00918 if (!v->refdist_flag)
00919 v->refdist = 0;
00920 else if ((v->s.pict_type != AV_PICTURE_TYPE_B) && (v->s.pict_type != AV_PICTURE_TYPE_BI)) {
00921 v->refdist = get_bits(gb, 2);
00922 if (v->refdist == 3)
00923 v->refdist += get_unary(gb, 0, 16);
00924 }
00925 if ((v->s.pict_type == AV_PICTURE_TYPE_B) || (v->s.pict_type == AV_PICTURE_TYPE_BI)) {
00926 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
00927 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
00928 v->frfd = (v->bfraction * v->refdist) >> 8;
00929 v->brfd = v->refdist - v->frfd - 1;
00930 if (v->brfd < 0)
00931 v->brfd = 0;
00932 }
00933 goto parse_common_info;
00934 }
00935 if (v->fcm == PROGRESSIVE) {
00936 if (v->finterpflag)
00937 v->interpfrm = get_bits1(gb);
00938 if (v->s.pict_type == AV_PICTURE_TYPE_B) {
00939 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
00940 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
00941 if (v->bfraction == 0) {
00942 v->s.pict_type = AV_PICTURE_TYPE_BI;
00943 }
00944 }
00945 }
00946
00947 parse_common_info:
00948 if (v->field_mode)
00949 v->cur_field_type = !(v->tff ^ v->second_field);
00950 pqindex = get_bits(gb, 5);
00951 if (!pqindex)
00952 return -1;
00953 v->pqindex = pqindex;
00954 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
00955 v->pq = ff_vc1_pquant_table[0][pqindex];
00956 else
00957 v->pq = ff_vc1_pquant_table[1][pqindex];
00958
00959 v->pquantizer = 1;
00960 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
00961 v->pquantizer = pqindex < 9;
00962 if (v->quantizer_mode == QUANT_NON_UNIFORM)
00963 v->pquantizer = 0;
00964 v->pqindex = pqindex;
00965 if (pqindex < 9)
00966 v->halfpq = get_bits1(gb);
00967 else
00968 v->halfpq = 0;
00969 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
00970 v->pquantizer = get_bits1(gb);
00971 if (v->postprocflag)
00972 v->postproc = get_bits(gb, 2);
00973
00974 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_P)
00975 v->use_ic = 0;
00976
00977 if (v->parse_only)
00978 return 0;
00979
00980 switch (v->s.pict_type) {
00981 case AV_PICTURE_TYPE_I:
00982 case AV_PICTURE_TYPE_BI:
00983 if (v->fcm == ILACE_FRAME) {
00984 status = bitplane_decoding(v->fieldtx_plane, &v->fieldtx_is_raw, v);
00985 if (status < 0)
00986 return -1;
00987 av_log(v->s.avctx, AV_LOG_DEBUG, "FIELDTX plane encoding: "
00988 "Imode: %i, Invert: %i\n", status>>1, status&1);
00989 }
00990 status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
00991 if (status < 0)
00992 return -1;
00993 av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
00994 "Imode: %i, Invert: %i\n", status>>1, status&1);
00995 v->condover = CONDOVER_NONE;
00996 if (v->overlap && v->pq <= 8) {
00997 v->condover = decode012(gb);
00998 if (v->condover == CONDOVER_SELECT) {
00999 status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v);
01000 if (status < 0)
01001 return -1;
01002 av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: "
01003 "Imode: %i, Invert: %i\n", status>>1, status&1);
01004 }
01005 }
01006 break;
01007 case AV_PICTURE_TYPE_P:
01008 if (v->field_mode) {
01009 v->numref = get_bits1(gb);
01010 if (!v->numref) {
01011 v->reffield = get_bits1(gb);
01012 v->ref_field_type[0] = v->reffield ^ !v->cur_field_type;
01013 }
01014 }
01015 if (v->extended_mv)
01016 v->mvrange = get_unary(gb, 0, 3);
01017 else
01018 v->mvrange = 0;
01019 if (v->interlace) {
01020 if (v->extended_dmv)
01021 v->dmvrange = get_unary(gb, 0, 3);
01022 else
01023 v->dmvrange = 0;
01024 if (v->fcm == ILACE_FRAME) {
01025 v->fourmvswitch = get_bits1(gb);
01026 v->intcomp = get_bits1(gb);
01027 if (v->intcomp) {
01028 v->lumscale = get_bits(gb, 6);
01029 v->lumshift = get_bits(gb, 6);
01030 INIT_LUT(v->lumscale, v->lumshift, v->luty, v->lutuv);
01031 }
01032 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
01033 av_log(v->s.avctx, AV_LOG_DEBUG, "SKIPMB plane encoding: "
01034 "Imode: %i, Invert: %i\n", status>>1, status&1);
01035 mbmodetab = get_bits(gb, 2);
01036 if (v->fourmvswitch)
01037 v->mbmode_vlc = &ff_vc1_intfr_4mv_mbmode_vlc[mbmodetab];
01038 else
01039 v->mbmode_vlc = &ff_vc1_intfr_non4mv_mbmode_vlc[mbmodetab];
01040 imvtab = get_bits(gb, 2);
01041 v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[imvtab];
01042
01043 icbptab = get_bits(gb, 3);
01044 v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
01045 twomvbptab = get_bits(gb, 2);
01046 v->twomvbp_vlc = &ff_vc1_2mv_block_pattern_vlc[twomvbptab];
01047 if (v->fourmvswitch) {
01048 fourmvbptab = get_bits(gb, 2);
01049 v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
01050 }
01051 }
01052 }
01053 v->k_x = v->mvrange + 9 + (v->mvrange >> 1);
01054 v->k_y = v->mvrange + 8;
01055 v->range_x = 1 << (v->k_x - 1);
01056 v->range_y = 1 << (v->k_y - 1);
01057
01058 if (v->pq < 5)
01059 v->tt_index = 0;
01060 else if (v->pq < 13)
01061 v->tt_index = 1;
01062 else
01063 v->tt_index = 2;
01064 if (v->fcm != ILACE_FRAME) {
01065 int mvmode;
01066 mvmode = get_unary(gb, 1, 4);
01067 lowquant = (v->pq > 12) ? 0 : 1;
01068 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][mvmode];
01069 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
01070 int mvmode2;
01071 mvmode2 = get_unary(gb, 1, 3);
01072 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][mvmode2];
01073 if (v->field_mode)
01074 v->intcompfield = decode210(gb);
01075 v->lumscale = get_bits(gb, 6);
01076 v->lumshift = get_bits(gb, 6);
01077 INIT_LUT(v->lumscale, v->lumshift, v->luty, v->lutuv);
01078 if ((v->field_mode) && !v->intcompfield) {
01079 v->lumscale2 = get_bits(gb, 6);
01080 v->lumshift2 = get_bits(gb, 6);
01081 INIT_LUT(v->lumscale2, v->lumshift2, v->luty2, v->lutuv2);
01082 }
01083 v->use_ic = 1;
01084 }
01085 v->qs_last = v->s.quarter_sample;
01086 if (v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
01087 v->s.quarter_sample = 0;
01088 else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
01089 if (v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
01090 v->s.quarter_sample = 0;
01091 else
01092 v->s.quarter_sample = 1;
01093 } else
01094 v->s.quarter_sample = 1;
01095 v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN
01096 || (v->mv_mode == MV_PMODE_INTENSITY_COMP
01097 && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
01098 }
01099 if (v->fcm == PROGRESSIVE) {
01100 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
01101 v->mv_mode2 == MV_PMODE_MIXED_MV)
01102 || v->mv_mode == MV_PMODE_MIXED_MV) {
01103 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
01104 if (status < 0)
01105 return -1;
01106 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
01107 "Imode: %i, Invert: %i\n", status>>1, status&1);
01108 } else {
01109 v->mv_type_is_raw = 0;
01110 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
01111 }
01112 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
01113 if (status < 0)
01114 return -1;
01115 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
01116 "Imode: %i, Invert: %i\n", status>>1, status&1);
01117
01118
01119 v->s.mv_table_index = get_bits(gb, 2);
01120 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
01121 } else if (v->fcm == ILACE_FRAME) {
01122 v->qs_last = v->s.quarter_sample;
01123 v->s.quarter_sample = 1;
01124 v->s.mspel = 1;
01125 } else {
01126 mbmodetab = get_bits(gb, 3);
01127 imvtab = get_bits(gb, 2 + v->numref);
01128 if (!v->numref)
01129 v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[imvtab];
01130 else
01131 v->imv_vlc = &ff_vc1_2ref_mvdata_vlc[imvtab];
01132 icbptab = get_bits(gb, 3);
01133 v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
01134 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
01135 v->mv_mode2 == MV_PMODE_MIXED_MV) || v->mv_mode == MV_PMODE_MIXED_MV) {
01136 fourmvbptab = get_bits(gb, 2);
01137 v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
01138 v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[mbmodetab];
01139 } else {
01140 v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[mbmodetab];
01141 }
01142 }
01143 if (v->dquant) {
01144 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
01145 vop_dquant_decoding(v);
01146 }
01147
01148 v->ttfrm = 0;
01149 if (v->vstransform) {
01150 v->ttmbf = get_bits1(gb);
01151 if (v->ttmbf) {
01152 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
01153 }
01154 } else {
01155 v->ttmbf = 1;
01156 v->ttfrm = TT_8X8;
01157 }
01158 break;
01159 case AV_PICTURE_TYPE_B:
01160 if (v->fcm == ILACE_FRAME) {
01161 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
01162 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
01163 if (v->bfraction == 0) {
01164 return -1;
01165 }
01166 }
01167 if (v->extended_mv)
01168 v->mvrange = get_unary(gb, 0, 3);
01169 else
01170 v->mvrange = 0;
01171 v->k_x = v->mvrange + 9 + (v->mvrange >> 1);
01172 v->k_y = v->mvrange + 8;
01173 v->range_x = 1 << (v->k_x - 1);
01174 v->range_y = 1 << (v->k_y - 1);
01175
01176 if (v->pq < 5)
01177 v->tt_index = 0;
01178 else if (v->pq < 13)
01179 v->tt_index = 1;
01180 else
01181 v->tt_index = 2;
01182
01183 if (v->field_mode) {
01184 int mvmode;
01185 av_log(v->s.avctx, AV_LOG_DEBUG, "B Fields\n");
01186 if (v->extended_dmv)
01187 v->dmvrange = get_unary(gb, 0, 3);
01188 mvmode = get_unary(gb, 1, 3);
01189 lowquant = (v->pq > 12) ? 0 : 1;
01190 v->mv_mode = ff_vc1_mv_pmode_table2[lowquant][mvmode];
01191 v->qs_last = v->s.quarter_sample;
01192 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV || v->mv_mode == MV_PMODE_MIXED_MV);
01193 v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || v->mv_mode == MV_PMODE_1MV_HPEL);
01194 status = bitplane_decoding(v->forward_mb_plane, &v->fmb_is_raw, v);
01195 if (status < 0)
01196 return -1;
01197 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Forward Type plane encoding: "
01198 "Imode: %i, Invert: %i\n", status>>1, status&1);
01199 mbmodetab = get_bits(gb, 3);
01200 if (v->mv_mode == MV_PMODE_MIXED_MV)
01201 v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[mbmodetab];
01202 else
01203 v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[mbmodetab];
01204 imvtab = get_bits(gb, 3);
01205 v->imv_vlc = &ff_vc1_2ref_mvdata_vlc[imvtab];
01206 icbptab = get_bits(gb, 3);
01207 v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
01208 if (v->mv_mode == MV_PMODE_MIXED_MV) {
01209 fourmvbptab = get_bits(gb, 2);
01210 v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
01211 }
01212 v->numref = 1;
01213 } else if (v->fcm == ILACE_FRAME) {
01214 if (v->extended_dmv)
01215 v->dmvrange = get_unary(gb, 0, 3);
01216 get_bits1(gb);
01217 v->intcomp = 0;
01218 v->mv_mode = MV_PMODE_1MV;
01219 v->fourmvswitch = 0;
01220 v->qs_last = v->s.quarter_sample;
01221 v->s.quarter_sample = 1;
01222 v->s.mspel = 1;
01223 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
01224 if (status < 0)
01225 return -1;
01226 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
01227 "Imode: %i, Invert: %i\n", status>>1, status&1);
01228 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
01229 if (status < 0)
01230 return -1;
01231 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
01232 "Imode: %i, Invert: %i\n", status>>1, status&1);
01233 mbmodetab = get_bits(gb, 2);
01234 v->mbmode_vlc = &ff_vc1_intfr_non4mv_mbmode_vlc[mbmodetab];
01235 imvtab = get_bits(gb, 2);
01236 v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[imvtab];
01237
01238 icbptab = get_bits(gb, 3);
01239 v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
01240 twomvbptab = get_bits(gb, 2);
01241 v->twomvbp_vlc = &ff_vc1_2mv_block_pattern_vlc[twomvbptab];
01242 fourmvbptab = get_bits(gb, 2);
01243 v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
01244 } else {
01245 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
01246 v->qs_last = v->s.quarter_sample;
01247 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
01248 v->s.mspel = v->s.quarter_sample;
01249 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
01250 if (status < 0)
01251 return -1;
01252 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
01253 "Imode: %i, Invert: %i\n", status>>1, status&1);
01254 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
01255 if (status < 0)
01256 return -1;
01257 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
01258 "Imode: %i, Invert: %i\n", status>>1, status&1);
01259 v->s.mv_table_index = get_bits(gb, 2);
01260 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
01261 }
01262
01263 if (v->dquant) {
01264 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
01265 vop_dquant_decoding(v);
01266 }
01267
01268 v->ttfrm = 0;
01269 if (v->vstransform) {
01270 v->ttmbf = get_bits1(gb);
01271 if (v->ttmbf) {
01272 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
01273 }
01274 } else {
01275 v->ttmbf = 1;
01276 v->ttfrm = TT_8X8;
01277 }
01278 break;
01279 }
01280
01281 if (v->fcm != PROGRESSIVE && !v->s.quarter_sample) {
01282 v->range_x <<= 1;
01283 v->range_y <<= 1;
01284 }
01285
01286
01287 v->c_ac_table_index = decode012(gb);
01288 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) {
01289 v->y_ac_table_index = decode012(gb);
01290 }
01291
01292 v->s.dc_table_index = get_bits1(gb);
01293 if ((v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
01294 && v->dquant) {
01295 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
01296 vop_dquant_decoding(v);
01297 }
01298
01299 v->bi_type = 0;
01300 if (v->s.pict_type == AV_PICTURE_TYPE_BI) {
01301 v->s.pict_type = AV_PICTURE_TYPE_B;
01302 v->bi_type = 1;
01303 }
01304 return 0;
01305 }
01306
01307 static const uint32_t vc1_ac_tables[AC_MODES][186][2] = {
01308 {
01309 { 0x0001, 2}, { 0x0005, 3}, { 0x000D, 4}, { 0x0012, 5}, { 0x000E, 6}, { 0x0015, 7},
01310 { 0x0013, 8}, { 0x003F, 8}, { 0x004B, 9}, { 0x011F, 9}, { 0x00B8, 10}, { 0x03E3, 10},
01311 { 0x0172, 11}, { 0x024D, 12}, { 0x03DA, 12}, { 0x02DD, 13}, { 0x1F55, 13}, { 0x05B9, 14},
01312 { 0x3EAE, 14}, { 0x0000, 4}, { 0x0010, 5}, { 0x0008, 7}, { 0x0020, 8}, { 0x0029, 9},
01313 { 0x01F4, 9}, { 0x0233, 10}, { 0x01E0, 11}, { 0x012A, 12}, { 0x03DD, 12}, { 0x050A, 13},
01314 { 0x1F29, 13}, { 0x0A42, 14}, { 0x1272, 15}, { 0x1737, 15}, { 0x0003, 5}, { 0x0011, 7},
01315 { 0x00C4, 8}, { 0x004B, 10}, { 0x00B4, 11}, { 0x07D4, 11}, { 0x0345, 12}, { 0x02D7, 13},
01316 { 0x07BF, 13}, { 0x0938, 14}, { 0x0BBB, 14}, { 0x095E, 15}, { 0x0013, 5}, { 0x0078, 7},
01317 { 0x0069, 9}, { 0x0232, 10}, { 0x0461, 11}, { 0x03EC, 12}, { 0x0520, 13}, { 0x1F2A, 13},
01318 { 0x3E50, 14}, { 0x3E51, 14}, { 0x1486, 15}, { 0x000C, 6}, { 0x0024, 9}, { 0x0094, 11},
01319 { 0x08C0, 12}, { 0x0F09, 14}, { 0x1EF0, 15}, { 0x003D, 6}, { 0x0053, 9}, { 0x01A0, 11},
01320 { 0x02D6, 13}, { 0x0F08, 14}, { 0x0013, 7}, { 0x007C, 9}, { 0x07C1, 11}, { 0x04AC, 14},
01321 { 0x001B, 7}, { 0x00A0, 10}, { 0x0344, 12}, { 0x0F79, 14}, { 0x0079, 7}, { 0x03E1, 10},
01322 { 0x02D4, 13}, { 0x2306, 14}, { 0x0021, 8}, { 0x023C, 10}, { 0x0FAE, 12}, { 0x23DE, 14},
01323 { 0x0035, 8}, { 0x0175, 11}, { 0x07B3, 13}, { 0x00C5, 8}, { 0x0174, 11}, { 0x0785, 13},
01324 { 0x0048, 9}, { 0x01A3, 11}, { 0x049E, 13}, { 0x002C, 9}, { 0x00FA, 10}, { 0x07D6, 11},
01325 { 0x0092, 10}, { 0x05CC, 13}, { 0x1EF1, 15}, { 0x00A3, 10}, { 0x03ED, 12}, { 0x093E, 14},
01326 { 0x01E2, 11}, { 0x1273, 15}, { 0x07C4, 11}, { 0x1487, 15}, { 0x0291, 12}, { 0x0293, 12},
01327 { 0x0F8A, 12}, { 0x0509, 13}, { 0x0508, 13}, { 0x078D, 13}, { 0x07BE, 13}, { 0x078C, 13},
01328 { 0x04AE, 14}, { 0x0BBA, 14}, { 0x2307, 14}, { 0x0B9A, 14}, { 0x1736, 15}, { 0x000E, 4},
01329 { 0x0045, 7}, { 0x01F3, 9}, { 0x047A, 11}, { 0x05DC, 13}, { 0x23DF, 14}, { 0x0019, 5},
01330 { 0x0028, 9}, { 0x0176, 11}, { 0x049D, 13}, { 0x23DD, 14}, { 0x0030, 6}, { 0x00A2, 10},
01331 { 0x02EF, 12}, { 0x05B8, 14}, { 0x003F, 6}, { 0x00A5, 10}, { 0x03DB, 12}, { 0x093F, 14},
01332 { 0x0044, 7}, { 0x07CB, 11}, { 0x095F, 15}, { 0x0063, 7}, { 0x03C3, 12}, { 0x0015, 8},
01333 { 0x08F6, 12}, { 0x0017, 8}, { 0x0498, 13}, { 0x002C, 8}, { 0x07B2, 13}, { 0x002F, 8},
01334 { 0x1F54, 13}, { 0x008D, 8}, { 0x07BD, 13}, { 0x008E, 8}, { 0x1182, 13}, { 0x00FB, 8},
01335 { 0x050B, 13}, { 0x002D, 8}, { 0x07C0, 11}, { 0x0079, 9}, { 0x1F5F, 13}, { 0x007A, 9},
01336 { 0x1F56, 13}, { 0x0231, 10}, { 0x03E4, 10}, { 0x01A1, 11}, { 0x0143, 11}, { 0x01F7, 11},
01337 { 0x016F, 12}, { 0x0292, 12}, { 0x02E7, 12}, { 0x016C, 12}, { 0x016D, 12}, { 0x03DC, 12},
01338 { 0x0F8B, 12}, { 0x0499, 13}, { 0x03D8, 12}, { 0x078E, 13}, { 0x02D5, 13}, { 0x1F5E, 13},
01339 { 0x1F2B, 13}, { 0x078F, 13}, { 0x04AD, 14}, { 0x3EAF, 14}, { 0x23DC, 14}, { 0x004A, 9}
01340 },
01341 {
01342 { 0x0000, 3}, { 0x0003, 4}, { 0x000B, 5}, { 0x0014, 6}, { 0x003F, 6}, { 0x005D, 7},
01343 { 0x00A2, 8}, { 0x00AC, 9}, { 0x016E, 9}, { 0x020A, 10}, { 0x02E2, 10}, { 0x0432, 11},
01344 { 0x05C9, 11}, { 0x0827, 12}, { 0x0B54, 12}, { 0x04E6, 13}, { 0x105F, 13}, { 0x172A, 13},
01345 { 0x20B2, 14}, { 0x2D4E, 14}, { 0x39F0, 14}, { 0x4175, 15}, { 0x5A9E, 15}, { 0x0004, 4},
01346 { 0x001E, 5}, { 0x0042, 7}, { 0x00B6, 8}, { 0x0173, 9}, { 0x0395, 10}, { 0x072E, 11},
01347 { 0x0B94, 12}, { 0x16A4, 13}, { 0x20B3, 14}, { 0x2E45, 14}, { 0x0005, 5}, { 0x0040, 7},
01348 { 0x0049, 9}, { 0x028F, 10}, { 0x05CB, 11}, { 0x048A, 13}, { 0x09DD, 14}, { 0x73E2, 15},
01349 { 0x0018, 5}, { 0x0025, 8}, { 0x008A, 10}, { 0x051B, 11}, { 0x0E5F, 12}, { 0x09C9, 14},
01350 { 0x139C, 15}, { 0x0029, 6}, { 0x004F, 9}, { 0x0412, 11}, { 0x048D, 13}, { 0x2E41, 14},
01351 { 0x0038, 6}, { 0x010E, 9}, { 0x05A8, 11}, { 0x105C, 13}, { 0x39F2, 14}, { 0x0058, 7},
01352 { 0x021F, 10}, { 0x0E7E, 12}, { 0x39FF, 14}, { 0x0023, 8}, { 0x02E3, 10}, { 0x04E5, 13},
01353 { 0x2E40, 14}, { 0x00A1, 8}, { 0x05BE, 11}, { 0x09C8, 14}, { 0x0083, 8}, { 0x013A, 11},
01354 { 0x1721, 13}, { 0x0044, 9}, { 0x0276, 12}, { 0x39F6, 14}, { 0x008B, 10}, { 0x04EF, 13},
01355 { 0x5A9B, 15}, { 0x0208, 10}, { 0x1CFE, 13}, { 0x0399, 10}, { 0x1CB4, 13}, { 0x039E, 10},
01356 { 0x39F3, 14}, { 0x05AB, 11}, { 0x73E3, 15}, { 0x0737, 11}, { 0x5A9F, 15}, { 0x082D, 12},
01357 { 0x0E69, 12}, { 0x0E68, 12}, { 0x0433, 11}, { 0x0B7B, 12}, { 0x2DF8, 14}, { 0x2E56, 14},
01358 { 0x2E57, 14}, { 0x39F7, 14}, { 0x51A5, 15}, { 0x0003, 3}, { 0x002A, 6}, { 0x00E4, 8},
01359 { 0x028E, 10}, { 0x0735, 11}, { 0x1058, 13}, { 0x1CFA, 13}, { 0x2DF9, 14}, { 0x4174, 15},
01360 { 0x0009, 4}, { 0x0054, 8}, { 0x0398, 10}, { 0x048B, 13}, { 0x139D, 15}, { 0x000D, 4},
01361 { 0x00AD, 9}, { 0x0826, 12}, { 0x2D4C, 14}, { 0x0011, 5}, { 0x016B, 9}, { 0x0B7F, 12},
01362 { 0x51A4, 15}, { 0x0019, 5}, { 0x021B, 10}, { 0x16FD, 13}, { 0x001D, 5}, { 0x0394, 10},
01363 { 0x28D3, 14}, { 0x002B, 6}, { 0x05BC, 11}, { 0x5A9A, 15}, { 0x002F, 6}, { 0x0247, 12},
01364 { 0x0010, 7}, { 0x0A35, 12}, { 0x003E, 6}, { 0x0B7A, 12}, { 0x0059, 7}, { 0x105E, 13},
01365 { 0x0026, 8}, { 0x09CF, 14}, { 0x0055, 8}, { 0x1CB5, 13}, { 0x0057, 8}, { 0x0E5B, 12},
01366 { 0x00A0, 8}, { 0x1468, 13}, { 0x0170, 9}, { 0x0090, 10}, { 0x01CE, 9}, { 0x021A, 10},
01367 { 0x0218, 10}, { 0x0168, 9}, { 0x021E, 10}, { 0x0244, 12}, { 0x0736, 11}, { 0x0138, 11},
01368 { 0x0519, 11}, { 0x0E5E, 12}, { 0x072C, 11}, { 0x0B55, 12}, { 0x09DC, 14}, { 0x20BB, 14},
01369 { 0x048C, 13}, { 0x1723, 13}, { 0x2E44, 14}, { 0x16A5, 13}, { 0x0518, 11}, { 0x39FE, 14},
01370 { 0x0169, 9}
01371 },
01372 {
01373 { 0x0001, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x0016, 5}, { 0x0020, 6}, { 0x0018, 7},
01374 { 0x0008, 8}, { 0x009A, 8}, { 0x0056, 9}, { 0x013E, 9}, { 0x00F0, 10}, { 0x03A5, 10},
01375 { 0x0077, 11}, { 0x01EF, 11}, { 0x009A, 12}, { 0x005D, 13}, { 0x0001, 4}, { 0x0011, 5},
01376 { 0x0002, 7}, { 0x000B, 8}, { 0x0012, 9}, { 0x01D6, 9}, { 0x027E, 10}, { 0x0191, 11},
01377 { 0x00EA, 12}, { 0x03DC, 12}, { 0x013B, 13}, { 0x0004, 5}, { 0x0014, 7}, { 0x009E, 8},
01378 { 0x0009, 10}, { 0x01AC, 11}, { 0x01E2, 11}, { 0x03CA, 12}, { 0x005F, 13}, { 0x0017, 5},
01379 { 0x004E, 7}, { 0x005E, 9}, { 0x00F3, 10}, { 0x01AD, 11}, { 0x00EC, 12}, { 0x05F0, 13},
01380 { 0x000E, 6}, { 0x00E1, 8}, { 0x03A4, 10}, { 0x009C, 12}, { 0x013D, 13}, { 0x003B, 6},
01381 { 0x001C, 9}, { 0x0014, 11}, { 0x09BE, 12}, { 0x0006, 7}, { 0x007A, 9}, { 0x0190, 11},
01382 { 0x0137, 13}, { 0x001B, 7}, { 0x0008, 10}, { 0x075C, 11}, { 0x0071, 7}, { 0x00D7, 10},
01383 { 0x09BF, 12}, { 0x0007, 8}, { 0x00AF, 10}, { 0x04CC, 11}, { 0x0034, 8}, { 0x0265, 10},
01384 { 0x009F, 12}, { 0x00E0, 8}, { 0x0016, 11}, { 0x0327, 12}, { 0x0015, 9}, { 0x017D, 11},
01385 { 0x0EBB, 12}, { 0x0014, 9}, { 0x00F6, 10}, { 0x01E4, 11}, { 0x00CB, 10}, { 0x099D, 12},
01386 { 0x00CA, 10}, { 0x02FC, 12}, { 0x017F, 11}, { 0x04CD, 11}, { 0x02FD, 12}, { 0x04FE, 11},
01387 { 0x013A, 13}, { 0x000A, 4}, { 0x0042, 7}, { 0x01D3, 9}, { 0x04DD, 11}, { 0x0012, 5},
01388 { 0x00E8, 8}, { 0x004C, 11}, { 0x0136, 13}, { 0x0039, 6}, { 0x0264, 10}, { 0x0EBA, 12},
01389 { 0x0000, 7}, { 0x00AE, 10}, { 0x099C, 12}, { 0x001F, 7}, { 0x04DE, 11}, { 0x0043, 7},
01390 { 0x04DC, 11}, { 0x0003, 8}, { 0x03CB, 12}, { 0x0006, 8}, { 0x099E, 12}, { 0x002A, 8},
01391 { 0x05F1, 13}, { 0x000F, 8}, { 0x09FE, 12}, { 0x0033, 8}, { 0x09FF, 12}, { 0x0098, 8},
01392 { 0x099F, 12}, { 0x00EA, 8}, { 0x013C, 13}, { 0x002E, 8}, { 0x0192, 11}, { 0x0136, 9},
01393 { 0x006A, 9}, { 0x0015, 11}, { 0x03AF, 10}, { 0x01E3, 11}, { 0x0074, 11}, { 0x00EB, 12},
01394 { 0x02F9, 12}, { 0x005C, 13}, { 0x00ED, 12}, { 0x03DD, 12}, { 0x0326, 12}, { 0x005E, 13},
01395 { 0x0016, 7}
01396 },
01397 {
01398 { 0x0004, 3}, { 0x0014, 5}, { 0x0017, 7}, { 0x007F, 8}, { 0x0154, 9}, { 0x01F2, 10},
01399 { 0x00BF, 11}, { 0x0065, 12}, { 0x0AAA, 12}, { 0x0630, 13}, { 0x1597, 13}, { 0x03B7, 14},
01400 { 0x2B22, 14}, { 0x0BE6, 15}, { 0x000B, 4}, { 0x0037, 7}, { 0x0062, 9}, { 0x0007, 11},
01401 { 0x0166, 12}, { 0x00CE, 13}, { 0x1590, 13}, { 0x05F6, 14}, { 0x0BE7, 15}, { 0x0007, 5},
01402 { 0x006D, 8}, { 0x0003, 11}, { 0x031F, 12}, { 0x05F2, 14}, { 0x0002, 6}, { 0x0061, 9},
01403 { 0x0055, 12}, { 0x01DF, 14}, { 0x001A, 6}, { 0x001E, 10}, { 0x0AC9, 12}, { 0x2B23, 14},
01404 { 0x001E, 6}, { 0x001F, 10}, { 0x0AC3, 12}, { 0x2B2B, 14}, { 0x0006, 7}, { 0x0004, 11},
01405 { 0x02F8, 13}, { 0x0019, 7}, { 0x0006, 11}, { 0x063D, 13}, { 0x0057, 7}, { 0x0182, 11},
01406 { 0x2AA2, 14}, { 0x0004, 8}, { 0x0180, 11}, { 0x059C, 14}, { 0x007D, 8}, { 0x0164, 12},
01407 { 0x076D, 15}, { 0x0002, 9}, { 0x018D, 11}, { 0x1581, 13}, { 0x00AD, 8}, { 0x0060, 12},
01408 { 0x0C67, 14}, { 0x001C, 9}, { 0x00EE, 13}, { 0x0003, 9}, { 0x02CF, 13}, { 0x00D9, 9},
01409 { 0x1580, 13}, { 0x0002, 11}, { 0x0183, 11}, { 0x0057, 12}, { 0x0061, 12}, { 0x0031, 11},
01410 { 0x0066, 12}, { 0x0631, 13}, { 0x0632, 13}, { 0x00AC, 13}, { 0x031D, 12}, { 0x0076, 12},
01411 { 0x003A, 11}, { 0x0165, 12}, { 0x0C66, 14}, { 0x0003, 2}, { 0x0054, 7}, { 0x02AB, 10},
01412 { 0x0016, 13}, { 0x05F7, 14}, { 0x0005, 4}, { 0x00F8, 9}, { 0x0AA9, 12}, { 0x005F, 15},
01413 { 0x0004, 4}, { 0x001C, 10}, { 0x1550, 13}, { 0x0004, 5}, { 0x0077, 11}, { 0x076C, 15},
01414 { 0x000E, 5}, { 0x000A, 12}, { 0x000C, 5}, { 0x0562, 11}, { 0x0004, 6}, { 0x031C, 12},
01415 { 0x0006, 6}, { 0x00C8, 13}, { 0x000D, 6}, { 0x01DA, 13}, { 0x0007, 6}, { 0x00C9, 13},
01416 { 0x0001, 7}, { 0x002E, 14}, { 0x0014, 7}, { 0x1596, 13}, { 0x000A, 7}, { 0x0AC2, 12},
01417 { 0x0016, 7}, { 0x015B, 14}, { 0x0015, 7}, { 0x015A, 14}, { 0x000F, 8}, { 0x005E, 15},
01418 { 0x007E, 8}, { 0x00AB, 8}, { 0x002D, 9}, { 0x00D8, 9}, { 0x000B, 9}, { 0x0014, 10},
01419 { 0x02B3, 10}, { 0x01F3, 10}, { 0x003A, 10}, { 0x0000, 10}, { 0x0058, 10}, { 0x002E, 9},
01420 { 0x005E, 10}, { 0x0563, 11}, { 0x00EC, 12}, { 0x0054, 12}, { 0x0AC1, 12}, { 0x1556, 13},
01421 { 0x02FA, 13}, { 0x0181, 11}, { 0x1557, 13}, { 0x059D, 14}, { 0x2AA3, 14}, { 0x2B2A, 14},
01422 { 0x01DE, 14}, { 0x063C, 13}, { 0x00CF, 13}, { 0x1594, 13}, { 0x000D, 9}
01423 },
01424 {
01425 { 0x0002, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x000D, 5}, { 0x000C, 5}, { 0x0015, 6},
01426 { 0x0013, 6}, { 0x0012, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x001E, 8}, { 0x001D, 8},
01427 { 0x0025, 9}, { 0x0024, 9}, { 0x0023, 9}, { 0x0021, 9}, { 0x0021, 10}, { 0x0020, 10},
01428 { 0x000F, 10}, { 0x000E, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11}, { 0x0021, 11},
01429 { 0x0050, 12}, { 0x0051, 12}, { 0x0052, 12}, { 0x000E, 4}, { 0x0014, 6}, { 0x0016, 7},
01430 { 0x001C, 8}, { 0x0020, 9}, { 0x001F, 9}, { 0x000D, 10}, { 0x0022, 11}, { 0x0053, 12},
01431 { 0x0055, 12}, { 0x000B, 5}, { 0x0015, 7}, { 0x001E, 9}, { 0x000C, 10}, { 0x0056, 12},
01432 { 0x0011, 6}, { 0x001B, 8}, { 0x001D, 9}, { 0x000B, 10}, { 0x0010, 6}, { 0x0022, 9},
01433 { 0x000A, 10}, { 0x000D, 6}, { 0x001C, 9}, { 0x0008, 10}, { 0x0012, 7}, { 0x001B, 9},
01434 { 0x0054, 12}, { 0x0014, 7}, { 0x001A, 9}, { 0x0057, 12}, { 0x0019, 8}, { 0x0009, 10},
01435 { 0x0018, 8}, { 0x0023, 11}, { 0x0017, 8}, { 0x0019, 9}, { 0x0018, 9}, { 0x0007, 10},
01436 { 0x0058, 12}, { 0x0007, 4}, { 0x000C, 6}, { 0x0016, 8}, { 0x0017, 9}, { 0x0006, 10},
01437 { 0x0005, 11}, { 0x0004, 11}, { 0x0059, 12}, { 0x000F, 6}, { 0x0016, 9}, { 0x0005, 10},
01438 { 0x000E, 6}, { 0x0004, 10}, { 0x0011, 7}, { 0x0024, 11}, { 0x0010, 7}, { 0x0025, 11},
01439 { 0x0013, 7}, { 0x005A, 12}, { 0x0015, 8}, { 0x005B, 12}, { 0x0014, 8}, { 0x0013, 8},
01440 { 0x001A, 8}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9}, { 0x0012, 9}, { 0x0011, 9},
01441 { 0x0026, 11}, { 0x0027, 11}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12},
01442 { 0x0003, 7}
01443 },
01444 {
01445 { 0x0002, 2}, { 0x000F, 4}, { 0x0015, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x0025, 9},
01446 { 0x0024, 9}, { 0x0021, 10}, { 0x0020, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11},
01447 { 0x0006, 3}, { 0x0014, 6}, { 0x001E, 8}, { 0x000F, 10}, { 0x0021, 11}, { 0x0050, 12},
01448 { 0x000E, 4}, { 0x001D, 8}, { 0x000E, 10}, { 0x0051, 12}, { 0x000D, 5}, { 0x0023, 9},
01449 { 0x000D, 10}, { 0x000C, 5}, { 0x0022, 9}, { 0x0052, 12}, { 0x000B, 5}, { 0x000C, 10},
01450 { 0x0053, 12}, { 0x0013, 6}, { 0x000B, 10}, { 0x0054, 12}, { 0x0012, 6}, { 0x000A, 10},
01451 { 0x0011, 6}, { 0x0009, 10}, { 0x0010, 6}, { 0x0008, 10}, { 0x0016, 7}, { 0x0055, 12},
01452 { 0x0015, 7}, { 0x0014, 7}, { 0x001C, 8}, { 0x001B, 8}, { 0x0021, 9}, { 0x0020, 9},
01453 { 0x001F, 9}, { 0x001E, 9}, { 0x001D, 9}, { 0x001C, 9}, { 0x001B, 9}, { 0x001A, 9},
01454 { 0x0022, 11}, { 0x0023, 11}, { 0x0056, 12}, { 0x0057, 12}, { 0x0007, 4}, { 0x0019, 9},
01455 { 0x0005, 11}, { 0x000F, 6}, { 0x0004, 11}, { 0x000E, 6}, { 0x000D, 6}, { 0x000C, 6},
01456 { 0x0013, 7}, { 0x0012, 7}, { 0x0011, 7}, { 0x0010, 7}, { 0x001A, 8}, { 0x0019, 8},
01457 { 0x0018, 8}, { 0x0017, 8}, { 0x0016, 8}, { 0x0015, 8}, { 0x0014, 8}, { 0x0013, 8},
01458 { 0x0018, 9}, { 0x0017, 9}, { 0x0016, 9}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9},
01459 { 0x0012, 9}, { 0x0011, 9}, { 0x0007, 10}, { 0x0006, 10}, { 0x0005, 10}, { 0x0004, 10},
01460 { 0x0024, 11}, { 0x0025, 11}, { 0x0026, 11}, { 0x0027, 11}, { 0x0058, 12}, { 0x0059, 12},
01461 { 0x005A, 12}, { 0x005B, 12}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12},
01462 { 0x0003, 7}
01463 },
01464 {
01465 { 0x0000, 2}, { 0x0003, 3}, { 0x000D, 4}, { 0x0005, 4}, { 0x001C, 5}, { 0x0016, 5},
01466 { 0x003F, 6}, { 0x003A, 6}, { 0x002E, 6}, { 0x0022, 6}, { 0x007B, 7}, { 0x0067, 7},
01467 { 0x005F, 7}, { 0x0047, 7}, { 0x0026, 7}, { 0x00EF, 8}, { 0x00CD, 8}, { 0x00C1, 8},
01468 { 0x00A9, 8}, { 0x004F, 8}, { 0x01F2, 9}, { 0x01DD, 9}, { 0x0199, 9}, { 0x0185, 9},
01469 { 0x015D, 9}, { 0x011B, 9}, { 0x03EF, 10}, { 0x03E1, 10}, { 0x03C8, 10}, { 0x0331, 10},
01470 { 0x0303, 10}, { 0x02F1, 10}, { 0x02A0, 10}, { 0x0233, 10}, { 0x0126, 10}, { 0x07C0, 11},
01471 { 0x076F, 11}, { 0x076C, 11}, { 0x0661, 11}, { 0x0604, 11}, { 0x0572, 11}, { 0x0551, 11},
01472 { 0x046A, 11}, { 0x0274, 11}, { 0x0F27, 12}, { 0x0F24, 12}, { 0x0EDB, 12}, { 0x0C8E, 12},
01473 { 0x0C0B, 12}, { 0x0C0A, 12}, { 0x0AE3, 12}, { 0x08D6, 12}, { 0x0490, 12}, { 0x0495, 12},
01474 { 0x1F19, 13}, { 0x1DB5, 13}, { 0x0009, 4}, { 0x0010, 5}, { 0x0029, 6}, { 0x0062, 7},
01475 { 0x00F3, 8}, { 0x00AD, 8}, { 0x01E5, 9}, { 0x0179, 9}, { 0x009C, 9}, { 0x03B1, 10},
01476 { 0x02AE, 10}, { 0x0127, 10}, { 0x076E, 11}, { 0x0570, 11}, { 0x0275, 11}, { 0x0F25, 12},
01477 { 0x0EC0, 12}, { 0x0AA0, 12}, { 0x08D7, 12}, { 0x1E4C, 13}, { 0x0008, 5}, { 0x0063, 7},
01478 { 0x00AF, 8}, { 0x017B, 9}, { 0x03B3, 10}, { 0x07DD, 11}, { 0x0640, 11}, { 0x0F8D, 12},
01479 { 0x0BC1, 12}, { 0x0491, 12}, { 0x0028, 6}, { 0x00C3, 8}, { 0x0151, 9}, { 0x02A1, 10},
01480 { 0x0573, 11}, { 0x0EC3, 12}, { 0x1F35, 13}, { 0x0065, 7}, { 0x01DA, 9}, { 0x02AF, 10},
01481 { 0x0277, 11}, { 0x08C9, 12}, { 0x1781, 13}, { 0x0025, 7}, { 0x0118, 9}, { 0x0646, 11},
01482 { 0x0AA6, 12}, { 0x1780, 13}, { 0x00C9, 8}, { 0x0321, 10}, { 0x0F9B, 12}, { 0x191E, 13},
01483 { 0x0048, 8}, { 0x07CC, 11}, { 0x0AA1, 12}, { 0x0180, 9}, { 0x0465, 11}, { 0x1905, 13},
01484 { 0x03E2, 10}, { 0x0EC1, 12}, { 0x3C9B, 14}, { 0x02F4, 10}, { 0x08C8, 12}, { 0x07C1, 11},
01485 { 0x0928, 13}, { 0x05E1, 11}, { 0x320D, 14}, { 0x0EC2, 12}, { 0x6418, 15}, { 0x1F34, 13},
01486 { 0x0078, 7}, { 0x0155, 9}, { 0x0552, 11}, { 0x191F, 13}, { 0x00FA, 8}, { 0x07DC, 11},
01487 { 0x1907, 13}, { 0x00AC, 8}, { 0x0249, 11}, { 0x13B1, 14}, { 0x01F6, 9}, { 0x0AE2, 12},
01488 { 0x01DC, 9}, { 0x04ED, 12}, { 0x0184, 9}, { 0x1904, 13}, { 0x0156, 9}, { 0x09D9, 13},
01489 { 0x03E7, 10}, { 0x0929, 13}, { 0x03B2, 10}, { 0x3B68, 14}, { 0x02F5, 10}, { 0x13B0, 14},
01490 { 0x0322, 10}, { 0x3B69, 14}, { 0x0234, 10}, { 0x7935, 15}, { 0x07C7, 11}, { 0xC833, 16},
01491 { 0x0660, 11}, { 0x7934, 15}, { 0x024B, 11}, { 0xC832, 16}, { 0x0AA7, 12}, { 0x1F18, 13},
01492 { 0x007A, 7}
01493 },
01494 {
01495 { 0x0002, 2}, { 0x0000, 3}, { 0x001E, 5}, { 0x0004, 5}, { 0x0012, 6}, { 0x0070, 7},
01496 { 0x001A, 7}, { 0x005F, 8}, { 0x0047, 8}, { 0x01D3, 9}, { 0x00B5, 9}, { 0x0057, 9},
01497 { 0x03B5, 10}, { 0x016D, 10}, { 0x0162, 10}, { 0x07CE, 11}, { 0x0719, 11}, { 0x0691, 11},
01498 { 0x02C6, 11}, { 0x0156, 11}, { 0x0F92, 12}, { 0x0D2E, 12}, { 0x0D20, 12}, { 0x059E, 12},
01499 { 0x0468, 12}, { 0x02A6, 12}, { 0x1DA2, 13}, { 0x1C60, 13}, { 0x1A43, 13}, { 0x0B1D, 13},
01500 { 0x08C0, 13}, { 0x055D, 13}, { 0x0003, 3}, { 0x000A, 5}, { 0x0077, 7}, { 0x00E5, 8},
01501 { 0x01D9, 9}, { 0x03E5, 10}, { 0x0166, 10}, { 0x0694, 11}, { 0x0152, 11}, { 0x059F, 12},
01502 { 0x1F3C, 13}, { 0x1A4B, 13}, { 0x055E, 13}, { 0x000C, 4}, { 0x007D, 7}, { 0x0044, 8},
01503 { 0x03E0, 10}, { 0x0769, 11}, { 0x0E31, 12}, { 0x1F26, 13}, { 0x055C, 13}, { 0x001B, 5},
01504 { 0x00E2, 8}, { 0x03A5, 10}, { 0x02C9, 11}, { 0x1F23, 13}, { 0x3B47, 14}, { 0x0007, 5},
01505 { 0x01D8, 9}, { 0x02D8, 11}, { 0x1F27, 13}, { 0x3494, 14}, { 0x0035, 6}, { 0x03E1, 10},
01506 { 0x059C, 12}, { 0x38C3, 14}, { 0x000C, 6}, { 0x0165, 10}, { 0x1D23, 13}, { 0x1638, 14},
01507 { 0x0068, 7}, { 0x0693, 11}, { 0x3A45, 14}, { 0x0020, 7}, { 0x0F90, 12}, { 0x7CF6, 15},
01508 { 0x00E8, 8}, { 0x058F, 12}, { 0x2CEF, 15}, { 0x0045, 8}, { 0x0B3A, 13}, { 0x01F1, 9},
01509 { 0x3B46, 14}, { 0x01A7, 9}, { 0x1676, 14}, { 0x0056, 9}, { 0x692A, 15}, { 0x038D, 10},
01510 { 0xE309, 16}, { 0x00AA, 10}, { 0x1C611, 17}, { 0x02DF, 11}, { 0xB3B9, 17}, { 0x02C8, 11},
01511 { 0x38C20, 18}, { 0x01B0, 11}, { 0x16390, 18}, { 0x0F9F, 12}, { 0x16771, 18}, { 0x0ED0, 12},
01512 { 0x71843, 19}, { 0x0D2A, 12}, { 0xF9E8C, 20}, { 0x0461, 12}, { 0xF9E8E, 20}, { 0x0B67, 13},
01513 { 0x055F, 13}, { 0x003F, 6}, { 0x006D, 9}, { 0x0E90, 12}, { 0x054E, 13}, { 0x0013, 6},
01514 { 0x0119, 10}, { 0x0B66, 13}, { 0x000B, 6}, { 0x0235, 11}, { 0x7CF5, 15}, { 0x0075, 7},
01515 { 0x0D24, 12}, { 0xF9E9, 16}, { 0x002E, 7}, { 0x1F22, 13}, { 0x0021, 7}, { 0x054F, 13},
01516 { 0x0014, 7}, { 0x3A44, 14}, { 0x00E4, 8}, { 0x7CF7, 15}, { 0x005E, 8}, { 0x7185, 15},
01517 { 0x0037, 8}, { 0x2C73, 15}, { 0x01DB, 9}, { 0x59DD, 16}, { 0x01C7, 9}, { 0x692B, 15},
01518 { 0x01A6, 9}, { 0x58E5, 16}, { 0x00B4, 9}, { 0x1F3D0, 17}, { 0x00B0, 9}, { 0xB1C9, 17},
01519 { 0x03E6, 10}, { 0x16770, 18}, { 0x016E, 10}, { 0x3E7A2, 18}, { 0x011B, 10}, { 0xF9E8D, 20},
01520 { 0x00D9, 10}, { 0xF9E8F, 20}, { 0x00A8, 10}, { 0x2C723, 19}, { 0x0749, 11}, { 0xE3084, 20},
01521 { 0x0696, 11}, { 0x58E45, 20}, { 0x02DE, 11}, { 0xB1C88, 21}, { 0x0231, 11}, { 0x1C610A, 21},
01522 { 0x01B1, 11}, { 0x71842D, 23}, { 0x0D2B, 12}, { 0x38C217, 22}, { 0x0D2F, 12}, { 0x163913, 22},
01523 { 0x05B2, 12}, { 0x163912, 22}, { 0x0469, 12}, { 0x71842C, 23}, { 0x1A42, 13}, { 0x08C1, 13},
01524 { 0x0073, 7}
01525 }
01526 };
01527
01528 static const uint16_t vlc_offs[] = {
01529 0, 520, 552, 616, 1128, 1160, 1224, 1740, 1772, 1836, 1900, 2436,
01530 2986, 3050, 3610, 4154, 4218, 4746, 5326, 5390, 5902, 6554, 7658, 8342,
01531 9304, 9988, 10630, 11234, 12174, 13006, 13560, 14232, 14786, 15432, 16350, 17522,
01532 20372, 21818, 22330, 22394, 23166, 23678, 23742, 24820, 25332, 25396, 26460, 26980,
01533 27048, 27592, 27600, 27608, 27616, 27624, 28224, 28258, 28290, 28802, 28834, 28866,
01534 29378, 29412, 29444, 29960, 29994, 30026, 30538, 30572, 30604, 31120, 31154, 31186,
01535 31714, 31746, 31778, 32306, 32340, 32372
01536 };
01537
01543 int ff_vc1_init_common(VC1Context *v)
01544 {
01545 static int done = 0;
01546 int i = 0;
01547 static VLC_TYPE vlc_table[32372][2];
01548
01549 v->hrd_rate = v->hrd_buffer = NULL;
01550
01551
01552 if (!done) {
01553 INIT_VLC_STATIC(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
01554 ff_vc1_bfraction_bits, 1, 1,
01555 ff_vc1_bfraction_codes, 1, 1, 1 << VC1_BFRACTION_VLC_BITS);
01556 INIT_VLC_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
01557 ff_vc1_norm2_bits, 1, 1,
01558 ff_vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS);
01559 INIT_VLC_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
01560 ff_vc1_norm6_bits, 1, 1,
01561 ff_vc1_norm6_codes, 2, 2, 556);
01562 INIT_VLC_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
01563 ff_vc1_imode_bits, 1, 1,
01564 ff_vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS);
01565 for (i = 0; i < 3; i++) {
01566 ff_vc1_ttmb_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 0]];
01567 ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i * 3 + 1] - vlc_offs[i * 3 + 0];
01568 init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
01569 ff_vc1_ttmb_bits[i], 1, 1,
01570 ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
01571 ff_vc1_ttblk_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 1]];
01572 ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i * 3 + 2] - vlc_offs[i * 3 + 1];
01573 init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
01574 ff_vc1_ttblk_bits[i], 1, 1,
01575 ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
01576 ff_vc1_subblkpat_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 2]];
01577 ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i * 3 + 3] - vlc_offs[i * 3 + 2];
01578 init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
01579 ff_vc1_subblkpat_bits[i], 1, 1,
01580 ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
01581 }
01582 for (i = 0; i < 4; i++) {
01583 ff_vc1_4mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 9]];
01584 ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i * 3 + 10] - vlc_offs[i * 3 + 9];
01585 init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
01586 ff_vc1_4mv_block_pattern_bits[i], 1, 1,
01587 ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
01588 ff_vc1_cbpcy_p_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 10]];
01589 ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i * 3 + 11] - vlc_offs[i * 3 + 10];
01590 init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
01591 ff_vc1_cbpcy_p_bits[i], 1, 1,
01592 ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
01593 ff_vc1_mv_diff_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 11]];
01594 ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i * 3 + 12] - vlc_offs[i * 3 + 11];
01595 init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
01596 ff_vc1_mv_diff_bits[i], 1, 1,
01597 ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
01598 }
01599 for (i = 0; i < 8; i++) {
01600 ff_vc1_ac_coeff_table[i].table = &vlc_table[vlc_offs[i * 2 + 21]];
01601 ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i * 2 + 22] - vlc_offs[i * 2 + 21];
01602 init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, ff_vc1_ac_sizes[i],
01603 &vc1_ac_tables[i][0][1], 8, 4,
01604 &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC);
01605
01606 ff_vc1_2ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 2 + 22]];
01607 ff_vc1_2ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 2 + 23] - vlc_offs[i * 2 + 22];
01608 init_vlc(&ff_vc1_2ref_mvdata_vlc[i], VC1_2REF_MVDATA_VLC_BITS, 126,
01609 ff_vc1_2ref_mvdata_bits[i], 1, 1,
01610 ff_vc1_2ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
01611 }
01612 for (i = 0; i < 4; i++) {
01613
01614 ff_vc1_intfr_4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 37]];
01615 ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 38] - vlc_offs[i * 3 + 37];
01616 init_vlc(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15,
01617 ff_vc1_intfr_4mv_mbmode_bits[i], 1, 1,
01618 ff_vc1_intfr_4mv_mbmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
01619
01620 ff_vc1_intfr_non4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 38]];
01621 ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 39] - vlc_offs[i * 3 + 38];
01622 init_vlc(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9,
01623 ff_vc1_intfr_non4mv_mbmode_bits[i], 1, 1,
01624 ff_vc1_intfr_non4mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
01625
01626 ff_vc1_1ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 39]];
01627 ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 3 + 40] - vlc_offs[i * 3 + 39];
01628 init_vlc(&ff_vc1_1ref_mvdata_vlc[i], VC1_1REF_MVDATA_VLC_BITS, 72,
01629 ff_vc1_1ref_mvdata_bits[i], 1, 1,
01630 ff_vc1_1ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
01631 }
01632 for (i = 0; i < 4; i++) {
01633
01634 ff_vc1_2mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i + 49]];
01635 ff_vc1_2mv_block_pattern_vlc[i].table_allocated = vlc_offs[i + 50] - vlc_offs[i + 49];
01636 init_vlc(&ff_vc1_2mv_block_pattern_vlc[i], VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4,
01637 ff_vc1_2mv_block_pattern_bits[i], 1, 1,
01638 ff_vc1_2mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
01639 }
01640 for (i = 0; i < 8; i++) {
01641
01642 ff_vc1_icbpcy_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 53]];
01643 ff_vc1_icbpcy_vlc[i].table_allocated = vlc_offs[i * 3 + 54] - vlc_offs[i * 3 + 53];
01644 init_vlc(&ff_vc1_icbpcy_vlc[i], VC1_ICBPCY_VLC_BITS, 63,
01645 ff_vc1_icbpcy_p_bits[i], 1, 1,
01646 ff_vc1_icbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
01647
01648 ff_vc1_if_mmv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 54]];
01649 ff_vc1_if_mmv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 55] - vlc_offs[i * 3 + 54];
01650 init_vlc(&ff_vc1_if_mmv_mbmode_vlc[i], VC1_IF_MMV_MBMODE_VLC_BITS, 8,
01651 ff_vc1_if_mmv_mbmode_bits[i], 1, 1,
01652 ff_vc1_if_mmv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
01653 ff_vc1_if_1mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 55]];
01654 ff_vc1_if_1mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 56] - vlc_offs[i * 3 + 55];
01655 init_vlc(&ff_vc1_if_1mv_mbmode_vlc[i], VC1_IF_1MV_MBMODE_VLC_BITS, 6,
01656 ff_vc1_if_1mv_mbmode_bits[i], 1, 1,
01657 ff_vc1_if_1mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
01658 }
01659 done = 1;
01660 }
01661
01662
01663 v->pq = -1;
01664 v->mvrange = 0;
01665
01666 return 0;
01667 }