FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/h264_cavlc.c
Date: 2026-10-30 17:37:53
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 43578729 static inline int pred_non_zero_count(const H264Context *h, const H264SliceContext *sl, int n)
276 {
277 43578729 const int index8= scan8[n];
278 43578729 const int left = sl->non_zero_count_cache[index8 - 1];
279 43578729 const int top = sl->non_zero_count_cache[index8 - 8];
280 43578729 int i= left + top;
281
282
2/2
✓ Branch 0 taken 41883221 times.
✓ Branch 1 taken 1695508 times.
43578729 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 43578729 return i&31;
287 }
288
289 386 static av_cold void init_cavlc_level_tab(void){
290 int suffix_length;
291 unsigned int i;
292
293
2/2
✓ Branch 0 taken 2702 times.
✓ Branch 1 taken 386 times.
3088 for(suffix_length=0; suffix_length<7; suffix_length++){
294
2/2
✓ Branch 0 taken 691712 times.
✓ Branch 1 taken 2702 times.
694414 for(i=0; i<(1<<LEVEL_TAB_BITS); i++){
295 691712 int prefix= LEVEL_TAB_BITS - av_log2(2*i);
296
297
2/2
✓ Branch 0 taken 642690 times.
✓ Branch 1 taken 49022 times.
691712 if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){
298 642690 int level_code = (prefix << suffix_length) +
299 642690 (i >> (av_log2(i) - suffix_length)) - (1 << suffix_length);
300 642690 int mask = -(level_code&1);
301 642690 level_code = (((2 + level_code) >> 1) ^ mask) - mask;
302 642690 cavlc_level_tab[suffix_length][i][0]= level_code;
303 642690 cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length;
304
2/2
✓ Branch 0 taken 46320 times.
✓ Branch 1 taken 2702 times.
49022 }else if(prefix + 1 <= LEVEL_TAB_BITS){
305 46320 cavlc_level_tab[suffix_length][i][0]= prefix+100;
306 46320 cavlc_level_tab[suffix_length][i][1]= prefix + 1;
307 }else{
308 2702 cavlc_level_tab[suffix_length][i][0]= LEVEL_TAB_BITS+100;
309 2702 cavlc_level_tab[suffix_length][i][1]= LEVEL_TAB_BITS;
310 }
311 }
312 }
313 386 }
314
315 386 av_cold void ff_h264_decode_init_vlc(void)
316 {
317 const VLCElem *coeff_token_vlc_original[4];
318 386 VLCInitState state = VLC_INIT_STATE(run7_vlc_table);
319
320 386 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 386 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 386 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 2316 times.
✓ Branch 1 taken 386 times.
2702 for (int i = 0; i < 6; i++) {
335 2316 run_vlc[i + 1] = ff_vlc_init_tables(&state, RUN_VLC_BITS, 7,
336 2316 &run_len [i][0], 1, 1,
337 2316 &run_bits[i][0], 1, 1, 0);
338 }
339
340
2/2
✓ Branch 0 taken 1544 times.
✓ Branch 1 taken 386 times.
1930 for (int i = 0; i < 4; i++) {
341 1544 coeff_token_vlc_original[i] =
342 1544 ff_vlc_init_tables(&state, COEFF_TOKEN_VLC_BITS, 4*17,
343 1544 &coeff_token_len [i][0], 1, 1,
344 1544 &coeff_token_bits[i][0], 1, 1, 0);
345 }
346
2/2
✓ Branch 0 taken 6562 times.
✓ Branch 1 taken 386 times.
6948 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 6562 coeff_token_vlc[i] = coeff_token_vlc_original[coeff_token_table_index[i]];
351 }
352
353
2/2
✓ Branch 0 taken 1158 times.
✓ Branch 1 taken 386 times.
1544 for (int i = 0; i < 3; i++) {
354 1158 chroma_dc_total_zeros_vlc[i + 1] =
355 1158 ff_vlc_init_tables(&state, CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
356 1158 &chroma_dc_total_zeros_len [i][0], 1, 1,
357 1158 &chroma_dc_total_zeros_bits[i][0], 1, 1, 0);
358 }
359
360
2/2
✓ Branch 0 taken 2702 times.
✓ Branch 1 taken 386 times.
3088 for (int i = 0; i < 7; i++) {
361 2702 chroma422_dc_total_zeros_vlc[i + 1] =
362 2702 ff_vlc_init_tables(&state, CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 8,
363 2702 &chroma422_dc_total_zeros_len [i][0], 1, 1,
364 2702 &chroma422_dc_total_zeros_bits[i][0], 1, 1, 0);
365 }
366
367
2/2
✓ Branch 0 taken 5790 times.
✓ Branch 1 taken 386 times.
6176 for (int i = 0; i < 15; i++) {
368 5790 total_zeros_vlc[i + 1] =
369 5790 ff_vlc_init_tables(&state, TOTAL_ZEROS_VLC_BITS, 16,
370 5790 &total_zeros_len [i][0], 1, 1,
371 5790 &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 386 init_cavlc_level_tab();
380 386 }
381
382 720588 static inline int get_level_prefix(GetBitContext *gb){
383 unsigned int buf;
384 int log;
385
386 720588 OPEN_READER(re, gb);
387 720588 UPDATE_CACHE(re, gb);
388 720588 buf=GET_CACHE(re, gb);
389
390 720588 log= 32 - av_log2(buf);
391
392 720588 LAST_SKIP_BITS(re, gb, log);
393 720588 CLOSE_READER(re, gb);
394
395 720588 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 46921639 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 3342910 times.
✓ Branch 1 taken 43578729 times.
46921639 if(max_coeff <= 8){
416
2/2
✓ Branch 0 taken 2763852 times.
✓ Branch 1 taken 579058 times.
3342910 if (max_coeff == 4)
417 2763852 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 303846 times.
✓ Branch 1 taken 43274883 times.
43882575 total_coeff = pred_non_zero_count(h, sl, n >= LUMA_DC_BLOCK_INDEX ?
424 303846 (n - LUMA_DC_BLOCK_INDEX) * 16 : n);
425 43578729 coeff_token = get_vlc2(gb, coeff_token_vlc[total_coeff],
426 COEFF_TOKEN_VLC_BITS, 2);
427 }
428 46921639 total_coeff = coeff_token >> 2;
429 46921639 sl->non_zero_count_cache[scan8[n]] = total_coeff;
430
431 //FIXME set last_non_zero?
432
433
2/2
✓ Branch 0 taken 16373220 times.
✓ Branch 1 taken 30548419 times.
46921639 if(total_coeff==0)
434 16373220 return 0;
435
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 30548410 times.
30548419 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 30548410 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 30548410 i = show_bits(gb, 3);
445 30548410 skip_bits(gb, trailing_ones);
446 30548410 level[0] = 1-((i&4)>>1);
447 30548410 level[1] = 1-((i&2) );
448 30548410 level[2] = 1-((i&1)<<1);
449
450
2/2
✓ Branch 0 taken 13832304 times.
✓ Branch 1 taken 16716106 times.
30548410 if(trailing_ones<total_coeff) {
451 int mask, prefix;
452 13832304 int suffix_length = total_coeff > 10 & trailing_ones < 3;
453 13832304 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
454 13832304 int level_code= cavlc_level_tab[suffix_length][bitsi][0];
455
456 13832304 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
457
2/2
✓ Branch 0 taken 320278 times.
✓ Branch 1 taken 13512026 times.
13832304 if(level_code >= 100){
458 320278 prefix= level_code - 100;
459
2/2
✓ Branch 0 taken 316131 times.
✓ Branch 1 taken 4147 times.
320278 if(prefix == LEVEL_TAB_BITS)
460 316131 prefix += get_level_prefix(gb);
461
462 //first coefficient has suffix_length equal to 0 or 1
463
2/2
✓ Branch 0 taken 193742 times.
✓ Branch 1 taken 126536 times.
320278 if(prefix<14){ //FIXME try to build a large unified VLC table for all this
464
2/2
✓ Branch 0 taken 13170 times.
✓ Branch 1 taken 180572 times.
193742 if(suffix_length)
465 13170 level_code= (prefix<<1) + get_bits1(gb); //part
466 else
467 180572 level_code= prefix; //part
468
2/2
✓ Branch 0 taken 59331 times.
✓ Branch 1 taken 67205 times.
126536 }else if(prefix==14){
469
2/2
✓ Branch 0 taken 536 times.
✓ Branch 1 taken 58795 times.
59331 if(suffix_length)
470 536 level_code= (prefix<<1) + get_bits1(gb); //part
471 else
472 58795 level_code= prefix + get_bits(gb, 4); //part
473 }else{
474 67205 level_code= 30;
475
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 67181 times.
67205 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 67205 level_code += get_bits(gb, prefix-3); //part
483 }
484
485
2/2
✓ Branch 0 taken 246883 times.
✓ Branch 1 taken 73395 times.
320278 if(trailing_ones < 3) level_code += 2;
486
487 320278 suffix_length = 2;
488 320278 mask= -(level_code&1);
489 320278 level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask;
490 }else{
491 13512026 level_code += ((level_code>>31)|1) & -(trailing_ones < 3);
492
493
2/2
✓ Branch 0 taken 763298 times.
✓ Branch 1 taken 12748728 times.
13512026 suffix_length = 1 + (level_code + 3U > 6U);
494 13512026 level[trailing_ones]= level_code;
495 }
496
497 //remaining coefficients have suffix_length > 0
498
2/2
✓ Branch 0 taken 39375760 times.
✓ Branch 1 taken 13832304 times.
53208064 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 39375760 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
501 39375760 level_code= cavlc_level_tab[suffix_length][bitsi][0];
502
503 39375760 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
504
2/2
✓ Branch 0 taken 815619 times.
✓ Branch 1 taken 38560141 times.
39375760 if(level_code >= 100){
505 815619 prefix= level_code - 100;
506
2/2
✓ Branch 0 taken 404457 times.
✓ Branch 1 taken 411162 times.
815619 if(prefix == LEVEL_TAB_BITS){
507 404457 prefix += get_level_prefix(gb);
508 }
509
2/2
✓ Branch 0 taken 749033 times.
✓ Branch 1 taken 66586 times.
815619 if(prefix<15){
510 749033 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
511 }else{
512 66586 level_code = 15<<suffix_length;
513
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 66582 times.
66586 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 66586 level_code += get_bits(gb, prefix-3);
521 }
522 815619 mask= -(level_code&1);
523 815619 level_code= (((2+level_code)>>1) ^ mask) - mask;
524 }
525 39375760 level[i]= level_code;
526 39375760 suffix_length+= suffix_limit[suffix_length] + level_code > 2U*suffix_limit[suffix_length];
527 }
528 }
529
530
2/2
✓ Branch 0 taken 306558 times.
✓ Branch 1 taken 30241852 times.
30548410 if(total_coeff == max_coeff)
531 306558 zeros_left=0;
532 else{
533
2/2
✓ Branch 0 taken 2000431 times.
✓ Branch 1 taken 28241421 times.
30241852 if (max_coeff <= 8) {
534
2/2
✓ Branch 0 taken 1543049 times.
✓ Branch 1 taken 457382 times.
2000431 if (max_coeff == 4)
535 1543049 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 28241421 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 20086234 times.
30548410 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 1550117 times.
✓ Branch 1 taken 18536117 times.
✓ Branch 2 taken 687161 times.
✓ Branch 3 taken 21019 times.
✓ Branch 6 taken 1151836 times.
✓ Branch 7 taken 1106461 times.
✓ Branch 8 taken 708180 times.
✓ Branch 9 taken 443656 times.
✓ Branch 10 taken 1112333 times.
✓ Branch 11 taken 1550117 times.
✓ Branch 12 taken 27474479 times.
✓ Branch 13 taken 4168304 times.
✓ Branch 16 taken 35951426 times.
✓ Branch 17 taken 14227474 times.
✓ Branch 18 taken 31642783 times.
✓ Branch 19 taken 4308643 times.
✓ Branch 20 taken 12086716 times.
✓ Branch 21 taken 18536117 times.
65636246 STORE_BLOCK(int16_t)
584 }
585
586
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 30548404 times.
30548410 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 30548404 return 0;
592 }
593
594 static av_always_inline
595 3036318 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 3036318 times.
✗ Branch 1 not taken.
3036318 int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
602
2/2
✓ Branch 0 taken 303846 times.
✓ Branch 1 taken 2732472 times.
3036318 if(IS_INTRA16x16(mb_type)){
603 303846 AV_ZERO128(sl->mb_luma_dc[p]+0);
604 303846 AV_ZERO128(sl->mb_luma_dc[p]+8);
605 303846 AV_ZERO128(sl->mb_luma_dc[p]+16);
606 303846 AV_ZERO128(sl->mb_luma_dc[p]+24);
607
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 303846 times.
303846 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 107619 times.
✓ Branch 1 taken 196227 times.
303846 if(cbp&15){
614
2/2
✓ Branch 0 taken 430472 times.
✓ Branch 1 taken 107617 times.
538089 for(i8x8=0; i8x8<4; i8x8++){
615
2/2
✓ Branch 0 taken 1721886 times.
✓ Branch 1 taken 430470 times.
2152356 for(i4x4=0; i4x4<4; i4x4++){
616 1721886 const int index= i4x4 + 4*i8x8 + p*16;
617
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1721884 times.
1721886 if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift),
618 1721886 index, scan + 1, h->ps.pps->dequant4_coeff[p][qscale], 15) < 0 ){
619 2 return -1;
620 }
621 }
622 }
623 107617 return 0xf;
624 }else{
625 196227 fill_rectangle(&sl->non_zero_count_cache[scan8[p*16]], 4, 4, 8, 0, 1);
626 196227 return 0;
627 }
628 }else{
629
2/2
✓ Branch 0 taken 1172107 times.
✓ Branch 1 taken 1560365 times.
2732472 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 2732472 int new_cbp = 0;
632
2/2
✓ Branch 0 taken 10929876 times.
✓ Branch 1 taken 2732465 times.
13662341 for(i8x8=0; i8x8<4; i8x8++){
633
2/2
✓ Branch 0 taken 7920963 times.
✓ Branch 1 taken 3008913 times.
10929876 if(cbp & (1<<i8x8)){
634
2/2
✓ Branch 0 taken 2320623 times.
✓ Branch 1 taken 5600340 times.
7920963 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 22401355 times.
✓ Branch 1 taken 5600333 times.
28001688 for(i4x4=0; i4x4<4; i4x4++){
648 22401355 const int index= i4x4 + 4*i8x8 + p*16;
649
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 22401348 times.
22401355 if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift), index,
650 22401355 scan, h->ps.pps->dequant4_coeff[cqm][qscale], 16) < 0 ){
651 7 return -1;
652 }
653 22401348 new_cbp |= sl->non_zero_count_cache[scan8[index]] << i8x8;
654 }
655 }
656 }else{
657 3008913 uint8_t * const nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]];
658 3008913 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
659 }
660 }
661 2732465 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 3053764 static GetBitContext *mb_residual_gb(const H264Context *h, H264SliceContext *sl,
668 unsigned mb_type)
669 {
670 3053764 int intra = IS_INTRA(mb_type);
671
672
2/2
✓ Branch 0 taken 3048966 times.
✓ Branch 1 taken 4798 times.
3053764 if (!sl->data_partitioning)
673 3048966 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 4938691 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 4938691 int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
688
4/4
✓ Branch 0 taken 389328 times.
✓ Branch 1 taken 4549363 times.
✓ Branch 2 taken 346560 times.
✓ Branch 3 taken 42768 times.
4938691 const int decode_chroma = h->ps.sps->chroma_format_idc == 1 || h->ps.sps->chroma_format_idc == 2;
689 4938691 const int pixel_shift = h->pixel_shift;
690
691 4938691 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 4938691 cbp = 0; /* avoid warning. FIXME: find a solution without slowing
695 down the code */
696
2/2
✓ Branch 0 taken 3836454 times.
✓ Branch 1 taken 1102237 times.
4938691 if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
697
2/2
✓ Branch 0 taken 2676981 times.
✓ Branch 1 taken 1159473 times.
3836454 if (sl->mb_skip_run == -1) {
698 2676981 unsigned mb_skip_run = get_ue_golomb_long(&sl->gb);
699
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2676981 times.
2676981 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 2676981 sl->mb_skip_run = mb_skip_run;
704 }
705
706
2/2
✓ Branch 0 taken 1163212 times.
✓ Branch 1 taken 2673242 times.
3836454 if (sl->mb_skip_run--) {
707
4/4
✓ Branch 0 taken 11109 times.
✓ Branch 1 taken 1152103 times.
✓ Branch 2 taken 5515 times.
✓ Branch 3 taken 5594 times.
1163212 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 1163212 decode_mb_skip(h, sl);
712 1163212 return 0;
713 }
714 }
715
2/2
✓ Branch 0 taken 497835 times.
✓ Branch 1 taken 3277644 times.
3775479 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 3775479 sl->prev_mb_skipped = 0;
721
722 3775479 mb_type= get_ue_golomb(&sl->gb);
723
2/2
✓ Branch 0 taken 907535 times.
✓ Branch 1 taken 2867944 times.
3775479 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
724
2/2
✓ Branch 0 taken 766490 times.
✓ Branch 1 taken 141045 times.
907535 if(mb_type < 23){
725 766490 partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
726 766490 mb_type = ff_h264_b_mb_type_info[mb_type].type;
727 }else{
728 141045 mb_type -= 23;
729 141045 goto decode_intra_mb;
730 }
731
2/2
✓ Branch 0 taken 1765707 times.
✓ Branch 1 taken 1102237 times.
2867944 } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
732
2/2
✓ Branch 0 taken 1489589 times.
✓ Branch 1 taken 276118 times.
1765707 if(mb_type < 5){
733 1489589 partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
734 1489589 mb_type = ff_h264_p_mb_type_info[mb_type].type;
735 }else{
736 276118 mb_type -= 5;
737 276118 goto decode_intra_mb;
738 }
739 }else{
740 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
741
1/4
✓ Branch 0 taken 1102237 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1102237 if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
742 ✗ mb_type--;
743 1102237 decode_intra_mb:
744
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1519400 times.
1519400 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 1519400 partition_count=0;
749 1519400 cbp = ff_h264_i_mb_type_info[mb_type].cbp;
750 1519400 sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
751 1519400 mb_type = ff_h264_i_mb_type_info[mb_type].type;
752 }
753
754
2/2
✓ Branch 0 taken 981328 times.
✓ Branch 1 taken 2794151 times.
3775479 if (MB_FIELD(sl))
755 981328 mb_type |= MB_TYPE_INTERLACED;
756
757 3775479 h->slice_table[mb_xy] = sl->slice_num;
758
759
2/2
✓ Branch 0 taken 17446 times.
✓ Branch 1 taken 3758033 times.
3775479 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 3758033 fill_decode_neighbors(h, sl, mb_type);
785 3758033 fill_decode_caches(h, sl, mb_type);
786
787 //mb_pred
788
2/2
✓ Branch 0 taken 1501954 times.
✓ Branch 1 taken 2256079 times.
3758033 if(IS_INTRA(mb_type)){
789 int pred_mode;
790 // init_top_left_availability(h);
791
2/2
✓ Branch 0 taken 1198108 times.
✓ Branch 1 taken 303846 times.
1501954 if(IS_INTRA4x4(mb_type)){
792 int i;
793 1198108 int di = 1;
794
4/4
✓ Branch 0 taken 855937 times.
✓ Branch 1 taken 342171 times.
✓ Branch 3 taken 541711 times.
✓ Branch 4 taken 314226 times.
1198108 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 12669196 times.
✓ Branch 1 taken 1198108 times.
13867304 for(i=0; i<16; i+=di){
801 12669196 int mode = pred_intra_mode(h, sl, i);
802
803
2/2
✓ Branch 1 taken 6764808 times.
✓ Branch 2 taken 5904388 times.
12669196 if(!get_bits1(&sl->gb)){
804 6764808 const int rem_mode= get_bits(&sl->gb, 3);
805 6764808 mode = rem_mode + (rem_mode >= mode);
806 }
807
808
2/2
✓ Branch 0 taken 2166844 times.
✓ Branch 1 taken 10502352 times.
12669196 if(di==4)
809 2166844 fill_rectangle(&sl->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1);
810 else
811 10502352 sl->intra4x4_pred_mode_cache[scan8[i]] = mode;
812 }
813 1198108 write_back_intra_pred_mode(h, sl);
814
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1198108 times.
1198108 if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
815 1198108 sl->top_samples_available, sl->left_samples_available) < 0)
816 ✗ return -1;
817 }else{
818 607692 sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
819 303846 sl->left_samples_available, sl->intra16x16_pred_mode, 0);
820
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 303846 times.
303846 if (sl->intra16x16_pred_mode < 0)
821 ✗ return -1;
822 }
823
2/2
✓ Branch 0 taken 1474825 times.
✓ Branch 1 taken 27129 times.
1501954 if(decode_chroma){
824 1474825 pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
825 1474825 sl->left_samples_available, get_ue_golomb_31(&sl->gb), 1);
826
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1474825 times.
1474825 if(pred_mode < 0)
827 ✗ return -1;
828 1474825 sl->chroma_pred_mode = pred_mode;
829 } else {
830 27129 sl->chroma_pred_mode = DC_128_PRED8x8;
831 }
832
2/2
✓ Branch 0 taken 519107 times.
✓ Branch 1 taken 1736972 times.
2256079 }else if(partition_count==4){
833 int i, j, sub_partition_count[4], list, ref[2][4];
834
835
2/2
✓ Branch 0 taken 178735 times.
✓ Branch 1 taken 340372 times.
519107 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
836
2/2
✓ Branch 0 taken 714940 times.
✓ Branch 1 taken 178735 times.
893675 for(i=0; i<4; i++){
837 714940 sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb);
838
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 714940 times.
714940 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 714940 sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
843 714940 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 56261 times.
✓ Branch 1 taken 122474 times.
178735 if( IS_DIRECT(sl->sub_mb_type[0]|sl->sub_mb_type[1]|sl->sub_mb_type[2]|sl->sub_mb_type[3])) {
846 56261 ff_h264_pred_direct_motion(h, sl, &mb_type);
847 56261 sl->ref_cache[0][scan8[4]] =
848 56261 sl->ref_cache[1][scan8[4]] =
849 56261 sl->ref_cache[0][scan8[12]] =
850 56261 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 1361488 times.
✓ Branch 1 taken 340372 times.
1701860 for(i=0; i<4; i++){
855 1361488 sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb);
856
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1361488 times.
1361488 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 1361488 sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
861 1361488 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 697842 times.
✓ Branch 1 taken 519107 times.
1216949 for (list = 0; list < sl->list_count; list++) {
866
2/2
✓ Branch 0 taken 573678 times.
✓ Branch 1 taken 124164 times.
697842 int ref_count = IS_REF0(mb_type) ? 1 : sl->ref_count[list] << MB_MBAFF(sl);
867
2/2
✓ Branch 0 taken 2791368 times.
✓ Branch 1 taken 697842 times.
3489210 for(i=0; i<4; i++){
868
2/2
✓ Branch 0 taken 233138 times.
✓ Branch 1 taken 2558230 times.
2791368 if(IS_DIRECT(sl->sub_mb_type[i])) continue;
869
2/2
✓ Branch 0 taken 2229862 times.
✓ Branch 1 taken 328368 times.
2558230 if(IS_DIR(sl->sub_mb_type[i], 0, list)){
870 unsigned int tmp;
871
2/2
✓ Branch 0 taken 785261 times.
✓ Branch 1 taken 1444601 times.
2229862 if(ref_count == 1){
872 785261 tmp= 0;
873
2/2
✓ Branch 0 taken 454516 times.
✓ Branch 1 taken 990085 times.
1444601 }else if(ref_count == 2){
874 454516 tmp= get_bits1(&sl->gb)^1;
875 }else{
876 990085 tmp= get_ue_golomb_31(&sl->gb);
877
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 990085 times.
990085 if(tmp>=ref_count){
878 ✗ av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp);
879 ✗ return -1;
880 }
881 }
882 2229862 ref[list][i]= tmp;
883 }else{
884 //FIXME
885 328368 ref[list][i] = -1;
886 }
887 }
888 }
889
890
2/2
✓ Branch 0 taken 51527 times.
✓ Branch 1 taken 467580 times.
519107 if(dct8x8_allowed)
891 51527 dct8x8_allowed = get_dct8x8_allowed(h, sl);
892
893
2/2
✓ Branch 0 taken 697842 times.
✓ Branch 1 taken 519107 times.
1216949 for (list = 0; list < sl->list_count; list++) {
894
2/2
✓ Branch 0 taken 2791368 times.
✓ Branch 1 taken 697842 times.
3489210 for(i=0; i<4; i++){
895
2/2
✓ Branch 0 taken 233138 times.
✓ Branch 1 taken 2558230 times.
2791368 if(IS_DIRECT(sl->sub_mb_type[i])) {
896 233138 sl->ref_cache[list][ scan8[4*i] ] = sl->ref_cache[list][ scan8[4*i]+1 ];
897 233138 continue;
898 }
899 2558230 sl->ref_cache[list][ scan8[4*i] ]=sl->ref_cache[list][ scan8[4*i]+1 ]=
900 2558230 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 2229862 times.
✓ Branch 1 taken 328368 times.
2558230 if(IS_DIR(sl->sub_mb_type[i], 0, list)){
903 2229862 const int sub_mb_type= sl->sub_mb_type[i];
904
2/2
✓ Branch 0 taken 1683027 times.
✓ Branch 1 taken 546835 times.
2229862 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
905
2/2
✓ Branch 0 taken 3693606 times.
✓ Branch 1 taken 2229862 times.
5923468 for(j=0; j<sub_partition_count[i]; j++){
906 int mx, my;
907 3693606 const int index= 4*i + block_width*j;
908 3693606 int16_t (* mv_cache)[2]= &sl->mv_cache[list][ scan8[index] ];
909 3693606 pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
910 3693606 mx += (unsigned)get_se_golomb(&sl->gb);
911 3693606 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 1170628 times.
✓ Branch 1 taken 2522978 times.
3693606 if(IS_SUB_8X8(sub_mb_type)){
915 1170628 mv_cache[ 1 ][0]=
916 1170628 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
917 1170628 mv_cache[ 1 ][1]=
918 1170628 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
919
2/2
✓ Branch 0 taken 1024798 times.
✓ Branch 1 taken 1498180 times.
2522978 }else if(IS_SUB_8X4(sub_mb_type)){
920 1024798 mv_cache[ 1 ][0]= mx;
921 1024798 mv_cache[ 1 ][1]= my;
922
2/2
✓ Branch 0 taken 689160 times.
✓ Branch 1 taken 809020 times.
1498180 }else if(IS_SUB_4X8(sub_mb_type)){
923 689160 mv_cache[ 8 ][0]= mx;
924 689160 mv_cache[ 8 ][1]= my;
925 }
926 3693606 mv_cache[ 0 ][0]= mx;
927 3693606 mv_cache[ 0 ][1]= my;
928 }
929 }else{
930 328368 uint32_t *p= (uint32_t *)&sl->mv_cache[list][ scan8[4*i] ][0];
931 328368 p[0] = p[1]=
932 328368 p[8] = p[9]= 0;
933 }
934 }
935 }
936
2/2
✓ Branch 0 taken 139250 times.
✓ Branch 1 taken 1597722 times.
1736972 }else if(IS_DIRECT(mb_type)){
937 139250 ff_h264_pred_direct_motion(h, sl, &mb_type);
938 139250 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 1087872 times.
✓ Branch 1 taken 509850 times.
1597722 if(IS_16X16(mb_type)){
943
2/2
✓ Branch 0 taken 1356317 times.
✓ Branch 1 taken 1087872 times.
2444189 for (list = 0; list < sl->list_count; list++) {
944 unsigned int val;
945
2/2
✓ Branch 0 taken 1145126 times.
✓ Branch 1 taken 211191 times.
1356317 if (IS_DIR(mb_type, 0, list)) {
946 1145126 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
947
2/2
✓ Branch 0 taken 644531 times.
✓ Branch 1 taken 500595 times.
1145126 if (rc == 1) {
948 644531 val = 0;
949
2/2
✓ Branch 0 taken 135560 times.
✓ Branch 1 taken 365035 times.
500595 } else if (rc == 2) {
950 135560 val = get_bits1(&sl->gb)^1;
951 } else {
952 365035 val = get_ue_golomb_31(&sl->gb);
953
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 365035 times.
365035 if (val >= rc) {
954 ✗ av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
955 ✗ return -1;
956 }
957 }
958 1145126 fill_rectangle(&sl->ref_cache[list][scan8[0]], 4, 4, 8, val, 1);
959 }
960 }
961
2/2
✓ Branch 0 taken 1356317 times.
✓ Branch 1 taken 1087872 times.
2444189 for (list = 0; list < sl->list_count; list++) {
962
2/2
✓ Branch 0 taken 1145126 times.
✓ Branch 1 taken 211191 times.
1356317 if(IS_DIR(mb_type, 0, list)){
963 1145126 pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
964 1145126 mx += (unsigned)get_se_golomb(&sl->gb);
965 1145126 my += (unsigned)get_se_golomb(&sl->gb);
966 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
967
968 1145126 fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
969 }
970 }
971 }
972
2/2
✓ Branch 0 taken 269977 times.
✓ Branch 1 taken 239873 times.
509850 else if(IS_16X8(mb_type)){
973
2/2
✓ Branch 0 taken 369286 times.
✓ Branch 1 taken 269977 times.
639263 for (list = 0; list < sl->list_count; list++) {
974
2/2
✓ Branch 0 taken 738572 times.
✓ Branch 1 taken 369286 times.
1107858 for (i = 0; i < 2; i++) {
975 unsigned int val;
976
2/2
✓ Branch 0 taken 583046 times.
✓ Branch 1 taken 155526 times.
738572 if (IS_DIR(mb_type, i, list)) {
977 583046 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
978
2/2
✓ Branch 0 taken 239747 times.
✓ Branch 1 taken 343299 times.
583046 if (rc == 1) {
979 239747 val = 0;
980
2/2
✓ Branch 0 taken 80287 times.
✓ Branch 1 taken 263012 times.
343299 } else if (rc == 2) {
981 80287 val = get_bits1(&sl->gb)^1;
982 } else {
983 263012 val = get_ue_golomb_31(&sl->gb);
984
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 263012 times.
263012 if (val >= rc) {
985 ✗ av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
986 ✗ return -1;
987 }
988 }
989 } else
990 155526 val = LIST_NOT_USED & 0xFF;
991 738572 fill_rectangle(&sl->ref_cache[list][scan8[0] + 16*i], 4, 2, 8, val, 1);
992 }
993 }
994
2/2
✓ Branch 0 taken 369286 times.
✓ Branch 1 taken 269977 times.
639263 for (list = 0; list < sl->list_count; list++) {
995
2/2
✓ Branch 0 taken 738572 times.
✓ Branch 1 taken 369286 times.
1107858 for(i=0; i<2; i++){
996 unsigned int val;
997
2/2
✓ Branch 0 taken 583046 times.
✓ Branch 1 taken 155526 times.
738572 if(IS_DIR(mb_type, i, list)){
998 583046 pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
999 583046 mx += (unsigned)get_se_golomb(&sl->gb);
1000 583046 my += (unsigned)get_se_golomb(&sl->gb);
1001 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
1002
1003 583046 val= pack16to32(mx,my);
1004 }else
1005 155526 val=0;
1006 738572 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 320624 times.
✓ Branch 1 taken 239873 times.
560497 for (list = 0; list < sl->list_count; list++) {
1012
2/2
✓ Branch 0 taken 641248 times.
✓ Branch 1 taken 320624 times.
961872 for (i = 0; i < 2; i++) {
1013 unsigned int val;
1014
2/2
✓ Branch 0 taken 513246 times.
✓ Branch 1 taken 128002 times.
641248 if (IS_DIR(mb_type, i, list)) { //FIXME optimize
1015 513246 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
1016
2/2
✓ Branch 0 taken 211309 times.
✓ Branch 1 taken 301937 times.
513246 if (rc == 1) {
1017 211309 val = 0;
1018
2/2
✓ Branch 0 taken 82792 times.
✓ Branch 1 taken 219145 times.
301937 } else if (rc == 2) {
1019 82792 val = get_bits1(&sl->gb)^1;
1020 } else {
1021 219145 val = get_ue_golomb_31(&sl->gb);
1022
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 219145 times.
219145 if (val >= rc) {
1023 ✗ av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
1024 ✗ return -1;
1025 }
1026 }
1027 } else
1028 128002 val = LIST_NOT_USED & 0xFF;
1029 641248 fill_rectangle(&sl->ref_cache[list][scan8[0] + 2*i], 2, 4, 8, val, 1);
1030 }
1031 }
1032
2/2
✓ Branch 0 taken 320624 times.
✓ Branch 1 taken 239873 times.
560497 for (list = 0; list < sl->list_count; list++) {
1033
2/2
✓ Branch 0 taken 641248 times.
✓ Branch 1 taken 320624 times.
961872 for(i=0; i<2; i++){
1034 unsigned int val;
1035
2/2
✓ Branch 0 taken 513246 times.
✓ Branch 1 taken 128002 times.
641248 if(IS_DIR(mb_type, i, list)){
1036 513246 pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
1037 513246 mx += (unsigned)get_se_golomb(&sl->gb);
1038 513246 my += (unsigned)get_se_golomb(&sl->gb);
1039 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
1040
1041 513246 val= pack16to32(mx,my);
1042 }else
1043 128002 val=0;
1044 641248 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 2256079 times.
✓ Branch 1 taken 1501954 times.
3758033 if(IS_INTER(mb_type))
1051 2256079 write_back_motion(h, sl, mb_type);
1052
1053
2/2
✓ Branch 0 taken 3454187 times.
✓ Branch 1 taken 303846 times.
3758033 if(!IS_INTRA16x16(mb_type)){
1054 3454187 cbp= get_ue_golomb(&sl->gb);
1055
1056
2/2
✓ Branch 0 taken 3414837 times.
✓ Branch 1 taken 39350 times.
3454187 if(decode_chroma){
1057
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3414837 times.
3414837 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 1173959 times.
✓ Branch 1 taken 2240878 times.
3414837 if (IS_INTRA4x4(mb_type))
1062 1173959 cbp = ff_h264_golomb_to_intra4x4_cbp[cbp];
1063 else
1064 2240878 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 300866 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2980 times.
303846 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 2407847 times.
✓ Branch 2 taken 1155963 times.
✓ Branch 3 taken 194223 times.
✓ Branch 4 taken 275548 times.
✓ Branch 5 taken 880415 times.
3758033 if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){
1081 275548 mb_type |= MB_TYPE_8x8DCT*get_bits1(&sl->gb);
1082 }
1083 3758033 sl->cbp=
1084 3758033 h->cbp_table[mb_xy]= cbp;
1085 3758033 h->cur_pic.mb_type[mb_xy] = mb_type;
1086
1087
4/4
✓ Branch 0 taken 893352 times.
✓ Branch 1 taken 2864681 times.
✓ Branch 2 taken 171637 times.
✓ Branch 3 taken 721715 times.
6794336 if(cbp || IS_INTRA16x16(mb_type)){
1088 int i4x4, i8x8, chroma_idx;
1089 int dquant;
1090 int ret;
1091 3036318 GetBitContext *gb = mb_residual_gb(h, sl, mb_type);
1092 const uint8_t *scan, *scan8x8;
1093 3036318 const int max_qp = 51 + 6 * (h->ps.sps->bit_depth_luma - 8);
1094
1095
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3036318 times.
3036318 if (!gb)
1096 ✗ return AVERROR_INVALIDDATA;
1097
1098 3036318 dquant= get_se_golomb(&sl->gb);
1099
1100 3036318 sl->qscale += (unsigned)dquant;
1101
1102
2/2
✓ Branch 0 taken 8070 times.
✓ Branch 1 taken 3028248 times.
3036318 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 3036318 sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
1113 3036318 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 2212155 times.
3036318 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 2211266 times.
✓ Branch 1 taken 889 times.
2212155 scan8x8 = sl->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0;
1120
2/2
✓ Branch 0 taken 2211266 times.
✓ Branch 1 taken 889 times.
2212155 scan = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
1121 }
1122
1123
2/2
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 3036309 times.
3036318 if ((ret = decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 0)) < 0 ) {
1124 9 return -1;
1125 }
1126 3036309 h->cbp_table[mb_xy] |= ret << 12;
1127
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3036309 times.
3036309 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 3036309 const int num_c8x8 = h->ps.sps->chroma_format_idc;
1136
1137
2/2
✓ Branch 0 taken 1671455 times.
✓ Branch 1 taken 1364854 times.
3036309 if(cbp&0x30){
1138
2/2
✓ Branch 0 taken 3342910 times.
✓ Branch 1 taken 1671455 times.
5014365 for(chroma_idx=0; chroma_idx<2; chroma_idx++)
1139
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3342910 times.
3342910 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 2763852 times.
3342910 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 1040073 times.
✓ Branch 1 taken 1996236 times.
3036309 if(cbp&0x20){
1148
2/2
✓ Branch 0 taken 2080145 times.
✓ Branch 1 taken 1040067 times.
3120212 for(chroma_idx=0; chroma_idx<2; chroma_idx++){
1149
2/2
✓ Branch 0 taken 1211139 times.
✓ Branch 1 taken 869006 times.
2080145 const uint32_t *qmul = h->ps.pps->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[chroma_idx]];
1150 2080145 int16_t *mb = sl->mb + (16*(16 + 16*chroma_idx) << pixel_shift);
1151
2/2
✓ Branch 0 taken 2467289 times.
✓ Branch 1 taken 2080139 times.
4547428 for (i8x8 = 0; i8x8<num_c8x8; i8x8++) {
1152
2/2
✓ Branch 0 taken 9869150 times.
✓ Branch 1 taken 2467283 times.
12336433 for (i4x4 = 0; i4x4 < 4; i4x4++) {
1153 9869150 const int index = 16 + 16*chroma_idx + 8*i8x8 + i4x4;
1154
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 9869144 times.
9869150 if (decode_residual(h, sl, gb, mb, index, scan + 1, qmul, 15) < 0)
1155 6 return -1;
1156 9869144 mb += 16 << pixel_shift;
1157 }
1158 }
1159 }
1160 }else{
1161 1996236 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1162 1996236 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1163 }
1164 }
1165 }else{
1166 721715 fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
1167 721715 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1168 721715 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1169 }
1170 3758018 h->cur_pic.qscale_table[mb_xy] = sl->qscale;
1171 3758018 write_back_non_zero_count(h, sl);
1172
1173 3758018 return 0;
1174 }
1175