2 * VC-1 and WMV3 decoder common code
3 * Copyright (c) 2011 Mashiat Sarker Shakkhar
4 * Copyright (c) 2006-2007 Konstantin Shishkov
5 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
7 * This file is part of FFmpeg.
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * VC-1 and WMV3 decoder common code
30 #include "libavutil/attributes.h"
33 #include "mpegvideo.h"
36 #include "msmpeg4data.h"
38 #include "simple_idct.h"
43 /***********************************************************************/
45 * @name VC-1 Bitplane decoding
50 /** Decode rows by checking if they are skipped
51 * @param plane Buffer to store decoded bits
52 * @param[in] width Width of this buffer
53 * @param[in] height Height of this buffer
54 * @param[in] stride of this buffer
56 static void decode_rowskip(uint8_t* plane, int width, int height, int stride,
61 for (y = 0; y < height; y++) {
62 if (!get_bits1(gb)) //rowskip
63 memset(plane, 0, width);
65 for (x = 0; x < width; x++)
66 plane[x] = get_bits1(gb);
71 /** Decode columns by checking if they are skipped
72 * @param plane Buffer to store decoded bits
73 * @param[in] width Width of this buffer
74 * @param[in] height Height of this buffer
75 * @param[in] stride of this buffer
76 * @todo FIXME: Optimize
78 static void decode_colskip(uint8_t* plane, int width, int height, int stride,
83 for (x = 0; x < width; x++) {
84 if (!get_bits1(gb)) //colskip
85 for (y = 0; y < height; y++)
88 for (y = 0; y < height; y++)
89 plane[y*stride] = get_bits1(gb);
94 /** Decode a bitplane's bits
95 * @param data bitplane where to store the decode bits
96 * @param[out] raw_flag pointer to the flag indicating that this bitplane is not coded explicitly
97 * @param v VC-1 context for bit reading and logging
99 * @todo FIXME: Optimize
101 static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v)
103 GetBitContext *gb = &v->s.gb;
105 int imode, x, y, code, offset;
106 uint8_t invert, *planep = data;
107 int width, height, stride;
109 width = v->s.mb_width;
110 height = v->s.mb_height >> v->field_mode;
111 stride = v->s.mb_stride;
112 invert = get_bits1(gb);
113 imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1);
118 //Data is actually read in the MB layer (same for all tests == "raw")
119 *raw_flag = 1; //invert ignored
123 if ((height * width) & 1) {
124 *planep++ = get_bits1(gb);
126 if (offset == width) {
128 planep += stride - width;
133 // decode bitplane as one long line
134 for (; y < height * width; y += 2) {
135 code = get_vlc2(gb, ff_vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1);
136 *planep++ = code & 1;
138 if (offset == width) {
140 planep += stride - width;
142 *planep++ = code >> 1;
144 if (offset == width) {
146 planep += stride - width;
152 if (!(height % 3) && (width % 3)) { // use 2x3 decoding
153 for (y = 0; y < height; y += 3) {
154 for (x = width & 1; x < width; x += 2) {
155 code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
157 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
160 planep[x + 0] = (code >> 0) & 1;
161 planep[x + 1] = (code >> 1) & 1;
162 planep[x + 0 + stride] = (code >> 2) & 1;
163 planep[x + 1 + stride] = (code >> 3) & 1;
164 planep[x + 0 + stride * 2] = (code >> 4) & 1;
165 planep[x + 1 + stride * 2] = (code >> 5) & 1;
167 planep += stride * 3;
170 decode_colskip(data, 1, height, stride, &v->s.gb);
172 planep += (height & 1) * stride;
173 for (y = height & 1; y < height; y += 2) {
174 for (x = width % 3; x < width; x += 3) {
175 code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
177 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
180 planep[x + 0] = (code >> 0) & 1;
181 planep[x + 1] = (code >> 1) & 1;
182 planep[x + 2] = (code >> 2) & 1;
183 planep[x + 0 + stride] = (code >> 3) & 1;
184 planep[x + 1 + stride] = (code >> 4) & 1;
185 planep[x + 2 + stride] = (code >> 5) & 1;
187 planep += stride * 2;
191 decode_colskip(data, x, height, stride, &v->s.gb);
193 decode_rowskip(data + x, width - x, 1, stride, &v->s.gb);
197 decode_rowskip(data, width, height, stride, &v->s.gb);
200 decode_colskip(data, width, height, stride, &v->s.gb);
206 /* Applying diff operator */
207 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6) {
210 for (x = 1; x < width; x++)
211 planep[x] ^= planep[x-1];
212 for (y = 1; y < height; y++) {
214 planep[0] ^= planep[-stride];
215 for (x = 1; x < width; x++) {
216 if (planep[x-1] != planep[x-stride]) planep[x] ^= invert;
217 else planep[x] ^= planep[x-1];
222 for (x = 0; x < stride * height; x++)
223 planep[x] = !planep[x]; //FIXME stride
225 return (imode << 1) + invert;
228 /** @} */ //Bitplane group
230 /***********************************************************************/
231 /** VOP Dquant decoding
232 * @param v VC-1 Context
234 static int vop_dquant_decoding(VC1Context *v)
236 GetBitContext *gb = &v->s.gb;
240 if (v->dquant == 2) {
241 pqdiff = get_bits(gb, 3);
243 v->altpq = get_bits(gb, 5);
245 v->altpq = v->pq + pqdiff + 1;
247 v->dquantfrm = get_bits1(gb);
249 v->dqprofile = get_bits(gb, 2);
250 switch (v->dqprofile) {
251 case DQPROFILE_SINGLE_EDGE:
252 case DQPROFILE_DOUBLE_EDGES:
253 v->dqsbedge = get_bits(gb, 2);
255 case DQPROFILE_ALL_MBS:
256 v->dqbilevel = get_bits1(gb);
262 if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) {
263 pqdiff = get_bits(gb, 3);
265 v->altpq = get_bits(gb, 5);
267 v->altpq = v->pq + pqdiff + 1;
274 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb);
277 * Decode Simple/Main Profiles sequence header
278 * @see Figure 7-8, p16-17
279 * @param avctx Codec context
280 * @param gb GetBit context initialized from Codec context extra_data
283 int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
285 av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits_long(gb, 32));
286 v->profile = get_bits(gb, 2);
287 if (v->profile == PROFILE_COMPLEX) {
288 av_log(avctx, AV_LOG_WARNING, "WMV3 Complex Profile is not fully supported\n");
291 if (v->profile == PROFILE_ADVANCED) {
292 v->zz_8x4 = ff_vc1_adv_progressive_8x4_zz;
293 v->zz_4x8 = ff_vc1_adv_progressive_4x8_zz;
294 return decode_sequence_header_adv(v, gb);
296 v->zz_8x4 = ff_wmv2_scantableA;
297 v->zz_4x8 = ff_wmv2_scantableB;
298 v->res_y411 = get_bits1(gb);
299 v->res_sprite = get_bits1(gb);
301 av_log(avctx, AV_LOG_ERROR,
302 "Old interlaced mode is not supported\n");
308 v->frmrtq_postproc = get_bits(gb, 3); //common
309 // (bitrate-32kbps)/64kbps
310 v->bitrtq_postproc = get_bits(gb, 5); //common
311 v->s.loop_filter = get_bits1(gb); //common
312 if (v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE) {
313 av_log(avctx, AV_LOG_ERROR,
314 "LOOPFILTER shall not be enabled in Simple Profile\n");
316 if (v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
317 v->s.loop_filter = 0;
319 v->res_x8 = get_bits1(gb); //reserved
320 v->multires = get_bits1(gb);
321 v->res_fasttx = get_bits1(gb);
322 if (!v->res_fasttx) {
323 v->vc1dsp.vc1_inv_trans_8x8 = ff_simple_idct_8;
324 v->vc1dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
325 v->vc1dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
326 v->vc1dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
327 v->vc1dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add_8;
328 v->vc1dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
329 v->vc1dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
330 v->vc1dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
333 v->fastuvmc = get_bits1(gb); //common
334 if (!v->profile && !v->fastuvmc) {
335 av_log(avctx, AV_LOG_ERROR,
336 "FASTUVMC unavailable in Simple Profile\n");
339 v->extended_mv = get_bits1(gb); //common
340 if (!v->profile && v->extended_mv)
342 av_log(avctx, AV_LOG_ERROR,
343 "Extended MVs unavailable in Simple Profile\n");
346 v->dquant = get_bits(gb, 2); //common
347 v->vstransform = get_bits1(gb); //common
349 v->res_transtab = get_bits1(gb);
352 av_log(avctx, AV_LOG_ERROR,
353 "1 for reserved RES_TRANSTAB is forbidden\n");
357 v->overlap = get_bits1(gb); //common
359 v->resync_marker = get_bits1(gb);
360 v->rangered = get_bits1(gb);
361 if (v->rangered && v->profile == PROFILE_SIMPLE) {
362 av_log(avctx, AV_LOG_INFO,
363 "RANGERED should be set to 0 in Simple Profile\n");
366 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common
367 v->quantizer_mode = get_bits(gb, 2); //common
369 v->finterpflag = get_bits1(gb); //common
372 int w = get_bits(gb, 11);
373 int h = get_bits(gb, 11);
374 avcodec_set_dimensions(v->s.avctx, w, h);
375 skip_bits(gb, 5); //frame rate
376 v->res_x8 = get_bits1(gb);
377 if (get_bits1(gb)) { // something to do with DC VLC selection
378 av_log(avctx, AV_LOG_ERROR, "Unsupported sprite feature\n");
381 skip_bits(gb, 3); //slice code
384 v->res_rtm_flag = get_bits1(gb); //reserved
386 if (!v->res_rtm_flag) {
387 av_log(avctx, AV_LOG_ERROR,
388 "Old WMV3 version detected, some frames may be decoded incorrectly\n");
391 //TODO: figure out what they mean (always 0x402F)
394 av_log(avctx, AV_LOG_DEBUG,
395 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
396 "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
397 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
398 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
399 v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
400 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
401 v->rangered, v->vstransform, v->overlap, v->resync_marker,
402 v->dquant, v->quantizer_mode, avctx->max_b_frames);
406 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
409 v->level = get_bits(gb, 3);
411 av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
413 v->chromaformat = get_bits(gb, 2);
414 if (v->chromaformat != 1) {
415 av_log(v->s.avctx, AV_LOG_ERROR,
416 "Only 4:2:0 chroma format supported\n");
421 v->frmrtq_postproc = get_bits(gb, 3); //common
422 // (bitrate-32kbps)/64kbps
423 v->bitrtq_postproc = get_bits(gb, 5); //common
424 v->postprocflag = get_bits1(gb); //common
426 v->max_coded_width = (get_bits(gb, 12) + 1) << 1;
427 v->max_coded_height = (get_bits(gb, 12) + 1) << 1;
428 v->broadcast = get_bits1(gb);
429 v->interlace = get_bits1(gb);
430 v->tfcntrflag = get_bits1(gb);
431 v->finterpflag = get_bits1(gb);
432 skip_bits1(gb); // reserved
434 av_log(v->s.avctx, AV_LOG_DEBUG,
435 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
436 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
437 "TFCTRflag=%i, FINTERPflag=%i\n",
438 v->level, v->frmrtq_postproc, v->bitrtq_postproc,
439 v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
440 v->tfcntrflag, v->finterpflag);
442 v->psf = get_bits1(gb);
443 if (v->psf) { //PsF, 6.1.13
444 av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n");
447 v->s.max_b_frames = v->s.avctx->max_b_frames = 7;
448 if (get_bits1(gb)) { //Display Info - decoding is not affected by it
450 av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n");
451 w = get_bits(gb, 14) + 1;
452 h = get_bits(gb, 14) + 1;
453 av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h);
455 ar = get_bits(gb, 4);
457 v->s.avctx->sample_aspect_ratio = ff_vc1_pixel_aspect[ar];
458 } else if (ar == 15) {
459 w = get_bits(gb, 8) + 1;
460 h = get_bits(gb, 8) + 1;
461 v->s.avctx->sample_aspect_ratio = (AVRational){w, h};
463 av_reduce(&v->s.avctx->sample_aspect_ratio.num,
464 &v->s.avctx->sample_aspect_ratio.den,
465 v->s.avctx->height * w,
466 v->s.avctx->width * h,
469 av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect: %i:%i\n",
470 v->s.avctx->sample_aspect_ratio.num,
471 v->s.avctx->sample_aspect_ratio.den);
473 if (get_bits1(gb)) { //framerate stuff
475 v->s.avctx->time_base.num = 32;
476 v->s.avctx->time_base.den = get_bits(gb, 16) + 1;
479 nr = get_bits(gb, 8);
480 dr = get_bits(gb, 4);
481 if (nr > 0 && nr < 8 && dr > 0 && dr < 3) {
482 v->s.avctx->time_base.num = ff_vc1_fps_dr[dr - 1];
483 v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000;
486 if (v->broadcast) { // Pulldown may be present
487 v->s.avctx->time_base.den *= 2;
488 v->s.avctx->ticks_per_frame = 2;
493 v->s.avctx->color_primaries = get_bits(gb, 8);
494 v->s.avctx->color_trc = get_bits(gb, 8);
495 v->s.avctx->colorspace = get_bits(gb, 8);
496 v->s.avctx->color_range = AVCOL_RANGE_MPEG;
500 v->hrd_param_flag = get_bits1(gb);
501 if (v->hrd_param_flag) {
503 v->hrd_num_leaky_buckets = get_bits(gb, 5);
504 skip_bits(gb, 4); //bitrate exponent
505 skip_bits(gb, 4); //buffer size exponent
506 for (i = 0; i < v->hrd_num_leaky_buckets; i++) {
507 skip_bits(gb, 16); //hrd_rate[n]
508 skip_bits(gb, 16); //hrd_buffer[n]
514 int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
519 av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32));
520 v->broken_link = get_bits1(gb);
521 v->closed_entry = get_bits1(gb);
522 v->panscanflag = get_bits1(gb);
523 v->refdist_flag = get_bits1(gb);
524 v->s.loop_filter = get_bits1(gb);
525 if (v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
526 v->s.loop_filter = 0;
527 v->fastuvmc = get_bits1(gb);
528 v->extended_mv = get_bits1(gb);
529 v->dquant = get_bits(gb, 2);
530 v->vstransform = get_bits1(gb);
531 v->overlap = get_bits1(gb);
532 v->quantizer_mode = get_bits(gb, 2);
534 if (v->hrd_param_flag) {
535 for (i = 0; i < v->hrd_num_leaky_buckets; i++) {
536 skip_bits(gb, 8); //hrd_full[n]
541 w = (get_bits(gb, 12)+1)<<1;
542 h = (get_bits(gb, 12)+1)<<1;
544 w = v->max_coded_width;
545 h = v->max_coded_height;
547 avcodec_set_dimensions(avctx, w, h);
549 v->extended_dmv = get_bits1(gb);
550 if ((v->range_mapy_flag = get_bits1(gb))) {
551 av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n");
552 v->range_mapy = get_bits(gb, 3);
554 if ((v->range_mapuv_flag = get_bits1(gb))) {
555 av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n");
556 v->range_mapuv = get_bits(gb, 3);
559 av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
560 "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
561 "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
562 "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n",
563 v->broken_link, v->closed_entry, v->panscanflag, v->refdist_flag, v->s.loop_filter,
564 v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode);
569 /* fill lookup tables for intensity compensation */
570 #define INIT_LUT(lumscale, lumshift, luty, lutuv, chain) do { \
571 int scale, shift, i; \
574 shift = (255 - lumshift * 2) << 6; \
578 scale = lumscale + 32; \
580 shift = (lumshift - 64) << 6; \
582 shift = lumshift << 6; \
584 for (i = 0; i < 256; i++) { \
585 int iy = chain ? luty[i] : i; \
586 int iu = chain ? lutuv[i] : i; \
587 luty[i] = av_clip_uint8((scale * iy + shift + 32) >> 6); \
588 lutuv[i] = av_clip_uint8((scale * (iu - 128) + 128*64 + 32) >> 6);\
592 static void rotate_luts(VC1Context *v)
594 #define ROTATE(DEF, L, N, C, A) do { \
595 if (v->s.pict_type == AV_PICTURE_TYPE_BI || v->s.pict_type == AV_PICTURE_TYPE_B) { \
599 memcpy(&tmp, L , sizeof(tmp)); \
600 memcpy(L , N , sizeof(tmp)); \
601 memcpy(N , &tmp, sizeof(tmp)); \
606 ROTATE(int *tmp, &v->last_use_ic, &v->next_use_ic, v->curr_use_ic, &v->aux_use_ic);
607 ROTATE(uint8_t tmp[2][256], v->last_luty, v->next_luty, v->curr_luty, v->aux_luty);
608 ROTATE(uint8_t tmp[2][256], v->last_lutuv, v->next_lutuv, v->curr_lutuv, v->aux_lutuv);
610 INIT_LUT(32, 0, v->curr_luty[0], v->curr_lutuv[0], 0);
611 INIT_LUT(32, 0, v->curr_luty[1], v->curr_lutuv[1], 0);
615 int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
617 int pqindex, lowquant, status;
620 v->interpfrm = get_bits1(gb);
621 if (!v->s.avctx->codec)
623 if (v->s.avctx->codec_id == AV_CODEC_ID_MSS2)
626 v->multires = get_bits(gb, 2) == 1;
628 skip_bits(gb, 2); //framecnt unused
631 v->rangeredfrm = get_bits1(gb);
632 v->s.pict_type = get_bits1(gb);
633 if (v->s.avctx->max_b_frames) {
634 if (!v->s.pict_type) {
636 v->s.pict_type = AV_PICTURE_TYPE_I;
638 v->s.pict_type = AV_PICTURE_TYPE_B;
640 v->s.pict_type = AV_PICTURE_TYPE_P;
642 v->s.pict_type = v->s.pict_type ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
645 if (v->s.pict_type == AV_PICTURE_TYPE_B) {
646 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
647 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
648 if (v->bfraction == 0) {
649 v->s.pict_type = AV_PICTURE_TYPE_BI;
652 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
653 skip_bits(gb, 7); // skip buffer fullness
659 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
661 if (v->s.pict_type == AV_PICTURE_TYPE_P)
664 /* Quantizer stuff */
665 pqindex = get_bits(gb, 5);
668 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
669 v->pq = ff_vc1_pquant_table[0][pqindex];
671 v->pq = ff_vc1_pquant_table[1][pqindex];
674 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
675 v->pquantizer = pqindex < 9;
676 if (v->quantizer_mode == QUANT_NON_UNIFORM)
678 v->pqindex = pqindex;
680 v->halfpq = get_bits1(gb);
683 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
684 v->pquantizer = get_bits1(gb);
686 if (v->extended_mv == 1)
687 v->mvrange = get_unary(gb, 0, 3);
688 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
689 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
690 v->range_x = 1 << (v->k_x - 1);
691 v->range_y = 1 << (v->k_y - 1);
692 if (v->multires && v->s.pict_type != AV_PICTURE_TYPE_B)
693 v->respic = get_bits(gb, 2);
695 if (v->res_x8 && (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)) {
696 v->x8_type = get_bits1(gb);
699 av_dlog(v->s.avctx, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
700 (v->s.pict_type == AV_PICTURE_TYPE_P) ? 'P' : ((v->s.pict_type == AV_PICTURE_TYPE_I) ? 'I' : 'B'),
701 pqindex, v->pq, v->halfpq, v->rangeredfrm);
703 if (v->first_pic_header_flag)
706 switch (v->s.pict_type) {
707 case AV_PICTURE_TYPE_P:
708 if (v->pq < 5) v->tt_index = 0;
709 else if (v->pq < 13) v->tt_index = 1;
710 else v->tt_index = 2;
712 lowquant = (v->pq > 12) ? 0 : 1;
713 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)];
714 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
715 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)];
716 v->lumscale = get_bits(gb, 6);
717 v->lumshift = get_bits(gb, 6);
719 /* fill lookup tables for intensity compensation */
720 INIT_LUT(v->lumscale, v->lumshift, v->last_luty[0], v->last_lutuv[0], 1);
721 INIT_LUT(v->lumscale, v->lumshift, v->last_luty[1], v->last_lutuv[1], 1);
723 v->qs_last = v->s.quarter_sample;
724 if (v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
725 v->s.quarter_sample = 0;
726 else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
727 if (v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
728 v->s.quarter_sample = 0;
730 v->s.quarter_sample = 1;
732 v->s.quarter_sample = 1;
733 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));
735 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
736 v->mv_mode2 == MV_PMODE_MIXED_MV) ||
737 v->mv_mode == MV_PMODE_MIXED_MV) {
738 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
741 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
742 "Imode: %i, Invert: %i\n", status>>1, status&1);
744 v->mv_type_is_raw = 0;
745 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
747 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
750 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
751 "Imode: %i, Invert: %i\n", status>>1, status&1);
753 /* Hopefully this is correct for P frames */
754 v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
755 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
758 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
759 vop_dquant_decoding(v);
762 v->ttfrm = 0; //FIXME Is that so ?
763 if (v->vstransform) {
764 v->ttmbf = get_bits1(gb);
766 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
773 case AV_PICTURE_TYPE_B:
774 if (v->pq < 5) v->tt_index = 0;
775 else if (v->pq < 13) v->tt_index = 1;
776 else v->tt_index = 2;
778 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
779 v->qs_last = v->s.quarter_sample;
780 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
781 v->s.mspel = v->s.quarter_sample;
783 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
786 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
787 "Imode: %i, Invert: %i\n", status>>1, status&1);
788 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
791 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
792 "Imode: %i, Invert: %i\n", status>>1, status&1);
794 v->s.mv_table_index = get_bits(gb, 2);
795 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
798 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
799 vop_dquant_decoding(v);
803 if (v->vstransform) {
804 v->ttmbf = get_bits1(gb);
806 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
817 v->c_ac_table_index = decode012(gb);
818 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) {
819 v->y_ac_table_index = decode012(gb);
822 v->s.dc_table_index = get_bits1(gb);
825 if (v->s.pict_type == AV_PICTURE_TYPE_BI) {
826 v->s.pict_type = AV_PICTURE_TYPE_B;
832 int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
834 int pqindex, lowquant;
836 int mbmodetab, imvtab, icbptab, twomvbptab, fourmvbptab; /* useful only for debugging */
840 v->p_frame_skipped = 0;
841 if (v->second_field) {
842 if(v->fcm!=2 || v->field_mode!=1)
844 v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
846 v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
847 v->s.current_picture_ptr->f.pict_type = v->s.pict_type;
848 if (!v->pic_header_flag)
849 goto parse_common_info;
856 if (fcm == ILACE_FIELD)
862 if (!v->first_pic_header_flag && v->field_mode != field_mode)
863 return AVERROR_INVALIDDATA;
864 v->field_mode = field_mode;
867 av_assert0( v->s.mb_height == v->s.height + 15 >> 4
868 || v->s.mb_height == FFALIGN(v->s.height + 15 >> 4, 2));
870 v->s.mb_height = FFALIGN(v->s.height + 15 >> 4, 2);
871 v->fptype = get_bits(gb, 3);
872 v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
873 if (v->fptype & 4) // B-picture
874 v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
877 v->s.mb_height = v->s.height + 15 >> 4;
878 switch (get_unary(gb, 0, 4)) {
880 v->s.pict_type = AV_PICTURE_TYPE_P;
883 v->s.pict_type = AV_PICTURE_TYPE_B;
886 v->s.pict_type = AV_PICTURE_TYPE_I;
889 v->s.pict_type = AV_PICTURE_TYPE_BI;
892 v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
893 v->p_frame_skipped = 1;
900 if (!v->interlace || v->psf) {
901 v->rptfrm = get_bits(gb, 2);
903 v->tff = get_bits1(gb);
904 v->rff = get_bits1(gb);
909 if (v->panscanflag) {
910 avpriv_report_missing_feature(v->s.avctx, "Pan-scan");
913 if (v->p_frame_skipped) {
916 v->rnd = get_bits1(gb);
918 v->uvsamp = get_bits1(gb);
919 if(!ff_vc1_bfraction_vlc.table)
920 return 0; //parsing only, vlc tables havnt been allocated
922 if (!v->refdist_flag)
924 else if ((v->s.pict_type != AV_PICTURE_TYPE_B) && (v->s.pict_type != AV_PICTURE_TYPE_BI)) {
925 v->refdist = get_bits(gb, 2);
927 v->refdist += get_unary(gb, 0, 16);
929 if ((v->s.pict_type == AV_PICTURE_TYPE_B) || (v->s.pict_type == AV_PICTURE_TYPE_BI)) {
930 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
931 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
932 v->frfd = (v->bfraction * v->refdist) >> 8;
933 v->brfd = v->refdist - v->frfd - 1;
937 goto parse_common_info;
939 if (v->fcm == PROGRESSIVE) {
941 v->interpfrm = get_bits1(gb);
942 if (v->s.pict_type == AV_PICTURE_TYPE_B) {
943 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
944 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
945 if (v->bfraction == 0) {
946 v->s.pict_type = AV_PICTURE_TYPE_BI; /* XXX: should not happen here */
953 v->cur_field_type = !(v->tff ^ v->second_field);
954 pqindex = get_bits(gb, 5);
957 v->pqindex = pqindex;
958 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
959 v->pq = ff_vc1_pquant_table[0][pqindex];
961 v->pq = ff_vc1_pquant_table[1][pqindex];
964 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
965 v->pquantizer = pqindex < 9;
966 if (v->quantizer_mode == QUANT_NON_UNIFORM)
968 v->pqindex = pqindex;
970 v->halfpq = get_bits1(gb);
973 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
974 v->pquantizer = get_bits1(gb);
976 v->postproc = get_bits(gb, 2);
981 if (v->first_pic_header_flag)
984 switch (v->s.pict_type) {
985 case AV_PICTURE_TYPE_I:
986 case AV_PICTURE_TYPE_BI:
987 if (v->fcm == ILACE_FRAME) { //interlace frame picture
988 status = bitplane_decoding(v->fieldtx_plane, &v->fieldtx_is_raw, v);
991 av_log(v->s.avctx, AV_LOG_DEBUG, "FIELDTX plane encoding: "
992 "Imode: %i, Invert: %i\n", status>>1, status&1);
994 status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
997 av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
998 "Imode: %i, Invert: %i\n", status>>1, status&1);
999 v->condover = CONDOVER_NONE;
1000 if (v->overlap && v->pq <= 8) {
1001 v->condover = decode012(gb);
1002 if (v->condover == CONDOVER_SELECT) {
1003 status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v);
1006 av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: "
1007 "Imode: %i, Invert: %i\n", status>>1, status&1);
1011 case AV_PICTURE_TYPE_P:
1012 if (v->field_mode) {
1013 v->numref = get_bits1(gb);
1015 v->reffield = get_bits1(gb);
1016 v->ref_field_type[0] = v->reffield ^ !v->cur_field_type;
1022 v->mvrange = get_unary(gb, 0, 3);
1026 if (v->extended_dmv)
1027 v->dmvrange = get_unary(gb, 0, 3);
1030 if (v->fcm == ILACE_FRAME) { // interlaced frame picture
1031 v->fourmvswitch = get_bits1(gb);
1032 v->intcomp = get_bits1(gb);
1034 v->lumscale = get_bits(gb, 6);
1035 v->lumshift = get_bits(gb, 6);
1036 INIT_LUT(v->lumscale, v->lumshift, v->last_luty[0], v->last_lutuv[0], 1);
1037 INIT_LUT(v->lumscale, v->lumshift, v->last_luty[1], v->last_lutuv[1], 1);
1040 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1041 av_log(v->s.avctx, AV_LOG_DEBUG, "SKIPMB plane encoding: "
1042 "Imode: %i, Invert: %i\n", status>>1, status&1);
1043 mbmodetab = get_bits(gb, 2);
1044 if (v->fourmvswitch)
1045 v->mbmode_vlc = &ff_vc1_intfr_4mv_mbmode_vlc[mbmodetab];
1047 v->mbmode_vlc = &ff_vc1_intfr_non4mv_mbmode_vlc[mbmodetab];
1048 imvtab = get_bits(gb, 2);
1049 v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[imvtab];
1050 // interlaced p-picture cbpcy range is [1, 63]
1051 icbptab = get_bits(gb, 3);
1052 v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
1053 twomvbptab = get_bits(gb, 2);
1054 v->twomvbp_vlc = &ff_vc1_2mv_block_pattern_vlc[twomvbptab];
1055 if (v->fourmvswitch) {
1056 fourmvbptab = get_bits(gb, 2);
1057 v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
1061 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1062 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1063 v->range_x = 1 << (v->k_x - 1);
1064 v->range_y = 1 << (v->k_y - 1);
1068 else if (v->pq < 13)
1072 if (v->fcm != ILACE_FRAME) {
1074 mvmode = get_unary(gb, 1, 4);
1075 lowquant = (v->pq > 12) ? 0 : 1;
1076 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][mvmode];
1077 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1079 mvmode2 = get_unary(gb, 1, 3);
1080 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][mvmode2];
1081 if (v->field_mode) {
1082 v->intcompfield = decode210(gb) ^ 3;
1084 v->intcompfield = 3;
1086 v->lumscale2 = v->lumscale = 32;
1087 v->lumshift2 = v->lumshift = 0;
1088 if (v->intcompfield & 1) {
1089 v->lumscale = get_bits(gb, 6);
1090 v->lumshift = get_bits(gb, 6);
1092 if ((v->intcompfield & 2) && v->field_mode) {
1093 v->lumscale2 = get_bits(gb, 6);
1094 v->lumshift2 = get_bits(gb, 6);
1095 } else if(!v->field_mode) {
1096 v->lumscale2 = v->lumscale;
1097 v->lumshift2 = v->lumshift;
1099 if (v->field_mode && v->second_field) {
1100 if (v->cur_field_type) {
1101 INIT_LUT(v->lumscale , v->lumshift , v->curr_luty[v->cur_field_type^1], v->curr_lutuv[v->cur_field_type^1], 0);
1102 INIT_LUT(v->lumscale2, v->lumshift2, v->last_luty[v->cur_field_type ], v->last_lutuv[v->cur_field_type ], 1);
1104 INIT_LUT(v->lumscale2, v->lumshift2, v->curr_luty[v->cur_field_type^1], v->curr_lutuv[v->cur_field_type^1], 0);
1105 INIT_LUT(v->lumscale , v->lumshift , v->last_luty[v->cur_field_type ], v->last_lutuv[v->cur_field_type ], 1);
1107 v->next_use_ic = *v->curr_use_ic = 1;
1109 INIT_LUT(v->lumscale , v->lumshift , v->last_luty[0], v->last_lutuv[0], 1);
1110 INIT_LUT(v->lumscale2, v->lumshift2, v->last_luty[1], v->last_lutuv[1], 1);
1114 v->qs_last = v->s.quarter_sample;
1115 if (v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
1116 v->s.quarter_sample = 0;
1117 else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1118 if (v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
1119 v->s.quarter_sample = 0;
1121 v->s.quarter_sample = 1;
1123 v->s.quarter_sample = 1;
1124 v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN
1125 || (v->mv_mode == MV_PMODE_INTENSITY_COMP
1126 && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
1128 if (v->fcm == PROGRESSIVE) { // progressive
1129 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1130 v->mv_mode2 == MV_PMODE_MIXED_MV)
1131 || v->mv_mode == MV_PMODE_MIXED_MV) {
1132 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
1135 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
1136 "Imode: %i, Invert: %i\n", status>>1, status&1);
1138 v->mv_type_is_raw = 0;
1139 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
1141 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1144 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1145 "Imode: %i, Invert: %i\n", status>>1, status&1);
1147 /* Hopefully this is correct for P frames */
1148 v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
1149 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1150 } else if (v->fcm == ILACE_FRAME) { // frame interlaced
1151 v->qs_last = v->s.quarter_sample;
1152 v->s.quarter_sample = 1;
1154 } else { // field interlaced
1155 mbmodetab = get_bits(gb, 3);
1156 imvtab = get_bits(gb, 2 + v->numref);
1158 v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[imvtab];
1160 v->imv_vlc = &ff_vc1_2ref_mvdata_vlc[imvtab];
1161 icbptab = get_bits(gb, 3);
1162 v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
1163 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1164 v->mv_mode2 == MV_PMODE_MIXED_MV) || v->mv_mode == MV_PMODE_MIXED_MV) {
1165 fourmvbptab = get_bits(gb, 2);
1166 v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
1167 v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[mbmodetab];
1169 v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[mbmodetab];
1173 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1174 vop_dquant_decoding(v);
1177 v->ttfrm = 0; //FIXME Is that so ?
1178 if (v->vstransform) {
1179 v->ttmbf = get_bits1(gb);
1181 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1188 case AV_PICTURE_TYPE_B:
1189 if (v->fcm == ILACE_FRAME) {
1190 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
1191 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
1192 if (v->bfraction == 0) {
1197 v->mvrange = get_unary(gb, 0, 3);
1200 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1201 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1202 v->range_x = 1 << (v->k_x - 1);
1203 v->range_y = 1 << (v->k_y - 1);
1207 else if (v->pq < 13)
1212 if (v->field_mode) {
1214 av_log(v->s.avctx, AV_LOG_DEBUG, "B Fields\n");
1215 if (v->extended_dmv)
1216 v->dmvrange = get_unary(gb, 0, 3);
1217 mvmode = get_unary(gb, 1, 3);
1218 lowquant = (v->pq > 12) ? 0 : 1;
1219 v->mv_mode = ff_vc1_mv_pmode_table2[lowquant][mvmode];
1220 v->qs_last = v->s.quarter_sample;
1221 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV || v->mv_mode == MV_PMODE_MIXED_MV);
1222 v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || v->mv_mode == MV_PMODE_1MV_HPEL);
1223 status = bitplane_decoding(v->forward_mb_plane, &v->fmb_is_raw, v);
1226 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Forward Type plane encoding: "
1227 "Imode: %i, Invert: %i\n", status>>1, status&1);
1228 mbmodetab = get_bits(gb, 3);
1229 if (v->mv_mode == MV_PMODE_MIXED_MV)
1230 v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[mbmodetab];
1232 v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[mbmodetab];
1233 imvtab = get_bits(gb, 3);
1234 v->imv_vlc = &ff_vc1_2ref_mvdata_vlc[imvtab];
1235 icbptab = get_bits(gb, 3);
1236 v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
1237 if (v->mv_mode == MV_PMODE_MIXED_MV) {
1238 fourmvbptab = get_bits(gb, 2);
1239 v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
1241 v->numref = 1; // interlaced field B pictures are always 2-ref
1242 } else if (v->fcm == ILACE_FRAME) {
1243 if (v->extended_dmv)
1244 v->dmvrange = get_unary(gb, 0, 3);
1245 if (get_bits1(gb)) /* intcomp - present but shall always be 0 */
1246 av_log(v->s.avctx, AV_LOG_WARNING, "Intensity compensation set for B picture\n");
1248 v->mv_mode = MV_PMODE_1MV;
1249 v->fourmvswitch = 0;
1250 v->qs_last = v->s.quarter_sample;
1251 v->s.quarter_sample = 1;
1253 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1256 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1257 "Imode: %i, Invert: %i\n", status>>1, status&1);
1258 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1261 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1262 "Imode: %i, Invert: %i\n", status>>1, status&1);
1263 mbmodetab = get_bits(gb, 2);
1264 v->mbmode_vlc = &ff_vc1_intfr_non4mv_mbmode_vlc[mbmodetab];
1265 imvtab = get_bits(gb, 2);
1266 v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[imvtab];
1267 // interlaced p/b-picture cbpcy range is [1, 63]
1268 icbptab = get_bits(gb, 3);
1269 v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
1270 twomvbptab = get_bits(gb, 2);
1271 v->twomvbp_vlc = &ff_vc1_2mv_block_pattern_vlc[twomvbptab];
1272 fourmvbptab = get_bits(gb, 2);
1273 v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
1275 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
1276 v->qs_last = v->s.quarter_sample;
1277 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
1278 v->s.mspel = v->s.quarter_sample;
1279 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1282 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1283 "Imode: %i, Invert: %i\n", status>>1, status&1);
1284 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1287 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1288 "Imode: %i, Invert: %i\n", status>>1, status&1);
1289 v->s.mv_table_index = get_bits(gb, 2);
1290 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1294 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1295 vop_dquant_decoding(v);
1299 if (v->vstransform) {
1300 v->ttmbf = get_bits1(gb);
1302 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1311 if (v->fcm != PROGRESSIVE && !v->s.quarter_sample) {
1317 v->c_ac_table_index = decode012(gb);
1318 if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) {
1319 v->y_ac_table_index = decode012(gb);
1322 v->s.dc_table_index = get_bits1(gb);
1323 if ((v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
1325 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1326 vop_dquant_decoding(v);
1330 if (v->s.pict_type == AV_PICTURE_TYPE_BI) {
1331 v->s.pict_type = AV_PICTURE_TYPE_B;
1337 static const uint32_t vc1_ac_tables[AC_MODES][186][2] = {
1339 { 0x0001, 2}, { 0x0005, 3}, { 0x000D, 4}, { 0x0012, 5}, { 0x000E, 6}, { 0x0015, 7},
1340 { 0x0013, 8}, { 0x003F, 8}, { 0x004B, 9}, { 0x011F, 9}, { 0x00B8, 10}, { 0x03E3, 10},
1341 { 0x0172, 11}, { 0x024D, 12}, { 0x03DA, 12}, { 0x02DD, 13}, { 0x1F55, 13}, { 0x05B9, 14},
1342 { 0x3EAE, 14}, { 0x0000, 4}, { 0x0010, 5}, { 0x0008, 7}, { 0x0020, 8}, { 0x0029, 9},
1343 { 0x01F4, 9}, { 0x0233, 10}, { 0x01E0, 11}, { 0x012A, 12}, { 0x03DD, 12}, { 0x050A, 13},
1344 { 0x1F29, 13}, { 0x0A42, 14}, { 0x1272, 15}, { 0x1737, 15}, { 0x0003, 5}, { 0x0011, 7},
1345 { 0x00C4, 8}, { 0x004B, 10}, { 0x00B4, 11}, { 0x07D4, 11}, { 0x0345, 12}, { 0x02D7, 13},
1346 { 0x07BF, 13}, { 0x0938, 14}, { 0x0BBB, 14}, { 0x095E, 15}, { 0x0013, 5}, { 0x0078, 7},
1347 { 0x0069, 9}, { 0x0232, 10}, { 0x0461, 11}, { 0x03EC, 12}, { 0x0520, 13}, { 0x1F2A, 13},
1348 { 0x3E50, 14}, { 0x3E51, 14}, { 0x1486, 15}, { 0x000C, 6}, { 0x0024, 9}, { 0x0094, 11},
1349 { 0x08C0, 12}, { 0x0F09, 14}, { 0x1EF0, 15}, { 0x003D, 6}, { 0x0053, 9}, { 0x01A0, 11},
1350 { 0x02D6, 13}, { 0x0F08, 14}, { 0x0013, 7}, { 0x007C, 9}, { 0x07C1, 11}, { 0x04AC, 14},
1351 { 0x001B, 7}, { 0x00A0, 10}, { 0x0344, 12}, { 0x0F79, 14}, { 0x0079, 7}, { 0x03E1, 10},
1352 { 0x02D4, 13}, { 0x2306, 14}, { 0x0021, 8}, { 0x023C, 10}, { 0x0FAE, 12}, { 0x23DE, 14},
1353 { 0x0035, 8}, { 0x0175, 11}, { 0x07B3, 13}, { 0x00C5, 8}, { 0x0174, 11}, { 0x0785, 13},
1354 { 0x0048, 9}, { 0x01A3, 11}, { 0x049E, 13}, { 0x002C, 9}, { 0x00FA, 10}, { 0x07D6, 11},
1355 { 0x0092, 10}, { 0x05CC, 13}, { 0x1EF1, 15}, { 0x00A3, 10}, { 0x03ED, 12}, { 0x093E, 14},
1356 { 0x01E2, 11}, { 0x1273, 15}, { 0x07C4, 11}, { 0x1487, 15}, { 0x0291, 12}, { 0x0293, 12},
1357 { 0x0F8A, 12}, { 0x0509, 13}, { 0x0508, 13}, { 0x078D, 13}, { 0x07BE, 13}, { 0x078C, 13},
1358 { 0x04AE, 14}, { 0x0BBA, 14}, { 0x2307, 14}, { 0x0B9A, 14}, { 0x1736, 15}, { 0x000E, 4},
1359 { 0x0045, 7}, { 0x01F3, 9}, { 0x047A, 11}, { 0x05DC, 13}, { 0x23DF, 14}, { 0x0019, 5},
1360 { 0x0028, 9}, { 0x0176, 11}, { 0x049D, 13}, { 0x23DD, 14}, { 0x0030, 6}, { 0x00A2, 10},
1361 { 0x02EF, 12}, { 0x05B8, 14}, { 0x003F, 6}, { 0x00A5, 10}, { 0x03DB, 12}, { 0x093F, 14},
1362 { 0x0044, 7}, { 0x07CB, 11}, { 0x095F, 15}, { 0x0063, 7}, { 0x03C3, 12}, { 0x0015, 8},
1363 { 0x08F6, 12}, { 0x0017, 8}, { 0x0498, 13}, { 0x002C, 8}, { 0x07B2, 13}, { 0x002F, 8},
1364 { 0x1F54, 13}, { 0x008D, 8}, { 0x07BD, 13}, { 0x008E, 8}, { 0x1182, 13}, { 0x00FB, 8},
1365 { 0x050B, 13}, { 0x002D, 8}, { 0x07C0, 11}, { 0x0079, 9}, { 0x1F5F, 13}, { 0x007A, 9},
1366 { 0x1F56, 13}, { 0x0231, 10}, { 0x03E4, 10}, { 0x01A1, 11}, { 0x0143, 11}, { 0x01F7, 11},
1367 { 0x016F, 12}, { 0x0292, 12}, { 0x02E7, 12}, { 0x016C, 12}, { 0x016D, 12}, { 0x03DC, 12},
1368 { 0x0F8B, 12}, { 0x0499, 13}, { 0x03D8, 12}, { 0x078E, 13}, { 0x02D5, 13}, { 0x1F5E, 13},
1369 { 0x1F2B, 13}, { 0x078F, 13}, { 0x04AD, 14}, { 0x3EAF, 14}, { 0x23DC, 14}, { 0x004A, 9}
1372 { 0x0000, 3}, { 0x0003, 4}, { 0x000B, 5}, { 0x0014, 6}, { 0x003F, 6}, { 0x005D, 7},
1373 { 0x00A2, 8}, { 0x00AC, 9}, { 0x016E, 9}, { 0x020A, 10}, { 0x02E2, 10}, { 0x0432, 11},
1374 { 0x05C9, 11}, { 0x0827, 12}, { 0x0B54, 12}, { 0x04E6, 13}, { 0x105F, 13}, { 0x172A, 13},
1375 { 0x20B2, 14}, { 0x2D4E, 14}, { 0x39F0, 14}, { 0x4175, 15}, { 0x5A9E, 15}, { 0x0004, 4},
1376 { 0x001E, 5}, { 0x0042, 7}, { 0x00B6, 8}, { 0x0173, 9}, { 0x0395, 10}, { 0x072E, 11},
1377 { 0x0B94, 12}, { 0x16A4, 13}, { 0x20B3, 14}, { 0x2E45, 14}, { 0x0005, 5}, { 0x0040, 7},
1378 { 0x0049, 9}, { 0x028F, 10}, { 0x05CB, 11}, { 0x048A, 13}, { 0x09DD, 14}, { 0x73E2, 15},
1379 { 0x0018, 5}, { 0x0025, 8}, { 0x008A, 10}, { 0x051B, 11}, { 0x0E5F, 12}, { 0x09C9, 14},
1380 { 0x139C, 15}, { 0x0029, 6}, { 0x004F, 9}, { 0x0412, 11}, { 0x048D, 13}, { 0x2E41, 14},
1381 { 0x0038, 6}, { 0x010E, 9}, { 0x05A8, 11}, { 0x105C, 13}, { 0x39F2, 14}, { 0x0058, 7},
1382 { 0x021F, 10}, { 0x0E7E, 12}, { 0x39FF, 14}, { 0x0023, 8}, { 0x02E3, 10}, { 0x04E5, 13},
1383 { 0x2E40, 14}, { 0x00A1, 8}, { 0x05BE, 11}, { 0x09C8, 14}, { 0x0083, 8}, { 0x013A, 11},
1384 { 0x1721, 13}, { 0x0044, 9}, { 0x0276, 12}, { 0x39F6, 14}, { 0x008B, 10}, { 0x04EF, 13},
1385 { 0x5A9B, 15}, { 0x0208, 10}, { 0x1CFE, 13}, { 0x0399, 10}, { 0x1CB4, 13}, { 0x039E, 10},
1386 { 0x39F3, 14}, { 0x05AB, 11}, { 0x73E3, 15}, { 0x0737, 11}, { 0x5A9F, 15}, { 0x082D, 12},
1387 { 0x0E69, 12}, { 0x0E68, 12}, { 0x0433, 11}, { 0x0B7B, 12}, { 0x2DF8, 14}, { 0x2E56, 14},
1388 { 0x2E57, 14}, { 0x39F7, 14}, { 0x51A5, 15}, { 0x0003, 3}, { 0x002A, 6}, { 0x00E4, 8},
1389 { 0x028E, 10}, { 0x0735, 11}, { 0x1058, 13}, { 0x1CFA, 13}, { 0x2DF9, 14}, { 0x4174, 15},
1390 { 0x0009, 4}, { 0x0054, 8}, { 0x0398, 10}, { 0x048B, 13}, { 0x139D, 15}, { 0x000D, 4},
1391 { 0x00AD, 9}, { 0x0826, 12}, { 0x2D4C, 14}, { 0x0011, 5}, { 0x016B, 9}, { 0x0B7F, 12},
1392 { 0x51A4, 15}, { 0x0019, 5}, { 0x021B, 10}, { 0x16FD, 13}, { 0x001D, 5}, { 0x0394, 10},
1393 { 0x28D3, 14}, { 0x002B, 6}, { 0x05BC, 11}, { 0x5A9A, 15}, { 0x002F, 6}, { 0x0247, 12},
1394 { 0x0010, 7}, { 0x0A35, 12}, { 0x003E, 6}, { 0x0B7A, 12}, { 0x0059, 7}, { 0x105E, 13},
1395 { 0x0026, 8}, { 0x09CF, 14}, { 0x0055, 8}, { 0x1CB5, 13}, { 0x0057, 8}, { 0x0E5B, 12},
1396 { 0x00A0, 8}, { 0x1468, 13}, { 0x0170, 9}, { 0x0090, 10}, { 0x01CE, 9}, { 0x021A, 10},
1397 { 0x0218, 10}, { 0x0168, 9}, { 0x021E, 10}, { 0x0244, 12}, { 0x0736, 11}, { 0x0138, 11},
1398 { 0x0519, 11}, { 0x0E5E, 12}, { 0x072C, 11}, { 0x0B55, 12}, { 0x09DC, 14}, { 0x20BB, 14},
1399 { 0x048C, 13}, { 0x1723, 13}, { 0x2E44, 14}, { 0x16A5, 13}, { 0x0518, 11}, { 0x39FE, 14},
1403 { 0x0001, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x0016, 5}, { 0x0020, 6}, { 0x0018, 7},
1404 { 0x0008, 8}, { 0x009A, 8}, { 0x0056, 9}, { 0x013E, 9}, { 0x00F0, 10}, { 0x03A5, 10},
1405 { 0x0077, 11}, { 0x01EF, 11}, { 0x009A, 12}, { 0x005D, 13}, { 0x0001, 4}, { 0x0011, 5},
1406 { 0x0002, 7}, { 0x000B, 8}, { 0x0012, 9}, { 0x01D6, 9}, { 0x027E, 10}, { 0x0191, 11},
1407 { 0x00EA, 12}, { 0x03DC, 12}, { 0x013B, 13}, { 0x0004, 5}, { 0x0014, 7}, { 0x009E, 8},
1408 { 0x0009, 10}, { 0x01AC, 11}, { 0x01E2, 11}, { 0x03CA, 12}, { 0x005F, 13}, { 0x0017, 5},
1409 { 0x004E, 7}, { 0x005E, 9}, { 0x00F3, 10}, { 0x01AD, 11}, { 0x00EC, 12}, { 0x05F0, 13},
1410 { 0x000E, 6}, { 0x00E1, 8}, { 0x03A4, 10}, { 0x009C, 12}, { 0x013D, 13}, { 0x003B, 6},
1411 { 0x001C, 9}, { 0x0014, 11}, { 0x09BE, 12}, { 0x0006, 7}, { 0x007A, 9}, { 0x0190, 11},
1412 { 0x0137, 13}, { 0x001B, 7}, { 0x0008, 10}, { 0x075C, 11}, { 0x0071, 7}, { 0x00D7, 10},
1413 { 0x09BF, 12}, { 0x0007, 8}, { 0x00AF, 10}, { 0x04CC, 11}, { 0x0034, 8}, { 0x0265, 10},
1414 { 0x009F, 12}, { 0x00E0, 8}, { 0x0016, 11}, { 0x0327, 12}, { 0x0015, 9}, { 0x017D, 11},
1415 { 0x0EBB, 12}, { 0x0014, 9}, { 0x00F6, 10}, { 0x01E4, 11}, { 0x00CB, 10}, { 0x099D, 12},
1416 { 0x00CA, 10}, { 0x02FC, 12}, { 0x017F, 11}, { 0x04CD, 11}, { 0x02FD, 12}, { 0x04FE, 11},
1417 { 0x013A, 13}, { 0x000A, 4}, { 0x0042, 7}, { 0x01D3, 9}, { 0x04DD, 11}, { 0x0012, 5},
1418 { 0x00E8, 8}, { 0x004C, 11}, { 0x0136, 13}, { 0x0039, 6}, { 0x0264, 10}, { 0x0EBA, 12},
1419 { 0x0000, 7}, { 0x00AE, 10}, { 0x099C, 12}, { 0x001F, 7}, { 0x04DE, 11}, { 0x0043, 7},
1420 { 0x04DC, 11}, { 0x0003, 8}, { 0x03CB, 12}, { 0x0006, 8}, { 0x099E, 12}, { 0x002A, 8},
1421 { 0x05F1, 13}, { 0x000F, 8}, { 0x09FE, 12}, { 0x0033, 8}, { 0x09FF, 12}, { 0x0098, 8},
1422 { 0x099F, 12}, { 0x00EA, 8}, { 0x013C, 13}, { 0x002E, 8}, { 0x0192, 11}, { 0x0136, 9},
1423 { 0x006A, 9}, { 0x0015, 11}, { 0x03AF, 10}, { 0x01E3, 11}, { 0x0074, 11}, { 0x00EB, 12},
1424 { 0x02F9, 12}, { 0x005C, 13}, { 0x00ED, 12}, { 0x03DD, 12}, { 0x0326, 12}, { 0x005E, 13},
1428 { 0x0004, 3}, { 0x0014, 5}, { 0x0017, 7}, { 0x007F, 8}, { 0x0154, 9}, { 0x01F2, 10},
1429 { 0x00BF, 11}, { 0x0065, 12}, { 0x0AAA, 12}, { 0x0630, 13}, { 0x1597, 13}, { 0x03B7, 14},
1430 { 0x2B22, 14}, { 0x0BE6, 15}, { 0x000B, 4}, { 0x0037, 7}, { 0x0062, 9}, { 0x0007, 11},
1431 { 0x0166, 12}, { 0x00CE, 13}, { 0x1590, 13}, { 0x05F6, 14}, { 0x0BE7, 15}, { 0x0007, 5},
1432 { 0x006D, 8}, { 0x0003, 11}, { 0x031F, 12}, { 0x05F2, 14}, { 0x0002, 6}, { 0x0061, 9},
1433 { 0x0055, 12}, { 0x01DF, 14}, { 0x001A, 6}, { 0x001E, 10}, { 0x0AC9, 12}, { 0x2B23, 14},
1434 { 0x001E, 6}, { 0x001F, 10}, { 0x0AC3, 12}, { 0x2B2B, 14}, { 0x0006, 7}, { 0x0004, 11},
1435 { 0x02F8, 13}, { 0x0019, 7}, { 0x0006, 11}, { 0x063D, 13}, { 0x0057, 7}, { 0x0182, 11},
1436 { 0x2AA2, 14}, { 0x0004, 8}, { 0x0180, 11}, { 0x059C, 14}, { 0x007D, 8}, { 0x0164, 12},
1437 { 0x076D, 15}, { 0x0002, 9}, { 0x018D, 11}, { 0x1581, 13}, { 0x00AD, 8}, { 0x0060, 12},
1438 { 0x0C67, 14}, { 0x001C, 9}, { 0x00EE, 13}, { 0x0003, 9}, { 0x02CF, 13}, { 0x00D9, 9},
1439 { 0x1580, 13}, { 0x0002, 11}, { 0x0183, 11}, { 0x0057, 12}, { 0x0061, 12}, { 0x0031, 11},
1440 { 0x0066, 12}, { 0x0631, 13}, { 0x0632, 13}, { 0x00AC, 13}, { 0x031D, 12}, { 0x0076, 12},
1441 { 0x003A, 11}, { 0x0165, 12}, { 0x0C66, 14}, { 0x0003, 2}, { 0x0054, 7}, { 0x02AB, 10},
1442 { 0x0016, 13}, { 0x05F7, 14}, { 0x0005, 4}, { 0x00F8, 9}, { 0x0AA9, 12}, { 0x005F, 15},
1443 { 0x0004, 4}, { 0x001C, 10}, { 0x1550, 13}, { 0x0004, 5}, { 0x0077, 11}, { 0x076C, 15},
1444 { 0x000E, 5}, { 0x000A, 12}, { 0x000C, 5}, { 0x0562, 11}, { 0x0004, 6}, { 0x031C, 12},
1445 { 0x0006, 6}, { 0x00C8, 13}, { 0x000D, 6}, { 0x01DA, 13}, { 0x0007, 6}, { 0x00C9, 13},
1446 { 0x0001, 7}, { 0x002E, 14}, { 0x0014, 7}, { 0x1596, 13}, { 0x000A, 7}, { 0x0AC2, 12},
1447 { 0x0016, 7}, { 0x015B, 14}, { 0x0015, 7}, { 0x015A, 14}, { 0x000F, 8}, { 0x005E, 15},
1448 { 0x007E, 8}, { 0x00AB, 8}, { 0x002D, 9}, { 0x00D8, 9}, { 0x000B, 9}, { 0x0014, 10},
1449 { 0x02B3, 10}, { 0x01F3, 10}, { 0x003A, 10}, { 0x0000, 10}, { 0x0058, 10}, { 0x002E, 9},
1450 { 0x005E, 10}, { 0x0563, 11}, { 0x00EC, 12}, { 0x0054, 12}, { 0x0AC1, 12}, { 0x1556, 13},
1451 { 0x02FA, 13}, { 0x0181, 11}, { 0x1557, 13}, { 0x059D, 14}, { 0x2AA3, 14}, { 0x2B2A, 14},
1452 { 0x01DE, 14}, { 0x063C, 13}, { 0x00CF, 13}, { 0x1594, 13}, { 0x000D, 9}
1455 { 0x0002, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x000D, 5}, { 0x000C, 5}, { 0x0015, 6},
1456 { 0x0013, 6}, { 0x0012, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x001E, 8}, { 0x001D, 8},
1457 { 0x0025, 9}, { 0x0024, 9}, { 0x0023, 9}, { 0x0021, 9}, { 0x0021, 10}, { 0x0020, 10},
1458 { 0x000F, 10}, { 0x000E, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11}, { 0x0021, 11},
1459 { 0x0050, 12}, { 0x0051, 12}, { 0x0052, 12}, { 0x000E, 4}, { 0x0014, 6}, { 0x0016, 7},
1460 { 0x001C, 8}, { 0x0020, 9}, { 0x001F, 9}, { 0x000D, 10}, { 0x0022, 11}, { 0x0053, 12},
1461 { 0x0055, 12}, { 0x000B, 5}, { 0x0015, 7}, { 0x001E, 9}, { 0x000C, 10}, { 0x0056, 12},
1462 { 0x0011, 6}, { 0x001B, 8}, { 0x001D, 9}, { 0x000B, 10}, { 0x0010, 6}, { 0x0022, 9},
1463 { 0x000A, 10}, { 0x000D, 6}, { 0x001C, 9}, { 0x0008, 10}, { 0x0012, 7}, { 0x001B, 9},
1464 { 0x0054, 12}, { 0x0014, 7}, { 0x001A, 9}, { 0x0057, 12}, { 0x0019, 8}, { 0x0009, 10},
1465 { 0x0018, 8}, { 0x0023, 11}, { 0x0017, 8}, { 0x0019, 9}, { 0x0018, 9}, { 0x0007, 10},
1466 { 0x0058, 12}, { 0x0007, 4}, { 0x000C, 6}, { 0x0016, 8}, { 0x0017, 9}, { 0x0006, 10},
1467 { 0x0005, 11}, { 0x0004, 11}, { 0x0059, 12}, { 0x000F, 6}, { 0x0016, 9}, { 0x0005, 10},
1468 { 0x000E, 6}, { 0x0004, 10}, { 0x0011, 7}, { 0x0024, 11}, { 0x0010, 7}, { 0x0025, 11},
1469 { 0x0013, 7}, { 0x005A, 12}, { 0x0015, 8}, { 0x005B, 12}, { 0x0014, 8}, { 0x0013, 8},
1470 { 0x001A, 8}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9}, { 0x0012, 9}, { 0x0011, 9},
1471 { 0x0026, 11}, { 0x0027, 11}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12},
1475 { 0x0002, 2}, { 0x000F, 4}, { 0x0015, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x0025, 9},
1476 { 0x0024, 9}, { 0x0021, 10}, { 0x0020, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11},
1477 { 0x0006, 3}, { 0x0014, 6}, { 0x001E, 8}, { 0x000F, 10}, { 0x0021, 11}, { 0x0050, 12},
1478 { 0x000E, 4}, { 0x001D, 8}, { 0x000E, 10}, { 0x0051, 12}, { 0x000D, 5}, { 0x0023, 9},
1479 { 0x000D, 10}, { 0x000C, 5}, { 0x0022, 9}, { 0x0052, 12}, { 0x000B, 5}, { 0x000C, 10},
1480 { 0x0053, 12}, { 0x0013, 6}, { 0x000B, 10}, { 0x0054, 12}, { 0x0012, 6}, { 0x000A, 10},
1481 { 0x0011, 6}, { 0x0009, 10}, { 0x0010, 6}, { 0x0008, 10}, { 0x0016, 7}, { 0x0055, 12},
1482 { 0x0015, 7}, { 0x0014, 7}, { 0x001C, 8}, { 0x001B, 8}, { 0x0021, 9}, { 0x0020, 9},
1483 { 0x001F, 9}, { 0x001E, 9}, { 0x001D, 9}, { 0x001C, 9}, { 0x001B, 9}, { 0x001A, 9},
1484 { 0x0022, 11}, { 0x0023, 11}, { 0x0056, 12}, { 0x0057, 12}, { 0x0007, 4}, { 0x0019, 9},
1485 { 0x0005, 11}, { 0x000F, 6}, { 0x0004, 11}, { 0x000E, 6}, { 0x000D, 6}, { 0x000C, 6},
1486 { 0x0013, 7}, { 0x0012, 7}, { 0x0011, 7}, { 0x0010, 7}, { 0x001A, 8}, { 0x0019, 8},
1487 { 0x0018, 8}, { 0x0017, 8}, { 0x0016, 8}, { 0x0015, 8}, { 0x0014, 8}, { 0x0013, 8},
1488 { 0x0018, 9}, { 0x0017, 9}, { 0x0016, 9}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9},
1489 { 0x0012, 9}, { 0x0011, 9}, { 0x0007, 10}, { 0x0006, 10}, { 0x0005, 10}, { 0x0004, 10},
1490 { 0x0024, 11}, { 0x0025, 11}, { 0x0026, 11}, { 0x0027, 11}, { 0x0058, 12}, { 0x0059, 12},
1491 { 0x005A, 12}, { 0x005B, 12}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12},
1495 { 0x0000, 2}, { 0x0003, 3}, { 0x000D, 4}, { 0x0005, 4}, { 0x001C, 5}, { 0x0016, 5},
1496 { 0x003F, 6}, { 0x003A, 6}, { 0x002E, 6}, { 0x0022, 6}, { 0x007B, 7}, { 0x0067, 7},
1497 { 0x005F, 7}, { 0x0047, 7}, { 0x0026, 7}, { 0x00EF, 8}, { 0x00CD, 8}, { 0x00C1, 8},
1498 { 0x00A9, 8}, { 0x004F, 8}, { 0x01F2, 9}, { 0x01DD, 9}, { 0x0199, 9}, { 0x0185, 9},
1499 { 0x015D, 9}, { 0x011B, 9}, { 0x03EF, 10}, { 0x03E1, 10}, { 0x03C8, 10}, { 0x0331, 10},
1500 { 0x0303, 10}, { 0x02F1, 10}, { 0x02A0, 10}, { 0x0233, 10}, { 0x0126, 10}, { 0x07C0, 11},
1501 { 0x076F, 11}, { 0x076C, 11}, { 0x0661, 11}, { 0x0604, 11}, { 0x0572, 11}, { 0x0551, 11},
1502 { 0x046A, 11}, { 0x0274, 11}, { 0x0F27, 12}, { 0x0F24, 12}, { 0x0EDB, 12}, { 0x0C8E, 12},
1503 { 0x0C0B, 12}, { 0x0C0A, 12}, { 0x0AE3, 12}, { 0x08D6, 12}, { 0x0490, 12}, { 0x0495, 12},
1504 { 0x1F19, 13}, { 0x1DB5, 13}, { 0x0009, 4}, { 0x0010, 5}, { 0x0029, 6}, { 0x0062, 7},
1505 { 0x00F3, 8}, { 0x00AD, 8}, { 0x01E5, 9}, { 0x0179, 9}, { 0x009C, 9}, { 0x03B1, 10},
1506 { 0x02AE, 10}, { 0x0127, 10}, { 0x076E, 11}, { 0x0570, 11}, { 0x0275, 11}, { 0x0F25, 12},
1507 { 0x0EC0, 12}, { 0x0AA0, 12}, { 0x08D7, 12}, { 0x1E4C, 13}, { 0x0008, 5}, { 0x0063, 7},
1508 { 0x00AF, 8}, { 0x017B, 9}, { 0x03B3, 10}, { 0x07DD, 11}, { 0x0640, 11}, { 0x0F8D, 12},
1509 { 0x0BC1, 12}, { 0x0491, 12}, { 0x0028, 6}, { 0x00C3, 8}, { 0x0151, 9}, { 0x02A1, 10},
1510 { 0x0573, 11}, { 0x0EC3, 12}, { 0x1F35, 13}, { 0x0065, 7}, { 0x01DA, 9}, { 0x02AF, 10},
1511 { 0x0277, 11}, { 0x08C9, 12}, { 0x1781, 13}, { 0x0025, 7}, { 0x0118, 9}, { 0x0646, 11},
1512 { 0x0AA6, 12}, { 0x1780, 13}, { 0x00C9, 8}, { 0x0321, 10}, { 0x0F9B, 12}, { 0x191E, 13},
1513 { 0x0048, 8}, { 0x07CC, 11}, { 0x0AA1, 12}, { 0x0180, 9}, { 0x0465, 11}, { 0x1905, 13},
1514 { 0x03E2, 10}, { 0x0EC1, 12}, { 0x3C9B, 14}, { 0x02F4, 10}, { 0x08C8, 12}, { 0x07C1, 11},
1515 { 0x0928, 13}, { 0x05E1, 11}, { 0x320D, 14}, { 0x0EC2, 12}, { 0x6418, 15}, { 0x1F34, 13},
1516 { 0x0078, 7}, { 0x0155, 9}, { 0x0552, 11}, { 0x191F, 13}, { 0x00FA, 8}, { 0x07DC, 11},
1517 { 0x1907, 13}, { 0x00AC, 8}, { 0x0249, 11}, { 0x13B1, 14}, { 0x01F6, 9}, { 0x0AE2, 12},
1518 { 0x01DC, 9}, { 0x04ED, 12}, { 0x0184, 9}, { 0x1904, 13}, { 0x0156, 9}, { 0x09D9, 13},
1519 { 0x03E7, 10}, { 0x0929, 13}, { 0x03B2, 10}, { 0x3B68, 14}, { 0x02F5, 10}, { 0x13B0, 14},
1520 { 0x0322, 10}, { 0x3B69, 14}, { 0x0234, 10}, { 0x7935, 15}, { 0x07C7, 11}, { 0xC833, 16},
1521 { 0x0660, 11}, { 0x7934, 15}, { 0x024B, 11}, { 0xC832, 16}, { 0x0AA7, 12}, { 0x1F18, 13},
1525 { 0x0002, 2}, { 0x0000, 3}, { 0x001E, 5}, { 0x0004, 5}, { 0x0012, 6}, { 0x0070, 7},
1526 { 0x001A, 7}, { 0x005F, 8}, { 0x0047, 8}, { 0x01D3, 9}, { 0x00B5, 9}, { 0x0057, 9},
1527 { 0x03B5, 10}, { 0x016D, 10}, { 0x0162, 10}, { 0x07CE, 11}, { 0x0719, 11}, { 0x0691, 11},
1528 { 0x02C6, 11}, { 0x0156, 11}, { 0x0F92, 12}, { 0x0D2E, 12}, { 0x0D20, 12}, { 0x059E, 12},
1529 { 0x0468, 12}, { 0x02A6, 12}, { 0x1DA2, 13}, { 0x1C60, 13}, { 0x1A43, 13}, { 0x0B1D, 13},
1530 { 0x08C0, 13}, { 0x055D, 13}, { 0x0003, 3}, { 0x000A, 5}, { 0x0077, 7}, { 0x00E5, 8},
1531 { 0x01D9, 9}, { 0x03E5, 10}, { 0x0166, 10}, { 0x0694, 11}, { 0x0152, 11}, { 0x059F, 12},
1532 { 0x1F3C, 13}, { 0x1A4B, 13}, { 0x055E, 13}, { 0x000C, 4}, { 0x007D, 7}, { 0x0044, 8},
1533 { 0x03E0, 10}, { 0x0769, 11}, { 0x0E31, 12}, { 0x1F26, 13}, { 0x055C, 13}, { 0x001B, 5},
1534 { 0x00E2, 8}, { 0x03A5, 10}, { 0x02C9, 11}, { 0x1F23, 13}, { 0x3B47, 14}, { 0x0007, 5},
1535 { 0x01D8, 9}, { 0x02D8, 11}, { 0x1F27, 13}, { 0x3494, 14}, { 0x0035, 6}, { 0x03E1, 10},
1536 { 0x059C, 12}, { 0x38C3, 14}, { 0x000C, 6}, { 0x0165, 10}, { 0x1D23, 13}, { 0x1638, 14},
1537 { 0x0068, 7}, { 0x0693, 11}, { 0x3A45, 14}, { 0x0020, 7}, { 0x0F90, 12}, { 0x7CF6, 15},
1538 { 0x00E8, 8}, { 0x058F, 12}, { 0x2CEF, 15}, { 0x0045, 8}, { 0x0B3A, 13}, { 0x01F1, 9},
1539 { 0x3B46, 14}, { 0x01A7, 9}, { 0x1676, 14}, { 0x0056, 9}, { 0x692A, 15}, { 0x038D, 10},
1540 { 0xE309, 16}, { 0x00AA, 10}, { 0x1C611, 17}, { 0x02DF, 11}, { 0xB3B9, 17}, { 0x02C8, 11},
1541 { 0x38C20, 18}, { 0x01B0, 11}, { 0x16390, 18}, { 0x0F9F, 12}, { 0x16771, 18}, { 0x0ED0, 12},
1542 { 0x71843, 19}, { 0x0D2A, 12}, { 0xF9E8C, 20}, { 0x0461, 12}, { 0xF9E8E, 20}, { 0x0B67, 13},
1543 { 0x055F, 13}, { 0x003F, 6}, { 0x006D, 9}, { 0x0E90, 12}, { 0x054E, 13}, { 0x0013, 6},
1544 { 0x0119, 10}, { 0x0B66, 13}, { 0x000B, 6}, { 0x0235, 11}, { 0x7CF5, 15}, { 0x0075, 7},
1545 { 0x0D24, 12}, { 0xF9E9, 16}, { 0x002E, 7}, { 0x1F22, 13}, { 0x0021, 7}, { 0x054F, 13},
1546 { 0x0014, 7}, { 0x3A44, 14}, { 0x00E4, 8}, { 0x7CF7, 15}, { 0x005E, 8}, { 0x7185, 15},
1547 { 0x0037, 8}, { 0x2C73, 15}, { 0x01DB, 9}, { 0x59DD, 16}, { 0x01C7, 9}, { 0x692B, 15},
1548 { 0x01A6, 9}, { 0x58E5, 16}, { 0x00B4, 9}, { 0x1F3D0, 17}, { 0x00B0, 9}, { 0xB1C9, 17},
1549 { 0x03E6, 10}, { 0x16770, 18}, { 0x016E, 10}, { 0x3E7A2, 18}, { 0x011B, 10}, { 0xF9E8D, 20},
1550 { 0x00D9, 10}, { 0xF9E8F, 20}, { 0x00A8, 10}, { 0x2C723, 19}, { 0x0749, 11}, { 0xE3084, 20},
1551 { 0x0696, 11}, { 0x58E45, 20}, { 0x02DE, 11}, { 0xB1C88, 21}, { 0x0231, 11}, { 0x1C610A, 21},
1552 { 0x01B1, 11}, { 0x71842D, 23}, { 0x0D2B, 12}, { 0x38C217, 22}, { 0x0D2F, 12}, { 0x163913, 22},
1553 { 0x05B2, 12}, { 0x163912, 22}, { 0x0469, 12}, { 0x71842C, 23}, { 0x1A42, 13}, { 0x08C1, 13},
1558 static const uint16_t vlc_offs[] = {
1559 0, 520, 552, 616, 1128, 1160, 1224, 1740, 1772, 1836, 1900, 2436,
1560 2986, 3050, 3610, 4154, 4218, 4746, 5326, 5390, 5902, 6554, 7658, 8342,
1561 9304, 9988, 10630, 11234, 12174, 13006, 13560, 14232, 14786, 15432, 16350, 17522,
1562 20372, 21818, 22330, 22394, 23166, 23678, 23742, 24820, 25332, 25396, 26460, 26980,
1563 27048, 27592, 27600, 27608, 27616, 27624, 28224, 28258, 28290, 28802, 28834, 28866,
1564 29378, 29412, 29444, 29960, 29994, 30026, 30538, 30572, 30604, 31120, 31154, 31186,
1565 31714, 31746, 31778, 32306, 32340, 32372
1569 * Init VC-1 specific tables and VC1Context members
1570 * @param v The VC1Context to initialize
1573 av_cold int ff_vc1_init_common(VC1Context *v)
1575 static int done = 0;
1577 static VLC_TYPE vlc_table[32372][2];
1579 v->hrd_rate = v->hrd_buffer = NULL;
1583 INIT_VLC_STATIC(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
1584 ff_vc1_bfraction_bits, 1, 1,
1585 ff_vc1_bfraction_codes, 1, 1, 1 << VC1_BFRACTION_VLC_BITS);
1586 INIT_VLC_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
1587 ff_vc1_norm2_bits, 1, 1,
1588 ff_vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS);
1589 INIT_VLC_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
1590 ff_vc1_norm6_bits, 1, 1,
1591 ff_vc1_norm6_codes, 2, 2, 556);
1592 INIT_VLC_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
1593 ff_vc1_imode_bits, 1, 1,
1594 ff_vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS);
1595 for (i = 0; i < 3; i++) {
1596 ff_vc1_ttmb_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 0]];
1597 ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i * 3 + 1] - vlc_offs[i * 3 + 0];
1598 init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
1599 ff_vc1_ttmb_bits[i], 1, 1,
1600 ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1601 ff_vc1_ttblk_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 1]];
1602 ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i * 3 + 2] - vlc_offs[i * 3 + 1];
1603 init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
1604 ff_vc1_ttblk_bits[i], 1, 1,
1605 ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1606 ff_vc1_subblkpat_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 2]];
1607 ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i * 3 + 3] - vlc_offs[i * 3 + 2];
1608 init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
1609 ff_vc1_subblkpat_bits[i], 1, 1,
1610 ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1612 for (i = 0; i < 4; i++) {
1613 ff_vc1_4mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 9]];
1614 ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i * 3 + 10] - vlc_offs[i * 3 + 9];
1615 init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
1616 ff_vc1_4mv_block_pattern_bits[i], 1, 1,
1617 ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1618 ff_vc1_cbpcy_p_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 10]];
1619 ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i * 3 + 11] - vlc_offs[i * 3 + 10];
1620 init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
1621 ff_vc1_cbpcy_p_bits[i], 1, 1,
1622 ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1623 ff_vc1_mv_diff_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 11]];
1624 ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i * 3 + 12] - vlc_offs[i * 3 + 11];
1625 init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
1626 ff_vc1_mv_diff_bits[i], 1, 1,
1627 ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1629 for (i = 0; i < 8; i++) {
1630 ff_vc1_ac_coeff_table[i].table = &vlc_table[vlc_offs[i * 2 + 21]];
1631 ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i * 2 + 22] - vlc_offs[i * 2 + 21];
1632 init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, ff_vc1_ac_sizes[i],
1633 &vc1_ac_tables[i][0][1], 8, 4,
1634 &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC);
1635 /* initialize interlaced MVDATA tables (2-Ref) */
1636 ff_vc1_2ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 2 + 22]];
1637 ff_vc1_2ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 2 + 23] - vlc_offs[i * 2 + 22];
1638 init_vlc(&ff_vc1_2ref_mvdata_vlc[i], VC1_2REF_MVDATA_VLC_BITS, 126,
1639 ff_vc1_2ref_mvdata_bits[i], 1, 1,
1640 ff_vc1_2ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
1642 for (i = 0; i < 4; i++) {
1643 /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */
1644 ff_vc1_intfr_4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 37]];
1645 ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 38] - vlc_offs[i * 3 + 37];
1646 init_vlc(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15,
1647 ff_vc1_intfr_4mv_mbmode_bits[i], 1, 1,
1648 ff_vc1_intfr_4mv_mbmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1649 /* initialize NON-4MV MBMODE VLC tables for the same */
1650 ff_vc1_intfr_non4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 38]];
1651 ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 39] - vlc_offs[i * 3 + 38];
1652 init_vlc(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9,
1653 ff_vc1_intfr_non4mv_mbmode_bits[i], 1, 1,
1654 ff_vc1_intfr_non4mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1655 /* initialize interlaced MVDATA tables (1-Ref) */
1656 ff_vc1_1ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 39]];
1657 ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 3 + 40] - vlc_offs[i * 3 + 39];
1658 init_vlc(&ff_vc1_1ref_mvdata_vlc[i], VC1_1REF_MVDATA_VLC_BITS, 72,
1659 ff_vc1_1ref_mvdata_bits[i], 1, 1,
1660 ff_vc1_1ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
1662 for (i = 0; i < 4; i++) {
1663 /* Initialize 2MV Block pattern VLC tables */
1664 ff_vc1_2mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i + 49]];
1665 ff_vc1_2mv_block_pattern_vlc[i].table_allocated = vlc_offs[i + 50] - vlc_offs[i + 49];
1666 init_vlc(&ff_vc1_2mv_block_pattern_vlc[i], VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4,
1667 ff_vc1_2mv_block_pattern_bits[i], 1, 1,
1668 ff_vc1_2mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1670 for (i = 0; i < 8; i++) {
1671 /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */
1672 ff_vc1_icbpcy_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 53]];
1673 ff_vc1_icbpcy_vlc[i].table_allocated = vlc_offs[i * 3 + 54] - vlc_offs[i * 3 + 53];
1674 init_vlc(&ff_vc1_icbpcy_vlc[i], VC1_ICBPCY_VLC_BITS, 63,
1675 ff_vc1_icbpcy_p_bits[i], 1, 1,
1676 ff_vc1_icbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1677 /* Initialize interlaced field picture MBMODE VLC tables */
1678 ff_vc1_if_mmv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 54]];
1679 ff_vc1_if_mmv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 55] - vlc_offs[i * 3 + 54];
1680 init_vlc(&ff_vc1_if_mmv_mbmode_vlc[i], VC1_IF_MMV_MBMODE_VLC_BITS, 8,
1681 ff_vc1_if_mmv_mbmode_bits[i], 1, 1,
1682 ff_vc1_if_mmv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1683 ff_vc1_if_1mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 55]];
1684 ff_vc1_if_1mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 56] - vlc_offs[i * 3 + 55];
1685 init_vlc(&ff_vc1_if_1mv_mbmode_vlc[i], VC1_IF_1MV_MBMODE_VLC_BITS, 6,
1686 ff_vc1_if_1mv_mbmode_bits[i], 1, 1,
1687 ff_vc1_if_1mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1692 /* Other defaults */
1694 v->mvrange = 0; /* 7.1.1.18, p80 */