FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
vc1.c
Go to the documentation of this file.
1 /*
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
6  *
7  * This file is part of FFmpeg.
8  *
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.
13  *
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.
18  *
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
22  */
23 
24 /**
25  * @file
26  * VC-1 and WMV3 decoder common code
27  *
28  */
29 
30 #include "libavutil/attributes.h"
31 #include "internal.h"
32 #include "avcodec.h"
33 #include "mpegvideo.h"
34 #include "vc1.h"
35 #include "vc1data.h"
36 #include "msmpeg4data.h"
37 #include "unary.h"
38 #include "simple_idct.h"
39 
40 #undef NDEBUG
41 #include <assert.h>
42 
43 /***********************************************************************/
44 /**
45  * @name VC-1 Bitplane decoding
46  * @see 8.7, p56
47  * @{
48  */
49 
50 /**
51  * Imode types
52  * @{
53  */
54 enum Imode {
62 };
63 /** @} */ //imode defines
64 
65 /** Decode rows by checking if they are skipped
66  * @param plane Buffer to store decoded bits
67  * @param[in] width Width of this buffer
68  * @param[in] height Height of this buffer
69  * @param[in] stride of this buffer
70  */
71 static void decode_rowskip(uint8_t* plane, int width, int height, int stride,
72  GetBitContext *gb)
73 {
74  int x, y;
75 
76  for (y = 0; y < height; y++) {
77  if (!get_bits1(gb)) //rowskip
78  memset(plane, 0, width);
79  else
80  for (x = 0; x < width; x++)
81  plane[x] = get_bits1(gb);
82  plane += stride;
83  }
84 }
85 
86 /** Decode columns by checking if they are skipped
87  * @param plane Buffer to store decoded bits
88  * @param[in] width Width of this buffer
89  * @param[in] height Height of this buffer
90  * @param[in] stride of this buffer
91  * @todo FIXME: Optimize
92  */
93 static void decode_colskip(uint8_t* plane, int width, int height, int stride,
94  GetBitContext *gb)
95 {
96  int x, y;
97 
98  for (x = 0; x < width; x++) {
99  if (!get_bits1(gb)) //colskip
100  for (y = 0; y < height; y++)
101  plane[y*stride] = 0;
102  else
103  for (y = 0; y < height; y++)
104  plane[y*stride] = get_bits1(gb);
105  plane ++;
106  }
107 }
108 
109 /** Decode a bitplane's bits
110  * @param data bitplane where to store the decode bits
111  * @param[out] raw_flag pointer to the flag indicating that this bitplane is not coded explicitly
112  * @param v VC-1 context for bit reading and logging
113  * @return Status
114  * @todo FIXME: Optimize
115  */
116 static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v)
117 {
118  GetBitContext *gb = &v->s.gb;
119 
120  int imode, x, y, code, offset;
121  uint8_t invert, *planep = data;
122  int width, height, stride;
123 
124  width = v->s.mb_width;
125  height = v->s.mb_height >> v->field_mode;
126  stride = v->s.mb_stride;
127  invert = get_bits1(gb);
129 
130  *raw_flag = 0;
131  switch (imode) {
132  case IMODE_RAW:
133  //Data is actually read in the MB layer (same for all tests == "raw")
134  *raw_flag = 1; //invert ignored
135  return invert;
136  case IMODE_DIFF2:
137  case IMODE_NORM2:
138  if ((height * width) & 1) {
139  *planep++ = get_bits1(gb);
140  offset = 1;
141  }
142  else
143  offset = 0;
144  // decode bitplane as one long line
145  for (y = offset; y < height * width; y += 2) {
147  *planep++ = code & 1;
148  offset++;
149  if (offset == width) {
150  offset = 0;
151  planep += stride - width;
152  }
153  *planep++ = code >> 1;
154  offset++;
155  if (offset == width) {
156  offset = 0;
157  planep += stride - width;
158  }
159  }
160  break;
161  case IMODE_DIFF6:
162  case IMODE_NORM6:
163  if (!(height % 3) && (width % 3)) { // use 2x3 decoding
164  for (y = 0; y < height; y += 3) {
165  for (x = width & 1; x < width; x += 2) {
167  if (code < 0) {
168  av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
169  return -1;
170  }
171  planep[x + 0] = (code >> 0) & 1;
172  planep[x + 1] = (code >> 1) & 1;
173  planep[x + 0 + stride] = (code >> 2) & 1;
174  planep[x + 1 + stride] = (code >> 3) & 1;
175  planep[x + 0 + stride * 2] = (code >> 4) & 1;
176  planep[x + 1 + stride * 2] = (code >> 5) & 1;
177  }
178  planep += stride * 3;
179  }
180  if (width & 1)
181  decode_colskip(data, 1, height, stride, &v->s.gb);
182  } else { // 3x2
183  planep += (height & 1) * stride;
184  for (y = height & 1; y < height; y += 2) {
185  for (x = width % 3; x < width; x += 3) {
187  if (code < 0) {
188  av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
189  return -1;
190  }
191  planep[x + 0] = (code >> 0) & 1;
192  planep[x + 1] = (code >> 1) & 1;
193  planep[x + 2] = (code >> 2) & 1;
194  planep[x + 0 + stride] = (code >> 3) & 1;
195  planep[x + 1 + stride] = (code >> 4) & 1;
196  planep[x + 2 + stride] = (code >> 5) & 1;
197  }
198  planep += stride * 2;
199  }
200  x = width % 3;
201  if (x)
202  decode_colskip(data, x, height, stride, &v->s.gb);
203  if (height & 1)
204  decode_rowskip(data + x, width - x, 1, stride, &v->s.gb);
205  }
206  break;
207  case IMODE_ROWSKIP:
208  decode_rowskip(data, width, height, stride, &v->s.gb);
209  break;
210  case IMODE_COLSKIP:
211  decode_colskip(data, width, height, stride, &v->s.gb);
212  break;
213  default:
214  break;
215  }
216 
217  /* Applying diff operator */
218  if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6) {
219  planep = data;
220  planep[0] ^= invert;
221  for (x = 1; x < width; x++)
222  planep[x] ^= planep[x-1];
223  for (y = 1; y < height; y++) {
224  planep += stride;
225  planep[0] ^= planep[-stride];
226  for (x = 1; x < width; x++) {
227  if (planep[x-1] != planep[x-stride]) planep[x] ^= invert;
228  else planep[x] ^= planep[x-1];
229  }
230  }
231  } else if (invert) {
232  planep = data;
233  for (x = 0; x < stride * height; x++)
234  planep[x] = !planep[x]; //FIXME stride
235  }
236  return (imode << 1) + invert;
237 }
238 
239 /** @} */ //Bitplane group
240 
241 /***********************************************************************/
242 /** VOP Dquant decoding
243  * @param v VC-1 Context
244  */
246 {
247  GetBitContext *gb = &v->s.gb;
248  int pqdiff;
249 
250  //variable size
251  if (v->dquant == 2) {
252  pqdiff = get_bits(gb, 3);
253  if (pqdiff == 7)
254  v->altpq = get_bits(gb, 5);
255  else
256  v->altpq = v->pq + pqdiff + 1;
257  } else {
258  v->dquantfrm = get_bits1(gb);
259  if (v->dquantfrm) {
260  v->dqprofile = get_bits(gb, 2);
261  switch (v->dqprofile) {
264  v->dqsbedge = get_bits(gb, 2);
265  break;
266  case DQPROFILE_ALL_MBS:
267  v->dqbilevel = get_bits1(gb);
268  if (!v->dqbilevel)
269  v->halfpq = 0;
270  default:
271  break; //Forbidden ?
272  }
273  if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) {
274  pqdiff = get_bits(gb, 3);
275  if (pqdiff == 7)
276  v->altpq = get_bits(gb, 5);
277  else
278  v->altpq = v->pq + pqdiff + 1;
279  }
280  }
281  }
282  return 0;
283 }
284 
286 
287 /**
288  * Decode Simple/Main Profiles sequence header
289  * @see Figure 7-8, p16-17
290  * @param avctx Codec context
291  * @param gb GetBit context initialized from Codec context extra_data
292  * @return Status
293  */
295 {
296  av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits_long(gb, 32));
297  v->profile = get_bits(gb, 2);
298  if (v->profile == PROFILE_COMPLEX) {
299  av_log(avctx, AV_LOG_WARNING, "WMV3 Complex Profile is not fully supported\n");
300  }
301 
302  if (v->profile == PROFILE_ADVANCED) {
305  return decode_sequence_header_adv(v, gb);
306  } else {
309  v->res_y411 = get_bits1(gb);
310  v->res_sprite = get_bits1(gb);
311  if (v->res_y411) {
312  av_log(avctx, AV_LOG_ERROR,
313  "Old interlaced mode is not supported\n");
314  return -1;
315  }
316  }
317 
318  // (fps-2)/4 (->30)
319  v->frmrtq_postproc = get_bits(gb, 3); //common
320  // (bitrate-32kbps)/64kbps
321  v->bitrtq_postproc = get_bits(gb, 5); //common
322  v->s.loop_filter = get_bits1(gb); //common
323  if (v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE) {
324  av_log(avctx, AV_LOG_ERROR,
325  "LOOPFILTER shall not be enabled in Simple Profile\n");
326  }
328  v->s.loop_filter = 0;
329 
330  v->res_x8 = get_bits1(gb); //reserved
331  v->multires = get_bits1(gb);
332  v->res_fasttx = get_bits1(gb);
333  if (!v->res_fasttx) {
342  }
343 
344  v->fastuvmc = get_bits1(gb); //common
345  if (!v->profile && !v->fastuvmc) {
346  av_log(avctx, AV_LOG_ERROR,
347  "FASTUVMC unavailable in Simple Profile\n");
348  return -1;
349  }
350  v->extended_mv = get_bits1(gb); //common
351  if (!v->profile && v->extended_mv)
352  {
353  av_log(avctx, AV_LOG_ERROR,
354  "Extended MVs unavailable in Simple Profile\n");
355  return -1;
356  }
357  v->dquant = get_bits(gb, 2); //common
358  v->vstransform = get_bits1(gb); //common
359 
360  v->res_transtab = get_bits1(gb);
361  if (v->res_transtab)
362  {
363  av_log(avctx, AV_LOG_ERROR,
364  "1 for reserved RES_TRANSTAB is forbidden\n");
365  return -1;
366  }
367 
368  v->overlap = get_bits1(gb); //common
369 
370  v->s.resync_marker = get_bits1(gb);
371  v->rangered = get_bits1(gb);
372  if (v->rangered && v->profile == PROFILE_SIMPLE) {
373  av_log(avctx, AV_LOG_INFO,
374  "RANGERED should be set to 0 in Simple Profile\n");
375  }
376 
377  v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common
378  v->quantizer_mode = get_bits(gb, 2); //common
379 
380  v->finterpflag = get_bits1(gb); //common
381 
382  if (v->res_sprite) {
383  int w = get_bits(gb, 11);
384  int h = get_bits(gb, 11);
385  avcodec_set_dimensions(v->s.avctx, w, h);
386  skip_bits(gb, 5); //frame rate
387  v->res_x8 = get_bits1(gb);
388  if (get_bits1(gb)) { // something to do with DC VLC selection
389  av_log(avctx, AV_LOG_ERROR, "Unsupported sprite feature\n");
390  return -1;
391  }
392  skip_bits(gb, 3); //slice code
393  v->res_rtm_flag = 0;
394  } else {
395  v->res_rtm_flag = get_bits1(gb); //reserved
396  }
397  if (!v->res_rtm_flag) {
398  av_log(avctx, AV_LOG_ERROR,
399  "Old WMV3 version detected, some frames may be decoded incorrectly\n");
400  //return -1;
401  }
402  //TODO: figure out what they mean (always 0x402F)
403  if (!v->res_fasttx)
404  skip_bits(gb, 16);
405  av_log(avctx, AV_LOG_DEBUG,
406  "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
407  "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
408  "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
409  "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
411  v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
412  v->rangered, v->vstransform, v->overlap, v->s.resync_marker,
413  v->dquant, v->quantizer_mode, avctx->max_b_frames);
414  return 0;
415 }
416 
418 {
419  v->res_rtm_flag = 1;
420  v->level = get_bits(gb, 3);
421  if (v->level >= 5) {
422  av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
423  }
424  v->chromaformat = get_bits(gb, 2);
425  if (v->chromaformat != 1) {
427  "Only 4:2:0 chroma format supported\n");
428  return -1;
429  }
430 
431  // (fps-2)/4 (->30)
432  v->frmrtq_postproc = get_bits(gb, 3); //common
433  // (bitrate-32kbps)/64kbps
434  v->bitrtq_postproc = get_bits(gb, 5); //common
435  v->postprocflag = get_bits1(gb); //common
436 
437  v->max_coded_width = (get_bits(gb, 12) + 1) << 1;
438  v->max_coded_height = (get_bits(gb, 12) + 1) << 1;
439  v->broadcast = get_bits1(gb);
440  v->interlace = get_bits1(gb);
441  v->tfcntrflag = get_bits1(gb);
442  v->finterpflag = get_bits1(gb);
443  skip_bits1(gb); // reserved
444 
446  "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
447  "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
448  "TFCTRflag=%i, FINTERPflag=%i\n",
451  v->tfcntrflag, v->finterpflag);
452 
453  v->psf = get_bits1(gb);
454  if (v->psf) { //PsF, 6.1.13
455  av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n");
456  return -1;
457  }
458  v->s.max_b_frames = v->s.avctx->max_b_frames = 7;
459  if (get_bits1(gb)) { //Display Info - decoding is not affected by it
460  int w, h, ar = 0;
461  av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n");
462  w = get_bits(gb, 14) + 1;
463  h = get_bits(gb, 14) + 1;
464  av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h);
465  if (get_bits1(gb))
466  ar = get_bits(gb, 4);
467  if (ar && ar < 14) {
469  } else if (ar == 15) {
470  w = get_bits(gb, 8) + 1;
471  h = get_bits(gb, 8) + 1;
472  v->s.avctx->sample_aspect_ratio = (AVRational){w, h};
473  } else {
476  v->s.avctx->height * w,
477  v->s.avctx->width * h,
478  1 << 30);
479  }
480  av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect: %i:%i\n",
483 
484  if (get_bits1(gb)) { //framerate stuff
485  if (get_bits1(gb)) {
486  v->s.avctx->time_base.num = 32;
487  v->s.avctx->time_base.den = get_bits(gb, 16) + 1;
488  } else {
489  int nr, dr;
490  nr = get_bits(gb, 8);
491  dr = get_bits(gb, 4);
492  if (nr > 0 && nr < 8 && dr > 0 && dr < 3) {
493  v->s.avctx->time_base.num = ff_vc1_fps_dr[dr - 1];
494  v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000;
495  }
496  }
497  if (v->broadcast) { // Pulldown may be present
498  v->s.avctx->time_base.den *= 2;
499  v->s.avctx->ticks_per_frame = 2;
500  }
501  }
502 
503  if (get_bits1(gb)) {
504  v->s.avctx->color_primaries = get_bits(gb, 8);
505  v->s.avctx->color_trc = get_bits(gb, 8);
506  v->s.avctx->colorspace = get_bits(gb, 8);
508  }
509  }
510 
511  v->hrd_param_flag = get_bits1(gb);
512  if (v->hrd_param_flag) {
513  int i;
514  v->hrd_num_leaky_buckets = get_bits(gb, 5);
515  skip_bits(gb, 4); //bitrate exponent
516  skip_bits(gb, 4); //buffer size exponent
517  for (i = 0; i < v->hrd_num_leaky_buckets; i++) {
518  skip_bits(gb, 16); //hrd_rate[n]
519  skip_bits(gb, 16); //hrd_buffer[n]
520  }
521  }
522  return 0;
523 }
524 
526 {
527  int i;
528  int w,h;
529 
530  av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32));
531  v->broken_link = get_bits1(gb);
532  v->closed_entry = get_bits1(gb);
533  v->panscanflag = get_bits1(gb);
534  v->refdist_flag = get_bits1(gb);
535  v->s.loop_filter = get_bits1(gb);
537  v->s.loop_filter = 0;
538  v->fastuvmc = get_bits1(gb);
539  v->extended_mv = get_bits1(gb);
540  v->dquant = get_bits(gb, 2);
541  v->vstransform = get_bits1(gb);
542  v->overlap = get_bits1(gb);
543  v->quantizer_mode = get_bits(gb, 2);
544 
545  if (v->hrd_param_flag) {
546  for (i = 0; i < v->hrd_num_leaky_buckets; i++) {
547  skip_bits(gb, 8); //hrd_full[n]
548  }
549  }
550 
551  if(get_bits1(gb)){
552  w = (get_bits(gb, 12)+1)<<1;
553  h = (get_bits(gb, 12)+1)<<1;
554  } else {
555  w = v->max_coded_width;
556  h = v->max_coded_height;
557  }
558  avcodec_set_dimensions(avctx, w, h);
559  if (v->extended_mv)
560  v->extended_dmv = get_bits1(gb);
561  if ((v->range_mapy_flag = get_bits1(gb))) {
562  av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n");
563  v->range_mapy = get_bits(gb, 3);
564  }
565  if ((v->range_mapuv_flag = get_bits1(gb))) {
566  av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n");
567  v->range_mapuv = get_bits(gb, 3);
568  }
569 
570  av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
571  "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
572  "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
573  "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n",
576 
577  return 0;
578 }
579 
580 /* fill lookup tables for intensity compensation */
581 #define INIT_LUT(lumscale, lumshift, luty, lutuv, chain) do { \
582  int scale, shift, i; \
583  if (!lumscale) { \
584  scale = -64; \
585  shift = (255 - lumshift * 2) << 6; \
586  if (lumshift > 31) \
587  shift += 128 << 6; \
588  } else { \
589  scale = lumscale + 32; \
590  if (lumshift > 31) \
591  shift = (lumshift - 64) << 6; \
592  else \
593  shift = lumshift << 6; \
594  } \
595  for (i = 0; i < 256; i++) { \
596  int iy = chain ? luty[i] : i; \
597  int iu = chain ? lutuv[i] : i; \
598  luty[i] = av_clip_uint8((scale * iy + shift + 32) >> 6); \
599  lutuv[i] = av_clip_uint8((scale * (iu - 128) + 128*64 + 32) >> 6);\
600  } \
601  } while(0)
602 
603 
604 static void rotate_luts(VC1Context *v)
605 {
606 #define ROTATE(DEF, L, N, C, A) do {\
607  if (v->s.pict_type == AV_PICTURE_TYPE_BI || v->s.pict_type == AV_PICTURE_TYPE_B) {\
608  C = A;\
609  } else {\
610  DEF;\
611  memcpy(&tmp, &L , sizeof(tmp));\
612  memcpy(&L , &N , sizeof(tmp));\
613  memcpy(&N , &tmp, sizeof(tmp));\
614  C = N;\
615  }\
616  }while(0)
617 
618  ROTATE(int tmp , v->last_use_ic, v->next_use_ic, v->curr_use_ic, v->aux_use_ic);
619  ROTATE(uint8_t tmp[2][256], v->last_luty , v->next_luty , v->curr_luty , v->aux_luty);
620  ROTATE(uint8_t tmp[2][256], v->last_lutuv, v->next_lutuv, v->curr_lutuv, v->aux_lutuv);
621 
622  INIT_LUT(32, 0 , v->curr_luty[0] , v->curr_lutuv[0] , 0);
623  INIT_LUT(32, 0 , v->curr_luty[1] , v->curr_lutuv[1] , 0);
624  v->curr_use_ic = 0;
625 }
626 
628 {
629  int pqindex, lowquant, status;
630 
631  if (v->finterpflag)
632  v->interpfrm = get_bits1(gb);
633  if (!v->s.avctx->codec)
634  return -1;
635  if (v->s.avctx->codec_id == AV_CODEC_ID_MSS2)
636  v->respic =
637  v->rangered =
638  v->multires = get_bits(gb, 2) == 1;
639  else
640  skip_bits(gb, 2); //framecnt unused
641  v->rangeredfrm = 0;
642  if (v->rangered)
643  v->rangeredfrm = get_bits1(gb);
644  v->s.pict_type = get_bits1(gb);
645  if (v->s.avctx->max_b_frames) {
646  if (!v->s.pict_type) {
647  if (get_bits1(gb))
649  else
651  } else
653  } else
655 
656  v->bi_type = 0;
657  if (v->s.pict_type == AV_PICTURE_TYPE_B) {
660  if (v->bfraction == 0) {
662  }
663  }
665  skip_bits(gb, 7); // skip buffer fullness
666 
667  if (v->parse_only)
668  return 0;
669 
670  /* calculate RND */
672  v->rnd = 1;
673  if (v->s.pict_type == AV_PICTURE_TYPE_P)
674  v->rnd ^= 1;
675 
676  /* Quantizer stuff */
677  pqindex = get_bits(gb, 5);
678  if (!pqindex)
679  return -1;
681  v->pq = ff_vc1_pquant_table[0][pqindex];
682  else
683  v->pq = ff_vc1_pquant_table[1][pqindex];
684 
685  v->pquantizer = 1;
687  v->pquantizer = pqindex < 9;
689  v->pquantizer = 0;
690  v->pqindex = pqindex;
691  if (pqindex < 9)
692  v->halfpq = get_bits1(gb);
693  else
694  v->halfpq = 0;
696  v->pquantizer = get_bits1(gb);
697  v->dquantfrm = 0;
698  if (v->extended_mv == 1)
699  v->mvrange = get_unary(gb, 0, 3);
700  v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
701  v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
702  v->range_x = 1 << (v->k_x - 1);
703  v->range_y = 1 << (v->k_y - 1);
704  if (v->multires && v->s.pict_type != AV_PICTURE_TYPE_B)
705  v->respic = get_bits(gb, 2);
706 
707  if (v->res_x8 && (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)) {
708  v->x8_type = get_bits1(gb);
709  } else
710  v->x8_type = 0;
711  av_dlog(v->s.avctx, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
712  (v->s.pict_type == AV_PICTURE_TYPE_P) ? 'P' : ((v->s.pict_type == AV_PICTURE_TYPE_I) ? 'I' : 'B'),
713  pqindex, v->pq, v->halfpq, v->rangeredfrm);
714 
715  if(v->first_pic_header_flag) {
716  rotate_luts(v);
717  }
718 
719  switch (v->s.pict_type) {
720  case AV_PICTURE_TYPE_P:
721  if (v->pq < 5) v->tt_index = 0;
722  else if (v->pq < 13) v->tt_index = 1;
723  else v->tt_index = 2;
724 
725  lowquant = (v->pq > 12) ? 0 : 1;
726  v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)];
727  if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
728  v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)];
729  v->lumscale = get_bits(gb, 6);
730  v->lumshift = get_bits(gb, 6);
731  v->last_use_ic = 1;
732  /* fill lookup tables for intensity compensation */
733  INIT_LUT(v->lumscale, v->lumshift , v->last_luty[0] , v->last_lutuv[0] , 1);
734  INIT_LUT(v->lumscale, v->lumshift , v->last_luty[1] , v->last_lutuv[1] , 1);
735  }
736  v->qs_last = v->s.quarter_sample;
738  v->s.quarter_sample = 0;
739  else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
741  v->s.quarter_sample = 0;
742  else
743  v->s.quarter_sample = 1;
744  } else
745  v->s.quarter_sample = 1;
747 
748  if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
749  v->mv_mode2 == MV_PMODE_MIXED_MV) ||
750  v->mv_mode == MV_PMODE_MIXED_MV) {
752  if (status < 0)
753  return -1;
754  av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
755  "Imode: %i, Invert: %i\n", status>>1, status&1);
756  } else {
757  v->mv_type_is_raw = 0;
758  memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
759  }
760  status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
761  if (status < 0)
762  return -1;
763  av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
764  "Imode: %i, Invert: %i\n", status>>1, status&1);
765 
766  /* Hopefully this is correct for P frames */
767  v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
768  v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
769 
770  if (v->dquant) {
771  av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
773  }
774 
775  v->ttfrm = 0; //FIXME Is that so ?
776  if (v->vstransform) {
777  v->ttmbf = get_bits1(gb);
778  if (v->ttmbf) {
779  v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
780  }
781  } else {
782  v->ttmbf = 1;
783  v->ttfrm = TT_8X8;
784  }
785  break;
786  case AV_PICTURE_TYPE_B:
787  if (v->pq < 5) v->tt_index = 0;
788  else if (v->pq < 13) v->tt_index = 1;
789  else v->tt_index = 2;
790 
792  v->qs_last = v->s.quarter_sample;
793  v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
794  v->s.mspel = v->s.quarter_sample;
795 
796  status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
797  if (status < 0)
798  return -1;
799  av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
800  "Imode: %i, Invert: %i\n", status>>1, status&1);
801  status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
802  if (status < 0)
803  return -1;
804  av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
805  "Imode: %i, Invert: %i\n", status>>1, status&1);
806 
807  v->s.mv_table_index = get_bits(gb, 2);
808  v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
809 
810  if (v->dquant) {
811  av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
813  }
814 
815  v->ttfrm = 0;
816  if (v->vstransform) {
817  v->ttmbf = get_bits1(gb);
818  if (v->ttmbf) {
819  v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
820  }
821  } else {
822  v->ttmbf = 1;
823  v->ttfrm = TT_8X8;
824  }
825  break;
826  }
827 
828  if (!v->x8_type) {
829  /* AC Syntax */
830  v->c_ac_table_index = decode012(gb);
832  v->y_ac_table_index = decode012(gb);
833  }
834  /* DC Syntax */
835  v->s.dc_table_index = get_bits1(gb);
836  }
837 
838  if (v->s.pict_type == AV_PICTURE_TYPE_BI) {
840  v->bi_type = 1;
841  }
842  return 0;
843 }
844 
846 {
847  int pqindex, lowquant;
848  int status;
849  int mbmodetab, imvtab, icbptab, twomvbptab, fourmvbptab; /* useful only for debugging */
850  int field_mode, fcm;
851 
852  v->numref=0;
853  v->p_frame_skipped = 0;
854  if (v->second_field) {
855  if(v->fcm!=2 || v->field_mode!=1)
856  return -1;
858  if (v->fptype & 4)
861  if (!v->pic_header_flag)
862  goto parse_common_info;
863  }
864 
865  field_mode = 0;
866  if (v->interlace) {
867  fcm = decode012(gb);
868  if (fcm) {
869  if (fcm == ILACE_FIELD)
870  field_mode = 1;
871  }
872  } else {
873  fcm = PROGRESSIVE;
874  }
875  if (!v->first_pic_header_flag && v->field_mode != field_mode)
876  return AVERROR_INVALIDDATA;
877  v->field_mode = field_mode;
878  v->fcm = fcm;
879 
880  if (v->field_mode) {
881  v->fptype = get_bits(gb, 3);
883  if (v->fptype & 4) // B-picture
885  } else {
886  switch (get_unary(gb, 0, 4)) {
887  case 0:
889  break;
890  case 1:
892  break;
893  case 2:
895  break;
896  case 3:
898  break;
899  case 4:
900  v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
901  v->p_frame_skipped = 1;
902  break;
903  }
904  }
905  if (v->tfcntrflag)
906  skip_bits(gb, 8);
907  if (v->broadcast) {
908  if (!v->interlace || v->psf) {
909  v->rptfrm = get_bits(gb, 2);
910  } else {
911  v->tff = get_bits1(gb);
912  v->rff = get_bits1(gb);
913  }
914  } else {
915  v->tff = 1;
916  }
917  if (v->panscanflag) {
918  avpriv_report_missing_feature(v->s.avctx, "Pan-scan");
919  //...
920  }
921  if (v->p_frame_skipped) {
922  return 0;
923  }
924  v->rnd = get_bits1(gb);
925  if (v->interlace)
926  v->uvsamp = get_bits1(gb);
928  return 0; //parsing only, vlc tables havnt been allocated
929  if (v->field_mode) {
930  if (!v->refdist_flag)
931  v->refdist = 0;
932  else if ((v->s.pict_type != AV_PICTURE_TYPE_B) && (v->s.pict_type != AV_PICTURE_TYPE_BI)) {
933  v->refdist = get_bits(gb, 2);
934  if (v->refdist == 3)
935  v->refdist += get_unary(gb, 0, 16);
936  }
937  if ((v->s.pict_type == AV_PICTURE_TYPE_B) || (v->s.pict_type == AV_PICTURE_TYPE_BI)) {
940  v->frfd = (v->bfraction * v->refdist) >> 8;
941  v->brfd = v->refdist - v->frfd - 1;
942  if (v->brfd < 0)
943  v->brfd = 0;
944  }
945  goto parse_common_info;
946  }
947  if (v->fcm == PROGRESSIVE) {
948  if (v->finterpflag)
949  v->interpfrm = get_bits1(gb);
950  if (v->s.pict_type == AV_PICTURE_TYPE_B) {
953  if (v->bfraction == 0) {
954  v->s.pict_type = AV_PICTURE_TYPE_BI; /* XXX: should not happen here */
955  }
956  }
957  }
958 
959  parse_common_info:
960  if (v->field_mode)
961  v->cur_field_type = !(v->tff ^ v->second_field);
962  pqindex = get_bits(gb, 5);
963  if (!pqindex)
964  return -1;
965  v->pqindex = pqindex;
967  v->pq = ff_vc1_pquant_table[0][pqindex];
968  else
969  v->pq = ff_vc1_pquant_table[1][pqindex];
970 
971  v->pquantizer = 1;
973  v->pquantizer = pqindex < 9;
975  v->pquantizer = 0;
976  v->pqindex = pqindex;
977  if (pqindex < 9)
978  v->halfpq = get_bits1(gb);
979  else
980  v->halfpq = 0;
982  v->pquantizer = get_bits1(gb);
983  if (v->postprocflag)
984  v->postproc = get_bits(gb, 2);
985 
986  if (v->parse_only)
987  return 0;
988 
989  if(v->first_pic_header_flag) {
990  rotate_luts(v);
991  }
992 
993  switch (v->s.pict_type) {
994  case AV_PICTURE_TYPE_I:
995  case AV_PICTURE_TYPE_BI:
996  if (v->fcm == ILACE_FRAME) { //interlace frame picture
997  status = bitplane_decoding(v->fieldtx_plane, &v->fieldtx_is_raw, v);
998  if (status < 0)
999  return -1;
1000  av_log(v->s.avctx, AV_LOG_DEBUG, "FIELDTX plane encoding: "
1001  "Imode: %i, Invert: %i\n", status>>1, status&1);
1002  }
1003  status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
1004  if (status < 0)
1005  return -1;
1006  av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
1007  "Imode: %i, Invert: %i\n", status>>1, status&1);
1008  v->condover = CONDOVER_NONE;
1009  if (v->overlap && v->pq <= 8) {
1010  v->condover = decode012(gb);
1011  if (v->condover == CONDOVER_SELECT) {
1012  status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v);
1013  if (status < 0)
1014  return -1;
1015  av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: "
1016  "Imode: %i, Invert: %i\n", status>>1, status&1);
1017  }
1018  }
1019  break;
1020  case AV_PICTURE_TYPE_P:
1021  if (v->field_mode) {
1022  v->numref = get_bits1(gb);
1023  if (!v->numref) {
1024  v->reffield = get_bits1(gb);
1025  v->ref_field_type[0] = v->reffield ^ !v->cur_field_type;
1026  }
1027  }
1028  if (v->extended_mv)
1029  v->mvrange = get_unary(gb, 0, 3);
1030  else
1031  v->mvrange = 0;
1032  if (v->interlace) {
1033  if (v->extended_dmv)
1034  v->dmvrange = get_unary(gb, 0, 3);
1035  else
1036  v->dmvrange = 0;
1037  if (v->fcm == ILACE_FRAME) { // interlaced frame picture
1038  v->fourmvswitch = get_bits1(gb);
1039  v->intcomp = get_bits1(gb);
1040  if (v->intcomp) {
1041  v->lumscale = get_bits(gb, 6);
1042  v->lumshift = get_bits(gb, 6);
1043  INIT_LUT(v->lumscale, v->lumshift, v->last_luty[0], v->last_lutuv[0], 1);
1044  INIT_LUT(v->lumscale, v->lumshift, v->last_luty[1], v->last_lutuv[1], 1);
1045  v->last_use_ic = 1;
1046  }
1047  status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1048  av_log(v->s.avctx, AV_LOG_DEBUG, "SKIPMB plane encoding: "
1049  "Imode: %i, Invert: %i\n", status>>1, status&1);
1050  mbmodetab = get_bits(gb, 2);
1051  if (v->fourmvswitch)
1052  v->mbmode_vlc = &ff_vc1_intfr_4mv_mbmode_vlc[mbmodetab];
1053  else
1054  v->mbmode_vlc = &ff_vc1_intfr_non4mv_mbmode_vlc[mbmodetab];
1055  imvtab = get_bits(gb, 2);
1056  v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[imvtab];
1057  // interlaced p-picture cbpcy range is [1, 63]
1058  icbptab = get_bits(gb, 3);
1059  v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
1060  twomvbptab = get_bits(gb, 2);
1061  v->twomvbp_vlc = &ff_vc1_2mv_block_pattern_vlc[twomvbptab];
1062  if (v->fourmvswitch) {
1063  fourmvbptab = get_bits(gb, 2);
1064  v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
1065  }
1066  }
1067  }
1068  v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1069  v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1070  v->range_x = 1 << (v->k_x - 1);
1071  v->range_y = 1 << (v->k_y - 1);
1072 
1073  if (v->pq < 5)
1074  v->tt_index = 0;
1075  else if (v->pq < 13)
1076  v->tt_index = 1;
1077  else
1078  v->tt_index = 2;
1079  if (v->fcm != ILACE_FRAME) {
1080  int mvmode;
1081  mvmode = get_unary(gb, 1, 4);
1082  lowquant = (v->pq > 12) ? 0 : 1;
1083  v->mv_mode = ff_vc1_mv_pmode_table[lowquant][mvmode];
1084  if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1085  int mvmode2;
1086  mvmode2 = get_unary(gb, 1, 3);
1087  v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][mvmode2];
1088  if (v->field_mode) {
1089  v->intcompfield = decode210(gb)^3;
1090  } else
1091  v->intcompfield = 3;
1092 
1093  v->lumscale2 = v->lumscale = 32;
1094  v->lumshift2 = v->lumshift = 0;
1095  if (v->intcompfield & 1) {
1096  v->lumscale = get_bits(gb, 6);
1097  v->lumshift = get_bits(gb, 6);
1098  }
1099  if ((v->intcompfield & 2) && v->field_mode) {
1100  v->lumscale2 = get_bits(gb, 6);
1101  v->lumshift2 = get_bits(gb, 6);
1102  } else if(!v->field_mode) {
1103  v->lumscale2 = v->lumscale;
1104  v->lumshift2 = v->lumshift;
1105  }
1106  if (v->field_mode && v->second_field) {
1107  if (v->cur_field_type) {
1108  INIT_LUT(v->lumscale , v->lumshift , v->curr_luty[v->cur_field_type^1], v->curr_lutuv[v->cur_field_type^1], 0);
1110  } else {
1113  }
1114  v->next_use_ic = v->curr_use_ic = 1;
1115  } else {
1116  INIT_LUT(v->lumscale , v->lumshift , v->last_luty[0], v->last_lutuv[0], 1);
1117  INIT_LUT(v->lumscale2, v->lumshift2, v->last_luty[1], v->last_lutuv[1], 1);
1118  }
1119  v->last_use_ic = 1;
1120  }
1121  v->qs_last = v->s.quarter_sample;
1123  v->s.quarter_sample = 0;
1124  else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1126  v->s.quarter_sample = 0;
1127  else
1128  v->s.quarter_sample = 1;
1129  } else
1130  v->s.quarter_sample = 1;
1131  v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN
1133  && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
1134  }
1135  if (v->fcm == PROGRESSIVE) { // progressive
1136  if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1138  || v->mv_mode == MV_PMODE_MIXED_MV) {
1139  status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
1140  if (status < 0)
1141  return -1;
1142  av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
1143  "Imode: %i, Invert: %i\n", status>>1, status&1);
1144  } else {
1145  v->mv_type_is_raw = 0;
1146  memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
1147  }
1148  status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1149  if (status < 0)
1150  return -1;
1151  av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1152  "Imode: %i, Invert: %i\n", status>>1, status&1);
1153 
1154  /* Hopefully this is correct for P frames */
1155  v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
1156  v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1157  } else if (v->fcm == ILACE_FRAME) { // frame interlaced
1158  v->qs_last = v->s.quarter_sample;
1159  v->s.quarter_sample = 1;
1160  v->s.mspel = 1;
1161  } else { // field interlaced
1162  mbmodetab = get_bits(gb, 3);
1163  imvtab = get_bits(gb, 2 + v->numref);
1164  if (!v->numref)
1165  v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[imvtab];
1166  else
1167  v->imv_vlc = &ff_vc1_2ref_mvdata_vlc[imvtab];
1168  icbptab = get_bits(gb, 3);
1169  v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
1170  if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1172  fourmvbptab = get_bits(gb, 2);
1173  v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
1174  v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[mbmodetab];
1175  } else {
1176  v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[mbmodetab];
1177  }
1178  }
1179  if (v->dquant) {
1180  av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1182  }
1183 
1184  v->ttfrm = 0; //FIXME Is that so ?
1185  if (v->vstransform) {
1186  v->ttmbf = get_bits1(gb);
1187  if (v->ttmbf) {
1188  v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1189  }
1190  } else {
1191  v->ttmbf = 1;
1192  v->ttfrm = TT_8X8;
1193  }
1194  break;
1195  case AV_PICTURE_TYPE_B:
1196  if (v->fcm == ILACE_FRAME) {
1199  if (v->bfraction == 0) {
1200  return -1;
1201  }
1202  }
1203  if (v->extended_mv)
1204  v->mvrange = get_unary(gb, 0, 3);
1205  else
1206  v->mvrange = 0;
1207  v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1208  v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1209  v->range_x = 1 << (v->k_x - 1);
1210  v->range_y = 1 << (v->k_y - 1);
1211 
1212  if (v->pq < 5)
1213  v->tt_index = 0;
1214  else if (v->pq < 13)
1215  v->tt_index = 1;
1216  else
1217  v->tt_index = 2;
1218 
1219  if (v->field_mode) {
1220  int mvmode;
1221  av_log(v->s.avctx, AV_LOG_DEBUG, "B Fields\n");
1222  if (v->extended_dmv)
1223  v->dmvrange = get_unary(gb, 0, 3);
1224  mvmode = get_unary(gb, 1, 3);
1225  lowquant = (v->pq > 12) ? 0 : 1;
1226  v->mv_mode = ff_vc1_mv_pmode_table2[lowquant][mvmode];
1227  v->qs_last = v->s.quarter_sample;
1230  status = bitplane_decoding(v->forward_mb_plane, &v->fmb_is_raw, v);
1231  if (status < 0)
1232  return -1;
1233  av_log(v->s.avctx, AV_LOG_DEBUG, "MB Forward Type plane encoding: "
1234  "Imode: %i, Invert: %i\n", status>>1, status&1);
1235  mbmodetab = get_bits(gb, 3);
1236  if (v->mv_mode == MV_PMODE_MIXED_MV)
1237  v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[mbmodetab];
1238  else
1239  v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[mbmodetab];
1240  imvtab = get_bits(gb, 3);
1241  v->imv_vlc = &ff_vc1_2ref_mvdata_vlc[imvtab];
1242  icbptab = get_bits(gb, 3);
1243  v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
1244  if (v->mv_mode == MV_PMODE_MIXED_MV) {
1245  fourmvbptab = get_bits(gb, 2);
1246  v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
1247  }
1248  v->numref = 1; // interlaced field B pictures are always 2-ref
1249  } else if (v->fcm == ILACE_FRAME) {
1250  if (v->extended_dmv)
1251  v->dmvrange = get_unary(gb, 0, 3);
1252  if (get_bits1(gb)) /* intcomp - present but shall always be 0 */
1253  av_log(v->s.avctx, AV_LOG_WARNING, "Intensity compensation set for B picture\n");
1254  v->intcomp = 0;
1255  v->mv_mode = MV_PMODE_1MV;
1256  v->fourmvswitch = 0;
1257  v->qs_last = v->s.quarter_sample;
1258  v->s.quarter_sample = 1;
1259  v->s.mspel = 1;
1260  status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1261  if (status < 0)
1262  return -1;
1263  av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1264  "Imode: %i, Invert: %i\n", status>>1, status&1);
1265  status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1266  if (status < 0)
1267  return -1;
1268  av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1269  "Imode: %i, Invert: %i\n", status>>1, status&1);
1270  mbmodetab = get_bits(gb, 2);
1271  v->mbmode_vlc = &ff_vc1_intfr_non4mv_mbmode_vlc[mbmodetab];
1272  imvtab = get_bits(gb, 2);
1273  v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[imvtab];
1274  // interlaced p/b-picture cbpcy range is [1, 63]
1275  icbptab = get_bits(gb, 3);
1276  v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[icbptab];
1277  twomvbptab = get_bits(gb, 2);
1278  v->twomvbp_vlc = &ff_vc1_2mv_block_pattern_vlc[twomvbptab];
1279  fourmvbptab = get_bits(gb, 2);
1280  v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[fourmvbptab];
1281  } else {
1283  v->qs_last = v->s.quarter_sample;
1284  v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
1285  v->s.mspel = v->s.quarter_sample;
1286  status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1287  if (status < 0)
1288  return -1;
1289  av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1290  "Imode: %i, Invert: %i\n", status>>1, status&1);
1291  status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1292  if (status < 0)
1293  return -1;
1294  av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1295  "Imode: %i, Invert: %i\n", status>>1, status&1);
1296  v->s.mv_table_index = get_bits(gb, 2);
1297  v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1298  }
1299 
1300  if (v->dquant) {
1301  av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1303  }
1304 
1305  v->ttfrm = 0;
1306  if (v->vstransform) {
1307  v->ttmbf = get_bits1(gb);
1308  if (v->ttmbf) {
1309  v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1310  }
1311  } else {
1312  v->ttmbf = 1;
1313  v->ttfrm = TT_8X8;
1314  }
1315  break;
1316  }
1317 
1318  if (v->fcm != PROGRESSIVE && !v->s.quarter_sample) {
1319  v->range_x <<= 1;
1320  v->range_y <<= 1;
1321  }
1322 
1323  /* AC Syntax */
1324  v->c_ac_table_index = decode012(gb);
1326  v->y_ac_table_index = decode012(gb);
1327  }
1328  /* DC Syntax */
1329  v->s.dc_table_index = get_bits1(gb);
1331  && v->dquant) {
1332  av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1334  }
1335 
1336  v->bi_type = 0;
1337  if (v->s.pict_type == AV_PICTURE_TYPE_BI) {
1339  v->bi_type = 1;
1340  }
1341  return 0;
1342 }
1343 
1344 static const uint32_t vc1_ac_tables[AC_MODES][186][2] = {
1345 {
1346 { 0x0001, 2}, { 0x0005, 3}, { 0x000D, 4}, { 0x0012, 5}, { 0x000E, 6}, { 0x0015, 7},
1347 { 0x0013, 8}, { 0x003F, 8}, { 0x004B, 9}, { 0x011F, 9}, { 0x00B8, 10}, { 0x03E3, 10},
1348 { 0x0172, 11}, { 0x024D, 12}, { 0x03DA, 12}, { 0x02DD, 13}, { 0x1F55, 13}, { 0x05B9, 14},
1349 { 0x3EAE, 14}, { 0x0000, 4}, { 0x0010, 5}, { 0x0008, 7}, { 0x0020, 8}, { 0x0029, 9},
1350 { 0x01F4, 9}, { 0x0233, 10}, { 0x01E0, 11}, { 0x012A, 12}, { 0x03DD, 12}, { 0x050A, 13},
1351 { 0x1F29, 13}, { 0x0A42, 14}, { 0x1272, 15}, { 0x1737, 15}, { 0x0003, 5}, { 0x0011, 7},
1352 { 0x00C4, 8}, { 0x004B, 10}, { 0x00B4, 11}, { 0x07D4, 11}, { 0x0345, 12}, { 0x02D7, 13},
1353 { 0x07BF, 13}, { 0x0938, 14}, { 0x0BBB, 14}, { 0x095E, 15}, { 0x0013, 5}, { 0x0078, 7},
1354 { 0x0069, 9}, { 0x0232, 10}, { 0x0461, 11}, { 0x03EC, 12}, { 0x0520, 13}, { 0x1F2A, 13},
1355 { 0x3E50, 14}, { 0x3E51, 14}, { 0x1486, 15}, { 0x000C, 6}, { 0x0024, 9}, { 0x0094, 11},
1356 { 0x08C0, 12}, { 0x0F09, 14}, { 0x1EF0, 15}, { 0x003D, 6}, { 0x0053, 9}, { 0x01A0, 11},
1357 { 0x02D6, 13}, { 0x0F08, 14}, { 0x0013, 7}, { 0x007C, 9}, { 0x07C1, 11}, { 0x04AC, 14},
1358 { 0x001B, 7}, { 0x00A0, 10}, { 0x0344, 12}, { 0x0F79, 14}, { 0x0079, 7}, { 0x03E1, 10},
1359 { 0x02D4, 13}, { 0x2306, 14}, { 0x0021, 8}, { 0x023C, 10}, { 0x0FAE, 12}, { 0x23DE, 14},
1360 { 0x0035, 8}, { 0x0175, 11}, { 0x07B3, 13}, { 0x00C5, 8}, { 0x0174, 11}, { 0x0785, 13},
1361 { 0x0048, 9}, { 0x01A3, 11}, { 0x049E, 13}, { 0x002C, 9}, { 0x00FA, 10}, { 0x07D6, 11},
1362 { 0x0092, 10}, { 0x05CC, 13}, { 0x1EF1, 15}, { 0x00A3, 10}, { 0x03ED, 12}, { 0x093E, 14},
1363 { 0x01E2, 11}, { 0x1273, 15}, { 0x07C4, 11}, { 0x1487, 15}, { 0x0291, 12}, { 0x0293, 12},
1364 { 0x0F8A, 12}, { 0x0509, 13}, { 0x0508, 13}, { 0x078D, 13}, { 0x07BE, 13}, { 0x078C, 13},
1365 { 0x04AE, 14}, { 0x0BBA, 14}, { 0x2307, 14}, { 0x0B9A, 14}, { 0x1736, 15}, { 0x000E, 4},
1366 { 0x0045, 7}, { 0x01F3, 9}, { 0x047A, 11}, { 0x05DC, 13}, { 0x23DF, 14}, { 0x0019, 5},
1367 { 0x0028, 9}, { 0x0176, 11}, { 0x049D, 13}, { 0x23DD, 14}, { 0x0030, 6}, { 0x00A2, 10},
1368 { 0x02EF, 12}, { 0x05B8, 14}, { 0x003F, 6}, { 0x00A5, 10}, { 0x03DB, 12}, { 0x093F, 14},
1369 { 0x0044, 7}, { 0x07CB, 11}, { 0x095F, 15}, { 0x0063, 7}, { 0x03C3, 12}, { 0x0015, 8},
1370 { 0x08F6, 12}, { 0x0017, 8}, { 0x0498, 13}, { 0x002C, 8}, { 0x07B2, 13}, { 0x002F, 8},
1371 { 0x1F54, 13}, { 0x008D, 8}, { 0x07BD, 13}, { 0x008E, 8}, { 0x1182, 13}, { 0x00FB, 8},
1372 { 0x050B, 13}, { 0x002D, 8}, { 0x07C0, 11}, { 0x0079, 9}, { 0x1F5F, 13}, { 0x007A, 9},
1373 { 0x1F56, 13}, { 0x0231, 10}, { 0x03E4, 10}, { 0x01A1, 11}, { 0x0143, 11}, { 0x01F7, 11},
1374 { 0x016F, 12}, { 0x0292, 12}, { 0x02E7, 12}, { 0x016C, 12}, { 0x016D, 12}, { 0x03DC, 12},
1375 { 0x0F8B, 12}, { 0x0499, 13}, { 0x03D8, 12}, { 0x078E, 13}, { 0x02D5, 13}, { 0x1F5E, 13},
1376 { 0x1F2B, 13}, { 0x078F, 13}, { 0x04AD, 14}, { 0x3EAF, 14}, { 0x23DC, 14}, { 0x004A, 9}
1377 },
1378 {
1379 { 0x0000, 3}, { 0x0003, 4}, { 0x000B, 5}, { 0x0014, 6}, { 0x003F, 6}, { 0x005D, 7},
1380 { 0x00A2, 8}, { 0x00AC, 9}, { 0x016E, 9}, { 0x020A, 10}, { 0x02E2, 10}, { 0x0432, 11},
1381 { 0x05C9, 11}, { 0x0827, 12}, { 0x0B54, 12}, { 0x04E6, 13}, { 0x105F, 13}, { 0x172A, 13},
1382 { 0x20B2, 14}, { 0x2D4E, 14}, { 0x39F0, 14}, { 0x4175, 15}, { 0x5A9E, 15}, { 0x0004, 4},
1383 { 0x001E, 5}, { 0x0042, 7}, { 0x00B6, 8}, { 0x0173, 9}, { 0x0395, 10}, { 0x072E, 11},
1384 { 0x0B94, 12}, { 0x16A4, 13}, { 0x20B3, 14}, { 0x2E45, 14}, { 0x0005, 5}, { 0x0040, 7},
1385 { 0x0049, 9}, { 0x028F, 10}, { 0x05CB, 11}, { 0x048A, 13}, { 0x09DD, 14}, { 0x73E2, 15},
1386 { 0x0018, 5}, { 0x0025, 8}, { 0x008A, 10}, { 0x051B, 11}, { 0x0E5F, 12}, { 0x09C9, 14},
1387 { 0x139C, 15}, { 0x0029, 6}, { 0x004F, 9}, { 0x0412, 11}, { 0x048D, 13}, { 0x2E41, 14},
1388 { 0x0038, 6}, { 0x010E, 9}, { 0x05A8, 11}, { 0x105C, 13}, { 0x39F2, 14}, { 0x0058, 7},
1389 { 0x021F, 10}, { 0x0E7E, 12}, { 0x39FF, 14}, { 0x0023, 8}, { 0x02E3, 10}, { 0x04E5, 13},
1390 { 0x2E40, 14}, { 0x00A1, 8}, { 0x05BE, 11}, { 0x09C8, 14}, { 0x0083, 8}, { 0x013A, 11},
1391 { 0x1721, 13}, { 0x0044, 9}, { 0x0276, 12}, { 0x39F6, 14}, { 0x008B, 10}, { 0x04EF, 13},
1392 { 0x5A9B, 15}, { 0x0208, 10}, { 0x1CFE, 13}, { 0x0399, 10}, { 0x1CB4, 13}, { 0x039E, 10},
1393 { 0x39F3, 14}, { 0x05AB, 11}, { 0x73E3, 15}, { 0x0737, 11}, { 0x5A9F, 15}, { 0x082D, 12},
1394 { 0x0E69, 12}, { 0x0E68, 12}, { 0x0433, 11}, { 0x0B7B, 12}, { 0x2DF8, 14}, { 0x2E56, 14},
1395 { 0x2E57, 14}, { 0x39F7, 14}, { 0x51A5, 15}, { 0x0003, 3}, { 0x002A, 6}, { 0x00E4, 8},
1396 { 0x028E, 10}, { 0x0735, 11}, { 0x1058, 13}, { 0x1CFA, 13}, { 0x2DF9, 14}, { 0x4174, 15},
1397 { 0x0009, 4}, { 0x0054, 8}, { 0x0398, 10}, { 0x048B, 13}, { 0x139D, 15}, { 0x000D, 4},
1398 { 0x00AD, 9}, { 0x0826, 12}, { 0x2D4C, 14}, { 0x0011, 5}, { 0x016B, 9}, { 0x0B7F, 12},
1399 { 0x51A4, 15}, { 0x0019, 5}, { 0x021B, 10}, { 0x16FD, 13}, { 0x001D, 5}, { 0x0394, 10},
1400 { 0x28D3, 14}, { 0x002B, 6}, { 0x05BC, 11}, { 0x5A9A, 15}, { 0x002F, 6}, { 0x0247, 12},
1401 { 0x0010, 7}, { 0x0A35, 12}, { 0x003E, 6}, { 0x0B7A, 12}, { 0x0059, 7}, { 0x105E, 13},
1402 { 0x0026, 8}, { 0x09CF, 14}, { 0x0055, 8}, { 0x1CB5, 13}, { 0x0057, 8}, { 0x0E5B, 12},
1403 { 0x00A0, 8}, { 0x1468, 13}, { 0x0170, 9}, { 0x0090, 10}, { 0x01CE, 9}, { 0x021A, 10},
1404 { 0x0218, 10}, { 0x0168, 9}, { 0x021E, 10}, { 0x0244, 12}, { 0x0736, 11}, { 0x0138, 11},
1405 { 0x0519, 11}, { 0x0E5E, 12}, { 0x072C, 11}, { 0x0B55, 12}, { 0x09DC, 14}, { 0x20BB, 14},
1406 { 0x048C, 13}, { 0x1723, 13}, { 0x2E44, 14}, { 0x16A5, 13}, { 0x0518, 11}, { 0x39FE, 14},
1407 { 0x0169, 9}
1408 },
1409 {
1410 { 0x0001, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x0016, 5}, { 0x0020, 6}, { 0x0018, 7},
1411 { 0x0008, 8}, { 0x009A, 8}, { 0x0056, 9}, { 0x013E, 9}, { 0x00F0, 10}, { 0x03A5, 10},
1412 { 0x0077, 11}, { 0x01EF, 11}, { 0x009A, 12}, { 0x005D, 13}, { 0x0001, 4}, { 0x0011, 5},
1413 { 0x0002, 7}, { 0x000B, 8}, { 0x0012, 9}, { 0x01D6, 9}, { 0x027E, 10}, { 0x0191, 11},
1414 { 0x00EA, 12}, { 0x03DC, 12}, { 0x013B, 13}, { 0x0004, 5}, { 0x0014, 7}, { 0x009E, 8},
1415 { 0x0009, 10}, { 0x01AC, 11}, { 0x01E2, 11}, { 0x03CA, 12}, { 0x005F, 13}, { 0x0017, 5},
1416 { 0x004E, 7}, { 0x005E, 9}, { 0x00F3, 10}, { 0x01AD, 11}, { 0x00EC, 12}, { 0x05F0, 13},
1417 { 0x000E, 6}, { 0x00E1, 8}, { 0x03A4, 10}, { 0x009C, 12}, { 0x013D, 13}, { 0x003B, 6},
1418 { 0x001C, 9}, { 0x0014, 11}, { 0x09BE, 12}, { 0x0006, 7}, { 0x007A, 9}, { 0x0190, 11},
1419 { 0x0137, 13}, { 0x001B, 7}, { 0x0008, 10}, { 0x075C, 11}, { 0x0071, 7}, { 0x00D7, 10},
1420 { 0x09BF, 12}, { 0x0007, 8}, { 0x00AF, 10}, { 0x04CC, 11}, { 0x0034, 8}, { 0x0265, 10},
1421 { 0x009F, 12}, { 0x00E0, 8}, { 0x0016, 11}, { 0x0327, 12}, { 0x0015, 9}, { 0x017D, 11},
1422 { 0x0EBB, 12}, { 0x0014, 9}, { 0x00F6, 10}, { 0x01E4, 11}, { 0x00CB, 10}, { 0x099D, 12},
1423 { 0x00CA, 10}, { 0x02FC, 12}, { 0x017F, 11}, { 0x04CD, 11}, { 0x02FD, 12}, { 0x04FE, 11},
1424 { 0x013A, 13}, { 0x000A, 4}, { 0x0042, 7}, { 0x01D3, 9}, { 0x04DD, 11}, { 0x0012, 5},
1425 { 0x00E8, 8}, { 0x004C, 11}, { 0x0136, 13}, { 0x0039, 6}, { 0x0264, 10}, { 0x0EBA, 12},
1426 { 0x0000, 7}, { 0x00AE, 10}, { 0x099C, 12}, { 0x001F, 7}, { 0x04DE, 11}, { 0x0043, 7},
1427 { 0x04DC, 11}, { 0x0003, 8}, { 0x03CB, 12}, { 0x0006, 8}, { 0x099E, 12}, { 0x002A, 8},
1428 { 0x05F1, 13}, { 0x000F, 8}, { 0x09FE, 12}, { 0x0033, 8}, { 0x09FF, 12}, { 0x0098, 8},
1429 { 0x099F, 12}, { 0x00EA, 8}, { 0x013C, 13}, { 0x002E, 8}, { 0x0192, 11}, { 0x0136, 9},
1430 { 0x006A, 9}, { 0x0015, 11}, { 0x03AF, 10}, { 0x01E3, 11}, { 0x0074, 11}, { 0x00EB, 12},
1431 { 0x02F9, 12}, { 0x005C, 13}, { 0x00ED, 12}, { 0x03DD, 12}, { 0x0326, 12}, { 0x005E, 13},
1432 { 0x0016, 7}
1433 },
1434 {
1435 { 0x0004, 3}, { 0x0014, 5}, { 0x0017, 7}, { 0x007F, 8}, { 0x0154, 9}, { 0x01F2, 10},
1436 { 0x00BF, 11}, { 0x0065, 12}, { 0x0AAA, 12}, { 0x0630, 13}, { 0x1597, 13}, { 0x03B7, 14},
1437 { 0x2B22, 14}, { 0x0BE6, 15}, { 0x000B, 4}, { 0x0037, 7}, { 0x0062, 9}, { 0x0007, 11},
1438 { 0x0166, 12}, { 0x00CE, 13}, { 0x1590, 13}, { 0x05F6, 14}, { 0x0BE7, 15}, { 0x0007, 5},
1439 { 0x006D, 8}, { 0x0003, 11}, { 0x031F, 12}, { 0x05F2, 14}, { 0x0002, 6}, { 0x0061, 9},
1440 { 0x0055, 12}, { 0x01DF, 14}, { 0x001A, 6}, { 0x001E, 10}, { 0x0AC9, 12}, { 0x2B23, 14},
1441 { 0x001E, 6}, { 0x001F, 10}, { 0x0AC3, 12}, { 0x2B2B, 14}, { 0x0006, 7}, { 0x0004, 11},
1442 { 0x02F8, 13}, { 0x0019, 7}, { 0x0006, 11}, { 0x063D, 13}, { 0x0057, 7}, { 0x0182, 11},
1443 { 0x2AA2, 14}, { 0x0004, 8}, { 0x0180, 11}, { 0x059C, 14}, { 0x007D, 8}, { 0x0164, 12},
1444 { 0x076D, 15}, { 0x0002, 9}, { 0x018D, 11}, { 0x1581, 13}, { 0x00AD, 8}, { 0x0060, 12},
1445 { 0x0C67, 14}, { 0x001C, 9}, { 0x00EE, 13}, { 0x0003, 9}, { 0x02CF, 13}, { 0x00D9, 9},
1446 { 0x1580, 13}, { 0x0002, 11}, { 0x0183, 11}, { 0x0057, 12}, { 0x0061, 12}, { 0x0031, 11},
1447 { 0x0066, 12}, { 0x0631, 13}, { 0x0632, 13}, { 0x00AC, 13}, { 0x031D, 12}, { 0x0076, 12},
1448 { 0x003A, 11}, { 0x0165, 12}, { 0x0C66, 14}, { 0x0003, 2}, { 0x0054, 7}, { 0x02AB, 10},
1449 { 0x0016, 13}, { 0x05F7, 14}, { 0x0005, 4}, { 0x00F8, 9}, { 0x0AA9, 12}, { 0x005F, 15},
1450 { 0x0004, 4}, { 0x001C, 10}, { 0x1550, 13}, { 0x0004, 5}, { 0x0077, 11}, { 0x076C, 15},
1451 { 0x000E, 5}, { 0x000A, 12}, { 0x000C, 5}, { 0x0562, 11}, { 0x0004, 6}, { 0x031C, 12},
1452 { 0x0006, 6}, { 0x00C8, 13}, { 0x000D, 6}, { 0x01DA, 13}, { 0x0007, 6}, { 0x00C9, 13},
1453 { 0x0001, 7}, { 0x002E, 14}, { 0x0014, 7}, { 0x1596, 13}, { 0x000A, 7}, { 0x0AC2, 12},
1454 { 0x0016, 7}, { 0x015B, 14}, { 0x0015, 7}, { 0x015A, 14}, { 0x000F, 8}, { 0x005E, 15},
1455 { 0x007E, 8}, { 0x00AB, 8}, { 0x002D, 9}, { 0x00D8, 9}, { 0x000B, 9}, { 0x0014, 10},
1456 { 0x02B3, 10}, { 0x01F3, 10}, { 0x003A, 10}, { 0x0000, 10}, { 0x0058, 10}, { 0x002E, 9},
1457 { 0x005E, 10}, { 0x0563, 11}, { 0x00EC, 12}, { 0x0054, 12}, { 0x0AC1, 12}, { 0x1556, 13},
1458 { 0x02FA, 13}, { 0x0181, 11}, { 0x1557, 13}, { 0x059D, 14}, { 0x2AA3, 14}, { 0x2B2A, 14},
1459 { 0x01DE, 14}, { 0x063C, 13}, { 0x00CF, 13}, { 0x1594, 13}, { 0x000D, 9}
1460 },
1461 {
1462 { 0x0002, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x000D, 5}, { 0x000C, 5}, { 0x0015, 6},
1463 { 0x0013, 6}, { 0x0012, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x001E, 8}, { 0x001D, 8},
1464 { 0x0025, 9}, { 0x0024, 9}, { 0x0023, 9}, { 0x0021, 9}, { 0x0021, 10}, { 0x0020, 10},
1465 { 0x000F, 10}, { 0x000E, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11}, { 0x0021, 11},
1466 { 0x0050, 12}, { 0x0051, 12}, { 0x0052, 12}, { 0x000E, 4}, { 0x0014, 6}, { 0x0016, 7},
1467 { 0x001C, 8}, { 0x0020, 9}, { 0x001F, 9}, { 0x000D, 10}, { 0x0022, 11}, { 0x0053, 12},
1468 { 0x0055, 12}, { 0x000B, 5}, { 0x0015, 7}, { 0x001E, 9}, { 0x000C, 10}, { 0x0056, 12},
1469 { 0x0011, 6}, { 0x001B, 8}, { 0x001D, 9}, { 0x000B, 10}, { 0x0010, 6}, { 0x0022, 9},
1470 { 0x000A, 10}, { 0x000D, 6}, { 0x001C, 9}, { 0x0008, 10}, { 0x0012, 7}, { 0x001B, 9},
1471 { 0x0054, 12}, { 0x0014, 7}, { 0x001A, 9}, { 0x0057, 12}, { 0x0019, 8}, { 0x0009, 10},
1472 { 0x0018, 8}, { 0x0023, 11}, { 0x0017, 8}, { 0x0019, 9}, { 0x0018, 9}, { 0x0007, 10},
1473 { 0x0058, 12}, { 0x0007, 4}, { 0x000C, 6}, { 0x0016, 8}, { 0x0017, 9}, { 0x0006, 10},
1474 { 0x0005, 11}, { 0x0004, 11}, { 0x0059, 12}, { 0x000F, 6}, { 0x0016, 9}, { 0x0005, 10},
1475 { 0x000E, 6}, { 0x0004, 10}, { 0x0011, 7}, { 0x0024, 11}, { 0x0010, 7}, { 0x0025, 11},
1476 { 0x0013, 7}, { 0x005A, 12}, { 0x0015, 8}, { 0x005B, 12}, { 0x0014, 8}, { 0x0013, 8},
1477 { 0x001A, 8}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9}, { 0x0012, 9}, { 0x0011, 9},
1478 { 0x0026, 11}, { 0x0027, 11}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12},
1479 { 0x0003, 7}
1480 },
1481 {
1482 { 0x0002, 2}, { 0x000F, 4}, { 0x0015, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x0025, 9},
1483 { 0x0024, 9}, { 0x0021, 10}, { 0x0020, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11},
1484 { 0x0006, 3}, { 0x0014, 6}, { 0x001E, 8}, { 0x000F, 10}, { 0x0021, 11}, { 0x0050, 12},
1485 { 0x000E, 4}, { 0x001D, 8}, { 0x000E, 10}, { 0x0051, 12}, { 0x000D, 5}, { 0x0023, 9},
1486 { 0x000D, 10}, { 0x000C, 5}, { 0x0022, 9}, { 0x0052, 12}, { 0x000B, 5}, { 0x000C, 10},
1487 { 0x0053, 12}, { 0x0013, 6}, { 0x000B, 10}, { 0x0054, 12}, { 0x0012, 6}, { 0x000A, 10},
1488 { 0x0011, 6}, { 0x0009, 10}, { 0x0010, 6}, { 0x0008, 10}, { 0x0016, 7}, { 0x0055, 12},
1489 { 0x0015, 7}, { 0x0014, 7}, { 0x001C, 8}, { 0x001B, 8}, { 0x0021, 9}, { 0x0020, 9},
1490 { 0x001F, 9}, { 0x001E, 9}, { 0x001D, 9}, { 0x001C, 9}, { 0x001B, 9}, { 0x001A, 9},
1491 { 0x0022, 11}, { 0x0023, 11}, { 0x0056, 12}, { 0x0057, 12}, { 0x0007, 4}, { 0x0019, 9},
1492 { 0x0005, 11}, { 0x000F, 6}, { 0x0004, 11}, { 0x000E, 6}, { 0x000D, 6}, { 0x000C, 6},
1493 { 0x0013, 7}, { 0x0012, 7}, { 0x0011, 7}, { 0x0010, 7}, { 0x001A, 8}, { 0x0019, 8},
1494 { 0x0018, 8}, { 0x0017, 8}, { 0x0016, 8}, { 0x0015, 8}, { 0x0014, 8}, { 0x0013, 8},
1495 { 0x0018, 9}, { 0x0017, 9}, { 0x0016, 9}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9},
1496 { 0x0012, 9}, { 0x0011, 9}, { 0x0007, 10}, { 0x0006, 10}, { 0x0005, 10}, { 0x0004, 10},
1497 { 0x0024, 11}, { 0x0025, 11}, { 0x0026, 11}, { 0x0027, 11}, { 0x0058, 12}, { 0x0059, 12},
1498 { 0x005A, 12}, { 0x005B, 12}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12},
1499 { 0x0003, 7}
1500 },
1501 {
1502 { 0x0000, 2}, { 0x0003, 3}, { 0x000D, 4}, { 0x0005, 4}, { 0x001C, 5}, { 0x0016, 5},
1503 { 0x003F, 6}, { 0x003A, 6}, { 0x002E, 6}, { 0x0022, 6}, { 0x007B, 7}, { 0x0067, 7},
1504 { 0x005F, 7}, { 0x0047, 7}, { 0x0026, 7}, { 0x00EF, 8}, { 0x00CD, 8}, { 0x00C1, 8},
1505 { 0x00A9, 8}, { 0x004F, 8}, { 0x01F2, 9}, { 0x01DD, 9}, { 0x0199, 9}, { 0x0185, 9},
1506 { 0x015D, 9}, { 0x011B, 9}, { 0x03EF, 10}, { 0x03E1, 10}, { 0x03C8, 10}, { 0x0331, 10},
1507 { 0x0303, 10}, { 0x02F1, 10}, { 0x02A0, 10}, { 0x0233, 10}, { 0x0126, 10}, { 0x07C0, 11},
1508 { 0x076F, 11}, { 0x076C, 11}, { 0x0661, 11}, { 0x0604, 11}, { 0x0572, 11}, { 0x0551, 11},
1509 { 0x046A, 11}, { 0x0274, 11}, { 0x0F27, 12}, { 0x0F24, 12}, { 0x0EDB, 12}, { 0x0C8E, 12},
1510 { 0x0C0B, 12}, { 0x0C0A, 12}, { 0x0AE3, 12}, { 0x08D6, 12}, { 0x0490, 12}, { 0x0495, 12},
1511 { 0x1F19, 13}, { 0x1DB5, 13}, { 0x0009, 4}, { 0x0010, 5}, { 0x0029, 6}, { 0x0062, 7},
1512 { 0x00F3, 8}, { 0x00AD, 8}, { 0x01E5, 9}, { 0x0179, 9}, { 0x009C, 9}, { 0x03B1, 10},
1513 { 0x02AE, 10}, { 0x0127, 10}, { 0x076E, 11}, { 0x0570, 11}, { 0x0275, 11}, { 0x0F25, 12},
1514 { 0x0EC0, 12}, { 0x0AA0, 12}, { 0x08D7, 12}, { 0x1E4C, 13}, { 0x0008, 5}, { 0x0063, 7},
1515 { 0x00AF, 8}, { 0x017B, 9}, { 0x03B3, 10}, { 0x07DD, 11}, { 0x0640, 11}, { 0x0F8D, 12},
1516 { 0x0BC1, 12}, { 0x0491, 12}, { 0x0028, 6}, { 0x00C3, 8}, { 0x0151, 9}, { 0x02A1, 10},
1517 { 0x0573, 11}, { 0x0EC3, 12}, { 0x1F35, 13}, { 0x0065, 7}, { 0x01DA, 9}, { 0x02AF, 10},
1518 { 0x0277, 11}, { 0x08C9, 12}, { 0x1781, 13}, { 0x0025, 7}, { 0x0118, 9}, { 0x0646, 11},
1519 { 0x0AA6, 12}, { 0x1780, 13}, { 0x00C9, 8}, { 0x0321, 10}, { 0x0F9B, 12}, { 0x191E, 13},
1520 { 0x0048, 8}, { 0x07CC, 11}, { 0x0AA1, 12}, { 0x0180, 9}, { 0x0465, 11}, { 0x1905, 13},
1521 { 0x03E2, 10}, { 0x0EC1, 12}, { 0x3C9B, 14}, { 0x02F4, 10}, { 0x08C8, 12}, { 0x07C1, 11},
1522 { 0x0928, 13}, { 0x05E1, 11}, { 0x320D, 14}, { 0x0EC2, 12}, { 0x6418, 15}, { 0x1F34, 13},
1523 { 0x0078, 7}, { 0x0155, 9}, { 0x0552, 11}, { 0x191F, 13}, { 0x00FA, 8}, { 0x07DC, 11},
1524 { 0x1907, 13}, { 0x00AC, 8}, { 0x0249, 11}, { 0x13B1, 14}, { 0x01F6, 9}, { 0x0AE2, 12},
1525 { 0x01DC, 9}, { 0x04ED, 12}, { 0x0184, 9}, { 0x1904, 13}, { 0x0156, 9}, { 0x09D9, 13},
1526 { 0x03E7, 10}, { 0x0929, 13}, { 0x03B2, 10}, { 0x3B68, 14}, { 0x02F5, 10}, { 0x13B0, 14},
1527 { 0x0322, 10}, { 0x3B69, 14}, { 0x0234, 10}, { 0x7935, 15}, { 0x07C7, 11}, { 0xC833, 16},
1528 { 0x0660, 11}, { 0x7934, 15}, { 0x024B, 11}, { 0xC832, 16}, { 0x0AA7, 12}, { 0x1F18, 13},
1529 { 0x007A, 7}
1530 },
1531 {
1532 { 0x0002, 2}, { 0x0000, 3}, { 0x001E, 5}, { 0x0004, 5}, { 0x0012, 6}, { 0x0070, 7},
1533 { 0x001A, 7}, { 0x005F, 8}, { 0x0047, 8}, { 0x01D3, 9}, { 0x00B5, 9}, { 0x0057, 9},
1534 { 0x03B5, 10}, { 0x016D, 10}, { 0x0162, 10}, { 0x07CE, 11}, { 0x0719, 11}, { 0x0691, 11},
1535 { 0x02C6, 11}, { 0x0156, 11}, { 0x0F92, 12}, { 0x0D2E, 12}, { 0x0D20, 12}, { 0x059E, 12},
1536 { 0x0468, 12}, { 0x02A6, 12}, { 0x1DA2, 13}, { 0x1C60, 13}, { 0x1A43, 13}, { 0x0B1D, 13},
1537 { 0x08C0, 13}, { 0x055D, 13}, { 0x0003, 3}, { 0x000A, 5}, { 0x0077, 7}, { 0x00E5, 8},
1538 { 0x01D9, 9}, { 0x03E5, 10}, { 0x0166, 10}, { 0x0694, 11}, { 0x0152, 11}, { 0x059F, 12},
1539 { 0x1F3C, 13}, { 0x1A4B, 13}, { 0x055E, 13}, { 0x000C, 4}, { 0x007D, 7}, { 0x0044, 8},
1540 { 0x03E0, 10}, { 0x0769, 11}, { 0x0E31, 12}, { 0x1F26, 13}, { 0x055C, 13}, { 0x001B, 5},
1541 { 0x00E2, 8}, { 0x03A5, 10}, { 0x02C9, 11}, { 0x1F23, 13}, { 0x3B47, 14}, { 0x0007, 5},
1542 { 0x01D8, 9}, { 0x02D8, 11}, { 0x1F27, 13}, { 0x3494, 14}, { 0x0035, 6}, { 0x03E1, 10},
1543 { 0x059C, 12}, { 0x38C3, 14}, { 0x000C, 6}, { 0x0165, 10}, { 0x1D23, 13}, { 0x1638, 14},
1544 { 0x0068, 7}, { 0x0693, 11}, { 0x3A45, 14}, { 0x0020, 7}, { 0x0F90, 12}, { 0x7CF6, 15},
1545 { 0x00E8, 8}, { 0x058F, 12}, { 0x2CEF, 15}, { 0x0045, 8}, { 0x0B3A, 13}, { 0x01F1, 9},
1546 { 0x3B46, 14}, { 0x01A7, 9}, { 0x1676, 14}, { 0x0056, 9}, { 0x692A, 15}, { 0x038D, 10},
1547 { 0xE309, 16}, { 0x00AA, 10}, { 0x1C611, 17}, { 0x02DF, 11}, { 0xB3B9, 17}, { 0x02C8, 11},
1548 { 0x38C20, 18}, { 0x01B0, 11}, { 0x16390, 18}, { 0x0F9F, 12}, { 0x16771, 18}, { 0x0ED0, 12},
1549 { 0x71843, 19}, { 0x0D2A, 12}, { 0xF9E8C, 20}, { 0x0461, 12}, { 0xF9E8E, 20}, { 0x0B67, 13},
1550 { 0x055F, 13}, { 0x003F, 6}, { 0x006D, 9}, { 0x0E90, 12}, { 0x054E, 13}, { 0x0013, 6},
1551 { 0x0119, 10}, { 0x0B66, 13}, { 0x000B, 6}, { 0x0235, 11}, { 0x7CF5, 15}, { 0x0075, 7},
1552 { 0x0D24, 12}, { 0xF9E9, 16}, { 0x002E, 7}, { 0x1F22, 13}, { 0x0021, 7}, { 0x054F, 13},
1553 { 0x0014, 7}, { 0x3A44, 14}, { 0x00E4, 8}, { 0x7CF7, 15}, { 0x005E, 8}, { 0x7185, 15},
1554 { 0x0037, 8}, { 0x2C73, 15}, { 0x01DB, 9}, { 0x59DD, 16}, { 0x01C7, 9}, { 0x692B, 15},
1555 { 0x01A6, 9}, { 0x58E5, 16}, { 0x00B4, 9}, { 0x1F3D0, 17}, { 0x00B0, 9}, { 0xB1C9, 17},
1556 { 0x03E6, 10}, { 0x16770, 18}, { 0x016E, 10}, { 0x3E7A2, 18}, { 0x011B, 10}, { 0xF9E8D, 20},
1557 { 0x00D9, 10}, { 0xF9E8F, 20}, { 0x00A8, 10}, { 0x2C723, 19}, { 0x0749, 11}, { 0xE3084, 20},
1558 { 0x0696, 11}, { 0x58E45, 20}, { 0x02DE, 11}, { 0xB1C88, 21}, { 0x0231, 11}, { 0x1C610A, 21},
1559 { 0x01B1, 11}, { 0x71842D, 23}, { 0x0D2B, 12}, { 0x38C217, 22}, { 0x0D2F, 12}, { 0x163913, 22},
1560 { 0x05B2, 12}, { 0x163912, 22}, { 0x0469, 12}, { 0x71842C, 23}, { 0x1A42, 13}, { 0x08C1, 13},
1561 { 0x0073, 7}
1562 }
1563 };
1564 
1565 static const uint16_t vlc_offs[] = {
1566  0, 520, 552, 616, 1128, 1160, 1224, 1740, 1772, 1836, 1900, 2436,
1567  2986, 3050, 3610, 4154, 4218, 4746, 5326, 5390, 5902, 6554, 7658, 8342,
1568  9304, 9988, 10630, 11234, 12174, 13006, 13560, 14232, 14786, 15432, 16350, 17522,
1569  20372, 21818, 22330, 22394, 23166, 23678, 23742, 24820, 25332, 25396, 26460, 26980,
1570  27048, 27592, 27600, 27608, 27616, 27624, 28224, 28258, 28290, 28802, 28834, 28866,
1571  29378, 29412, 29444, 29960, 29994, 30026, 30538, 30572, 30604, 31120, 31154, 31186,
1572  31714, 31746, 31778, 32306, 32340, 32372
1573 };
1574 
1575 /**
1576  * Init VC-1 specific tables and VC1Context members
1577  * @param v The VC1Context to initialize
1578  * @return Status
1579  */
1581 {
1582  static int done = 0;
1583  int i = 0;
1584  static VLC_TYPE vlc_table[32372][2];
1585 
1586  v->hrd_rate = v->hrd_buffer = NULL;
1587 
1588  /* VLC tables */
1589  if (!done) {
1591  ff_vc1_bfraction_bits, 1, 1,
1594  ff_vc1_norm2_bits, 1, 1,
1597  ff_vc1_norm6_bits, 1, 1,
1598  ff_vc1_norm6_codes, 2, 2, 556);
1600  ff_vc1_imode_bits, 1, 1,
1602  for (i = 0; i < 3; i++) {
1603  ff_vc1_ttmb_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 0]];
1604  ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i * 3 + 1] - vlc_offs[i * 3 + 0];
1606  ff_vc1_ttmb_bits[i], 1, 1,
1608  ff_vc1_ttblk_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 1]];
1609  ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i * 3 + 2] - vlc_offs[i * 3 + 1];
1611  ff_vc1_ttblk_bits[i], 1, 1,
1613  ff_vc1_subblkpat_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 2]];
1614  ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i * 3 + 3] - vlc_offs[i * 3 + 2];
1616  ff_vc1_subblkpat_bits[i], 1, 1,
1618  }
1619  for (i = 0; i < 4; i++) {
1620  ff_vc1_4mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 9]];
1621  ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i * 3 + 10] - vlc_offs[i * 3 + 9];
1625  ff_vc1_cbpcy_p_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 10]];
1626  ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i * 3 + 11] - vlc_offs[i * 3 + 10];
1628  ff_vc1_cbpcy_p_bits[i], 1, 1,
1630  ff_vc1_mv_diff_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 11]];
1631  ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i * 3 + 12] - vlc_offs[i * 3 + 11];
1633  ff_vc1_mv_diff_bits[i], 1, 1,
1635  }
1636  for (i = 0; i < 8; i++) {
1637  ff_vc1_ac_coeff_table[i].table = &vlc_table[vlc_offs[i * 2 + 21]];
1638  ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i * 2 + 22] - vlc_offs[i * 2 + 21];
1640  &vc1_ac_tables[i][0][1], 8, 4,
1641  &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC);
1642  /* initialize interlaced MVDATA tables (2-Ref) */
1643  ff_vc1_2ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 2 + 22]];
1644  ff_vc1_2ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 2 + 23] - vlc_offs[i * 2 + 22];
1646  ff_vc1_2ref_mvdata_bits[i], 1, 1,
1648  }
1649  for (i = 0; i < 4; i++) {
1650  /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */
1651  ff_vc1_intfr_4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 37]];
1652  ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 38] - vlc_offs[i * 3 + 37];
1656  /* initialize NON-4MV MBMODE VLC tables for the same */
1657  ff_vc1_intfr_non4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 38]];
1658  ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 39] - vlc_offs[i * 3 + 38];
1662  /* initialize interlaced MVDATA tables (1-Ref) */
1663  ff_vc1_1ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 39]];
1664  ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 3 + 40] - vlc_offs[i * 3 + 39];
1666  ff_vc1_1ref_mvdata_bits[i], 1, 1,
1668  }
1669  for (i = 0; i < 4; i++) {
1670  /* Initialize 2MV Block pattern VLC tables */
1671  ff_vc1_2mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i + 49]];
1672  ff_vc1_2mv_block_pattern_vlc[i].table_allocated = vlc_offs[i + 50] - vlc_offs[i + 49];
1676  }
1677  for (i = 0; i < 8; i++) {
1678  /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */
1679  ff_vc1_icbpcy_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 53]];
1680  ff_vc1_icbpcy_vlc[i].table_allocated = vlc_offs[i * 3 + 54] - vlc_offs[i * 3 + 53];
1682  ff_vc1_icbpcy_p_bits[i], 1, 1,
1684  /* Initialize interlaced field picture MBMODE VLC tables */
1685  ff_vc1_if_mmv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 54]];
1686  ff_vc1_if_mmv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 55] - vlc_offs[i * 3 + 54];
1688  ff_vc1_if_mmv_mbmode_bits[i], 1, 1,
1690  ff_vc1_if_1mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 55]];
1691  ff_vc1_if_1mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 56] - vlc_offs[i * 3 + 55];
1693  ff_vc1_if_1mv_mbmode_bits[i], 1, 1,
1695  }
1696  done = 1;
1697  }
1698 
1699  /* Other defaults */
1700  v->pq = -1;
1701  v->mvrange = 0; /* 7.1.1.18, p80 */
1702 
1703  return 0;
1704 }