FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/apv_entropy.c
Date: 2026-10-30 17:37:53
Exec Total Coverage
Lines: 309 339 91.2%
Functions: 3 3 100.0%
Branches: 137 156 87.8%

Line Branch Exec Source
1 /*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include "apv.h"
20 #include "apv_decode.h"
21
22 #include "put_bits.h"
23
24
25 av_always_inline
26 6728535 static unsigned int apv_read_vlc(GetBitContext *restrict gbc, int k_param,
27 const APVVLCLUT *restrict lut)
28 {
29 unsigned int next_bits;
30 const APVSingleVLCLUTEntry *ent;
31
32 6728535 next_bits = show_bits(gbc, APV_VLC_LUT_BITS);
33 6728535 ent = &lut->single_lut[k_param][next_bits];
34
35
2/2
✓ Branch 0 taken 372131 times.
✓ Branch 1 taken 6356404 times.
6728535 if (ent->more) {
36 unsigned int leading_zeroes;
37
38 372131 skip_bits(gbc, ent->consume);
39
40 372131 next_bits = show_bits(gbc, 16);
41 372131 leading_zeroes = 15 - av_log2(next_bits);
42
43
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 372131 times.
372131 if (leading_zeroes == 0) {
44 // This can't happen mid-stream because the lookup would
45 // have resolved a leading one into a shorter code, but it
46 // can happen if we are hitting the end of the buffer.
47 // Return an invalid code to propagate as an error.
48 ✗ return APV_MAX_TRANS_COEFF + 1;
49 }
50
51 372131 skip_bits(gbc, leading_zeroes + 1);
52
53 372131 return (2 << k_param) +
54 372131 ((1 << leading_zeroes) - 1) * (1 << k_param) +
55 372131 get_bits(gbc, leading_zeroes + k_param);
56 } else {
57 6356404 skip_bits(gbc, ent->consume);
58 6356404 return ent->result;
59 }
60 }
61
62 9 void ff_apv_entropy_build_decode_lut(APVVLCLUT *decode_lut)
63 {
64 9 const int code_len = APV_VLC_LUT_BITS;
65 9 const int lut_size = APV_VLC_LUT_SIZE;
66
67 // Build the single-symbol VLC table.
68
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 9 times.
63 for (int k = 0; k <= 5; k++) {
69
2/2
✓ Branch 0 taken 27648 times.
✓ Branch 1 taken 54 times.
27702 for (unsigned int code = 0; code < lut_size; code++) {
70 27648 APVSingleVLCLUTEntry *ent = &decode_lut->single_lut[k][code];
71 27648 unsigned int first_bit = code & (1 << code_len - 1);
72 27648 unsigned int remaining_bits = code ^ first_bit;
73
74
2/2
✓ Branch 0 taken 13824 times.
✓ Branch 1 taken 13824 times.
27648 if (first_bit) {
75 13824 ent->consume = 1 + k;
76 13824 ent->result = remaining_bits >> (code_len - k - 1);
77 13824 ent->more = 0;
78 } else {
79 13824 unsigned int second_bit = code & (1 << code_len - 2);
80 13824 remaining_bits ^= second_bit;
81
82
2/2
✓ Branch 0 taken 6912 times.
✓ Branch 1 taken 6912 times.
13824 if (second_bit) {
83 6912 unsigned int bits_left = code_len - 2;
84 6912 unsigned int first_set = bits_left - av_log2(remaining_bits);
85 6912 unsigned int last_bits = first_set - 1 + k;
86
87
2/2
✓ Branch 0 taken 5400 times.
✓ Branch 1 taken 1512 times.
6912 if (first_set + last_bits <= bits_left) {
88 // Whole code fits here.
89 5400 ent->consume = 2 + first_set + last_bits;
90 5400 ent->result = ((2 << k) +
91 5400 (((1 << first_set - 1) - 1) << k) +
92 5400 ((code >> bits_left - first_set - last_bits) & (1 << last_bits) - 1));
93 5400 ent->more = 0;
94 } else {
95 // Need to read more, collapse to default.
96 1512 ent->consume = 2;
97 1512 ent->more = 1;
98 }
99 } else {
100 6912 ent->consume = 2 + k;
101 6912 ent->result = (1 << k) + (remaining_bits >> (code_len - k - 2));
102 6912 ent->more = 0;
103 }
104 }
105 }
106 }
107
108 // Build the multi-symbol VLC table.
109
2/2
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
36 for (int start_run = 0; start_run <= 2; start_run++) {
110
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 27 times.
162 for (int start_level = 0; start_level <= 4; start_level++) {
111
2/2
✓ Branch 0 taken 69120 times.
✓ Branch 1 taken 135 times.
69255 for (unsigned int code = 0; code < lut_size; code++) {
112 APVMultiVLCLUTEntry *ent;
113 int k_run, k_level;
114 GetBitContext gbc;
115 PutBitContext pbc;
116 uint8_t buffer[16];
117 uint8_t run_first_buffer[16];
118 uint8_t level_first_buffer[16];
119
120 69120 memset(buffer, 0, sizeof(buffer));
121 69120 init_put_bits(&pbc, buffer, sizeof(buffer));
122 69120 put_bits(&pbc, APV_VLC_LUT_BITS, code);
123 69120 flush_put_bits(&pbc);
124
125 69120 memcpy(run_first_buffer, buffer, sizeof(buffer));
126 69120 memcpy(level_first_buffer, buffer, sizeof(buffer));
127
128 69120 k_run = start_run;
129 69120 k_level = start_level;
130
131 69120 ent = &decode_lut->run_first_lut[k_run][k_level][code];
132 69120 memset(ent, 0, sizeof(*ent));
133 69120 init_get_bits8(&gbc, run_first_buffer, sizeof(run_first_buffer));
134
135 69120 ent->count = 0;
136
2/2
✓ Branch 0 taken 118296 times.
✓ Branch 1 taken 7812 times.
126108 for (int i = 0; i <= 1; i++) {
137 int value, sign, pos;
138
139 118296 value = apv_read_vlc(&gbc, k_run, decode_lut);
140 118296 pos = get_bits_count(&gbc);
141
2/2
✓ Branch 0 taken 21942 times.
✓ Branch 1 taken 96354 times.
118296 if (pos > APV_VLC_LUT_BITS)
142 21942 break;
143 96354 ent->run[i] = value;
144 96354 ent->offset[ent->count] = pos;
145 96354 ++ent->count;
146 96354 k_run = FFMIN(value >> 2, 2);
147
148 96354 value = apv_read_vlc(&gbc, k_level, decode_lut);
149 96354 sign = get_bits1(&gbc);
150 96354 pos = get_bits_count(&gbc);
151
2/2
✓ Branch 0 taken 39366 times.
✓ Branch 1 taken 56988 times.
96354 if (pos > APV_VLC_LUT_BITS)
152 39366 break;
153 56988 ++value;
154
2/2
✓ Branch 0 taken 28494 times.
✓ Branch 1 taken 28494 times.
56988 ent->level[i] = sign ? -value : value;
155 56988 ent->offset[ent->count] = pos;
156 56988 ++ent->count;
157 56988 k_level = FFMIN(value >> 2, 4);
158
2/2
✓ Branch 0 taken 49176 times.
✓ Branch 1 taken 7812 times.
56988 if (i == 0)
159 49176 ent->k_level_0 = k_level;
160 }
161
4/4
✓ Branch 0 taken 67320 times.
✓ Branch 1 taken 1800 times.
✓ Branch 2 taken 59508 times.
✓ Branch 3 taken 7812 times.
69120 if (ent->count > 0 && ent->count < 4)
162 59508 ent->offset[3] = ent->offset[ent->count - 1];
163 69120 ent->k_run = k_run;
164 69120 ent->k_level_1 = k_level;
165
166 69120 k_run = start_run;
167 69120 k_level = start_level;
168
169 69120 ent = &decode_lut->level_first_lut[k_run][k_level][code];
170 69120 memset(ent, 0, sizeof(*ent));
171 69120 init_get_bits8(&gbc, level_first_buffer, sizeof(level_first_buffer));
172
173 69120 ent->count = 0;
174
2/2
✓ Branch 0 taken 118296 times.
✓ Branch 1 taken 7812 times.
126108 for (int i = 0; i <= 1; i++) {
175 int value, sign, pos;
176
177 118296 value = apv_read_vlc(&gbc, k_level, decode_lut);
178 118296 sign = get_bits1(&gbc);
179 118296 pos = get_bits_count(&gbc);
180
2/2
✓ Branch 0 taken 35172 times.
✓ Branch 1 taken 83124 times.
118296 if (pos > APV_VLC_LUT_BITS)
181 35172 break;
182 83124 ++value;
183
2/2
✓ Branch 0 taken 41562 times.
✓ Branch 1 taken 41562 times.
83124 ent->level[i] = sign ? -value : value;
184 83124 ent->offset[ent->count] = pos;
185 83124 ++ent->count;
186 83124 k_level = FFMIN(value >> 2, 4);
187
2/2
✓ Branch 0 taken 64800 times.
✓ Branch 1 taken 18324 times.
83124 if (i == 0)
188 64800 ent->k_level_0 = k_level;
189
190 83124 value = apv_read_vlc(&gbc, k_run, decode_lut);
191 83124 pos = get_bits_count(&gbc);
192
2/2
✓ Branch 0 taken 26136 times.
✓ Branch 1 taken 56988 times.
83124 if (pos > APV_VLC_LUT_BITS)
193 26136 break;
194 56988 ent->run[i] = value;
195 56988 ent->offset[ent->count] = pos;
196 56988 ++ent->count;
197 56988 k_run = FFMIN(value >> 2, 2);
198 }
199
4/4
✓ Branch 0 taken 64800 times.
✓ Branch 1 taken 4320 times.
✓ Branch 2 taken 56988 times.
✓ Branch 3 taken 7812 times.
69120 if (ent->count > 0 && ent->count < 4)
200 56988 ent->offset[3] = ent->offset[ent->count - 1];
201 69120 ent->k_run = k_run;
202 69120 ent->k_level_1 = k_level;
203 }
204 }
205 }
206 9 }
207
208 14500 int ff_apv_entropy_decode_block(int16_t *restrict coeff,
209 GetBitContext *restrict gbc,
210 APVEntropyState *restrict state)
211 {
212 14500 const APVVLCLUT *lut = state->decode_lut;
213 int scan_pos;
214 14500 int k_dc = state->prev_k_dc;
215 int k_run, k_level;
216 uint32_t next_bits, lut_bits;
217 const APVMultiVLCLUTEntry *ent;
218
219 // DC coefficient is likely to be large and cannot be usefully
220 // combined with other read steps, so extract it separately.
221 {
222 int dc_coeff, abs_diff, sign;
223
224 14500 abs_diff = apv_read_vlc(gbc, k_dc, lut);
225
226
2/2
✓ Branch 0 taken 13542 times.
✓ Branch 1 taken 958 times.
14500 if (abs_diff) {
227 13542 sign = get_bits1(gbc);
228
2/2
✓ Branch 0 taken 6902 times.
✓ Branch 1 taken 6640 times.
13542 if (sign)
229 6902 dc_coeff = state->prev_dc - abs_diff;
230 else
231 6640 dc_coeff = state->prev_dc + abs_diff;
232 } else {
233 958 dc_coeff = state->prev_dc;
234 }
235
236
237
2/4
✓ Branch 0 taken 14500 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 14500 times.
14500 if (dc_coeff < APV_MIN_TRANS_COEFF ||
238 dc_coeff > APV_MAX_TRANS_COEFF) {
239 ✗ av_log(state->log_ctx, AV_LOG_ERROR,
240 "Out-of-range DC coefficient value: %d.\n",
241 dc_coeff);
242 ✗ return AVERROR_INVALIDDATA;
243 }
244
245 14500 coeff[0] = dc_coeff;
246
247 14500 state->prev_dc = dc_coeff;
248 14500 state->prev_k_dc = FFMIN(abs_diff >> 1, 5);
249 }
250
251 // Repeatedly read 18 bits, look up the first half of them in either
252 // the run-first or the level-first table. If the next code is too
253 // long the 18 bits will allow resolving a run code (up to 63)
254 // without reading any more bits, and will allow the exact length
255 // of a level code to be determined. (Note that reusing the
256 // single-symbol LUT is never useful here as the multisymbol lookup
257 // has already determined that the code is too long.)
258
259 // Run a single iteration of the run-first LUT to start, then a
260 // single iteration of the level-first LUT if that only read a
261 // single code. This avoids dealing with the first-AC logic inside
262 // the normal code lookup sequence.
263
264 14500 k_level = state->prev_k_level;
265 {
266 14500 next_bits = show_bits(gbc, 18);
267 14500 lut_bits = next_bits >> (18 - APV_VLC_LUT_BITS);
268
269 14500 ent = &lut->run_first_lut[0][k_level][lut_bits];
270
271
2/2
✓ Branch 0 taken 722 times.
✓ Branch 1 taken 13778 times.
14500 if (ent->count == 0) {
272 // One long code.
273 uint32_t bits, low_bits;
274 unsigned int leading_zeroes, low_bit_count, low_bit_shift;
275 int run;
276
277 // Remove the prefix bits.
278 722 bits = next_bits & 0xffff;
279 // Determine code length.
280 722 leading_zeroes = 15 - av_log2(bits);
281
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 722 times.
722 if (leading_zeroes >= 6) {
282 // 6 zeroes implies run > 64, which is always invalid.
283 ✗ av_log(state->log_ctx, AV_LOG_ERROR,
284 "Out-of-range run value: %d leading zeroes.\n",
285 leading_zeroes);
286 ✗ return AVERROR_INVALIDDATA;
287 }
288 // Extract the low bits.
289 722 low_bit_count = leading_zeroes;
290 722 low_bit_shift = 16 - (1 + 2 * leading_zeroes);
291 722 low_bits = av_zero_extend(bits >> low_bit_shift, low_bit_count);
292 // Construct run code.
293 722 run = 2 + ((1 << leading_zeroes) - 1) + low_bits;
294 // Skip over the bits just used.
295 722 skip_bits(gbc, 2 + leading_zeroes + 1 + low_bit_count);
296
297 722 scan_pos = run + 1;
298
2/2
✓ Branch 0 taken 708 times.
✓ Branch 1 taken 14 times.
722 if (scan_pos >= 64)
299 708 goto end_of_block;
300 14 k_run = FFMIN(run >> 2, 2);
301 14 goto first_level;
302 } else {
303 // One or more short codes starting with a run; if there is
304 // a level code then the length needs to be saved for the
305 // next block.
306
307 13778 scan_pos = ent->run[0] + 1;
308
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13778 times.
13778 if (scan_pos >= 64) {
309 ✗ skip_bits(gbc, ent->offset[0]);
310 ✗ goto end_of_block;
311 }
312
2/2
✓ Branch 0 taken 11423 times.
✓ Branch 1 taken 2355 times.
13778 if (ent->count > 1) {
313 11423 coeff[ff_zigzag_direct[scan_pos]] = ent->level[0];
314 11423 ++scan_pos;
315 11423 state->prev_k_level = ent->k_level_0;
316
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11423 times.
11423 if (scan_pos >= 64) {
317 ✗ skip_bits(gbc, ent->offset[1]);
318 ✗ goto end_of_block;
319 }
320 }
321
2/2
✓ Branch 0 taken 8844 times.
✓ Branch 1 taken 4934 times.
13778 if (ent->count > 2) {
322 8844 scan_pos += ent->run[1];
323
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8844 times.
8844 if (scan_pos >= 64) {
324 ✗ skip_bits(gbc, ent->offset[2]);
325 ✗ goto end_of_block;
326 }
327 }
328
2/2
✓ Branch 0 taken 2107 times.
✓ Branch 1 taken 11671 times.
13778 if (ent->count > 3) {
329 2107 coeff[ff_zigzag_direct[scan_pos]] = ent->level[1];
330 2107 ++scan_pos;
331
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2107 times.
2107 if (scan_pos >= 64) {
332 ✗ skip_bits(gbc, ent->offset[3]);
333 ✗ goto end_of_block;
334 }
335 }
336 13778 skip_bits(gbc, ent->offset[3]);
337 13778 k_run = ent->k_run;
338 13778 k_level = ent->k_level_1;
339
2/2
✓ Branch 0 taken 2355 times.
✓ Branch 1 taken 11423 times.
13778 if (ent->count == 1)
340 2355 goto first_level;
341
2/2
✓ Branch 0 taken 6737 times.
✓ Branch 1 taken 4686 times.
11423 else if (ent->count & 1)
342 6737 goto next_is_level;
343 else
344 4686 goto next_is_run;
345 }
346 }
347
348 2369 first_level: {
349 2369 next_bits = show_bits(gbc, 18);
350 2369 lut_bits = next_bits >> (18 - APV_VLC_LUT_BITS);
351
352 2369 ent = &lut->level_first_lut[k_run][k_level][lut_bits];
353
354
2/2
✓ Branch 0 taken 1680 times.
✓ Branch 1 taken 689 times.
2369 if (ent->count == 0) {
355 // One long code.
356 uint32_t bits;
357 unsigned int leading_zeroes;
358 int level, abs_level, sign;
359
360 // Remove the prefix bits.
361 1680 bits = next_bits & 0xffff;
362 // Determine code length.
363 1680 leading_zeroes = 15 - av_log2(bits);
364 // Skip the prefix and length bits.
365 1680 skip_bits(gbc, 2 + leading_zeroes + 1);
366 // Read the rest of the code and construct the level.
367 // Include the + 1 offset for nonzero value here.
368 3360 abs_level = (2 << k_level) +
369 3360 ((1 << leading_zeroes) - 1) * (1 << k_level) +
370 1680 get_bits(gbc, leading_zeroes + k_level) + 1;
371
372 1680 sign = get_bits(gbc, 1);
373
2/2
✓ Branch 0 taken 786 times.
✓ Branch 1 taken 894 times.
1680 if (sign)
374 786 level = -abs_level;
375 else
376 894 level = abs_level;
377
378 // Check range (not checked in any other case, only a long
379 // code can be out of range).
380
2/4
✓ Branch 0 taken 1680 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1680 times.
1680 if (level < APV_MIN_TRANS_COEFF ||
381 level > APV_MAX_TRANS_COEFF) {
382 ✗ av_log(state->log_ctx, AV_LOG_ERROR,
383 "Out-of-range AC coefficient value at %d: %d.\n",
384 scan_pos, level);
385 ✗ return AVERROR_INVALIDDATA;
386 }
387 1680 coeff[ff_zigzag_direct[scan_pos]] = level;
388 1680 ++scan_pos;
389 1680 k_level = FFMIN(abs_level >> 2, 4);
390 1680 state->prev_k_level = k_level;
391
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1680 times.
1680 if (scan_pos >= 64)
392 ✗ goto end_of_block;
393 1680 goto next_is_run;
394
395 } else {
396 // One or more short codes.
397
398 689 coeff[ff_zigzag_direct[scan_pos]] = ent->level[0];
399 689 ++scan_pos;
400 689 state->prev_k_level = ent->k_level_0;
401
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 689 times.
689 if (scan_pos >= 64) {
402 ✗ skip_bits(gbc, ent->offset[0]);
403 ✗ goto end_of_block;
404 }
405
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 599 times.
689 if (ent->count > 1) {
406 90 scan_pos += ent->run[0];
407
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
90 if (scan_pos >= 64) {
408 ✗ skip_bits(gbc, ent->offset[1]);
409 ✗ goto end_of_block;
410 }
411 }
412
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 666 times.
689 if (ent->count > 2) {
413 23 coeff[ff_zigzag_direct[scan_pos]] = ent->level[1];
414 23 ++scan_pos;
415
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 23 times.
23 if (scan_pos >= 64) {
416 ✗ skip_bits(gbc, ent->offset[2]);
417 ✗ goto end_of_block;
418 }
419 }
420
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 687 times.
689 if (ent->count > 3) {
421 2 scan_pos += ent->run[1];
422
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (scan_pos >= 64) {
423 ✗ skip_bits(gbc, ent->offset[3]);
424 ✗ goto end_of_block;
425 }
426 }
427 689 skip_bits(gbc, ent->offset[3]);
428 689 k_run = ent->k_run;
429 689 k_level = ent->k_level_1;
430
2/2
✓ Branch 0 taken 620 times.
✓ Branch 1 taken 69 times.
689 if (ent->count & 1)
431 620 goto next_is_run;
432 else
433 69 goto next_is_level;
434 }
435 }
436
437 55572 next_is_run: {
438 102683 next_bits = show_bits(gbc, 18);
439 102683 lut_bits = next_bits >> (18 - APV_VLC_LUT_BITS);
440
441 102683 ent = &lut->run_first_lut[k_run][k_level][lut_bits];
442
443
2/2
✓ Branch 0 taken 4382 times.
✓ Branch 1 taken 98301 times.
102683 if (ent->count == 0) {
444 // One long code.
445 uint32_t bits, low_bits;
446 unsigned int leading_zeroes, low_bit_count, low_bit_shift;
447 int run;
448
449 // Remove the prefix bits.
450 4382 bits = next_bits & 0xffff;
451 // Determine code length.
452 4382 leading_zeroes = 15 - av_log2(bits);
453
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4382 times.
4382 if (leading_zeroes >= 6) {
454 // 6 zeroes implies run > 64, which is always invalid.
455 ✗ av_log(state->log_ctx, AV_LOG_ERROR,
456 "Out-of-range run value: %d leading zeroes.\n",
457 leading_zeroes);
458 ✗ return AVERROR_INVALIDDATA;
459 }
460 // Extract the low bits.
461 4382 low_bit_count = leading_zeroes + k_run;
462 4382 low_bit_shift = 16 - (1 + 2 * leading_zeroes + k_run);
463 4382 low_bits = av_zero_extend(bits >> low_bit_shift, low_bit_count);
464 // Construct run code.
465 4382 run = (2 << k_run) +
466 4382 ((1 << leading_zeroes) - 1) * (1 << k_run) +
467 low_bits;
468 // Skip over the bits just used.
469 4382 skip_bits(gbc, 2 + leading_zeroes + 1 + low_bit_count);
470
471 4382 scan_pos += run;
472
2/2
✓ Branch 0 taken 4072 times.
✓ Branch 1 taken 310 times.
4382 if (scan_pos >= 64)
473 4072 goto end_of_block;
474 310 k_run = FFMIN(run >> 2, 2);
475 310 goto next_is_level;
476
477 } else {
478 // One or more short codes.
479
480 98301 scan_pos += ent->run[0];
481
2/2
✓ Branch 0 taken 3187 times.
✓ Branch 1 taken 95114 times.
98301 if (scan_pos >= 64) {
482 3187 skip_bits(gbc, ent->offset[0]);
483 3187 goto end_of_block;
484 }
485
2/2
✓ Branch 0 taken 87971 times.
✓ Branch 1 taken 7143 times.
95114 if (ent->count > 1) {
486 87971 coeff[ff_zigzag_direct[scan_pos]] = ent->level[0];
487 87971 ++scan_pos;
488
2/2
✓ Branch 0 taken 869 times.
✓ Branch 1 taken 87102 times.
87971 if (scan_pos >= 64) {
489 869 skip_bits(gbc, ent->offset[1]);
490 869 goto end_of_block;
491 }
492 }
493
2/2
✓ Branch 0 taken 73120 times.
✓ Branch 1 taken 21125 times.
94245 if (ent->count > 2) {
494 73120 scan_pos += ent->run[1];
495
2/2
✓ Branch 0 taken 627 times.
✓ Branch 1 taken 72493 times.
73120 if (scan_pos >= 64) {
496 627 skip_bits(gbc, ent->offset[2]);
497 627 goto end_of_block;
498 }
499 }
500
2/2
✓ Branch 0 taken 33723 times.
✓ Branch 1 taken 59895 times.
93618 if (ent->count > 3) {
501 33723 coeff[ff_zigzag_direct[scan_pos]] = ent->level[1];
502 33723 ++scan_pos;
503
2/2
✓ Branch 0 taken 594 times.
✓ Branch 1 taken 33129 times.
33723 if (scan_pos >= 64) {
504 594 skip_bits(gbc, ent->offset[3]);
505 594 goto end_of_block;
506 }
507 }
508 93024 skip_bits(gbc, ent->offset[3]);
509 93024 k_run = ent->k_run;
510 93024 k_level = ent->k_level_1;
511
2/2
✓ Branch 0 taken 45913 times.
✓ Branch 1 taken 47111 times.
93024 if (ent->count & 1)
512 45913 goto next_is_level;
513 else
514 47111 goto next_is_run;
515 }
516 }
517
518 53029 next_is_level: {
519 216084 next_bits = show_bits(gbc, 18);
520 216084 lut_bits = next_bits >> (18 - APV_VLC_LUT_BITS);
521
522 216084 ent = &lut->level_first_lut[k_run][k_level][lut_bits];
523
524
2/2
✓ Branch 0 taken 11216 times.
✓ Branch 1 taken 204868 times.
216084 if (ent->count == 0) {
525 // One long code.
526 uint32_t bits;
527 unsigned int leading_zeroes;
528 int level, abs_level, sign;
529
530 // Remove the prefix bits.
531 11216 bits = next_bits & 0xffff;
532 // Determine code length.
533 11216 leading_zeroes = 15 - av_log2(bits);
534 // Skip the prefix and length bits.
535 11216 skip_bits(gbc, 2 + leading_zeroes + 1);
536 // Read the rest of the code and construct the level.
537 // Include the + 1 offset for nonzero value here.
538 22432 abs_level = (2 << k_level) +
539 22432 ((1 << leading_zeroes) - 1) * (1 << k_level) +
540 11216 get_bits(gbc, leading_zeroes + k_level) + 1;
541
542 11216 sign = get_bits(gbc, 1);
543
2/2
✓ Branch 0 taken 5573 times.
✓ Branch 1 taken 5643 times.
11216 if (sign)
544 5573 level = -abs_level;
545 else
546 5643 level = abs_level;
547
548 // Check range (not checked in any other case, only a long
549 // code can be out of range).
550
2/4
✓ Branch 0 taken 11216 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 11216 times.
11216 if (level < APV_MIN_TRANS_COEFF ||
551 level > APV_MAX_TRANS_COEFF) {
552 ✗ av_log(state->log_ctx, AV_LOG_ERROR,
553 "Out-of-range AC coefficient value at %d: %d.\n",
554 scan_pos, level);
555 ✗ return AVERROR_INVALIDDATA;
556 }
557 11216 coeff[ff_zigzag_direct[scan_pos]] = level;
558 11216 ++scan_pos;
559 11216 k_level = FFMIN(abs_level >> 2, 4);
560
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 11187 times.
11216 if (scan_pos >= 64)
561 29 goto end_of_block;
562 11187 goto next_is_run;
563
564 } else {
565 // One or more short codes.
566
567 204868 coeff[ff_zigzag_direct[scan_pos]] = ent->level[0];
568 204868 ++scan_pos;
569
2/2
✓ Branch 0 taken 1159 times.
✓ Branch 1 taken 203709 times.
204868 if (scan_pos >= 64) {
570 1159 skip_bits(gbc, ent->offset[0]);
571 1159 goto end_of_block;
572 }
573
2/2
✓ Branch 0 taken 193827 times.
✓ Branch 1 taken 9882 times.
203709 if (ent->count > 1) {
574 193827 scan_pos += ent->run[0];
575
2/2
✓ Branch 0 taken 1561 times.
✓ Branch 1 taken 192266 times.
193827 if (scan_pos >= 64) {
576 1561 skip_bits(gbc, ent->offset[1]);
577 1561 goto end_of_block;
578 }
579 }
580
2/2
✓ Branch 0 taken 92585 times.
✓ Branch 1 taken 109563 times.
202148 if (ent->count > 2) {
581 92585 coeff[ff_zigzag_direct[scan_pos]] = ent->level[1];
582 92585 ++scan_pos;
583
2/2
✓ Branch 0 taken 1150 times.
✓ Branch 1 taken 91435 times.
92585 if (scan_pos >= 64) {
584 1150 skip_bits(gbc, ent->offset[2]);
585 1150 goto end_of_block;
586 }
587 }
588
2/2
✓ Branch 0 taken 63918 times.
✓ Branch 1 taken 137080 times.
200998 if (ent->count > 3) {
589 63918 scan_pos += ent->run[1];
590
2/2
✓ Branch 0 taken 544 times.
✓ Branch 1 taken 63374 times.
63918 if (scan_pos >= 64) {
591 544 skip_bits(gbc, ent->offset[3]);
592 544 goto end_of_block;
593 }
594 }
595 200454 skip_bits(gbc, ent->offset[3]);
596 200454 k_run = ent->k_run;
597 200454 k_level = ent->k_level_1;
598
2/2
✓ Branch 0 taken 37399 times.
✓ Branch 1 taken 163055 times.
200454 if (ent->count & 1)
599 37399 goto next_is_run;
600 else
601 163055 goto next_is_level;
602 }
603 }
604
605 14500 end_of_block: {
606
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14500 times.
14500 if (scan_pos > 64) {
607 ✗ av_log(state->log_ctx, AV_LOG_ERROR,
608 "Block decode reached invalid scan position %d.\n",
609 scan_pos);
610 ✗ return AVERROR_INVALIDDATA;
611 }
612 14500 return 0;
613 }
614 }
615