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