FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vc1.c
Date: 2021-09-24 20:55:06
Exec Total Coverage
Lines: 764 943 81.0%
Branches: 409 652 62.7%

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