FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/h264_cavlc.c
Date: 2026-09-27 07:50:39
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 43138232 static inline int pred_non_zero_count(const H264Context *h, const H264SliceContext *sl, int n)
276 {
277 43138232 const int index8= scan8[n];
278 43138232 const int left = sl->non_zero_count_cache[index8 - 1];
279 43138232 const int top = sl->non_zero_count_cache[index8 - 8];
280 43138232 int i= left + top;
281
282
2/2
✓ Branch 0 taken 41468485 times.
✓ Branch 1 taken 1669747 times.
43138232 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 43138232 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 717625 static inline int get_level_prefix(GetBitContext *gb){
383 unsigned int buf;
384 int log;
385
386 717625 OPEN_READER(re, gb);
387 717625 UPDATE_CACHE(re, gb);
388 717625 buf=GET_CACHE(re, gb);
389
390 717625 log= 32 - av_log2(buf);
391
392 717625 LAST_SKIP_BITS(re, gb, log);
393 717625 CLOSE_READER(re, gb);
394
395 717625 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 46441562 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 3303330 times.
✓ Branch 1 taken 43138232 times.
46441562 if(max_coeff <= 8){
416
2/2
✓ Branch 0 taken 2724272 times.
✓ Branch 1 taken 579058 times.
3303330 if (max_coeff == 4)
417 2724272 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 299617 times.
✓ Branch 1 taken 42838615 times.
43437849 total_coeff = pred_non_zero_count(h, sl, n >= LUMA_DC_BLOCK_INDEX ?
424 299617 (n - LUMA_DC_BLOCK_INDEX) * 16 : n);
425 43138232 coeff_token = get_vlc2(gb, coeff_token_vlc[total_coeff],
426 COEFF_TOKEN_VLC_BITS, 2);
427 }
428 46441562 total_coeff = coeff_token >> 2;
429 46441562 sl->non_zero_count_cache[scan8[n]] = total_coeff;
430
431 //FIXME set last_non_zero?
432
433
2/2
✓ Branch 0 taken 16212221 times.
✓ Branch 1 taken 30229341 times.
46441562 if(total_coeff==0)
434 16212221 return 0;
435
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 30229332 times.
30229341 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 30229332 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 30229332 i = show_bits(gb, 3);
445 30229332 skip_bits(gb, trailing_ones);
446 30229332 level[0] = 1-((i&4)>>1);
447 30229332 level[1] = 1-((i&2) );
448 30229332 level[2] = 1-((i&1)<<1);
449
450
2/2
✓ Branch 0 taken 13700878 times.
✓ Branch 1 taken 16528454 times.
30229332 if(trailing_ones<total_coeff) {
451 int mask, prefix;
452 13700878 int suffix_length = total_coeff > 10 & trailing_ones < 3;
453 13700878 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
454 13700878 int level_code= cavlc_level_tab[suffix_length][bitsi][0];
455
456 13700878 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
457
2/2
✓ Branch 0 taken 318986 times.
✓ Branch 1 taken 13381892 times.
13700878 if(level_code >= 100){
458 318986 prefix= level_code - 100;
459
2/2
✓ Branch 0 taken 314837 times.
✓ Branch 1 taken 4149 times.
318986 if(prefix == LEVEL_TAB_BITS)
460 314837 prefix += get_level_prefix(gb);
461
462 //first coefficient has suffix_length equal to 0 or 1
463
2/2
✓ Branch 0 taken 192656 times.
✓ Branch 1 taken 126330 times.
318986 if(prefix<14){ //FIXME try to build a large unified VLC table for all this
464
2/2
✓ Branch 0 taken 13168 times.
✓ Branch 1 taken 179488 times.
192656 if(suffix_length)
465 13168 level_code= (prefix<<1) + get_bits1(gb); //part
466 else
467 179488 level_code= prefix; //part
468
2/2
✓ Branch 0 taken 59181 times.
✓ Branch 1 taken 67149 times.
126330 }else if(prefix==14){
469
2/2
✓ Branch 0 taken 536 times.
✓ Branch 1 taken 58645 times.
59181 if(suffix_length)
470 536 level_code= (prefix<<1) + get_bits1(gb); //part
471 else
472 58645 level_code= prefix + get_bits(gb, 4); //part
473 }else{
474 67149 level_code= 30;
475
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 67125 times.
67149 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 67149 level_code += get_bits(gb, prefix-3); //part
483 }
484
485
2/2
✓ Branch 0 taken 246134 times.
✓ Branch 1 taken 72852 times.
318986 if(trailing_ones < 3) level_code += 2;
486
487 318986 suffix_length = 2;
488 318986 mask= -(level_code&1);
489 318986 level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask;
490 }else{
491 13381892 level_code += ((level_code>>31)|1) & -(trailing_ones < 3);
492
493
2/2
✓ Branch 0 taken 757144 times.
✓ Branch 1 taken 12624748 times.
13381892 suffix_length = 1 + (level_code + 3U > 6U);
494 13381892 level[trailing_ones]= level_code;
495 }
496
497 //remaining coefficients have suffix_length > 0
498
2/2
✓ Branch 0 taken 39146877 times.
✓ Branch 1 taken 13700878 times.
52847755 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 39146877 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
501 39146877 level_code= cavlc_level_tab[suffix_length][bitsi][0];
502
503 39146877 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
504
2/2
✓ Branch 0 taken 812012 times.
✓ Branch 1 taken 38334865 times.
39146877 if(level_code >= 100){
505 812012 prefix= level_code - 100;
506
2/2
✓ Branch 0 taken 402788 times.
✓ Branch 1 taken 409224 times.
812012 if(prefix == LEVEL_TAB_BITS){
507 402788 prefix += get_level_prefix(gb);
508 }
509
2/2
✓ Branch 0 taken 745569 times.
✓ Branch 1 taken 66443 times.
812012 if(prefix<15){
510 745569 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
511 }else{
512 66443 level_code = 15<<suffix_length;
513
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 66439 times.
66443 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 66443 level_code += get_bits(gb, prefix-3);
521 }
522 812012 mask= -(level_code&1);
523 812012 level_code= (((2+level_code)>>1) ^ mask) - mask;
524 }
525 39146877 level[i]= level_code;
526 39146877 suffix_length+= suffix_limit[suffix_length] + level_code > 2U*suffix_limit[suffix_length];
527 }
528 }
529
530
2/2
✓ Branch 0 taken 305286 times.
✓ Branch 1 taken 29924046 times.
30229332 if(total_coeff == max_coeff)
531 305286 zeros_left=0;
532 else{
533
2/2
✓ Branch 0 taken 1972962 times.
✓ Branch 1 taken 27951084 times.
29924046 if (max_coeff <= 8) {
534
2/2
✓ Branch 0 taken 1515580 times.
✓ Branch 1 taken 457382 times.
1972962 if (max_coeff == 4)
535 1515580 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 27951084 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 19767156 times.
30229332 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 1517701 times.
✓ Branch 1 taken 18249455 times.
✓ Branch 2 taken 665153 times.
✓ Branch 3 taken 20091 times.
✓ Branch 6 taken 1119328 times.
✓ Branch 7 taken 1083617 times.
✓ Branch 8 taken 685244 times.
✓ Branch 9 taken 434084 times.
✓ Branch 10 taken 1089935 times.
✓ Branch 11 taken 1517701 times.
✓ Branch 12 taken 27175030 times.
✓ Branch 13 taken 4117574 times.
✓ Branch 16 taken 35526629 times.
✓ Branch 17 taken 14015430 times.
✓ Branch 18 taken 31292604 times.
✓ Branch 19 taken 4234025 times.
✓ Branch 20 taken 11938177 times.
✓ Branch 21 taken 18249455 times.
64773116 STORE_BLOCK(int16_t)
584 }
585
586
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 30229326 times.
30229332 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 30229326 return 0;
592 }
593
594 static av_always_inline
595 3005987 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 3005987 times.
✗ Branch 1 not taken.
3005987 int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
602
2/2
✓ Branch 0 taken 299617 times.
✓ Branch 1 taken 2706370 times.
3005987 if(IS_INTRA16x16(mb_type)){
603 299617 AV_ZERO128(sl->mb_luma_dc[p]+0);
604 299617 AV_ZERO128(sl->mb_luma_dc[p]+8);
605 299617 AV_ZERO128(sl->mb_luma_dc[p]+16);
606 299617 AV_ZERO128(sl->mb_luma_dc[p]+24);
607
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 299617 times.
299617 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 195610 times.
299617 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 195610 fill_rectangle(&sl->non_zero_count_cache[scan8[p*16]], 4, 4, 8, 0, 1);
626 195610 return 0;
627 }
628 }else{
629
2/2
✓ Branch 0 taken 1154467 times.
✓ Branch 1 taken 1551903 times.
2706370 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 2706370 int new_cbp = 0;
632
2/2
✓ Branch 0 taken 10825468 times.
✓ Branch 1 taken 2706363 times.
13531831 for(i8x8=0; i8x8<4; i8x8++){
633
2/2
✓ Branch 0 taken 7840706 times.
✓ Branch 1 taken 2984762 times.
10825468 if(cbp & (1<<i8x8)){
634
2/2
✓ Branch 0 taken 2320623 times.
✓ Branch 1 taken 5520083 times.
7840706 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 22080327 times.
✓ Branch 1 taken 5520076 times.
27600403 for(i4x4=0; i4x4<4; i4x4++){
648 22080327 const int index= i4x4 + 4*i8x8 + p*16;
649
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 22080320 times.
22080327 if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift), index,
650 22080327 scan, h->ps.pps->dequant4_coeff[cqm][qscale], 16) < 0 ){
651 7 return -1;
652 }
653 22080320 new_cbp |= sl->non_zero_count_cache[scan8[index]] << i8x8;
654 }
655 }
656 }else{
657 2984762 uint8_t * const nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]];
658 2984762 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
659 }
660 }
661 2706363 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 3023433 static GetBitContext *mb_residual_gb(const H264Context *h, H264SliceContext *sl,
668 unsigned mb_type)
669 {
670 3023433 int intra = IS_INTRA(mb_type);
671
672
2/2
✓ Branch 0 taken 3018635 times.
✓ Branch 1 taken 4798 times.
3023433 if (!sl->data_partitioning)
673 3018635 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 4858837 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 4858837 int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
688
4/4
✓ Branch 0 taken 389328 times.
✓ Branch 1 taken 4469509 times.
✓ Branch 2 taken 346560 times.
✓ Branch 3 taken 42768 times.
4858837 const int decode_chroma = h->ps.sps->chroma_format_idc == 1 || h->ps.sps->chroma_format_idc == 2;
689 4858837 const int pixel_shift = h->pixel_shift;
690
691 4858837 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 4858837 cbp = 0; /* avoid warning. FIXME: find a solution without slowing
695 down the code */
696
2/2
✓ Branch 0 taken 3769074 times.
✓ Branch 1 taken 1089763 times.
4858837 if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
697
2/2
✓ Branch 0 taken 2641896 times.
✓ Branch 1 taken 1127178 times.
3769074 if (sl->mb_skip_run == -1) {
698 2641896 unsigned mb_skip_run = get_ue_golomb_long(&sl->gb);
699
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2641896 times.
2641896 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 2641896 sl->mb_skip_run = mb_skip_run;
704 }
705
706
2/2
✓ Branch 0 taken 1130788 times.
✓ Branch 1 taken 2638286 times.
3769074 if (sl->mb_skip_run--) {
707
4/4
✓ Branch 0 taken 11109 times.
✓ Branch 1 taken 1119679 times.
✓ Branch 2 taken 5515 times.
✓ Branch 3 taken 5594 times.
1130788 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 1130788 decode_mb_skip(h, sl);
712 1130788 return 0;
713 }
714 }
715
2/2
✓ Branch 0 taken 497835 times.
✓ Branch 1 taken 3230214 times.
3728049 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 3728049 sl->prev_mb_skipped = 0;
721
722 3728049 mb_type= get_ue_golomb(&sl->gb);
723
2/2
✓ Branch 0 taken 901135 times.
✓ Branch 1 taken 2826914 times.
3728049 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 1737151 times.
✓ Branch 1 taken 1089763 times.
2826914 } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
732
2/2
✓ Branch 0 taken 1470452 times.
✓ Branch 1 taken 266699 times.
1737151 if(mb_type < 5){
733 1470452 partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
734 1470452 mb_type = ff_h264_p_mb_type_info[mb_type].type;
735 }else{
736 266699 mb_type -= 5;
737 266699 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 1497499 times.
1497499 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 1497499 partition_count=0;
749 1497499 cbp = ff_h264_i_mb_type_info[mb_type].cbp;
750 1497499 sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
751 1497499 mb_type = ff_h264_i_mb_type_info[mb_type].type;
752 }
753
754
2/2
✓ Branch 0 taken 981328 times.
✓ Branch 1 taken 2746721 times.
3728049 if (MB_FIELD(sl))
755 981328 mb_type |= MB_TYPE_INTERLACED;
756
757 3728049 h->slice_table[mb_xy] = sl->slice_num;
758
759
2/2
✓ Branch 0 taken 17446 times.
✓ Branch 1 taken 3710603 times.
3728049 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 3710603 fill_decode_neighbors(h, sl, mb_type);
785 3710603 fill_decode_caches(h, sl, mb_type);
786
787 //mb_pred
788
2/2
✓ Branch 0 taken 1480053 times.
✓ Branch 1 taken 2230550 times.
3710603 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 299617 times.
1480053 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 599234 sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
819 299617 sl->left_samples_available, sl->intra16x16_pred_mode, 0);
820
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 299617 times.
299617 if (sl->intra16x16_pred_mode < 0)
821 ✗ return -1;
822 }
823
2/2
✓ Branch 0 taken 1452924 times.
✓ Branch 1 taken 27129 times.
1480053 if(decode_chroma){
824 1452924 pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
825 1452924 sl->left_samples_available, get_ue_golomb_31(&sl->gb), 1);
826
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1452924 times.
1452924 if(pred_mode < 0)
827 ✗ return -1;
828 1452924 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 1712759 times.
2230550 }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 1573633 times.
1712759 }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 1072893 times.
✓ Branch 1 taken 500740 times.
1573633 if(IS_16X16(mb_type)){
943
2/2
✓ Branch 0 taken 1336782 times.
✓ Branch 1 taken 1072893 times.
2409675 for (list = 0; list < sl->list_count; list++) {
944 unsigned int val;
945
2/2
✓ Branch 0 taken 1129447 times.
✓ Branch 1 taken 207335 times.
1336782 if (IS_DIR(mb_type, 0, list)) {
946 1129447 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
947
2/2
✓ Branch 0 taken 629996 times.
✓ Branch 1 taken 499451 times.
1129447 if (rc == 1) {
948 629996 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 1129447 fill_rectangle(&sl->ref_cache[list][scan8[0]], 4, 4, 8, val, 1);
959 }
960 }
961
2/2
✓ Branch 0 taken 1336782 times.
✓ Branch 1 taken 1072893 times.
2409675 for (list = 0; list < sl->list_count; list++) {
962
2/2
✓ Branch 0 taken 1129447 times.
✓ Branch 1 taken 207335 times.
1336782 if(IS_DIR(mb_type, 0, list)){
963 1129447 pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
964 1129447 mx += (unsigned)get_se_golomb(&sl->gb);
965 1129447 my += (unsigned)get_se_golomb(&sl->gb);
966 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
967
968 1129447 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 2230550 times.
✓ Branch 1 taken 1480053 times.
3710603 if(IS_INTER(mb_type))
1051 2230550 write_back_motion(h, sl, mb_type);
1052
1053
2/2
✓ Branch 0 taken 3410986 times.
✓ Branch 1 taken 299617 times.
3710603 if(!IS_INTRA16x16(mb_type)){
1054 3410986 cbp= get_ue_golomb(&sl->gb);
1055
1056
2/2
✓ Branch 0 taken 3371636 times.
✓ Branch 1 taken 39350 times.
3410986 if(decode_chroma){
1057
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3371636 times.
3371636 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 2215349 times.
3371636 if (IS_INTRA4x4(mb_type))
1062 1156287 cbp = ff_h264_golomb_to_intra4x4_cbp[cbp];
1063 else
1064 2215349 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 296637 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2980 times.
299617 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 2360417 times.
✓ Branch 2 taken 1155963 times.
✓ Branch 3 taken 194223 times.
✓ Branch 4 taken 275548 times.
✓ Branch 5 taken 880415 times.
3710603 if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){
1081 275548 mb_type |= MB_TYPE_8x8DCT*get_bits1(&sl->gb);
1082 }
1083 3710603 sl->cbp=
1084 3710603 h->cbp_table[mb_xy]= cbp;
1085 3710603 h->cur_pic.mb_type[mb_xy] = mb_type;
1086
1087
4/4
✓ Branch 0 taken 876016 times.
✓ Branch 1 taken 2834587 times.
✓ Branch 2 taken 171400 times.
✓ Branch 3 taken 704616 times.
6716575 if(cbp || IS_INTRA16x16(mb_type)){
1088 int i4x4, i8x8, chroma_idx;
1089 int dquant;
1090 int ret;
1091 3005987 GetBitContext *gb = mb_residual_gb(h, sl, mb_type);
1092 const uint8_t *scan, *scan8x8;
1093 3005987 const int max_qp = 51 + 6 * (h->ps.sps->bit_depth_luma - 8);
1094
1095
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3005987 times.
3005987 if (!gb)
1096 ✗ return AVERROR_INVALIDDATA;
1097
1098 3005987 dquant= get_se_golomb(&sl->gb);
1099
1100 3005987 sl->qscale += (unsigned)dquant;
1101
1102
2/2
✓ Branch 0 taken 8070 times.
✓ Branch 1 taken 2997917 times.
3005987 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 3005987 sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
1113 3005987 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 2181824 times.
3005987 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 2180935 times.
✓ Branch 1 taken 889 times.
2181824 scan8x8 = sl->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0;
1120
2/2
✓ Branch 0 taken 2180935 times.
✓ Branch 1 taken 889 times.
2181824 scan = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
1121 }
1122
1123
2/2
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 3005978 times.
3005987 if ((ret = decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 0)) < 0 ) {
1124 9 return -1;
1125 }
1126 3005978 h->cbp_table[mb_xy] |= ret << 12;
1127
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3005978 times.
3005978 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 3005978 const int num_c8x8 = h->ps.sps->chroma_format_idc;
1136
1137
2/2
✓ Branch 0 taken 1651665 times.
✓ Branch 1 taken 1354313 times.
3005978 if(cbp&0x30){
1138
2/2
✓ Branch 0 taken 3303330 times.
✓ Branch 1 taken 1651665 times.
4954995 for(chroma_idx=0; chroma_idx<2; chroma_idx++)
1139
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3303330 times.
3303330 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 2724272 times.
3303330 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 1032892 times.
✓ Branch 1 taken 1973086 times.
3005978 if(cbp&0x20){
1148
2/2
✓ Branch 0 taken 2065783 times.
✓ Branch 1 taken 1032886 times.
3098669 for(chroma_idx=0; chroma_idx<2; chroma_idx++){
1149
2/2
✓ Branch 0 taken 1197153 times.
✓ Branch 1 taken 868630 times.
2065783 const uint32_t *qmul = h->ps.pps->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[chroma_idx]];
1150 2065783 int16_t *mb = sl->mb + (16*(16 + 16*chroma_idx) << pixel_shift);
1151
2/2
✓ Branch 0 taken 2452927 times.
✓ Branch 1 taken 2065777 times.
4518704 for (i8x8 = 0; i8x8<num_c8x8; i8x8++) {
1152
2/2
✓ Branch 0 taken 9811702 times.
✓ Branch 1 taken 2452921 times.
12264623 for (i4x4 = 0; i4x4 < 4; i4x4++) {
1153 9811702 const int index = 16 + 16*chroma_idx + 8*i8x8 + i4x4;
1154
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 9811696 times.
9811702 if (decode_residual(h, sl, gb, mb, index, scan + 1, qmul, 15) < 0)
1155 6 return -1;
1156 9811696 mb += 16 << pixel_shift;
1157 }
1158 }
1159 }
1160 }else{
1161 1973086 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1162 1973086 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1163 }
1164 }
1165 }else{
1166 704616 fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
1167 704616 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1168 704616 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1169 }
1170 3710588 h->cur_pic.qscale_table[mb_xy] = sl->qscale;
1171 3710588 write_back_non_zero_count(h, sl);
1172
1173 3710588 return 0;
1174 }
1175