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