FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/hevc_cabac.c
Date: 2022-01-16 20:33:26
Exec Total Coverage
Lines: 643 667 96.4%
Branches: 487 523 93.1%

Line Branch Exec Source
1 /*
2 * HEVC CABAC decoding
3 *
4 * Copyright (C) 2012 - 2013 Guillaume Martres
5 * Copyright (C) 2012 - 2013 Gildas Cocherel
6 *
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24 #include "libavutil/attributes.h"
25 #include "libavutil/common.h"
26
27 #include "cabac_functions.h"
28 #include "hevc_data.h"
29 #include "hevc.h"
30 #include "hevcdec.h"
31
32 #define CABAC_MAX_BIN 31
33
34 /**
35 * number of bin by SyntaxElement.
36 */
37 static const int8_t num_bins_in_se[] = {
38 1, // sao_merge_flag
39 1, // sao_type_idx
40 0, // sao_eo_class
41 0, // sao_band_position
42 0, // sao_offset_abs
43 0, // sao_offset_sign
44 0, // end_of_slice_flag
45 3, // split_coding_unit_flag
46 1, // cu_transquant_bypass_flag
47 3, // skip_flag
48 3, // cu_qp_delta
49 1, // pred_mode
50 4, // part_mode
51 0, // pcm_flag
52 1, // prev_intra_luma_pred_mode
53 0, // mpm_idx
54 0, // rem_intra_luma_pred_mode
55 2, // intra_chroma_pred_mode
56 1, // merge_flag
57 1, // merge_idx
58 5, // inter_pred_idc
59 2, // ref_idx_l0
60 2, // ref_idx_l1
61 2, // abs_mvd_greater0_flag
62 2, // abs_mvd_greater1_flag
63 0, // abs_mvd_minus2
64 0, // mvd_sign_flag
65 1, // mvp_lx_flag
66 1, // no_residual_data_flag
67 3, // split_transform_flag
68 2, // cbf_luma
69 5, // cbf_cb, cbf_cr
70 2, // transform_skip_flag[][]
71 2, // explicit_rdpcm_flag[][]
72 2, // explicit_rdpcm_dir_flag[][]
73 18, // last_significant_coeff_x_prefix
74 18, // last_significant_coeff_y_prefix
75 0, // last_significant_coeff_x_suffix
76 0, // last_significant_coeff_y_suffix
77 4, // significant_coeff_group_flag
78 44, // significant_coeff_flag
79 24, // coeff_abs_level_greater1_flag
80 6, // coeff_abs_level_greater2_flag
81 0, // coeff_abs_level_remaining
82 0, // coeff_sign_flag
83 8, // log2_res_scale_abs
84 2, // res_scale_sign_flag
85 1, // cu_chroma_qp_offset_flag
86 1, // cu_chroma_qp_offset_idx
87 };
88
89 /**
90 * Offset to ctxIdx 0 in init_values and states, indexed by SyntaxElement.
91 */
92 static const int elem_offset[sizeof(num_bins_in_se)] = {
93 0, // sao_merge_flag
94 1, // sao_type_idx
95 2, // sao_eo_class
96 2, // sao_band_position
97 2, // sao_offset_abs
98 2, // sao_offset_sign
99 2, // end_of_slice_flag
100 2, // split_coding_unit_flag
101 5, // cu_transquant_bypass_flag
102 6, // skip_flag
103 9, // cu_qp_delta
104 12, // pred_mode
105 13, // part_mode
106 17, // pcm_flag
107 17, // prev_intra_luma_pred_mode
108 18, // mpm_idx
109 18, // rem_intra_luma_pred_mode
110 18, // intra_chroma_pred_mode
111 20, // merge_flag
112 21, // merge_idx
113 22, // inter_pred_idc
114 27, // ref_idx_l0
115 29, // ref_idx_l1
116 31, // abs_mvd_greater0_flag
117 33, // abs_mvd_greater1_flag
118 35, // abs_mvd_minus2
119 35, // mvd_sign_flag
120 35, // mvp_lx_flag
121 36, // no_residual_data_flag
122 37, // split_transform_flag
123 40, // cbf_luma
124 42, // cbf_cb, cbf_cr
125 47, // transform_skip_flag[][]
126 49, // explicit_rdpcm_flag[][]
127 51, // explicit_rdpcm_dir_flag[][]
128 53, // last_significant_coeff_x_prefix
129 71, // last_significant_coeff_y_prefix
130 89, // last_significant_coeff_x_suffix
131 89, // last_significant_coeff_y_suffix
132 89, // significant_coeff_group_flag
133 93, // significant_coeff_flag
134 137, // coeff_abs_level_greater1_flag
135 161, // coeff_abs_level_greater2_flag
136 167, // coeff_abs_level_remaining
137 167, // coeff_sign_flag
138 167, // log2_res_scale_abs
139 175, // res_scale_sign_flag
140 177, // cu_chroma_qp_offset_flag
141 178, // cu_chroma_qp_offset_idx
142 };
143
144 #define CNU 154
145 /**
146 * Indexed by init_type
147 */
148 static const uint8_t init_values[3][HEVC_CONTEXTS] = {
149 { // sao_merge_flag
150 153,
151 // sao_type_idx
152 200,
153 // split_coding_unit_flag
154 139, 141, 157,
155 // cu_transquant_bypass_flag
156 154,
157 // skip_flag
158 CNU, CNU, CNU,
159 // cu_qp_delta
160 154, 154, 154,
161 // pred_mode
162 CNU,
163 // part_mode
164 184, CNU, CNU, CNU,
165 // prev_intra_luma_pred_mode
166 184,
167 // intra_chroma_pred_mode
168 63, 139,
169 // merge_flag
170 CNU,
171 // merge_idx
172 CNU,
173 // inter_pred_idc
174 CNU, CNU, CNU, CNU, CNU,
175 // ref_idx_l0
176 CNU, CNU,
177 // ref_idx_l1
178 CNU, CNU,
179 // abs_mvd_greater1_flag
180 CNU, CNU,
181 // abs_mvd_greater1_flag
182 CNU, CNU,
183 // mvp_lx_flag
184 CNU,
185 // no_residual_data_flag
186 CNU,
187 // split_transform_flag
188 153, 138, 138,
189 // cbf_luma
190 111, 141,
191 // cbf_cb, cbf_cr
192 94, 138, 182, 154, 154,
193 // transform_skip_flag
194 139, 139,
195 // explicit_rdpcm_flag
196 139, 139,
197 // explicit_rdpcm_dir_flag
198 139, 139,
199 // last_significant_coeff_x_prefix
200 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
201 79, 108, 123, 63,
202 // last_significant_coeff_y_prefix
203 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
204 79, 108, 123, 63,
205 // significant_coeff_group_flag
206 91, 171, 134, 141,
207 // significant_coeff_flag
208 111, 111, 125, 110, 110, 94, 124, 108, 124, 107, 125, 141, 179, 153,
209 125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140,
210 139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111,
211 141, 111,
212 // coeff_abs_level_greater1_flag
213 140, 92, 137, 138, 140, 152, 138, 139, 153, 74, 149, 92, 139, 107,
214 122, 152, 140, 179, 166, 182, 140, 227, 122, 197,
215 // coeff_abs_level_greater2_flag
216 138, 153, 136, 167, 152, 152,
217 // log2_res_scale_abs
218 154, 154, 154, 154, 154, 154, 154, 154,
219 // res_scale_sign_flag
220 154, 154,
221 // cu_chroma_qp_offset_flag
222 154,
223 // cu_chroma_qp_offset_idx
224 154,
225 },
226 { // sao_merge_flag
227 153,
228 // sao_type_idx
229 185,
230 // split_coding_unit_flag
231 107, 139, 126,
232 // cu_transquant_bypass_flag
233 154,
234 // skip_flag
235 197, 185, 201,
236 // cu_qp_delta
237 154, 154, 154,
238 // pred_mode
239 149,
240 // part_mode
241 154, 139, 154, 154,
242 // prev_intra_luma_pred_mode
243 154,
244 // intra_chroma_pred_mode
245 152, 139,
246 // merge_flag
247 110,
248 // merge_idx
249 122,
250 // inter_pred_idc
251 95, 79, 63, 31, 31,
252 // ref_idx_l0
253 153, 153,
254 // ref_idx_l1
255 153, 153,
256 // abs_mvd_greater1_flag
257 140, 198,
258 // abs_mvd_greater1_flag
259 140, 198,
260 // mvp_lx_flag
261 168,
262 // no_residual_data_flag
263 79,
264 // split_transform_flag
265 124, 138, 94,
266 // cbf_luma
267 153, 111,
268 // cbf_cb, cbf_cr
269 149, 107, 167, 154, 154,
270 // transform_skip_flag
271 139, 139,
272 // explicit_rdpcm_flag
273 139, 139,
274 // explicit_rdpcm_dir_flag
275 139, 139,
276 // last_significant_coeff_x_prefix
277 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
278 94, 108, 123, 108,
279 // last_significant_coeff_y_prefix
280 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
281 94, 108, 123, 108,
282 // significant_coeff_group_flag
283 121, 140, 61, 154,
284 // significant_coeff_flag
285 155, 154, 139, 153, 139, 123, 123, 63, 153, 166, 183, 140, 136, 153,
286 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
287 153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140,
288 140, 140,
289 // coeff_abs_level_greater1_flag
290 154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
291 136, 137, 169, 194, 166, 167, 154, 167, 137, 182,
292 // coeff_abs_level_greater2_flag
293 107, 167, 91, 122, 107, 167,
294 // log2_res_scale_abs
295 154, 154, 154, 154, 154, 154, 154, 154,
296 // res_scale_sign_flag
297 154, 154,
298 // cu_chroma_qp_offset_flag
299 154,
300 // cu_chroma_qp_offset_idx
301 154,
302 },
303 { // sao_merge_flag
304 153,
305 // sao_type_idx
306 160,
307 // split_coding_unit_flag
308 107, 139, 126,
309 // cu_transquant_bypass_flag
310 154,
311 // skip_flag
312 197, 185, 201,
313 // cu_qp_delta
314 154, 154, 154,
315 // pred_mode
316 134,
317 // part_mode
318 154, 139, 154, 154,
319 // prev_intra_luma_pred_mode
320 183,
321 // intra_chroma_pred_mode
322 152, 139,
323 // merge_flag
324 154,
325 // merge_idx
326 137,
327 // inter_pred_idc
328 95, 79, 63, 31, 31,
329 // ref_idx_l0
330 153, 153,
331 // ref_idx_l1
332 153, 153,
333 // abs_mvd_greater1_flag
334 169, 198,
335 // abs_mvd_greater1_flag
336 169, 198,
337 // mvp_lx_flag
338 168,
339 // no_residual_data_flag
340 79,
341 // split_transform_flag
342 224, 167, 122,
343 // cbf_luma
344 153, 111,
345 // cbf_cb, cbf_cr
346 149, 92, 167, 154, 154,
347 // transform_skip_flag
348 139, 139,
349 // explicit_rdpcm_flag
350 139, 139,
351 // explicit_rdpcm_dir_flag
352 139, 139,
353 // last_significant_coeff_x_prefix
354 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
355 79, 108, 123, 93,
356 // last_significant_coeff_y_prefix
357 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
358 79, 108, 123, 93,
359 // significant_coeff_group_flag
360 121, 140, 61, 154,
361 // significant_coeff_flag
362 170, 154, 139, 153, 139, 123, 123, 63, 124, 166, 183, 140, 136, 153,
363 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
364 153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140,
365 140, 140,
366 // coeff_abs_level_greater1_flag
367 154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
368 136, 122, 169, 208, 166, 167, 154, 152, 167, 182,
369 // coeff_abs_level_greater2_flag
370 107, 167, 91, 107, 107, 167,
371 // log2_res_scale_abs
372 154, 154, 154, 154, 154, 154, 154, 154,
373 // res_scale_sign_flag
374 154, 154,
375 // cu_chroma_qp_offset_flag
376 154,
377 // cu_chroma_qp_offset_idx
378 154,
379 },
380 };
381
382 static const uint8_t scan_1x1[1] = {
383 0,
384 };
385
386 static const uint8_t horiz_scan2x2_x[4] = {
387 0, 1, 0, 1,
388 };
389
390 static const uint8_t horiz_scan2x2_y[4] = {
391 0, 0, 1, 1
392 };
393
394 static const uint8_t horiz_scan4x4_x[16] = {
395 0, 1, 2, 3,
396 0, 1, 2, 3,
397 0, 1, 2, 3,
398 0, 1, 2, 3,
399 };
400
401 static const uint8_t horiz_scan4x4_y[16] = {
402 0, 0, 0, 0,
403 1, 1, 1, 1,
404 2, 2, 2, 2,
405 3, 3, 3, 3,
406 };
407
408 static const uint8_t horiz_scan8x8_inv[8][8] = {
409 { 0, 1, 2, 3, 16, 17, 18, 19, },
410 { 4, 5, 6, 7, 20, 21, 22, 23, },
411 { 8, 9, 10, 11, 24, 25, 26, 27, },
412 { 12, 13, 14, 15, 28, 29, 30, 31, },
413 { 32, 33, 34, 35, 48, 49, 50, 51, },
414 { 36, 37, 38, 39, 52, 53, 54, 55, },
415 { 40, 41, 42, 43, 56, 57, 58, 59, },
416 { 44, 45, 46, 47, 60, 61, 62, 63, },
417 };
418
419 static const uint8_t diag_scan2x2_x[4] = {
420 0, 0, 1, 1,
421 };
422
423 static const uint8_t diag_scan2x2_y[4] = {
424 0, 1, 0, 1,
425 };
426
427 static const uint8_t diag_scan2x2_inv[2][2] = {
428 { 0, 2, },
429 { 1, 3, },
430 };
431
432 static const uint8_t diag_scan4x4_inv[4][4] = {
433 { 0, 2, 5, 9, },
434 { 1, 4, 8, 12, },
435 { 3, 7, 11, 14, },
436 { 6, 10, 13, 15, },
437 };
438
439 static const uint8_t diag_scan8x8_inv[8][8] = {
440 { 0, 2, 5, 9, 14, 20, 27, 35, },
441 { 1, 4, 8, 13, 19, 26, 34, 42, },
442 { 3, 7, 12, 18, 25, 33, 41, 48, },
443 { 6, 11, 17, 24, 32, 40, 47, 53, },
444 { 10, 16, 23, 31, 39, 46, 52, 57, },
445 { 15, 22, 30, 38, 45, 51, 56, 60, },
446 { 21, 29, 37, 44, 50, 55, 59, 62, },
447 { 28, 36, 43, 49, 54, 58, 61, 63, },
448 };
449
450 1399645 void ff_hevc_save_states(HEVCContext *s, int ctb_addr_ts)
451 {
452
2/2
✓ Branch 0 taken 97464 times.
✓ Branch 1 taken 1302181 times.
1399645 if (s->ps.pps->entropy_coding_sync_enabled_flag &&
453
2/2
✓ Branch 0 taken 92846 times.
✓ Branch 1 taken 4618 times.
97464 (ctb_addr_ts % s->ps.sps->ctb_width == 2 ||
454
2/2
✓ Branch 0 taken 784 times.
✓ Branch 1 taken 92062 times.
92846 (s->ps.sps->ctb_width == 2 &&
455
2/2
✓ Branch 0 taken 392 times.
✓ Branch 1 taken 392 times.
784 ctb_addr_ts % s->ps.sps->ctb_width == 0))) {
456 5010 memcpy(s->cabac_state, s->HEVClc->cabac_state, HEVC_CONTEXTS);
457
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5010 times.
5010 if (s->ps.sps->persistent_rice_adaptation_enabled_flag) {
458 memcpy(s->stat_coeff, s->HEVClc->stat_coeff, HEVC_STAT_COEFFS);
459 }
460 }
461 1399645 }
462
463 4005 static void load_states(HEVCContext *s, int thread)
464 {
465 4005 memcpy(s->HEVClc->cabac_state, s->cabac_state, HEVC_CONTEXTS);
466
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4005 times.
4005 if (s->ps.sps->persistent_rice_adaptation_enabled_flag) {
467 const HEVCContext *prev = s->sList[(thread + s->threads_number - 1) % s->threads_number];
468 memcpy(s->HEVClc->stat_coeff, prev->stat_coeff, HEVC_STAT_COEFFS);
469 }
470 4005 }
471
472 7670 static int cabac_reinit(HEVCLocalContext *lc)
473 {
474
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7670 times.
7670 return skip_bytes(&lc->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
475 }
476
477 27475 static int cabac_init_decoder(HEVCContext *s)
478 {
479 27475 GetBitContext *gb = &s->HEVClc->gb;
480 27475 skip_bits(gb, 1);
481 27475 align_get_bits(gb);
482 82425 return ff_init_cabac_decoder(&s->HEVClc->cc,
483 27475 gb->buffer + get_bits_count(gb) / 8,
484 27475 (get_bits_left(gb) + 7) / 8);
485 }
486
487 24756 static void cabac_init_state(HEVCContext *s)
488 {
489 24756 int init_type = 2 - s->sh.slice_type;
490 int i;
491
492
4/4
✓ Branch 0 taken 6488 times.
✓ Branch 1 taken 18268 times.
✓ Branch 2 taken 6345 times.
✓ Branch 3 taken 143 times.
24756 if (s->sh.cabac_init_flag && s->sh.slice_type != HEVC_SLICE_I)
493 6345 init_type ^= 3;
494
495
2/2
✓ Branch 0 taken 4926444 times.
✓ Branch 1 taken 24756 times.
4951200 for (i = 0; i < HEVC_CONTEXTS; i++) {
496 4926444 int init_value = init_values[init_type][i];
497 4926444 int m = (init_value >> 4) * 5 - 45;
498 4926444 int n = ((init_value & 15) << 3) - 16;
499 4926444 int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
500
501 4926444 pre ^= pre >> 31;
502
2/2
✓ Branch 0 taken 505760 times.
✓ Branch 1 taken 4420684 times.
4926444 if (pre > 124)
503 505760 pre = 124 + (pre & 1);
504 4926444 s->HEVClc->cabac_state[i] = pre;
505 }
506
507
2/2
✓ Branch 0 taken 99024 times.
✓ Branch 1 taken 24756 times.
123780 for (i = 0; i < 4; i++)
508 99024 s->HEVClc->stat_coeff[i] = 0;
509 24756 }
510
511 1399646 int ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts, int thread)
512 {
513
2/2
✓ Branch 0 taken 27475 times.
✓ Branch 1 taken 1372171 times.
1399646 if (ctb_addr_ts == s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) {
514 27475 int ret = cabac_init_decoder(s);
515
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27475 times.
27475 if (ret < 0)
516 return ret;
517
2/2
✓ Branch 0 taken 7947 times.
✓ Branch 1 taken 19528 times.
27475 if (s->sh.dependent_slice_segment_flag == 0 ||
518
2/2
✓ Branch 0 taken 876 times.
✓ Branch 1 taken 7071 times.
7947 (s->ps.pps->tiles_enabled_flag &&
519
2/2
✓ Branch 0 taken 309 times.
✓ Branch 1 taken 567 times.
876 s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1]))
520 19837 cabac_init_state(s);
521
522
2/2
✓ Branch 0 taken 17989 times.
✓ Branch 1 taken 9486 times.
27475 if (!s->sh.first_slice_in_pic_flag &&
523
2/2
✓ Branch 0 taken 3853 times.
✓ Branch 1 taken 14136 times.
17989 s->ps.pps->entropy_coding_sync_enabled_flag) {
524
2/2
✓ Branch 0 taken 1636 times.
✓ Branch 1 taken 2217 times.
3853 if (ctb_addr_ts % s->ps.sps->ctb_width == 0) {
525
2/2
✓ Branch 0 taken 92 times.
✓ Branch 1 taken 1544 times.
1636 if (s->ps.sps->ctb_width == 1)
526 92 cabac_init_state(s);
527
2/2
✓ Branch 0 taken 1162 times.
✓ Branch 1 taken 382 times.
1544 else if (s->sh.dependent_slice_segment_flag == 1)
528 1162 load_states(s, thread);
529 }
530 }
531 } else {
532
2/2
✓ Branch 0 taken 287199 times.
✓ Branch 1 taken 1084972 times.
1372171 if (s->ps.pps->tiles_enabled_flag &&
533
2/2
✓ Branch 0 taken 4625 times.
✓ Branch 1 taken 282574 times.
287199 s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1]) {
534 int ret;
535
1/2
✓ Branch 0 taken 4625 times.
✗ Branch 1 not taken.
4625 if (s->threads_number == 1)
536 4625 ret = cabac_reinit(s->HEVClc);
537 else {
538 ret = cabac_init_decoder(s);
539 }
540
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4625 times.
4625 if (ret < 0)
541 return ret;
542 4625 cabac_init_state(s);
543 }
544
2/2
✓ Branch 0 taken 92890 times.
✓ Branch 1 taken 1279281 times.
1372171 if (s->ps.pps->entropy_coding_sync_enabled_flag) {
545
2/2
✓ Branch 0 taken 3045 times.
✓ Branch 1 taken 89845 times.
92890 if (ctb_addr_ts % s->ps.sps->ctb_width == 0) {
546 int ret;
547 3045 get_cabac_terminate(&s->HEVClc->cc);
548
1/2
✓ Branch 0 taken 3045 times.
✗ Branch 1 not taken.
3045 if (s->threads_number == 1)
549 3045 ret = cabac_reinit(s->HEVClc);
550 else {
551 ret = cabac_init_decoder(s);
552 }
553
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3045 times.
3045 if (ret < 0)
554 return ret;
555
556
2/2
✓ Branch 0 taken 202 times.
✓ Branch 1 taken 2843 times.
3045 if (s->ps.sps->ctb_width == 1)
557 202 cabac_init_state(s);
558 else
559 2843 load_states(s, thread);
560 }
561 }
562 }
563 1399646 return 0;
564 }
565
566 #define GET_CABAC(ctx) get_cabac(&s->HEVClc->cc, &s->HEVClc->cabac_state[ctx])
567
568 795023 int ff_hevc_sao_merge_flag_decode(HEVCContext *s)
569 {
570 795023 return GET_CABAC(elem_offset[SAO_MERGE_FLAG]);
571 }
572
573 360669 int ff_hevc_sao_type_idx_decode(HEVCContext *s)
574 {
575
2/2
✓ Branch 1 taken 198886 times.
✓ Branch 2 taken 161783 times.
360669 if (!GET_CABAC(elem_offset[SAO_TYPE_IDX]))
576 198886 return 0;
577
578
2/2
✓ Branch 1 taken 53734 times.
✓ Branch 2 taken 108049 times.
161783 if (!get_cabac_bypass(&s->HEVClc->cc))
579 53734 return SAO_BAND;
580 108049 return SAO_EDGE;
581 }
582
583 77629 int ff_hevc_sao_band_position_decode(HEVCContext *s)
584 {
585 int i;
586 77629 int value = get_cabac_bypass(&s->HEVClc->cc);
587
588
2/2
✓ Branch 0 taken 310516 times.
✓ Branch 1 taken 77629 times.
388145 for (i = 0; i < 4; i++)
589 310516 value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
590 77629 return value;
591 }
592
593 865536 int ff_hevc_sao_offset_abs_decode(HEVCContext *s)
594 {
595 865536 int i = 0;
596 865536 int length = (1 << (FFMIN(s->ps.sps->bit_depth, 10) - 5)) - 1;
597
598
4/4
✓ Branch 0 taken 2451245 times.
✓ Branch 1 taken 127287 times.
✓ Branch 3 taken 1712996 times.
✓ Branch 4 taken 738249 times.
2578532 while (i < length && get_cabac_bypass(&s->HEVClc->cc))
599 1712996 i++;
600 865536 return i;
601 }
602
603 242504 int ff_hevc_sao_offset_sign_decode(HEVCContext *s)
604 {
605 242504 return get_cabac_bypass(&s->HEVClc->cc);
606 }
607
608 108049 int ff_hevc_sao_eo_class_decode(HEVCContext *s)
609 {
610 108049 int ret = get_cabac_bypass(&s->HEVClc->cc) << 1;
611 108049 ret |= get_cabac_bypass(&s->HEVClc->cc);
612 108049 return ret;
613 }
614
615 1399645 int ff_hevc_end_of_slice_flag_decode(HEVCContext *s)
616 {
617 1399645 return get_cabac_terminate(&s->HEVClc->cc);
618 }
619
620 200139 int ff_hevc_cu_transquant_bypass_flag_decode(HEVCContext *s)
621 {
622 200139 return GET_CABAC(elem_offset[CU_TRANSQUANT_BYPASS_FLAG]);
623 }
624
625 8059111 int ff_hevc_skip_flag_decode(HEVCContext *s, int x0, int y0, int x_cb, int y_cb)
626 {
627 8059111 int min_cb_width = s->ps.sps->min_cb_width;
628 8059111 int inc = 0;
629 8059111 int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size);
630 8059111 int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size);
631
632
4/4
✓ Branch 0 taken 735783 times.
✓ Branch 1 taken 7323328 times.
✓ Branch 2 taken 531537 times.
✓ Branch 3 taken 204246 times.
8059111 if (s->HEVClc->ctb_left_flag || x0b)
633 7854865 inc = !!SAMPLE_CTB(s->skip_flag, x_cb - 1, y_cb);
634
4/4
✓ Branch 0 taken 1677991 times.
✓ Branch 1 taken 6381120 times.
✓ Branch 2 taken 1221609 times.
✓ Branch 3 taken 456382 times.
8059111 if (s->HEVClc->ctb_up_flag || y0b)
635 7602729 inc += !!SAMPLE_CTB(s->skip_flag, x_cb, y_cb - 1);
636
637 8059111 return GET_CABAC(elem_offset[SKIP_FLAG] + inc);
638 }
639
640 587289 int ff_hevc_cu_qp_delta_abs(HEVCContext *s)
641 {
642 587289 int prefix_val = 0;
643 587289 int suffix_val = 0;
644 587289 int inc = 0;
645
646
4/4
✓ Branch 0 taken 1456138 times.
✓ Branch 1 taken 105974 times.
✓ Branch 3 taken 974823 times.
✓ Branch 4 taken 481315 times.
1562112 while (prefix_val < 5 && GET_CABAC(elem_offset[CU_QP_DELTA] + inc)) {
647 974823 prefix_val++;
648 974823 inc = 1;
649 }
650
2/2
✓ Branch 0 taken 105974 times.
✓ Branch 1 taken 481315 times.
587289 if (prefix_val >= 5) {
651 105974 int k = 0;
652
3/4
✓ Branch 0 taken 360032 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 254058 times.
✓ Branch 4 taken 105974 times.
360032 while (k < 7 && get_cabac_bypass(&s->HEVClc->cc)) {
653 254058 suffix_val += 1 << k;
654 254058 k++;
655 }
656
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 105974 times.
105974 if (k == 7) {
657 av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
658 return AVERROR_INVALIDDATA;
659 }
660
661
2/2
✓ Branch 0 taken 254058 times.
✓ Branch 1 taken 105974 times.
360032 while (k--)
662 254058 suffix_val += get_cabac_bypass(&s->HEVClc->cc) << k;
663 }
664 587289 return prefix_val + suffix_val;
665 }
666
667 368174 int ff_hevc_cu_qp_delta_sign_flag(HEVCContext *s)
668 {
669 368174 return get_cabac_bypass(&s->HEVClc->cc);
670 }
671
672 266275 int ff_hevc_cu_chroma_qp_offset_flag(HEVCContext *s)
673 {
674 266275 return GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_FLAG]);
675 }
676
677 int ff_hevc_cu_chroma_qp_offset_idx(HEVCContext *s)
678 {
679 int c_max= FFMAX(5, s->ps.pps->chroma_qp_offset_list_len_minus1);
680 int i = 0;
681
682 while (i < c_max && GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_IDX]))
683 i++;
684
685 return i;
686 }
687
688 4185612 int ff_hevc_pred_mode_decode(HEVCContext *s)
689 {
690 4185612 return GET_CABAC(elem_offset[PRED_MODE_FLAG]);
691 }
692
693 7417795 int ff_hevc_split_coding_unit_flag_decode(HEVCContext *s, int ct_depth, int x0, int y0)
694 {
695 7417795 int inc = 0, depth_left = 0, depth_top = 0;
696 7417795 int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size);
697 7417795 int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size);
698 7417795 int x_cb = x0 >> s->ps.sps->log2_min_cb_size;
699 7417795 int y_cb = y0 >> s->ps.sps->log2_min_cb_size;
700
701
4/4
✓ Branch 0 taken 692643 times.
✓ Branch 1 taken 6725152 times.
✓ Branch 2 taken 395620 times.
✓ Branch 3 taken 297023 times.
7417795 if (s->HEVClc->ctb_left_flag || x0b)
702 7120772 depth_left = s->tab_ct_depth[(y_cb) * s->ps.sps->min_cb_width + x_cb - 1];
703
4/4
✓ Branch 0 taken 1487811 times.
✓ Branch 1 taken 5929984 times.
✓ Branch 2 taken 837773 times.
✓ Branch 3 taken 650038 times.
7417795 if (s->HEVClc->ctb_up_flag || y0b)
704 6767757 depth_top = s->tab_ct_depth[(y_cb - 1) * s->ps.sps->min_cb_width + x_cb];
705
706 7417795 inc += (depth_left > ct_depth);
707 7417795 inc += (depth_top > ct_depth);
708
709 7417795 return GET_CABAC(elem_offset[SPLIT_CODING_UNIT_FLAG] + inc);
710 }
711
712 6133579 int ff_hevc_part_mode_decode(HEVCContext *s, int log2_cb_size)
713 {
714
2/2
✓ Branch 1 taken 3571187 times.
✓ Branch 2 taken 2562392 times.
6133579 if (GET_CABAC(elem_offset[PART_MODE])) // 1
715 3571187 return PART_2Nx2N;
716
2/2
✓ Branch 0 taken 1932168 times.
✓ Branch 1 taken 630224 times.
2562392 if (log2_cb_size == s->ps.sps->log2_min_cb_size) {
717
2/2
✓ Branch 0 taken 1183253 times.
✓ Branch 1 taken 748915 times.
1932168 if (s->HEVClc->cu.pred_mode == MODE_INTRA) // 0
718 1183253 return PART_NxN;
719
2/2
✓ Branch 1 taken 307999 times.
✓ Branch 2 taken 440916 times.
748915 if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01
720 307999 return PART_2NxN;
721
2/2
✓ Branch 0 taken 222875 times.
✓ Branch 1 taken 218041 times.
440916 if (log2_cb_size == 3) // 00
722 222875 return PART_Nx2N;
723
2/2
✓ Branch 1 taken 112405 times.
✓ Branch 2 taken 105636 times.
218041 if (GET_CABAC(elem_offset[PART_MODE] + 2)) // 001
724 112405 return PART_Nx2N;
725 105636 return PART_NxN; // 000
726 }
727
728
2/2
✓ Branch 0 taken 65275 times.
✓ Branch 1 taken 564949 times.
630224 if (!s->ps.sps->amp_enabled_flag) {
729
2/2
✓ Branch 1 taken 29519 times.
✓ Branch 2 taken 35756 times.
65275 if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01
730 29519 return PART_2NxN;
731 35756 return PART_Nx2N;
732 }
733
734
2/2
✓ Branch 1 taken 227260 times.
✓ Branch 2 taken 337689 times.
564949 if (GET_CABAC(elem_offset[PART_MODE] + 1)) { // 01X, 01XX
735
2/2
✓ Branch 1 taken 108355 times.
✓ Branch 2 taken 118905 times.
227260 if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 011
736 108355 return PART_2NxN;
737
2/2
✓ Branch 1 taken 55171 times.
✓ Branch 2 taken 63734 times.
118905 if (get_cabac_bypass(&s->HEVClc->cc)) // 0101
738 55171 return PART_2NxnD;
739 63734 return PART_2NxnU; // 0100
740 }
741
742
2/2
✓ Branch 1 taken 164471 times.
✓ Branch 2 taken 173218 times.
337689 if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 001
743 164471 return PART_Nx2N;
744
2/2
✓ Branch 1 taken 80051 times.
✓ Branch 2 taken 93167 times.
173218 if (get_cabac_bypass(&s->HEVClc->cc)) // 0001
745 80051 return PART_nRx2N;
746 93167 return PART_nLx2N; // 0000
747 }
748
749 153183 int ff_hevc_pcm_flag_decode(HEVCContext *s)
750 {
751 153183 return get_cabac_terminate(&s->HEVClc->cc);
752 }
753
754 7452578 int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCContext *s)
755 {
756 7452578 return GET_CABAC(elem_offset[PREV_INTRA_LUMA_PRED_FLAG]);
757 }
758
759 4456300 int ff_hevc_mpm_idx_decode(HEVCContext *s)
760 {
761 4456300 int i = 0;
762
4/4
✓ Branch 0 taken 6648952 times.
✓ Branch 1 taken 932324 times.
✓ Branch 3 taken 3124976 times.
✓ Branch 4 taken 3523976 times.
7581276 while (i < 2 && get_cabac_bypass(&s->HEVClc->cc))
763 3124976 i++;
764 4456300 return i;
765 }
766
767 2996278 int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCContext *s)
768 {
769 int i;
770 2996278 int value = get_cabac_bypass(&s->HEVClc->cc);
771
772
2/2
✓ Branch 0 taken 11985112 times.
✓ Branch 1 taken 2996278 times.
14981390 for (i = 0; i < 4; i++)
773 11985112 value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
774 2996278 return value;
775 }
776
777 4004180 int ff_hevc_intra_chroma_pred_mode_decode(HEVCContext *s)
778 {
779 int ret;
780
2/2
✓ Branch 1 taken 2977973 times.
✓ Branch 2 taken 1026207 times.
4004180 if (!GET_CABAC(elem_offset[INTRA_CHROMA_PRED_MODE]))
781 2977973 return 4;
782
783 1026207 ret = get_cabac_bypass(&s->HEVClc->cc) << 1;
784 1026207 ret |= get_cabac_bypass(&s->HEVClc->cc);
785 1026207 return ret;
786 }
787
788 6127764 int ff_hevc_merge_idx_decode(HEVCContext *s)
789 {
790 6127764 int i = GET_CABAC(elem_offset[MERGE_IDX]);
791
792
2/2
✓ Branch 0 taken 2505007 times.
✓ Branch 1 taken 3622757 times.
6127764 if (i != 0) {
793
4/4
✓ Branch 0 taken 3857365 times.
✓ Branch 1 taken 297771 times.
✓ Branch 3 taken 1650129 times.
✓ Branch 4 taken 2207236 times.
4155136 while (i < s->sh.max_num_merge_cand-1 && get_cabac_bypass(&s->HEVClc->cc))
794 1650129 i++;
795 }
796 6127764 return i;
797 }
798
799 4710467 int ff_hevc_merge_flag_decode(HEVCContext *s)
800 {
801 4710467 return GET_CABAC(elem_offset[MERGE_FLAG]);
802 }
803
804 1811353 int ff_hevc_inter_pred_idc_decode(HEVCContext *s, int nPbW, int nPbH)
805 {
806
2/2
✓ Branch 0 taken 239847 times.
✓ Branch 1 taken 1571506 times.
1811353 if (nPbW + nPbH == 12)
807 239847 return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4);
808
2/2
✓ Branch 1 taken 404002 times.
✓ Branch 2 taken 1167504 times.
1571506 if (GET_CABAC(elem_offset[INTER_PRED_IDC] + s->HEVClc->ct_depth))
809 404002 return PRED_BI;
810
811 1167504 return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4);
812 }
813
814 2783351 int ff_hevc_ref_idx_lx_decode(HEVCContext *s, int num_ref_idx_lx)
815 {
816 2783351 int i = 0;
817 2783351 int max = num_ref_idx_lx - 1;
818 2783351 int max_ctx = FFMIN(max, 2);
819
820
4/4
✓ Branch 0 taken 2778685 times.
✓ Branch 1 taken 946699 times.
✓ Branch 3 taken 942033 times.
✓ Branch 4 taken 1836652 times.
3725384 while (i < max_ctx && GET_CABAC(elem_offset[REF_IDX_L0] + i))
821 942033 i++;
822
2/2
✓ Branch 0 taken 195868 times.
✓ Branch 1 taken 2587483 times.
2783351 if (i == 2) {
823
4/4
✓ Branch 0 taken 160433 times.
✓ Branch 1 taken 120844 times.
✓ Branch 3 taken 85409 times.
✓ Branch 4 taken 75024 times.
281277 while (i < max && get_cabac_bypass(&s->HEVClc->cc))
824 85409 i++;
825 }
826
827 2783351 return i;
828 }
829
830 2783351 int ff_hevc_mvp_lx_flag_decode(HEVCContext *s)
831 {
832 2783351 return GET_CABAC(elem_offset[MVP_LX_FLAG]);
833 }
834
835 2347622 int ff_hevc_no_residual_syntax_flag_decode(HEVCContext *s)
836 {
837 2347622 return GET_CABAC(elem_offset[NO_RESIDUAL_DATA_FLAG]);
838 }
839
840 5251114 static av_always_inline int abs_mvd_greater0_flag_decode(HEVCContext *s)
841 {
842 5251114 return GET_CABAC(elem_offset[ABS_MVD_GREATER0_FLAG]);
843 }
844
845 3592455 static av_always_inline int abs_mvd_greater1_flag_decode(HEVCContext *s)
846 {
847 3592455 return GET_CABAC(elem_offset[ABS_MVD_GREATER1_FLAG] + 1);
848 }
849
850 2577830 static av_always_inline int mvd_decode(HEVCContext *s)
851 {
852 2577830 int ret = 2;
853 2577830 int k = 1;
854
855
3/4
✓ Branch 0 taken 6313487 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 3735657 times.
✓ Branch 4 taken 2577830 times.
6313487 while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc)) {
856 3735657 ret += 1U << k;
857 3735657 k++;
858 }
859
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2577830 times.
2577830 if (k == CABAC_MAX_BIN) {
860 av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
861 return 0;
862 }
863
2/2
✓ Branch 0 taken 6313487 times.
✓ Branch 1 taken 2577830 times.
8891317 while (k--)
864 6313487 ret += get_cabac_bypass(&s->HEVClc->cc) << k;
865 2577830 return get_cabac_bypass_sign(&s->HEVClc->cc, -ret);
866 }
867
868 1014625 static av_always_inline int mvd_sign_flag_decode(HEVCContext *s)
869 {
870 1014625 return get_cabac_bypass_sign(&s->HEVClc->cc, -1);
871 }
872
873 6821913 int ff_hevc_split_transform_flag_decode(HEVCContext *s, int log2_trafo_size)
874 {
875 6821913 return GET_CABAC(elem_offset[SPLIT_TRANSFORM_FLAG] + 5 - log2_trafo_size);
876 }
877
878 14988955 int ff_hevc_cbf_cb_cr_decode(HEVCContext *s, int trafo_depth)
879 {
880 14988955 return GET_CABAC(elem_offset[CBF_CB_CR] + trafo_depth);
881 }
882
883 14510558 int ff_hevc_cbf_luma_decode(HEVCContext *s, int trafo_depth)
884 {
885 14510558 return GET_CABAC(elem_offset[CBF_LUMA] + !trafo_depth);
886 }
887
888 6478334 static int hevc_transform_skip_flag_decode(HEVCContext *s, int c_idx)
889 {
890 6478334 return GET_CABAC(elem_offset[TRANSFORM_SKIP_FLAG] + !!c_idx);
891 }
892
893 34172 static int explicit_rdpcm_flag_decode(HEVCContext *s, int c_idx)
894 {
895 34172 return GET_CABAC(elem_offset[EXPLICIT_RDPCM_FLAG] + !!c_idx);
896 }
897
898 2983 static int explicit_rdpcm_dir_flag_decode(HEVCContext *s, int c_idx)
899 {
900 2983 return GET_CABAC(elem_offset[EXPLICIT_RDPCM_DIR_FLAG] + !!c_idx);
901 }
902
903 384850 int ff_hevc_log2_res_scale_abs(HEVCContext *s, int idx) {
904 384850 int i =0;
905
906
4/4
✓ Branch 0 taken 1076510 times.
✓ Branch 1 taken 146082 times.
✓ Branch 3 taken 837742 times.
✓ Branch 4 taken 238768 times.
1222592 while (i < 4 && GET_CABAC(elem_offset[LOG2_RES_SCALE_ABS] + 4 * idx + i))
907 837742 i++;
908
909 384850 return i;
910 }
911
912 235843 int ff_hevc_res_scale_sign_flag(HEVCContext *s, int idx) {
913 235843 return GET_CABAC(elem_offset[RES_SCALE_SIGN_FLAG] + idx);
914 }
915
916 14073422 static av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCContext *s, int c_idx,
917 int log2_size, int *last_scx_prefix, int *last_scy_prefix)
918 {
919 14073422 int i = 0;
920 14073422 int max = (log2_size << 1) - 1;
921 int ctx_offset, ctx_shift;
922
923
2/2
✓ Branch 0 taken 9636182 times.
✓ Branch 1 taken 4437240 times.
14073422 if (!c_idx) {
924 9636182 ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2);
925 9636182 ctx_shift = (log2_size + 1) >> 2;
926 } else {
927 4437240 ctx_offset = 15;
928 4437240 ctx_shift = log2_size - 2;
929 }
930
4/4
✓ Branch 0 taken 34440669 times.
✓ Branch 1 taken 2083405 times.
✓ Branch 2 taken 22450652 times.
✓ Branch 3 taken 11990017 times.
70964743 while (i < max &&
931 34440669 GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_X_PREFIX] + (i >> ctx_shift) + ctx_offset))
932 22450652 i++;
933 14073422 *last_scx_prefix = i;
934
935 14073422 i = 0;
936
4/4
✓ Branch 0 taken 29858051 times.
✓ Branch 1 taken 1632672 times.
✓ Branch 2 taken 17417301 times.
✓ Branch 3 taken 12440750 times.
61348774 while (i < max &&
937 29858051 GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_Y_PREFIX] + (i >> ctx_shift) + ctx_offset))
938 17417301 i++;
939 14073422 *last_scy_prefix = i;
940 14073422 }
941
942 3064675 static av_always_inline int last_significant_coeff_suffix_decode(HEVCContext *s,
943 int last_significant_coeff_prefix)
944 {
945 int i;
946 3064675 int length = (last_significant_coeff_prefix >> 1) - 1;
947 3064675 int value = get_cabac_bypass(&s->HEVClc->cc);
948
949
2/2
✓ Branch 0 taken 857621 times.
✓ Branch 1 taken 3064675 times.
3922296 for (i = 1; i < length; i++)
950 857621 value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
951 3064675 return value;
952 }
953
954 8226583 static av_always_inline int significant_coeff_group_flag_decode(HEVCContext *s, int c_idx, int ctx_cg)
955 {
956 int inc;
957
958
2/2
✓ Branch 0 taken 1332999 times.
✓ Branch 1 taken 6893584 times.
8226583 inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
959
960 8226583 return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_GROUP_FLAG] + inc);
961 }
962 168599037 static av_always_inline int significant_coeff_flag_decode(HEVCContext *s, int x_c, int y_c,
963 int offset, const uint8_t *ctx_idx_map)
964 {
965 168599037 int inc = ctx_idx_map[(y_c << 2) + x_c] + offset;
966 168599037 return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + inc);
967 }
968
969 18311341 static av_always_inline int significant_coeff_flag_decode_0(HEVCContext *s, int c_idx, int offset)
970 {
971 18311341 return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + offset);
972 }
973
974 90140130 static av_always_inline int coeff_abs_level_greater1_flag_decode(HEVCContext *s, int c_idx, int inc)
975 {
976
977
2/2
✓ Branch 0 taken 21298633 times.
✓ Branch 1 taken 68841497 times.
90140130 if (c_idx > 0)
978 21298633 inc += 16;
979
980 90140130 return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER1_FLAG] + inc);
981 }
982
983 10032730 static av_always_inline int coeff_abs_level_greater2_flag_decode(HEVCContext *s, int c_idx, int inc)
984 {
985
2/2
✓ Branch 0 taken 2127059 times.
✓ Branch 1 taken 7905671 times.
10032730 if (c_idx > 0)
986 2127059 inc += 4;
987
988 10032730 return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER2_FLAG] + inc);
989 }
990
991 40608574 static av_always_inline int coeff_abs_level_remaining_decode(HEVCContext *s, int rc_rice_param)
992 {
993 40608574 int prefix = 0;
994 40608574 int suffix = 0;
995 int last_coeff_abs_level_remaining;
996 int i;
997
998
3/4
✓ Branch 0 taken 89140887 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 48532313 times.
✓ Branch 4 taken 40608574 times.
89140887 while (prefix < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc))
999 48532313 prefix++;
1000
1001
2/2
✓ Branch 0 taken 34688822 times.
✓ Branch 1 taken 5919752 times.
40608574 if (prefix < 3) {
1002
2/2
✓ Branch 0 taken 36915394 times.
✓ Branch 1 taken 34688822 times.
71604216 for (i = 0; i < rc_rice_param; i++)
1003 36915394 suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc);
1004 34688822 last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix;
1005 } else {
1006 5919752 int prefix_minus3 = prefix - 3;
1007
1008
2/4
✓ Branch 0 taken 5919752 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5919752 times.
5919752 if (prefix == CABAC_MAX_BIN || prefix_minus3 + rc_rice_param > 16 + 6) {
1009 av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix);
1010 return 0;
1011 }
1012
1013
2/2
✓ Branch 0 taken 19417742 times.
✓ Branch 1 taken 5919752 times.
25337494 for (i = 0; i < prefix_minus3 + rc_rice_param; i++)
1014 19417742 suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc);
1015 5919752 last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
1016 5919752 << rc_rice_param) + suffix;
1017 }
1018 40608574 return last_coeff_abs_level_remaining;
1019 }
1020
1021 21479528 static av_always_inline int coeff_sign_flag_decode(HEVCContext *s, uint8_t nb)
1022 {
1023 int i;
1024 21479528 int ret = 0;
1025
1026
2/2
✓ Branch 0 taken 97101556 times.
✓ Branch 1 taken 21479528 times.
118581084 for (i = 0; i < nb; i++)
1027 97101556 ret = (ret << 1) | get_cabac_bypass(&s->HEVClc->cc);
1028 21479528 return ret;
1029 }
1030
1031 14073422 void ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0,
1032 int log2_trafo_size, enum ScanType scan_idx,
1033 int c_idx)
1034 {
1035 #define GET_COORD(offset, n) \
1036 do { \
1037 x_c = (x_cg << 2) + scan_x_off[n]; \
1038 y_c = (y_cg << 2) + scan_y_off[n]; \
1039 } while (0)
1040 14073422 HEVCLocalContext *lc = s->HEVClc;
1041 14073422 int transform_skip_flag = 0;
1042
1043 int last_significant_coeff_x, last_significant_coeff_y;
1044 int last_scan_pos;
1045 int n_end;
1046 14073422 int num_coeff = 0;
1047 14073422 int greater1_ctx = 1;
1048
1049 int num_last_subset;
1050 int x_cg_last_sig, y_cg_last_sig;
1051
1052 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1053
1054 14073422 ptrdiff_t stride = s->frame->linesize[c_idx];
1055 14073422 int hshift = s->ps.sps->hshift[c_idx];
1056 14073422 int vshift = s->ps.sps->vshift[c_idx];
1057 14073422 uint8_t *dst = &s->frame->data[c_idx][(y0 >> vshift) * stride +
1058 14073422 ((x0 >> hshift) << s->ps.sps->pixel_shift)];
1059
2/2
✓ Branch 0 taken 4437240 times.
✓ Branch 1 taken 9636182 times.
14073422 int16_t *coeffs = (int16_t*)(c_idx ? lc->edge_emu_buffer2 : lc->edge_emu_buffer);
1060 14073422 uint8_t significant_coeff_group_flag[8][8] = {{0}};
1061 14073422 int explicit_rdpcm_flag = 0;
1062 int explicit_rdpcm_dir_flag;
1063
1064 14073422 int trafo_size = 1 << log2_trafo_size;
1065 int i;
1066 int qp,shift,add,scale,scale_m;
1067 static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
1068 14073422 const uint8_t *scale_matrix = NULL;
1069 uint8_t dc_scale;
1070
2/2
✓ Branch 0 taken 9636182 times.
✓ Branch 1 taken 4437240 times.
14073422 int pred_mode_intra = (c_idx == 0) ? lc->tu.intra_pred_mode :
1071 lc->tu.intra_pred_mode_c;
1072
1073 14073422 memset(coeffs, 0, trafo_size * trafo_size * sizeof(int16_t));
1074
1075 // Derive QP for dequant
1076
2/2
✓ Branch 0 taken 13635056 times.
✓ Branch 1 taken 438366 times.
14073422 if (!lc->cu.cu_transquant_bypass_flag) {
1077 static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1078 static const uint8_t rem6[51 + 4 * 6 + 1] = {
1079 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1080 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1081 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1082 4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1083 };
1084
1085 static const uint8_t div6[51 + 4 * 6 + 1] = {
1086 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
1087 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
1088 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1089 10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1090 };
1091 13635056 int qp_y = lc->qp_y;
1092
1093
2/2
✓ Branch 0 taken 11222997 times.
✓ Branch 1 taken 2412059 times.
13635056 if (s->ps.pps->transform_skip_enabled_flag &&
1094
2/2
✓ Branch 0 taken 6478334 times.
✓ Branch 1 taken 4744663 times.
11222997 log2_trafo_size <= s->ps.pps->log2_max_transform_skip_block_size) {
1095 6478334 transform_skip_flag = hevc_transform_skip_flag_decode(s, c_idx);
1096 }
1097
1098
2/2
✓ Branch 0 taken 9360934 times.
✓ Branch 1 taken 4274122 times.
13635056 if (c_idx == 0) {
1099 9360934 qp = qp_y + s->ps.sps->qp_bd_offset;
1100 } else {
1101 int qp_i, offset;
1102
1103
2/2
✓ Branch 0 taken 2039423 times.
✓ Branch 1 taken 2234699 times.
4274122 if (c_idx == 1)
1104 2039423 offset = s->ps.pps->cb_qp_offset + s->sh.slice_cb_qp_offset +
1105 2039423 lc->tu.cu_qp_offset_cb;
1106 else
1107 2234699 offset = s->ps.pps->cr_qp_offset + s->sh.slice_cr_qp_offset +
1108 2234699 lc->tu.cu_qp_offset_cr;
1109
1110 4274122 qp_i = av_clip(qp_y + offset, - s->ps.sps->qp_bd_offset, 57);
1111
2/2
✓ Branch 0 taken 2408017 times.
✓ Branch 1 taken 1866105 times.
4274122 if (s->ps.sps->chroma_format_idc == 1) {
1112
2/2
✓ Branch 0 taken 729892 times.
✓ Branch 1 taken 1678125 times.
2408017 if (qp_i < 30)
1113 729892 qp = qp_i;
1114
2/2
✓ Branch 0 taken 9230 times.
✓ Branch 1 taken 1668895 times.
1678125 else if (qp_i > 43)
1115 9230 qp = qp_i - 6;
1116 else
1117 1668895 qp = qp_c[qp_i - 30];
1118 } else {
1119
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1866105 times.
1866105 if (qp_i > 51)
1120 qp = 51;
1121 else
1122 1866105 qp = qp_i;
1123 }
1124
1125 4274122 qp += s->ps.sps->qp_bd_offset;
1126 }
1127
1128 13635056 shift = s->ps.sps->bit_depth + log2_trafo_size - 5;
1129 13635056 add = 1 << (shift-1);
1130 13635056 scale = level_scale[rem6[qp]] << (div6[qp]);
1131 13635056 scale_m = 16; // default when no custom scaling lists.
1132 13635056 dc_scale = 16;
1133
1134
6/6
✓ Branch 0 taken 484014 times.
✓ Branch 1 taken 13151042 times.
✓ Branch 2 taken 26526 times.
✓ Branch 3 taken 457488 times.
✓ Branch 4 taken 14292 times.
✓ Branch 5 taken 12234 times.
13635056 if (s->ps.sps->scaling_list_enable_flag && !(transform_skip_flag && log2_trafo_size > 2)) {
1135 943560 const ScalingList *sl = s->ps.pps->scaling_list_data_present_flag ?
1136
2/2
✓ Branch 0 taken 357638 times.
✓ Branch 1 taken 114142 times.
471780 &s->ps.pps->scaling_list : &s->ps.sps->scaling_list;
1137 471780 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
1138
1139 471780 matrix_id = 3 * matrix_id + c_idx;
1140
1141 471780 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
1142
2/2
✓ Branch 0 taken 42637 times.
✓ Branch 1 taken 429143 times.
471780 if (log2_trafo_size >= 4)
1143 42637 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
1144 }
1145 } else {
1146 438366 shift = 0;
1147 438366 add = 0;
1148 438366 scale = 0;
1149 438366 dc_scale = 0;
1150 }
1151
1152
6/6
✓ Branch 0 taken 4614471 times.
✓ Branch 1 taken 9458951 times.
✓ Branch 2 taken 223935 times.
✓ Branch 3 taken 4390536 times.
✓ Branch 4 taken 189763 times.
✓ Branch 5 taken 34172 times.
14073422 if (lc->cu.pred_mode == MODE_INTER && s->ps.sps->explicit_rdpcm_enabled_flag &&
1153
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 189763 times.
189763 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1154 34172 explicit_rdpcm_flag = explicit_rdpcm_flag_decode(s, c_idx);
1155
2/2
✓ Branch 0 taken 2983 times.
✓ Branch 1 taken 31189 times.
34172 if (explicit_rdpcm_flag) {
1156 2983 explicit_rdpcm_dir_flag = explicit_rdpcm_dir_flag_decode(s, c_idx);
1157 }
1158 }
1159
1160 14073422 last_significant_coeff_xy_prefix_decode(s, c_idx, log2_trafo_size,
1161 &last_significant_coeff_x, &last_significant_coeff_y);
1162
1163
2/2
✓ Branch 0 taken 1792909 times.
✓ Branch 1 taken 12280513 times.
14073422 if (last_significant_coeff_x > 3) {
1164 1792909 int suffix = last_significant_coeff_suffix_decode(s, last_significant_coeff_x);
1165 1792909 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1166 1792909 (2 + (last_significant_coeff_x & 1)) +
1167 suffix;
1168 }
1169
1170
2/2
✓ Branch 0 taken 1271766 times.
✓ Branch 1 taken 12801656 times.
14073422 if (last_significant_coeff_y > 3) {
1171 1271766 int suffix = last_significant_coeff_suffix_decode(s, last_significant_coeff_y);
1172 1271766 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1173 1271766 (2 + (last_significant_coeff_y & 1)) +
1174 suffix;
1175 }
1176
1177
2/2
✓ Branch 0 taken 1800807 times.
✓ Branch 1 taken 12272615 times.
14073422 if (scan_idx == SCAN_VERT)
1178 1800807 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1179
1180 14073422 x_cg_last_sig = last_significant_coeff_x >> 2;
1181 14073422 y_cg_last_sig = last_significant_coeff_y >> 2;
1182
1183
3/3
✓ Branch 0 taken 10257344 times.
✓ Branch 1 taken 2015271 times.
✓ Branch 2 taken 1800807 times.
14073422 switch (scan_idx) {
1184 10257344 case SCAN_DIAG: {
1185 10257344 int last_x_c = last_significant_coeff_x & 3;
1186 10257344 int last_y_c = last_significant_coeff_y & 3;
1187
1188 10257344 scan_x_off = ff_hevc_diag_scan4x4_x;
1189 10257344 scan_y_off = ff_hevc_diag_scan4x4_y;
1190 10257344 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1191
2/2
✓ Branch 0 taken 5229995 times.
✓ Branch 1 taken 5027349 times.
10257344 if (trafo_size == 4) {
1192 5229995 scan_x_cg = scan_1x1;
1193 5229995 scan_y_cg = scan_1x1;
1194
2/2
✓ Branch 0 taken 2768783 times.
✓ Branch 1 taken 2258566 times.
5027349 } else if (trafo_size == 8) {
1195 2768783 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1196 2768783 scan_x_cg = diag_scan2x2_x;
1197 2768783 scan_y_cg = diag_scan2x2_y;
1198
2/2
✓ Branch 0 taken 1675901 times.
✓ Branch 1 taken 582665 times.
2258566 } else if (trafo_size == 16) {
1199 1675901 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1200 1675901 scan_x_cg = ff_hevc_diag_scan4x4_x;
1201 1675901 scan_y_cg = ff_hevc_diag_scan4x4_y;
1202 } else { // trafo_size == 32
1203 582665 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1204 582665 scan_x_cg = ff_hevc_diag_scan8x8_x;
1205 582665 scan_y_cg = ff_hevc_diag_scan8x8_y;
1206 }
1207 10257344 break;
1208 }
1209 2015271 case SCAN_HORIZ:
1210 2015271 scan_x_cg = horiz_scan2x2_x;
1211 2015271 scan_y_cg = horiz_scan2x2_y;
1212 2015271 scan_x_off = horiz_scan4x4_x;
1213 2015271 scan_y_off = horiz_scan4x4_y;
1214 2015271 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1215 2015271 break;
1216 1800807 default: //SCAN_VERT
1217 1800807 scan_x_cg = horiz_scan2x2_y;
1218 1800807 scan_y_cg = horiz_scan2x2_x;
1219 1800807 scan_x_off = horiz_scan4x4_y;
1220 1800807 scan_y_off = horiz_scan4x4_x;
1221 1800807 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1222 1800807 break;
1223 }
1224 14073422 num_coeff++;
1225 14073422 num_last_subset = (num_coeff - 1) >> 4;
1226
1227
2/2
✓ Branch 0 taken 24657592 times.
✓ Branch 1 taken 14073422 times.
38731014 for (i = num_last_subset; i >= 0; i--) {
1228 int n, m;
1229 int x_cg, y_cg, x_c, y_c, pos;
1230 24657592 int implicit_non_zero_coeff = 0;
1231 int64_t trans_coeff_level;
1232 24657592 int prev_sig = 0;
1233 24657592 int offset = i << 4;
1234 24657592 int rice_init = 0;
1235
1236 uint8_t significant_coeff_flag_idx[16];
1237 24657592 uint8_t nb_significant_coeff_flag = 0;
1238
1239 24657592 x_cg = scan_x_cg[i];
1240 24657592 y_cg = scan_y_cg[i];
1241
1242
4/4
✓ Branch 0 taken 10584170 times.
✓ Branch 1 taken 14073422 times.
✓ Branch 2 taken 8226583 times.
✓ Branch 3 taken 2357587 times.
24657592 if ((i < num_last_subset) && (i > 0)) {
1243 8226583 int ctx_cg = 0;
1244
2/2
✓ Branch 0 taken 7518579 times.
✓ Branch 1 taken 708004 times.
8226583 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1245 7518579 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1246
2/2
✓ Branch 0 taken 6936185 times.
✓ Branch 1 taken 1290398 times.
8226583 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1247 6936185 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1248
1249 8226583 significant_coeff_group_flag[x_cg][y_cg] =
1250 8226583 significant_coeff_group_flag_decode(s, c_idx, ctx_cg);
1251 8226583 implicit_non_zero_coeff = 1;
1252 } else {
1253 16431009 significant_coeff_group_flag[x_cg][y_cg] =
1254
5/6
✓ Branch 0 taken 14744050 times.
✓ Branch 1 taken 1686959 times.
✓ Branch 2 taken 670628 times.
✓ Branch 3 taken 14073422 times.
✓ Branch 4 taken 2357587 times.
✗ Branch 5 not taken.
18788596 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1255
1/2
✓ Branch 0 taken 2357587 times.
✗ Branch 1 not taken.
2357587 (x_cg == 0 && y_cg == 0));
1256 }
1257
1258 24657592 last_scan_pos = num_coeff - offset - 1;
1259
1260
2/2
✓ Branch 0 taken 14073422 times.
✓ Branch 1 taken 10584170 times.
24657592 if (i == num_last_subset) {
1261 14073422 n_end = last_scan_pos - 1;
1262 14073422 significant_coeff_flag_idx[0] = last_scan_pos;
1263 14073422 nb_significant_coeff_flag = 1;
1264 } else {
1265 10584170 n_end = 15;
1266 }
1267
1268
2/2
✓ Branch 0 taken 14789296 times.
✓ Branch 1 taken 9868296 times.
24657592 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1269 14789296 prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1270
2/2
✓ Branch 0 taken 14364051 times.
✓ Branch 1 taken 10293541 times.
24657592 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1271
2/2
✓ Branch 0 taken 5119045 times.
✓ Branch 1 taken 9245006 times.
14364051 prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1272
1273
4/4
✓ Branch 0 taken 21564105 times.
✓ Branch 1 taken 3093487 times.
✓ Branch 2 taken 18381066 times.
✓ Branch 3 taken 3183039 times.
24657592 if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1274 static const uint8_t ctx_idx_map[] = {
1275 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8, // log2_trafo_size == 2
1276 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0
1277 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 1
1278 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, // prev_sig == 2
1279 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 // default
1280 };
1281 const uint8_t *ctx_idx_map_p;
1282 18381066 int scf_offset = 0;
1283
4/4
✓ Branch 0 taken 994136 times.
✓ Branch 1 taken 17386930 times.
✓ Branch 2 taken 875248 times.
✓ Branch 3 taken 118888 times.
18381066 if (s->ps.sps->transform_skip_context_enabled_flag &&
1284
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 875248 times.
875248 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1285 118888 ctx_idx_map_p = (uint8_t*) &ctx_idx_map[4 * 16];
1286
2/2
✓ Branch 0 taken 51044 times.
✓ Branch 1 taken 67844 times.
118888 if (c_idx == 0) {
1287 51044 scf_offset = 40;
1288 } else {
1289 67844 scf_offset = 14 + 27;
1290 }
1291 } else {
1292
2/2
✓ Branch 0 taken 4397896 times.
✓ Branch 1 taken 13864282 times.
18262178 if (c_idx != 0)
1293 4397896 scf_offset = 27;
1294
2/2
✓ Branch 0 taken 6311973 times.
✓ Branch 1 taken 11950205 times.
18262178 if (log2_trafo_size == 2) {
1295 6311973 ctx_idx_map_p = (uint8_t*) &ctx_idx_map[0];
1296 } else {
1297 11950205 ctx_idx_map_p = (uint8_t*) &ctx_idx_map[(prev_sig + 1) << 4];
1298
2/2
✓ Branch 0 taken 9565666 times.
✓ Branch 1 taken 2384539 times.
11950205 if (c_idx == 0) {
1299
4/4
✓ Branch 0 taken 5772616 times.
✓ Branch 1 taken 3793050 times.
✓ Branch 2 taken 2005567 times.
✓ Branch 3 taken 3767049 times.
9565666 if ((x_cg > 0 || y_cg > 0))
1300 5798617 scf_offset += 3;
1301
2/2
✓ Branch 0 taken 3593588 times.
✓ Branch 1 taken 5972078 times.
9565666 if (log2_trafo_size == 3) {
1302
2/2
✓ Branch 0 taken 2497386 times.
✓ Branch 1 taken 1096202 times.
3593588 scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15;
1303 } else {
1304 5972078 scf_offset += 21;
1305 }
1306 } else {
1307
2/2
✓ Branch 0 taken 1134159 times.
✓ Branch 1 taken 1250380 times.
2384539 if (log2_trafo_size == 3)
1308 1134159 scf_offset += 9;
1309 else
1310 1250380 scf_offset += 12;
1311 }
1312 }
1313 }
1314
2/2
✓ Branch 0 taken 168599037 times.
✓ Branch 1 taken 18381066 times.
186980103 for (n = n_end; n > 0; n--) {
1315 168599037 x_c = scan_x_off[n];
1316 168599037 y_c = scan_y_off[n];
1317
2/2
✓ Branch 1 taken 81399063 times.
✓ Branch 2 taken 87199974 times.
168599037 if (significant_coeff_flag_decode(s, x_c, y_c, scf_offset, ctx_idx_map_p)) {
1318 81399063 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1319 81399063 nb_significant_coeff_flag++;
1320 81399063 implicit_non_zero_coeff = 0;
1321 }
1322 }
1323
2/2
✓ Branch 0 taken 18311341 times.
✓ Branch 1 taken 69725 times.
18381066 if (implicit_non_zero_coeff == 0) {
1324
4/4
✓ Branch 0 taken 991720 times.
✓ Branch 1 taken 17319621 times.
✓ Branch 2 taken 873226 times.
✓ Branch 3 taken 118494 times.
18311341 if (s->ps.sps->transform_skip_context_enabled_flag &&
1325
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 873226 times.
873226 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1326
2/2
✓ Branch 0 taken 50789 times.
✓ Branch 1 taken 67705 times.
118494 if (c_idx == 0) {
1327 50789 scf_offset = 42;
1328 } else {
1329 67705 scf_offset = 16 + 27;
1330 }
1331 } else {
1332
2/2
✓ Branch 0 taken 11143583 times.
✓ Branch 1 taken 7049264 times.
18192847 if (i == 0) {
1333
2/2
✓ Branch 0 taken 8065665 times.
✓ Branch 1 taken 3077918 times.
11143583 if (c_idx == 0)
1334 8065665 scf_offset = 0;
1335 else
1336 3077918 scf_offset = 27;
1337 } else {
1338 7049264 scf_offset = 2 + scf_offset;
1339 }
1340 }
1341
2/2
✓ Branch 1 taken 12359379 times.
✓ Branch 2 taken 5951962 times.
18311341 if (significant_coeff_flag_decode_0(s, c_idx, scf_offset) == 1) {
1342 12359379 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1343 12359379 nb_significant_coeff_flag++;
1344 }
1345 } else {
1346 69725 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1347 69725 nb_significant_coeff_flag++;
1348 }
1349 }
1350
1351 24657592 n_end = nb_significant_coeff_flag;
1352
1353
1354
2/2
✓ Branch 0 taken 21479528 times.
✓ Branch 1 taken 3178064 times.
24657592 if (n_end) {
1355 int first_nz_pos_in_cg;
1356 int last_nz_pos_in_cg;
1357 21479528 int c_rice_param = 0;
1358 21479528 int first_greater1_coeff_idx = -1;
1359 uint8_t coeff_abs_level_greater1_flag[8];
1360 uint16_t coeff_sign_flag;
1361 21479528 int sum_abs = 0;
1362 int sign_hidden;
1363 int sb_type;
1364
1365
1366 // initialize first elem of coeff_bas_level_greater1_flag
1367
4/4
✓ Branch 0 taken 7490683 times.
✓ Branch 1 taken 13988845 times.
✓ Branch 2 taken 6081035 times.
✓ Branch 3 taken 1409648 times.
21479528 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1368
1369
2/2
✓ Branch 0 taken 1139414 times.
✓ Branch 1 taken 20340114 times.
21479528 if (s->ps.sps->persistent_rice_adaptation_enabled_flag) {
1370
3/4
✓ Branch 0 taken 1031717 times.
✓ Branch 1 taken 107697 times.
✓ Branch 2 taken 1031717 times.
✗ Branch 3 not taken.
1139414 if (!transform_skip_flag && !lc->cu.cu_transquant_bypass_flag)
1371
2/2
✓ Branch 0 taken 353924 times.
✓ Branch 1 taken 677793 times.
1031717 sb_type = 2 * (c_idx == 0 ? 1 : 0);
1372 else
1373
2/2
✓ Branch 0 taken 45913 times.
✓ Branch 1 taken 61784 times.
107697 sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1374 1139414 c_rice_param = lc->stat_coeff[sb_type] / 4;
1375 }
1376
1377
4/4
✓ Branch 0 taken 7406106 times.
✓ Branch 1 taken 14073422 times.
✓ Branch 2 taken 3312147 times.
✓ Branch 3 taken 4093959 times.
21479528 if (!(i == num_last_subset) && greater1_ctx == 0)
1378 3312147 ctx_set++;
1379 21479528 greater1_ctx = 1;
1380 21479528 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1381
1382
2/2
✓ Branch 0 taken 90140130 times.
✓ Branch 1 taken 21479528 times.
111619658 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1383 90140130 int inc = (ctx_set << 2) + greater1_ctx;
1384 90140130 coeff_abs_level_greater1_flag[m] =
1385 90140130 coeff_abs_level_greater1_flag_decode(s, c_idx, inc);
1386
2/2
✓ Branch 0 taken 29701794 times.
✓ Branch 1 taken 60438336 times.
90140130 if (coeff_abs_level_greater1_flag[m]) {
1387 29701794 greater1_ctx = 0;
1388
2/2
✓ Branch 0 taken 10032730 times.
✓ Branch 1 taken 19669064 times.
29701794 if (first_greater1_coeff_idx == -1)
1389 10032730 first_greater1_coeff_idx = m;
1390
4/4
✓ Branch 0 taken 47911261 times.
✓ Branch 1 taken 12527075 times.
✓ Branch 2 taken 29492138 times.
✓ Branch 3 taken 18419123 times.
60438336 } else if (greater1_ctx > 0 && greater1_ctx < 3) {
1391 29492138 greater1_ctx++;
1392 }
1393 }
1394 21479528 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1395
1396
2/2
✓ Branch 0 taken 20776041 times.
✓ Branch 1 taken 703487 times.
21479528 if (lc->cu.cu_transquant_bypass_flag ||
1397
2/2
✓ Branch 0 taken 13378923 times.
✓ Branch 1 taken 7397118 times.
20776041 (lc->cu.pred_mode == MODE_INTRA &&
1398
6/6
✓ Branch 0 taken 877178 times.
✓ Branch 1 taken 12501745 times.
✓ Branch 2 taken 81601 times.
✓ Branch 3 taken 795577 times.
✓ Branch 4 taken 39020 times.
✓ Branch 5 taken 42581 times.
13378923 s->ps.sps->implicit_rdpcm_enabled_flag && transform_skip_flag &&
1399
4/4
✓ Branch 0 taken 22009 times.
✓ Branch 1 taken 17011 times.
✓ Branch 2 taken 5892 times.
✓ Branch 3 taken 20710557 times.
20733460 (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1400 explicit_rdpcm_flag)
1401 768971 sign_hidden = 0;
1402 else
1403 20710557 sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1404
1405
2/2
✓ Branch 0 taken 10032730 times.
✓ Branch 1 taken 11446798 times.
21479528 if (first_greater1_coeff_idx != -1) {
1406 10032730 coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += coeff_abs_level_greater2_flag_decode(s, c_idx, ctx_set);
1407 }
1408
4/4
✓ Branch 0 taken 19171665 times.
✓ Branch 1 taken 2307863 times.
✓ Branch 2 taken 8371632 times.
✓ Branch 3 taken 10800033 times.
21479528 if (!s->ps.pps->sign_data_hiding_flag || !sign_hidden ) {
1409 10679495 coeff_sign_flag = coeff_sign_flag_decode(s, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1410 } else {
1411 10800033 coeff_sign_flag = coeff_sign_flag_decode(s, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1412 }
1413
1414
2/2
✓ Branch 0 taken 107901589 times.
✓ Branch 1 taken 21479528 times.
129381117 for (m = 0; m < n_end; m++) {
1415 107901589 n = significant_coeff_flag_idx[m];
1416 107901589 GET_COORD(offset, n);
1417
2/2
✓ Branch 0 taken 90140130 times.
✓ Branch 1 taken 17761459 times.
107901589 if (m < 8) {
1418 90140130 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1419
4/4
✓ Branch 0 taken 10032730 times.
✓ Branch 1 taken 80107400 times.
✓ Branch 2 taken 22847115 times.
✓ Branch 3 taken 67293015 times.
90140130 if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1420 22847115 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(s, c_rice_param);
1421
1422 22847115 trans_coeff_level += last_coeff_abs_level_remaining;
1423
2/2
✓ Branch 0 taken 5935607 times.
✓ Branch 1 taken 16911508 times.
22847115 if (trans_coeff_level > (3 << c_rice_param))
1424
2/2
✓ Branch 0 taken 191345 times.
✓ Branch 1 taken 5744262 times.
5935607 c_rice_param = s->ps.sps->persistent_rice_adaptation_enabled_flag ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1425
4/4
✓ Branch 0 taken 1083755 times.
✓ Branch 1 taken 21763360 times.
✓ Branch 2 taken 303626 times.
✓ Branch 3 taken 780129 times.
22847115 if (s->ps.sps->persistent_rice_adaptation_enabled_flag && !rice_init) {
1426 303626 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1427
2/2
✓ Branch 0 taken 36850 times.
✓ Branch 1 taken 266776 times.
303626 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1428 36850 lc->stat_coeff[sb_type]++;
1429
2/2
✓ Branch 0 taken 151795 times.
✓ Branch 1 taken 114981 times.
266776 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1430
2/2
✓ Branch 0 taken 36734 times.
✓ Branch 1 taken 115061 times.
151795 if (lc->stat_coeff[sb_type] > 0)
1431 36734 lc->stat_coeff[sb_type]--;
1432 303626 rice_init = 1;
1433 }
1434 }
1435 } else {
1436 17761459 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(s, c_rice_param);
1437
1438 17761459 trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1439
2/2
✓ Branch 0 taken 2217593 times.
✓ Branch 1 taken 15543866 times.
17761459 if (trans_coeff_level > (3 << c_rice_param))
1440
2/2
✓ Branch 0 taken 88712 times.
✓ Branch 1 taken 2128881 times.
2217593 c_rice_param = s->ps.sps->persistent_rice_adaptation_enabled_flag ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1441
4/4
✓ Branch 0 taken 934265 times.
✓ Branch 1 taken 16827194 times.
✓ Branch 2 taken 36289 times.
✓ Branch 3 taken 897976 times.
17761459 if (s->ps.sps->persistent_rice_adaptation_enabled_flag && !rice_init) {
1442 36289 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1443
2/2
✓ Branch 0 taken 1306 times.
✓ Branch 1 taken 34983 times.
36289 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1444 1306 lc->stat_coeff[sb_type]++;
1445
2/2
✓ Branch 0 taken 24454 times.
✓ Branch 1 taken 10529 times.
34983 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1446
2/2
✓ Branch 0 taken 1287 times.
✓ Branch 1 taken 23167 times.
24454 if (lc->stat_coeff[sb_type] > 0)
1447 1287 lc->stat_coeff[sb_type]--;
1448 36289 rice_init = 1;
1449 }
1450 }
1451
4/4
✓ Branch 0 taken 100133617 times.
✓ Branch 1 taken 7767972 times.
✓ Branch 2 taken 78171993 times.
✓ Branch 3 taken 21961624 times.
107901589 if (s->ps.pps->sign_data_hiding_flag && sign_hidden) {
1452 78171993 sum_abs += trans_coeff_level;
1453
4/4
✓ Branch 0 taken 10800033 times.
✓ Branch 1 taken 67371960 times.
✓ Branch 2 taken 5392455 times.
✓ Branch 3 taken 5407578 times.
78171993 if (n == first_nz_pos_in_cg && (sum_abs&1))
1454 5392455 trans_coeff_level = -trans_coeff_level;
1455 }
1456
2/2
✓ Branch 0 taken 49057927 times.
✓ Branch 1 taken 58843662 times.
107901589 if (coeff_sign_flag >> 15)
1457 49057927 trans_coeff_level = -trans_coeff_level;
1458 107901589 coeff_sign_flag <<= 1;
1459
2/2
✓ Branch 0 taken 99217203 times.
✓ Branch 1 taken 8684386 times.
107901589 if(!lc->cu.cu_transquant_bypass_flag) {
1460
6/6
✓ Branch 0 taken 2778647 times.
✓ Branch 1 taken 96438556 times.
✓ Branch 2 taken 190401 times.
✓ Branch 3 taken 2588246 times.
✓ Branch 4 taken 30375 times.
✓ Branch 5 taken 160026 times.
99217203 if (s->ps.sps->scaling_list_enable_flag && !(transform_skip_flag && log2_trafo_size > 2)) {
1461
6/6
✓ Branch 0 taken 822457 times.
✓ Branch 1 taken 1796164 times.
✓ Branch 2 taken 369421 times.
✓ Branch 3 taken 453036 times.
✓ Branch 4 taken 338164 times.
✓ Branch 5 taken 31257 times.
2618621 if(y_c || x_c || log2_trafo_size < 4) {
1462
4/4
✓ Branch 0 taken 650713 times.
✓ Branch 1 taken 814838 times.
✓ Branch 2 taken 298445 times.
✓ Branch 3 taken 823368 times.
2587364 switch(log2_trafo_size) {
1463 650713 case 3: pos = (y_c << 3) + x_c; break;
1464 814838 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1465 298445 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1466 823368 default: pos = (y_c << 2) + x_c; break;
1467 }
1468 2587364 scale_m = scale_matrix[pos];
1469 } else {
1470 31257 scale_m = dc_scale;
1471 }
1472 }
1473 99217203 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1474
2/2
✓ Branch 0 taken 50079564 times.
✓ Branch 1 taken 49137639 times.
99217203 if(trans_coeff_level < 0) {
1475
2/2
✓ Branch 0 taken 162681 times.
✓ Branch 1 taken 49916883 times.
50079564 if((~trans_coeff_level) & 0xFffffffffff8000)
1476 162681 trans_coeff_level = -32768;
1477 } else {
1478
2/2
✓ Branch 0 taken 162295 times.
✓ Branch 1 taken 48975344 times.
49137639 if(trans_coeff_level & 0xffffffffffff8000)
1479 162295 trans_coeff_level = 32767;
1480 }
1481 }
1482 107901589 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1483 }
1484 }
1485 }
1486
1487
2/2
✓ Branch 0 taken 438366 times.
✓ Branch 1 taken 13635056 times.
14073422 if (lc->cu.cu_transquant_bypass_flag) {
1488
2/6
✓ Branch 0 taken 438366 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 438366 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
438366 if (explicit_rdpcm_flag || (s->ps.sps->implicit_rdpcm_enabled_flag &&
1489 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1490 int mode = s->ps.sps->implicit_rdpcm_enabled_flag ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1491
1492 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1493 }
1494 } else {
1495
2/2
✓ Branch 0 taken 419977 times.
✓ Branch 1 taken 13215079 times.
13635056 if (transform_skip_flag) {
1496
2/2
✓ Branch 0 taken 42717 times.
✓ Branch 1 taken 21520 times.
64237 int rot = s->ps.sps->transform_skip_rotation_enabled_flag &&
1497
2/2
✓ Branch 0 taken 64237 times.
✓ Branch 1 taken 355740 times.
484214 log2_trafo_size == 2 &&
1498
2/2
✓ Branch 0 taken 9996 times.
✓ Branch 1 taken 32721 times.
42717 lc->cu.pred_mode == MODE_INTRA;
1499
2/2
✓ Branch 0 taken 9996 times.
✓ Branch 1 taken 409981 times.
419977 if (rot) {
1500
2/2
✓ Branch 0 taken 79968 times.
✓ Branch 1 taken 9996 times.
89964 for (i = 0; i < 8; i++)
1501 79968 FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]);
1502 }
1503
1504 419977 s->hevcdsp.dequant(coeffs, log2_trafo_size);
1505
1506
4/4
✓ Branch 0 taken 416994 times.
✓ Branch 1 taken 2983 times.
✓ Branch 2 taken 61254 times.
✓ Branch 3 taken 355740 times.
419977 if (explicit_rdpcm_flag || (s->ps.sps->implicit_rdpcm_enabled_flag &&
1507
4/4
✓ Branch 0 taken 30065 times.
✓ Branch 1 taken 31189 times.
✓ Branch 2 taken 16829 times.
✓ Branch 3 taken 13236 times.
61254 lc->cu.pred_mode == MODE_INTRA &&
1508
2/2
✓ Branch 0 taken 6275 times.
✓ Branch 1 taken 10554 times.
16829 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1509
2/2
✓ Branch 0 taken 19511 times.
✓ Branch 1 taken 2983 times.
22494 int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26);
1510
1511 22494 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1512 }
1513
6/6
✓ Branch 0 taken 8966427 times.
✓ Branch 1 taken 4248652 times.
✓ Branch 2 taken 6052754 times.
✓ Branch 3 taken 2913673 times.
✓ Branch 4 taken 3549437 times.
✓ Branch 5 taken 2503317 times.
13215079 } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) {
1514 3549437 s->hevcdsp.transform_4x4_luma(coeffs);
1515 } else {
1516 9665642 int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1517
2/2
✓ Branch 0 taken 2168678 times.
✓ Branch 1 taken 7496964 times.
9665642 if (max_xy == 0)
1518 2168678 s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1519 else {
1520 7496964 int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1521
2/2
✓ Branch 0 taken 5194917 times.
✓ Branch 1 taken 2302047 times.
7496964 if (max_xy < 4)
1522 5194917 col_limit = FFMIN(4, col_limit);
1523
2/2
✓ Branch 0 taken 1719802 times.
✓ Branch 1 taken 582245 times.
2302047 else if (max_xy < 8)
1524 1719802 col_limit = FFMIN(8, col_limit);
1525
2/2
✓ Branch 0 taken 249058 times.
✓ Branch 1 taken 333187 times.
582245 else if (max_xy < 12)
1526 249058 col_limit = FFMIN(24, col_limit);
1527 7496964 s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1528 }
1529 }
1530 }
1531
2/2
✓ Branch 0 taken 269268 times.
✓ Branch 1 taken 13804154 times.
14073422 if (lc->tu.cross_pf) {
1532 269268 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1533
1534
2/2
✓ Branch 0 taken 20252880 times.
✓ Branch 1 taken 269268 times.
20522148 for (i = 0; i < (trafo_size * trafo_size); i++) {
1535 20252880 coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1536 }
1537 }
1538 14073422 s->hevcdsp.add_residual[log2_trafo_size-2](dst, coeffs, stride);
1539 14073422 }
1540
1541 2625557 void ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
1542 {
1543 2625557 HEVCLocalContext *lc = s->HEVClc;
1544 2625557 int x = abs_mvd_greater0_flag_decode(s);
1545 2625557 int y = abs_mvd_greater0_flag_decode(s);
1546
1547
2/2
✓ Branch 0 taken 1832396 times.
✓ Branch 1 taken 793161 times.
2625557 if (x)
1548 1832396 x += abs_mvd_greater1_flag_decode(s);
1549
2/2
✓ Branch 0 taken 1760059 times.
✓ Branch 1 taken 865498 times.
2625557 if (y)
1550 1760059 y += abs_mvd_greater1_flag_decode(s);
1551
1552
3/4
✓ Branch 0 taken 1330467 times.
✓ Branch 1 taken 501929 times.
✓ Branch 2 taken 793161 times.
✗ Branch 3 not taken.
2625557 switch (x) {
1553 1330467 case 2: lc->pu.mvd.x = mvd_decode(s); break;
1554 501929 case 1: lc->pu.mvd.x = mvd_sign_flag_decode(s); break;
1555 793161 case 0: lc->pu.mvd.x = 0; break;
1556 }
1557
1558
3/4
✓ Branch 0 taken 1247363 times.
✓ Branch 1 taken 512696 times.
✓ Branch 2 taken 865498 times.
✗ Branch 3 not taken.
2625557 switch (y) {
1559 1247363 case 2: lc->pu.mvd.y = mvd_decode(s); break;
1560 512696 case 1: lc->pu.mvd.y = mvd_sign_flag_decode(s); break;
1561 865498 case 0: lc->pu.mvd.y = 0; break;
1562 }
1563 2625557 }
1564
1565