]> git.sesse.net Git - ffmpeg/blob - libavcodec/vc1.c
doc/APIchanges: Correct function reference.
[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
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);
113     imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1);
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) {
135             code = get_vlc2(gb, ff_vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1);
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) {
155                     code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 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) {
175                     code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
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  */
234 static int vop_dquant_decoding(VC1Context *v)
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) {
251             case DQPROFILE_SINGLE_EDGE:
252             case DQPROFILE_DOUBLE_EDGES:
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
274 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb);
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  */
283 int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
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) {
292         v->zz_8x4 = ff_vc1_adv_progressive_8x4_zz;
293         v->zz_4x8 = ff_vc1_adv_progressive_4x8_zz;
294         return decode_sequence_header_adv(v, gb);
295     } else {
296         v->chromaformat = 1;
297         v->zz_8x4 = ff_wmv2_scantableA;
298         v->zz_4x8 = ff_wmv2_scantableB;
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     }
317     if (v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
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) {
324         v->vc1dsp.vc1_inv_trans_8x8    = ff_simple_idct_8;
325         v->vc1dsp.vc1_inv_trans_8x4    = ff_simple_idct84_add;
326         v->vc1dsp.vc1_inv_trans_4x8    = ff_simple_idct48_add;
327         v->vc1dsp.vc1_inv_trans_4x4    = ff_simple_idct44_add;
328         v->vc1dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add_8;
329         v->vc1dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
330         v->vc1dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
331         v->vc1dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
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",
404            v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
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
411 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
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) {
420         av_log(v->s.avctx, AV_LOG_ERROR,
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
439     av_log(v->s.avctx, AV_LOG_DEBUG,
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",
443            v->level, v->frmrtq_postproc, v->bitrtq_postproc,
444            v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
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) {
462             v->s.avctx->sample_aspect_ratio = ff_vc1_pixel_aspect[ar];
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 {
468             av_reduce(&v->s.avctx->sample_aspect_ratio.num,
469                       &v->s.avctx->sample_aspect_ratio.den,
470                       v->s.avctx->height * w,
471                       v->s.avctx->width * h,
472                       1 << 30);
473         }
474         ff_set_sar(v->s.avctx, v->s.avctx->sample_aspect_ratio);
475         av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect: %i:%i\n",
476                v->s.avctx->sample_aspect_ratio.num,
477                v->s.avctx->sample_aspect_ratio.den);
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);
502             v->s.avctx->color_range     = AVCOL_RANGE_MPEG;
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
520 int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
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);
532     if (v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
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",
574            v->broken_link, v->closed_entry, v->panscanflag, v->refdist_flag, v->s.loop_filter,
575            v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode);
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
626 static int read_bfraction(VC1Context *v, GetBitContext* gb) {
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;
634     v->bfraction           = ff_vc1_bfraction_lut[v->bfraction_lut_index];
635     return 0;
636 }
637
638 int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
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))
661                 v->s.pict_type = AV_PICTURE_TYPE_I;
662             else
663                 v->s.pict_type = AV_PICTURE_TYPE_B;
664         } else
665             v->s.pict_type = AV_PICTURE_TYPE_P;
666     } else
667         v->s.pict_type = v->s.pict_type ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
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) {
674             v->s.pict_type = AV_PICTURE_TYPE_BI;
675         }
676     }
677     if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
678         skip_bits(gb, 7); // skip buffer fullness
679
680     if (v->parse_only)
681         return 0;
682
683     /* calculate RND */
684     if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
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;
693     if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
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;
699     if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
700         v->pquantizer = pqindex < 9;
701     if (v->quantizer_mode == QUANT_NON_UNIFORM)
702         v->pquantizer = 0;
703     v->pqindex = pqindex;
704     if (pqindex < 9)
705         v->halfpq = get_bits1(gb);
706     else
707         v->halfpq = 0;
708     if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
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;
749         if (v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
750             v->s.quarter_sample = 0;
751         else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
752             if (v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
753                 v->s.quarter_sample = 0;
754             else
755                 v->s.quarter_sample = 1;
756         } else
757             v->s.quarter_sample = 1;
758         v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
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) {
763             status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
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");
784             vop_dquant_decoding(v);
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
803         v->mv_mode          = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
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");
824             vop_dquant_decoding(v);
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);
843         if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) {
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) {
851         v->s.pict_type = AV_PICTURE_TYPE_B;
852         v->bi_type     = 1;
853     }
854     return 0;
855 }
856
857 int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
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;
869         v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
870         if (v->fptype & 4)
871             v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
872         v->s.current_picture_ptr->f->pict_type = v->s.pict_type;
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);
897         v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
898         if (v->fptype & 4) // B-picture
899             v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
900
901     } else {
902         v->s.mb_height = v->s.height + 15 >> 4;
903         switch (get_unary(gb, 0, 4)) {
904         case 0:
905             v->s.pict_type = AV_PICTURE_TYPE_P;
906             break;
907         case 1:
908             v->s.pict_type = AV_PICTURE_TYPE_B;
909             break;
910         case 2:
911             v->s.pict_type = AV_PICTURE_TYPE_I;
912             break;
913         case 3:
914             v->s.pict_type = AV_PICTURE_TYPE_BI;
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);
944     if(!ff_vc1_bfraction_vlc.table)
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;
983     if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
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;
989     if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
990         v->pquantizer = pqindex < 9;
991     if (v->quantizer_mode == QUANT_NON_UNIFORM)
992         v->pquantizer = 0;
993     v->pqindex = pqindex;
994     if (pqindex < 9)
995         v->halfpq = get_bits1(gb);
996     else
997         v->halfpq = 0;
998     if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
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);
1125                         INIT_LUT(v->lumscale2, v->lumshift2, v->last_luty[v->cur_field_type  ], v->last_lutuv[v->cur_field_type  ], 1);
1126                     } else {
1127                         INIT_LUT(v->lumscale2, v->lumshift2, v->curr_luty[v->cur_field_type^1], v->curr_lutuv[v->cur_field_type^1], 0);
1128                         INIT_LUT(v->lumscale , v->lumshift , v->last_luty[v->cur_field_type  ], v->last_lutuv[v->cur_field_type  ], 1);
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;
1138             if (v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
1139                 v->s.quarter_sample = 0;
1140             else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1141                 if (v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
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
1148                            || (v->mv_mode == MV_PMODE_INTENSITY_COMP
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 &&
1153                  v->mv_mode2 == MV_PMODE_MIXED_MV)
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 &&
1187                 v->mv_mode2 == MV_PMODE_MIXED_MV) || v->mv_mode == MV_PMODE_MIXED_MV) {
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");
1197             vop_dquant_decoding(v);
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;
1244             v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV || v->mv_mode == MV_PMODE_MIXED_MV);
1245             v->s.mspel          = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || v->mv_mode == MV_PMODE_1MV_HPEL);
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 {
1298             v->mv_mode          = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
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");
1318             vop_dquant_decoding(v);
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);
1341     if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) {
1342         v->y_ac_table_index = decode012(gb);
1343     }
1344     /* DC Syntax */
1345     v->s.dc_table_index = get_bits1(gb);
1346     if ((v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
1347         && v->dquant) {
1348         av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1349         vop_dquant_decoding(v);
1350     }
1351
1352     v->bi_type = 0;
1353     if (v->s.pict_type == AV_PICTURE_TYPE_BI) {
1354         v->s.pict_type = AV_PICTURE_TYPE_B;
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  */
1596 av_cold int ff_vc1_init_common(VC1Context *v)
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) {
1606         INIT_VLC_STATIC(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
1607                         ff_vc1_bfraction_bits, 1, 1,
1608                         ff_vc1_bfraction_codes, 1, 1, 1 << VC1_BFRACTION_VLC_BITS);
1609         INIT_VLC_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
1610                         ff_vc1_norm2_bits, 1, 1,
1611                         ff_vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS);
1612         INIT_VLC_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
1613                         ff_vc1_norm6_bits, 1, 1,
1614                         ff_vc1_norm6_codes, 2, 2, 556);
1615         INIT_VLC_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
1616                         ff_vc1_imode_bits, 1, 1,
1617                         ff_vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS);
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];
1621             init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
1622                      ff_vc1_ttmb_bits[i], 1, 1,
1623                      ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
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];
1626             init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
1627                      ff_vc1_ttblk_bits[i], 1, 1,
1628                      ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
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];
1631             init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
1632                      ff_vc1_subblkpat_bits[i], 1, 1,
1633                      ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
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];
1638             init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
1639                      ff_vc1_4mv_block_pattern_bits[i], 1, 1,
1640                      ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
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];
1643             init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
1644                      ff_vc1_cbpcy_p_bits[i], 1, 1,
1645                      ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
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];
1648             init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
1649                      ff_vc1_mv_diff_bits[i], 1, 1,
1650                      ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
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];
1655             init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, ff_vc1_ac_sizes[i],
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];
1661             init_vlc(&ff_vc1_2ref_mvdata_vlc[i], VC1_2REF_MVDATA_VLC_BITS, 126,
1662                      ff_vc1_2ref_mvdata_bits[i], 1, 1,
1663                      ff_vc1_2ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
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];
1669             init_vlc(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15,
1670                      ff_vc1_intfr_4mv_mbmode_bits[i], 1, 1,
1671                      ff_vc1_intfr_4mv_mbmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
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];
1675             init_vlc(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9,
1676                      ff_vc1_intfr_non4mv_mbmode_bits[i], 1, 1,
1677                      ff_vc1_intfr_non4mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
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];
1681             init_vlc(&ff_vc1_1ref_mvdata_vlc[i], VC1_1REF_MVDATA_VLC_BITS, 72,
1682                      ff_vc1_1ref_mvdata_bits[i], 1, 1,
1683                      ff_vc1_1ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
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];
1689             init_vlc(&ff_vc1_2mv_block_pattern_vlc[i], VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4,
1690                      ff_vc1_2mv_block_pattern_bits[i], 1, 1,
1691                      ff_vc1_2mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
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];
1697             init_vlc(&ff_vc1_icbpcy_vlc[i], VC1_ICBPCY_VLC_BITS, 63,
1698                      ff_vc1_icbpcy_p_bits[i], 1, 1,
1699                      ff_vc1_icbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
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];
1703             init_vlc(&ff_vc1_if_mmv_mbmode_vlc[i], VC1_IF_MMV_MBMODE_VLC_BITS, 8,
1704                      ff_vc1_if_mmv_mbmode_bits[i], 1, 1,
1705                      ff_vc1_if_mmv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
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];
1708             init_vlc(&ff_vc1_if_1mv_mbmode_vlc[i], VC1_IF_1MV_MBMODE_VLC_BITS, 6,
1709                      ff_vc1_if_1mv_mbmode_bits[i], 1, 1,
1710                      ff_vc1_if_1mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
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 }