FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/hevc/cabac.c
Date: 2024-12-12 01:08:13
Exec Total Coverage
Lines: 638 659 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 1573719 void ff_hevc_save_states(HEVCLocalContext *lc, const HEVCPPS *pps,
403 int ctb_addr_ts)
404 {
405 1573719 const HEVCSPS *const sps = pps->sps;
406
2/2
✓ Branch 0 taken 153814 times.
✓ Branch 1 taken 1419905 times.
1573719 if (pps->entropy_coding_sync_enabled_flag &&
407
2/2
✓ Branch 0 taken 148029 times.
✓ Branch 1 taken 5785 times.
153814 (ctb_addr_ts % sps->ctb_width == 2 ||
408
2/2
✓ Branch 0 taken 784 times.
✓ Branch 1 taken 147245 times.
148029 (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 6177 memcpy(lc->common_cabac_state->state, lc->cabac_state, HEVC_CONTEXTS);
411
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 6129 times.
6177 if (sps->persistent_rice_adaptation_enabled) {
412 48 memcpy(lc->common_cabac_state->stat_coeff, lc->stat_coeff, HEVC_STAT_COEFFS);
413 }
414 }
415 1573719 }
416
417 5109 static void load_states(HEVCLocalContext *lc, const HEVCSPS *sps)
418 {
419 5109 memcpy(lc->cabac_state, lc->common_cabac_state->state, HEVC_CONTEXTS);
420
2/2
✓ Branch 0 taken 44 times.
✓ Branch 1 taken 5065 times.
5109 if (sps->persistent_rice_adaptation_enabled) {
421 44 memcpy(lc->stat_coeff, lc->common_cabac_state->stat_coeff, HEVC_STAT_COEFFS);
422 }
423 5109 }
424
425 8774 static int cabac_reinit(HEVCLocalContext *lc)
426 {
427
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8774 times.
8774 return skip_bytes(&lc->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
428 }
429
430 25446 static void cabac_init_state(HEVCLocalContext *lc, const HEVCContext *s)
431 {
432 25446 int init_type = 2 - s->sh.slice_type;
433 int i;
434
435
4/4
✓ Branch 0 taken 6603 times.
✓ Branch 1 taken 18843 times.
✓ Branch 2 taken 6459 times.
✓ Branch 3 taken 144 times.
25446 if (s->sh.cabac_init_flag && s->sh.slice_type != HEVC_SLICE_I)
436 6459 init_type ^= 3;
437
438
2/2
✓ Branch 0 taken 5063754 times.
✓ Branch 1 taken 25446 times.
5089200 for (i = 0; i < HEVC_CONTEXTS; i++) {
439 5063754 int init_value = init_values[init_type][i];
440 5063754 int m = (init_value >> 4) * 5 - 45;
441 5063754 int n = ((init_value & 15) << 3) - 16;
442 5063754 int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
443
444 5063754 pre ^= pre >> 31;
445
2/2
✓ Branch 0 taken 519955 times.
✓ Branch 1 taken 4543799 times.
5063754 if (pre > 124)
446 519955 pre = 124 + (pre & 1);
447 5063754 lc->cabac_state[i] = pre;
448 }
449
450
2/2
✓ Branch 0 taken 101784 times.
✓ Branch 1 taken 25446 times.
127230 for (i = 0; i < 4; i++)
451 101784 lc->stat_coeff[i] = 0;
452 25446 }
453
454 1573720 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 1573720 const HEVCContext *const s = lc->parent;
459 1573720 const HEVCSPS *const sps = pps->sps;
460
461
2/2
✓ Branch 0 taken 28165 times.
✓ Branch 1 taken 1545555 times.
1573720 if (ctb_addr_ts == pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) {
462 28165 int ret = ff_init_cabac_decoder(&lc->cc, data, size);
463
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28165 times.
28165 if (ret < 0)
464 return ret;
465
2/2
✓ Branch 0 taken 7947 times.
✓ Branch 1 taken 20218 times.
28165 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 20527 cabac_init_state(lc, s);
469
470
2/2
✓ Branch 0 taken 17994 times.
✓ Branch 1 taken 10171 times.
28165 if (!s->sh.first_slice_in_pic_flag &&
471
2/2
✓ Branch 0 taken 3853 times.
✓ Branch 1 taken 14141 times.
17994 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 289035 times.
✓ Branch 1 taken 1256520 times.
1545555 if (pps->tiles_enabled_flag &&
481
2/2
✓ Branch 0 taken 4625 times.
✓ Branch 1 taken 284410 times.
289035 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 149177 times.
✓ Branch 1 taken 1396378 times.
1545555 if (pps->entropy_coding_sync_enabled_flag) {
493
2/2
✓ Branch 0 taken 4149 times.
✓ Branch 1 taken 145028 times.
149177 if (ctb_addr_ts % sps->ctb_width == 0) {
494 int ret;
495 4149 get_cabac_terminate(&lc->cc);
496
1/2
✓ Branch 0 taken 4149 times.
✗ Branch 1 not taken.
4149 if (!is_wpp)
497 4149 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 4149 times.
4149 if (ret < 0)
502 return ret;
503
504
2/2
✓ Branch 0 taken 202 times.
✓ Branch 1 taken 3947 times.
4149 if (sps->ctb_width == 1)
505 202 cabac_init_state(lc, s);
506 else
507 3947 load_states(lc, sps);
508 }
509 }
510 }
511 1573720 return 0;
512 }
513
514 #define GET_CABAC(ctx) get_cabac(&lc->cc, &lc->cabac_state[ctx])
515
516 996815 int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc)
517 {
518 996815 return GET_CABAC(SAO_MERGE_FLAG_OFFSET);
519 }
520
521 497980 int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc)
522 {
523
2/2
✓ Branch 1 taken 327484 times.
✓ Branch 2 taken 170496 times.
497980 if (!GET_CABAC(SAO_TYPE_IDX_OFFSET))
524 327484 return 0;
525
526
2/2
✓ Branch 1 taken 54868 times.
✓ Branch 2 taken 115628 times.
170496 if (!get_cabac_bypass(&lc->cc))
527 54868 return SAO_BAND;
528 115628 return SAO_EDGE;
529 }
530
531 79308 int ff_hevc_sao_band_position_decode(HEVCLocalContext *lc)
532 {
533 int i;
534 79308 int value = get_cabac_bypass(&lc->cc);
535
536
2/2
✓ Branch 0 taken 317232 times.
✓ Branch 1 taken 79308 times.
396540 for (i = 0; i < 4; i++)
537 317232 value = (value << 1) | get_cabac_bypass(&lc->cc);
538 79308 return value;
539 }
540
541 909988 int ff_hevc_sao_offset_abs_decode(HEVCLocalContext *lc, int bit_depth)
542 {
543 909988 int i = 0;
544 909988 int length = (1 << (FFMIN(bit_depth, 10) - 5)) - 1;
545
546
4/4
✓ Branch 0 taken 2530864 times.
✓ Branch 1 taken 127523 times.
✓ Branch 3 taken 1748399 times.
✓ Branch 4 taken 782465 times.
2658387 while (i < length && get_cabac_bypass(&lc->cc))
547 1748399 i++;
548 909988 return i;
549 }
550
551 246136 int ff_hevc_sao_offset_sign_decode(HEVCLocalContext *lc)
552 {
553 246136 return get_cabac_bypass(&lc->cc);
554 }
555
556 115628 int ff_hevc_sao_eo_class_decode(HEVCLocalContext *lc)
557 {
558 115628 int ret = get_cabac_bypass(&lc->cc) << 1;
559 115628 ret |= get_cabac_bypass(&lc->cc);
560 115628 return ret;
561 }
562
563 1573719 int ff_hevc_end_of_slice_flag_decode(HEVCLocalContext *lc)
564 {
565 1573719 return get_cabac_terminate(&lc->cc);
566 }
567
568 211788 int ff_hevc_cu_transquant_bypass_flag_decode(HEVCLocalContext *lc)
569 {
570 211788 return GET_CABAC(CU_TRANSQUANT_BYPASS_FLAG_OFFSET);
571 }
572
573 8550547 int ff_hevc_skip_flag_decode(HEVCLocalContext *lc, uint8_t *skip_flag,
574 int x0, int y0, int x_cb, int y_cb, int min_cb_width)
575 {
576 8550547 int inc = 0;
577
578
4/4
✓ Branch 0 taken 765393 times.
✓ Branch 1 taken 7785154 times.
✓ Branch 2 taken 549562 times.
✓ Branch 3 taken 215831 times.
8550547 if (lc->ctb_left_flag || x0)
579 8334716 inc = !!SAMPLE_CTB(skip_flag, x_cb - 1, y_cb);
580
4/4
✓ Branch 0 taken 1694028 times.
✓ Branch 1 taken 6856519 times.
✓ Branch 2 taken 1226350 times.
✓ Branch 3 taken 467678 times.
8550547 if (lc->ctb_up_flag || y0)
581 8082869 inc += !!SAMPLE_CTB(skip_flag, x_cb, y_cb - 1);
582
583 8550547 return GET_CABAC(SKIP_FLAG_OFFSET + inc);
584 }
585
586 661320 int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc)
587 {
588 661320 int prefix_val = 0;
589 661320 int suffix_val = 0;
590 661320 int inc = 0;
591
592
4/4
✓ Branch 0 taken 1543902 times.
✓ Branch 1 taken 107422 times.
✓ Branch 3 taken 990004 times.
✓ Branch 4 taken 553898 times.
1651324 while (prefix_val < 5 && GET_CABAC(CU_QP_DELTA_OFFSET + inc)) {
593 990004 prefix_val++;
594 990004 inc = 1;
595 }
596
2/2
✓ Branch 0 taken 107422 times.
✓ Branch 1 taken 553898 times.
661320 if (prefix_val >= 5) {
597 107422 int k = 0;
598
3/4
✓ Branch 0 taken 364146 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 256724 times.
✓ Branch 4 taken 107422 times.
364146 while (k < 7 && get_cabac_bypass(&lc->cc)) {
599 256724 suffix_val += 1 << k;
600 256724 k++;
601 }
602
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 107422 times.
107422 if (k == 7) {
603 av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
604 return AVERROR_INVALIDDATA;
605 }
606
607
2/2
✓ Branch 0 taken 256724 times.
✓ Branch 1 taken 107422 times.
364146 while (k--)
608 256724 suffix_val += get_cabac_bypass(&lc->cc) << k;
609 }
610 661320 return prefix_val + suffix_val;
611 }
612
613 374341 int ff_hevc_cu_qp_delta_sign_flag(HEVCLocalContext *lc)
614 {
615 374341 return get_cabac_bypass(&lc->cc);
616 }
617
618 266275 int ff_hevc_cu_chroma_qp_offset_flag(HEVCLocalContext *lc)
619 {
620 266275 return GET_CABAC(CU_CHROMA_QP_OFFSET_FLAG_OFFSET);
621 }
622
623 int ff_hevc_cu_chroma_qp_offset_idx(HEVCLocalContext *lc, int chroma_qp_offset_list_len_minus1)
624 {
625 int c_max= FFMAX(5, chroma_qp_offset_list_len_minus1);
626 int i = 0;
627
628 while (i < c_max && GET_CABAC(CU_CHROMA_QP_OFFSET_IDX_OFFSET))
629 i++;
630
631 return i;
632 }
633
634 4468761 int ff_hevc_pred_mode_decode(HEVCLocalContext *lc)
635 {
636 4468761 return GET_CABAC(PRED_MODE_FLAG_OFFSET);
637 }
638
639 8075142 int ff_hevc_split_coding_unit_flag_decode(HEVCLocalContext *lc, uint8_t *tab_ct_depth,
640 const HEVCSPS *sps,
641 int ct_depth, int x0, int y0)
642 {
643 8075142 int inc = 0, depth_left = 0, depth_top = 0;
644 8075142 int x0b = av_zero_extend(x0, sps->log2_ctb_size);
645 8075142 int y0b = av_zero_extend(y0, sps->log2_ctb_size);
646 8075142 int x_cb = x0 >> sps->log2_min_cb_size;
647 8075142 int y_cb = y0 >> sps->log2_min_cb_size;
648
649
4/4
✓ Branch 0 taken 731758 times.
✓ Branch 1 taken 7343384 times.
✓ Branch 2 taken 415130 times.
✓ Branch 3 taken 316628 times.
8075142 if (lc->ctb_left_flag || x0b)
650 7758514 depth_left = tab_ct_depth[(y_cb) * sps->min_cb_width + x_cb - 1];
651
4/4
✓ Branch 0 taken 1510768 times.
✓ Branch 1 taken 6564374 times.
✓ Branch 2 taken 844658 times.
✓ Branch 3 taken 666110 times.
8075142 if (lc->ctb_up_flag || y0b)
652 7409032 depth_top = tab_ct_depth[(y_cb - 1) * sps->min_cb_width + x_cb];
653
654 8075142 inc += (depth_left > ct_depth);
655 8075142 inc += (depth_top > ct_depth);
656
657 8075142 return GET_CABAC(SPLIT_CODING_UNIT_FLAG_OFFSET + inc);
658 }
659
660 6528760 int ff_hevc_part_mode_decode(HEVCLocalContext *lc, const HEVCSPS *sps, int log2_cb_size)
661 {
662
2/2
✓ Branch 1 taken 3864600 times.
✓ Branch 2 taken 2664160 times.
6528760 if (GET_CABAC(PART_MODE_OFFSET)) // 1
663 3864600 return PART_2Nx2N;
664
2/2
✓ Branch 0 taken 1993092 times.
✓ Branch 1 taken 671068 times.
2664160 if (log2_cb_size == sps->log2_min_cb_size) {
665
2/2
✓ Branch 0 taken 1234050 times.
✓ Branch 1 taken 759042 times.
1993092 if (lc->cu.pred_mode == MODE_INTRA) // 0
666 1234050 return PART_NxN;
667
2/2
✓ Branch 1 taken 311810 times.
✓ Branch 2 taken 447232 times.
759042 if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01
668 311810 return PART_2NxN;
669
2/2
✓ Branch 0 taken 229191 times.
✓ Branch 1 taken 218041 times.
447232 if (log2_cb_size == 3) // 00
670 229191 return PART_Nx2N;
671
2/2
✓ Branch 1 taken 112405 times.
✓ Branch 2 taken 105636 times.
218041 if (GET_CABAC(PART_MODE_OFFSET + 2)) // 001
672 112405 return PART_Nx2N;
673 105636 return PART_NxN; // 000
674 }
675
676
2/2
✓ Branch 0 taken 68294 times.
✓ Branch 1 taken 602774 times.
671068 if (!sps->amp_enabled) {
677
2/2
✓ Branch 1 taken 29779 times.
✓ Branch 2 taken 38515 times.
68294 if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01
678 29779 return PART_2NxN;
679 38515 return PART_Nx2N;
680 }
681
682
2/2
✓ Branch 1 taken 240122 times.
✓ Branch 2 taken 362652 times.
602774 if (GET_CABAC(PART_MODE_OFFSET + 1)) { // 01X, 01XX
683
2/2
✓ Branch 1 taken 115229 times.
✓ Branch 2 taken 124893 times.
240122 if (GET_CABAC(PART_MODE_OFFSET + 3)) // 011
684 115229 return PART_2NxN;
685
2/2
✓ Branch 1 taken 57888 times.
✓ Branch 2 taken 67005 times.
124893 if (get_cabac_bypass(&lc->cc)) // 0101
686 57888 return PART_2NxnD;
687 67005 return PART_2NxnU; // 0100
688 }
689
690
2/2
✓ Branch 1 taken 177090 times.
✓ Branch 2 taken 185562 times.
362652 if (GET_CABAC(PART_MODE_OFFSET + 3)) // 001
691 177090 return PART_Nx2N;
692
2/2
✓ Branch 1 taken 85591 times.
✓ Branch 2 taken 99971 times.
185562 if (get_cabac_bypass(&lc->cc)) // 0001
693 85591 return PART_nRx2N;
694 99971 return PART_nLx2N; // 0000
695 }
696
697 153183 int ff_hevc_pcm_flag_decode(HEVCLocalContext *lc)
698 {
699 153183 return get_cabac_terminate(&lc->cc);
700 }
701
702 7937817 int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCLocalContext *lc)
703 {
704 7937817 return GET_CABAC(PREV_INTRA_LUMA_PRED_FLAG_OFFSET);
705 }
706
707 4775607 int ff_hevc_mpm_idx_decode(HEVCLocalContext *lc)
708 {
709 4775607 int i = 0;
710
4/4
✓ Branch 0 taken 7108735 times.
✓ Branch 1 taken 991926 times.
✓ Branch 3 taken 3325054 times.
✓ Branch 4 taken 3783681 times.
8100661 while (i < 2 && get_cabac_bypass(&lc->cc))
711 3325054 i++;
712 4775607 return i;
713 }
714
715 3162210 int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCLocalContext *lc)
716 {
717 int i;
718 3162210 int value = get_cabac_bypass(&lc->cc);
719
720
2/2
✓ Branch 0 taken 12648840 times.
✓ Branch 1 taken 3162210 times.
15811050 for (i = 0; i < 4; i++)
721 12648840 value = (value << 1) | get_cabac_bypass(&lc->cc);
722 3162210 return value;
723 }
724
725 4337028 int ff_hevc_intra_chroma_pred_mode_decode(HEVCLocalContext *lc)
726 {
727 int ret;
728
2/2
✓ Branch 1 taken 3264220 times.
✓ Branch 2 taken 1072808 times.
4337028 if (!GET_CABAC(INTRA_CHROMA_PRED_MODE_OFFSET))
729 3264220 return 4;
730
731 1072808 ret = get_cabac_bypass(&lc->cc) << 1;
732 1072808 ret |= get_cabac_bypass(&lc->cc);
733 1072808 return ret;
734 }
735
736 6480094 int ff_hevc_merge_idx_decode(HEVCLocalContext *lc)
737 {
738 6480094 int i = GET_CABAC(MERGE_IDX_OFFSET);
739
740
2/2
✓ Branch 0 taken 2616611 times.
✓ Branch 1 taken 3863483 times.
6480094 if (i != 0) {
741
4/4
✓ Branch 0 taken 4019663 times.
✓ Branch 1 taken 306450 times.
✓ Branch 3 taken 1709502 times.
✓ Branch 4 taken 2310161 times.
4326113 while (i < lc->parent->sh.max_num_merge_cand-1 && get_cabac_bypass(&lc->cc))
742 1709502 i++;
743 }
744 6480094 return i;
745 }
746
747 4973963 int ff_hevc_merge_flag_decode(HEVCLocalContext *lc)
748 {
749 4973963 return GET_CABAC(MERGE_FLAG_OFFSET);
750 }
751
752 1900740 int ff_hevc_inter_pred_idc_decode(HEVCLocalContext *lc, int nPbW, int nPbH)
753 {
754
2/2
✓ Branch 0 taken 248638 times.
✓ Branch 1 taken 1652102 times.
1900740 if (nPbW + nPbH == 12)
755 248638 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
756
2/2
✓ Branch 1 taken 422112 times.
✓ Branch 2 taken 1229990 times.
1652102 if (GET_CABAC(INTER_PRED_IDC_OFFSET + lc->ct_depth))
757 422112 return PRED_BI;
758
759 1229990 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
760 }
761
762 2920914 int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx)
763 {
764 2920914 int i = 0;
765 2920914 int max = num_ref_idx_lx - 1;
766 2920914 int max_ctx = FFMIN(max, 2);
767
768
4/4
✓ Branch 0 taken 2878178 times.
✓ Branch 1 taken 1018561 times.
✓ Branch 3 taken 975825 times.
✓ Branch 4 taken 1902353 times.
3896739 while (i < max_ctx && GET_CABAC(REF_IDX_L0_OFFSET + i))
769 975825 i++;
770
2/2
✓ Branch 0 taken 203411 times.
✓ Branch 1 taken 2717503 times.
2920914 if (i == 2) {
771
4/4
✓ Branch 0 taken 162576 times.
✓ Branch 1 taken 127432 times.
✓ Branch 3 taken 86597 times.
✓ Branch 4 taken 75979 times.
290008 while (i < max && get_cabac_bypass(&lc->cc))
772 86597 i++;
773 }
774
775 2920914 return i;
776 }
777
778 2920914 int ff_hevc_mvp_lx_flag_decode(HEVCLocalContext *lc)
779 {
780 2920914 return GET_CABAC(MVP_LX_FLAG_OFFSET);
781 }
782
783 2470705 int ff_hevc_no_residual_syntax_flag_decode(HEVCLocalContext *lc)
784 {
785 2470705 return GET_CABAC(NO_RESIDUAL_DATA_FLAG_OFFSET);
786 }
787
788 5516280 static av_always_inline int abs_mvd_greater0_flag_decode(HEVCLocalContext *lc)
789 {
790 5516280 return GET_CABAC(ABS_MVD_GREATER0_FLAG_OFFSET);
791 }
792
793 3785621 static av_always_inline int abs_mvd_greater1_flag_decode(HEVCLocalContext *lc)
794 {
795 3785621 return GET_CABAC(ABS_MVD_GREATER1_FLAG_OFFSET + 1);
796 }
797
798 2722135 static av_always_inline int mvd_decode(HEVCLocalContext *lc)
799 {
800 2722135 int ret = 2;
801 2722135 int k = 1;
802
803
3/4
✓ Branch 0 taken 6679842 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 3957707 times.
✓ Branch 4 taken 2722135 times.
6679842 while (k < CABAC_MAX_BIN && get_cabac_bypass(&lc->cc)) {
804 3957707 ret += 1U << k;
805 3957707 k++;
806 }
807
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2722135 times.
2722135 if (k == CABAC_MAX_BIN) {
808 av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
809 return 0;
810 }
811
2/2
✓ Branch 0 taken 6679842 times.
✓ Branch 1 taken 2722135 times.
9401977 while (k--)
812 6679842 ret += get_cabac_bypass(&lc->cc) << k;
813 2722135 return get_cabac_bypass_sign(&lc->cc, -ret);
814 }
815
816 1063486 static av_always_inline int mvd_sign_flag_decode(HEVCLocalContext *lc)
817 {
818 1063486 return get_cabac_bypass_sign(&lc->cc, -1);
819 }
820
821 7367421 int ff_hevc_split_transform_flag_decode(HEVCLocalContext *lc, int log2_trafo_size)
822 {
823 7367421 return GET_CABAC(SPLIT_TRANSFORM_FLAG_OFFSET + 5 - log2_trafo_size);
824 }
825
826 16067087 int ff_hevc_cbf_cb_cr_decode(HEVCLocalContext *lc, int trafo_depth)
827 {
828 16067087 return GET_CABAC(CBF_CB_CR_OFFSET + trafo_depth);
829 }
830
831 15292292 int ff_hevc_cbf_luma_decode(HEVCLocalContext *lc, int trafo_depth)
832 {
833
2/2
✓ Branch 0 taken 2897421 times.
✓ Branch 1 taken 12394871 times.
15292292 return GET_CABAC(CBF_LUMA_OFFSET + !trafo_depth);
834 }
835
836 6674321 static int hevc_transform_skip_flag_decode(HEVCLocalContext *lc, int c_idx)
837 {
838
2/2
✓ Branch 0 taken 2290758 times.
✓ Branch 1 taken 4383563 times.
6674321 return GET_CABAC(TRANSFORM_SKIP_FLAG_OFFSET + !!c_idx);
839 }
840
841 35234 static int explicit_rdpcm_flag_decode(HEVCLocalContext *lc, int c_idx)
842 {
843
2/2
✓ Branch 0 taken 29253 times.
✓ Branch 1 taken 5981 times.
35234 return GET_CABAC(EXPLICIT_RDPCM_FLAG_OFFSET + !!c_idx);
844 }
845
846 3090 static int explicit_rdpcm_dir_flag_decode(HEVCLocalContext *lc, int c_idx)
847 {
848
2/2
✓ Branch 0 taken 1813 times.
✓ Branch 1 taken 1277 times.
3090 return GET_CABAC(EXPLICIT_RDPCM_DIR_FLAG_OFFSET + !!c_idx);
849 }
850
851 384850 int ff_hevc_log2_res_scale_abs(HEVCLocalContext *lc, int idx)
852 {
853 384850 int i =0;
854
855
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))
856 837742 i++;
857
858 384850 return i;
859 }
860
861 235843 int ff_hevc_res_scale_sign_flag(HEVCLocalContext *lc, int idx)
862 {
863 235843 return GET_CABAC(RES_SCALE_SIGN_FLAG_OFFSET + idx);
864 }
865
866 14885588 static av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCLocalContext *lc, int c_idx,
867 int log2_size, int *last_scx_prefix, int *last_scy_prefix)
868 {
869 14885588 int i = 0;
870 14885588 int max = (log2_size << 1) - 1;
871 int ctx_offset, ctx_shift;
872
873
2/2
✓ Branch 0 taken 10222853 times.
✓ Branch 1 taken 4662735 times.
14885588 if (!c_idx) {
874 10222853 ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2);
875 10222853 ctx_shift = (log2_size + 1) >> 2;
876 } else {
877 4662735 ctx_offset = 15;
878 4662735 ctx_shift = log2_size - 2;
879 }
880
4/4
✓ Branch 0 taken 36142308 times.
✓ Branch 1 taken 2176839 times.
✓ Branch 2 taken 23433559 times.
✓ Branch 3 taken 12708749 times.
74461455 while (i < max &&
881 36142308 GET_CABAC(LAST_SIGNIFICANT_COEFF_X_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
882 23433559 i++;
883 14885588 *last_scx_prefix = i;
884
885 14885588 i = 0;
886
4/4
✓ Branch 0 taken 31327500 times.
✓ Branch 1 taken 1708454 times.
✓ Branch 2 taken 18150366 times.
✓ Branch 3 taken 13177134 times.
64363454 while (i < max &&
887 31327500 GET_CABAC(LAST_SIGNIFICANT_COEFF_Y_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
888 18150366 i++;
889 14885588 *last_scy_prefix = i;
890 14885588 }
891
892 3165556 static av_always_inline int last_significant_coeff_suffix_decode(HEVCLocalContext *lc,
893 int last_significant_coeff_prefix)
894 {
895 int i;
896 3165556 int length = (last_significant_coeff_prefix >> 1) - 1;
897 3165556 int value = get_cabac_bypass(&lc->cc);
898
899
2/2
✓ Branch 0 taken 881455 times.
✓ Branch 1 taken 3165556 times.
4047011 for (i = 1; i < length; i++)
900 881455 value = (value << 1) | get_cabac_bypass(&lc->cc);
901 3165556 return value;
902 }
903
904 8441829 static av_always_inline int significant_coeff_group_flag_decode(HEVCLocalContext *lc, int c_idx, int ctx_cg)
905 {
906 int inc;
907
908
2/2
✓ Branch 0 taken 1348712 times.
✓ Branch 1 taken 7093117 times.
8441829 inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
909
910 8441829 return GET_CABAC(SIGNIFICANT_COEFF_GROUP_FLAG_OFFSET + inc);
911 }
912 174005874 static av_always_inline int significant_coeff_flag_decode(HEVCLocalContext *lc, int x_c, int y_c,
913 int offset, const uint8_t *ctx_idx_map)
914 {
915 174005874 int inc = ctx_idx_map[(y_c << 2) + x_c] + offset;
916 174005874 return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + inc);
917 }
918
919 19013076 static av_always_inline int significant_coeff_flag_decode_0(HEVCLocalContext *lc, int c_idx, int offset)
920 {
921 19013076 return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + offset);
922 }
923
924 93486834 static av_always_inline int coeff_abs_level_greater1_flag_decode(HEVCLocalContext *lc, int c_idx, int inc)
925 {
926
927
2/2
✓ Branch 0 taken 21904685 times.
✓ Branch 1 taken 71582149 times.
93486834 if (c_idx > 0)
928 21904685 inc += 16;
929
930 93486834 return GET_CABAC(COEFF_ABS_LEVEL_GREATER1_FLAG_OFFSET + inc);
931 }
932
933 10456351 static av_always_inline int coeff_abs_level_greater2_flag_decode(HEVCLocalContext *lc, int c_idx, int inc)
934 {
935
2/2
✓ Branch 0 taken 2191585 times.
✓ Branch 1 taken 8264766 times.
10456351 if (c_idx > 0)
936 2191585 inc += 4;
937
938 10456351 return GET_CABAC(COEFF_ABS_LEVEL_GREATER2_FLAG_OFFSET + inc);
939 }
940
941 42086437 static av_always_inline int coeff_abs_level_remaining_decode(HEVCLocalContext *lc, int rc_rice_param)
942 {
943 42086437 int prefix = 0;
944 42086437 int suffix = 0;
945 int last_coeff_abs_level_remaining;
946 int i;
947
948
3/4
✓ Branch 0 taken 92040644 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 49954207 times.
✓ Branch 4 taken 42086437 times.
92040644 while (prefix < CABAC_MAX_BIN && get_cabac_bypass(&lc->cc))
949 49954207 prefix++;
950
951
2/2
✓ Branch 0 taken 35984896 times.
✓ Branch 1 taken 6101541 times.
42086437 if (prefix < 3) {
952
2/2
✓ Branch 0 taken 38044293 times.
✓ Branch 1 taken 35984896 times.
74029189 for (i = 0; i < rc_rice_param; i++)
953 38044293 suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
954 35984896 last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix;
955 } else {
956 6101541 int prefix_minus3 = prefix - 3;
957
958
2/4
✓ Branch 0 taken 6101541 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6101541 times.
6101541 if (prefix == CABAC_MAX_BIN || prefix_minus3 + rc_rice_param > 16 + 6) {
959 av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix);
960 return 0;
961 }
962
963
2/2
✓ Branch 0 taken 19728346 times.
✓ Branch 1 taken 6101541 times.
25829887 for (i = 0; i < prefix_minus3 + rc_rice_param; i++)
964 19728346 suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
965 6101541 last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
966 6101541 << rc_rice_param) + suffix;
967 }
968 42086437 return last_coeff_abs_level_remaining;
969 }
970
971 22471575 static av_always_inline int coeff_sign_flag_decode(HEVCLocalContext *lc, uint8_t nb)
972 {
973 int i;
974 22471575 int ret = 0;
975
976
2/2
✓ Branch 0 taken 100803169 times.
✓ Branch 1 taken 22471575 times.
123274744 for (i = 0; i < nb; i++)
977 100803169 ret = (ret << 1) | get_cabac_bypass(&lc->cc);
978 22471575 return ret;
979 }
980
981 14885588 void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, const HEVCPPS *pps,
982 int x0, int y0,
983 int log2_trafo_size, enum ScanType scan_idx,
984 int c_idx)
985 {
986 #define GET_COORD(offset, n) \
987 do { \
988 x_c = (x_cg << 2) + scan_x_off[n]; \
989 y_c = (y_cg << 2) + scan_y_off[n]; \
990 } while (0)
991 14885588 const HEVCContext *const s = lc->parent;
992 14885588 const HEVCSPS *const sps = pps->sps;
993 14885588 int transform_skip_flag = 0;
994
995 int last_significant_coeff_x, last_significant_coeff_y;
996 int last_scan_pos;
997 int n_end;
998 14885588 int num_coeff = 0;
999 14885588 int greater1_ctx = 1;
1000
1001 int num_last_subset;
1002 int x_cg_last_sig, y_cg_last_sig;
1003
1004 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1005
1006 14885588 ptrdiff_t stride = s->cur_frame->f->linesize[c_idx];
1007 14885588 int hshift = sps->hshift[c_idx];
1008 14885588 int vshift = sps->vshift[c_idx];
1009 14885588 uint8_t *dst = &s->cur_frame->f->data[c_idx][(y0 >> vshift) * stride +
1010 14885588 ((x0 >> hshift) << sps->pixel_shift)];
1011
2/2
✓ Branch 0 taken 4662735 times.
✓ Branch 1 taken 10222853 times.
14885588 int16_t *coeffs = (int16_t*)(c_idx ? lc->edge_emu_buffer2 : lc->edge_emu_buffer);
1012 14885588 uint8_t significant_coeff_group_flag[8][8] = {{0}};
1013 14885588 int explicit_rdpcm_flag = 0;
1014 int explicit_rdpcm_dir_flag;
1015
1016 14885588 int trafo_size = 1 << log2_trafo_size;
1017 int i;
1018 int qp,shift,add,scale,scale_m;
1019 static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
1020 14885588 const uint8_t *scale_matrix = NULL;
1021 uint8_t dc_scale;
1022
2/2
✓ Branch 0 taken 10222853 times.
✓ Branch 1 taken 4662735 times.
14885588 int pred_mode_intra = (c_idx == 0) ? lc->tu.intra_pred_mode :
1023 lc->tu.intra_pred_mode_c;
1024
1025 14885588 memset(coeffs, 0, trafo_size * trafo_size * sizeof(int16_t));
1026
1027 // Derive QP for dequant
1028
2/2
✓ Branch 0 taken 14388076 times.
✓ Branch 1 taken 497512 times.
14885588 if (!lc->cu.cu_transquant_bypass_flag) {
1029 static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1030 static const uint8_t rem6[51 + 4 * 6 + 1] = {
1031 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1032 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1033 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1034 4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1035 };
1036
1037 static const uint8_t div6[51 + 4 * 6 + 1] = {
1038 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
1039 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
1040 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1041 10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1042 };
1043 14388076 int qp_y = lc->qp_y;
1044
1045
2/2
✓ Branch 0 taken 11821497 times.
✓ Branch 1 taken 2566579 times.
14388076 if (pps->transform_skip_enabled_flag &&
1046
2/2
✓ Branch 0 taken 6674321 times.
✓ Branch 1 taken 5147176 times.
11821497 log2_trafo_size <= pps->log2_max_transform_skip_block_size) {
1047 6674321 transform_skip_flag = hevc_transform_skip_flag_decode(lc, c_idx);
1048 }
1049
1050
2/2
✓ Branch 0 taken 9912438 times.
✓ Branch 1 taken 4475638 times.
14388076 if (c_idx == 0) {
1051 9912438 qp = qp_y + sps->qp_bd_offset;
1052 } else {
1053 int qp_i, offset;
1054
1055
2/2
✓ Branch 0 taken 2119503 times.
✓ Branch 1 taken 2356135 times.
4475638 if (c_idx == 1)
1056 2119503 offset = pps->cb_qp_offset + s->sh.slice_cb_qp_offset +
1057 2119503 lc->tu.cu_qp_offset_cb;
1058 else
1059 2356135 offset = pps->cr_qp_offset + s->sh.slice_cr_qp_offset +
1060 2356135 lc->tu.cu_qp_offset_cr;
1061
1062 4475638 qp_i = av_clip(qp_y + offset, - sps->qp_bd_offset, 57);
1063
2/2
✓ Branch 0 taken 2609533 times.
✓ Branch 1 taken 1866105 times.
4475638 if (sps->chroma_format_idc == 1) {
1064
2/2
✓ Branch 0 taken 820966 times.
✓ Branch 1 taken 1788567 times.
2609533 if (qp_i < 30)
1065 820966 qp = qp_i;
1066
2/2
✓ Branch 0 taken 13523 times.
✓ Branch 1 taken 1775044 times.
1788567 else if (qp_i > 43)
1067 13523 qp = qp_i - 6;
1068 else
1069 1775044 qp = qp_c[qp_i - 30];
1070 } else {
1071
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1866105 times.
1866105 if (qp_i > 51)
1072 qp = 51;
1073 else
1074 1866105 qp = qp_i;
1075 }
1076
1077 4475638 qp += sps->qp_bd_offset;
1078 }
1079
1080 14388076 shift = sps->bit_depth + log2_trafo_size - 5;
1081 14388076 add = 1 << (shift-1);
1082 14388076 scale = level_scale[rem6[qp]] << (div6[qp]);
1083 14388076 scale_m = 16; // default when no custom scaling lists.
1084 14388076 dc_scale = 16;
1085
1086
6/6
✓ Branch 0 taken 541462 times.
✓ Branch 1 taken 13846614 times.
✓ Branch 2 taken 26526 times.
✓ Branch 3 taken 514936 times.
✓ Branch 4 taken 14292 times.
✓ Branch 5 taken 12234 times.
14388076 if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1087 1058456 const ScalingList *sl = pps->scaling_list_data_present_flag ?
1088
2/2
✓ Branch 0 taken 357638 times.
✓ Branch 1 taken 171590 times.
529228 &pps->scaling_list : &sps->scaling_list;
1089 529228 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
1090
1091 529228 matrix_id = 3 * matrix_id + c_idx;
1092
1093 529228 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
1094
2/2
✓ Branch 0 taken 98851 times.
✓ Branch 1 taken 430377 times.
529228 if (log2_trafo_size >= 4)
1095 98851 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
1096 }
1097 } else {
1098 497512 shift = 0;
1099 497512 add = 0;
1100 497512 scale = 0;
1101 497512 dc_scale = 0;
1102 }
1103
1104
6/6
✓ Branch 0 taken 4891452 times.
✓ Branch 1 taken 9994136 times.
✓ Branch 2 taken 225511 times.
✓ Branch 3 taken 4665941 times.
✓ Branch 4 taken 190277 times.
✓ Branch 5 taken 35234 times.
14885588 if (lc->cu.pred_mode == MODE_INTER && sps->explicit_rdpcm_enabled &&
1105
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 190277 times.
190277 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1106 35234 explicit_rdpcm_flag = explicit_rdpcm_flag_decode(lc, c_idx);
1107
2/2
✓ Branch 0 taken 3090 times.
✓ Branch 1 taken 32144 times.
35234 if (explicit_rdpcm_flag) {
1108 3090 explicit_rdpcm_dir_flag = explicit_rdpcm_dir_flag_decode(lc, c_idx);
1109 }
1110 }
1111
1112 14885588 last_significant_coeff_xy_prefix_decode(lc, c_idx, log2_trafo_size,
1113 &last_significant_coeff_x, &last_significant_coeff_y);
1114
1115
2/2
✓ Branch 0 taken 1854438 times.
✓ Branch 1 taken 13031150 times.
14885588 if (last_significant_coeff_x > 3) {
1116 1854438 int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_x);
1117 1854438 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1118 1854438 (2 + (last_significant_coeff_x & 1)) +
1119 suffix;
1120 }
1121
1122
2/2
✓ Branch 0 taken 1311118 times.
✓ Branch 1 taken 13574470 times.
14885588 if (last_significant_coeff_y > 3) {
1123 1311118 int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_y);
1124 1311118 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1125 1311118 (2 + (last_significant_coeff_y & 1)) +
1126 suffix;
1127 }
1128
1129
2/2
✓ Branch 0 taken 1866262 times.
✓ Branch 1 taken 13019326 times.
14885588 if (scan_idx == SCAN_VERT)
1130 1866262 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1131
1132 14885588 x_cg_last_sig = last_significant_coeff_x >> 2;
1133 14885588 y_cg_last_sig = last_significant_coeff_y >> 2;
1134
1135
3/3
✓ Branch 0 taken 10898307 times.
✓ Branch 1 taken 2121019 times.
✓ Branch 2 taken 1866262 times.
14885588 switch (scan_idx) {
1136 10898307 case SCAN_DIAG: {
1137 10898307 int last_x_c = last_significant_coeff_x & 3;
1138 10898307 int last_y_c = last_significant_coeff_y & 3;
1139
1140 10898307 scan_x_off = ff_hevc_diag_scan4x4_x;
1141 10898307 scan_y_off = ff_hevc_diag_scan4x4_y;
1142 10898307 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1143
2/2
✓ Branch 0 taken 5397796 times.
✓ Branch 1 taken 5500511 times.
10898307 if (trafo_size == 4) {
1144 5397796 scan_x_cg = scan_1x1;
1145 5397796 scan_y_cg = scan_1x1;
1146
2/2
✓ Branch 0 taken 2903648 times.
✓ Branch 1 taken 2596863 times.
5500511 } else if (trafo_size == 8) {
1147 2903648 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1148 2903648 scan_x_cg = diag_scan2x2_x;
1149 2903648 scan_y_cg = diag_scan2x2_y;
1150
2/2
✓ Branch 0 taken 1867395 times.
✓ Branch 1 taken 729468 times.
2596863 } else if (trafo_size == 16) {
1151 1867395 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1152 1867395 scan_x_cg = ff_hevc_diag_scan4x4_x;
1153 1867395 scan_y_cg = ff_hevc_diag_scan4x4_y;
1154 } else { // trafo_size == 32
1155 729468 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1156 729468 scan_x_cg = ff_hevc_diag_scan8x8_x;
1157 729468 scan_y_cg = ff_hevc_diag_scan8x8_y;
1158 }
1159 10898307 break;
1160 }
1161 2121019 case SCAN_HORIZ:
1162 2121019 scan_x_cg = horiz_scan2x2_x;
1163 2121019 scan_y_cg = horiz_scan2x2_y;
1164 2121019 scan_x_off = horiz_scan4x4_x;
1165 2121019 scan_y_off = horiz_scan4x4_y;
1166 2121019 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1167 2121019 break;
1168 1866262 default: //SCAN_VERT
1169 1866262 scan_x_cg = horiz_scan2x2_y;
1170 1866262 scan_y_cg = horiz_scan2x2_x;
1171 1866262 scan_x_off = horiz_scan4x4_y;
1172 1866262 scan_y_off = horiz_scan4x4_x;
1173 1866262 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1174 1866262 break;
1175 }
1176 14885588 num_coeff++;
1177 14885588 num_last_subset = (num_coeff - 1) >> 4;
1178
1179
2/2
✓ Branch 0 taken 25768543 times.
✓ Branch 1 taken 14885588 times.
40654131 for (i = num_last_subset; i >= 0; i--) {
1180 int n, m;
1181 int x_cg, y_cg, x_c, y_c, pos;
1182 25768543 int implicit_non_zero_coeff = 0;
1183 int64_t trans_coeff_level;
1184 25768543 int prev_sig = 0;
1185 25768543 int offset = i << 4;
1186 25768543 int rice_init = 0;
1187
1188 uint8_t significant_coeff_flag_idx[16];
1189 25768543 uint8_t nb_significant_coeff_flag = 0;
1190
1191 25768543 x_cg = scan_x_cg[i];
1192 25768543 y_cg = scan_y_cg[i];
1193
1194
4/4
✓ Branch 0 taken 10882955 times.
✓ Branch 1 taken 14885588 times.
✓ Branch 2 taken 8441829 times.
✓ Branch 3 taken 2441126 times.
25768543 if ((i < num_last_subset) && (i > 0)) {
1195 8441829 int ctx_cg = 0;
1196
2/2
✓ Branch 0 taken 7721890 times.
✓ Branch 1 taken 719939 times.
8441829 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1197 7721890 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1198
2/2
✓ Branch 0 taken 7133164 times.
✓ Branch 1 taken 1308665 times.
8441829 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1199 7133164 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1200
1201 8441829 significant_coeff_group_flag[x_cg][y_cg] =
1202 8441829 significant_coeff_group_flag_decode(lc, c_idx, ctx_cg);
1203 8441829 implicit_non_zero_coeff = 1;
1204 } else {
1205 17326714 significant_coeff_group_flag[x_cg][y_cg] =
1206
5/6
✓ Branch 0 taken 15580037 times.
✓ Branch 1 taken 1746677 times.
✓ Branch 2 taken 694449 times.
✓ Branch 3 taken 14885588 times.
✓ Branch 4 taken 2441126 times.
✗ Branch 5 not taken.
19767840 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1207
1/2
✓ Branch 0 taken 2441126 times.
✗ Branch 1 not taken.
2441126 (x_cg == 0 && y_cg == 0));
1208 }
1209
1210 25768543 last_scan_pos = num_coeff - offset - 1;
1211
1212
2/2
✓ Branch 0 taken 14885588 times.
✓ Branch 1 taken 10882955 times.
25768543 if (i == num_last_subset) {
1213 14885588 n_end = last_scan_pos - 1;
1214 14885588 significant_coeff_flag_idx[0] = last_scan_pos;
1215 14885588 nb_significant_coeff_flag = 1;
1216 } else {
1217 10882955 n_end = 15;
1218 }
1219
1220
2/2
✓ Branch 0 taken 15578584 times.
✓ Branch 1 taken 10189959 times.
25768543 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1221 15578584 prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1222
2/2
✓ Branch 0 taken 15149481 times.
✓ Branch 1 taken 10619062 times.
25768543 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1223
2/2
✓ Branch 0 taken 5228110 times.
✓ Branch 1 taken 9921371 times.
15149481 prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1224
1225
4/4
✓ Branch 0 taken 22558760 times.
✓ Branch 1 taken 3209783 times.
✓ Branch 2 taken 19085466 times.
✓ Branch 3 taken 3473294 times.
25768543 if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1226 static const uint8_t ctx_idx_map[] = {
1227 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8, // log2_trafo_size == 2
1228 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0
1229 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 1
1230 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, // prev_sig == 2
1231 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 // default
1232 };
1233 const uint8_t *ctx_idx_map_p;
1234 19085466 int scf_offset = 0;
1235
4/4
✓ Branch 0 taken 1017071 times.
✓ Branch 1 taken 18068395 times.
✓ Branch 2 taken 886760 times.
✓ Branch 3 taken 130311 times.
19085466 if (sps->transform_skip_context_enabled &&
1236
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 886760 times.
886760 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1237 130311 ctx_idx_map_p = &ctx_idx_map[4 * 16];
1238
2/2
✓ Branch 0 taken 61311 times.
✓ Branch 1 taken 69000 times.
130311 if (c_idx == 0) {
1239 61311 scf_offset = 40;
1240 } else {
1241 69000 scf_offset = 14 + 27;
1242 }
1243 } else {
1244
2/2
✓ Branch 0 taken 4514961 times.
✓ Branch 1 taken 14440194 times.
18955155 if (c_idx != 0)
1245 4514961 scf_offset = 27;
1246
2/2
✓ Branch 0 taken 6512747 times.
✓ Branch 1 taken 12442408 times.
18955155 if (log2_trafo_size == 2) {
1247 6512747 ctx_idx_map_p = &ctx_idx_map[0];
1248 } else {
1249 12442408 ctx_idx_map_p = &ctx_idx_map[(prev_sig + 1) << 4];
1250
2/2
✓ Branch 0 taken 10002656 times.
✓ Branch 1 taken 2439752 times.
12442408 if (c_idx == 0) {
1251
4/4
✓ Branch 0 taken 6112214 times.
✓ Branch 1 taken 3890442 times.
✓ Branch 2 taken 2063200 times.
✓ Branch 3 taken 4049014 times.
10002656 if ((x_cg > 0 || y_cg > 0))
1252 5953642 scf_offset += 3;
1253
2/2
✓ Branch 0 taken 3707418 times.
✓ Branch 1 taken 6295238 times.
10002656 if (log2_trafo_size == 3) {
1254
2/2
✓ Branch 0 taken 2572192 times.
✓ Branch 1 taken 1135226 times.
3707418 scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15;
1255 } else {
1256 6295238 scf_offset += 21;
1257 }
1258 } else {
1259
2/2
✓ Branch 0 taken 1161760 times.
✓ Branch 1 taken 1277992 times.
2439752 if (log2_trafo_size == 3)
1260 1161760 scf_offset += 9;
1261 else
1262 1277992 scf_offset += 12;
1263 }
1264 }
1265 }
1266
2/2
✓ Branch 0 taken 174005874 times.
✓ Branch 1 taken 19085466 times.
193091340 for (n = n_end; n > 0; n--) {
1267 174005874 x_c = scan_x_off[n];
1268 174005874 y_c = scan_y_off[n];
1269
2/2
✓ Branch 1 taken 84049359 times.
✓ Branch 2 taken 89956515 times.
174005874 if (significant_coeff_flag_decode(lc, x_c, y_c, scf_offset, ctx_idx_map_p)) {
1270 84049359 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1271 84049359 nb_significant_coeff_flag++;
1272 84049359 implicit_non_zero_coeff = 0;
1273 }
1274 }
1275
2/2
✓ Branch 0 taken 19013076 times.
✓ Branch 1 taken 72390 times.
19085466 if (implicit_non_zero_coeff == 0) {
1276
4/4
✓ Branch 0 taken 1014653 times.
✓ Branch 1 taken 17998423 times.
✓ Branch 2 taken 884736 times.
✓ Branch 3 taken 129917 times.
19013076 if (sps->transform_skip_context_enabled &&
1277
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 884736 times.
884736 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1278
2/2
✓ Branch 0 taken 61056 times.
✓ Branch 1 taken 68861 times.
129917 if (c_idx == 0) {
1279 61056 scf_offset = 42;
1280 } else {
1281 68861 scf_offset = 16 + 27;
1282 }
1283 } else {
1284
2/2
✓ Branch 0 taken 11668599 times.
✓ Branch 1 taken 7214560 times.
18883159 if (i == 0) {
1285
2/2
✓ Branch 0 taken 8486552 times.
✓ Branch 1 taken 3182047 times.
11668599 if (c_idx == 0)
1286 8486552 scf_offset = 0;
1287 else
1288 3182047 scf_offset = 27;
1289 } else {
1290 7214560 scf_offset = 2 + scf_offset;
1291 }
1292 }
1293
2/2
✓ Branch 1 taken 12863094 times.
✓ Branch 2 taken 6149982 times.
19013076 if (significant_coeff_flag_decode_0(lc, c_idx, scf_offset) == 1) {
1294 12863094 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1295 12863094 nb_significant_coeff_flag++;
1296 }
1297 } else {
1298 72390 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1299 72390 nb_significant_coeff_flag++;
1300 }
1301 }
1302
1303 25768543 n_end = nb_significant_coeff_flag;
1304
1305
1306
2/2
✓ Branch 0 taken 22471575 times.
✓ Branch 1 taken 3296968 times.
25768543 if (n_end) {
1307 int first_nz_pos_in_cg;
1308 int last_nz_pos_in_cg;
1309 22471575 int c_rice_param = 0;
1310 22471575 int first_greater1_coeff_idx = -1;
1311 uint8_t coeff_abs_level_greater1_flag[8];
1312 uint16_t coeff_sign_flag;
1313 22471575 int sum_abs = 0;
1314 int sign_hidden;
1315 int sb_type;
1316
1317
1318 // initialize first elem of coeff_bas_level_greater1_flag
1319
4/4
✓ Branch 0 taken 7673172 times.
✓ Branch 1 taken 14798403 times.
✓ Branch 2 taken 6249321 times.
✓ Branch 3 taken 1423851 times.
22471575 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1320
1321
2/2
✓ Branch 0 taken 1166629 times.
✓ Branch 1 taken 21304946 times.
22471575 if (sps->persistent_rice_adaptation_enabled) {
1322
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)
1323
2/2
✓ Branch 0 taken 365016 times.
✓ Branch 1 taken 682024 times.
1047040 sb_type = 2 * (c_idx == 0 ? 1 : 0);
1324 else
1325
2/2
✓ Branch 0 taken 56576 times.
✓ Branch 1 taken 63013 times.
119589 sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1326 1166629 c_rice_param = lc->stat_coeff[sb_type] / 4;
1327 }
1328
1329
4/4
✓ Branch 0 taken 7585987 times.
✓ Branch 1 taken 14885588 times.
✓ Branch 2 taken 3377961 times.
✓ Branch 3 taken 4208026 times.
22471575 if (!(i == num_last_subset) && greater1_ctx == 0)
1330 3377961 ctx_set++;
1331 22471575 greater1_ctx = 1;
1332 22471575 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1333
1334
2/2
✓ Branch 0 taken 93486834 times.
✓ Branch 1 taken 22471575 times.
115958409 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1335 93486834 int inc = (ctx_set << 2) + greater1_ctx;
1336 93486834 coeff_abs_level_greater1_flag[m] =
1337 93486834 coeff_abs_level_greater1_flag_decode(lc, c_idx, inc);
1338
2/2
✓ Branch 0 taken 30844258 times.
✓ Branch 1 taken 62642576 times.
93486834 if (coeff_abs_level_greater1_flag[m]) {
1339 30844258 greater1_ctx = 0;
1340
2/2
✓ Branch 0 taken 10456351 times.
✓ Branch 1 taken 20387907 times.
30844258 if (first_greater1_coeff_idx == -1)
1341 10456351 first_greater1_coeff_idx = m;
1342
4/4
✓ Branch 0 taken 49667097 times.
✓ Branch 1 taken 12975479 times.
✓ Branch 2 taken 30749416 times.
✓ Branch 3 taken 18917681 times.
62642576 } else if (greater1_ctx > 0 && greater1_ctx < 3) {
1343 30749416 greater1_ctx++;
1344 }
1345 }
1346 22471575 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1347
1348
2/2
✓ Branch 0 taken 21675028 times.
✓ Branch 1 taken 796547 times.
22471575 if (lc->cu.cu_transquant_bypass_flag ||
1349
2/2
✓ Branch 0 taken 13981437 times.
✓ Branch 1 taken 7693591 times.
21675028 (lc->cu.pred_mode == MODE_INTRA &&
1350
6/6
✓ Branch 0 taken 902776 times.
✓ Branch 1 taken 13078661 times.
✓ Branch 2 taken 92431 times.
✓ Branch 3 taken 810345 times.
✓ Branch 4 taken 47376 times.
✓ Branch 5 taken 45055 times.
13981437 sps->implicit_rdpcm_enabled && transform_skip_flag &&
1351
4/4
✓ Branch 0 taken 28377 times.
✓ Branch 1 taken 18999 times.
✓ Branch 2 taken 5999 times.
✓ Branch 3 taken 21604975 times.
21629973 (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1352 explicit_rdpcm_flag)
1353 866600 sign_hidden = 0;
1354 else
1355 21604975 sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1356
1357
2/2
✓ Branch 0 taken 10456351 times.
✓ Branch 1 taken 12015224 times.
22471575 if (first_greater1_coeff_idx != -1) {
1358 10456351 coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += coeff_abs_level_greater2_flag_decode(lc, c_idx, ctx_set);
1359 }
1360
4/4
✓ Branch 0 taken 20009937 times.
✓ Branch 1 taken 2461638 times.
✓ Branch 2 taken 8942675 times.
✓ Branch 3 taken 11067262 times.
22471575 if (!pps->sign_data_hiding_flag || !sign_hidden ) {
1361 11404313 coeff_sign_flag = coeff_sign_flag_decode(lc, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1362 } else {
1363 11067262 coeff_sign_flag = coeff_sign_flag_decode(lc, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1364 }
1365
1366
2/2
✓ Branch 0 taken 111870431 times.
✓ Branch 1 taken 22471575 times.
134342006 for (m = 0; m < n_end; m++) {
1367 111870431 n = significant_coeff_flag_idx[m];
1368 111870431 GET_COORD(offset, n);
1369
2/2
✓ Branch 0 taken 93486834 times.
✓ Branch 1 taken 18383597 times.
111870431 if (m < 8) {
1370 93486834 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1371
4/4
✓ Branch 0 taken 10456351 times.
✓ Branch 1 taken 83030483 times.
✓ Branch 2 taken 23702840 times.
✓ Branch 3 taken 69783994 times.
93486834 if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1372 23702840 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1373
1374 23702840 trans_coeff_level += last_coeff_abs_level_remaining;
1375
2/2
✓ Branch 0 taken 6160792 times.
✓ Branch 1 taken 17542048 times.
23702840 if (trans_coeff_level > (3 << c_rice_param))
1376
2/2
✓ Branch 0 taken 197734 times.
✓ Branch 1 taken 5963058 times.
6160792 c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1377
4/4
✓ Branch 0 taken 1114125 times.
✓ Branch 1 taken 22588715 times.
✓ Branch 2 taken 315677 times.
✓ Branch 3 taken 798448 times.
23702840 if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1378 315677 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1379
2/2
✓ Branch 0 taken 37785 times.
✓ Branch 1 taken 277892 times.
315677 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1380 37785 lc->stat_coeff[sb_type]++;
1381
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))
1382
2/2
✓ Branch 0 taken 37744 times.
✓ Branch 1 taken 119323 times.
157067 if (lc->stat_coeff[sb_type] > 0)
1383 37744 lc->stat_coeff[sb_type]--;
1384 315677 rice_init = 1;
1385 }
1386 }
1387 } else {
1388 18383597 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1389
1390 18383597 trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1391
2/2
✓ Branch 0 taken 2272701 times.
✓ Branch 1 taken 16110896 times.
18383597 if (trans_coeff_level > (3 << c_rice_param))
1392
2/2
✓ Branch 0 taken 89299 times.
✓ Branch 1 taken 2183402 times.
2272701 c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1393
4/4
✓ Branch 0 taken 938151 times.
✓ Branch 1 taken 17445446 times.
✓ Branch 2 taken 36551 times.
✓ Branch 3 taken 901600 times.
18383597 if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1394 36551 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1395
2/2
✓ Branch 0 taken 1344 times.
✓ Branch 1 taken 35207 times.
36551 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1396 1344 lc->stat_coeff[sb_type]++;
1397
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))
1398
2/2
✓ Branch 0 taken 1307 times.
✓ Branch 1 taken 23297 times.
24604 if (lc->stat_coeff[sb_type] > 0)
1399 1307 lc->stat_coeff[sb_type]--;
1400 36551 rice_init = 1;
1401 }
1402 }
1403
4/4
✓ Branch 0 taken 103672017 times.
✓ Branch 1 taken 8198414 times.
✓ Branch 2 taken 79833169 times.
✓ Branch 3 taken 23838848 times.
111870431 if (pps->sign_data_hiding_flag && sign_hidden) {
1404 79833169 sum_abs += trans_coeff_level;
1405
4/4
✓ Branch 0 taken 11067262 times.
✓ Branch 1 taken 68765907 times.
✓ Branch 2 taken 5521003 times.
✓ Branch 3 taken 5546259 times.
79833169 if (n == first_nz_pos_in_cg && (sum_abs&1))
1406 5521003 trans_coeff_level = -trans_coeff_level;
1407 }
1408
2/2
✓ Branch 0 taken 50938927 times.
✓ Branch 1 taken 60931504 times.
111870431 if (coeff_sign_flag >> 15)
1409 50938927 trans_coeff_level = -trans_coeff_level;
1410 111870431 coeff_sign_flag <<= 1;
1411
2/2
✓ Branch 0 taken 102057079 times.
✓ Branch 1 taken 9813352 times.
111870431 if(!lc->cu.cu_transquant_bypass_flag) {
1412
6/6
✓ Branch 0 taken 2888212 times.
✓ Branch 1 taken 99168867 times.
✓ Branch 2 taken 190401 times.
✓ Branch 3 taken 2697811 times.
✓ Branch 4 taken 30375 times.
✓ Branch 5 taken 160026 times.
102057079 if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1413
6/6
✓ Branch 0 taken 883486 times.
✓ Branch 1 taken 1844700 times.
✓ Branch 2 taken 413329 times.
✓ Branch 3 taken 470157 times.
✓ Branch 4 taken 339253 times.
✓ Branch 5 taken 74076 times.
2728186 if(y_c || x_c || log2_trafo_size < 4) {
1414
4/4
✓ Branch 0 taken 651937 times.
✓ Branch 1 taken 821408 times.
✓ Branch 2 taken 357284 times.
✓ Branch 3 taken 823481 times.
2654110 switch(log2_trafo_size) {
1415 651937 case 3: pos = (y_c << 3) + x_c; break;
1416 821408 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1417 357284 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1418 823481 default: pos = (y_c << 2) + x_c; break;
1419 }
1420 2654110 scale_m = scale_matrix[pos];
1421 } else {
1422 74076 scale_m = dc_scale;
1423 }
1424 }
1425 102057079 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1426
2/2
✓ Branch 0 taken 51522302 times.
✓ Branch 1 taken 50534777 times.
102057079 if(trans_coeff_level < 0) {
1427
2/2
✓ Branch 0 taken 162681 times.
✓ Branch 1 taken 51359621 times.
51522302 if((~trans_coeff_level) & 0xFffffffffff8000)
1428 162681 trans_coeff_level = -32768;
1429 } else {
1430
2/2
✓ Branch 0 taken 162295 times.
✓ Branch 1 taken 50372482 times.
50534777 if(trans_coeff_level & 0xffffffffffff8000)
1431 162295 trans_coeff_level = 32767;
1432 }
1433 }
1434 111870431 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1435 }
1436 }
1437 }
1438
1439
2/2
✓ Branch 0 taken 497512 times.
✓ Branch 1 taken 14388076 times.
14885588 if (lc->cu.cu_transquant_bypass_flag) {
1440
2/6
✓ Branch 0 taken 497512 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 497512 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
497512 if (explicit_rdpcm_flag || (sps->implicit_rdpcm_enabled &&
1441 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1442 int mode = sps->implicit_rdpcm_enabled ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1443
1444 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1445 }
1446 } else {
1447
2/2
✓ Branch 0 taken 438508 times.
✓ Branch 1 taken 13949568 times.
14388076 if (transform_skip_flag) {
1448
2/2
✓ Branch 0 taken 54609 times.
✓ Branch 1 taken 21520 times.
76129 int rot = sps->transform_skip_rotation_enabled &&
1449
2/2
✓ Branch 0 taken 76129 times.
✓ Branch 1 taken 362379 times.
514637 log2_trafo_size == 2 &&
1450
2/2
✓ Branch 0 taken 20826 times.
✓ Branch 1 taken 33783 times.
54609 lc->cu.pred_mode == MODE_INTRA;
1451
2/2
✓ Branch 0 taken 20826 times.
✓ Branch 1 taken 417682 times.
438508 if (rot) {
1452
2/2
✓ Branch 0 taken 166608 times.
✓ Branch 1 taken 20826 times.
187434 for (i = 0; i < 8; i++)
1453 166608 FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]);
1454 }
1455
1456 438508 s->hevcdsp.dequant(coeffs, log2_trafo_size);
1457
1458
4/4
✓ Branch 0 taken 435418 times.
✓ Branch 1 taken 3090 times.
✓ Branch 2 taken 73039 times.
✓ Branch 3 taken 362379 times.
438508 if (explicit_rdpcm_flag || (sps->implicit_rdpcm_enabled &&
1459
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 &&
1460
2/2
✓ Branch 0 taken 8263 times.
✓ Branch 1 taken 16922 times.
25185 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1461
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);
1462
1463 27063 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1464 }
1465
6/6
✓ Branch 0 taken 9453983 times.
✓ Branch 1 taken 4495585 times.
✓ Branch 2 taken 6393685 times.
✓ Branch 3 taken 3060298 times.
✓ Branch 4 taken 3684910 times.
✓ Branch 5 taken 2708775 times.
13949568 } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) {
1466 3684910 s->hevcdsp.transform_4x4_luma(coeffs);
1467 } else {
1468 10264658 int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1469
2/2
✓ Branch 0 taken 2403437 times.
✓ Branch 1 taken 7861221 times.
10264658 if (max_xy == 0)
1470 2403437 s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1471 else {
1472 7861221 int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1473
2/2
✓ Branch 0 taken 5481994 times.
✓ Branch 1 taken 2379227 times.
7861221 if (max_xy < 4)
1474 5481994 col_limit = FFMIN(4, col_limit);
1475
2/2
✓ Branch 0 taken 1778871 times.
✓ Branch 1 taken 600356 times.
2379227 else if (max_xy < 8)
1476 1778871 col_limit = FFMIN(8, col_limit);
1477
2/2
✓ Branch 0 taken 259233 times.
✓ Branch 1 taken 341123 times.
600356 else if (max_xy < 12)
1478 259233 col_limit = FFMIN(24, col_limit);
1479 7861221 s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1480 }
1481 }
1482 }
1483
2/2
✓ Branch 0 taken 269268 times.
✓ Branch 1 taken 14616320 times.
14885588 if (lc->tu.cross_pf) {
1484 269268 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1485
1486
2/2
✓ Branch 0 taken 20252880 times.
✓ Branch 1 taken 269268 times.
20522148 for (i = 0; i < (trafo_size * trafo_size); i++) {
1487 20252880 coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1488 }
1489 }
1490 14885588 s->hevcdsp.add_residual[log2_trafo_size-2](dst, coeffs, stride);
1491 14885588 }
1492
1493 2758140 void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size)
1494 {
1495 2758140 int x = abs_mvd_greater0_flag_decode(lc);
1496 2758140 int y = abs_mvd_greater0_flag_decode(lc);
1497
1498
2/2
✓ Branch 0 taken 1932596 times.
✓ Branch 1 taken 825544 times.
2758140 if (x)
1499 1932596 x += abs_mvd_greater1_flag_decode(lc);
1500
2/2
✓ Branch 0 taken 1853025 times.
✓ Branch 1 taken 905115 times.
2758140 if (y)
1501 1853025 y += abs_mvd_greater1_flag_decode(lc);
1502
1503
3/4
✓ Branch 0 taken 1406293 times.
✓ Branch 1 taken 526303 times.
✓ Branch 2 taken 825544 times.
✗ Branch 3 not taken.
2758140 switch (x) {
1504 1406293 case 2: lc->pu.mvd.x = mvd_decode(lc); break;
1505 526303 case 1: lc->pu.mvd.x = mvd_sign_flag_decode(lc); break;
1506 825544 case 0: lc->pu.mvd.x = 0; break;
1507 }
1508
1509
3/4
✓ Branch 0 taken 1315842 times.
✓ Branch 1 taken 537183 times.
✓ Branch 2 taken 905115 times.
✗ Branch 3 not taken.
2758140 switch (y) {
1510 1315842 case 2: lc->pu.mvd.y = mvd_decode(lc); break;
1511 537183 case 1: lc->pu.mvd.y = mvd_sign_flag_decode(lc); break;
1512 905115 case 0: lc->pu.mvd.y = 0; break;
1513 }
1514 2758140 }
1515
1516