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 |