FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/hevc/cabac.c
Date: 2026-08-15 14:54:27
Exec Total Coverage
Lines: 680 708 96.0%
Functions: 56 57 98.2%
Branches: 512 551 92.9%

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 "libavcodec/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 2008935 void ff_hevc_save_states(HEVCLocalContext *lc, const HEVCPPS *pps,
403 int ctb_addr_ts)
404 {
405 2008935 const HEVCSPS *const sps = pps->sps;
406
2/2
✓ Branch 0 taken 173854 times.
✓ Branch 1 taken 1835081 times.
2008935 if (pps->entropy_coding_sync_enabled_flag &&
407
2/2
✓ Branch 0 taken 166465 times.
✓ Branch 1 taken 7389 times.
173854 (ctb_addr_ts % sps->ctb_width == 2 ||
408
2/2
✓ Branch 0 taken 784 times.
✓ Branch 1 taken 165681 times.
166465 (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 7781 memcpy(lc->common_cabac_state->state, lc->cabac_state, HEVC_CONTEXTS);
411
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 7733 times.
7781 if (sps->persistent_rice_adaptation_enabled) {
412 48 memcpy(lc->common_cabac_state->stat_coeff, lc->stat_coeff, HEVC_STAT_COEFFS);
413 }
414 }
415 2008935 }
416
417 6479 static void load_states(HEVCLocalContext *lc, const HEVCSPS *sps)
418 {
419 6479 memcpy(lc->cabac_state, lc->common_cabac_state->state, HEVC_CONTEXTS);
420
2/2
✓ Branch 0 taken 44 times.
✓ Branch 1 taken 6435 times.
6479 if (sps->persistent_rice_adaptation_enabled) {
421 44 memcpy(lc->stat_coeff, lc->common_cabac_state->stat_coeff, HEVC_STAT_COEFFS);
422 }
423 6479 }
424
425 10144 static int cabac_reinit(HEVCLocalContext *lc)
426 {
427
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 10144 times.
10144 return skip_bytes(&lc->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
428 }
429
430 26098 static void cabac_init_state(HEVCLocalContext *lc, const HEVCContext *s)
431 {
432 26098 int init_type = 2 - s->sh.slice_type;
433 int i;
434
435
4/4
✓ Branch 0 taken 6607 times.
✓ Branch 1 taken 19491 times.
✓ Branch 2 taken 6463 times.
✓ Branch 3 taken 144 times.
26098 if (s->sh.cabac_init_flag && s->sh.slice_type != HEVC_SLICE_I)
436 6463 init_type ^= 3;
437
438
2/2
✓ Branch 0 taken 5193502 times.
✓ Branch 1 taken 26098 times.
5219600 for (i = 0; i < HEVC_CONTEXTS; i++) {
439 5193502 int init_value = init_values[init_type][i];
440 5193502 int m = (init_value >> 4) * 5 - 45;
441 5193502 int n = ((init_value & 15) << 3) - 16;
442 5193502 int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
443
444 5193502 pre ^= pre >> 31;
445
2/2
✓ Branch 0 taken 533087 times.
✓ Branch 1 taken 4660415 times.
5193502 if (pre > 124)
446 533087 pre = 124 + (pre & 1);
447 5193502 lc->cabac_state[i] = pre;
448 }
449
450
2/2
✓ Branch 0 taken 104392 times.
✓ Branch 1 taken 26098 times.
130490 for (i = 0; i < 4; i++)
451 104392 lc->stat_coeff[i] = 0;
452 26098 }
453
454 2008936 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 2008936 const HEVCContext *const s = lc->parent;
459 2008936 const HEVCSPS *const sps = pps->sps;
460
461
2/2
✓ Branch 0 taken 28817 times.
✓ Branch 1 taken 1980119 times.
2008936 if (ctb_addr_ts == pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) {
462 28817 int ret = ff_init_cabac_decoder(&lc->cc, data, size);
463
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28817 times.
28817 if (ret < 0)
464 return ret;
465
2/2
✓ Branch 0 taken 7947 times.
✓ Branch 1 taken 20870 times.
28817 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 21179 cabac_init_state(lc, s);
469
470
2/2
✓ Branch 0 taken 18251 times.
✓ Branch 1 taken 10566 times.
28817 if (!s->sh.first_slice_in_pic_flag &&
471
2/2
✓ Branch 0 taken 3853 times.
✓ Branch 1 taken 14398 times.
18251 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 677565 times.
✓ Branch 1 taken 1302554 times.
1980119 if (pps->tiles_enabled_flag &&
481
2/2
✓ Branch 0 taken 4625 times.
✓ Branch 1 taken 672940 times.
677565 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 168983 times.
✓ Branch 1 taken 1811136 times.
1980119 if (pps->entropy_coding_sync_enabled_flag) {
493
2/2
✓ Branch 0 taken 5519 times.
✓ Branch 1 taken 163464 times.
168983 if (ctb_addr_ts % sps->ctb_width == 0) {
494 int ret;
495 5519 get_cabac_terminate(&lc->cc);
496
1/2
✓ Branch 0 taken 5519 times.
✗ Branch 1 not taken.
5519 if (!is_wpp)
497 5519 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 5519 times.
5519 if (ret < 0)
502 return ret;
503
504
2/2
✓ Branch 0 taken 202 times.
✓ Branch 1 taken 5317 times.
5519 if (sps->ctb_width == 1)
505 202 cabac_init_state(lc, s);
506 else
507 5317 load_states(lc, sps);
508 }
509 }
510 }
511 2008936 return 0;
512 }
513
514 #define GET_CABAC(ctx) get_cabac(&lc->cc, &lc->cabac_state[ctx])
515
516 1503363 int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc)
517 {
518 1503363 return GET_CABAC(SAO_MERGE_FLAG_OFFSET);
519 }
520
521 599594 int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc)
522 {
523
2/2
✓ Branch 1 taken 401720 times.
✓ Branch 2 taken 197874 times.
599594 if (!GET_CABAC(SAO_TYPE_IDX_OFFSET))
524 401720 return 0;
525
526
2/2
✓ Branch 1 taken 57626 times.
✓ Branch 2 taken 140248 times.
197874 if (!get_cabac_bypass(&lc->cc))
527 57626 return SAO_BAND;
528 140248 return SAO_EDGE;
529 }
530
531 82676 int ff_hevc_sao_band_position_decode(HEVCLocalContext *lc)
532 {
533 int i;
534 82676 int value = get_cabac_bypass(&lc->cc);
535
536
2/2
✓ Branch 0 taken 330704 times.
✓ Branch 1 taken 82676 times.
413380 for (i = 0; i < 4; i++)
537 330704 value = (value << 1) | get_cabac_bypass(&lc->cc);
538 82676 return value;
539 }
540
541 1029260 int ff_hevc_sao_offset_abs_decode(HEVCLocalContext *lc, int bit_depth)
542 {
543 1029260 int i = 0;
544 1029260 int length = (1 << (FFMIN(bit_depth, 10) - 5)) - 1;
545
546
4/4
✓ Branch 0 taken 2764764 times.
✓ Branch 1 taken 128587 times.
✓ Branch 3 taken 1864091 times.
✓ Branch 4 taken 900673 times.
2893351 while (i < length && get_cabac_bypass(&lc->cc))
547 1864091 i++;
548 1029260 return i;
549 }
550
551 252778 int ff_hevc_sao_offset_sign_decode(HEVCLocalContext *lc)
552 {
553 252778 return get_cabac_bypass(&lc->cc);
554 }
555
556 140248 int ff_hevc_sao_eo_class_decode(HEVCLocalContext *lc)
557 {
558 140248 int ret = get_cabac_bypass(&lc->cc) << 1;
559 140248 ret |= get_cabac_bypass(&lc->cc);
560 140248 return ret;
561 }
562
563 2008935 int ff_hevc_end_of_slice_flag_decode(HEVCLocalContext *lc)
564 {
565 2008935 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 9866641 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 9866641 int inc = 0;
577
578
4/4
✓ Branch 0 taken 830379 times.
✓ Branch 1 taken 9036262 times.
✓ Branch 2 taken 583840 times.
✓ Branch 3 taken 246539 times.
9866641 if (lc->ctb_left_flag || x0)
579 9620102 inc = !!SAMPLE_CTB(skip_flag, x_cb - 1, y_cb);
580
4/4
✓ Branch 0 taken 1724850 times.
✓ Branch 1 taken 8141791 times.
✓ Branch 2 taken 1241828 times.
✓ Branch 3 taken 483022 times.
9866641 if (lc->ctb_up_flag || y0)
581 9383619 inc += !!SAMPLE_CTB(skip_flag, x_cb, y_cb - 1);
582
583 9866641 return GET_CABAC(SKIP_FLAG_OFFSET + inc);
584 }
585
586 1021402 int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc)
587 {
588 1021402 int prefix_val = 0;
589 1021402 int suffix_val = 0;
590 1021402 int inc = 0;
591
592
4/4
✓ Branch 0 taken 2257025 times.
✓ Branch 1 taken 147844 times.
✓ Branch 3 taken 1383467 times.
✓ Branch 4 taken 873558 times.
2404869 while (prefix_val < 5 && GET_CABAC(CU_QP_DELTA_OFFSET + inc)) {
593 1383467 prefix_val++;
594 1383467 inc = 1;
595 }
596
2/2
✓ Branch 0 taken 147844 times.
✓ Branch 1 taken 873558 times.
1021402 if (prefix_val >= 5) {
597 147844 int k = 0;
598
3/4
✓ Branch 0 taken 451675 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 303831 times.
✓ Branch 4 taken 147844 times.
451675 while (k < 7 && get_cabac_bypass(&lc->cc)) {
599 303831 suffix_val += 1 << k;
600 303831 k++;
601 }
602
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 147844 times.
147844 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 303831 times.
✓ Branch 1 taken 147844 times.
451675 while (k--)
608 303831 suffix_val += get_cabac_bypass(&lc->cc) << k;
609 }
610 1021402 return prefix_val + suffix_val;
611 }
612
613 529266 int ff_hevc_cu_qp_delta_sign_flag(HEVCLocalContext *lc)
614 {
615 529266 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 5301034 int ff_hevc_pred_mode_decode(HEVCLocalContext *lc)
635 {
636 5301034 return GET_CABAC(PRED_MODE_FLAG_OFFSET);
637 }
638
639 9259671 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 9259671 int inc = 0, depth_left = 0, depth_top = 0;
644 9259671 int x0b = av_zero_extend(x0, sps->log2_ctb_size);
645 9259671 int y0b = av_zero_extend(y0, sps->log2_ctb_size);
646 9259671 int x_cb = x0 >> sps->log2_min_cb_size;
647 9259671 int y_cb = y0 >> sps->log2_min_cb_size;
648
649
4/4
✓ Branch 0 taken 788150 times.
✓ Branch 1 taken 8471521 times.
✓ Branch 2 taken 433727 times.
✓ Branch 3 taken 354423 times.
9259671 if (lc->ctb_left_flag || x0b)
650 8905248 depth_left = tab_ct_depth[(y_cb) * sps->min_cb_width + x_cb - 1];
651
4/4
✓ Branch 0 taken 1543340 times.
✓ Branch 1 taken 7716331 times.
✓ Branch 2 taken 855903 times.
✓ Branch 3 taken 687437 times.
9259671 if (lc->ctb_up_flag || y0b)
652 8572234 depth_top = tab_ct_depth[(y_cb - 1) * sps->min_cb_width + x_cb];
653
654 9259671 inc += (depth_left > ct_depth);
655 9259671 inc += (depth_top > ct_depth);
656
657 9259671 return GET_CABAC(SPLIT_CODING_UNIT_FLAG_OFFSET + inc);
658 }
659
660 7535330 int ff_hevc_part_mode_decode(HEVCLocalContext *lc, const HEVCSPS *sps, int log2_cb_size)
661 {
662
2/2
✓ Branch 1 taken 4683842 times.
✓ Branch 2 taken 2851488 times.
7535330 if (GET_CABAC(PART_MODE_OFFSET)) // 1
663 4683842 return PART_2Nx2N;
664
2/2
✓ Branch 0 taken 2107736 times.
✓ Branch 1 taken 743752 times.
2851488 if (log2_cb_size == sps->log2_min_cb_size) {
665
2/2
✓ Branch 0 taken 1332575 times.
✓ Branch 1 taken 775161 times.
2107736 if (lc->cu.pred_mode == MODE_INTRA) // 0
666 1332575 return PART_NxN;
667
2/2
✓ Branch 1 taken 317747 times.
✓ Branch 2 taken 457414 times.
775161 if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01
668 317747 return PART_2NxN;
669
2/2
✓ Branch 0 taken 233272 times.
✓ Branch 1 taken 224142 times.
457414 if (log2_cb_size == 3) // 00
670 233272 return PART_Nx2N;
671
2/2
✓ Branch 1 taken 115987 times.
✓ Branch 2 taken 108155 times.
224142 if (GET_CABAC(PART_MODE_OFFSET + 2)) // 001
672 115987 return PART_Nx2N;
673 108155 return PART_NxN; // 000
674 }
675
676
2/2
✓ Branch 0 taken 138513 times.
✓ Branch 1 taken 605239 times.
743752 if (!sps->amp_enabled) {
677
2/2
✓ Branch 1 taken 65613 times.
✓ Branch 2 taken 72900 times.
138513 if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01
678 65613 return PART_2NxN;
679 72900 return PART_Nx2N;
680 }
681
682
2/2
✓ Branch 1 taken 241410 times.
✓ Branch 2 taken 363829 times.
605239 if (GET_CABAC(PART_MODE_OFFSET + 1)) { // 01X, 01XX
683
2/2
✓ Branch 1 taken 115907 times.
✓ Branch 2 taken 125503 times.
241410 if (GET_CABAC(PART_MODE_OFFSET + 3)) // 011
684 115907 return PART_2NxN;
685
2/2
✓ Branch 1 taken 58153 times.
✓ Branch 2 taken 67350 times.
125503 if (get_cabac_bypass(&lc->cc)) // 0101
686 58153 return PART_2NxnD;
687 67350 return PART_2NxnU; // 0100
688 }
689
690
2/2
✓ Branch 1 taken 177705 times.
✓ Branch 2 taken 186124 times.
363829 if (GET_CABAC(PART_MODE_OFFSET + 3)) // 001
691 177705 return PART_Nx2N;
692
2/2
✓ Branch 1 taken 85843 times.
✓ Branch 2 taken 100281 times.
186124 if (get_cabac_bypass(&lc->cc)) // 0001
693 85843 return PART_nRx2N;
694 100281 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 8626139 int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCLocalContext *lc)
703 {
704 8626139 return GET_CABAC(PREV_INTRA_LUMA_PRED_FLAG_OFFSET);
705 }
706
707 5171549 int ff_hevc_mpm_idx_decode(HEVCLocalContext *lc)
708 {
709 5171549 int i = 0;
710
4/4
✓ Branch 0 taken 7716513 times.
✓ Branch 1 taken 1073110 times.
✓ Branch 3 taken 3618074 times.
✓ Branch 4 taken 4098439 times.
8789623 while (i < 2 && get_cabac_bypass(&lc->cc))
711 3618074 i++;
712 5171549 return i;
713 }
714
715 3454590 int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCLocalContext *lc)
716 {
717 int i;
718 3454590 int value = get_cabac_bypass(&lc->cc);
719
720
2/2
✓ Branch 0 taken 13818360 times.
✓ Branch 1 taken 3454590 times.
17272950 for (i = 0; i < 4; i++)
721 13818360 value = (value << 1) | get_cabac_bypass(&lc->cc);
722 3454590 return value;
723 }
724
725 4729775 int ff_hevc_intra_chroma_pred_mode_decode(HEVCLocalContext *lc)
726 {
727 int ret;
728
2/2
✓ Branch 1 taken 3592525 times.
✓ Branch 2 taken 1137250 times.
4729775 if (!GET_CABAC(INTRA_CHROMA_PRED_MODE_OFFSET))
729 3592525 return 4;
730
731 1137250 ret = get_cabac_bypass(&lc->cc) << 1;
732 1137250 ret |= get_cabac_bypass(&lc->cc);
733 1137250 return ret;
734 }
735
736 7424707 int ff_hevc_merge_idx_decode(HEVCLocalContext *lc)
737 {
738 7424707 int i = GET_CABAC(MERGE_IDX_OFFSET);
739
740
2/2
✓ Branch 0 taken 2956699 times.
✓ Branch 1 taken 4468008 times.
7424707 if (i != 0) {
741
4/4
✓ Branch 0 taken 4365609 times.
✓ Branch 1 taken 412503 times.
✓ Branch 3 taken 1821413 times.
✓ Branch 4 taken 2544196 times.
4778112 while (i < lc->parent->sh.max_num_merge_cand-1 && get_cabac_bypass(&lc->cc))
742 1821413 i++;
743 }
744 7424707 return i;
745 }
746
747 5769030 int ff_hevc_merge_flag_decode(HEVCLocalContext *lc)
748 {
749 5769030 return GET_CABAC(MERGE_FLAG_OFFSET);
750 }
751
752 1922844 int ff_hevc_inter_pred_idc_decode(HEVCLocalContext *lc, int nPbW, int nPbH)
753 {
754
2/2
✓ Branch 0 taken 248669 times.
✓ Branch 1 taken 1674175 times.
1922844 if (nPbW + nPbH == 12)
755 248669 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
756
2/2
✓ Branch 1 taken 424925 times.
✓ Branch 2 taken 1249250 times.
1674175 if (GET_CABAC(INTER_PRED_IDC_OFFSET + lc->ct_depth))
757 424925 return PRED_BI;
758
759 1249250 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
760 }
761
762 3258002 int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx)
763 {
764 3258002 int i = 0;
765 3258002 int max = num_ref_idx_lx - 1;
766 3258002 int max_ctx = FFMIN(max, 2);
767
768
4/4
✓ Branch 0 taken 3048836 times.
✓ Branch 1 taken 1207672 times.
✓ Branch 3 taken 998506 times.
✓ Branch 4 taken 2050330 times.
4256508 while (i < max_ctx && GET_CABAC(REF_IDX_L0_OFFSET + i))
769 998506 i++;
770
2/2
✓ Branch 0 taken 203584 times.
✓ Branch 1 taken 3054418 times.
3258002 if (i == 2) {
771
4/4
✓ Branch 0 taken 162576 times.
✓ Branch 1 taken 127605 times.
✓ Branch 3 taken 86597 times.
✓ Branch 4 taken 75979 times.
290181 while (i < max && get_cabac_bypass(&lc->cc))
772 86597 i++;
773 }
774
775 3258002 return i;
776 }
777
778 3258002 int ff_hevc_mvp_lx_flag_decode(HEVCLocalContext *lc)
779 {
780 3258002 return GET_CABAC(MVP_LX_FLAG_OFFSET);
781 }
782
783 2826655 int ff_hevc_no_residual_syntax_flag_decode(HEVCLocalContext *lc)
784 {
785 2826655 return GET_CABAC(NO_RESIDUAL_DATA_FLAG_OFFSET);
786 }
787
788 6188794 static av_always_inline int abs_mvd_greater0_flag_decode(HEVCLocalContext *lc)
789 {
790 6188794 return GET_CABAC(ABS_MVD_GREATER0_FLAG_OFFSET);
791 }
792
793 4273520 static av_always_inline int abs_mvd_greater1_flag_decode(HEVCLocalContext *lc)
794 {
795 4273520 return GET_CABAC(ABS_MVD_GREATER1_FLAG_OFFSET + 1);
796 }
797
798 3016742 static av_always_inline int mvd_decode(HEVCLocalContext *lc)
799 {
800 3016742 int ret = 2;
801 3016742 int k = 1;
802
803
3/4
✓ Branch 0 taken 7309751 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 4293009 times.
✓ Branch 4 taken 3016742 times.
7309751 while (k < CABAC_MAX_BIN && get_cabac_bypass(&lc->cc)) {
804 4293009 ret += 1U << k;
805 4293009 k++;
806 }
807
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3016742 times.
3016742 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 7309751 times.
✓ Branch 1 taken 3016742 times.
10326493 while (k--)
812 7309751 ret += get_cabac_bypass(&lc->cc) << k;
813 3016742 return get_cabac_bypass_sign(&lc->cc, -ret);
814 }
815
816 1256778 static av_always_inline int mvd_sign_flag_decode(HEVCLocalContext *lc)
817 {
818 1256778 return get_cabac_bypass_sign(&lc->cc, -1);
819 }
820
821 7701444 int ff_hevc_split_transform_flag_decode(HEVCLocalContext *lc, int log2_trafo_size)
822 {
823 7701444 return GET_CABAC(SPLIT_TRANSFORM_FLAG_OFFSET + 5 - log2_trafo_size);
824 }
825
826 18136305 int ff_hevc_cbf_cb_cr_decode(HEVCLocalContext *lc, int trafo_depth)
827 {
828 18136305 return GET_CABAC(CBF_CB_CR_OFFSET + trafo_depth);
829 }
830
831 16591922 int ff_hevc_cbf_luma_decode(HEVCLocalContext *lc, int trafo_depth)
832 {
833
2/2
✓ Branch 0 taken 3345206 times.
✓ Branch 1 taken 13246716 times.
16591922 return GET_CABAC(CBF_LUMA_OFFSET + !trafo_depth);
834 }
835
836 7018276 static int hevc_transform_skip_flag_decode(HEVCLocalContext *lc, int c_idx)
837 {
838
2/2
✓ Branch 0 taken 2364114 times.
✓ Branch 1 taken 4654162 times.
7018276 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 16515668 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 16515668 int i = 0;
870 16515668 int max = (log2_size << 1) - 1;
871 int ctx_offset, ctx_shift;
872
873
2/2
✓ Branch 0 taken 11423835 times.
✓ Branch 1 taken 5091833 times.
16515668 if (!c_idx) {
874 11423835 ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2);
875 11423835 ctx_shift = (log2_size + 1) >> 2;
876 } else {
877 5091833 ctx_offset = 15;
878 5091833 ctx_shift = log2_size - 2;
879 }
880
4/4
✓ Branch 0 taken 40144337 times.
✓ Branch 1 taken 2308644 times.
✓ Branch 2 taken 25937313 times.
✓ Branch 3 taken 14207024 times.
82597318 while (i < max &&
881 40144337 GET_CABAC(LAST_SIGNIFICANT_COEFF_X_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
882 25937313 i++;
883 16515668 *last_scx_prefix = i;
884
885 16515668 i = 0;
886
4/4
✓ Branch 0 taken 35087047 times.
✓ Branch 1 taken 1818655 times.
✓ Branch 2 taken 20390034 times.
✓ Branch 3 taken 14697013 times.
71992749 while (i < max &&
887 35087047 GET_CABAC(LAST_SIGNIFICANT_COEFF_Y_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
888 20390034 i++;
889 16515668 *last_scy_prefix = i;
890 16515668 }
891
892 3660162 static av_always_inline int last_significant_coeff_suffix_decode(HEVCLocalContext *lc,
893 int last_significant_coeff_prefix)
894 {
895 int i;
896 3660162 int length = (last_significant_coeff_prefix >> 1) - 1;
897 3660162 int value = get_cabac_bypass(&lc->cc);
898
899
2/2
✓ Branch 0 taken 1019942 times.
✓ Branch 1 taken 3660162 times.
4680104 for (i = 1; i < length; i++)
900 1019942 value = (value << 1) | get_cabac_bypass(&lc->cc);
901 3660162 return value;
902 }
903
904 9598265 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 1353760 times.
✓ Branch 1 taken 8244505 times.
9598265 inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
909
910 9598265 return GET_CABAC(SIGNIFICANT_COEFF_GROUP_FLAG_OFFSET + inc);
911 }
912 195422078 static av_always_inline int significant_coeff_flag_decode(HEVCLocalContext *lc, int n,
913 int offset, const uint8_t *ctx_idx_map)
914 {
915 195422078 int inc = ctx_idx_map[n] + offset;
916 195422078 return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + inc);
917 }
918
919 21178404 static av_always_inline int significant_coeff_flag_decode_0(HEVCLocalContext *lc, int c_idx, int offset)
920 {
921 21178404 return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + offset);
922 }
923
924 101593454 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 22531513 times.
✓ Branch 1 taken 79061941 times.
101593454 if (c_idx > 0)
928 22531513 inc += 16;
929
930 101593454 return GET_CABAC(COEFF_ABS_LEVEL_GREATER1_FLAG_OFFSET + inc);
931 }
932
933 11127626 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 2252482 times.
✓ Branch 1 taken 8875144 times.
11127626 if (c_idx > 0)
936 2252482 inc += 4;
937
938 11127626 return GET_CABAC(COEFF_ABS_LEVEL_GREATER2_FLAG_OFFSET + inc);
939 }
940
941 /* a run of bypass bins is the quotient of the offset by range << 17 */
942 20983814 static int cabac_bypass_bits(CABACContext *c, int n)
943 {
944 20983814 int avail = CABAC_BITS - ff_ctz(c->low);
945 20983814 uint64_t x, r = (uint64_t)c->range << (CABAC_BITS + 1);
946 20983814 const uint8_t *bytestream = c->bytestream;
947
948
2/2
✓ Branch 0 taken 13087730 times.
✓ Branch 1 taken 7896084 times.
20983814 if (n < avail) {
949 13087730 x = (uint64_t)c->low << n;
950 } else {
951 7896084 int fill = (bytestream[0] << 9) + (bytestream[1] << 1) - CABAC_MASK;
952
953 7896084 x = (uint64_t)((((int64_t)c->low << avail) + fill)) << (n - avail);
954 #if !UNCHECKED_BITSTREAM_READER
955
2/2
✓ Branch 0 taken 7895893 times.
✓ Branch 1 taken 191 times.
7896084 if (bytestream < c->bytestream_end)
956 #endif
957 7895893 bytestream += CABAC_BITS / 8;
958 }
959
960
1/2
✓ Branch 0 taken 20983814 times.
✗ Branch 1 not taken.
20983814 if (x < r << n) {
961 20983814 c->low = x % r;
962 20983814 c->bytestream = bytestream;
963 20983814 return x / r;
964 } else {
965 int ret = 0;
966
967 for (int i = 0; i < n; i++)
968 ret = (ret << 1) | get_cabac_bypass(c);
969 return ret;
970 }
971 }
972
973 /* leading ones of the quotient, consumed only up to the first zero */
974 43782396 static int cabac_unary_prefix(CABACContext *c, int max)
975 {
976 43782396 int prefix = 0;
977
978
1/2
✓ Branch 0 taken 50226499 times.
✗ Branch 1 not taken.
50226499 while (prefix < max) {
979 50226499 int avail = CABAC_BITS - ff_ctz(c->low);
980 50226499 int n = FFMIN(avail - 1, max - prefix);
981 50226499 uint64_t r = (uint64_t)c->range << (CABAC_BITS + 1);
982 50226499 uint64_t x = (uint64_t)c->low << n;
983 int q, t;
984
985
3/4
✓ Branch 0 taken 44267058 times.
✓ Branch 1 taken 5959441 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 44267058 times.
50226499 if (n < 1 || x >= r << n) {
986
2/2
✓ Branch 1 taken 2736490 times.
✓ Branch 2 taken 3222951 times.
5959441 if (!get_cabac_bypass(c))
987 2736490 return prefix;
988 3222951 prefix++;
989 3222951 continue;
990 }
991
992 44267058 q = x / r;
993 44267058 t = ~q & ((1 << n) - 1);
994
2/2
✓ Branch 0 taken 41045906 times.
✓ Branch 1 taken 3221152 times.
44267058 if (t) {
995 41045906 int p = n - 1 - av_log2(t);
996 41045906 int k = n - (p + 1);
997
998 41045906 c->low = (x >> k) - ((uint64_t)(q >> k) * r);
999 41045906 return prefix + p;
1000 }
1001 3221152 c->low = x - (uint64_t)q * r;
1002 3221152 prefix += n;
1003 }
1004 return prefix;
1005 }
1006
1007 43782396 static av_always_inline int coeff_abs_level_remaining_decode(HEVCLocalContext *lc, int rc_rice_param)
1008 {
1009 int prefix;
1010 43782396 int suffix = 0;
1011 int last_coeff_abs_level_remaining;
1012 int i;
1013
1014 43782396 prefix = cabac_unary_prefix(&lc->cc, CABAC_MAX_BIN);
1015
1016
2/2
✓ Branch 0 taken 37471199 times.
✓ Branch 1 taken 6311197 times.
43782396 if (prefix < 3) {
1017
2/2
✓ Branch 0 taken 4331194 times.
✓ Branch 1 taken 33140005 times.
37471199 if (rc_rice_param > 2)
1018 4331194 suffix = cabac_bypass_bits(&lc->cc, rc_rice_param);
1019 else
1020
2/2
✓ Branch 0 taken 22138531 times.
✓ Branch 1 taken 33140005 times.
55278536 for (i = 0; i < rc_rice_param; i++)
1021 22138531 suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
1022 37471199 last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix;
1023 } else {
1024 6311197 int prefix_minus3 = prefix - 3;
1025 int k;
1026
1027
2/4
✓ Branch 0 taken 6311197 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6311197 times.
6311197 if (prefix == CABAC_MAX_BIN || prefix_minus3 + rc_rice_param > 16 + 6) {
1028 av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix);
1029 return 0;
1030 }
1031
1032 6311197 k = prefix_minus3 + rc_rice_param;
1033
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6311197 times.
6311197 if (k > 16) {
1034 suffix = cabac_bypass_bits(&lc->cc, 16) << (k - 16);
1035 suffix |= cabac_bypass_bits(&lc->cc, k - 16);
1036
2/2
✓ Branch 0 taken 2866155 times.
✓ Branch 1 taken 3445042 times.
6311197 } else if (k > 2) {
1037 2866155 suffix = cabac_bypass_bits(&lc->cc, k);
1038 } else {
1039
2/2
✓ Branch 0 taken 3388266 times.
✓ Branch 1 taken 3445042 times.
6833308 for (i = 0; i < k; i++)
1040 3388266 suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
1041 }
1042 6311197 last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
1043 6311197 << rc_rice_param) + suffix;
1044 }
1045 43782396 return last_coeff_abs_level_remaining;
1046 }
1047
1048 25135920 static av_always_inline int coeff_sign_flag_decode(HEVCLocalContext *lc, uint8_t nb)
1049 {
1050 int i;
1051 25135920 int ret = 0;
1052
1053
2/2
✓ Branch 0 taken 13786465 times.
✓ Branch 1 taken 11349455 times.
25135920 if (nb > 2)
1054 13786465 return cabac_bypass_bits(&lc->cc, nb);
1055
1056
2/2
✓ Branch 0 taken 16020721 times.
✓ Branch 1 taken 11349455 times.
27370176 for (i = 0; i < nb; i++)
1057 16020721 ret = (ret << 1) | get_cabac_bypass(&lc->cc);
1058 11349455 return ret;
1059 }
1060
1061 16515668 void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, const HEVCPPS *pps,
1062 int x0, int y0,
1063 int log2_trafo_size, enum ScanType scan_idx,
1064 int c_idx)
1065 {
1066 #define GET_COORD(offset, n) \
1067 do { \
1068 x_c = (x_cg << 2) + scan_x_off[n]; \
1069 y_c = (y_cg << 2) + scan_y_off[n]; \
1070 } while (0)
1071 16515668 const HEVCContext *const s = lc->parent;
1072 16515668 const HEVCSPS *const sps = pps->sps;
1073 16515668 int transform_skip_flag = 0;
1074
1075 int last_significant_coeff_x, last_significant_coeff_y;
1076 int last_scan_pos;
1077 int n_end;
1078 16515668 int num_coeff = 0;
1079 16515668 int greater1_ctx = 1;
1080
1081 int num_last_subset;
1082 int max_xy, col_limit, clear_rows;
1083 int x_cg_last_sig, y_cg_last_sig;
1084
1085 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1086
1087 16515668 ptrdiff_t stride = s->cur_frame->f->linesize[c_idx];
1088 16515668 int hshift = sps->hshift[c_idx];
1089 16515668 int vshift = sps->vshift[c_idx];
1090 16515668 uint8_t *dst = &s->cur_frame->f->data[c_idx][(y0 >> vshift) * stride +
1091 16515668 ((x0 >> hshift) << sps->pixel_shift)];
1092
2/2
✓ Branch 0 taken 5091833 times.
✓ Branch 1 taken 11423835 times.
16515668 int16_t *coeffs = (int16_t*)(c_idx ? lc->edge_emu_buffer2 : lc->edge_emu_buffer);
1093 16515668 uint8_t significant_coeff_group_flag[8][8] = {{0}};
1094 16515668 int explicit_rdpcm_flag = 0;
1095 int explicit_rdpcm_dir_flag;
1096
1097 16515668 int trafo_size = 1 << log2_trafo_size;
1098 int i;
1099 int qp,shift,add,scale,scale_m;
1100 static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
1101 16515668 const uint8_t *scale_matrix = NULL;
1102 uint8_t dc_scale;
1103
2/2
✓ Branch 0 taken 11423835 times.
✓ Branch 1 taken 5091833 times.
16515668 int pred_mode_intra = (c_idx == 0) ? lc->tu.intra_pred_mode :
1104 lc->tu.intra_pred_mode_c;
1105
1106 // Derive QP for dequant
1107
2/2
✓ Branch 0 taken 16018156 times.
✓ Branch 1 taken 497512 times.
16515668 if (!lc->cu.cu_transquant_bypass_flag) {
1108 static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1109 static const uint8_t rem6[51 + 4 * 6 + 1] = {
1110 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1111 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1112 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1113 4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1114 };
1115
1116 static const uint8_t div6[51 + 4 * 6 + 1] = {
1117 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
1118 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
1119 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1120 10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1121 };
1122 16018156 int qp_y = lc->qp_y;
1123
1124
2/2
✓ Branch 0 taken 12356527 times.
✓ Branch 1 taken 3661629 times.
16018156 if (pps->transform_skip_enabled_flag &&
1125
2/2
✓ Branch 0 taken 7018276 times.
✓ Branch 1 taken 5338251 times.
12356527 log2_trafo_size <= pps->log2_max_transform_skip_block_size) {
1126 7018276 transform_skip_flag = hevc_transform_skip_flag_decode(lc, c_idx);
1127 }
1128
1129
2/2
✓ Branch 0 taken 11113420 times.
✓ Branch 1 taken 4904736 times.
16018156 if (c_idx == 0) {
1130 11113420 qp = qp_y + sps->qp_bd_offset;
1131 } else {
1132 int qp_i, offset;
1133
1134
2/2
✓ Branch 0 taken 2386888 times.
✓ Branch 1 taken 2517848 times.
4904736 if (c_idx == 1)
1135 2386888 offset = pps->cb_qp_offset + s->sh.slice_cb_qp_offset +
1136 2386888 lc->tu.cu_qp_offset_cb;
1137 else
1138 2517848 offset = pps->cr_qp_offset + s->sh.slice_cr_qp_offset +
1139 2517848 lc->tu.cu_qp_offset_cr;
1140
1141 4904736 qp_i = av_clip(qp_y + offset, - sps->qp_bd_offset, 57);
1142
2/2
✓ Branch 0 taken 3038631 times.
✓ Branch 1 taken 1866105 times.
4904736 if (sps->chroma_format_idc == 1) {
1143
2/2
✓ Branch 0 taken 1164618 times.
✓ Branch 1 taken 1874013 times.
3038631 if (qp_i < 30)
1144 1164618 qp = qp_i;
1145
2/2
✓ Branch 0 taken 13523 times.
✓ Branch 1 taken 1860490 times.
1874013 else if (qp_i > 43)
1146 13523 qp = qp_i - 6;
1147 else
1148 1860490 qp = qp_c[qp_i - 30];
1149 } else {
1150
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1866105 times.
1866105 if (qp_i > 51)
1151 qp = 51;
1152 else
1153 1866105 qp = qp_i;
1154 }
1155
1156 4904736 qp += sps->qp_bd_offset;
1157 }
1158
1159 16018156 shift = sps->bit_depth + log2_trafo_size - 5;
1160 16018156 add = 1 << (shift-1);
1161 16018156 scale = level_scale[rem6[qp]] << (div6[qp]);
1162 16018156 scale_m = 16; // default when no custom scaling lists.
1163 16018156 dc_scale = 16;
1164
1165
6/6
✓ Branch 0 taken 744148 times.
✓ Branch 1 taken 15274008 times.
✓ Branch 2 taken 26984 times.
✓ Branch 3 taken 717164 times.
✓ Branch 4 taken 14750 times.
✓ Branch 5 taken 12234 times.
16018156 if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1166 1463828 const ScalingList *sl = pps->scaling_list_data_present_flag ?
1167
2/2
✓ Branch 0 taken 408119 times.
✓ Branch 1 taken 323795 times.
731914 &pps->scaling_list : &sps->scaling_list;
1168 731914 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
1169
1170 731914 matrix_id = 3 * matrix_id + c_idx;
1171
1172 731914 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
1173
2/2
✓ Branch 0 taken 125713 times.
✓ Branch 1 taken 606201 times.
731914 if (log2_trafo_size >= 4)
1174 125713 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
1175 }
1176 } else {
1177 497512 shift = 0;
1178 497512 add = 0;
1179 497512 scale = 0;
1180 497512 dc_scale = 0;
1181 }
1182
1183
6/6
✓ Branch 0 taken 5708700 times.
✓ Branch 1 taken 10806968 times.
✓ Branch 2 taken 225511 times.
✓ Branch 3 taken 5483189 times.
✓ Branch 4 taken 190277 times.
✓ Branch 5 taken 35234 times.
16515668 if (lc->cu.pred_mode == MODE_INTER && sps->explicit_rdpcm_enabled &&
1184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 190277 times.
190277 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1185 35234 explicit_rdpcm_flag = explicit_rdpcm_flag_decode(lc, c_idx);
1186
2/2
✓ Branch 0 taken 3090 times.
✓ Branch 1 taken 32144 times.
35234 if (explicit_rdpcm_flag) {
1187 3090 explicit_rdpcm_dir_flag = explicit_rdpcm_dir_flag_decode(lc, c_idx);
1188 }
1189 }
1190
1191 16515668 last_significant_coeff_xy_prefix_decode(lc, c_idx, log2_trafo_size,
1192 &last_significant_coeff_x, &last_significant_coeff_y);
1193
1194
2/2
✓ Branch 0 taken 2122973 times.
✓ Branch 1 taken 14392695 times.
16515668 if (last_significant_coeff_x > 3) {
1195 2122973 int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_x);
1196 2122973 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1197 2122973 (2 + (last_significant_coeff_x & 1)) +
1198 suffix;
1199 }
1200
1201
2/2
✓ Branch 0 taken 1537189 times.
✓ Branch 1 taken 14978479 times.
16515668 if (last_significant_coeff_y > 3) {
1202 1537189 int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_y);
1203 1537189 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1204 1537189 (2 + (last_significant_coeff_y & 1)) +
1205 suffix;
1206 }
1207
1208
2/2
✓ Branch 0 taken 2037197 times.
✓ Branch 1 taken 14478471 times.
16515668 if (scan_idx == SCAN_VERT)
1209 2037197 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1210
1211 16515668 x_cg_last_sig = last_significant_coeff_x >> 2;
1212 16515668 y_cg_last_sig = last_significant_coeff_y >> 2;
1213
1214
3/3
✓ Branch 0 taken 12192118 times.
✓ Branch 1 taken 2286353 times.
✓ Branch 2 taken 2037197 times.
16515668 switch (scan_idx) {
1215 12192118 case SCAN_DIAG: {
1216 12192118 int last_x_c = last_significant_coeff_x & 3;
1217 12192118 int last_y_c = last_significant_coeff_y & 3;
1218
1219 12192118 scan_x_off = ff_hevc_diag_scan4x4_x;
1220 12192118 scan_y_off = ff_hevc_diag_scan4x4_y;
1221 12192118 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1222
2/2
✓ Branch 0 taken 5714514 times.
✓ Branch 1 taken 6477604 times.
12192118 if (trafo_size == 4) {
1223 5714514 scan_x_cg = scan_1x1;
1224 5714514 scan_y_cg = scan_1x1;
1225
2/2
✓ Branch 0 taken 3358624 times.
✓ Branch 1 taken 3118980 times.
6477604 } else if (trafo_size == 8) {
1226 3358624 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1227 3358624 scan_x_cg = diag_scan2x2_x;
1228 3358624 scan_y_cg = diag_scan2x2_y;
1229
2/2
✓ Branch 0 taken 2274426 times.
✓ Branch 1 taken 844554 times.
3118980 } else if (trafo_size == 16) {
1230 2274426 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1231 2274426 scan_x_cg = ff_hevc_diag_scan4x4_x;
1232 2274426 scan_y_cg = ff_hevc_diag_scan4x4_y;
1233 } else { // trafo_size == 32
1234 844554 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1235 844554 scan_x_cg = ff_hevc_diag_scan8x8_x;
1236 844554 scan_y_cg = ff_hevc_diag_scan8x8_y;
1237 }
1238 12192118 break;
1239 }
1240 2286353 case SCAN_HORIZ:
1241 2286353 scan_x_cg = horiz_scan2x2_x;
1242 2286353 scan_y_cg = horiz_scan2x2_y;
1243 2286353 scan_x_off = horiz_scan4x4_x;
1244 2286353 scan_y_off = horiz_scan4x4_y;
1245 2286353 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1246 2286353 break;
1247 2037197 default: //SCAN_VERT
1248 2037197 scan_x_cg = horiz_scan2x2_y;
1249 2037197 scan_y_cg = horiz_scan2x2_x;
1250 2037197 scan_x_off = horiz_scan4x4_y;
1251 2037197 scan_y_off = horiz_scan4x4_x;
1252 2037197 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1253 2037197 break;
1254 }
1255 16515668 num_coeff++;
1256 16515668 num_last_subset = (num_coeff - 1) >> 4;
1257
1258 16515668 max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1259 16515668 col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1260
2/2
✓ Branch 0 taken 13692160 times.
✓ Branch 1 taken 2823508 times.
16515668 if (max_xy < 4)
1261 13692160 col_limit = FFMIN(4, col_limit);
1262
2/2
✓ Branch 0 taken 2094325 times.
✓ Branch 1 taken 729183 times.
2823508 else if (max_xy < 8)
1263 2094325 col_limit = FFMIN(8, col_limit);
1264
2/2
✓ Branch 0 taken 332927 times.
✓ Branch 1 taken 396256 times.
729183 else if (max_xy < 12)
1265 332927 col_limit = FFMIN(24, col_limit);
1266
1267 // idct_dc reads coeffs[0] only and writes the whole block: no clear needed
1268 16515668 clear_rows = trafo_size;
1269
4/4
✓ Branch 0 taken 16018156 times.
✓ Branch 1 taken 497512 times.
✓ Branch 2 taken 15573854 times.
✓ Branch 3 taken 444302 times.
16515668 if (!lc->cu.cu_transquant_bypass_flag && !transform_skip_flag &&
1270
6/6
✓ Branch 0 taken 10261124 times.
✓ Branch 1 taken 5312730 times.
✓ Branch 2 taken 7018816 times.
✓ Branch 3 taken 3242308 times.
✓ Branch 4 taken 2991967 times.
✓ Branch 5 taken 4026849 times.
15573854 !(lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2)) {
1271
2/2
✓ Branch 0 taken 2806198 times.
✓ Branch 1 taken 8740807 times.
11547005 if (max_xy == 0)
1272 2806198 clear_rows = 0;
1273 }
1274
2/2
✓ Branch 0 taken 13709470 times.
✓ Branch 1 taken 2806198 times.
16515668 if (clear_rows)
1275 13709470 memset(coeffs, 0, clear_rows * trafo_size * sizeof(int16_t));
1276
1277
2/2
✓ Branch 0 taken 28937441 times.
✓ Branch 1 taken 16515668 times.
45453109 for (i = num_last_subset; i >= 0; i--) {
1278 int n, m;
1279 int x_cg, y_cg, x_c, y_c, pos;
1280 28937441 int implicit_non_zero_coeff = 0;
1281 int64_t trans_coeff_level;
1282 28937441 int prev_sig = 0;
1283 28937441 int offset = i << 4;
1284 28937441 int rice_init = 0;
1285
1286 uint8_t significant_coeff_flag_idx[16];
1287 28937441 uint8_t nb_significant_coeff_flag = 0;
1288
1289 28937441 x_cg = scan_x_cg[i];
1290 28937441 y_cg = scan_y_cg[i];
1291
1292
4/4
✓ Branch 0 taken 12421773 times.
✓ Branch 1 taken 16515668 times.
✓ Branch 2 taken 9598265 times.
✓ Branch 3 taken 2823508 times.
28937441 if ((i < num_last_subset) && (i > 0)) {
1293 9598265 int ctx_cg = 0;
1294
2/2
✓ Branch 0 taken 8833998 times.
✓ Branch 1 taken 764267 times.
9598265 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1295 8833998 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1296
2/2
✓ Branch 0 taken 8141690 times.
✓ Branch 1 taken 1456575 times.
9598265 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1297 8141690 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1298
1299 9598265 significant_coeff_group_flag[x_cg][y_cg] =
1300 9598265 significant_coeff_group_flag_decode(lc, c_idx, ctx_cg);
1301 9598265 implicit_non_zero_coeff = 1;
1302 } else {
1303 19339176 significant_coeff_group_flag[x_cg][y_cg] =
1304
5/6
✓ Branch 0 taken 17335008 times.
✓ Branch 1 taken 2004168 times.
✓ Branch 2 taken 819340 times.
✓ Branch 3 taken 16515668 times.
✓ Branch 4 taken 2823508 times.
✗ Branch 5 not taken.
22162684 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1305
1/2
✓ Branch 0 taken 2823508 times.
✗ Branch 1 not taken.
2823508 (x_cg == 0 && y_cg == 0));
1306 }
1307
1308 28937441 last_scan_pos = num_coeff - offset - 1;
1309
1310
2/2
✓ Branch 0 taken 16515668 times.
✓ Branch 1 taken 12421773 times.
28937441 if (i == num_last_subset) {
1311 16515668 n_end = last_scan_pos - 1;
1312 16515668 significant_coeff_flag_idx[0] = last_scan_pos;
1313 16515668 nb_significant_coeff_flag = 1;
1314 } else {
1315 12421773 n_end = 15;
1316 }
1317
1318
2/2
✓ Branch 0 taken 18037884 times.
✓ Branch 1 taken 10899557 times.
28937441 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1319 18037884 prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1320
2/2
✓ Branch 0 taken 17502768 times.
✓ Branch 1 taken 11434673 times.
28937441 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1321
2/2
✓ Branch 0 taken 5943361 times.
✓ Branch 1 taken 11559407 times.
17502768 prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1322
1323
4/4
✓ Branch 0 taken 25248744 times.
✓ Branch 1 taken 3688697 times.
✓ Branch 2 taken 21273499 times.
✓ Branch 3 taken 3975245 times.
28937441 if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1324 // ctx_idx_map composed with the intra-CG scan, indexed by scan position
1325 static const uint8_t ctx_idx_map[3][5 * 16] = {
1326 { // SCAN_DIAG
1327 0, 2, 1, 6, 3, 4, 7, 6, 4, 5, 7, 8, 5, 8, 8, 8, // log2_trafo_size == 2
1328 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0
1329 2, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0, // prev_sig == 1
1330 2, 2, 1, 2, 1, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, // prev_sig == 2
1331 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // default
1332 },
1333 { // SCAN_HORIZ
1334 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8,
1335 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1336 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1337 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0,
1338 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1339 },
1340 { // SCAN_VERT
1341 0, 2, 6, 7, 1, 3, 6, 7, 4, 4, 8, 8, 5, 5, 8, 8,
1342 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1343 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0,
1344 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1345 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1346 },
1347 };
1348 const uint8_t *ctx_idx_map_p;
1349 21273499 int scf_offset = 0;
1350 int nb0;
1351
4/4
✓ Branch 0 taken 1017071 times.
✓ Branch 1 taken 20256428 times.
✓ Branch 2 taken 886760 times.
✓ Branch 3 taken 130311 times.
21273499 if (sps->transform_skip_context_enabled &&
1352
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 886760 times.
886760 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1353 130311 ctx_idx_map_p = &ctx_idx_map[scan_idx][4 * 16];
1354
2/2
✓ Branch 0 taken 61311 times.
✓ Branch 1 taken 69000 times.
130311 if (c_idx == 0) {
1355 61311 scf_offset = 40;
1356 } else {
1357 69000 scf_offset = 14 + 27;
1358 }
1359 } else {
1360
2/2
✓ Branch 0 taken 4665815 times.
✓ Branch 1 taken 16477373 times.
21143188 if (c_idx != 0)
1361 4665815 scf_offset = 27;
1362
2/2
✓ Branch 0 taken 6926383 times.
✓ Branch 1 taken 14216805 times.
21143188 if (log2_trafo_size == 2) {
1363 6926383 ctx_idx_map_p = &ctx_idx_map[scan_idx][0];
1364 } else {
1365 14216805 ctx_idx_map_p = &ctx_idx_map[scan_idx][(prev_sig + 1) << 4];
1366
2/2
✓ Branch 0 taken 11693420 times.
✓ Branch 1 taken 2523385 times.
14216805 if (c_idx == 0) {
1367
4/4
✓ Branch 0 taken 7194773 times.
✓ Branch 1 taken 4498647 times.
✓ Branch 2 taken 2448513 times.
✓ Branch 3 taken 4746260 times.
11693420 if ((x_cg > 0 || y_cg > 0))
1368 6947160 scf_offset += 3;
1369
2/2
✓ Branch 0 taken 4247313 times.
✓ Branch 1 taken 7446107 times.
11693420 if (log2_trafo_size == 3) {
1370
2/2
✓ Branch 0 taken 2979588 times.
✓ Branch 1 taken 1267725 times.
4247313 scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15;
1371 } else {
1372 7446107 scf_offset += 21;
1373 }
1374 } else {
1375
2/2
✓ Branch 0 taken 1205954 times.
✓ Branch 1 taken 1317431 times.
2523385 if (log2_trafo_size == 3)
1376 1205954 scf_offset += 9;
1377 else
1378 1317431 scf_offset += 12;
1379 }
1380 }
1381 }
1382 // the flag is a fresh bin: store always, advance conditionally
1383 21273499 nb0 = nb_significant_coeff_flag;
1384
2/2
✓ Branch 0 taken 195422078 times.
✓ Branch 1 taken 21273499 times.
216695577 for (n = n_end; n > 0; n--) {
1385 195422078 int sig = significant_coeff_flag_decode(lc, n, scf_offset, ctx_idx_map_p);
1386 195422078 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1387 195422078 nb_significant_coeff_flag += sig;
1388 }
1389
2/2
✓ Branch 0 taken 17204811 times.
✓ Branch 1 taken 4068688 times.
21273499 if (nb_significant_coeff_flag != nb0)
1390 17204811 implicit_non_zero_coeff = 0;
1391
2/2
✓ Branch 0 taken 21178404 times.
✓ Branch 1 taken 95095 times.
21273499 if (implicit_non_zero_coeff == 0) {
1392
4/4
✓ Branch 0 taken 1014653 times.
✓ Branch 1 taken 20163751 times.
✓ Branch 2 taken 884736 times.
✓ Branch 3 taken 129917 times.
21178404 if (sps->transform_skip_context_enabled &&
1393
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 884736 times.
884736 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1394
2/2
✓ Branch 0 taken 61056 times.
✓ Branch 1 taken 68861 times.
129917 if (c_idx == 0) {
1395 61056 scf_offset = 42;
1396 } else {
1397 68861 scf_offset = 16 + 27;
1398 }
1399 } else {
1400
2/2
✓ Branch 0 taken 12857330 times.
✓ Branch 1 taken 8191157 times.
21048487 if (i == 0) {
1401
2/2
✓ Branch 0 taken 9530213 times.
✓ Branch 1 taken 3327117 times.
12857330 if (c_idx == 0)
1402 9530213 scf_offset = 0;
1403 else
1404 3327117 scf_offset = 27;
1405 } else {
1406 8191157 scf_offset = 2 + scf_offset;
1407 }
1408 }
1409 21178404 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1410 21178404 nb_significant_coeff_flag +=
1411 21178404 significant_coeff_flag_decode_0(lc, c_idx, scf_offset);
1412 } else {
1413 95095 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1414 95095 nb_significant_coeff_flag++;
1415 }
1416 }
1417
1418 28937441 n_end = nb_significant_coeff_flag;
1419
1420
1421
2/2
✓ Branch 0 taken 25135920 times.
✓ Branch 1 taken 3801521 times.
28937441 if (n_end) {
1422 int first_nz_pos_in_cg;
1423 int last_nz_pos_in_cg;
1424 25135920 int c_rice_param = 0;
1425 25135920 int first_greater1_coeff_idx = -1;
1426 uint8_t coeff_abs_level_greater1_flag[8];
1427 uint16_t coeff_sign_flag;
1428 25135920 int sum_abs = 0;
1429 int sign_hidden;
1430 int sb_type;
1431 25135920 int gt1_mask = 0;
1432
1433
1434 // initialize first elem of coeff_bas_level_greater1_flag
1435
4/4
✓ Branch 0 taken 8733076 times.
✓ Branch 1 taken 16402844 times.
✓ Branch 2 taken 7301972 times.
✓ Branch 3 taken 1431104 times.
25135920 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1436
1437
2/2
✓ Branch 0 taken 1166629 times.
✓ Branch 1 taken 23969291 times.
25135920 if (sps->persistent_rice_adaptation_enabled) {
1438
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)
1439
2/2
✓ Branch 0 taken 365016 times.
✓ Branch 1 taken 682024 times.
1047040 sb_type = 2 * (c_idx == 0 ? 1 : 0);
1440 else
1441
2/2
✓ Branch 0 taken 56576 times.
✓ Branch 1 taken 63013 times.
119589 sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1442 1166629 c_rice_param = lc->stat_coeff[sb_type] / 4;
1443 }
1444
1445
4/4
✓ Branch 0 taken 8620252 times.
✓ Branch 1 taken 16515668 times.
✓ Branch 2 taken 3536549 times.
✓ Branch 3 taken 5083703 times.
25135920 if (!(i == num_last_subset) && greater1_ctx == 0)
1446 3536549 ctx_set++;
1447 25135920 greater1_ctx = 1;
1448 25135920 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1449
1450 // fresh bins: branchless context update, first set index from the mask
1451
2/2
✓ Branch 0 taken 101593454 times.
✓ Branch 1 taken 25135920 times.
126729374 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1452 101593454 int inc = (ctx_set << 2) + greater1_ctx;
1453 101593454 int flag = coeff_abs_level_greater1_flag_decode(lc, c_idx, inc);
1454 101593454 coeff_abs_level_greater1_flag[m] = flag;
1455 101593454 gt1_mask |= flag << m;
1456 101593454 greater1_ctx = (greater1_ctx + (greater1_ctx - 1U < 2)) & (flag - 1);
1457 }
1458
2/2
✓ Branch 0 taken 11127626 times.
✓ Branch 1 taken 14008294 times.
25135920 if (gt1_mask)
1459 11127626 first_greater1_coeff_idx = ff_ctz(gt1_mask);
1460 25135920 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1461
1462
2/2
✓ Branch 0 taken 24339373 times.
✓ Branch 1 taken 796547 times.
25135920 if (lc->cu.cu_transquant_bypass_flag ||
1463
2/2
✓ Branch 0 taken 15137174 times.
✓ Branch 1 taken 9202199 times.
24339373 (lc->cu.pred_mode == MODE_INTRA &&
1464
6/6
✓ Branch 0 taken 902776 times.
✓ Branch 1 taken 14234398 times.
✓ Branch 2 taken 92431 times.
✓ Branch 3 taken 810345 times.
✓ Branch 4 taken 47376 times.
✓ Branch 5 taken 45055 times.
15137174 sps->implicit_rdpcm_enabled && transform_skip_flag &&
1465
4/4
✓ Branch 0 taken 28377 times.
✓ Branch 1 taken 18999 times.
✓ Branch 2 taken 5999 times.
✓ Branch 3 taken 24269320 times.
24294318 (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1466 explicit_rdpcm_flag)
1467 866600 sign_hidden = 0;
1468 else
1469 24269320 sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1470
1471
2/2
✓ Branch 0 taken 11127626 times.
✓ Branch 1 taken 14008294 times.
25135920 if (first_greater1_coeff_idx != -1) {
1472 11127626 coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += coeff_abs_level_greater2_flag_decode(lc, c_idx, ctx_set);
1473 }
1474
4/4
✓ Branch 0 taken 20818278 times.
✓ Branch 1 taken 4317642 times.
✓ Branch 2 taken 9256247 times.
✓ Branch 3 taken 11562031 times.
25135920 if (!pps->sign_data_hiding_flag || !sign_hidden ) {
1475 13573889 coeff_sign_flag = coeff_sign_flag_decode(lc, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1476 } else {
1477 11562031 coeff_sign_flag = coeff_sign_flag_decode(lc, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1478 }
1479
1480
2/2
✓ Branch 0 taken 120689480 times.
✓ Branch 1 taken 25135920 times.
145825400 for (m = 0; m < n_end; m++) {
1481 int64_t sign;
1482
1483 120689480 n = significant_coeff_flag_idx[m];
1484 120689480 GET_COORD(offset, n);
1485
2/2
✓ Branch 0 taken 101593454 times.
✓ Branch 1 taken 19096026 times.
120689480 if (m < 8) {
1486 101593454 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1487
4/4
✓ Branch 0 taken 11127626 times.
✓ Branch 1 taken 90465828 times.
✓ Branch 2 taken 24686370 times.
✓ Branch 3 taken 76907084 times.
101593454 if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1488 24686370 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1489
1490 24686370 trans_coeff_level += last_coeff_abs_level_remaining;
1491
2/2
✓ Branch 0 taken 6388251 times.
✓ Branch 1 taken 18298119 times.
24686370 if (trans_coeff_level > (3 << c_rice_param))
1492
2/2
✓ Branch 0 taken 197734 times.
✓ Branch 1 taken 6190517 times.
6388251 c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1493
4/4
✓ Branch 0 taken 1114125 times.
✓ Branch 1 taken 23572245 times.
✓ Branch 2 taken 315677 times.
✓ Branch 3 taken 798448 times.
24686370 if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1494 315677 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1495
2/2
✓ Branch 0 taken 37785 times.
✓ Branch 1 taken 277892 times.
315677 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1496 37785 lc->stat_coeff[sb_type]++;
1497
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))
1498
2/2
✓ Branch 0 taken 37744 times.
✓ Branch 1 taken 119323 times.
157067 if (lc->stat_coeff[sb_type] > 0)
1499 37744 lc->stat_coeff[sb_type]--;
1500 315677 rice_init = 1;
1501 }
1502 }
1503 } else {
1504 19096026 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1505
1506 19096026 trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1507
2/2
✓ Branch 0 taken 2375876 times.
✓ Branch 1 taken 16720150 times.
19096026 if (trans_coeff_level > (3 << c_rice_param))
1508
2/2
✓ Branch 0 taken 89299 times.
✓ Branch 1 taken 2286577 times.
2375876 c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1509
4/4
✓ Branch 0 taken 938151 times.
✓ Branch 1 taken 18157875 times.
✓ Branch 2 taken 36551 times.
✓ Branch 3 taken 901600 times.
19096026 if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1510 36551 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1511
2/2
✓ Branch 0 taken 1344 times.
✓ Branch 1 taken 35207 times.
36551 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1512 1344 lc->stat_coeff[sb_type]++;
1513
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))
1514
2/2
✓ Branch 0 taken 1307 times.
✓ Branch 1 taken 23297 times.
24604 if (lc->stat_coeff[sb_type] > 0)
1515 1307 lc->stat_coeff[sb_type]--;
1516 36551 rice_init = 1;
1517 }
1518 }
1519
4/4
✓ Branch 0 taken 107839005 times.
✓ Branch 1 taken 12850475 times.
✓ Branch 2 taken 83473528 times.
✓ Branch 3 taken 24365477 times.
120689480 if (pps->sign_data_hiding_flag && sign_hidden) {
1520 83473528 sum_abs += trans_coeff_level;
1521
4/4
✓ Branch 0 taken 11562031 times.
✓ Branch 1 taken 71911497 times.
✓ Branch 2 taken 5773575 times.
✓ Branch 3 taken 5788456 times.
83473528 if (n == first_nz_pos_in_cg && (sum_abs&1))
1522 5773575 trans_coeff_level = -trans_coeff_level;
1523 }
1524 // equiprobable sign: apply it branchless
1525 120689480 sign = -(int64_t)(coeff_sign_flag >> 15);
1526 120689480 trans_coeff_level = (trans_coeff_level ^ sign) - sign;
1527 120689480 coeff_sign_flag <<= 1;
1528
2/2
✓ Branch 0 taken 110876128 times.
✓ Branch 1 taken 9813352 times.
120689480 if(!lc->cu.cu_transquant_bypass_flag) {
1529
6/6
✓ Branch 0 taken 4091462 times.
✓ Branch 1 taken 106784666 times.
✓ Branch 2 taken 191974 times.
✓ Branch 3 taken 3899488 times.
✓ Branch 4 taken 31948 times.
✓ Branch 5 taken 160026 times.
110876128 if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1530
6/6
✓ Branch 0 taken 1255122 times.
✓ Branch 1 taken 2676314 times.
✓ Branch 2 taken 556512 times.
✓ Branch 3 taken 698610 times.
✓ Branch 4 taken 462436 times.
✓ Branch 5 taken 94076 times.
3931436 if(y_c || x_c || log2_trafo_size < 4) {
1531
4/4
✓ Branch 0 taken 990157 times.
✓ Branch 1 taken 1171225 times.
✓ Branch 2 taken 442599 times.
✓ Branch 3 taken 1233379 times.
3837360 switch(log2_trafo_size) {
1532 990157 case 3: pos = (y_c << 3) + x_c; break;
1533 1171225 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1534 442599 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1535 1233379 default: pos = (y_c << 2) + x_c; break;
1536 }
1537 3837360 scale_m = scale_matrix[pos];
1538 } else {
1539 94076 scale_m = dc_scale;
1540 }
1541 }
1542 110876128 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1543 110876128 trans_coeff_level = FFMAX(FFMIN(trans_coeff_level, 32767), -32768);
1544 }
1545 120689480 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1546 }
1547 }
1548 }
1549
1550
2/2
✓ Branch 0 taken 497512 times.
✓ Branch 1 taken 16018156 times.
16515668 if (lc->cu.cu_transquant_bypass_flag) {
1551
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 &&
1552 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1553 int mode = sps->implicit_rdpcm_enabled ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1554
1555 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1556 }
1557 } else {
1558
2/2
✓ Branch 0 taken 444302 times.
✓ Branch 1 taken 15573854 times.
16018156 if (transform_skip_flag) {
1559
2/2
✓ Branch 0 taken 54609 times.
✓ Branch 1 taken 21520 times.
76129 int rot = sps->transform_skip_rotation_enabled &&
1560
2/2
✓ Branch 0 taken 76129 times.
✓ Branch 1 taken 368173 times.
520431 log2_trafo_size == 2 &&
1561
2/2
✓ Branch 0 taken 20826 times.
✓ Branch 1 taken 33783 times.
54609 lc->cu.pred_mode == MODE_INTRA;
1562
2/2
✓ Branch 0 taken 20826 times.
✓ Branch 1 taken 423476 times.
444302 if (rot) {
1563
2/2
✓ Branch 0 taken 166608 times.
✓ Branch 1 taken 20826 times.
187434 for (i = 0; i < 8; i++)
1564 166608 FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]);
1565 }
1566
1567 444302 s->hevcdsp.dequant(coeffs, log2_trafo_size);
1568
1569
4/4
✓ Branch 0 taken 441212 times.
✓ Branch 1 taken 3090 times.
✓ Branch 2 taken 73039 times.
✓ Branch 3 taken 368173 times.
444302 if (explicit_rdpcm_flag || (sps->implicit_rdpcm_enabled &&
1570
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 &&
1571
2/2
✓ Branch 0 taken 8263 times.
✓ Branch 1 taken 16922 times.
25185 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1572
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);
1573
1574 27063 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1575 }
1576
6/6
✓ Branch 0 taken 10261124 times.
✓ Branch 1 taken 5312730 times.
✓ Branch 2 taken 7018816 times.
✓ Branch 3 taken 3242308 times.
✓ Branch 4 taken 4026849 times.
✓ Branch 5 taken 2991967 times.
15573854 } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) {
1577 4026849 s->hevcdsp.transform_4x4_luma(coeffs);
1578 } else {
1579
2/2
✓ Branch 0 taken 2806198 times.
✓ Branch 1 taken 8740807 times.
11547005 if (max_xy == 0)
1580 2806198 s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1581 else
1582 8740807 s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1583 }
1584 }
1585
2/2
✓ Branch 0 taken 269268 times.
✓ Branch 1 taken 16246400 times.
16515668 if (lc->tu.cross_pf) {
1586 269268 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1587
1588
2/2
✓ Branch 0 taken 20252880 times.
✓ Branch 1 taken 269268 times.
20522148 for (i = 0; i < (trafo_size * trafo_size); i++) {
1589 20252880 coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1590 }
1591 }
1592 16515668 s->hevcdsp.add_residual[log2_trafo_size-2](dst, coeffs, stride);
1593 16515668 }
1594
1595 3094397 void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size)
1596 {
1597 3094397 int x = abs_mvd_greater0_flag_decode(lc);
1598 3094397 int y = abs_mvd_greater0_flag_decode(lc);
1599
1600
2/2
✓ Branch 0 taken 2179263 times.
✓ Branch 1 taken 915134 times.
3094397 if (x)
1601 2179263 x += abs_mvd_greater1_flag_decode(lc);
1602
2/2
✓ Branch 0 taken 2094257 times.
✓ Branch 1 taken 1000140 times.
3094397 if (y)
1603 2094257 y += abs_mvd_greater1_flag_decode(lc);
1604
1605
3/4
✓ Branch 0 taken 1558043 times.
✓ Branch 1 taken 621220 times.
✓ Branch 2 taken 915134 times.
✗ Branch 3 not taken.
3094397 switch (x) {
1606 1558043 case 2: lc->pu.mvd.x = mvd_decode(lc); break;
1607 621220 case 1: lc->pu.mvd.x = mvd_sign_flag_decode(lc); break;
1608 915134 case 0: lc->pu.mvd.x = 0; break;
1609 }
1610
1611
3/4
✓ Branch 0 taken 1458699 times.
✓ Branch 1 taken 635558 times.
✓ Branch 2 taken 1000140 times.
✗ Branch 3 not taken.
3094397 switch (y) {
1612 1458699 case 2: lc->pu.mvd.y = mvd_decode(lc); break;
1613 635558 case 1: lc->pu.mvd.y = mvd_sign_flag_decode(lc); break;
1614 1000140 case 0: lc->pu.mvd.y = 0; break;
1615 }
1616 3094397 }
1617