FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/h264_cavlc.c
Date: 2026-09-27 12:50:02
Exec Total Coverage
Lines: 468 514 91.1%
Functions: 8 8 100.0%
Branches: 363 398 91.2%

Line Branch Exec Source
1 /*
2 * H.26L/H.264/AVC/JVT/14496-10/... cavlc bitstream decoding
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * H.264 / AVC / MPEG-4 part10 cavlc bitstream decoding.
25 * @author Michael Niedermayer <michaelni@gmx.at>
26 */
27
28 #define CABAC(h) 0
29 #define UNCHECKED_BITSTREAM_READER 1
30
31 #include "h264dec.h"
32 #include "h264_mvpred.h"
33 #include "h264data.h"
34 #include "golomb.h"
35 #include "mpegutils.h"
36 #include "libavutil/avassert.h"
37
38
39 static const uint8_t golomb_to_inter_cbp_gray[16]={
40 0, 1, 2, 4, 8, 3, 5,10,12,15, 7,11,13,14, 6, 9,
41 };
42
43 static const uint8_t golomb_to_intra4x4_cbp_gray[16]={
44 15, 0, 7,11,13,14, 3, 5,10,12, 1, 2, 4, 8, 6, 9,
45 };
46
47 static const uint8_t chroma_dc_coeff_token_len[4*5]={
48 2, 0, 0, 0,
49 6, 1, 0, 0,
50 6, 6, 3, 0,
51 6, 7, 7, 6,
52 6, 8, 8, 7,
53 };
54
55 static const uint8_t chroma_dc_coeff_token_bits[4*5]={
56 1, 0, 0, 0,
57 7, 1, 0, 0,
58 4, 6, 1, 0,
59 3, 3, 2, 5,
60 2, 3, 2, 0,
61 };
62
63 static const uint8_t chroma422_dc_coeff_token_len[4*9]={
64 1, 0, 0, 0,
65 7, 2, 0, 0,
66 7, 7, 3, 0,
67 9, 7, 7, 5,
68 9, 9, 7, 6,
69 10, 10, 9, 7,
70 11, 11, 10, 7,
71 12, 12, 11, 10,
72 13, 12, 12, 11,
73 };
74
75 static const uint8_t chroma422_dc_coeff_token_bits[4*9]={
76 1, 0, 0, 0,
77 15, 1, 0, 0,
78 14, 13, 1, 0,
79 7, 12, 11, 1,
80 6, 5, 10, 1,
81 7, 6, 4, 9,
82 7, 6, 5, 8,
83 7, 6, 5, 4,
84 7, 5, 4, 4,
85 };
86
87 static const uint8_t coeff_token_len[4][4*17]={
88 {
89 1, 0, 0, 0,
90 6, 2, 0, 0, 8, 6, 3, 0, 9, 8, 7, 5, 10, 9, 8, 6,
91 11,10, 9, 7, 13,11,10, 8, 13,13,11, 9, 13,13,13,10,
92 14,14,13,11, 14,14,14,13, 15,15,14,14, 15,15,15,14,
93 16,15,15,15, 16,16,16,15, 16,16,16,16, 16,16,16,16,
94 },
95 {
96 2, 0, 0, 0,
97 6, 2, 0, 0, 6, 5, 3, 0, 7, 6, 6, 4, 8, 6, 6, 4,
98 8, 7, 7, 5, 9, 8, 8, 6, 11, 9, 9, 6, 11,11,11, 7,
99 12,11,11, 9, 12,12,12,11, 12,12,12,11, 13,13,13,12,
100 13,13,13,13, 13,14,13,13, 14,14,14,13, 14,14,14,14,
101 },
102 {
103 4, 0, 0, 0,
104 6, 4, 0, 0, 6, 5, 4, 0, 6, 5, 5, 4, 7, 5, 5, 4,
105 7, 5, 5, 4, 7, 6, 6, 4, 7, 6, 6, 4, 8, 7, 7, 5,
106 8, 8, 7, 6, 9, 8, 8, 7, 9, 9, 8, 8, 9, 9, 9, 8,
107 10, 9, 9, 9, 10,10,10,10, 10,10,10,10, 10,10,10,10,
108 },
109 {
110 6, 0, 0, 0,
111 6, 6, 0, 0, 6, 6, 6, 0, 6, 6, 6, 6, 6, 6, 6, 6,
112 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
113 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
114 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
115 }
116 };
117
118 static const uint8_t coeff_token_bits[4][4*17]={
119 {
120 1, 0, 0, 0,
121 5, 1, 0, 0, 7, 4, 1, 0, 7, 6, 5, 3, 7, 6, 5, 3,
122 7, 6, 5, 4, 15, 6, 5, 4, 11,14, 5, 4, 8,10,13, 4,
123 15,14, 9, 4, 11,10,13,12, 15,14, 9,12, 11,10,13, 8,
124 15, 1, 9,12, 11,14,13, 8, 7,10, 9,12, 4, 6, 5, 8,
125 },
126 {
127 3, 0, 0, 0,
128 11, 2, 0, 0, 7, 7, 3, 0, 7,10, 9, 5, 7, 6, 5, 4,
129 4, 6, 5, 6, 7, 6, 5, 8, 15, 6, 5, 4, 11,14,13, 4,
130 15,10, 9, 4, 11,14,13,12, 8,10, 9, 8, 15,14,13,12,
131 11,10, 9,12, 7,11, 6, 8, 9, 8,10, 1, 7, 6, 5, 4,
132 },
133 {
134 15, 0, 0, 0,
135 15,14, 0, 0, 11,15,13, 0, 8,12,14,12, 15,10,11,11,
136 11, 8, 9,10, 9,14,13, 9, 8,10, 9, 8, 15,14,13,13,
137 11,14,10,12, 15,10,13,12, 11,14, 9,12, 8,10,13, 8,
138 13, 7, 9,12, 9,12,11,10, 5, 8, 7, 6, 1, 4, 3, 2,
139 },
140 {
141 3, 0, 0, 0,
142 0, 1, 0, 0, 4, 5, 6, 0, 8, 9,10,11, 12,13,14,15,
143 16,17,18,19, 20,21,22,23, 24,25,26,27, 28,29,30,31,
144 32,33,34,35, 36,37,38,39, 40,41,42,43, 44,45,46,47,
145 48,49,50,51, 52,53,54,55, 56,57,58,59, 60,61,62,63,
146 }
147 };
148
149 static const uint8_t total_zeros_len[16][16]= {
150 {1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
151 {3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
152 {4,3,3,3,4,4,3,3,4,5,5,6,5,6},
153 {5,3,4,4,3,3,3,4,3,4,5,5,5},
154 {4,4,4,3,3,3,3,3,4,5,4,5},
155 {6,5,3,3,3,3,3,3,4,3,6},
156 {6,5,3,3,3,2,3,4,3,6},
157 {6,4,5,3,2,2,3,3,6},
158 {6,6,4,2,2,3,2,5},
159 {5,5,3,2,2,2,4},
160 {4,4,3,3,1,3},
161 {4,4,2,1,3},
162 {3,3,1,2},
163 {2,2,1},
164 {1,1},
165 };
166
167 static const uint8_t total_zeros_bits[16][16]= {
168 {1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},
169 {7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},
170 {5,7,6,5,4,3,4,3,2,3,2,1,1,0},
171 {3,7,5,4,6,5,4,3,3,2,2,1,0},
172 {5,4,3,7,6,5,4,3,2,1,1,0},
173 {1,1,7,6,5,4,3,2,1,1,0},
174 {1,1,5,4,3,3,2,1,1,0},
175 {1,1,1,3,3,2,2,1,0},
176 {1,0,1,3,2,1,1,1},
177 {1,0,1,3,2,1,1},
178 {0,1,1,2,1,3},
179 {0,1,1,1,1},
180 {0,1,1,1},
181 {0,1,1},
182 {0,1},
183 };
184
185 static const uint8_t chroma_dc_total_zeros_len[3][4]= {
186 { 1, 2, 3, 3,},
187 { 1, 2, 2, 0,},
188 { 1, 1, 0, 0,},
189 };
190
191 static const uint8_t chroma_dc_total_zeros_bits[3][4]= {
192 { 1, 1, 1, 0,},
193 { 1, 1, 0, 0,},
194 { 1, 0, 0, 0,},
195 };
196
197 static const uint8_t chroma422_dc_total_zeros_len[7][8]= {
198 { 1, 3, 3, 4, 4, 4, 5, 5 },
199 { 3, 2, 3, 3, 3, 3, 3 },
200 { 3, 3, 2, 2, 3, 3 },
201 { 3, 2, 2, 2, 3 },
202 { 2, 2, 2, 2 },
203 { 2, 2, 1 },
204 { 1, 1 },
205 };
206
207 static const uint8_t chroma422_dc_total_zeros_bits[7][8]= {
208 { 1, 2, 3, 2, 3, 1, 1, 0 },
209 { 0, 1, 1, 4, 5, 6, 7 },
210 { 0, 1, 1, 2, 6, 7 },
211 { 6, 0, 1, 2, 7 },
212 { 0, 1, 2, 3 },
213 { 0, 1, 1 },
214 { 0, 1 },
215 };
216
217 static const uint8_t run_len[7][16]={
218 {1,1},
219 {1,2,2},
220 {2,2,2,2},
221 {2,2,2,3,3},
222 {2,2,3,3,3,3},
223 {2,3,3,3,3,3,3},
224 {3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},
225 };
226
227 static const uint8_t run_bits[7][16]={
228 {1,0},
229 {1,1,0},
230 {3,2,1,0},
231 {3,2,1,1,0},
232 {3,2,3,2,1,0},
233 {3,0,1,3,2,5,4},
234 {7,6,5,4,3,2,1,1,1,1,1,1,1,1,1},
235 };
236
237 #define LEVEL_TAB_BITS 8
238 static int8_t cavlc_level_tab[7][1<<LEVEL_TAB_BITS][2];
239
240 #define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
241 #define CHROMA422_DC_COEFF_TOKEN_VLC_BITS 13
242 #define COEFF_TOKEN_VLC_BITS 8
243 #define TOTAL_ZEROS_VLC_BITS 9
244 #define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
245 #define CHROMA422_DC_TOTAL_ZEROS_VLC_BITS 5
246 #define RUN_VLC_BITS 3
247 #define RUN7_VLC_BITS 6
248
249 /// 17 pointers to only four different VLCs
250 static const VLCElem *coeff_token_vlc[17];
251
252 static VLCElem chroma_dc_coeff_token_vlc_table[256];
253
254 static VLCElem chroma422_dc_coeff_token_vlc_table[1 << CHROMA422_DC_COEFF_TOKEN_VLC_BITS];
255
256 static const VLCElem *total_zeros_vlc[15+1];
257
258 static const VLCElem *chroma_dc_total_zeros_vlc[3+1];
259
260 static const VLCElem *chroma422_dc_total_zeros_vlc[7+1];
261
262 static const VLCElem *run_vlc[6+1];
263
264 // The other pointers to VLCElem point into this array.
265 static VLCElem run7_vlc_table[96 + (6 << RUN_VLC_BITS)
266 + (15 << TOTAL_ZEROS_VLC_BITS)
267 + (3 << CHROMA_DC_TOTAL_ZEROS_VLC_BITS)
268 + (7 << CHROMA422_DC_TOTAL_ZEROS_VLC_BITS)
269 + (520 + 332 + 280 + 256) /* coeff token */];
270
271 /**
272 * Get the predicted number of non-zero coefficients.
273 * @param n block index
274 */
275 43137443 static inline int pred_non_zero_count(const H264Context *h, const H264SliceContext *sl, int n)
276 {
277 43137443 const int index8= scan8[n];
278 43137443 const int left = sl->non_zero_count_cache[index8 - 1];
279 43137443 const int top = sl->non_zero_count_cache[index8 - 8];
280 43137443 int i= left + top;
281
282
2/2
✓ Branch 0 taken 41467717 times.
✓ Branch 1 taken 1669726 times.
43137443 if(i<64) i= (i+1)>>1;
283
284 ff_tlog(h->avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31);
285
286 43137443 return i&31;
287 }
288
289 361 static av_cold void init_cavlc_level_tab(void){
290 int suffix_length;
291 unsigned int i;
292
293
2/2
✓ Branch 0 taken 2527 times.
✓ Branch 1 taken 361 times.
2888 for(suffix_length=0; suffix_length<7; suffix_length++){
294
2/2
✓ Branch 0 taken 646912 times.
✓ Branch 1 taken 2527 times.
649439 for(i=0; i<(1<<LEVEL_TAB_BITS); i++){
295 646912 int prefix= LEVEL_TAB_BITS - av_log2(2*i);
296
297
2/2
✓ Branch 0 taken 601065 times.
✓ Branch 1 taken 45847 times.
646912 if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){
298 601065 int level_code = (prefix << suffix_length) +
299 601065 (i >> (av_log2(i) - suffix_length)) - (1 << suffix_length);
300 601065 int mask = -(level_code&1);
301 601065 level_code = (((2 + level_code) >> 1) ^ mask) - mask;
302 601065 cavlc_level_tab[suffix_length][i][0]= level_code;
303 601065 cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length;
304
2/2
✓ Branch 0 taken 43320 times.
✓ Branch 1 taken 2527 times.
45847 }else if(prefix + 1 <= LEVEL_TAB_BITS){
305 43320 cavlc_level_tab[suffix_length][i][0]= prefix+100;
306 43320 cavlc_level_tab[suffix_length][i][1]= prefix + 1;
307 }else{
308 2527 cavlc_level_tab[suffix_length][i][0]= LEVEL_TAB_BITS+100;
309 2527 cavlc_level_tab[suffix_length][i][1]= LEVEL_TAB_BITS;
310 }
311 }
312 }
313 361 }
314
315 361 av_cold void ff_h264_decode_init_vlc(void)
316 {
317 const VLCElem *coeff_token_vlc_original[4];
318 361 VLCInitState state = VLC_INIT_STATE(run7_vlc_table);
319
320 361 VLC_INIT_STATIC_TABLE(chroma_dc_coeff_token_vlc_table,
321 CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4 * 5,
322 &chroma_dc_coeff_token_len [0], 1, 1,
323 &chroma_dc_coeff_token_bits[0], 1, 1, 0);
324
325 361 VLC_INIT_STATIC_TABLE(chroma422_dc_coeff_token_vlc_table,
326 CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 4 * 9,
327 &chroma422_dc_coeff_token_len [0], 1, 1,
328 &chroma422_dc_coeff_token_bits[0], 1, 1, 0);
329
330 361 ff_vlc_init_tables(&state, RUN7_VLC_BITS, 16,
331 &run_len [6][0], 1, 1,
332 &run_bits[6][0], 1, 1, 0);
333
334
2/2
✓ Branch 0 taken 2166 times.
✓ Branch 1 taken 361 times.
2527 for (int i = 0; i < 6; i++) {
335 2166 run_vlc[i + 1] = ff_vlc_init_tables(&state, RUN_VLC_BITS, 7,
336 2166 &run_len [i][0], 1, 1,
337 2166 &run_bits[i][0], 1, 1, 0);
338 }
339
340
2/2
✓ Branch 0 taken 1444 times.
✓ Branch 1 taken 361 times.
1805 for (int i = 0; i < 4; i++) {
341 1444 coeff_token_vlc_original[i] =
342 1444 ff_vlc_init_tables(&state, COEFF_TOKEN_VLC_BITS, 4*17,
343 1444 &coeff_token_len [i][0], 1, 1,
344 1444 &coeff_token_bits[i][0], 1, 1, 0);
345 }
346
2/2
✓ Branch 0 taken 6137 times.
✓ Branch 1 taken 361 times.
6498 for (int i = 0; i < FF_ARRAY_ELEMS(coeff_token_vlc); i++) {
347 static const uint8_t coeff_token_table_index[17] = {
348 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3
349 };
350 6137 coeff_token_vlc[i] = coeff_token_vlc_original[coeff_token_table_index[i]];
351 }
352
353
2/2
✓ Branch 0 taken 1083 times.
✓ Branch 1 taken 361 times.
1444 for (int i = 0; i < 3; i++) {
354 1083 chroma_dc_total_zeros_vlc[i + 1] =
355 1083 ff_vlc_init_tables(&state, CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
356 1083 &chroma_dc_total_zeros_len [i][0], 1, 1,
357 1083 &chroma_dc_total_zeros_bits[i][0], 1, 1, 0);
358 }
359
360
2/2
✓ Branch 0 taken 2527 times.
✓ Branch 1 taken 361 times.
2888 for (int i = 0; i < 7; i++) {
361 2527 chroma422_dc_total_zeros_vlc[i + 1] =
362 2527 ff_vlc_init_tables(&state, CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 8,
363 2527 &chroma422_dc_total_zeros_len [i][0], 1, 1,
364 2527 &chroma422_dc_total_zeros_bits[i][0], 1, 1, 0);
365 }
366
367
2/2
✓ Branch 0 taken 5415 times.
✓ Branch 1 taken 361 times.
5776 for (int i = 0; i < 15; i++) {
368 5415 total_zeros_vlc[i + 1] =
369 5415 ff_vlc_init_tables(&state, TOTAL_ZEROS_VLC_BITS, 16,
370 5415 &total_zeros_len [i][0], 1, 1,
371 5415 &total_zeros_bits[i][0], 1, 1, 0);
372 }
373 /*
374 * This is a one time safety check to make sure that
375 * the vlc table sizes were initialized correctly.
376 */
377 av_assert1(state.size == 0);
378
379 361 init_cavlc_level_tab();
380 361 }
381
382 717588 static inline int get_level_prefix(GetBitContext *gb){
383 unsigned int buf;
384 int log;
385
386 717588 OPEN_READER(re, gb);
387 717588 UPDATE_CACHE(re, gb);
388 717588 buf=GET_CACHE(re, gb);
389
390 717588 log= 32 - av_log2(buf);
391
392 717588 LAST_SKIP_BITS(re, gb, log);
393 717588 CLOSE_READER(re, gb);
394
395 717588 return log-1;
396 }
397
398 /**
399 * Decode a residual block.
400 * @param n block index
401 * @param scantable scantable
402 * @param max_coeff number of coefficients in the block
403 * @return <0 if an error occurred
404 */
405 46440653 static int decode_residual(const H264Context *h, H264SliceContext *sl,
406 GetBitContext *gb, int16_t *block, int n,
407 const uint8_t *scantable, const uint32_t *qmul,
408 int max_coeff)
409 {
410 int level[16];
411 int zeros_left, coeff_token, total_coeff, i, trailing_ones, run_before;
412
413 //FIXME put trailing_onex into the context
414
415
2/2
✓ Branch 0 taken 3303210 times.
✓ Branch 1 taken 43137443 times.
46440653 if(max_coeff <= 8){
416
2/2
✓ Branch 0 taken 2724152 times.
✓ Branch 1 taken 579058 times.
3303210 if (max_coeff == 4)
417 2724152 coeff_token = get_vlc2(gb, chroma_dc_coeff_token_vlc_table,
418 CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1);
419 else
420 579058 coeff_token = get_vlc2(gb, chroma422_dc_coeff_token_vlc_table,
421 CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 1);
422 }else{
423
2/2
✓ Branch 0 taken 299592 times.
✓ Branch 1 taken 42837851 times.
43437035 total_coeff = pred_non_zero_count(h, sl, n >= LUMA_DC_BLOCK_INDEX ?
424 299592 (n - LUMA_DC_BLOCK_INDEX) * 16 : n);
425 43137443 coeff_token = get_vlc2(gb, coeff_token_vlc[total_coeff],
426 COEFF_TOKEN_VLC_BITS, 2);
427 }
428 46440653 total_coeff = coeff_token >> 2;
429 46440653 sl->non_zero_count_cache[scan8[n]] = total_coeff;
430
431 //FIXME set last_non_zero?
432
433
2/2
✓ Branch 0 taken 16211866 times.
✓ Branch 1 taken 30228787 times.
46440653 if(total_coeff==0)
434 16211866 return 0;
435
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 30228778 times.
30228787 if(total_coeff > (unsigned)max_coeff) {
436 9 av_log(h->avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", sl->mb_x, sl->mb_y, total_coeff);
437 9 return -1;
438 }
439
440 30228778 trailing_ones= coeff_token&3;
441 ff_tlog(h->avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff);
442 av_assert2(total_coeff<=16);
443
444 30228778 i = show_bits(gb, 3);
445 30228778 skip_bits(gb, trailing_ones);
446 30228778 level[0] = 1-((i&4)>>1);
447 30228778 level[1] = 1-((i&2) );
448 30228778 level[2] = 1-((i&1)<<1);
449
450
2/2
✓ Branch 0 taken 13700514 times.
✓ Branch 1 taken 16528264 times.
30228778 if(trailing_ones<total_coeff) {
451 int mask, prefix;
452 13700514 int suffix_length = total_coeff > 10 & trailing_ones < 3;
453 13700514 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
454 13700514 int level_code= cavlc_level_tab[suffix_length][bitsi][0];
455
456 13700514 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
457
2/2
✓ Branch 0 taken 318966 times.
✓ Branch 1 taken 13381548 times.
13700514 if(level_code >= 100){
458 318966 prefix= level_code - 100;
459
2/2
✓ Branch 0 taken 314819 times.
✓ Branch 1 taken 4147 times.
318966 if(prefix == LEVEL_TAB_BITS)
460 314819 prefix += get_level_prefix(gb);
461
462 //first coefficient has suffix_length equal to 0 or 1
463
2/2
✓ Branch 0 taken 192640 times.
✓ Branch 1 taken 126326 times.
318966 if(prefix<14){ //FIXME try to build a large unified VLC table for all this
464
2/2
✓ Branch 0 taken 13162 times.
✓ Branch 1 taken 179478 times.
192640 if(suffix_length)
465 13162 level_code= (prefix<<1) + get_bits1(gb); //part
466 else
467 179478 level_code= prefix; //part
468
2/2
✓ Branch 0 taken 59179 times.
✓ Branch 1 taken 67147 times.
126326 }else if(prefix==14){
469
2/2
✓ Branch 0 taken 536 times.
✓ Branch 1 taken 58643 times.
59179 if(suffix_length)
470 536 level_code= (prefix<<1) + get_bits1(gb); //part
471 else
472 58643 level_code= prefix + get_bits(gb, 4); //part
473 }else{
474 67147 level_code= 30;
475
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 67123 times.
67147 if(prefix>=16){
476
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if(prefix > 25+3){
477 ✗ av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n");
478 ✗ return -1;
479 }
480 24 level_code += (1<<(prefix-3))-4096;
481 }
482 67147 level_code += get_bits(gb, prefix-3); //part
483 }
484
485
2/2
✓ Branch 0 taken 246117 times.
✓ Branch 1 taken 72849 times.
318966 if(trailing_ones < 3) level_code += 2;
486
487 318966 suffix_length = 2;
488 318966 mask= -(level_code&1);
489 318966 level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask;
490 }else{
491 13381548 level_code += ((level_code>>31)|1) & -(trailing_ones < 3);
492
493
2/2
✓ Branch 0 taken 757070 times.
✓ Branch 1 taken 12624478 times.
13381548 suffix_length = 1 + (level_code + 3U > 6U);
494 13381548 level[trailing_ones]= level_code;
495 }
496
497 //remaining coefficients have suffix_length > 0
498
2/2
✓ Branch 0 taken 39144188 times.
✓ Branch 1 taken 13700514 times.
52844702 for(i=trailing_ones+1;i<total_coeff;i++) {
499 static const unsigned int suffix_limit[7] = {0,3,6,12,24,48,INT_MAX };
500 39144188 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
501 39144188 level_code= cavlc_level_tab[suffix_length][bitsi][0];
502
503 39144188 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
504
2/2
✓ Branch 0 taken 811975 times.
✓ Branch 1 taken 38332213 times.
39144188 if(level_code >= 100){
505 811975 prefix= level_code - 100;
506
2/2
✓ Branch 0 taken 402769 times.
✓ Branch 1 taken 409206 times.
811975 if(prefix == LEVEL_TAB_BITS){
507 402769 prefix += get_level_prefix(gb);
508 }
509
2/2
✓ Branch 0 taken 745533 times.
✓ Branch 1 taken 66442 times.
811975 if(prefix<15){
510 745533 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
511 }else{
512 66442 level_code = 15<<suffix_length;
513
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 66438 times.
66442 if (prefix>=16) {
514
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if(prefix > 25+3){
515 ✗ av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n");
516 ✗ return AVERROR_INVALIDDATA;
517 }
518 4 level_code += (1<<(prefix-3))-4096;
519 }
520 66442 level_code += get_bits(gb, prefix-3);
521 }
522 811975 mask= -(level_code&1);
523 811975 level_code= (((2+level_code)>>1) ^ mask) - mask;
524 }
525 39144188 level[i]= level_code;
526 39144188 suffix_length+= suffix_limit[suffix_length] + level_code > 2U*suffix_limit[suffix_length];
527 }
528 }
529
530
2/2
✓ Branch 0 taken 305226 times.
✓ Branch 1 taken 29923552 times.
30228778 if(total_coeff == max_coeff)
531 305226 zeros_left=0;
532 else{
533
2/2
✓ Branch 0 taken 1972909 times.
✓ Branch 1 taken 27950643 times.
29923552 if (max_coeff <= 8) {
534
2/2
✓ Branch 0 taken 1515527 times.
✓ Branch 1 taken 457382 times.
1972909 if (max_coeff == 4)
535 1515527 zeros_left = get_vlc2(gb, chroma_dc_total_zeros_vlc[total_coeff],
536 CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1);
537 else
538 457382 zeros_left = get_vlc2(gb, chroma422_dc_total_zeros_vlc[total_coeff],
539 CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 1);
540 } else {
541 27950643 zeros_left = get_vlc2(gb, total_zeros_vlc[total_coeff],
542 TOTAL_ZEROS_VLC_BITS, 1);
543 }
544 }
545
546 #define STORE_BLOCK(type) \
547 scantable += zeros_left + total_coeff - 1; \
548 if(n >= LUMA_DC_BLOCK_INDEX){ \
549 ((type*)block)[*scantable] = level[0]; \
550 for(i=1;i<total_coeff && zeros_left > 0;i++) { \
551 if(zeros_left < 7) \
552 run_before = get_vlc2(gb, run_vlc[zeros_left], RUN_VLC_BITS, 1); \
553 else \
554 run_before = get_vlc2(gb, run7_vlc_table, RUN7_VLC_BITS, 2); \
555 zeros_left -= run_before; \
556 scantable -= 1 + run_before; \
557 ((type*)block)[*scantable]= level[i]; \
558 } \
559 for(;i<total_coeff;i++) { \
560 scantable--; \
561 ((type*)block)[*scantable]= level[i]; \
562 } \
563 }else{ \
564 ((type*)block)[*scantable] = ((int)(level[0] * qmul[*scantable] + 32))>>6; \
565 for(i=1;i<total_coeff && zeros_left > 0;i++) { \
566 if(zeros_left < 7) \
567 run_before = get_vlc2(gb, run_vlc[zeros_left], RUN_VLC_BITS, 1); \
568 else \
569 run_before = get_vlc2(gb, run7_vlc_table, RUN7_VLC_BITS, 2); \
570 zeros_left -= run_before; \
571 scantable -= 1 + run_before; \
572 ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \
573 } \
574 for(;i<total_coeff;i++) { \
575 scantable--; \
576 ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \
577 } \
578 }
579
580
2/2
✓ Branch 0 taken 10462176 times.
✓ Branch 1 taken 19766602 times.
30228778 if (h->pixel_shift) {
581
18/18
✓ Branch 0 taken 839279 times.
✓ Branch 1 taken 9622897 times.
✓ Branch 2 taken 775402 times.
✓ Branch 3 taken 16974 times.
✓ Branch 6 taken 1075317 times.
✓ Branch 7 taken 556338 times.
✓ Branch 8 taken 792376 times.
✓ Branch 9 taken 282941 times.
✓ Branch 10 taken 675595 times.
✓ Branch 11 taken 839279 times.
✓ Branch 12 taken 13892379 times.
✓ Branch 13 taken 2124206 times.
✓ Branch 16 taken 19265710 times.
✓ Branch 17 taken 6373772 times.
✓ Branch 18 taken 16016585 times.
✓ Branch 19 taken 3249125 times.
✓ Branch 20 taken 9617414 times.
✓ Branch 21 taken 9622897 times.
37564146 STORE_BLOCK(int32_t)
582 } else {
583
18/18
✓ Branch 0 taken 1517617 times.
✓ Branch 1 taken 18248985 times.
✓ Branch 2 taken 665127 times.
✓ Branch 3 taken 20091 times.
✓ Branch 6 taken 1119256 times.
✓ Branch 7 taken 1083579 times.
✓ Branch 8 taken 685218 times.
✓ Branch 9 taken 434038 times.
✓ Branch 10 taken 1089821 times.
✓ Branch 11 taken 1517617 times.
✓ Branch 12 taken 27173253 times.
✓ Branch 13 taken 4117500 times.
✓ Branch 16 taken 35524606 times.
✓ Branch 17 taken 14015132 times.
✓ Branch 18 taken 31290753 times.
✓ Branch 19 taken 4233853 times.
✓ Branch 20 taken 11937134 times.
✓ Branch 21 taken 18248985 times.
64769528 STORE_BLOCK(int16_t)
584 }
585
586
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 30228772 times.
30228778 if(zeros_left<0){
587 6 av_log(h->avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", sl->mb_x, sl->mb_y);
588 6 return -1;
589 }
590
591 30228772 return 0;
592 }
593
594 static av_always_inline
595 3005898 int decode_luma_residual(const H264Context *h, H264SliceContext *sl,
596 GetBitContext *gb, const uint8_t *scan,
597 const uint8_t *scan8x8, int pixel_shift,
598 int mb_type, int cbp, int p)
599 {
600 int i4x4, i8x8;
601
1/2
✓ Branch 0 taken 3005898 times.
✗ Branch 1 not taken.
3005898 int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
602
2/2
✓ Branch 0 taken 299592 times.
✓ Branch 1 taken 2706306 times.
3005898 if(IS_INTRA16x16(mb_type)){
603 299592 AV_ZERO128(sl->mb_luma_dc[p]+0);
604 299592 AV_ZERO128(sl->mb_luma_dc[p]+8);
605 299592 AV_ZERO128(sl->mb_luma_dc[p]+16);
606 299592 AV_ZERO128(sl->mb_luma_dc[p]+24);
607
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 299592 times.
299592 if (decode_residual(h, sl, gb, sl->mb_luma_dc[p], LUMA_DC_BLOCK_INDEX + p, scan, NULL, 16) < 0) {
608 ✗ return -1; //FIXME continue if partitioned and other return -1 too
609 }
610
611 av_assert2((cbp&15) == 0 || (cbp&15) == 15);
612
613
2/2
✓ Branch 0 taken 104007 times.
✓ Branch 1 taken 195585 times.
299592 if(cbp&15){
614
2/2
✓ Branch 0 taken 416024 times.
✓ Branch 1 taken 104005 times.
520029 for(i8x8=0; i8x8<4; i8x8++){
615
2/2
✓ Branch 0 taken 1664094 times.
✓ Branch 1 taken 416022 times.
2080116 for(i4x4=0; i4x4<4; i4x4++){
616 1664094 const int index= i4x4 + 4*i8x8 + p*16;
617
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1664092 times.
1664094 if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift),
618 1664094 index, scan + 1, h->ps.pps->dequant4_coeff[p][qscale], 15) < 0 ){
619 2 return -1;
620 }
621 }
622 }
623 104005 return 0xf;
624 }else{
625 195585 fill_rectangle(&sl->non_zero_count_cache[scan8[p*16]], 4, 4, 8, 0, 1);
626 195585 return 0;
627 }
628 }else{
629
2/2
✓ Branch 0 taken 1154467 times.
✓ Branch 1 taken 1551839 times.
2706306 int cqm = (IS_INTRA( mb_type ) ? 0:3)+p;
630 /* For CAVLC 4:4:4, we need to keep track of the luma 8x8 CBP for deblocking nnz purposes. */
631 2706306 int new_cbp = 0;
632
2/2
✓ Branch 0 taken 10825212 times.
✓ Branch 1 taken 2706299 times.
13531511 for(i8x8=0; i8x8<4; i8x8++){
633
2/2
✓ Branch 0 taken 7840589 times.
✓ Branch 1 taken 2984623 times.
10825212 if(cbp & (1<<i8x8)){
634
2/2
✓ Branch 0 taken 2320623 times.
✓ Branch 1 taken 5519966 times.
7840589 if(IS_8x8DCT(mb_type)){
635 2320623 int16_t *buf = &sl->mb[64*i8x8+256*p << pixel_shift];
636 uint8_t *nnz;
637
2/2
✓ Branch 0 taken 9282492 times.
✓ Branch 1 taken 2320623 times.
11603115 for(i4x4=0; i4x4<4; i4x4++){
638 9282492 const int index= i4x4 + 4*i8x8 + p*16;
639
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9282492 times.
9282492 if( decode_residual(h, sl, gb, buf, index, scan8x8+16*i4x4,
640 9282492 h->ps.pps->dequant8_coeff[cqm][qscale], 16) < 0 )
641 ✗ return -1;
642 }
643 2320623 nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]];
644 2320623 nnz[0] += nnz[1] + nnz[8] + nnz[9];
645 2320623 new_cbp |= !!nnz[0] << i8x8;
646 }else{
647
2/2
✓ Branch 0 taken 22079859 times.
✓ Branch 1 taken 5519959 times.
27599818 for(i4x4=0; i4x4<4; i4x4++){
648 22079859 const int index= i4x4 + 4*i8x8 + p*16;
649
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 22079852 times.
22079859 if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift), index,
650 22079859 scan, h->ps.pps->dequant4_coeff[cqm][qscale], 16) < 0 ){
651 7 return -1;
652 }
653 22079852 new_cbp |= sl->non_zero_count_cache[scan8[index]] << i8x8;
654 }
655 }
656 }else{
657 2984623 uint8_t * const nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]];
658 2984623 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
659 }
660 }
661 2706299 return new_cbp;
662 }
663 }
664
665 /* Residual is category 3 (intra) or 4 (inter), so it comes from partition B
666 * or C. NULL if that partition was not received. */
667 3023344 static GetBitContext *mb_residual_gb(const H264Context *h, H264SliceContext *sl,
668 unsigned mb_type)
669 {
670 3023344 int intra = IS_INTRA(mb_type);
671
672
2/2
✓ Branch 0 taken 3018546 times.
✓ Branch 1 taken 4798 times.
3023344 if (!sl->data_partitioning)
673 3018546 return &sl->gb;
674
3/4
✓ Branch 0 taken 2194 times.
✓ Branch 1 taken 2604 times.
✓ Branch 2 taken 4798 times.
✗ Branch 3 not taken.
4798 if (intra ? sl->dpb_available : sl->dpc_available)
675
2/2
✓ Branch 0 taken 2194 times.
✓ Branch 1 taken 2604 times.
4798 return intra ? &sl->gb_dpb : &sl->gb_dpc;
676
677 ✗ av_log(h->avctx, AV_LOG_ERROR, "Missing slice data partition %c\n",
678 intra ? 'B' : 'C');
679 ✗ return NULL;
680 }
681
682 4858537 int ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl)
683 {
684 int mb_xy;
685 int partition_count;
686 unsigned int mb_type, cbp;
687 4858537 int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
688
4/4
✓ Branch 0 taken 389328 times.
✓ Branch 1 taken 4469209 times.
✓ Branch 2 taken 346560 times.
✓ Branch 3 taken 42768 times.
4858537 const int decode_chroma = h->ps.sps->chroma_format_idc == 1 || h->ps.sps->chroma_format_idc == 2;
689 4858537 const int pixel_shift = h->pixel_shift;
690
691 4858537 mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride;
692
693 ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y);
694 4858537 cbp = 0; /* avoid warning. FIXME: find a solution without slowing
695 down the code */
696
2/2
✓ Branch 0 taken 3768774 times.
✓ Branch 1 taken 1089763 times.
4858537 if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
697
2/2
✓ Branch 0 taken 2641797 times.
✓ Branch 1 taken 1126977 times.
3768774 if (sl->mb_skip_run == -1) {
698 2641797 unsigned mb_skip_run = get_ue_golomb_long(&sl->gb);
699
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2641797 times.
2641797 if (mb_skip_run > h->mb_num) {
700 ✗ av_log(h->avctx, AV_LOG_ERROR, "mb_skip_run %d is invalid\n", mb_skip_run);
701 ✗ return AVERROR_INVALIDDATA;
702 }
703 2641797 sl->mb_skip_run = mb_skip_run;
704 }
705
706
2/2
✓ Branch 0 taken 1130586 times.
✓ Branch 1 taken 2638188 times.
3768774 if (sl->mb_skip_run--) {
707
4/4
✓ Branch 0 taken 11109 times.
✓ Branch 1 taken 1119477 times.
✓ Branch 2 taken 5515 times.
✓ Branch 3 taken 5594 times.
1130586 if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
708
2/2
✓ Branch 0 taken 2894 times.
✓ Branch 1 taken 2621 times.
5515 if (sl->mb_skip_run == 0)
709 2894 sl->mb_mbaff = sl->mb_field_decoding_flag = get_bits1(&sl->gb);
710 }
711 1130586 decode_mb_skip(h, sl);
712 1130586 return 0;
713 }
714 }
715
2/2
✓ Branch 0 taken 497835 times.
✓ Branch 1 taken 3230116 times.
3727951 if (FRAME_MBAFF(h)) {
716
2/2
✓ Branch 0 taken 248957 times.
✓ Branch 1 taken 248878 times.
497835 if ((sl->mb_y & 1) == 0)
717 248957 sl->mb_mbaff = sl->mb_field_decoding_flag = get_bits1(&sl->gb);
718 }
719
720 3727951 sl->prev_mb_skipped = 0;
721
722 3727951 mb_type= get_ue_golomb(&sl->gb);
723
2/2
✓ Branch 0 taken 901135 times.
✓ Branch 1 taken 2826816 times.
3727951 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
724
2/2
✓ Branch 0 taken 760098 times.
✓ Branch 1 taken 141037 times.
901135 if(mb_type < 23){
725 760098 partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
726 760098 mb_type = ff_h264_b_mb_type_info[mb_type].type;
727 }else{
728 141037 mb_type -= 23;
729 141037 goto decode_intra_mb;
730 }
731
2/2
✓ Branch 0 taken 1737053 times.
✓ Branch 1 taken 1089763 times.
2826816 } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
732
2/2
✓ Branch 0 taken 1470379 times.
✓ Branch 1 taken 266674 times.
1737053 if(mb_type < 5){
733 1470379 partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
734 1470379 mb_type = ff_h264_p_mb_type_info[mb_type].type;
735 }else{
736 266674 mb_type -= 5;
737 266674 goto decode_intra_mb;
738 }
739 }else{
740 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
741
1/4
✓ Branch 0 taken 1089763 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1089763 if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
742 ✗ mb_type--;
743 1089763 decode_intra_mb:
744
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1497474 times.
1497474 if(mb_type > 25){
745 ✗ av_log(h->avctx, AV_LOG_ERROR, "mb_type %d in %c slice too large at %d %d\n", mb_type, av_get_picture_type_char(sl->slice_type), sl->mb_x, sl->mb_y);
746 ✗ return -1;
747 }
748 1497474 partition_count=0;
749 1497474 cbp = ff_h264_i_mb_type_info[mb_type].cbp;
750 1497474 sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
751 1497474 mb_type = ff_h264_i_mb_type_info[mb_type].type;
752 }
753
754
2/2
✓ Branch 0 taken 981328 times.
✓ Branch 1 taken 2746623 times.
3727951 if (MB_FIELD(sl))
755 981328 mb_type |= MB_TYPE_INTERLACED;
756
757 3727951 h->slice_table[mb_xy] = sl->slice_num;
758
759
2/2
✓ Branch 0 taken 17446 times.
✓ Branch 1 taken 3710505 times.
3727951 if(IS_INTRA_PCM(mb_type)){
760 17446 const int mb_size = ff_h264_mb_sizes[h->ps.sps->chroma_format_idc] *
761 17446 h->ps.sps->bit_depth_luma;
762 17446 GetBitContext *gb = mb_residual_gb(h, sl, mb_type); // samples are category 3
763
764
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17446 times.
17446 if (!gb)
765 ✗ return AVERROR_INVALIDDATA;
766
767 // We assume these blocks are very rare so we do not optimize it.
768 17446 sl->intra_pcm_ptr = align_get_bits(gb);
769
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 17446 times.
17446 if (get_bits_left(gb) < mb_size) {
770 ✗ av_log(h->avctx, AV_LOG_ERROR, "Not enough data for an intra PCM block.\n");
771 ✗ return AVERROR_INVALIDDATA;
772 }
773 17446 skip_bits_long(gb, mb_size);
774
775 // In deblocking, the quantizer is 0
776 17446 h->cur_pic.qscale_table[mb_xy] = 0;
777 // All coeffs are present
778 17446 memset(h->non_zero_count[mb_xy], 16, 48);
779
780 17446 h->cur_pic.mb_type[mb_xy] = mb_type;
781 17446 return 0;
782 }
783
784 3710505 fill_decode_neighbors(h, sl, mb_type);
785 3710505 fill_decode_caches(h, sl, mb_type);
786
787 //mb_pred
788
2/2
✓ Branch 0 taken 1480028 times.
✓ Branch 1 taken 2230477 times.
3710505 if(IS_INTRA(mb_type)){
789 int pred_mode;
790 // init_top_left_availability(h);
791
2/2
✓ Branch 0 taken 1180436 times.
✓ Branch 1 taken 299592 times.
1480028 if(IS_INTRA4x4(mb_type)){
792 int i;
793 1180436 int di = 1;
794
4/4
✓ Branch 0 taken 855937 times.
✓ Branch 1 taken 324499 times.
✓ Branch 3 taken 541711 times.
✓ Branch 4 taken 314226 times.
1180436 if(dct8x8_allowed && get_bits1(&sl->gb)){
795 541711 mb_type |= MB_TYPE_8x8DCT;
796 541711 di = 4;
797 }
798
799 // fill_intra4x4_pred_table(h);
800
2/2
✓ Branch 0 taken 12386444 times.
✓ Branch 1 taken 1180436 times.
13566880 for(i=0; i<16; i+=di){
801 12386444 int mode = pred_intra_mode(h, sl, i);
802
803
2/2
✓ Branch 1 taken 6632604 times.
✓ Branch 2 taken 5753840 times.
12386444 if(!get_bits1(&sl->gb)){
804 6632604 const int rem_mode= get_bits(&sl->gb, 3);
805 6632604 mode = rem_mode + (rem_mode >= mode);
806 }
807
808
2/2
✓ Branch 0 taken 2166844 times.
✓ Branch 1 taken 10219600 times.
12386444 if(di==4)
809 2166844 fill_rectangle(&sl->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1);
810 else
811 10219600 sl->intra4x4_pred_mode_cache[scan8[i]] = mode;
812 }
813 1180436 write_back_intra_pred_mode(h, sl);
814
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1180436 times.
1180436 if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
815 1180436 sl->top_samples_available, sl->left_samples_available) < 0)
816 ✗ return -1;
817 }else{
818 599184 sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
819 299592 sl->left_samples_available, sl->intra16x16_pred_mode, 0);
820
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 299592 times.
299592 if (sl->intra16x16_pred_mode < 0)
821 ✗ return -1;
822 }
823
2/2
✓ Branch 0 taken 1452899 times.
✓ Branch 1 taken 27129 times.
1480028 if(decode_chroma){
824 1452899 pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
825 1452899 sl->left_samples_available, get_ue_golomb_31(&sl->gb), 1);
826
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1452899 times.
1452899 if(pred_mode < 0)
827 ✗ return -1;
828 1452899 sl->chroma_pred_mode = pred_mode;
829 } else {
830 27129 sl->chroma_pred_mode = DC_128_PRED8x8;
831 }
832
2/2
✓ Branch 0 taken 517791 times.
✓ Branch 1 taken 1712686 times.
2230477 }else if(partition_count==4){
833 int i, j, sub_partition_count[4], list, ref[2][4];
834
835
2/2
✓ Branch 0 taken 178547 times.
✓ Branch 1 taken 339244 times.
517791 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
836
2/2
✓ Branch 0 taken 714188 times.
✓ Branch 1 taken 178547 times.
892735 for(i=0; i<4; i++){
837 714188 sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb);
838
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 714188 times.
714188 if(sl->sub_mb_type[i] >=13){
839 ✗ av_log(h->avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y);
840 ✗ return -1;
841 }
842 714188 sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
843 714188 sl->sub_mb_type[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
844 }
845
2/2
✓ Branch 0 taken 56097 times.
✓ Branch 1 taken 122450 times.
178547 if( IS_DIRECT(sl->sub_mb_type[0]|sl->sub_mb_type[1]|sl->sub_mb_type[2]|sl->sub_mb_type[3])) {
846 56097 ff_h264_pred_direct_motion(h, sl, &mb_type);
847 56097 sl->ref_cache[0][scan8[4]] =
848 56097 sl->ref_cache[1][scan8[4]] =
849 56097 sl->ref_cache[0][scan8[12]] =
850 56097 sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
851 }
852 }else{
853 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_P); //FIXME SP correct ?
854
2/2
✓ Branch 0 taken 1356976 times.
✓ Branch 1 taken 339244 times.
1696220 for(i=0; i<4; i++){
855 1356976 sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb);
856
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1356976 times.
1356976 if(sl->sub_mb_type[i] >=4){
857 ✗ av_log(h->avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y);
858 ✗ return -1;
859 }
860 1356976 sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
861 1356976 sl->sub_mb_type[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
862 }
863 }
864
865
2/2
✓ Branch 0 taken 696338 times.
✓ Branch 1 taken 517791 times.
1214129 for (list = 0; list < sl->list_count; list++) {
866
2/2
✓ Branch 0 taken 572388 times.
✓ Branch 1 taken 123950 times.
696338 int ref_count = IS_REF0(mb_type) ? 1 : sl->ref_count[list] << MB_MBAFF(sl);
867
2/2
✓ Branch 0 taken 2785352 times.
✓ Branch 1 taken 696338 times.
3481690 for(i=0; i<4; i++){
868
2/2
✓ Branch 0 taken 232378 times.
✓ Branch 1 taken 2552974 times.
2785352 if(IS_DIRECT(sl->sub_mb_type[i])) continue;
869
2/2
✓ Branch 0 taken 2224974 times.
✓ Branch 1 taken 328000 times.
2552974 if(IS_DIR(sl->sub_mb_type[i], 0, list)){
870 unsigned int tmp;
871
2/2
✓ Branch 0 taken 780781 times.
✓ Branch 1 taken 1444193 times.
2224974 if(ref_count == 1){
872 780781 tmp= 0;
873
2/2
✓ Branch 0 taken 454436 times.
✓ Branch 1 taken 989757 times.
1444193 }else if(ref_count == 2){
874 454436 tmp= get_bits1(&sl->gb)^1;
875 }else{
876 989757 tmp= get_ue_golomb_31(&sl->gb);
877
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 989757 times.
989757 if(tmp>=ref_count){
878 ✗ av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp);
879 ✗ return -1;
880 }
881 }
882 2224974 ref[list][i]= tmp;
883 }else{
884 //FIXME
885 328000 ref[list][i] = -1;
886 }
887 }
888 }
889
890
2/2
✓ Branch 0 taken 51527 times.
✓ Branch 1 taken 466264 times.
517791 if(dct8x8_allowed)
891 51527 dct8x8_allowed = get_dct8x8_allowed(h, sl);
892
893
2/2
✓ Branch 0 taken 696338 times.
✓ Branch 1 taken 517791 times.
1214129 for (list = 0; list < sl->list_count; list++) {
894
2/2
✓ Branch 0 taken 2785352 times.
✓ Branch 1 taken 696338 times.
3481690 for(i=0; i<4; i++){
895
2/2
✓ Branch 0 taken 232378 times.
✓ Branch 1 taken 2552974 times.
2785352 if(IS_DIRECT(sl->sub_mb_type[i])) {
896 232378 sl->ref_cache[list][ scan8[4*i] ] = sl->ref_cache[list][ scan8[4*i]+1 ];
897 232378 continue;
898 }
899 2552974 sl->ref_cache[list][ scan8[4*i] ]=sl->ref_cache[list][ scan8[4*i]+1 ]=
900 2552974 sl->ref_cache[list][ scan8[4*i]+8 ]=sl->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
901
902
2/2
✓ Branch 0 taken 2224974 times.
✓ Branch 1 taken 328000 times.
2552974 if(IS_DIR(sl->sub_mb_type[i], 0, list)){
903 2224974 const int sub_mb_type= sl->sub_mb_type[i];
904
2/2
✓ Branch 0 taken 1678365 times.
✓ Branch 1 taken 546609 times.
2224974 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
905
2/2
✓ Branch 0 taken 3688284 times.
✓ Branch 1 taken 2224974 times.
5913258 for(j=0; j<sub_partition_count[i]; j++){
906 int mx, my;
907 3688284 const int index= 4*i + block_width*j;
908 3688284 int16_t (* mv_cache)[2]= &sl->mv_cache[list][ scan8[index] ];
909 3688284 pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
910 3688284 mx += (unsigned)get_se_golomb(&sl->gb);
911 3688284 my += (unsigned)get_se_golomb(&sl->gb);
912 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
913
914
2/2
✓ Branch 0 taken 1166174 times.
✓ Branch 1 taken 2522110 times.
3688284 if(IS_SUB_8X8(sub_mb_type)){
915 1166174 mv_cache[ 1 ][0]=
916 1166174 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
917 1166174 mv_cache[ 1 ][1]=
918 1166174 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
919
2/2
✓ Branch 0 taken 1024382 times.
✓ Branch 1 taken 1497728 times.
2522110 }else if(IS_SUB_8X4(sub_mb_type)){
920 1024382 mv_cache[ 1 ][0]= mx;
921 1024382 mv_cache[ 1 ][1]= my;
922
2/2
✓ Branch 0 taken 688708 times.
✓ Branch 1 taken 809020 times.
1497728 }else if(IS_SUB_4X8(sub_mb_type)){
923 688708 mv_cache[ 8 ][0]= mx;
924 688708 mv_cache[ 8 ][1]= my;
925 }
926 3688284 mv_cache[ 0 ][0]= mx;
927 3688284 mv_cache[ 0 ][1]= my;
928 }
929 }else{
930 328000 uint32_t *p= (uint32_t *)&sl->mv_cache[list][ scan8[4*i] ][0];
931 328000 p[0] = p[1]=
932 328000 p[8] = p[9]= 0;
933 }
934 }
935 }
936
2/2
✓ Branch 0 taken 139126 times.
✓ Branch 1 taken 1573560 times.
1712686 }else if(IS_DIRECT(mb_type)){
937 139126 ff_h264_pred_direct_motion(h, sl, &mb_type);
938 139126 dct8x8_allowed &= h->ps.sps->direct_8x8_inference_flag;
939 }else{
940 int list, mx, my, i;
941 //FIXME we should set ref_idx_l? to 0 if we use that later ...
942
2/2
✓ Branch 0 taken 1072820 times.
✓ Branch 1 taken 500740 times.
1573560 if(IS_16X16(mb_type)){
943
2/2
✓ Branch 0 taken 1336709 times.
✓ Branch 1 taken 1072820 times.
2409529 for (list = 0; list < sl->list_count; list++) {
944 unsigned int val;
945
2/2
✓ Branch 0 taken 1129374 times.
✓ Branch 1 taken 207335 times.
1336709 if (IS_DIR(mb_type, 0, list)) {
946 1129374 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
947
2/2
✓ Branch 0 taken 629923 times.
✓ Branch 1 taken 499451 times.
1129374 if (rc == 1) {
948 629923 val = 0;
949
2/2
✓ Branch 0 taken 135504 times.
✓ Branch 1 taken 363947 times.
499451 } else if (rc == 2) {
950 135504 val = get_bits1(&sl->gb)^1;
951 } else {
952 363947 val = get_ue_golomb_31(&sl->gb);
953
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 363947 times.
363947 if (val >= rc) {
954 ✗ av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
955 ✗ return -1;
956 }
957 }
958 1129374 fill_rectangle(&sl->ref_cache[list][scan8[0]], 4, 4, 8, val, 1);
959 }
960 }
961
2/2
✓ Branch 0 taken 1336709 times.
✓ Branch 1 taken 1072820 times.
2409529 for (list = 0; list < sl->list_count; list++) {
962
2/2
✓ Branch 0 taken 1129374 times.
✓ Branch 1 taken 207335 times.
1336709 if(IS_DIR(mb_type, 0, list)){
963 1129374 pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
964 1129374 mx += (unsigned)get_se_golomb(&sl->gb);
965 1129374 my += (unsigned)get_se_golomb(&sl->gb);
966 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
967
968 1129374 fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
969 }
970 }
971 }
972
2/2
✓ Branch 0 taken 265235 times.
✓ Branch 1 taken 235505 times.
500740 else if(IS_16X8(mb_type)){
973
2/2
✓ Branch 0 taken 363780 times.
✓ Branch 1 taken 265235 times.
629015 for (list = 0; list < sl->list_count; list++) {
974
2/2
✓ Branch 0 taken 727560 times.
✓ Branch 1 taken 363780 times.
1091340 for (i = 0; i < 2; i++) {
975 unsigned int val;
976
2/2
✓ Branch 0 taken 573354 times.
✓ Branch 1 taken 154206 times.
727560 if (IS_DIR(mb_type, i, list)) {
977 573354 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
978
2/2
✓ Branch 0 taken 230647 times.
✓ Branch 1 taken 342707 times.
573354 if (rc == 1) {
979 230647 val = 0;
980
2/2
✓ Branch 0 taken 80255 times.
✓ Branch 1 taken 262452 times.
342707 } else if (rc == 2) {
981 80255 val = get_bits1(&sl->gb)^1;
982 } else {
983 262452 val = get_ue_golomb_31(&sl->gb);
984
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 262452 times.
262452 if (val >= rc) {
985 ✗ av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
986 ✗ return -1;
987 }
988 }
989 } else
990 154206 val = LIST_NOT_USED & 0xFF;
991 727560 fill_rectangle(&sl->ref_cache[list][scan8[0] + 16*i], 4, 2, 8, val, 1);
992 }
993 }
994
2/2
✓ Branch 0 taken 363780 times.
✓ Branch 1 taken 265235 times.
629015 for (list = 0; list < sl->list_count; list++) {
995
2/2
✓ Branch 0 taken 727560 times.
✓ Branch 1 taken 363780 times.
1091340 for(i=0; i<2; i++){
996 unsigned int val;
997
2/2
✓ Branch 0 taken 573354 times.
✓ Branch 1 taken 154206 times.
727560 if(IS_DIR(mb_type, i, list)){
998 573354 pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
999 573354 mx += (unsigned)get_se_golomb(&sl->gb);
1000 573354 my += (unsigned)get_se_golomb(&sl->gb);
1001 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
1002
1003 573354 val= pack16to32(mx,my);
1004 }else
1005 154206 val=0;
1006 727560 fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 4);
1007 }
1008 }
1009 }else{
1010 av_assert2(IS_8X16(mb_type));
1011
2/2
✓ Branch 0 taken 315496 times.
✓ Branch 1 taken 235505 times.
551001 for (list = 0; list < sl->list_count; list++) {
1012
2/2
✓ Branch 0 taken 630992 times.
✓ Branch 1 taken 315496 times.
946488 for (i = 0; i < 2; i++) {
1013 unsigned int val;
1014
2/2
✓ Branch 0 taken 504274 times.
✓ Branch 1 taken 126718 times.
630992 if (IS_DIR(mb_type, i, list)) { //FIXME optimize
1015 504274 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
1016
2/2
✓ Branch 0 taken 203129 times.
✓ Branch 1 taken 301145 times.
504274 if (rc == 1) {
1017 203129 val = 0;
1018
2/2
✓ Branch 0 taken 82740 times.
✓ Branch 1 taken 218405 times.
301145 } else if (rc == 2) {
1019 82740 val = get_bits1(&sl->gb)^1;
1020 } else {
1021 218405 val = get_ue_golomb_31(&sl->gb);
1022
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 218405 times.
218405 if (val >= rc) {
1023 ✗ av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
1024 ✗ return -1;
1025 }
1026 }
1027 } else
1028 126718 val = LIST_NOT_USED & 0xFF;
1029 630992 fill_rectangle(&sl->ref_cache[list][scan8[0] + 2*i], 2, 4, 8, val, 1);
1030 }
1031 }
1032
2/2
✓ Branch 0 taken 315496 times.
✓ Branch 1 taken 235505 times.
551001 for (list = 0; list < sl->list_count; list++) {
1033
2/2
✓ Branch 0 taken 630992 times.
✓ Branch 1 taken 315496 times.
946488 for(i=0; i<2; i++){
1034 unsigned int val;
1035
2/2
✓ Branch 0 taken 504274 times.
✓ Branch 1 taken 126718 times.
630992 if(IS_DIR(mb_type, i, list)){
1036 504274 pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
1037 504274 mx += (unsigned)get_se_golomb(&sl->gb);
1038 504274 my += (unsigned)get_se_golomb(&sl->gb);
1039 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
1040
1041 504274 val= pack16to32(mx,my);
1042 }else
1043 126718 val=0;
1044 630992 fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 4);
1045 }
1046 }
1047 }
1048 }
1049
1050
2/2
✓ Branch 0 taken 2230477 times.
✓ Branch 1 taken 1480028 times.
3710505 if(IS_INTER(mb_type))
1051 2230477 write_back_motion(h, sl, mb_type);
1052
1053
2/2
✓ Branch 0 taken 3410913 times.
✓ Branch 1 taken 299592 times.
3710505 if(!IS_INTRA16x16(mb_type)){
1054 3410913 cbp= get_ue_golomb(&sl->gb);
1055
1056
2/2
✓ Branch 0 taken 3371563 times.
✓ Branch 1 taken 39350 times.
3410913 if(decode_chroma){
1057
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3371563 times.
3371563 if(cbp > 47){
1058 ✗ av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y);
1059 ✗ return -1;
1060 }
1061
2/2
✓ Branch 0 taken 1156287 times.
✓ Branch 1 taken 2215276 times.
3371563 if (IS_INTRA4x4(mb_type))
1062 1156287 cbp = ff_h264_golomb_to_intra4x4_cbp[cbp];
1063 else
1064 2215276 cbp = ff_h264_golomb_to_inter_cbp[cbp];
1065 }else{
1066
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39350 times.
39350 if(cbp > 15){
1067 ✗ av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y);
1068 ✗ return -1;
1069 }
1070
2/2
✓ Branch 0 taken 24149 times.
✓ Branch 1 taken 15201 times.
39350 if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp_gray[cbp];
1071 15201 else cbp= golomb_to_inter_cbp_gray[cbp];
1072 }
1073 } else {
1074
3/4
✓ Branch 0 taken 2980 times.
✓ Branch 1 taken 296612 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2980 times.
299592 if (!decode_chroma && cbp>15) {
1075 ✗ av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
1076 ✗ return AVERROR_INVALIDDATA;
1077 }
1078 }
1079
1080
6/6
✓ Branch 0 taken 1350186 times.
✓ Branch 1 taken 2360319 times.
✓ Branch 2 taken 1155963 times.
✓ Branch 3 taken 194223 times.
✓ Branch 4 taken 275548 times.
✓ Branch 5 taken 880415 times.
3710505 if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){
1081 275548 mb_type |= MB_TYPE_8x8DCT*get_bits1(&sl->gb);
1082 }
1083 3710505 sl->cbp=
1084 3710505 h->cbp_table[mb_xy]= cbp;
1085 3710505 h->cur_pic.mb_type[mb_xy] = mb_type;
1086
1087
4/4
✓ Branch 0 taken 875984 times.
✓ Branch 1 taken 2834521 times.
✓ Branch 2 taken 171377 times.
✓ Branch 3 taken 704607 times.
6716388 if(cbp || IS_INTRA16x16(mb_type)){
1088 int i4x4, i8x8, chroma_idx;
1089 int dquant;
1090 int ret;
1091 3005898 GetBitContext *gb = mb_residual_gb(h, sl, mb_type);
1092 const uint8_t *scan, *scan8x8;
1093 3005898 const int max_qp = 51 + 6 * (h->ps.sps->bit_depth_luma - 8);
1094
1095
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3005898 times.
3005898 if (!gb)
1096 ✗ return AVERROR_INVALIDDATA;
1097
1098 3005898 dquant= get_se_golomb(&sl->gb);
1099
1100 3005898 sl->qscale += (unsigned)dquant;
1101
1102
2/2
✓ Branch 0 taken 8070 times.
✓ Branch 1 taken 2997828 times.
3005898 if (((unsigned)sl->qscale) > max_qp){
1103
2/2
✓ Branch 0 taken 3860 times.
✓ Branch 1 taken 4210 times.
8070 if (sl->qscale < 0) sl->qscale += max_qp + 1;
1104 4210 else sl->qscale -= max_qp+1;
1105
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8070 times.
8070 if (((unsigned)sl->qscale) > max_qp){
1106 ✗ av_log(h->avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, sl->mb_x, sl->mb_y);
1107 ✗ sl->qscale = max_qp;
1108 ✗ return -1;
1109 }
1110 }
1111
1112 3005898 sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
1113 3005898 sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale);
1114
1115
2/2
✓ Branch 0 taken 824163 times.
✓ Branch 1 taken 2181735 times.
3005898 if(IS_INTERLACED(mb_type)){
1116
2/2
✓ Branch 0 taken 824002 times.
✓ Branch 1 taken 161 times.
824163 scan8x8 = sl->qscale ? h->field_scan8x8_cavlc : h->field_scan8x8_cavlc_q0;
1117
2/2
✓ Branch 0 taken 824002 times.
✓ Branch 1 taken 161 times.
824163 scan = sl->qscale ? h->field_scan : h->field_scan_q0;
1118 }else{
1119
2/2
✓ Branch 0 taken 2180846 times.
✓ Branch 1 taken 889 times.
2181735 scan8x8 = sl->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0;
1120
2/2
✓ Branch 0 taken 2180846 times.
✓ Branch 1 taken 889 times.
2181735 scan = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
1121 }
1122
1123
2/2
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 3005889 times.
3005898 if ((ret = decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 0)) < 0 ) {
1124 9 return -1;
1125 }
1126 3005889 h->cbp_table[mb_xy] |= ret << 12;
1127
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3005889 times.
3005889 if (CHROMA444(h)) {
1128 ✗ if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 1) < 0 ) {
1129 ✗ return -1;
1130 }
1131 ✗ if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 2) < 0 ) {
1132 ✗ return -1;
1133 }
1134 } else {
1135 3005889 const int num_c8x8 = h->ps.sps->chroma_format_idc;
1136
1137
2/2
✓ Branch 0 taken 1651605 times.
✓ Branch 1 taken 1354284 times.
3005889 if(cbp&0x30){
1138
2/2
✓ Branch 0 taken 3303210 times.
✓ Branch 1 taken 1651605 times.
4954815 for(chroma_idx=0; chroma_idx<2; chroma_idx++)
1139
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3303210 times.
3303210 if (decode_residual(h, sl, gb, sl->mb + ((256 + 16*16*chroma_idx) << pixel_shift),
1140 CHROMA_DC_BLOCK_INDEX + chroma_idx,
1141
2/2
✓ Branch 0 taken 579058 times.
✓ Branch 1 taken 2724152 times.
3303210 CHROMA422(h) ? ff_h264_chroma422_dc_scan : ff_h264_chroma_dc_scan,
1142 NULL, 4 * num_c8x8) < 0) {
1143 ✗ return -1;
1144 }
1145 }
1146
1147
2/2
✓ Branch 0 taken 1032855 times.
✓ Branch 1 taken 1973034 times.
3005889 if(cbp&0x20){
1148
2/2
✓ Branch 0 taken 2065709 times.
✓ Branch 1 taken 1032849 times.
3098558 for(chroma_idx=0; chroma_idx<2; chroma_idx++){
1149
2/2
✓ Branch 0 taken 1197151 times.
✓ Branch 1 taken 868558 times.
2065709 const uint32_t *qmul = h->ps.pps->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[chroma_idx]];
1150 2065709 int16_t *mb = sl->mb + (16*(16 + 16*chroma_idx) << pixel_shift);
1151
2/2
✓ Branch 0 taken 2452853 times.
✓ Branch 1 taken 2065703 times.
4518556 for (i8x8 = 0; i8x8<num_c8x8; i8x8++) {
1152
2/2
✓ Branch 0 taken 9811406 times.
✓ Branch 1 taken 2452847 times.
12264253 for (i4x4 = 0; i4x4 < 4; i4x4++) {
1153 9811406 const int index = 16 + 16*chroma_idx + 8*i8x8 + i4x4;
1154
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 9811400 times.
9811406 if (decode_residual(h, sl, gb, mb, index, scan + 1, qmul, 15) < 0)
1155 6 return -1;
1156 9811400 mb += 16 << pixel_shift;
1157 }
1158 }
1159 }
1160 }else{
1161 1973034 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1162 1973034 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1163 }
1164 }
1165 }else{
1166 704607 fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
1167 704607 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1168 704607 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1169 }
1170 3710490 h->cur_pic.qscale_table[mb_xy] = sl->qscale;
1171 3710490 write_back_non_zero_count(h, sl);
1172
1173 3710490 return 0;
1174 }
1175