FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/h264_cavlc.c
Date: 2022-07-04 00:18:54
Exec Total Coverage
Lines: 457 507 90.1%
Branches: 347 384 90.4%

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 static VLC coeff_token_vlc[4];
238 static VLCElem coeff_token_vlc_tables[520+332+280+256];
239 static const int coeff_token_vlc_tables_size[4]={520,332,280,256};
240
241 static VLC chroma_dc_coeff_token_vlc;
242 static VLCElem chroma_dc_coeff_token_vlc_table[256];
243 static const int chroma_dc_coeff_token_vlc_table_size = 256;
244
245 static VLC chroma422_dc_coeff_token_vlc;
246 static VLCElem chroma422_dc_coeff_token_vlc_table[8192];
247 static const int chroma422_dc_coeff_token_vlc_table_size = 8192;
248
249 static VLC total_zeros_vlc[15+1];
250 static VLCElem total_zeros_vlc_tables[15][512];
251 static const int total_zeros_vlc_tables_size = 512;
252
253 static VLC chroma_dc_total_zeros_vlc[3+1];
254 static VLCElem chroma_dc_total_zeros_vlc_tables[3][8];
255 static const int chroma_dc_total_zeros_vlc_tables_size = 8;
256
257 static VLC chroma422_dc_total_zeros_vlc[7+1];
258 static VLCElem chroma422_dc_total_zeros_vlc_tables[7][32];
259 static const int chroma422_dc_total_zeros_vlc_tables_size = 32;
260
261 static VLC run_vlc[6+1];
262 static VLCElem run_vlc_tables[6][8];
263 static const int run_vlc_tables_size = 8;
264
265 static VLC run7_vlc;
266 static VLCElem run7_vlc_table[96];
267 static const int run7_vlc_table_size = 96;
268
269 #define LEVEL_TAB_BITS 8
270 static int8_t cavlc_level_tab[7][1<<LEVEL_TAB_BITS][2];
271
272 #define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
273 #define CHROMA422_DC_COEFF_TOKEN_VLC_BITS 13
274 #define COEFF_TOKEN_VLC_BITS 8
275 #define TOTAL_ZEROS_VLC_BITS 9
276 #define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
277 #define CHROMA422_DC_TOTAL_ZEROS_VLC_BITS 5
278 #define RUN_VLC_BITS 3
279 #define RUN7_VLC_BITS 6
280
281 /**
282 * Get the predicted number of non-zero coefficients.
283 * @param n block index
284 */
285 42151049 static inline int pred_non_zero_count(const H264Context *h, H264SliceContext *sl, int n)
286 {
287 42151049 const int index8= scan8[n];
288 42151049 const int left = sl->non_zero_count_cache[index8 - 1];
289 42151049 const int top = sl->non_zero_count_cache[index8 - 8];
290 42151049 int i= left + top;
291
292
2/2
✓ Branch 0 taken 40528662 times.
✓ Branch 1 taken 1622387 times.
42151049 if(i<64) i= (i+1)>>1;
293
294 ff_tlog(h->avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31);
295
296 42151049 return i&31;
297 }
298
299 295 static av_cold void init_cavlc_level_tab(void){
300 int suffix_length;
301 unsigned int i;
302
303
2/2
✓ Branch 0 taken 2065 times.
✓ Branch 1 taken 295 times.
2360 for(suffix_length=0; suffix_length<7; suffix_length++){
304
2/2
✓ Branch 0 taken 528640 times.
✓ Branch 1 taken 2065 times.
530705 for(i=0; i<(1<<LEVEL_TAB_BITS); i++){
305 528640 int prefix= LEVEL_TAB_BITS - av_log2(2*i);
306
307
2/2
✓ Branch 0 taken 491175 times.
✓ Branch 1 taken 37465 times.
528640 if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){
308 491175 int level_code = (prefix << suffix_length) +
309 491175 (i >> (av_log2(i) - suffix_length)) - (1 << suffix_length);
310 491175 int mask = -(level_code&1);
311 491175 level_code = (((2 + level_code) >> 1) ^ mask) - mask;
312 491175 cavlc_level_tab[suffix_length][i][0]= level_code;
313 491175 cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length;
314
2/2
✓ Branch 0 taken 35400 times.
✓ Branch 1 taken 2065 times.
37465 }else if(prefix + 1 <= LEVEL_TAB_BITS){
315 35400 cavlc_level_tab[suffix_length][i][0]= prefix+100;
316 35400 cavlc_level_tab[suffix_length][i][1]= prefix + 1;
317 }else{
318 2065 cavlc_level_tab[suffix_length][i][0]= LEVEL_TAB_BITS+100;
319 2065 cavlc_level_tab[suffix_length][i][1]= LEVEL_TAB_BITS;
320 }
321 }
322 }
323 295 }
324
325 295 av_cold void ff_h264_decode_init_vlc(void)
326 {
327 int offset;
328
329 295 chroma_dc_coeff_token_vlc.table = chroma_dc_coeff_token_vlc_table;
330 295 chroma_dc_coeff_token_vlc.table_allocated = chroma_dc_coeff_token_vlc_table_size;
331 295 init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5,
332 &chroma_dc_coeff_token_len [0], 1, 1,
333 &chroma_dc_coeff_token_bits[0], 1, 1,
334 INIT_VLC_USE_NEW_STATIC);
335
336 295 chroma422_dc_coeff_token_vlc.table = chroma422_dc_coeff_token_vlc_table;
337 295 chroma422_dc_coeff_token_vlc.table_allocated = chroma422_dc_coeff_token_vlc_table_size;
338 295 init_vlc(&chroma422_dc_coeff_token_vlc, CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 4*9,
339 &chroma422_dc_coeff_token_len [0], 1, 1,
340 &chroma422_dc_coeff_token_bits[0], 1, 1,
341 INIT_VLC_USE_NEW_STATIC);
342
343 295 offset = 0;
344
2/2
✓ Branch 0 taken 1180 times.
✓ Branch 1 taken 295 times.
1475 for (int i = 0; i < 4; i++) {
345 1180 coeff_token_vlc[i].table = coeff_token_vlc_tables + offset;
346 1180 coeff_token_vlc[i].table_allocated = coeff_token_vlc_tables_size[i];
347 1180 init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17,
348 &coeff_token_len [i][0], 1, 1,
349 &coeff_token_bits[i][0], 1, 1,
350 INIT_VLC_USE_NEW_STATIC);
351 1180 offset += coeff_token_vlc_tables_size[i];
352 }
353 /*
354 * This is a one time safety check to make sure that
355 * the packed static coeff_token_vlc table sizes
356 * were initialized correctly.
357 */
358
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 295 times.
295 av_assert0(offset == FF_ARRAY_ELEMS(coeff_token_vlc_tables));
359
360
2/2
✓ Branch 0 taken 885 times.
✓ Branch 1 taken 295 times.
1180 for (int i = 0; i < 3; i++) {
361 885 chroma_dc_total_zeros_vlc[i + 1].table = chroma_dc_total_zeros_vlc_tables[i];
362 885 chroma_dc_total_zeros_vlc[i + 1].table_allocated = chroma_dc_total_zeros_vlc_tables_size;
363 885 init_vlc(&chroma_dc_total_zeros_vlc[i + 1],
364 CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
365 &chroma_dc_total_zeros_len [i][0], 1, 1,
366 &chroma_dc_total_zeros_bits[i][0], 1, 1,
367 INIT_VLC_USE_NEW_STATIC);
368 }
369
370
2/2
✓ Branch 0 taken 2065 times.
✓ Branch 1 taken 295 times.
2360 for (int i = 0; i < 7; i++) {
371 2065 chroma422_dc_total_zeros_vlc[i + 1].table = chroma422_dc_total_zeros_vlc_tables[i];
372 2065 chroma422_dc_total_zeros_vlc[i + 1].table_allocated = chroma422_dc_total_zeros_vlc_tables_size;
373 2065 init_vlc(&chroma422_dc_total_zeros_vlc[i + 1],
374 CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 8,
375 &chroma422_dc_total_zeros_len [i][0], 1, 1,
376 &chroma422_dc_total_zeros_bits[i][0], 1, 1,
377 INIT_VLC_USE_NEW_STATIC);
378 }
379
380
2/2
✓ Branch 0 taken 4425 times.
✓ Branch 1 taken 295 times.
4720 for (int i = 0; i < 15; i++) {
381 4425 total_zeros_vlc[i + 1].table = total_zeros_vlc_tables[i];
382 4425 total_zeros_vlc[i + 1].table_allocated = total_zeros_vlc_tables_size;
383 4425 init_vlc(&total_zeros_vlc[i + 1],
384 TOTAL_ZEROS_VLC_BITS, 16,
385 &total_zeros_len [i][0], 1, 1,
386 &total_zeros_bits[i][0], 1, 1,
387 INIT_VLC_USE_NEW_STATIC);
388 }
389
390
2/2
✓ Branch 0 taken 1770 times.
✓ Branch 1 taken 295 times.
2065 for (int i = 0; i < 6; i++) {
391 1770 run_vlc[i + 1].table = run_vlc_tables[i];
392 1770 run_vlc[i + 1].table_allocated = run_vlc_tables_size;
393 1770 init_vlc(&run_vlc[i + 1],
394 RUN_VLC_BITS, 7,
395 &run_len [i][0], 1, 1,
396 &run_bits[i][0], 1, 1,
397 INIT_VLC_USE_NEW_STATIC);
398 }
399 295 run7_vlc.table = run7_vlc_table;
400 295 run7_vlc.table_allocated = run7_vlc_table_size;
401 295 init_vlc(&run7_vlc, RUN7_VLC_BITS, 16,
402 &run_len [6][0], 1, 1,
403 &run_bits[6][0], 1, 1,
404 INIT_VLC_USE_NEW_STATIC);
405
406 295 init_cavlc_level_tab();
407 295 }
408
409 683265 static inline int get_level_prefix(GetBitContext *gb){
410 unsigned int buf;
411 int log;
412
413 683265 OPEN_READER(re, gb);
414 683265 UPDATE_CACHE(re, gb);
415 683265 buf=GET_CACHE(re, gb);
416
417 683265 log= 32 - av_log2(buf);
418
419 683265 LAST_SKIP_BITS(re, gb, log);
420 683265 CLOSE_READER(re, gb);
421
422 683265 return log-1;
423 }
424
425 /**
426 * Decode a residual block.
427 * @param n block index
428 * @param scantable scantable
429 * @param max_coeff number of coefficients in the block
430 * @return <0 if an error occurred
431 */
432 45327825 static int decode_residual(const H264Context *h, H264SliceContext *sl,
433 GetBitContext *gb, int16_t *block, int n,
434 const uint8_t *scantable, const uint32_t *qmul,
435 int max_coeff)
436 {
437 static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3};
438 int level[16];
439 int zeros_left, coeff_token, total_coeff, i, trailing_ones, run_before;
440
441 //FIXME put trailing_onex into the context
442
443
2/2
✓ Branch 0 taken 3176776 times.
✓ Branch 1 taken 42151049 times.
45327825 if(max_coeff <= 8){
444
2/2
✓ Branch 0 taken 2597718 times.
✓ Branch 1 taken 579058 times.
3176776 if (max_coeff == 4)
445 2597718 coeff_token = get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1);
446 else
447 579058 coeff_token = get_vlc2(gb, chroma422_dc_coeff_token_vlc.table, CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 1);
448 3176776 total_coeff= coeff_token>>2;
449 }else{
450
2/2
✓ Branch 0 taken 214013 times.
✓ Branch 1 taken 41937036 times.
42151049 if(n >= LUMA_DC_BLOCK_INDEX){
451 214013 total_coeff= pred_non_zero_count(h, sl, (n - LUMA_DC_BLOCK_INDEX)*16);
452 214013 coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
453 214013 total_coeff= coeff_token>>2;
454 }else{
455 41937036 total_coeff= pred_non_zero_count(h, sl, n);
456 41937036 coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
457 41937036 total_coeff= coeff_token>>2;
458 }
459 }
460 45327825 sl->non_zero_count_cache[scan8[n]] = total_coeff;
461
462 //FIXME set last_non_zero?
463
464
2/2
✓ Branch 0 taken 15759805 times.
✓ Branch 1 taken 29568020 times.
45327825 if(total_coeff==0)
465 15759805 return 0;
466
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29568020 times.
29568020 if(total_coeff > (unsigned)max_coeff) {
467 av_log(h->avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", sl->mb_x, sl->mb_y, total_coeff);
468 return -1;
469 }
470
471 29568020 trailing_ones= coeff_token&3;
472 ff_tlog(h->avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff);
473 av_assert2(total_coeff<=16);
474
475 29568020 i = show_bits(gb, 3);
476 29568020 skip_bits(gb, trailing_ones);
477 29568020 level[0] = 1-((i&4)>>1);
478 29568020 level[1] = 1-((i&2) );
479 29568020 level[2] = 1-((i&1)<<1);
480
481
2/2
✓ Branch 0 taken 13418917 times.
✓ Branch 1 taken 16149103 times.
29568020 if(trailing_ones<total_coeff) {
482 int mask, prefix;
483 13418917 int suffix_length = total_coeff > 10 & trailing_ones < 3;
484 13418917 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
485 13418917 int level_code= cavlc_level_tab[suffix_length][bitsi][0];
486
487 13418917 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
488
2/2
✓ Branch 0 taken 305524 times.
✓ Branch 1 taken 13113393 times.
13418917 if(level_code >= 100){
489 305524 prefix= level_code - 100;
490
2/2
✓ Branch 0 taken 301789 times.
✓ Branch 1 taken 3735 times.
305524 if(prefix == LEVEL_TAB_BITS)
491 301789 prefix += get_level_prefix(gb);
492
493 //first coefficient has suffix_length equal to 0 or 1
494
2/2
✓ Branch 0 taken 184547 times.
✓ Branch 1 taken 120977 times.
305524 if(prefix<14){ //FIXME try to build a large unified VLC table for all this
495
2/2
✓ Branch 0 taken 12209 times.
✓ Branch 1 taken 172338 times.
184547 if(suffix_length)
496 12209 level_code= (prefix<<1) + get_bits1(gb); //part
497 else
498 172338 level_code= prefix; //part
499
2/2
✓ Branch 0 taken 55325 times.
✓ Branch 1 taken 65652 times.
120977 }else if(prefix==14){
500
2/2
✓ Branch 0 taken 536 times.
✓ Branch 1 taken 54789 times.
55325 if(suffix_length)
501 536 level_code= (prefix<<1) + get_bits1(gb); //part
502 else
503 54789 level_code= prefix + get_bits(gb, 4); //part
504 }else{
505 65652 level_code= 30;
506
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 65628 times.
65652 if(prefix>=16){
507
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if(prefix > 25+3){
508 av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n");
509 return -1;
510 }
511 24 level_code += (1<<(prefix-3))-4096;
512 }
513 65652 level_code += get_bits(gb, prefix-3); //part
514 }
515
516
2/2
✓ Branch 0 taken 234684 times.
✓ Branch 1 taken 70840 times.
305524 if(trailing_ones < 3) level_code += 2;
517
518 305524 suffix_length = 2;
519 305524 mask= -(level_code&1);
520 305524 level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask;
521 }else{
522 13113393 level_code += ((level_code>>31)|1) & -(trailing_ones < 3);
523
524
2/2
✓ Branch 0 taken 728230 times.
✓ Branch 1 taken 12385163 times.
13113393 suffix_length = 1 + (level_code + 3U > 6U);
525 13113393 level[trailing_ones]= level_code;
526 }
527
528 //remaining coefficients have suffix_length > 0
529
2/2
✓ Branch 0 taken 38204419 times.
✓ Branch 1 taken 13418917 times.
51623336 for(i=trailing_ones+1;i<total_coeff;i++) {
530 static const unsigned int suffix_limit[7] = {0,3,6,12,24,48,INT_MAX };
531 38204419 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
532 38204419 level_code= cavlc_level_tab[suffix_length][bitsi][0];
533
534 38204419 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
535
2/2
✓ Branch 0 taken 765594 times.
✓ Branch 1 taken 37438825 times.
38204419 if(level_code >= 100){
536 765594 prefix= level_code - 100;
537
2/2
✓ Branch 0 taken 381476 times.
✓ Branch 1 taken 384118 times.
765594 if(prefix == LEVEL_TAB_BITS){
538 381476 prefix += get_level_prefix(gb);
539 }
540
2/2
✓ Branch 0 taken 702402 times.
✓ Branch 1 taken 63192 times.
765594 if(prefix<15){
541 702402 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
542 }else{
543 63192 level_code = 15<<suffix_length;
544
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 63188 times.
63192 if (prefix>=16) {
545
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if(prefix > 25+3){
546 av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n");
547 return AVERROR_INVALIDDATA;
548 }
549 4 level_code += (1<<(prefix-3))-4096;
550 }
551 63192 level_code += get_bits(gb, prefix-3);
552 }
553 765594 mask= -(level_code&1);
554 765594 level_code= (((2+level_code)>>1) ^ mask) - mask;
555 }
556 38204419 level[i]= level_code;
557 38204419 suffix_length+= suffix_limit[suffix_length] + level_code > 2U*suffix_limit[suffix_length];
558 }
559 }
560
561
2/2
✓ Branch 0 taken 291986 times.
✓ Branch 1 taken 29276034 times.
29568020 if(total_coeff == max_coeff)
562 291986 zeros_left=0;
563 else{
564
2/2
✓ Branch 0 taken 1893584 times.
✓ Branch 1 taken 27382450 times.
29276034 if (max_coeff <= 8) {
565
2/2
✓ Branch 0 taken 1436202 times.
✓ Branch 1 taken 457382 times.
1893584 if (max_coeff == 4)
566 1436202 zeros_left = get_vlc2(gb, chroma_dc_total_zeros_vlc[total_coeff].table,
567 CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1);
568 else
569 457382 zeros_left = get_vlc2(gb, chroma422_dc_total_zeros_vlc[total_coeff].table,
570 CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 1);
571 } else {
572 27382450 zeros_left= get_vlc2(gb, total_zeros_vlc[ total_coeff ].table, TOTAL_ZEROS_VLC_BITS, 1);
573 }
574 }
575
576 #define STORE_BLOCK(type) \
577 scantable += zeros_left + total_coeff - 1; \
578 if(n >= LUMA_DC_BLOCK_INDEX){ \
579 ((type*)block)[*scantable] = level[0]; \
580 for(i=1;i<total_coeff && zeros_left > 0;i++) { \
581 if(zeros_left < 7) \
582 run_before= get_vlc2(gb, run_vlc[zeros_left].table, RUN_VLC_BITS, 1); \
583 else \
584 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); \
585 zeros_left -= run_before; \
586 scantable -= 1 + run_before; \
587 ((type*)block)[*scantable]= level[i]; \
588 } \
589 for(;i<total_coeff;i++) { \
590 scantable--; \
591 ((type*)block)[*scantable]= level[i]; \
592 } \
593 }else{ \
594 ((type*)block)[*scantable] = ((int)(level[0] * qmul[*scantable] + 32))>>6; \
595 for(i=1;i<total_coeff && zeros_left > 0;i++) { \
596 if(zeros_left < 7) \
597 run_before= get_vlc2(gb, run_vlc[zeros_left].table, RUN_VLC_BITS, 1); \
598 else \
599 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); \
600 zeros_left -= run_before; \
601 scantable -= 1 + run_before; \
602 ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \
603 } \
604 for(;i<total_coeff;i++) { \
605 scantable--; \
606 ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \
607 } \
608 }
609
610
2/2
✓ Branch 0 taken 10462176 times.
✓ Branch 1 taken 19105844 times.
29568020 if (h->pixel_shift) {
611
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)
612 } else {
613
18/18
✓ Branch 0 taken 1417009 times.
✓ Branch 1 taken 17688835 times.
✓ Branch 2 taken 601184 times.
✓ Branch 3 taken 17932 times.
✓ Branch 6 taken 1027331 times.
✓ Branch 7 taken 1008794 times.
✓ Branch 8 taken 619116 times.
✓ Branch 9 taken 408215 times.
✓ Branch 10 taken 1023627 times.
✓ Branch 11 taken 1417009 times.
✓ Branch 12 taken 26445145 times.
✓ Branch 13 taken 4069206 times.
✓ Branch 16 taken 34603183 times.
✓ Branch 17 taken 13600003 times.
✓ Branch 18 taken 30514351 times.
✓ Branch 19 taken 4088832 times.
✓ Branch 20 taken 11404921 times.
✓ Branch 21 taken 17688835 times.
62667859 STORE_BLOCK(int16_t)
614 }
615
616
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29568020 times.
29568020 if(zeros_left<0){
617 av_log(h->avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", sl->mb_x, sl->mb_y);
618 return -1;
619 }
620
621 29568020 return 0;
622 }
623
624 static av_always_inline
625 2840243 int decode_luma_residual(const H264Context *h, H264SliceContext *sl,
626 GetBitContext *gb, const uint8_t *scan,
627 const uint8_t *scan8x8, int pixel_shift,
628 int mb_type, int cbp, int p)
629 {
630 int i4x4, i8x8;
631
1/2
✓ Branch 0 taken 2840243 times.
✗ Branch 1 not taken.
2840243 int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
632
2/2
✓ Branch 0 taken 214013 times.
✓ Branch 1 taken 2626230 times.
2840243 if(IS_INTRA16x16(mb_type)){
633 214013 AV_ZERO128(sl->mb_luma_dc[p]+0);
634 214013 AV_ZERO128(sl->mb_luma_dc[p]+8);
635 214013 AV_ZERO128(sl->mb_luma_dc[p]+16);
636 214013 AV_ZERO128(sl->mb_luma_dc[p]+24);
637
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 214013 times.
214013 if (decode_residual(h, sl, gb, sl->mb_luma_dc[p], LUMA_DC_BLOCK_INDEX + p, scan, NULL, 16) < 0) {
638 return -1; //FIXME continue if partitioned and other return -1 too
639 }
640
641 av_assert2((cbp&15) == 0 || (cbp&15) == 15);
642
643
2/2
✓ Branch 0 taken 96959 times.
✓ Branch 1 taken 117054 times.
214013 if(cbp&15){
644
2/2
✓ Branch 0 taken 387836 times.
✓ Branch 1 taken 96959 times.
484795 for(i8x8=0; i8x8<4; i8x8++){
645
2/2
✓ Branch 0 taken 1551344 times.
✓ Branch 1 taken 387836 times.
1939180 for(i4x4=0; i4x4<4; i4x4++){
646 1551344 const int index= i4x4 + 4*i8x8 + p*16;
647
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1551344 times.
1551344 if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift),
648 1551344 index, scan + 1, h->ps.pps->dequant4_coeff[p][qscale], 15) < 0 ){
649 return -1;
650 }
651 }
652 }
653 96959 return 0xf;
654 }else{
655 117054 fill_rectangle(&sl->non_zero_count_cache[scan8[p*16]], 4, 4, 8, 0, 1);
656 117054 return 0;
657 }
658 }else{
659
2/2
✓ Branch 0 taken 1135224 times.
✓ Branch 1 taken 1491006 times.
2626230 int cqm = (IS_INTRA( mb_type ) ? 0:3)+p;
660 /* For CAVLC 4:4:4, we need to keep track of the luma 8x8 CBP for deblocking nnz purposes. */
661 2626230 int new_cbp = 0;
662
2/2
✓ Branch 0 taken 10504920 times.
✓ Branch 1 taken 2626230 times.
13131150 for(i8x8=0; i8x8<4; i8x8++){
663
2/2
✓ Branch 0 taken 7694283 times.
✓ Branch 1 taken 2810637 times.
10504920 if(cbp & (1<<i8x8)){
664
2/2
✓ Branch 0 taken 2320357 times.
✓ Branch 1 taken 5373926 times.
7694283 if(IS_8x8DCT(mb_type)){
665 2320357 int16_t *buf = &sl->mb[64*i8x8+256*p << pixel_shift];
666 uint8_t *nnz;
667
2/2
✓ Branch 0 taken 9281428 times.
✓ Branch 1 taken 2320357 times.
11601785 for(i4x4=0; i4x4<4; i4x4++){
668 9281428 const int index= i4x4 + 4*i8x8 + p*16;
669
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9281428 times.
9281428 if( decode_residual(h, sl, gb, buf, index, scan8x8+16*i4x4,
670 9281428 h->ps.pps->dequant8_coeff[cqm][qscale], 16) < 0 )
671 return -1;
672 }
673 2320357 nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]];
674 2320357 nnz[0] += nnz[1] + nnz[8] + nnz[9];
675 2320357 new_cbp |= !!nnz[0] << i8x8;
676 }else{
677
2/2
✓ Branch 0 taken 21495704 times.
✓ Branch 1 taken 5373926 times.
26869630 for(i4x4=0; i4x4<4; i4x4++){
678 21495704 const int index= i4x4 + 4*i8x8 + p*16;
679
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21495704 times.
21495704 if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift), index,
680 21495704 scan, h->ps.pps->dequant4_coeff[cqm][qscale], 16) < 0 ){
681 return -1;
682 }
683 21495704 new_cbp |= sl->non_zero_count_cache[scan8[index]] << i8x8;
684 }
685 }
686 }else{
687 2810637 uint8_t * const nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]];
688 2810637 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
689 }
690 }
691 2626230 return new_cbp;
692 }
693 }
694
695 4401513 int ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl)
696 {
697 int mb_xy;
698 int partition_count;
699 unsigned int mb_type, cbp;
700 4401513 int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
701
4/4
✓ Branch 0 taken 389328 times.
✓ Branch 1 taken 4012185 times.
✓ Branch 2 taken 346560 times.
✓ Branch 3 taken 42768 times.
4401513 const int decode_chroma = h->ps.sps->chroma_format_idc == 1 || h->ps.sps->chroma_format_idc == 2;
702 4401513 const int pixel_shift = h->pixel_shift;
703
704 4401513 mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride;
705
706 ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y);
707 4401513 cbp = 0; /* avoid warning. FIXME: find a solution without slowing
708 down the code */
709
2/2
✓ Branch 0 taken 3390106 times.
✓ Branch 1 taken 1011407 times.
4401513 if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
710
2/2
✓ Branch 0 taken 2527498 times.
✓ Branch 1 taken 862608 times.
3390106 if (sl->mb_skip_run == -1) {
711 2527498 unsigned mb_skip_run = get_ue_golomb_long(&sl->gb);
712
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2527498 times.
2527498 if (mb_skip_run > h->mb_num) {
713 av_log(h->avctx, AV_LOG_ERROR, "mb_skip_run %d is invalid\n", mb_skip_run);
714 return AVERROR_INVALIDDATA;
715 }
716 2527498 sl->mb_skip_run = mb_skip_run;
717 }
718
719
2/2
✓ Branch 0 taken 865727 times.
✓ Branch 1 taken 2524379 times.
3390106 if (sl->mb_skip_run--) {
720
4/4
✓ Branch 0 taken 11109 times.
✓ Branch 1 taken 854618 times.
✓ Branch 2 taken 5515 times.
✓ Branch 3 taken 5594 times.
865727 if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
721
2/2
✓ Branch 0 taken 2894 times.
✓ Branch 1 taken 2621 times.
5515 if (sl->mb_skip_run == 0)
722 2894 sl->mb_mbaff = sl->mb_field_decoding_flag = get_bits1(&sl->gb);
723 }
724 865727 decode_mb_skip(h, sl);
725 865727 return 0;
726 }
727 }
728
2/2
✓ Branch 0 taken 497835 times.
✓ Branch 1 taken 3037951 times.
3535786 if (FRAME_MBAFF(h)) {
729
2/2
✓ Branch 0 taken 248957 times.
✓ Branch 1 taken 248878 times.
497835 if ((sl->mb_y & 1) == 0)
730 248957 sl->mb_mbaff = sl->mb_field_decoding_flag = get_bits1(&sl->gb);
731 }
732
733 3535786 sl->prev_mb_skipped = 0;
734
735 3535786 mb_type= get_ue_golomb(&sl->gb);
736
2/2
✓ Branch 0 taken 877411 times.
✓ Branch 1 taken 2658375 times.
3535786 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
737
2/2
✓ Branch 0 taken 736512 times.
✓ Branch 1 taken 140899 times.
877411 if(mb_type < 23){
738 736512 partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
739 736512 mb_type = ff_h264_b_mb_type_info[mb_type].type;
740 }else{
741 140899 mb_type -= 23;
742 140899 goto decode_intra_mb;
743 }
744
2/2
✓ Branch 0 taken 1646968 times.
✓ Branch 1 taken 1011407 times.
2658375 } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
745
2/2
✓ Branch 0 taken 1406704 times.
✓ Branch 1 taken 240264 times.
1646968 if(mb_type < 5){
746 1406704 partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
747 1406704 mb_type = ff_h264_p_mb_type_info[mb_type].type;
748 }else{
749 240264 mb_type -= 5;
750 240264 goto decode_intra_mb;
751 }
752 }else{
753 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
754
1/4
✓ Branch 0 taken 1011407 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1011407 if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
755 mb_type--;
756 1011407 decode_intra_mb:
757
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1392570 times.
1392570 if(mb_type > 25){
758 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);
759 return -1;
760 }
761 1392570 partition_count=0;
762 1392570 cbp = ff_h264_i_mb_type_info[mb_type].cbp;
763 1392570 sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
764 1392570 mb_type = ff_h264_i_mb_type_info[mb_type].type;
765 }
766
767
2/2
✓ Branch 0 taken 981328 times.
✓ Branch 1 taken 2554458 times.
3535786 if (MB_FIELD(sl))
768 981328 mb_type |= MB_TYPE_INTERLACED;
769
770 3535786 h->slice_table[mb_xy] = sl->slice_num;
771
772
2/2
✓ Branch 0 taken 17446 times.
✓ Branch 1 taken 3518340 times.
3535786 if(IS_INTRA_PCM(mb_type)){
773 17446 const int mb_size = ff_h264_mb_sizes[h->ps.sps->chroma_format_idc] *
774 17446 h->ps.sps->bit_depth_luma;
775
776 // We assume these blocks are very rare so we do not optimize it.
777 17446 sl->intra_pcm_ptr = align_get_bits(&sl->gb);
778
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 17446 times.
17446 if (get_bits_left(&sl->gb) < mb_size) {
779 av_log(h->avctx, AV_LOG_ERROR, "Not enough data for an intra PCM block.\n");
780 return AVERROR_INVALIDDATA;
781 }
782 17446 skip_bits_long(&sl->gb, mb_size);
783
784 // In deblocking, the quantizer is 0
785 17446 h->cur_pic.qscale_table[mb_xy] = 0;
786 // All coeffs are present
787 17446 memset(h->non_zero_count[mb_xy], 16, 48);
788
789 17446 h->cur_pic.mb_type[mb_xy] = mb_type;
790 17446 return 0;
791 }
792
793 3518340 fill_decode_neighbors(h, sl, mb_type);
794 3518340 fill_decode_caches(h, sl, mb_type);
795
796 //mb_pred
797
2/2
✓ Branch 0 taken 1375124 times.
✓ Branch 1 taken 2143216 times.
3518340 if(IS_INTRA(mb_type)){
798 int pred_mode;
799 // init_top_left_availability(h);
800
2/2
✓ Branch 0 taken 1161111 times.
✓ Branch 1 taken 214013 times.
1375124 if(IS_INTRA4x4(mb_type)){
801 int i;
802 1161111 int di = 1;
803
4/4
✓ Branch 0 taken 849962 times.
✓ Branch 1 taken 311149 times.
✓ Branch 3 taken 541655 times.
✓ Branch 4 taken 308307 times.
1161111 if(dct8x8_allowed && get_bits1(&sl->gb)){
804 541655 mb_type |= MB_TYPE_8x8DCT;
805 541655 di = 4;
806 }
807
808 // fill_intra4x4_pred_table(h);
809
2/2
✓ Branch 0 taken 12077916 times.
✓ Branch 1 taken 1161111 times.
13239027 for(i=0; i<16; i+=di){
810 12077916 int mode = pred_intra_mode(h, sl, i);
811
812
2/2
✓ Branch 1 taken 6514646 times.
✓ Branch 2 taken 5563270 times.
12077916 if(!get_bits1(&sl->gb)){
813 6514646 const int rem_mode= get_bits(&sl->gb, 3);
814 6514646 mode = rem_mode + (rem_mode >= mode);
815 }
816
817
2/2
✓ Branch 0 taken 2166620 times.
✓ Branch 1 taken 9911296 times.
12077916 if(di==4)
818 2166620 fill_rectangle(&sl->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1);
819 else
820 9911296 sl->intra4x4_pred_mode_cache[scan8[i]] = mode;
821 }
822 1161111 write_back_intra_pred_mode(h, sl);
823
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1161111 times.
1161111 if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
824 1161111 sl->top_samples_available, sl->left_samples_available) < 0)
825 return -1;
826 }else{
827 428026 sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
828 214013 sl->left_samples_available, sl->intra16x16_pred_mode, 0);
829
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 214013 times.
214013 if (sl->intra16x16_pred_mode < 0)
830 return -1;
831 }
832
2/2
✓ Branch 0 taken 1347995 times.
✓ Branch 1 taken 27129 times.
1375124 if(decode_chroma){
833 1347995 pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
834 1347995 sl->left_samples_available, get_ue_golomb_31(&sl->gb), 1);
835
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1347995 times.
1347995 if(pred_mode < 0)
836 return -1;
837 1347995 sl->chroma_pred_mode = pred_mode;
838 } else {
839 27129 sl->chroma_pred_mode = DC_128_PRED8x8;
840 }
841
2/2
✓ Branch 0 taken 513753 times.
✓ Branch 1 taken 1629463 times.
2143216 }else if(partition_count==4){
842 int i, j, sub_partition_count[4], list, ref[2][4];
843
844
2/2
✓ Branch 0 taken 177999 times.
✓ Branch 1 taken 335754 times.
513753 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
845
2/2
✓ Branch 0 taken 711996 times.
✓ Branch 1 taken 177999 times.
889995 for(i=0; i<4; i++){
846 711996 sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb);
847
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 711996 times.
711996 if(sl->sub_mb_type[i] >=13){
848 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);
849 return -1;
850 }
851 711996 sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
852 711996 sl->sub_mb_type[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
853 }
854
2/2
✓ Branch 0 taken 55683 times.
✓ Branch 1 taken 122316 times.
177999 if( IS_DIRECT(sl->sub_mb_type[0]|sl->sub_mb_type[1]|sl->sub_mb_type[2]|sl->sub_mb_type[3])) {
855 55683 ff_h264_pred_direct_motion(h, sl, &mb_type);
856 55683 sl->ref_cache[0][scan8[4]] =
857 55683 sl->ref_cache[1][scan8[4]] =
858 55683 sl->ref_cache[0][scan8[12]] =
859 55683 sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
860 }
861 }else{
862 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_P); //FIXME SP correct ?
863
2/2
✓ Branch 0 taken 1343016 times.
✓ Branch 1 taken 335754 times.
1678770 for(i=0; i<4; i++){
864 1343016 sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb);
865
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1343016 times.
1343016 if(sl->sub_mb_type[i] >=4){
866 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);
867 return -1;
868 }
869 1343016 sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
870 1343016 sl->sub_mb_type[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
871 }
872 }
873
874
2/2
✓ Branch 0 taken 691752 times.
✓ Branch 1 taken 513753 times.
1205505 for (list = 0; list < sl->list_count; list++) {
875
2/2
✓ Branch 0 taken 567881 times.
✓ Branch 1 taken 123871 times.
691752 int ref_count = IS_REF0(mb_type) ? 1 : sl->ref_count[list] << MB_MBAFF(sl);
876
2/2
✓ Branch 0 taken 2767008 times.
✓ Branch 1 taken 691752 times.
3458760 for(i=0; i<4; i++){
877
2/2
✓ Branch 0 taken 230658 times.
✓ Branch 1 taken 2536350 times.
2767008 if(IS_DIRECT(sl->sub_mb_type[i])) continue;
878
2/2
✓ Branch 0 taken 2209322 times.
✓ Branch 1 taken 327028 times.
2536350 if(IS_DIR(sl->sub_mb_type[i], 0, list)){
879 unsigned int tmp;
880
2/2
✓ Branch 0 taken 765117 times.
✓ Branch 1 taken 1444205 times.
2209322 if(ref_count == 1){
881 765117 tmp= 0;
882
2/2
✓ Branch 0 taken 454436 times.
✓ Branch 1 taken 989769 times.
1444205 }else if(ref_count == 2){
883 454436 tmp= get_bits1(&sl->gb)^1;
884 }else{
885 989769 tmp= get_ue_golomb_31(&sl->gb);
886
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 989769 times.
989769 if(tmp>=ref_count){
887 av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp);
888 return -1;
889 }
890 }
891 2209322 ref[list][i]= tmp;
892 }else{
893 //FIXME
894 327028 ref[list][i] = -1;
895 }
896 }
897 }
898
899
2/2
✓ Branch 0 taken 51527 times.
✓ Branch 1 taken 462226 times.
513753 if(dct8x8_allowed)
900 51527 dct8x8_allowed = get_dct8x8_allowed(h, sl);
901
902
2/2
✓ Branch 0 taken 691752 times.
✓ Branch 1 taken 513753 times.
1205505 for (list = 0; list < sl->list_count; list++) {
903
2/2
✓ Branch 0 taken 2767008 times.
✓ Branch 1 taken 691752 times.
3458760 for(i=0; i<4; i++){
904
2/2
✓ Branch 0 taken 230658 times.
✓ Branch 1 taken 2536350 times.
2767008 if(IS_DIRECT(sl->sub_mb_type[i])) {
905 230658 sl->ref_cache[list][ scan8[4*i] ] = sl->ref_cache[list][ scan8[4*i]+1 ];
906 230658 continue;
907 }
908 2536350 sl->ref_cache[list][ scan8[4*i] ]=sl->ref_cache[list][ scan8[4*i]+1 ]=
909 2536350 sl->ref_cache[list][ scan8[4*i]+8 ]=sl->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
910
911
2/2
✓ Branch 0 taken 2209322 times.
✓ Branch 1 taken 327028 times.
2536350 if(IS_DIR(sl->sub_mb_type[i], 0, list)){
912 2209322 const int sub_mb_type= sl->sub_mb_type[i];
913
2/2
✓ Branch 0 taken 1662779 times.
✓ Branch 1 taken 546543 times.
2209322 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
914
2/2
✓ Branch 0 taken 3672510 times.
✓ Branch 1 taken 2209322 times.
5881832 for(j=0; j<sub_partition_count[i]; j++){
915 int mx, my;
916 3672510 const int index= 4*i + block_width*j;
917 3672510 int16_t (* mv_cache)[2]= &sl->mv_cache[list][ scan8[index] ];
918 3672510 pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
919 3672510 mx += (unsigned)get_se_golomb(&sl->gb);
920 3672510 my += (unsigned)get_se_golomb(&sl->gb);
921 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
922
923
2/2
✓ Branch 0 taken 1150620 times.
✓ Branch 1 taken 2521890 times.
3672510 if(IS_SUB_8X8(sub_mb_type)){
924 1150620 mv_cache[ 1 ][0]=
925 1150620 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
926 1150620 mv_cache[ 1 ][1]=
927 1150620 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
928
2/2
✓ Branch 0 taken 1024318 times.
✓ Branch 1 taken 1497572 times.
2521890 }else if(IS_SUB_8X4(sub_mb_type)){
929 1024318 mv_cache[ 1 ][0]= mx;
930 1024318 mv_cache[ 1 ][1]= my;
931
2/2
✓ Branch 0 taken 688600 times.
✓ Branch 1 taken 808972 times.
1497572 }else if(IS_SUB_4X8(sub_mb_type)){
932 688600 mv_cache[ 8 ][0]= mx;
933 688600 mv_cache[ 8 ][1]= my;
934 }
935 3672510 mv_cache[ 0 ][0]= mx;
936 3672510 mv_cache[ 0 ][1]= my;
937 }
938 }else{
939 327028 uint32_t *p= (uint32_t *)&sl->mv_cache[list][ scan8[4*i] ][0];
940 327028 p[0] = p[1]=
941 327028 p[8] = p[9]= 0;
942 }
943 }
944 }
945
2/2
✓ Branch 0 taken 120891 times.
✓ Branch 1 taken 1508572 times.
1629463 }else if(IS_DIRECT(mb_type)){
946 120891 ff_h264_pred_direct_motion(h, sl, &mb_type);
947 120891 dct8x8_allowed &= h->ps.sps->direct_8x8_inference_flag;
948 }else{
949 int list, mx, my, i;
950 //FIXME we should set ref_idx_l? to 0 if we use that later ...
951
2/2
✓ Branch 0 taken 1017999 times.
✓ Branch 1 taken 490573 times.
1508572 if(IS_16X16(mb_type)){
952
2/2
✓ Branch 0 taken 1277321 times.
✓ Branch 1 taken 1017999 times.
2295320 for (list = 0; list < sl->list_count; list++) {
953 unsigned int val;
954
2/2
✓ Branch 0 taken 1073767 times.
✓ Branch 1 taken 203554 times.
1277321 if(IS_DIR(mb_type, 0, list)){
955 1073767 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
956
2/2
✓ Branch 0 taken 573990 times.
✓ Branch 1 taken 499777 times.
1073767 if (rc == 1) {
957 573990 val= 0;
958
2/2
✓ Branch 0 taken 135504 times.
✓ Branch 1 taken 364273 times.
499777 } else if (rc == 2) {
959 135504 val= get_bits1(&sl->gb)^1;
960 }else{
961 364273 val= get_ue_golomb_31(&sl->gb);
962
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 364273 times.
364273 if (val >= rc) {
963 av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
964 return -1;
965 }
966 }
967 1073767 fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1);
968 }
969 }
970
2/2
✓ Branch 0 taken 1277321 times.
✓ Branch 1 taken 1017999 times.
2295320 for (list = 0; list < sl->list_count; list++) {
971
2/2
✓ Branch 0 taken 1073767 times.
✓ Branch 1 taken 203554 times.
1277321 if(IS_DIR(mb_type, 0, list)){
972 1073767 pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
973 1073767 mx += (unsigned)get_se_golomb(&sl->gb);
974 1073767 my += (unsigned)get_se_golomb(&sl->gb);
975 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
976
977 1073767 fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
978 }
979 }
980 }
981
2/2
✓ Branch 0 taken 259335 times.
✓ Branch 1 taken 231238 times.
490573 else if(IS_16X8(mb_type)){
982
2/2
✓ Branch 0 taken 357742 times.
✓ Branch 1 taken 259335 times.
617077 for (list = 0; list < sl->list_count; list++) {
983
2/2
✓ Branch 0 taken 715484 times.
✓ Branch 1 taken 357742 times.
1073226 for(i=0; i<2; i++){
984 unsigned int val;
985
2/2
✓ Branch 0 taken 561426 times.
✓ Branch 1 taken 154058 times.
715484 if(IS_DIR(mb_type, i, list)){
986 561426 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
987
2/2
✓ Branch 0 taken 218459 times.
✓ Branch 1 taken 342967 times.
561426 if (rc == 1) {
988 218459 val= 0;
989
2/2
✓ Branch 0 taken 80255 times.
✓ Branch 1 taken 262712 times.
342967 } else if (rc == 2) {
990 80255 val= get_bits1(&sl->gb)^1;
991 }else{
992 262712 val= get_ue_golomb_31(&sl->gb);
993
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 262712 times.
262712 if (val >= rc) {
994 av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
995 return -1;
996 }
997 }
998 }else
999 154058 val= LIST_NOT_USED&0xFF;
1000 715484 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1);
1001 }
1002 }
1003
2/2
✓ Branch 0 taken 357742 times.
✓ Branch 1 taken 259335 times.
617077 for (list = 0; list < sl->list_count; list++) {
1004
2/2
✓ Branch 0 taken 715484 times.
✓ Branch 1 taken 357742 times.
1073226 for(i=0; i<2; i++){
1005 unsigned int val;
1006
2/2
✓ Branch 0 taken 561426 times.
✓ Branch 1 taken 154058 times.
715484 if(IS_DIR(mb_type, i, list)){
1007 561426 pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
1008 561426 mx += (unsigned)get_se_golomb(&sl->gb);
1009 561426 my += (unsigned)get_se_golomb(&sl->gb);
1010 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
1011
1012 561426 val= pack16to32(mx,my);
1013 }else
1014 154058 val=0;
1015 715484 fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 4);
1016 }
1017 }
1018 }else{
1019 av_assert2(IS_8X16(mb_type));
1020
2/2
✓ Branch 0 taken 311131 times.
✓ Branch 1 taken 231238 times.
542369 for (list = 0; list < sl->list_count; list++) {
1021
2/2
✓ Branch 0 taken 622262 times.
✓ Branch 1 taken 311131 times.
933393 for(i=0; i<2; i++){
1022 unsigned int val;
1023
2/2
✓ Branch 0 taken 495664 times.
✓ Branch 1 taken 126598 times.
622262 if(IS_DIR(mb_type, i, list)){ //FIXME optimize
1024 495664 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
1025
2/2
✓ Branch 0 taken 194223 times.
✓ Branch 1 taken 301441 times.
495664 if (rc == 1) {
1026 194223 val= 0;
1027
2/2
✓ Branch 0 taken 82740 times.
✓ Branch 1 taken 218701 times.
301441 } else if (rc == 2) {
1028 82740 val= get_bits1(&sl->gb)^1;
1029 }else{
1030 218701 val= get_ue_golomb_31(&sl->gb);
1031
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 218701 times.
218701 if (val >= rc) {
1032 av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
1033 return -1;
1034 }
1035 }
1036 }else
1037 126598 val= LIST_NOT_USED&0xFF;
1038 622262 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1);
1039 }
1040 }
1041
2/2
✓ Branch 0 taken 311131 times.
✓ Branch 1 taken 231238 times.
542369 for (list = 0; list < sl->list_count; list++) {
1042
2/2
✓ Branch 0 taken 622262 times.
✓ Branch 1 taken 311131 times.
933393 for(i=0; i<2; i++){
1043 unsigned int val;
1044
2/2
✓ Branch 0 taken 495664 times.
✓ Branch 1 taken 126598 times.
622262 if(IS_DIR(mb_type, i, list)){
1045 495664 pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
1046 495664 mx += (unsigned)get_se_golomb(&sl->gb);
1047 495664 my += (unsigned)get_se_golomb(&sl->gb);
1048 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
1049
1050 495664 val= pack16to32(mx,my);
1051 }else
1052 126598 val=0;
1053 622262 fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 4);
1054 }
1055 }
1056 }
1057 }
1058
1059
2/2
✓ Branch 0 taken 2143216 times.
✓ Branch 1 taken 1375124 times.
3518340 if(IS_INTER(mb_type))
1060 2143216 write_back_motion(h, sl, mb_type);
1061
1062
2/2
✓ Branch 0 taken 3304327 times.
✓ Branch 1 taken 214013 times.
3518340 if(!IS_INTRA16x16(mb_type)){
1063 3304327 cbp= get_ue_golomb(&sl->gb);
1064
1065
2/2
✓ Branch 0 taken 3264977 times.
✓ Branch 1 taken 39350 times.
3304327 if(decode_chroma){
1066
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3264977 times.
3264977 if(cbp > 47){
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 1136962 times.
✓ Branch 1 taken 2128015 times.
3264977 if (IS_INTRA4x4(mb_type))
1071 1136962 cbp = ff_h264_golomb_to_intra4x4_cbp[cbp];
1072 else
1073 2128015 cbp = ff_h264_golomb_to_inter_cbp[cbp];
1074 }else{
1075
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39350 times.
39350 if(cbp > 15){
1076 av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y);
1077 return -1;
1078 }
1079
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];
1080 15201 else cbp= golomb_to_inter_cbp_gray[cbp];
1081 }
1082 } else {
1083
3/4
✓ Branch 0 taken 2980 times.
✓ Branch 1 taken 211033 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2980 times.
214013 if (!decode_chroma && cbp>15) {
1084 av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
1085 return AVERROR_INVALIDDATA;
1086 }
1087 }
1088
1089
6/6
✓ Branch 0 taken 1273759 times.
✓ Branch 1 taken 2244581 times.
✓ Branch 2 taken 1146561 times.
✓ Branch 3 taken 127198 times.
✓ Branch 4 taken 272479 times.
✓ Branch 5 taken 874082 times.
3518340 if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){
1090 272479 mb_type |= MB_TYPE_8x8DCT*get_bits1(&sl->gb);
1091 }
1092 3518340 sl->cbp=
1093 3518340 h->cbp_table[mb_xy]= cbp;
1094 3518340 h->cur_pic.mb_type[mb_xy] = mb_type;
1095
1096
4/4
✓ Branch 0 taken 776219 times.
✓ Branch 1 taken 2742121 times.
✓ Branch 2 taken 98122 times.
✓ Branch 3 taken 678097 times.
6358583 if(cbp || IS_INTRA16x16(mb_type)){
1097 int i4x4, i8x8, chroma_idx;
1098 int dquant;
1099 int ret;
1100 2840243 GetBitContext *gb = &sl->gb;
1101 const uint8_t *scan, *scan8x8;
1102 2840243 const int max_qp = 51 + 6 * (h->ps.sps->bit_depth_luma - 8);
1103
1104 2840243 dquant= get_se_golomb(&sl->gb);
1105
1106 2840243 sl->qscale += (unsigned)dquant;
1107
1108
2/2
✓ Branch 0 taken 8070 times.
✓ Branch 1 taken 2832173 times.
2840243 if (((unsigned)sl->qscale) > max_qp){
1109
2/2
✓ Branch 0 taken 3860 times.
✓ Branch 1 taken 4210 times.
8070 if (sl->qscale < 0) sl->qscale += max_qp + 1;
1110 4210 else sl->qscale -= max_qp+1;
1111
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8070 times.
8070 if (((unsigned)sl->qscale) > max_qp){
1112 av_log(h->avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, sl->mb_x, sl->mb_y);
1113 sl->qscale = max_qp;
1114 return -1;
1115 }
1116 }
1117
1118 2840243 sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
1119 2840243 sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale);
1120
1121
2/2
✓ Branch 0 taken 824163 times.
✓ Branch 1 taken 2016080 times.
2840243 if(IS_INTERLACED(mb_type)){
1122
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;
1123
2/2
✓ Branch 0 taken 824002 times.
✓ Branch 1 taken 161 times.
824163 scan = sl->qscale ? h->field_scan : h->field_scan_q0;
1124 }else{
1125
2/2
✓ Branch 0 taken 2015191 times.
✓ Branch 1 taken 889 times.
2016080 scan8x8 = sl->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0;
1126
2/2
✓ Branch 0 taken 2015191 times.
✓ Branch 1 taken 889 times.
2016080 scan = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
1127 }
1128
1129
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2840243 times.
2840243 if ((ret = decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 0)) < 0 ) {
1130 return -1;
1131 }
1132 2840243 h->cbp_table[mb_xy] |= ret << 12;
1133
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2840243 times.
2840243 if (CHROMA444(h)) {
1134 if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 1) < 0 ) {
1135 return -1;
1136 }
1137 if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 2) < 0 ) {
1138 return -1;
1139 }
1140 } else {
1141 2840243 const int num_c8x8 = h->ps.sps->chroma_format_idc;
1142
1143
2/2
✓ Branch 0 taken 1588388 times.
✓ Branch 1 taken 1251855 times.
2840243 if(cbp&0x30){
1144
2/2
✓ Branch 0 taken 3176776 times.
✓ Branch 1 taken 1588388 times.
4765164 for(chroma_idx=0; chroma_idx<2; chroma_idx++)
1145
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3176776 times.
3176776 if (decode_residual(h, sl, gb, sl->mb + ((256 + 16*16*chroma_idx) << pixel_shift),
1146 CHROMA_DC_BLOCK_INDEX + chroma_idx,
1147
2/2
✓ Branch 0 taken 579058 times.
✓ Branch 1 taken 2597718 times.
3176776 CHROMA422(h) ? ff_h264_chroma422_dc_scan : ff_h264_chroma_dc_scan,
1148 NULL, 4 * num_c8x8) < 0) {
1149 return -1;
1150 }
1151 }
1152
1153
2/2
✓ Branch 0 taken 1007498 times.
✓ Branch 1 taken 1832745 times.
2840243 if(cbp&0x20){
1154
2/2
✓ Branch 0 taken 2014996 times.
✓ Branch 1 taken 1007498 times.
3022494 for(chroma_idx=0; chroma_idx<2; chroma_idx++){
1155
2/2
✓ Branch 0 taken 1166024 times.
✓ Branch 1 taken 848972 times.
2014996 const uint32_t *qmul = h->ps.pps->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[chroma_idx]];
1156 2014996 int16_t *mb = sl->mb + (16*(16 + 16*chroma_idx) << pixel_shift);
1157
2/2
✓ Branch 0 taken 2402140 times.
✓ Branch 1 taken 2014996 times.
4417136 for (i8x8 = 0; i8x8<num_c8x8; i8x8++) {
1158
2/2
✓ Branch 0 taken 9608560 times.
✓ Branch 1 taken 2402140 times.
12010700 for (i4x4 = 0; i4x4 < 4; i4x4++) {
1159 9608560 const int index = 16 + 16*chroma_idx + 8*i8x8 + i4x4;
1160
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 9608560 times.
9608560 if (decode_residual(h, sl, gb, mb, index, scan + 1, qmul, 15) < 0)
1161 return -1;
1162 9608560 mb += 16 << pixel_shift;
1163 }
1164 }
1165 }
1166 }else{
1167 1832745 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1168 1832745 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1169 }
1170 }
1171 }else{
1172 678097 fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
1173 678097 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1174 678097 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1175 }
1176 3518340 h->cur_pic.qscale_table[mb_xy] = sl->qscale;
1177 3518340 write_back_non_zero_count(h, sl);
1178
1179 3518340 return 0;
1180 }
1181