FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/hevc/cabac.c
Date: 2024-07-16 12:46:59
Exec Total Coverage
Lines: 640 661 96.8%
Functions: 54 55 98.2%
Branches: 497 531 93.6%

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 "data.h"
29 #include "hevc.h"
30 #include "hevcdec.h"
31
32 #define CABAC_MAX_BIN 31
33
34 // ELEM(NAME, NUM_BINS)
35 #define CABAC_ELEMS(ELEM) \
36 ELEM(SAO_MERGE_FLAG, 1) \
37 ELEM(SAO_TYPE_IDX, 1) \
38 ELEM(SAO_EO_CLASS, 0) \
39 ELEM(SAO_BAND_POSITION, 0) \
40 ELEM(SAO_OFFSET_ABS, 0) \
41 ELEM(SAO_OFFSET_SIGN, 0) \
42 ELEM(END_OF_SLICE_FLAG, 0) \
43 ELEM(SPLIT_CODING_UNIT_FLAG, 3) \
44 ELEM(CU_TRANSQUANT_BYPASS_FLAG, 1) \
45 ELEM(SKIP_FLAG, 3) \
46 ELEM(CU_QP_DELTA, 3) \
47 ELEM(PRED_MODE_FLAG, 1) \
48 ELEM(PART_MODE, 4) \
49 ELEM(PCM_FLAG, 0) \
50 ELEM(PREV_INTRA_LUMA_PRED_FLAG, 1) \
51 ELEM(MPM_IDX, 0) \
52 ELEM(REM_INTRA_LUMA_PRED_MODE, 0) \
53 ELEM(INTRA_CHROMA_PRED_MODE, 2) \
54 ELEM(MERGE_FLAG, 1) \
55 ELEM(MERGE_IDX, 1) \
56 ELEM(INTER_PRED_IDC, 5) \
57 ELEM(REF_IDX_L0, 2) \
58 ELEM(REF_IDX_L1, 2) \
59 ELEM(ABS_MVD_GREATER0_FLAG, 2) \
60 ELEM(ABS_MVD_GREATER1_FLAG, 2) \
61 ELEM(ABS_MVD_MINUS2, 0) \
62 ELEM(MVD_SIGN_FLAG, 0) \
63 ELEM(MVP_LX_FLAG, 1) \
64 ELEM(NO_RESIDUAL_DATA_FLAG, 1) \
65 ELEM(SPLIT_TRANSFORM_FLAG, 3) \
66 ELEM(CBF_LUMA, 2) \
67 ELEM(CBF_CB_CR, 5) \
68 ELEM(TRANSFORM_SKIP_FLAG, 2) \
69 ELEM(EXPLICIT_RDPCM_FLAG, 2) \
70 ELEM(EXPLICIT_RDPCM_DIR_FLAG, 2) \
71 ELEM(LAST_SIGNIFICANT_COEFF_X_PREFIX, 18) \
72 ELEM(LAST_SIGNIFICANT_COEFF_Y_PREFIX, 18) \
73 ELEM(LAST_SIGNIFICANT_COEFF_X_SUFFIX, 0) \
74 ELEM(LAST_SIGNIFICANT_COEFF_Y_SUFFIX, 0) \
75 ELEM(SIGNIFICANT_COEFF_GROUP_FLAG, 4) \
76 ELEM(SIGNIFICANT_COEFF_FLAG, 44) \
77 ELEM(COEFF_ABS_LEVEL_GREATER1_FLAG, 24) \
78 ELEM(COEFF_ABS_LEVEL_GREATER2_FLAG, 6) \
79 ELEM(COEFF_ABS_LEVEL_REMAINING, 0) \
80 ELEM(COEFF_SIGN_FLAG, 0) \
81 ELEM(LOG2_RES_SCALE_ABS, 8) \
82 ELEM(RES_SCALE_SIGN_FLAG, 2) \
83 ELEM(CU_CHROMA_QP_OFFSET_FLAG, 1) \
84 ELEM(CU_CHROMA_QP_OFFSET_IDX, 1) \
85
86 /**
87 * Offset to ctxIdx 0 in init_values and states.
88 */
89 enum {
90 #define OFFSET(NAME, NUM_BINS) \
91 NAME ## _OFFSET, \
92 NAME ## _END = NAME ## _OFFSET + NUM_BINS - 1,
93 CABAC_ELEMS(OFFSET)
94 };
95
96 #define CNU 154
97 /**
98 * Indexed by init_type
99 */
100 static const uint8_t init_values[3][HEVC_CONTEXTS] = {
101 { // sao_merge_flag
102 153,
103 // sao_type_idx
104 200,
105 // split_coding_unit_flag
106 139, 141, 157,
107 // cu_transquant_bypass_flag
108 154,
109 // skip_flag
110 CNU, CNU, CNU,
111 // cu_qp_delta
112 154, 154, 154,
113 // pred_mode
114 CNU,
115 // part_mode
116 184, CNU, CNU, CNU,
117 // prev_intra_luma_pred_mode
118 184,
119 // intra_chroma_pred_mode
120 63, 139,
121 // merge_flag
122 CNU,
123 // merge_idx
124 CNU,
125 // inter_pred_idc
126 CNU, CNU, CNU, CNU, CNU,
127 // ref_idx_l0
128 CNU, CNU,
129 // ref_idx_l1
130 CNU, CNU,
131 // abs_mvd_greater1_flag
132 CNU, CNU,
133 // abs_mvd_greater1_flag
134 CNU, CNU,
135 // mvp_lx_flag
136 CNU,
137 // no_residual_data_flag
138 CNU,
139 // split_transform_flag
140 153, 138, 138,
141 // cbf_luma
142 111, 141,
143 // cbf_cb, cbf_cr
144 94, 138, 182, 154, 154,
145 // transform_skip_flag
146 139, 139,
147 // explicit_rdpcm_flag
148 139, 139,
149 // explicit_rdpcm_dir_flag
150 139, 139,
151 // last_significant_coeff_x_prefix
152 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
153 79, 108, 123, 63,
154 // last_significant_coeff_y_prefix
155 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
156 79, 108, 123, 63,
157 // significant_coeff_group_flag
158 91, 171, 134, 141,
159 // significant_coeff_flag
160 111, 111, 125, 110, 110, 94, 124, 108, 124, 107, 125, 141, 179, 153,
161 125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140,
162 139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111,
163 141, 111,
164 // coeff_abs_level_greater1_flag
165 140, 92, 137, 138, 140, 152, 138, 139, 153, 74, 149, 92, 139, 107,
166 122, 152, 140, 179, 166, 182, 140, 227, 122, 197,
167 // coeff_abs_level_greater2_flag
168 138, 153, 136, 167, 152, 152,
169 // log2_res_scale_abs
170 154, 154, 154, 154, 154, 154, 154, 154,
171 // res_scale_sign_flag
172 154, 154,
173 // cu_chroma_qp_offset_flag
174 154,
175 // cu_chroma_qp_offset_idx
176 154,
177 },
178 { // sao_merge_flag
179 153,
180 // sao_type_idx
181 185,
182 // split_coding_unit_flag
183 107, 139, 126,
184 // cu_transquant_bypass_flag
185 154,
186 // skip_flag
187 197, 185, 201,
188 // cu_qp_delta
189 154, 154, 154,
190 // pred_mode
191 149,
192 // part_mode
193 154, 139, 154, 154,
194 // prev_intra_luma_pred_mode
195 154,
196 // intra_chroma_pred_mode
197 152, 139,
198 // merge_flag
199 110,
200 // merge_idx
201 122,
202 // inter_pred_idc
203 95, 79, 63, 31, 31,
204 // ref_idx_l0
205 153, 153,
206 // ref_idx_l1
207 153, 153,
208 // abs_mvd_greater1_flag
209 140, 198,
210 // abs_mvd_greater1_flag
211 140, 198,
212 // mvp_lx_flag
213 168,
214 // no_residual_data_flag
215 79,
216 // split_transform_flag
217 124, 138, 94,
218 // cbf_luma
219 153, 111,
220 // cbf_cb, cbf_cr
221 149, 107, 167, 154, 154,
222 // transform_skip_flag
223 139, 139,
224 // explicit_rdpcm_flag
225 139, 139,
226 // explicit_rdpcm_dir_flag
227 139, 139,
228 // last_significant_coeff_x_prefix
229 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
230 94, 108, 123, 108,
231 // last_significant_coeff_y_prefix
232 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
233 94, 108, 123, 108,
234 // significant_coeff_group_flag
235 121, 140, 61, 154,
236 // significant_coeff_flag
237 155, 154, 139, 153, 139, 123, 123, 63, 153, 166, 183, 140, 136, 153,
238 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
239 153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140,
240 140, 140,
241 // coeff_abs_level_greater1_flag
242 154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
243 136, 137, 169, 194, 166, 167, 154, 167, 137, 182,
244 // coeff_abs_level_greater2_flag
245 107, 167, 91, 122, 107, 167,
246 // log2_res_scale_abs
247 154, 154, 154, 154, 154, 154, 154, 154,
248 // res_scale_sign_flag
249 154, 154,
250 // cu_chroma_qp_offset_flag
251 154,
252 // cu_chroma_qp_offset_idx
253 154,
254 },
255 { // sao_merge_flag
256 153,
257 // sao_type_idx
258 160,
259 // split_coding_unit_flag
260 107, 139, 126,
261 // cu_transquant_bypass_flag
262 154,
263 // skip_flag
264 197, 185, 201,
265 // cu_qp_delta
266 154, 154, 154,
267 // pred_mode
268 134,
269 // part_mode
270 154, 139, 154, 154,
271 // prev_intra_luma_pred_mode
272 183,
273 // intra_chroma_pred_mode
274 152, 139,
275 // merge_flag
276 154,
277 // merge_idx
278 137,
279 // inter_pred_idc
280 95, 79, 63, 31, 31,
281 // ref_idx_l0
282 153, 153,
283 // ref_idx_l1
284 153, 153,
285 // abs_mvd_greater1_flag
286 169, 198,
287 // abs_mvd_greater1_flag
288 169, 198,
289 // mvp_lx_flag
290 168,
291 // no_residual_data_flag
292 79,
293 // split_transform_flag
294 224, 167, 122,
295 // cbf_luma
296 153, 111,
297 // cbf_cb, cbf_cr
298 149, 92, 167, 154, 154,
299 // transform_skip_flag
300 139, 139,
301 // explicit_rdpcm_flag
302 139, 139,
303 // explicit_rdpcm_dir_flag
304 139, 139,
305 // last_significant_coeff_x_prefix
306 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
307 79, 108, 123, 93,
308 // last_significant_coeff_y_prefix
309 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
310 79, 108, 123, 93,
311 // significant_coeff_group_flag
312 121, 140, 61, 154,
313 // significant_coeff_flag
314 170, 154, 139, 153, 139, 123, 123, 63, 124, 166, 183, 140, 136, 153,
315 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
316 153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140,
317 140, 140,
318 // coeff_abs_level_greater1_flag
319 154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
320 136, 122, 169, 208, 166, 167, 154, 152, 167, 182,
321 // coeff_abs_level_greater2_flag
322 107, 167, 91, 107, 107, 167,
323 // log2_res_scale_abs
324 154, 154, 154, 154, 154, 154, 154, 154,
325 // res_scale_sign_flag
326 154, 154,
327 // cu_chroma_qp_offset_flag
328 154,
329 // cu_chroma_qp_offset_idx
330 154,
331 },
332 };
333
334 static const uint8_t scan_1x1[1] = {
335 0,
336 };
337
338 static const uint8_t horiz_scan2x2_x[4] = {
339 0, 1, 0, 1,
340 };
341
342 static const uint8_t horiz_scan2x2_y[4] = {
343 0, 0, 1, 1
344 };
345
346 static const uint8_t horiz_scan4x4_x[16] = {
347 0, 1, 2, 3,
348 0, 1, 2, 3,
349 0, 1, 2, 3,
350 0, 1, 2, 3,
351 };
352
353 static const uint8_t horiz_scan4x4_y[16] = {
354 0, 0, 0, 0,
355 1, 1, 1, 1,
356 2, 2, 2, 2,
357 3, 3, 3, 3,
358 };
359
360 static const uint8_t horiz_scan8x8_inv[8][8] = {
361 { 0, 1, 2, 3, 16, 17, 18, 19, },
362 { 4, 5, 6, 7, 20, 21, 22, 23, },
363 { 8, 9, 10, 11, 24, 25, 26, 27, },
364 { 12, 13, 14, 15, 28, 29, 30, 31, },
365 { 32, 33, 34, 35, 48, 49, 50, 51, },
366 { 36, 37, 38, 39, 52, 53, 54, 55, },
367 { 40, 41, 42, 43, 56, 57, 58, 59, },
368 { 44, 45, 46, 47, 60, 61, 62, 63, },
369 };
370
371 static const uint8_t diag_scan2x2_x[4] = {
372 0, 0, 1, 1,
373 };
374
375 static const uint8_t diag_scan2x2_y[4] = {
376 0, 1, 0, 1,
377 };
378
379 static const uint8_t diag_scan2x2_inv[2][2] = {
380 { 0, 2, },
381 { 1, 3, },
382 };
383
384 static const uint8_t diag_scan4x4_inv[4][4] = {
385 { 0, 2, 5, 9, },
386 { 1, 4, 8, 12, },
387 { 3, 7, 11, 14, },
388 { 6, 10, 13, 15, },
389 };
390
391 static const uint8_t diag_scan8x8_inv[8][8] = {
392 { 0, 2, 5, 9, 14, 20, 27, 35, },
393 { 1, 4, 8, 13, 19, 26, 34, 42, },
394 { 3, 7, 12, 18, 25, 33, 41, 48, },
395 { 6, 11, 17, 24, 32, 40, 47, 53, },
396 { 10, 16, 23, 31, 39, 46, 52, 57, },
397 { 15, 22, 30, 38, 45, 51, 56, 60, },
398 { 21, 29, 37, 44, 50, 55, 59, 62, },
399 { 28, 36, 43, 49, 54, 58, 61, 63, },
400 };
401
402 1416753 void ff_hevc_save_states(HEVCLocalContext *lc, const HEVCPPS *pps,
403 int ctb_addr_ts)
404 {
405 1416753 const HEVCSPS *const sps = pps->sps;
406
2/2
✓ Branch 0 taken 103324 times.
✓ Branch 1 taken 1313429 times.
1416753 if (pps->entropy_coding_sync_enabled_flag &&
407
2/2
✓ Branch 0 taken 98474 times.
✓ Branch 1 taken 4850 times.
103324 (ctb_addr_ts % sps->ctb_width == 2 ||
408
2/2
✓ Branch 0 taken 784 times.
✓ Branch 1 taken 97690 times.
98474 (sps->ctb_width == 2 &&
409
2/2
✓ Branch 0 taken 392 times.
✓ Branch 1 taken 392 times.
784 ctb_addr_ts % sps->ctb_width == 0))) {
410 5242 memcpy(lc->common_cabac_state->state, lc->cabac_state, HEVC_CONTEXTS);
411
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 5194 times.
5242 if (sps->persistent_rice_adaptation_enabled) {
412 48 memcpy(lc->common_cabac_state->stat_coeff, lc->stat_coeff, HEVC_STAT_COEFFS);
413 }
414 }
415 1416753 }
416
417 4207 static void load_states(HEVCLocalContext *lc, const HEVCSPS *sps)
418 {
419 4207 memcpy(lc->cabac_state, lc->common_cabac_state->state, HEVC_CONTEXTS);
420
2/2
✓ Branch 0 taken 44 times.
✓ Branch 1 taken 4163 times.
4207 if (sps->persistent_rice_adaptation_enabled) {
421 44 memcpy(lc->stat_coeff, lc->common_cabac_state->stat_coeff, HEVC_STAT_COEFFS);
422 }
423 4207 }
424
425 7872 static int cabac_reinit(HEVCLocalContext *lc)
426 {
427
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7872 times.
7872 return skip_bytes(&lc->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
428 }
429
430 24812 static void cabac_init_state(HEVCLocalContext *lc, const HEVCContext *s)
431 {
432 24812 int init_type = 2 - s->sh.slice_type;
433 int i;
434
435
4/4
✓ Branch 0 taken 6489 times.
✓ Branch 1 taken 18323 times.
✓ Branch 2 taken 6346 times.
✓ Branch 3 taken 143 times.
24812 if (s->sh.cabac_init_flag && s->sh.slice_type != HEVC_SLICE_I)
436 6346 init_type ^= 3;
437
438
2/2
✓ Branch 0 taken 4937588 times.
✓ Branch 1 taken 24812 times.
4962400 for (i = 0; i < HEVC_CONTEXTS; i++) {
439 4937588 int init_value = init_values[init_type][i];
440 4937588 int m = (init_value >> 4) * 5 - 45;
441 4937588 int n = ((init_value & 15) << 3) - 16;
442 4937588 int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
443
444 4937588 pre ^= pre >> 31;
445
2/2
✓ Branch 0 taken 506910 times.
✓ Branch 1 taken 4430678 times.
4937588 if (pre > 124)
446 506910 pre = 124 + (pre & 1);
447 4937588 lc->cabac_state[i] = pre;
448 }
449
450
2/2
✓ Branch 0 taken 99248 times.
✓ Branch 1 taken 24812 times.
124060 for (i = 0; i < 4; i++)
451 99248 lc->stat_coeff[i] = 0;
452 24812 }
453
454 1416754 int ff_hevc_cabac_init(HEVCLocalContext *lc, const HEVCPPS *pps,
455 int ctb_addr_ts, const uint8_t *data, size_t size,
456 int is_wpp)
457 {
458 1416754 const HEVCContext *const s = lc->parent;
459 1416754 const HEVCSPS *const sps = pps->sps;
460
461
2/2
✓ Branch 0 taken 27531 times.
✓ Branch 1 taken 1389223 times.
1416754 if (ctb_addr_ts == pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) {
462 27531 int ret = ff_init_cabac_decoder(&lc->cc, data, size);
463
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27531 times.
27531 if (ret < 0)
464 return ret;
465
2/2
✓ Branch 0 taken 7947 times.
✓ Branch 1 taken 19584 times.
27531 if (s->sh.dependent_slice_segment_flag == 0 ||
466
2/2
✓ Branch 0 taken 876 times.
✓ Branch 1 taken 7071 times.
7947 (pps->tiles_enabled_flag &&
467
2/2
✓ Branch 0 taken 309 times.
✓ Branch 1 taken 567 times.
876 pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]))
468 19893 cabac_init_state(lc, s);
469
470
2/2
✓ Branch 0 taken 17992 times.
✓ Branch 1 taken 9539 times.
27531 if (!s->sh.first_slice_in_pic_flag &&
471
2/2
✓ Branch 0 taken 3853 times.
✓ Branch 1 taken 14139 times.
17992 pps->entropy_coding_sync_enabled_flag) {
472
2/2
✓ Branch 0 taken 1636 times.
✓ Branch 1 taken 2217 times.
3853 if (ctb_addr_ts % sps->ctb_width == 0) {
473
2/2
✓ Branch 0 taken 92 times.
✓ Branch 1 taken 1544 times.
1636 if (sps->ctb_width == 1)
474 92 cabac_init_state(lc, s);
475
2/2
✓ Branch 0 taken 1162 times.
✓ Branch 1 taken 382 times.
1544 else if (s->sh.dependent_slice_segment_flag == 1)
476 1162 load_states(lc, sps);
477 }
478 }
479 } else {
480
2/2
✓ Branch 0 taken 287199 times.
✓ Branch 1 taken 1102024 times.
1389223 if (pps->tiles_enabled_flag &&
481
2/2
✓ Branch 0 taken 4625 times.
✓ Branch 1 taken 282574 times.
287199 pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]) {
482 int ret;
483
1/2
✓ Branch 0 taken 4625 times.
✗ Branch 1 not taken.
4625 if (!is_wpp)
484 4625 ret = cabac_reinit(lc);
485 else {
486 ret = ff_init_cabac_decoder(&lc->cc, data, size);
487 }
488
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4625 times.
4625 if (ret < 0)
489 return ret;
490 4625 cabac_init_state(lc, s);
491 }
492
2/2
✓ Branch 0 taken 98720 times.
✓ Branch 1 taken 1290503 times.
1389223 if (pps->entropy_coding_sync_enabled_flag) {
493
2/2
✓ Branch 0 taken 3247 times.
✓ Branch 1 taken 95473 times.
98720 if (ctb_addr_ts % sps->ctb_width == 0) {
494 int ret;
495 3247 get_cabac_terminate(&lc->cc);
496
1/2
✓ Branch 0 taken 3247 times.
✗ Branch 1 not taken.
3247 if (!is_wpp)
497 3247 ret = cabac_reinit(lc);
498 else {
499 ret = ff_init_cabac_decoder(&lc->cc, data, size);
500 }
501
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3247 times.
3247 if (ret < 0)
502 return ret;
503
504
2/2
✓ Branch 0 taken 202 times.
✓ Branch 1 taken 3045 times.
3247 if (sps->ctb_width == 1)
505 202 cabac_init_state(lc, s);
506 else
507 3045 load_states(lc, sps);
508 }
509 }
510 }
511 1416754 return 0;
512 }
513
514 #define GET_CABAC(ctx) get_cabac(&lc->cc, &lc->cabac_state[ctx])
515
516 820969 int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc)
517 {
518 820969 return GET_CABAC(SAO_MERGE_FLAG_OFFSET);
519 }
520
521 378861 int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc)
522 {
523
2/2
✓ Branch 1 taken 215985 times.
✓ Branch 2 taken 162876 times.
378861 if (!GET_CABAC(SAO_TYPE_IDX_OFFSET))
524 215985 return 0;
525
526
2/2
✓ Branch 1 taken 53993 times.
✓ Branch 2 taken 108883 times.
162876 if (!get_cabac_bypass(&lc->cc))
527 53993 return SAO_BAND;
528 108883 return SAO_EDGE;
529 }
530
531 77975 int ff_hevc_sao_band_position_decode(HEVCLocalContext *lc)
532 {
533 int i;
534 77975 int value = get_cabac_bypass(&lc->cc);
535
536
2/2
✓ Branch 0 taken 311900 times.
✓ Branch 1 taken 77975 times.
389875 for (i = 0; i < 4; i++)
537 311900 value = (value << 1) | get_cabac_bypass(&lc->cc);
538 77975 return value;
539 }
540
541 871500 int ff_hevc_sao_offset_abs_decode(HEVCLocalContext *lc, int bit_depth)
542 {
543 871500 int i = 0;
544 871500 int length = (1 << (FFMIN(bit_depth, 10) - 5)) - 1;
545
546
4/4
✓ Branch 0 taken 2462255 times.
✓ Branch 1 taken 127355 times.
✓ Branch 3 taken 1718110 times.
✓ Branch 4 taken 744145 times.
2589610 while (i < length && get_cabac_bypass(&lc->cc))
547 1718110 i++;
548 871500 return i;
549 }
550
551 243189 int ff_hevc_sao_offset_sign_decode(HEVCLocalContext *lc)
552 {
553 243189 return get_cabac_bypass(&lc->cc);
554 }
555
556 108883 int ff_hevc_sao_eo_class_decode(HEVCLocalContext *lc)
557 {
558 108883 int ret = get_cabac_bypass(&lc->cc) << 1;
559 108883 ret |= get_cabac_bypass(&lc->cc);
560 108883 return ret;
561 }
562
563 1416753 int ff_hevc_end_of_slice_flag_decode(HEVCLocalContext *lc)
564 {
565 1416753 return get_cabac_terminate(&lc->cc);
566 }
567
568 200139 int ff_hevc_cu_transquant_bypass_flag_decode(HEVCLocalContext *lc)
569 {
570 200139 return GET_CABAC(CU_TRANSQUANT_BYPASS_FLAG_OFFSET);
571 }
572
573 8096509 int ff_hevc_skip_flag_decode(HEVCLocalContext *lc, int x0, int y0,
574 int x_cb, int y_cb, int min_cb_width)
575 {
576 8096509 const HEVCContext *const s = lc->parent;
577 8096509 int inc = 0;
578
579
4/4
✓ Branch 0 taken 737136 times.
✓ Branch 1 taken 7359373 times.
✓ Branch 2 taken 532268 times.
✓ Branch 3 taken 204868 times.
8096509 if (lc->ctb_left_flag || x0)
580 7891641 inc = !!SAMPLE_CTB(s->skip_flag, x_cb - 1, y_cb);
581
4/4
✓ Branch 0 taken 1679892 times.
✓ Branch 1 taken 6416617 times.
✓ Branch 2 taken 1222492 times.
✓ Branch 3 taken 457400 times.
8096509 if (lc->ctb_up_flag || y0)
582 7639109 inc += !!SAMPLE_CTB(s->skip_flag, x_cb, y_cb - 1);
583
584 8096509 return GET_CABAC(SKIP_FLAG_OFFSET + inc);
585 }
586
587 610611 int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc)
588 {
589 610611 int prefix_val = 0;
590 610611 int suffix_val = 0;
591 610611 int inc = 0;
592
593
4/4
✓ Branch 0 taken 1484612 times.
✓ Branch 1 taken 106178 times.
✓ Branch 3 taken 980179 times.
✓ Branch 4 taken 504433 times.
1590790 while (prefix_val < 5 && GET_CABAC(CU_QP_DELTA_OFFSET + inc)) {
594 980179 prefix_val++;
595 980179 inc = 1;
596 }
597
2/2
✓ Branch 0 taken 106178 times.
✓ Branch 1 taken 504433 times.
610611 if (prefix_val >= 5) {
598 106178 int k = 0;
599
3/4
✓ Branch 0 taken 360430 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 254252 times.
✓ Branch 4 taken 106178 times.
360430 while (k < 7 && get_cabac_bypass(&lc->cc)) {
600 254252 suffix_val += 1 << k;
601 254252 k++;
602 }
603
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 106178 times.
106178 if (k == 7) {
604 av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
605 return AVERROR_INVALIDDATA;
606 }
607
608
2/2
✓ Branch 0 taken 254252 times.
✓ Branch 1 taken 106178 times.
360430 while (k--)
609 254252 suffix_val += get_cabac_bypass(&lc->cc) << k;
610 }
611 610611 return prefix_val + suffix_val;
612 }
613
614 370940 int ff_hevc_cu_qp_delta_sign_flag(HEVCLocalContext *lc)
615 {
616 370940 return get_cabac_bypass(&lc->cc);
617 }
618
619 266275 int ff_hevc_cu_chroma_qp_offset_flag(HEVCLocalContext *lc)
620 {
621 266275 return GET_CABAC(CU_CHROMA_QP_OFFSET_FLAG_OFFSET);
622 }
623
624 int ff_hevc_cu_chroma_qp_offset_idx(HEVCLocalContext *lc, int chroma_qp_offset_list_len_minus1)
625 {
626 int c_max= FFMAX(5, chroma_qp_offset_list_len_minus1);
627 int i = 0;
628
629 while (i < c_max && GET_CABAC(CU_CHROMA_QP_OFFSET_IDX_OFFSET))
630 i++;
631
632 return i;
633 }
634
635 4199938 int ff_hevc_pred_mode_decode(HEVCLocalContext *lc)
636 {
637 4199938 return GET_CABAC(PRED_MODE_FLAG_OFFSET);
638 }
639
640 7493754 int ff_hevc_split_coding_unit_flag_decode(HEVCLocalContext *lc, const HEVCSPS *sps,
641 int ct_depth, int x0, int y0)
642 {
643 7493754 const HEVCContext *const s = lc->parent;
644 7493754 int inc = 0, depth_left = 0, depth_top = 0;
645 7493754 int x0b = av_zero_extend(x0, sps->log2_ctb_size);
646 7493754 int y0b = av_zero_extend(y0, sps->log2_ctb_size);
647 7493754 int x_cb = x0 >> sps->log2_min_cb_size;
648 7493754 int y_cb = y0 >> sps->log2_min_cb_size;
649
650
4/4
✓ Branch 0 taken 695350 times.
✓ Branch 1 taken 6798404 times.
✓ Branch 2 taken 396998 times.
✓ Branch 3 taken 298352 times.
7493754 if (lc->ctb_left_flag || x0b)
651 7195402 depth_left = s->tab_ct_depth[(y_cb) * sps->min_cb_width + x_cb - 1];
652
4/4
✓ Branch 0 taken 1492642 times.
✓ Branch 1 taken 6001112 times.
✓ Branch 2 taken 840204 times.
✓ Branch 3 taken 652438 times.
7493754 if (lc->ctb_up_flag || y0b)
653 6841316 depth_top = s->tab_ct_depth[(y_cb - 1) * sps->min_cb_width + x_cb];
654
655 7493754 inc += (depth_left > ct_depth);
656 7493754 inc += (depth_top > ct_depth);
657
658 7493754 return GET_CABAC(SPLIT_CODING_UNIT_FLAG_OFFSET + inc);
659 }
660
661 6172953 int ff_hevc_part_mode_decode(HEVCLocalContext *lc, const HEVCSPS *sps, int log2_cb_size)
662 {
663
2/2
✓ Branch 1 taken 3596966 times.
✓ Branch 2 taken 2575987 times.
6172953 if (GET_CABAC(PART_MODE_OFFSET)) // 1
664 3596966 return PART_2Nx2N;
665
2/2
✓ Branch 0 taken 1945357 times.
✓ Branch 1 taken 630630 times.
2575987 if (log2_cb_size == sps->log2_min_cb_size) {
666
2/2
✓ Branch 0 taken 1196167 times.
✓ Branch 1 taken 749190 times.
1945357 if (lc->cu.pred_mode == MODE_INTRA) // 0
667 1196167 return PART_NxN;
668
2/2
✓ Branch 1 taken 308106 times.
✓ Branch 2 taken 441084 times.
749190 if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01
669 308106 return PART_2NxN;
670
2/2
✓ Branch 0 taken 223043 times.
✓ Branch 1 taken 218041 times.
441084 if (log2_cb_size == 3) // 00
671 223043 return PART_Nx2N;
672
2/2
✓ Branch 1 taken 112405 times.
✓ Branch 2 taken 105636 times.
218041 if (GET_CABAC(PART_MODE_OFFSET + 2)) // 001
673 112405 return PART_Nx2N;
674 105636 return PART_NxN; // 000
675 }
676
677
2/2
✓ Branch 0 taken 65275 times.
✓ Branch 1 taken 565355 times.
630630 if (!sps->amp_enabled) {
678
2/2
✓ Branch 1 taken 29519 times.
✓ Branch 2 taken 35756 times.
65275 if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01
679 29519 return PART_2NxN;
680 35756 return PART_Nx2N;
681 }
682
683
2/2
✓ Branch 1 taken 227440 times.
✓ Branch 2 taken 337915 times.
565355 if (GET_CABAC(PART_MODE_OFFSET + 1)) { // 01X, 01XX
684
2/2
✓ Branch 1 taken 108440 times.
✓ Branch 2 taken 119000 times.
227440 if (GET_CABAC(PART_MODE_OFFSET + 3)) // 011
685 108440 return PART_2NxN;
686
2/2
✓ Branch 1 taken 55217 times.
✓ Branch 2 taken 63783 times.
119000 if (get_cabac_bypass(&lc->cc)) // 0101
687 55217 return PART_2NxnD;
688 63783 return PART_2NxnU; // 0100
689 }
690
691
2/2
✓ Branch 1 taken 164578 times.
✓ Branch 2 taken 173337 times.
337915 if (GET_CABAC(PART_MODE_OFFSET + 3)) // 001
692 164578 return PART_Nx2N;
693
2/2
✓ Branch 1 taken 80100 times.
✓ Branch 2 taken 93237 times.
173337 if (get_cabac_bypass(&lc->cc)) // 0001
694 80100 return PART_nRx2N;
695 93237 return PART_nLx2N; // 0000
696 }
697
698 153183 int ff_hevc_pcm_flag_decode(HEVCLocalContext *lc)
699 {
700 153183 return get_cabac_terminate(&lc->cc);
701 }
702
703 7553313 int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCLocalContext *lc)
704 {
705 7553313 return GET_CABAC(PREV_INTRA_LUMA_PRED_FLAG_OFFSET);
706 }
707
708 4529012 int ff_hevc_mpm_idx_decode(HEVCLocalContext *lc)
709 {
710 4529012 int i = 0;
711
4/4
✓ Branch 0 taken 6746367 times.
✓ Branch 1 taken 940414 times.
✓ Branch 3 taken 3157769 times.
✓ Branch 4 taken 3588598 times.
7686781 while (i < 2 && get_cabac_bypass(&lc->cc))
712 3157769 i++;
713 4529012 return i;
714 }
715
716 3024301 int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCLocalContext *lc)
717 {
718 int i;
719 3024301 int value = get_cabac_bypass(&lc->cc);
720
721
2/2
✓ Branch 0 taken 12097204 times.
✓ Branch 1 taken 3024301 times.
15121505 for (i = 0; i < 4; i++)
722 12097204 value = (value << 1) | get_cabac_bypass(&lc->cc);
723 3024301 return value;
724 }
725
726 4066173 int ff_hevc_intra_chroma_pred_mode_decode(HEVCLocalContext *lc)
727 {
728 int ret;
729
2/2
✓ Branch 1 taken 3035134 times.
✓ Branch 2 taken 1031039 times.
4066173 if (!GET_CABAC(INTRA_CHROMA_PRED_MODE_OFFSET))
730 3035134 return 4;
731
732 1031039 ret = get_cabac_bypass(&lc->cc) << 1;
733 1031039 ret |= get_cabac_bypass(&lc->cc);
734 1031039 return ret;
735 }
736
737 6155447 int ff_hevc_merge_idx_decode(HEVCLocalContext *lc)
738 {
739 6155447 int i = GET_CABAC(MERGE_IDX_OFFSET);
740
741
2/2
✓ Branch 0 taken 2509604 times.
✓ Branch 1 taken 3645843 times.
6155447 if (i != 0) {
742
4/4
✓ Branch 0 taken 3862454 times.
✓ Branch 1 taken 298398 times.
✓ Branch 3 taken 1651248 times.
✓ Branch 4 taken 2211206 times.
4160852 while (i < lc->parent->sh.max_num_merge_cand-1 && get_cabac_bypass(&lc->cc))
743 1651248 i++;
744 }
745 6155447 return i;
746 }
747
748 4719496 int ff_hevc_merge_flag_decode(HEVCLocalContext *lc)
749 {
750 4719496 return GET_CABAC(MERGE_FLAG_OFFSET);
751 }
752
753 1811994 int ff_hevc_inter_pred_idc_decode(HEVCLocalContext *lc, int nPbW, int nPbH)
754 {
755
2/2
✓ Branch 0 taken 239847 times.
✓ Branch 1 taken 1572147 times.
1811994 if (nPbW + nPbH == 12)
756 239847 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
757
2/2
✓ Branch 1 taken 404211 times.
✓ Branch 2 taken 1167936 times.
1572147 if (GET_CABAC(INTER_PRED_IDC_OFFSET + lc->ct_depth))
758 404211 return PRED_BI;
759
760 1167936 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
761 }
762
763 2787978 int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx)
764 {
765 2787978 int i = 0;
766 2787978 int max = num_ref_idx_lx - 1;
767 2787978 int max_ctx = FFMIN(max, 2);
768
769
4/4
✓ Branch 0 taken 2779159 times.
✓ Branch 1 taken 951087 times.
✓ Branch 3 taken 942268 times.
✓ Branch 4 taken 1836891 times.
3730246 while (i < max_ctx && GET_CABAC(REF_IDX_L0_OFFSET + i))
770 942268 i++;
771
2/2
✓ Branch 0 taken 195870 times.
✓ Branch 1 taken 2592108 times.
2787978 if (i == 2) {
772
4/4
✓ Branch 0 taken 160433 times.
✓ Branch 1 taken 120846 times.
✓ Branch 3 taken 85409 times.
✓ Branch 4 taken 75024 times.
281279 while (i < max && get_cabac_bypass(&lc->cc))
773 85409 i++;
774 }
775
776 2787978 return i;
777 }
778
779 2787978 int ff_hevc_mvp_lx_flag_decode(HEVCLocalContext *lc)
780 {
781 2787978 return GET_CABAC(MVP_LX_FLAG_OFFSET);
782 }
783
784 2352150 int ff_hevc_no_residual_syntax_flag_decode(HEVCLocalContext *lc)
785 {
786 2352150 return GET_CABAC(NO_RESIDUAL_DATA_FLAG_OFFSET);
787 }
788
789 5260368 static av_always_inline int abs_mvd_greater0_flag_decode(HEVCLocalContext *lc)
790 {
791 5260368 return GET_CABAC(ABS_MVD_GREATER0_FLAG_OFFSET);
792 }
793
794 3599471 static av_always_inline int abs_mvd_greater1_flag_decode(HEVCLocalContext *lc)
795 {
796 3599471 return GET_CABAC(ABS_MVD_GREATER1_FLAG_OFFSET + 1);
797 }
798
799 2584248 static av_always_inline int mvd_decode(HEVCLocalContext *lc)
800 {
801 2584248 int ret = 2;
802 2584248 int k = 1;
803
804
3/4
✓ Branch 0 taken 6330546 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 3746298 times.
✓ Branch 4 taken 2584248 times.
6330546 while (k < CABAC_MAX_BIN && get_cabac_bypass(&lc->cc)) {
805 3746298 ret += 1U << k;
806 3746298 k++;
807 }
808
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2584248 times.
2584248 if (k == CABAC_MAX_BIN) {
809 av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
810 return 0;
811 }
812
2/2
✓ Branch 0 taken 6330546 times.
✓ Branch 1 taken 2584248 times.
8914794 while (k--)
813 6330546 ret += get_cabac_bypass(&lc->cc) << k;
814 2584248 return get_cabac_bypass_sign(&lc->cc, -ret);
815 }
816
817 1015223 static av_always_inline int mvd_sign_flag_decode(HEVCLocalContext *lc)
818 {
819 1015223 return get_cabac_bypass_sign(&lc->cc, -1);
820 }
821
822 6857733 int ff_hevc_split_transform_flag_decode(HEVCLocalContext *lc, int log2_trafo_size)
823 {
824 6857733 return GET_CABAC(SPLIT_TRANSFORM_FLAG_OFFSET + 5 - log2_trafo_size);
825 }
826
827 15125517 int ff_hevc_cbf_cb_cr_decode(HEVCLocalContext *lc, int trafo_depth)
828 {
829 15125517 return GET_CABAC(CBF_CB_CR_OFFSET + trafo_depth);
830 }
831
832 14621562 int ff_hevc_cbf_luma_decode(HEVCLocalContext *lc, int trafo_depth)
833 {
834
2/2
✓ Branch 0 taken 2657710 times.
✓ Branch 1 taken 11963852 times.
14621562 return GET_CABAC(CBF_LUMA_OFFSET + !trafo_depth);
835 }
836
837 6512501 static int hevc_transform_skip_flag_decode(HEVCLocalContext *lc, int c_idx)
838 {
839
2/2
✓ Branch 0 taken 2223957 times.
✓ Branch 1 taken 4288544 times.
6512501 return GET_CABAC(TRANSFORM_SKIP_FLAG_OFFSET + !!c_idx);
840 }
841
842 35234 static int explicit_rdpcm_flag_decode(HEVCLocalContext *lc, int c_idx)
843 {
844
2/2
✓ Branch 0 taken 29253 times.
✓ Branch 1 taken 5981 times.
35234 return GET_CABAC(EXPLICIT_RDPCM_FLAG_OFFSET + !!c_idx);
845 }
846
847 3090 static int explicit_rdpcm_dir_flag_decode(HEVCLocalContext *lc, int c_idx)
848 {
849
2/2
✓ Branch 0 taken 1813 times.
✓ Branch 1 taken 1277 times.
3090 return GET_CABAC(EXPLICIT_RDPCM_DIR_FLAG_OFFSET + !!c_idx);
850 }
851
852 384850 int ff_hevc_log2_res_scale_abs(HEVCLocalContext *lc, int idx)
853 {
854 384850 int i =0;
855
856
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(LOG2_RES_SCALE_ABS_OFFSET + 4 * idx + i))
857 837742 i++;
858
859 384850 return i;
860 }
861
862 235843 int ff_hevc_res_scale_sign_flag(HEVCLocalContext *lc, int idx)
863 {
864 235843 return GET_CABAC(RES_SCALE_SIGN_FLAG_OFFSET + idx);
865 }
866
867 14158080 static av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCLocalContext *lc, int c_idx,
868 int log2_size, int *last_scx_prefix, int *last_scy_prefix)
869 {
870 14158080 int i = 0;
871 14158080 int max = (log2_size << 1) - 1;
872 int ctx_offset, ctx_shift;
873
874
2/2
✓ Branch 0 taken 9702819 times.
✓ Branch 1 taken 4455261 times.
14158080 if (!c_idx) {
875 9702819 ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2);
876 9702819 ctx_shift = (log2_size + 1) >> 2;
877 } else {
878 4455261 ctx_offset = 15;
879 4455261 ctx_shift = log2_size - 2;
880 }
881
4/4
✓ Branch 0 taken 34650910 times.
✓ Branch 1 taken 2102214 times.
✓ Branch 2 taken 22595044 times.
✓ Branch 3 taken 12055866 times.
71404034 while (i < max &&
882 34650910 GET_CABAC(LAST_SIGNIFICANT_COEFF_X_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
883 22595044 i++;
884 14158080 *last_scx_prefix = i;
885
886 14158080 i = 0;
887
4/4
✓ Branch 0 taken 30046497 times.
✓ Branch 1 taken 1646162 times.
✓ Branch 2 taken 17534579 times.
✓ Branch 3 taken 12511918 times.
61739156 while (i < max &&
888 30046497 GET_CABAC(LAST_SIGNIFICANT_COEFF_Y_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
889 17534579 i++;
890 14158080 *last_scy_prefix = i;
891 14158080 }
892
893 3080436 static av_always_inline int last_significant_coeff_suffix_decode(HEVCLocalContext *lc,
894 int last_significant_coeff_prefix)
895 {
896 int i;
897 3080436 int length = (last_significant_coeff_prefix >> 1) - 1;
898 3080436 int value = get_cabac_bypass(&lc->cc);
899
900
2/2
✓ Branch 0 taken 862326 times.
✓ Branch 1 taken 3080436 times.
3942762 for (i = 1; i < length; i++)
901 862326 value = (value << 1) | get_cabac_bypass(&lc->cc);
902 3080436 return value;
903 }
904
905 8266932 static av_always_inline int significant_coeff_group_flag_decode(HEVCLocalContext *lc, int c_idx, int ctx_cg)
906 {
907 int inc;
908
909
2/2
✓ Branch 0 taken 1337467 times.
✓ Branch 1 taken 6929465 times.
8266932 inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
910
911 8266932 return GET_CABAC(SIGNIFICANT_COEFF_GROUP_FLAG_OFFSET + inc);
912 }
913 169436022 static av_always_inline int significant_coeff_flag_decode(HEVCLocalContext *lc, int x_c, int y_c,
914 int offset, const uint8_t *ctx_idx_map)
915 {
916 169436022 int inc = ctx_idx_map[(y_c << 2) + x_c] + offset;
917 169436022 return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + inc);
918 }
919
920 18406302 static av_always_inline int significant_coeff_flag_decode_0(HEVCLocalContext *lc, int c_idx, int offset)
921 {
922 18406302 return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + offset);
923 }
924
925 90504892 static av_always_inline int coeff_abs_level_greater1_flag_decode(HEVCLocalContext *lc, int c_idx, int inc)
926 {
927
928
2/2
✓ Branch 0 taken 21338770 times.
✓ Branch 1 taken 69166122 times.
90504892 if (c_idx > 0)
929 21338770 inc += 16;
930
931 90504892 return GET_CABAC(COEFF_ABS_LEVEL_GREATER1_FLAG_OFFSET + inc);
932 }
933
934 10076620 static av_always_inline int coeff_abs_level_greater2_flag_decode(HEVCLocalContext *lc, int c_idx, int inc)
935 {
936
2/2
✓ Branch 0 taken 2131576 times.
✓ Branch 1 taken 7945044 times.
10076620 if (c_idx > 0)
937 2131576 inc += 4;
938
939 10076620 return GET_CABAC(COEFF_ABS_LEVEL_GREATER2_FLAG_OFFSET + inc);
940 }
941
942 40729586 static av_always_inline int coeff_abs_level_remaining_decode(HEVCLocalContext *lc, int rc_rice_param)
943 {
944 40729586 int prefix = 0;
945 40729586 int suffix = 0;
946 int last_coeff_abs_level_remaining;
947 int i;
948
949
3/4
✓ Branch 0 taken 89390883 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 48661297 times.
✓ Branch 4 taken 40729586 times.
89390883 while (prefix < CABAC_MAX_BIN && get_cabac_bypass(&lc->cc))
950 48661297 prefix++;
951
952
2/2
✓ Branch 0 taken 34793893 times.
✓ Branch 1 taken 5935693 times.
40729586 if (prefix < 3) {
953
2/2
✓ Branch 0 taken 36996181 times.
✓ Branch 1 taken 34793893 times.
71790074 for (i = 0; i < rc_rice_param; i++)
954 36996181 suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
955 34793893 last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix;
956 } else {
957 5935693 int prefix_minus3 = prefix - 3;
958
959
2/4
✓ Branch 0 taken 5935693 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5935693 times.
5935693 if (prefix == CABAC_MAX_BIN || prefix_minus3 + rc_rice_param > 16 + 6) {
960 av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix);
961 return 0;
962 }
963
964
2/2
✓ Branch 0 taken 19441574 times.
✓ Branch 1 taken 5935693 times.
25377267 for (i = 0; i < prefix_minus3 + rc_rice_param; i++)
965 19441574 suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
966 5935693 last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
967 5935693 << rc_rice_param) + suffix;
968 }
969 40729586 return last_coeff_abs_level_remaining;
970 }
971
972 21591973 static av_always_inline int coeff_sign_flag_decode(HEVCLocalContext *lc, uint8_t nb)
973 {
974 int i;
975 21591973 int ret = 0;
976
977
2/2
✓ Branch 0 taken 97473602 times.
✓ Branch 1 taken 21591973 times.
119065575 for (i = 0; i < nb; i++)
978 97473602 ret = (ret << 1) | get_cabac_bypass(&lc->cc);
979 21591973 return ret;
980 }
981
982 14158080 void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, const HEVCPPS *pps,
983 int x0, int y0,
984 int log2_trafo_size, enum ScanType scan_idx,
985 int c_idx)
986 {
987 #define GET_COORD(offset, n) \
988 do { \
989 x_c = (x_cg << 2) + scan_x_off[n]; \
990 y_c = (y_cg << 2) + scan_y_off[n]; \
991 } while (0)
992 14158080 const HEVCContext *const s = lc->parent;
993 14158080 const HEVCSPS *const sps = pps->sps;
994 14158080 int transform_skip_flag = 0;
995
996 int last_significant_coeff_x, last_significant_coeff_y;
997 int last_scan_pos;
998 int n_end;
999 14158080 int num_coeff = 0;
1000 14158080 int greater1_ctx = 1;
1001
1002 int num_last_subset;
1003 int x_cg_last_sig, y_cg_last_sig;
1004
1005 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1006
1007 14158080 ptrdiff_t stride = s->cur_frame->f->linesize[c_idx];
1008 14158080 int hshift = sps->hshift[c_idx];
1009 14158080 int vshift = sps->vshift[c_idx];
1010 14158080 uint8_t *dst = &s->cur_frame->f->data[c_idx][(y0 >> vshift) * stride +
1011 14158080 ((x0 >> hshift) << sps->pixel_shift)];
1012
2/2
✓ Branch 0 taken 4455261 times.
✓ Branch 1 taken 9702819 times.
14158080 int16_t *coeffs = (int16_t*)(c_idx ? lc->edge_emu_buffer2 : lc->edge_emu_buffer);
1013 14158080 uint8_t significant_coeff_group_flag[8][8] = {{0}};
1014 14158080 int explicit_rdpcm_flag = 0;
1015 int explicit_rdpcm_dir_flag;
1016
1017 14158080 int trafo_size = 1 << log2_trafo_size;
1018 int i;
1019 int qp,shift,add,scale,scale_m;
1020 static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
1021 14158080 const uint8_t *scale_matrix = NULL;
1022 uint8_t dc_scale;
1023
2/2
✓ Branch 0 taken 9702819 times.
✓ Branch 1 taken 4455261 times.
14158080 int pred_mode_intra = (c_idx == 0) ? lc->tu.intra_pred_mode :
1024 lc->tu.intra_pred_mode_c;
1025
1026 14158080 memset(coeffs, 0, trafo_size * trafo_size * sizeof(int16_t));
1027
1028 // Derive QP for dequant
1029
2/2
✓ Branch 0 taken 13719714 times.
✓ Branch 1 taken 438366 times.
14158080 if (!lc->cu.cu_transquant_bypass_flag) {
1030 static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1031 static const uint8_t rem6[51 + 4 * 6 + 1] = {
1032 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1033 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1034 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1035 4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1036 };
1037
1038 static const uint8_t div6[51 + 4 * 6 + 1] = {
1039 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
1040 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
1041 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1042 10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1043 };
1044 13719714 int qp_y = lc->qp_y;
1045
1046
2/2
✓ Branch 0 taken 11264680 times.
✓ Branch 1 taken 2455034 times.
13719714 if (pps->transform_skip_enabled_flag &&
1047
2/2
✓ Branch 0 taken 6512501 times.
✓ Branch 1 taken 4752179 times.
11264680 log2_trafo_size <= pps->log2_max_transform_skip_block_size) {
1048 6512501 transform_skip_flag = hevc_transform_skip_flag_decode(lc, c_idx);
1049 }
1050
1051
2/2
✓ Branch 0 taken 9427571 times.
✓ Branch 1 taken 4292143 times.
13719714 if (c_idx == 0) {
1052 9427571 qp = qp_y + sps->qp_bd_offset;
1053 } else {
1054 int qp_i, offset;
1055
1056
2/2
✓ Branch 0 taken 2048812 times.
✓ Branch 1 taken 2243331 times.
4292143 if (c_idx == 1)
1057 2048812 offset = pps->cb_qp_offset + s->sh.slice_cb_qp_offset +
1058 2048812 lc->tu.cu_qp_offset_cb;
1059 else
1060 2243331 offset = pps->cr_qp_offset + s->sh.slice_cr_qp_offset +
1061 2243331 lc->tu.cu_qp_offset_cr;
1062
1063 4292143 qp_i = av_clip(qp_y + offset, - sps->qp_bd_offset, 57);
1064
2/2
✓ Branch 0 taken 2426038 times.
✓ Branch 1 taken 1866105 times.
4292143 if (sps->chroma_format_idc == 1) {
1065
2/2
✓ Branch 0 taken 741847 times.
✓ Branch 1 taken 1684191 times.
2426038 if (qp_i < 30)
1066 741847 qp = qp_i;
1067
2/2
✓ Branch 0 taken 9279 times.
✓ Branch 1 taken 1674912 times.
1684191 else if (qp_i > 43)
1068 9279 qp = qp_i - 6;
1069 else
1070 1674912 qp = qp_c[qp_i - 30];
1071 } else {
1072
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1866105 times.
1866105 if (qp_i > 51)
1073 qp = 51;
1074 else
1075 1866105 qp = qp_i;
1076 }
1077
1078 4292143 qp += sps->qp_bd_offset;
1079 }
1080
1081 13719714 shift = sps->bit_depth + log2_trafo_size - 5;
1082 13719714 add = 1 << (shift-1);
1083 13719714 scale = level_scale[rem6[qp]] << (div6[qp]);
1084 13719714 scale_m = 16; // default when no custom scaling lists.
1085 13719714 dc_scale = 16;
1086
1087
6/6
✓ Branch 0 taken 484014 times.
✓ Branch 1 taken 13235700 times.
✓ Branch 2 taken 26526 times.
✓ Branch 3 taken 457488 times.
✓ Branch 4 taken 14292 times.
✓ Branch 5 taken 12234 times.
13719714 if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1088 943560 const ScalingList *sl = pps->scaling_list_data_present_flag ?
1089
2/2
✓ Branch 0 taken 357638 times.
✓ Branch 1 taken 114142 times.
471780 &pps->scaling_list : &sps->scaling_list;
1090 471780 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
1091
1092 471780 matrix_id = 3 * matrix_id + c_idx;
1093
1094 471780 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
1095
2/2
✓ Branch 0 taken 42637 times.
✓ Branch 1 taken 429143 times.
471780 if (log2_trafo_size >= 4)
1096 42637 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
1097 }
1098 } else {
1099 438366 shift = 0;
1100 438366 add = 0;
1101 438366 scale = 0;
1102 438366 dc_scale = 0;
1103 }
1104
1105
6/6
✓ Branch 0 taken 4621031 times.
✓ Branch 1 taken 9537049 times.
✓ Branch 2 taken 225511 times.
✓ Branch 3 taken 4395520 times.
✓ Branch 4 taken 190277 times.
✓ Branch 5 taken 35234 times.
14158080 if (lc->cu.pred_mode == MODE_INTER && sps->explicit_rdpcm_enabled &&
1106
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 190277 times.
190277 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1107 35234 explicit_rdpcm_flag = explicit_rdpcm_flag_decode(lc, c_idx);
1108
2/2
✓ Branch 0 taken 3090 times.
✓ Branch 1 taken 32144 times.
35234 if (explicit_rdpcm_flag) {
1109 3090 explicit_rdpcm_dir_flag = explicit_rdpcm_dir_flag_decode(lc, c_idx);
1110 }
1111 }
1112
1113 14158080 last_significant_coeff_xy_prefix_decode(lc, c_idx, log2_trafo_size,
1114 &last_significant_coeff_x, &last_significant_coeff_y);
1115
1116
2/2
✓ Branch 0 taken 1801996 times.
✓ Branch 1 taken 12356084 times.
14158080 if (last_significant_coeff_x > 3) {
1117 1801996 int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_x);
1118 1801996 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1119 1801996 (2 + (last_significant_coeff_x & 1)) +
1120 suffix;
1121 }
1122
1123
2/2
✓ Branch 0 taken 1278440 times.
✓ Branch 1 taken 12879640 times.
14158080 if (last_significant_coeff_y > 3) {
1124 1278440 int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_y);
1125 1278440 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1126 1278440 (2 + (last_significant_coeff_y & 1)) +
1127 suffix;
1128 }
1129
1130
2/2
✓ Branch 0 taken 1818015 times.
✓ Branch 1 taken 12340065 times.
14158080 if (scan_idx == SCAN_VERT)
1131 1818015 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1132
1133 14158080 x_cg_last_sig = last_significant_coeff_x >> 2;
1134 14158080 y_cg_last_sig = last_significant_coeff_y >> 2;
1135
1136
3/3
✓ Branch 0 taken 10307678 times.
✓ Branch 1 taken 2032387 times.
✓ Branch 2 taken 1818015 times.
14158080 switch (scan_idx) {
1137 10307678 case SCAN_DIAG: {
1138 10307678 int last_x_c = last_significant_coeff_x & 3;
1139 10307678 int last_y_c = last_significant_coeff_y & 3;
1140
1141 10307678 scan_x_off = ff_hevc_diag_scan4x4_x;
1142 10307678 scan_y_off = ff_hevc_diag_scan4x4_y;
1143 10307678 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1144
2/2
✓ Branch 0 taken 5251865 times.
✓ Branch 1 taken 5055813 times.
10307678 if (trafo_size == 4) {
1145 5251865 scan_x_cg = scan_1x1;
1146 5251865 scan_y_cg = scan_1x1;
1147
2/2
✓ Branch 0 taken 2777485 times.
✓ Branch 1 taken 2278328 times.
5055813 } else if (trafo_size == 8) {
1148 2777485 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1149 2777485 scan_x_cg = diag_scan2x2_x;
1150 2777485 scan_y_cg = diag_scan2x2_y;
1151
2/2
✓ Branch 0 taken 1688970 times.
✓ Branch 1 taken 589358 times.
2278328 } else if (trafo_size == 16) {
1152 1688970 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1153 1688970 scan_x_cg = ff_hevc_diag_scan4x4_x;
1154 1688970 scan_y_cg = ff_hevc_diag_scan4x4_y;
1155 } else { // trafo_size == 32
1156 589358 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1157 589358 scan_x_cg = ff_hevc_diag_scan8x8_x;
1158 589358 scan_y_cg = ff_hevc_diag_scan8x8_y;
1159 }
1160 10307678 break;
1161 }
1162 2032387 case SCAN_HORIZ:
1163 2032387 scan_x_cg = horiz_scan2x2_x;
1164 2032387 scan_y_cg = horiz_scan2x2_y;
1165 2032387 scan_x_off = horiz_scan4x4_x;
1166 2032387 scan_y_off = horiz_scan4x4_y;
1167 2032387 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1168 2032387 break;
1169 1818015 default: //SCAN_VERT
1170 1818015 scan_x_cg = horiz_scan2x2_y;
1171 1818015 scan_y_cg = horiz_scan2x2_x;
1172 1818015 scan_x_off = horiz_scan4x4_y;
1173 1818015 scan_y_off = horiz_scan4x4_x;
1174 1818015 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1175 1818015 break;
1176 }
1177 14158080 num_coeff++;
1178 14158080 num_last_subset = (num_coeff - 1) >> 4;
1179
1180
2/2
✓ Branch 0 taken 24794578 times.
✓ Branch 1 taken 14158080 times.
38952658 for (i = num_last_subset; i >= 0; i--) {
1181 int n, m;
1182 int x_cg, y_cg, x_c, y_c, pos;
1183 24794578 int implicit_non_zero_coeff = 0;
1184 int64_t trans_coeff_level;
1185 24794578 int prev_sig = 0;
1186 24794578 int offset = i << 4;
1187 24794578 int rice_init = 0;
1188
1189 uint8_t significant_coeff_flag_idx[16];
1190 24794578 uint8_t nb_significant_coeff_flag = 0;
1191
1192 24794578 x_cg = scan_x_cg[i];
1193 24794578 y_cg = scan_y_cg[i];
1194
1195
4/4
✓ Branch 0 taken 10636498 times.
✓ Branch 1 taken 14158080 times.
✓ Branch 2 taken 8266932 times.
✓ Branch 3 taken 2369566 times.
24794578 if ((i < num_last_subset) && (i > 0)) {
1196 8266932 int ctx_cg = 0;
1197
2/2
✓ Branch 0 taken 7557462 times.
✓ Branch 1 taken 709470 times.
8266932 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1198 7557462 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1199
2/2
✓ Branch 0 taken 6974438 times.
✓ Branch 1 taken 1292494 times.
8266932 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1200 6974438 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1201
1202 8266932 significant_coeff_group_flag[x_cg][y_cg] =
1203 8266932 significant_coeff_group_flag_decode(lc, c_idx, ctx_cg);
1204 8266932 implicit_non_zero_coeff = 1;
1205 } else {
1206 16527646 significant_coeff_group_flag[x_cg][y_cg] =
1207
5/6
✓ Branch 0 taken 14832736 times.
✓ Branch 1 taken 1694910 times.
✓ Branch 2 taken 674656 times.
✓ Branch 3 taken 14158080 times.
✓ Branch 4 taken 2369566 times.
✗ Branch 5 not taken.
18897212 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1208
1/2
✓ Branch 0 taken 2369566 times.
✗ Branch 1 not taken.
2369566 (x_cg == 0 && y_cg == 0));
1209 }
1210
1211 24794578 last_scan_pos = num_coeff - offset - 1;
1212
1213
2/2
✓ Branch 0 taken 14158080 times.
✓ Branch 1 taken 10636498 times.
24794578 if (i == num_last_subset) {
1214 14158080 n_end = last_scan_pos - 1;
1215 14158080 significant_coeff_flag_idx[0] = last_scan_pos;
1216 14158080 nb_significant_coeff_flag = 1;
1217 } else {
1218 10636498 n_end = 15;
1219 }
1220
1221
2/2
✓ Branch 0 taken 14871917 times.
✓ Branch 1 taken 9922661 times.
24794578 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1222 14871917 prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1223
2/2
✓ Branch 0 taken 14445535 times.
✓ Branch 1 taken 10349043 times.
24794578 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1224
2/2
✓ Branch 0 taken 5138707 times.
✓ Branch 1 taken 9306828 times.
14445535 prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1225
1226
4/4
✓ Branch 0 taken 21677590 times.
✓ Branch 1 taken 3116988 times.
✓ Branch 2 taken 18476845 times.
✓ Branch 3 taken 3200745 times.
24794578 if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1227 static const uint8_t ctx_idx_map[] = {
1228 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8, // log2_trafo_size == 2
1229 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0
1230 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 1
1231 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, // prev_sig == 2
1232 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 // default
1233 };
1234 const uint8_t *ctx_idx_map_p;
1235 18476845 int scf_offset = 0;
1236
4/4
✓ Branch 0 taken 1017071 times.
✓ Branch 1 taken 17459774 times.
✓ Branch 2 taken 886760 times.
✓ Branch 3 taken 130311 times.
18476845 if (sps->transform_skip_context_enabled &&
1237
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 886760 times.
886760 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1238 130311 ctx_idx_map_p = &ctx_idx_map[4 * 16];
1239
2/2
✓ Branch 0 taken 61311 times.
✓ Branch 1 taken 69000 times.
130311 if (c_idx == 0) {
1240 61311 scf_offset = 40;
1241 } else {
1242 69000 scf_offset = 14 + 27;
1243 }
1244 } else {
1245
2/2
✓ Branch 0 taken 4407423 times.
✓ Branch 1 taken 13939111 times.
18346534 if (c_idx != 0)
1246 4407423 scf_offset = 27;
1247
2/2
✓ Branch 0 taken 6344491 times.
✓ Branch 1 taken 12002043 times.
18346534 if (log2_trafo_size == 2) {
1248 6344491 ctx_idx_map_p = &ctx_idx_map[0];
1249 } else {
1250 12002043 ctx_idx_map_p = &ctx_idx_map[(prev_sig + 1) << 4];
1251
2/2
✓ Branch 0 taken 9614538 times.
✓ Branch 1 taken 2387505 times.
12002043 if (c_idx == 0) {
1252
4/4
✓ Branch 0 taken 5805516 times.
✓ Branch 1 taken 3809022 times.
✓ Branch 2 taken 2015811 times.
✓ Branch 3 taken 3789705 times.
9614538 if ((x_cg > 0 || y_cg > 0))
1253 5824833 scf_offset += 3;
1254
2/2
✓ Branch 0 taken 3605569 times.
✓ Branch 1 taken 6008969 times.
9614538 if (log2_trafo_size == 3) {
1255
2/2
✓ Branch 0 taken 2502784 times.
✓ Branch 1 taken 1102785 times.
3605569 scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15;
1256 } else {
1257 6008969 scf_offset += 21;
1258 }
1259 } else {
1260
2/2
✓ Branch 0 taken 1135172 times.
✓ Branch 1 taken 1252333 times.
2387505 if (log2_trafo_size == 3)
1261 1135172 scf_offset += 9;
1262 else
1263 1252333 scf_offset += 12;
1264 }
1265 }
1266 }
1267
2/2
✓ Branch 0 taken 169436022 times.
✓ Branch 1 taken 18476845 times.
187912867 for (n = n_end; n > 0; n--) {
1268 169436022 x_c = scan_x_off[n];
1269 169436022 y_c = scan_y_off[n];
1270
2/2
✓ Branch 1 taken 81665902 times.
✓ Branch 2 taken 87770120 times.
169436022 if (significant_coeff_flag_decode(lc, x_c, y_c, scf_offset, ctx_idx_map_p)) {
1271 81665902 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1272 81665902 nb_significant_coeff_flag++;
1273 81665902 implicit_non_zero_coeff = 0;
1274 }
1275 }
1276
2/2
✓ Branch 0 taken 18406302 times.
✓ Branch 1 taken 70543 times.
18476845 if (implicit_non_zero_coeff == 0) {
1277
4/4
✓ Branch 0 taken 1014653 times.
✓ Branch 1 taken 17391649 times.
✓ Branch 2 taken 884736 times.
✓ Branch 3 taken 129917 times.
18406302 if (sps->transform_skip_context_enabled &&
1278
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 884736 times.
884736 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1279
2/2
✓ Branch 0 taken 61056 times.
✓ Branch 1 taken 68861 times.
129917 if (c_idx == 0) {
1280 61056 scf_offset = 42;
1281 } else {
1282 68861 scf_offset = 16 + 27;
1283 }
1284 } else {
1285
2/2
✓ Branch 0 taken 11201296 times.
✓ Branch 1 taken 7075089 times.
18276385 if (i == 0) {
1286
2/2
✓ Branch 0 taken 8114278 times.
✓ Branch 1 taken 3087018 times.
11201296 if (c_idx == 0)
1287 8114278 scf_offset = 0;
1288 else
1289 3087018 scf_offset = 27;
1290 } else {
1291 7075089 scf_offset = 2 + scf_offset;
1292 }
1293 }
1294
2/2
✓ Branch 1 taken 12409691 times.
✓ Branch 2 taken 5996611 times.
18406302 if (significant_coeff_flag_decode_0(lc, c_idx, scf_offset) == 1) {
1295 12409691 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1296 12409691 nb_significant_coeff_flag++;
1297 }
1298 } else {
1299 70543 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1300 70543 nb_significant_coeff_flag++;
1301 }
1302 }
1303
1304 24794578 n_end = nb_significant_coeff_flag;
1305
1306
1307
2/2
✓ Branch 0 taken 21591973 times.
✓ Branch 1 taken 3202605 times.
24794578 if (n_end) {
1308 int first_nz_pos_in_cg;
1309 int last_nz_pos_in_cg;
1310 21591973 int c_rice_param = 0;
1311 21591973 int first_greater1_coeff_idx = -1;
1312 uint8_t coeff_abs_level_greater1_flag[8];
1313 uint16_t coeff_sign_flag;
1314 21591973 int sum_abs = 0;
1315 int sign_hidden;
1316 int sb_type;
1317
1318
1319 // initialize first elem of coeff_bas_level_greater1_flag
1320
4/4
✓ Branch 0 taken 7519510 times.
✓ Branch 1 taken 14072463 times.
✓ Branch 2 taken 6109354 times.
✓ Branch 3 taken 1410156 times.
21591973 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1321
1322
2/2
✓ Branch 0 taken 1166629 times.
✓ Branch 1 taken 20425344 times.
21591973 if (sps->persistent_rice_adaptation_enabled) {
1323
3/4
✓ Branch 0 taken 1047040 times.
✓ Branch 1 taken 119589 times.
✓ Branch 2 taken 1047040 times.
✗ Branch 3 not taken.
1166629 if (!transform_skip_flag && !lc->cu.cu_transquant_bypass_flag)
1324
2/2
✓ Branch 0 taken 365016 times.
✓ Branch 1 taken 682024 times.
1047040 sb_type = 2 * (c_idx == 0 ? 1 : 0);
1325 else
1326
2/2
✓ Branch 0 taken 56576 times.
✓ Branch 1 taken 63013 times.
119589 sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1327 1166629 c_rice_param = lc->stat_coeff[sb_type] / 4;
1328 }
1329
1330
4/4
✓ Branch 0 taken 7433893 times.
✓ Branch 1 taken 14158080 times.
✓ Branch 2 taken 3314759 times.
✓ Branch 3 taken 4119134 times.
21591973 if (!(i == num_last_subset) && greater1_ctx == 0)
1331 3314759 ctx_set++;
1332 21591973 greater1_ctx = 1;
1333 21591973 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1334
1335
2/2
✓ Branch 0 taken 90504892 times.
✓ Branch 1 taken 21591973 times.
112096865 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1336 90504892 int inc = (ctx_set << 2) + greater1_ctx;
1337 90504892 coeff_abs_level_greater1_flag[m] =
1338 90504892 coeff_abs_level_greater1_flag_decode(lc, c_idx, inc);
1339
2/2
✓ Branch 0 taken 29812959 times.
✓ Branch 1 taken 60691933 times.
90504892 if (coeff_abs_level_greater1_flag[m]) {
1340 29812959 greater1_ctx = 0;
1341
2/2
✓ Branch 0 taken 10076620 times.
✓ Branch 1 taken 19736339 times.
29812959 if (first_greater1_coeff_idx == -1)
1342 10076620 first_greater1_coeff_idx = m;
1343
4/4
✓ Branch 0 taken 48127510 times.
✓ Branch 1 taken 12564423 times.
✓ Branch 2 taken 29644147 times.
✓ Branch 3 taken 18483363 times.
60691933 } else if (greater1_ctx > 0 && greater1_ctx < 3) {
1344 29644147 greater1_ctx++;
1345 }
1346 }
1347 21591973 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1348
1349
2/2
✓ Branch 0 taken 20888486 times.
✓ Branch 1 taken 703487 times.
21591973 if (lc->cu.cu_transquant_bypass_flag ||
1350
2/2
✓ Branch 0 taken 13482164 times.
✓ Branch 1 taken 7406322 times.
20888486 (lc->cu.pred_mode == MODE_INTRA &&
1351
6/6
✓ Branch 0 taken 902776 times.
✓ Branch 1 taken 12579388 times.
✓ Branch 2 taken 92431 times.
✓ Branch 3 taken 810345 times.
✓ Branch 4 taken 47376 times.
✓ Branch 5 taken 45055 times.
13482164 sps->implicit_rdpcm_enabled && transform_skip_flag &&
1352
4/4
✓ Branch 0 taken 28377 times.
✓ Branch 1 taken 18999 times.
✓ Branch 2 taken 5999 times.
✓ Branch 3 taken 20818433 times.
20843431 (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1353 explicit_rdpcm_flag)
1354 773540 sign_hidden = 0;
1355 else
1356 20818433 sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1357
1358
2/2
✓ Branch 0 taken 10076620 times.
✓ Branch 1 taken 11515353 times.
21591973 if (first_greater1_coeff_idx != -1) {
1359 10076620 coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += coeff_abs_level_greater2_flag_decode(lc, c_idx, ctx_set);
1360 }
1361
4/4
✓ Branch 0 taken 19236298 times.
✓ Branch 1 taken 2355675 times.
✓ Branch 2 taken 8405684 times.
✓ Branch 3 taken 10830614 times.
21591973 if (!pps->sign_data_hiding_flag || !sign_hidden ) {
1362 10761359 coeff_sign_flag = coeff_sign_flag_decode(lc, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1363 } else {
1364 10830614 coeff_sign_flag = coeff_sign_flag_decode(lc, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1365 }
1366
1367
2/2
✓ Branch 0 taken 108304216 times.
✓ Branch 1 taken 21591973 times.
129896189 for (m = 0; m < n_end; m++) {
1368 108304216 n = significant_coeff_flag_idx[m];
1369 108304216 GET_COORD(offset, n);
1370
2/2
✓ Branch 0 taken 90504892 times.
✓ Branch 1 taken 17799324 times.
108304216 if (m < 8) {
1371 90504892 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1372
4/4
✓ Branch 0 taken 10076620 times.
✓ Branch 1 taken 80428272 times.
✓ Branch 2 taken 22930262 times.
✓ Branch 3 taken 67574630 times.
90504892 if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1373 22930262 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1374
1375 22930262 trans_coeff_level += last_coeff_abs_level_remaining;
1376
2/2
✓ Branch 0 taken 5956345 times.
✓ Branch 1 taken 16973917 times.
22930262 if (trans_coeff_level > (3 << c_rice_param))
1377
2/2
✓ Branch 0 taken 197734 times.
✓ Branch 1 taken 5758611 times.
5956345 c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1378
4/4
✓ Branch 0 taken 1114125 times.
✓ Branch 1 taken 21816137 times.
✓ Branch 2 taken 315677 times.
✓ Branch 3 taken 798448 times.
22930262 if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1379 315677 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1380
2/2
✓ Branch 0 taken 37785 times.
✓ Branch 1 taken 277892 times.
315677 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1381 37785 lc->stat_coeff[sb_type]++;
1382
2/2
✓ Branch 0 taken 157067 times.
✓ Branch 1 taken 120825 times.
277892 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1383
2/2
✓ Branch 0 taken 37744 times.
✓ Branch 1 taken 119323 times.
157067 if (lc->stat_coeff[sb_type] > 0)
1384 37744 lc->stat_coeff[sb_type]--;
1385 315677 rice_init = 1;
1386 }
1387 }
1388 } else {
1389 17799324 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1390
1391 17799324 trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1392
2/2
✓ Branch 0 taken 2223724 times.
✓ Branch 1 taken 15575600 times.
17799324 if (trans_coeff_level > (3 << c_rice_param))
1393
2/2
✓ Branch 0 taken 89299 times.
✓ Branch 1 taken 2134425 times.
2223724 c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1394
4/4
✓ Branch 0 taken 938151 times.
✓ Branch 1 taken 16861173 times.
✓ Branch 2 taken 36551 times.
✓ Branch 3 taken 901600 times.
17799324 if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1395 36551 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1396
2/2
✓ Branch 0 taken 1344 times.
✓ Branch 1 taken 35207 times.
36551 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1397 1344 lc->stat_coeff[sb_type]++;
1398
2/2
✓ Branch 0 taken 24604 times.
✓ Branch 1 taken 10603 times.
35207 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1399
2/2
✓ Branch 0 taken 1307 times.
✓ Branch 1 taken 23297 times.
24604 if (lc->stat_coeff[sb_type] > 0)
1400 1307 lc->stat_coeff[sb_type]--;
1401 36551 rice_init = 1;
1402 }
1403 }
1404
4/4
✓ Branch 0 taken 100414607 times.
✓ Branch 1 taken 7889609 times.
✓ Branch 2 taken 78385944 times.
✓ Branch 3 taken 22028663 times.
108304216 if (pps->sign_data_hiding_flag && sign_hidden) {
1405 78385944 sum_abs += trans_coeff_level;
1406
4/4
✓ Branch 0 taken 10830614 times.
✓ Branch 1 taken 67555330 times.
✓ Branch 2 taken 5407661 times.
✓ Branch 3 taken 5422953 times.
78385944 if (n == first_nz_pos_in_cg && (sum_abs&1))
1407 5407661 trans_coeff_level = -trans_coeff_level;
1408 }
1409
2/2
✓ Branch 0 taken 49243936 times.
✓ Branch 1 taken 59060280 times.
108304216 if (coeff_sign_flag >> 15)
1410 49243936 trans_coeff_level = -trans_coeff_level;
1411 108304216 coeff_sign_flag <<= 1;
1412
2/2
✓ Branch 0 taken 99619830 times.
✓ Branch 1 taken 8684386 times.
108304216 if(!lc->cu.cu_transquant_bypass_flag) {
1413
6/6
✓ Branch 0 taken 2778647 times.
✓ Branch 1 taken 96841183 times.
✓ Branch 2 taken 190401 times.
✓ Branch 3 taken 2588246 times.
✓ Branch 4 taken 30375 times.
✓ Branch 5 taken 160026 times.
99619830 if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1414
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) {
1415
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) {
1416 650713 case 3: pos = (y_c << 3) + x_c; break;
1417 814838 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1418 298445 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1419 823368 default: pos = (y_c << 2) + x_c; break;
1420 }
1421 2587364 scale_m = scale_matrix[pos];
1422 } else {
1423 31257 scale_m = dc_scale;
1424 }
1425 }
1426 99619830 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1427
2/2
✓ Branch 0 taken 50280779 times.
✓ Branch 1 taken 49339051 times.
99619830 if(trans_coeff_level < 0) {
1428
2/2
✓ Branch 0 taken 162681 times.
✓ Branch 1 taken 50118098 times.
50280779 if((~trans_coeff_level) & 0xFffffffffff8000)
1429 162681 trans_coeff_level = -32768;
1430 } else {
1431
2/2
✓ Branch 0 taken 162295 times.
✓ Branch 1 taken 49176756 times.
49339051 if(trans_coeff_level & 0xffffffffffff8000)
1432 162295 trans_coeff_level = 32767;
1433 }
1434 }
1435 108304216 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1436 }
1437 }
1438 }
1439
1440
2/2
✓ Branch 0 taken 438366 times.
✓ Branch 1 taken 13719714 times.
14158080 if (lc->cu.cu_transquant_bypass_flag) {
1441
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 || (sps->implicit_rdpcm_enabled &&
1442 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1443 int mode = sps->implicit_rdpcm_enabled ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1444
1445 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1446 }
1447 } else {
1448
2/2
✓ Branch 0 taken 432436 times.
✓ Branch 1 taken 13287278 times.
13719714 if (transform_skip_flag) {
1449
2/2
✓ Branch 0 taken 54609 times.
✓ Branch 1 taken 21520 times.
76129 int rot = sps->transform_skip_rotation_enabled &&
1450
2/2
✓ Branch 0 taken 76129 times.
✓ Branch 1 taken 356307 times.
508565 log2_trafo_size == 2 &&
1451
2/2
✓ Branch 0 taken 20826 times.
✓ Branch 1 taken 33783 times.
54609 lc->cu.pred_mode == MODE_INTRA;
1452
2/2
✓ Branch 0 taken 20826 times.
✓ Branch 1 taken 411610 times.
432436 if (rot) {
1453
2/2
✓ Branch 0 taken 166608 times.
✓ Branch 1 taken 20826 times.
187434 for (i = 0; i < 8; i++)
1454 166608 FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]);
1455 }
1456
1457 432436 s->hevcdsp.dequant(coeffs, log2_trafo_size);
1458
1459
4/4
✓ Branch 0 taken 429346 times.
✓ Branch 1 taken 3090 times.
✓ Branch 2 taken 73039 times.
✓ Branch 3 taken 356307 times.
432436 if (explicit_rdpcm_flag || (sps->implicit_rdpcm_enabled &&
1460
4/4
✓ Branch 0 taken 40895 times.
✓ Branch 1 taken 32144 times.
✓ Branch 2 taken 25185 times.
✓ Branch 3 taken 15710 times.
73039 lc->cu.pred_mode == MODE_INTRA &&
1461
2/2
✓ Branch 0 taken 8263 times.
✓ Branch 1 taken 16922 times.
25185 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1462
2/2
✓ Branch 0 taken 23973 times.
✓ Branch 1 taken 3090 times.
27063 int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26);
1463
1464 27063 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1465 }
1466
6/6
✓ Branch 0 taken 9033128 times.
✓ Branch 1 taken 4254150 times.
✓ Branch 2 taken 6103415 times.
✓ Branch 3 taken 2929713 times.
✓ Branch 4 taken 3577912 times.
✓ Branch 5 taken 2525503 times.
13287278 } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) {
1467 3577912 s->hevcdsp.transform_4x4_luma(coeffs);
1468 } else {
1469 9709366 int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1470
2/2
✓ Branch 0 taken 2180633 times.
✓ Branch 1 taken 7528733 times.
9709366 if (max_xy == 0)
1471 2180633 s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1472 else {
1473 7528733 int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1474
2/2
✓ Branch 0 taken 5214707 times.
✓ Branch 1 taken 2314026 times.
7528733 if (max_xy < 4)
1475 5214707 col_limit = FFMIN(4, col_limit);
1476
2/2
✓ Branch 0 taken 1728411 times.
✓ Branch 1 taken 585615 times.
2314026 else if (max_xy < 8)
1477 1728411 col_limit = FFMIN(8, col_limit);
1478
2/2
✓ Branch 0 taken 250833 times.
✓ Branch 1 taken 334782 times.
585615 else if (max_xy < 12)
1479 250833 col_limit = FFMIN(24, col_limit);
1480 7528733 s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1481 }
1482 }
1483 }
1484
2/2
✓ Branch 0 taken 269268 times.
✓ Branch 1 taken 13888812 times.
14158080 if (lc->tu.cross_pf) {
1485 269268 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1486
1487
2/2
✓ Branch 0 taken 20252880 times.
✓ Branch 1 taken 269268 times.
20522148 for (i = 0; i < (trafo_size * trafo_size); i++) {
1488 20252880 coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1489 }
1490 }
1491 14158080 s->hevcdsp.add_residual[log2_trafo_size-2](dst, coeffs, stride);
1492 14158080 }
1493
1494 2630184 void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size)
1495 {
1496 2630184 int x = abs_mvd_greater0_flag_decode(lc);
1497 2630184 int y = abs_mvd_greater0_flag_decode(lc);
1498
1499
2/2
✓ Branch 0 taken 1835999 times.
✓ Branch 1 taken 794185 times.
2630184 if (x)
1500 1835999 x += abs_mvd_greater1_flag_decode(lc);
1501
2/2
✓ Branch 0 taken 1763472 times.
✓ Branch 1 taken 866712 times.
2630184 if (y)
1502 1763472 y += abs_mvd_greater1_flag_decode(lc);
1503
1504
3/4
✓ Branch 0 taken 1333785 times.
✓ Branch 1 taken 502214 times.
✓ Branch 2 taken 794185 times.
✗ Branch 3 not taken.
2630184 switch (x) {
1505 1333785 case 2: lc->pu.mvd.x = mvd_decode(lc); break;
1506 502214 case 1: lc->pu.mvd.x = mvd_sign_flag_decode(lc); break;
1507 794185 case 0: lc->pu.mvd.x = 0; break;
1508 }
1509
1510
3/4
✓ Branch 0 taken 1250463 times.
✓ Branch 1 taken 513009 times.
✓ Branch 2 taken 866712 times.
✗ Branch 3 not taken.
2630184 switch (y) {
1511 1250463 case 2: lc->pu.mvd.y = mvd_decode(lc); break;
1512 513009 case 1: lc->pu.mvd.y = mvd_sign_flag_decode(lc); break;
1513 866712 case 0: lc->pu.mvd.y = 0; break;
1514 }
1515 2630184 }
1516
1517