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