FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/hevc/cabac.c
Date: 2026-09-17 13:51:07
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 1941353 void ff_hevc_save_states(HEVCLocalContext *lc, const HEVCPPS *pps,
403 int ctb_addr_ts)
404 {
405 1941353 const HEVCSPS *const sps = pps->sps;
406
2/2
✓ Branch 0 taken 168556 times.
✓ Branch 1 taken 1772797 times.
1941353 if (pps->entropy_coding_sync_enabled_flag &&
407
2/2
✓ Branch 0 taken 161382 times.
✓ Branch 1 taken 7174 times.
168556 (ctb_addr_ts % sps->ctb_width == 2 ||
408
2/2
✓ Branch 0 taken 768 times.
✓ Branch 1 taken 160614 times.
161382 (sps->ctb_width == 2 &&
409
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 384 times.
768 ctb_addr_ts % sps->ctb_width == 0))) {
410 7558 memcpy(lc->common_cabac_state->state, lc->cabac_state, HEVC_CONTEXTS);
411
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 7522 times.
7558 if (sps->persistent_rice_adaptation_enabled) {
412 36 memcpy(lc->common_cabac_state->stat_coeff, lc->stat_coeff, HEVC_STAT_COEFFS);
413 }
414 }
415 1941353 }
416
417 6283 static void load_states(HEVCLocalContext *lc, const HEVCSPS *sps)
418 {
419 6283 memcpy(lc->cabac_state, lc->common_cabac_state->state, HEVC_CONTEXTS);
420
2/2
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 6250 times.
6283 if (sps->persistent_rice_adaptation_enabled) {
421 33 memcpy(lc->stat_coeff, lc->common_cabac_state->stat_coeff, HEVC_STAT_COEFFS);
422 }
423 6283 }
424
425 9862 static int cabac_reinit(HEVCLocalContext *lc)
426 {
427
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 9862 times.
9862 return skip_bytes(&lc->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
428 }
429
430 25667 static void cabac_init_state(HEVCLocalContext *lc, const HEVCContext *s)
431 {
432 25667 int init_type = 2 - s->sh.slice_type;
433 int i;
434
435
4/4
✓ Branch 0 taken 6607 times.
✓ Branch 1 taken 19060 times.
✓ Branch 2 taken 6463 times.
✓ Branch 3 taken 144 times.
25667 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 5107733 times.
✓ Branch 1 taken 25667 times.
5133400 for (i = 0; i < HEVC_CONTEXTS; i++) {
439 5107733 int init_value = init_values[init_type][i];
440 5107733 int m = (init_value >> 4) * 5 - 45;
441 5107733 int n = ((init_value & 15) << 3) - 16;
442 5107733 int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
443
444 5107733 pre ^= pre >> 31;
445
2/2
✓ Branch 0 taken 524466 times.
✓ Branch 1 taken 4583267 times.
5107733 if (pre > 124)
446 524466 pre = 124 + (pre & 1);
447 5107733 lc->cabac_state[i] = pre;
448 }
449
450
2/2
✓ Branch 0 taken 102668 times.
✓ Branch 1 taken 25667 times.
128335 for (i = 0; i < 4; i++)
451 102668 lc->stat_coeff[i] = 0;
452 25667 }
453
454 1941354 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 1941354 const HEVCContext *const s = lc->parent;
459 1941354 const HEVCSPS *const sps = pps->sps;
460
461
2/2
✓ Branch 0 taken 28346 times.
✓ Branch 1 taken 1913008 times.
1941354 if (ctb_addr_ts == pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) {
462 28346 int ret = ff_init_cabac_decoder(&lc->cc, data, size);
463
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28346 times.
28346 if (ret < 0)
464 return ret;
465
2/2
✓ Branch 0 taken 7794 times.
✓ Branch 1 taken 20552 times.
28346 if (s->sh.dependent_slice_segment_flag == 0 ||
466
2/2
✓ Branch 0 taken 844 times.
✓ Branch 1 taken 6950 times.
7794 (pps->tiles_enabled_flag &&
467
2/2
✓ Branch 0 taken 298 times.
✓ Branch 1 taken 546 times.
844 pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]))
468 20850 cabac_init_state(lc, s);
469
470
2/2
✓ Branch 0 taken 17996 times.
✓ Branch 1 taken 10350 times.
28346 if (!s->sh.first_slice_in_pic_flag &&
471
2/2
✓ Branch 0 taken 3820 times.
✓ Branch 1 taken 14176 times.
17996 pps->entropy_coding_sync_enabled_flag) {
472
2/2
✓ Branch 0 taken 1620 times.
✓ Branch 1 taken 2200 times.
3820 if (ctb_addr_ts % sps->ctb_width == 0) {
473
2/2
✓ Branch 0 taken 92 times.
✓ Branch 1 taken 1528 times.
1620 if (sps->ctb_width == 1)
474 92 cabac_init_state(lc, s);
475
2/2
✓ Branch 0 taken 1146 times.
✓ Branch 1 taken 382 times.
1528 else if (s->sh.dependent_slice_segment_flag == 1)
476 1146 load_states(lc, sps);
477 }
478 }
479 } else {
480
2/2
✓ Branch 0 taken 652167 times.
✓ Branch 1 taken 1260841 times.
1913008 if (pps->tiles_enabled_flag &&
481
2/2
✓ Branch 0 taken 4529 times.
✓ Branch 1 taken 647638 times.
652167 pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]) {
482 int ret;
483
1/2
✓ Branch 0 taken 4529 times.
✗ Branch 1 not taken.
4529 if (!is_wpp)
484 4529 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 4529 times.
4529 if (ret < 0)
489 return ret;
490 4529 cabac_init_state(lc, s);
491 }
492
2/2
✓ Branch 0 taken 163747 times.
✓ Branch 1 taken 1749261 times.
1913008 if (pps->entropy_coding_sync_enabled_flag) {
493
2/2
✓ Branch 0 taken 5333 times.
✓ Branch 1 taken 158414 times.
163747 if (ctb_addr_ts % sps->ctb_width == 0) {
494 int ret;
495 5333 get_cabac_terminate(&lc->cc);
496
1/2
✓ Branch 0 taken 5333 times.
✗ Branch 1 not taken.
5333 if (!is_wpp)
497 5333 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 5333 times.
5333 if (ret < 0)
502 return ret;
503
504
2/2
✓ Branch 0 taken 196 times.
✓ Branch 1 taken 5137 times.
5333 if (sps->ctb_width == 1)
505 196 cabac_init_state(lc, s);
506 else
507 5137 load_states(lc, sps);
508 }
509 }
510 }
511 1941354 return 0;
512 }
513
514 #define GET_CABAC(ctx) get_cabac(&lc->cc, &lc->cabac_state[ctx])
515
516 1430222 int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc)
517 {
518 1430222 return GET_CABAC(SAO_MERGE_FLAG_OFFSET);
519 }
520
521 561205 int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc)
522 {
523
2/2
✓ Branch 1 taken 390736 times.
✓ Branch 2 taken 170469 times.
561205 if (!GET_CABAC(SAO_TYPE_IDX_OFFSET))
524 390736 return 0;
525
526
2/2
✓ Branch 1 taken 50547 times.
✓ Branch 2 taken 119922 times.
170469 if (!get_cabac_bypass(&lc->cc))
527 50547 return SAO_BAND;
528 119922 return SAO_EDGE;
529 }
530
531 72036 int ff_hevc_sao_band_position_decode(HEVCLocalContext *lc)
532 {
533 int i;
534 72036 int value = get_cabac_bypass(&lc->cc);
535
536
2/2
✓ Branch 0 taken 288144 times.
✓ Branch 1 taken 72036 times.
360180 for (i = 0; i < 4; i++)
537 288144 value = (value << 1) | get_cabac_bypass(&lc->cc);
538 72036 return value;
539 }
540
541 875640 int ff_hevc_sao_offset_abs_decode(HEVCLocalContext *lc, int bit_depth)
542 {
543 875640 int i = 0;
544 875640 int length = (1 << (FFMIN(bit_depth, 10) - 5)) - 1;
545
546
4/4
✓ Branch 0 taken 2409493 times.
✓ Branch 1 taken 118188 times.
✓ Branch 3 taken 1652041 times.
✓ Branch 4 taken 757452 times.
2527681 while (i < length && get_cabac_bypass(&lc->cc))
547 1652041 i++;
548 875640 return i;
549 }
550
551 223920 int ff_hevc_sao_offset_sign_decode(HEVCLocalContext *lc)
552 {
553 223920 return get_cabac_bypass(&lc->cc);
554 }
555
556 119922 int ff_hevc_sao_eo_class_decode(HEVCLocalContext *lc)
557 {
558 119922 int ret = get_cabac_bypass(&lc->cc) << 1;
559 119922 ret |= get_cabac_bypass(&lc->cc);
560 119922 return ret;
561 }
562
563 1941353 int ff_hevc_end_of_slice_flag_decode(HEVCLocalContext *lc)
564 {
565 1941353 return get_cabac_terminate(&lc->cc);
566 }
567
568 179649 int ff_hevc_cu_transquant_bypass_flag_decode(HEVCLocalContext *lc)
569 {
570 179649 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 920242 int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc)
587 {
588 920242 int prefix_val = 0;
589 920242 int suffix_val = 0;
590 920242 int inc = 0;
591
592
4/4
✓ Branch 0 taken 2062223 times.
✓ Branch 1 taken 141978 times.
✓ Branch 3 taken 1283959 times.
✓ Branch 4 taken 778264 times.
2204201 while (prefix_val < 5 && GET_CABAC(CU_QP_DELTA_OFFSET + inc)) {
593 1283959 prefix_val++;
594 1283959 inc = 1;
595 }
596
2/2
✓ Branch 0 taken 141978 times.
✓ Branch 1 taken 778264 times.
920242 if (prefix_val >= 5) {
597 141978 int k = 0;
598
3/4
✓ Branch 0 taken 438128 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 296150 times.
✓ Branch 4 taken 141978 times.
438128 while (k < 7 && get_cabac_bypass(&lc->cc)) {
599 296150 suffix_val += 1 << k;
600 296150 k++;
601 }
602
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 141978 times.
141978 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 296150 times.
✓ Branch 1 taken 141978 times.
438128 while (k--)
608 296150 suffix_val += get_cabac_bypass(&lc->cc) << k;
609 }
610 920242 return prefix_val + suffix_val;
611 }
612
613 485048 int ff_hevc_cu_qp_delta_sign_flag(HEVCLocalContext *lc)
614 {
615 485048 return get_cabac_bypass(&lc->cc);
616 }
617
618 228078 int ff_hevc_cu_chroma_qp_offset_flag(HEVCLocalContext *lc)
619 {
620 228078 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 8723164 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 8723164 int inc = 0, depth_left = 0, depth_top = 0;
644 8723164 int x0b = av_zero_extend(x0, sps->log2_ctb_size);
645 8723164 int y0b = av_zero_extend(y0, sps->log2_ctb_size);
646 8723164 int x_cb = x0 >> sps->log2_min_cb_size;
647 8723164 int y_cb = y0 >> sps->log2_min_cb_size;
648
649
4/4
✓ Branch 0 taken 741785 times.
✓ Branch 1 taken 7981379 times.
✓ Branch 2 taken 405238 times.
✓ Branch 3 taken 336547 times.
8723164 if (lc->ctb_left_flag || x0b)
650 8386617 depth_left = tab_ct_depth[(y_cb) * sps->min_cb_width + x_cb - 1];
651
4/4
✓ Branch 0 taken 1489524 times.
✓ Branch 1 taken 7233640 times.
✓ Branch 2 taken 823035 times.
✓ Branch 3 taken 666489 times.
8723164 if (lc->ctb_up_flag || y0b)
652 8056675 depth_top = tab_ct_depth[(y_cb - 1) * sps->min_cb_width + x_cb];
653
654 8723164 inc += (depth_left > ct_depth);
655 8723164 inc += (depth_top > ct_depth);
656
657 8723164 return GET_CABAC(SPLIT_CODING_UNIT_FLAG_OFFSET + inc);
658 }
659
660 6776403 int ff_hevc_part_mode_decode(HEVCLocalContext *lc, const HEVCSPS *sps, int log2_cb_size)
661 {
662
2/2
✓ Branch 1 taken 4216179 times.
✓ Branch 2 taken 2560224 times.
6776403 if (GET_CABAC(PART_MODE_OFFSET)) // 1
663 4216179 return PART_2Nx2N;
664
2/2
✓ Branch 0 taken 1816472 times.
✓ Branch 1 taken 743752 times.
2560224 if (log2_cb_size == sps->log2_min_cb_size) {
665
2/2
✓ Branch 0 taken 1041311 times.
✓ Branch 1 taken 775161 times.
1816472 if (lc->cu.pred_mode == MODE_INTRA) // 0
666 1041311 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 126478 int ff_hevc_pcm_flag_decode(HEVCLocalContext *lc)
698 {
699 126478 return get_cabac_terminate(&lc->cc);
700 }
701
702 6761317 int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCLocalContext *lc)
703 {
704 6761317 return GET_CABAC(PREV_INTRA_LUMA_PRED_FLAG_OFFSET);
705 }
706
707 4012676 int ff_hevc_mpm_idx_decode(HEVCLocalContext *lc)
708 {
709 4012676 int i = 0;
710
4/4
✓ Branch 0 taken 5996182 times.
✓ Branch 1 taken 840696 times.
✓ Branch 3 taken 2824202 times.
✓ Branch 4 taken 3171980 times.
6836878 while (i < 2 && get_cabac_bypass(&lc->cc))
711 2824202 i++;
712 4012676 return i;
713 }
714
715 2748641 int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCLocalContext *lc)
716 {
717 int i;
718 2748641 int value = get_cabac_bypass(&lc->cc);
719
720
2/2
✓ Branch 0 taken 10994564 times.
✓ Branch 1 taken 2748641 times.
13743205 for (i = 0; i < 4; i++)
721 10994564 value = (value << 1) | get_cabac_bypass(&lc->cc);
722 2748641 return value;
723 }
724
725 3693220 int ff_hevc_intra_chroma_pred_mode_decode(HEVCLocalContext *lc)
726 {
727 int ret;
728
2/2
✓ Branch 1 taken 2804411 times.
✓ Branch 2 taken 888809 times.
3693220 if (!GET_CABAC(INTRA_CHROMA_PRED_MODE_OFFSET))
729 2804411 return 4;
730
731 888809 ret = get_cabac_bypass(&lc->cc) << 1;
732 888809 ret |= get_cabac_bypass(&lc->cc);
733 888809 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 6813560 int ff_hevc_split_transform_flag_decode(HEVCLocalContext *lc, int log2_trafo_size)
822 {
823 6813560 return GET_CABAC(SPLIT_TRANSFORM_FLAG_OFFSET + 5 - log2_trafo_size);
824 }
825
826 15503724 int ff_hevc_cbf_cb_cr_decode(HEVCLocalContext *lc, int trafo_depth)
827 {
828 15503724 return GET_CABAC(CBF_CB_CR_OFFSET + trafo_depth);
829 }
830
831 14308675 int ff_hevc_cbf_luma_decode(HEVCLocalContext *lc, int trafo_depth)
832 {
833
2/2
✓ Branch 0 taken 2729557 times.
✓ Branch 1 taken 11579118 times.
14308675 return GET_CABAC(CBF_LUMA_OFFSET + !trafo_depth);
834 }
835
836 5689341 static int hevc_transform_skip_flag_decode(HEVCLocalContext *lc, int c_idx)
837 {
838
2/2
✓ Branch 0 taken 1846000 times.
✓ Branch 1 taken 3843341 times.
5689341 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 251428 int ff_hevc_log2_res_scale_abs(HEVCLocalContext *lc, int idx)
852 {
853 251428 int i =0;
854
855
4/4
✓ Branch 0 taken 668172 times.
✓ Branch 1 taken 84789 times.
✓ Branch 3 taken 501533 times.
✓ Branch 4 taken 166639 times.
752961 while (i < 4 && GET_CABAC(LOG2_RES_SCALE_ABS_OFFSET + 4 * idx + i))
856 501533 i++;
857
858 251428 return i;
859 }
860
861 142161 int ff_hevc_res_scale_sign_flag(HEVCLocalContext *lc, int idx)
862 {
863 142161 return GET_CABAC(RES_SCALE_SIGN_FLAG_OFFSET + idx);
864 }
865
866 13856802 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 13856802 int i = 0;
870 13856802 int max = (log2_size << 1) - 1;
871 int ctx_offset, ctx_shift;
872
873
2/2
✓ Branch 0 taken 9744111 times.
✓ Branch 1 taken 4112691 times.
13856802 if (!c_idx) {
874 9744111 ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2);
875 9744111 ctx_shift = (log2_size + 1) >> 2;
876 } else {
877 4112691 ctx_offset = 15;
878 4112691 ctx_shift = log2_size - 2;
879 }
880
4/4
✓ Branch 0 taken 33682870 times.
✓ Branch 1 taken 1857489 times.
✓ Branch 2 taken 21683557 times.
✓ Branch 3 taken 11999313 times.
69223229 while (i < max &&
881 33682870 GET_CABAC(LAST_SIGNIFICANT_COEFF_X_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
882 21683557 i++;
883 13856802 *last_scx_prefix = i;
884
885 13856802 i = 0;
886
4/4
✓ Branch 0 taken 29484096 times.
✓ Branch 1 taken 1486990 times.
✓ Branch 2 taken 17114284 times.
✓ Branch 3 taken 12369812 times.
60455182 while (i < max &&
887 29484096 GET_CABAC(LAST_SIGNIFICANT_COEFF_Y_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
888 17114284 i++;
889 13856802 *last_scy_prefix = i;
890 13856802 }
891
892 3114274 static av_always_inline int last_significant_coeff_suffix_decode(HEVCLocalContext *lc,
893 int last_significant_coeff_prefix)
894 {
895 int i;
896 3114274 int length = (last_significant_coeff_prefix >> 1) - 1;
897 3114274 int value = get_cabac_bypass(&lc->cc);
898
899
2/2
✓ Branch 0 taken 857022 times.
✓ Branch 1 taken 3114274 times.
3971296 for (i = 1; i < length; i++)
900 857022 value = (value << 1) | get_cabac_bypass(&lc->cc);
901 3114274 return value;
902 }
903
904 8105094 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 1121392 times.
✓ Branch 1 taken 6983702 times.
8105094 inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
909
910 8105094 return GET_CABAC(SIGNIFICANT_COEFF_GROUP_FLAG_OFFSET + inc);
911 }
912 165337250 static av_always_inline int significant_coeff_flag_decode(HEVCLocalContext *lc, int n,
913 int offset, const uint8_t *ctx_idx_map)
914 {
915 165337250 int inc = ctx_idx_map[n] + offset;
916 165337250 return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + inc);
917 }
918
919 17840312 static av_always_inline int significant_coeff_flag_decode_0(HEVCLocalContext *lc, int c_idx, int offset)
920 {
921 17840312 return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + offset);
922 }
923
924 85187822 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 18153708 times.
✓ Branch 1 taken 67034114 times.
85187822 if (c_idx > 0)
928 18153708 inc += 16;
929
930 85187822 return GET_CABAC(COEFF_ABS_LEVEL_GREATER1_FLAG_OFFSET + inc);
931 }
932
933 9273048 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 1765324 times.
✓ Branch 1 taken 7507724 times.
9273048 if (c_idx > 0)
936 1765324 inc += 4;
937
938 9273048 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 17109686 static int cabac_bypass_bits(CABACContext *c, int n)
943 {
944 17109686 int avail = CABAC_BITS - ff_ctz(c->low);
945 17109686 uint64_t x, r = (uint64_t)c->range << (CABAC_BITS + 1);
946 17109686 const uint8_t *bytestream = c->bytestream;
947
948
2/2
✓ Branch 0 taken 10668638 times.
✓ Branch 1 taken 6441048 times.
17109686 if (n < avail) {
949 10668638 x = (uint64_t)c->low << n;
950 } else {
951 6441048 int fill = (bytestream[0] << 9) + (bytestream[1] << 1) - CABAC_MASK;
952
953 6441048 x = (uint64_t)((((int64_t)c->low << avail) + fill)) << (n - avail);
954 #if !UNCHECKED_BITSTREAM_READER
955
2/2
✓ Branch 0 taken 6440865 times.
✓ Branch 1 taken 183 times.
6441048 if (bytestream < c->bytestream_end)
956 #endif
957 6440865 bytestream += CABAC_BITS / 8;
958 }
959
960
1/2
✓ Branch 0 taken 17109686 times.
✗ Branch 1 not taken.
17109686 if (x < r << n) {
961 17109686 c->low = x % r;
962 17109686 c->bytestream = bytestream;
963 17109686 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 36692114 static int cabac_unary_prefix(CABACContext *c, int max)
975 {
976 36692114 int prefix = 0;
977
978
1/2
✓ Branch 0 taken 41985745 times.
✗ Branch 1 not taken.
41985745 while (prefix < max) {
979 41985745 int avail = CABAC_BITS - ff_ctz(c->low);
980 41985745 int n = FFMIN(avail - 1, max - prefix);
981 41985745 uint64_t r = (uint64_t)c->range << (CABAC_BITS + 1);
982 41985745 uint64_t x = (uint64_t)c->low << n;
983 int q, t;
984
985
3/4
✓ Branch 0 taken 37044486 times.
✓ Branch 1 taken 4941259 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 37044486 times.
41985745 if (n < 1 || x >= r << n) {
986
2/2
✓ Branch 1 taken 2293858 times.
✓ Branch 2 taken 2647401 times.
4941259 if (!get_cabac_bypass(c))
987 2293858 return prefix;
988 2647401 prefix++;
989 2647401 continue;
990 }
991
992 37044486 q = x / r;
993 37044486 t = ~q & ((1 << n) - 1);
994
2/2
✓ Branch 0 taken 34398256 times.
✓ Branch 1 taken 2646230 times.
37044486 if (t) {
995 34398256 int p = n - 1 - av_log2(t);
996 34398256 int k = n - (p + 1);
997
998 34398256 c->low = (x >> k) - ((uint64_t)(q >> k) * r);
999 34398256 return prefix + p;
1000 }
1001 2646230 c->low = x - (uint64_t)q * r;
1002 2646230 prefix += n;
1003 }
1004 return prefix;
1005 }
1006
1007 36692114 static av_always_inline int coeff_abs_level_remaining_decode(HEVCLocalContext *lc, int rc_rice_param)
1008 {
1009 int prefix;
1010 36692114 int suffix = 0;
1011 int last_coeff_abs_level_remaining;
1012 int i;
1013
1014 36692114 prefix = cabac_unary_prefix(&lc->cc, CABAC_MAX_BIN);
1015
1016
2/2
✓ Branch 0 taken 31679848 times.
✓ Branch 1 taken 5012266 times.
36692114 if (prefix < 3) {
1017
2/2
✓ Branch 0 taken 3398851 times.
✓ Branch 1 taken 28280997 times.
31679848 if (rc_rice_param > 2)
1018 3398851 suffix = cabac_bypass_bits(&lc->cc, rc_rice_param);
1019 else
1020
2/2
✓ Branch 0 taken 19417423 times.
✓ Branch 1 taken 28280997 times.
47698420 for (i = 0; i < rc_rice_param; i++)
1021 19417423 suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
1022 31679848 last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix;
1023 } else {
1024 5012266 int prefix_minus3 = prefix - 3;
1025 int k;
1026
1027
2/4
✓ Branch 0 taken 5012266 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5012266 times.
5012266 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 5012266 k = prefix_minus3 + rc_rice_param;
1033
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5012266 times.
5012266 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 2168439 times.
✓ Branch 1 taken 2843827 times.
5012266 } else if (k > 2) {
1037 2168439 suffix = cabac_bypass_bits(&lc->cc, k);
1038 } else {
1039
2/2
✓ Branch 0 taken 2784048 times.
✓ Branch 1 taken 2843827 times.
5627875 for (i = 0; i < k; i++)
1040 2784048 suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
1041 }
1042 5012266 last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
1043 5012266 << rc_rice_param) + suffix;
1044 }
1045 36692114 return last_coeff_abs_level_remaining;
1046 }
1047
1048 21194046 static av_always_inline int coeff_sign_flag_decode(HEVCLocalContext *lc, uint8_t nb)
1049 {
1050 int i;
1051 21194046 int ret = 0;
1052
1053
2/2
✓ Branch 0 taken 11542396 times.
✓ Branch 1 taken 9651650 times.
21194046 if (nb > 2)
1054 11542396 return cabac_bypass_bits(&lc->cc, nb);
1055
1056
2/2
✓ Branch 0 taken 13614892 times.
✓ Branch 1 taken 9651650 times.
23266542 for (i = 0; i < nb; i++)
1057 13614892 ret = (ret << 1) | get_cabac_bypass(&lc->cc);
1058 9651650 return ret;
1059 }
1060
1061 13856802 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 13856802 const HEVCContext *const s = lc->parent;
1072 13856802 const HEVCSPS *const sps = pps->sps;
1073 13856802 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 13856802 int num_coeff = 0;
1079 13856802 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 13856802 ptrdiff_t stride = s->cur_frame->f->linesize[c_idx];
1088 13856802 int hshift = sps->hshift[c_idx];
1089 13856802 int vshift = sps->vshift[c_idx];
1090 13856802 uint8_t *dst = &s->cur_frame->f->data[c_idx][(y0 >> vshift) * stride +
1091 13856802 ((x0 >> hshift) << sps->pixel_shift)];
1092
2/2
✓ Branch 0 taken 4112691 times.
✓ Branch 1 taken 9744111 times.
13856802 int16_t *coeffs = (int16_t*)(c_idx ? lc->edge_emu_buffer2 : lc->edge_emu_buffer);
1093 13856802 uint8_t significant_coeff_group_flag[8][8] = {{0}};
1094 13856802 int explicit_rdpcm_flag = 0;
1095 int explicit_rdpcm_dir_flag;
1096
1097 13856802 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 13856802 const uint8_t *scale_matrix = NULL;
1102 uint8_t dc_scale;
1103
2/2
✓ Branch 0 taken 9744111 times.
✓ Branch 1 taken 4112691 times.
13856802 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 13436094 times.
✓ Branch 1 taken 420708 times.
13856802 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 13436094 int qp_y = lc->qp_y;
1123
1124
2/2
✓ Branch 0 taken 10291427 times.
✓ Branch 1 taken 3144667 times.
13436094 if (pps->transform_skip_enabled_flag &&
1125
2/2
✓ Branch 0 taken 5689341 times.
✓ Branch 1 taken 4602086 times.
10291427 log2_trafo_size <= pps->log2_max_transform_skip_block_size) {
1126 5689341 transform_skip_flag = hevc_transform_skip_flag_decode(lc, c_idx);
1127 }
1128
1129
2/2
✓ Branch 0 taken 9484758 times.
✓ Branch 1 taken 3951336 times.
13436094 if (c_idx == 0) {
1130 9484758 qp = qp_y + sps->qp_bd_offset;
1131 } else {
1132 int qp_i, offset;
1133
1134
2/2
✓ Branch 0 taken 1895990 times.
✓ Branch 1 taken 2055346 times.
3951336 if (c_idx == 1)
1135 1895990 offset = pps->cb_qp_offset + s->sh.slice_cb_qp_offset +
1136 1895990 lc->tu.cu_qp_offset_cb;
1137 else
1138 2055346 offset = pps->cr_qp_offset + s->sh.slice_cr_qp_offset +
1139 2055346 lc->tu.cu_qp_offset_cr;
1140
1141 3951336 qp_i = av_clip(qp_y + offset, - sps->qp_bd_offset, 57);
1142
2/2
✓ Branch 0 taken 2555024 times.
✓ Branch 1 taken 1396312 times.
3951336 if (sps->chroma_format_idc == 1) {
1143
2/2
✓ Branch 0 taken 952042 times.
✓ Branch 1 taken 1602982 times.
2555024 if (qp_i < 30)
1144 952042 qp = qp_i;
1145
2/2
✓ Branch 0 taken 11213 times.
✓ Branch 1 taken 1591769 times.
1602982 else if (qp_i > 43)
1146 11213 qp = qp_i - 6;
1147 else
1148 1591769 qp = qp_c[qp_i - 30];
1149 } else {
1150
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1396312 times.
1396312 if (qp_i > 51)
1151 qp = 51;
1152 else
1153 1396312 qp = qp_i;
1154 }
1155
1156 3951336 qp += sps->qp_bd_offset;
1157 }
1158
1159 13436094 shift = sps->bit_depth + log2_trafo_size - 5;
1160 13436094 add = 1 << (shift-1);
1161 13436094 scale = level_scale[rem6[qp]] << (div6[qp]);
1162 13436094 scale_m = 16; // default when no custom scaling lists.
1163 13436094 dc_scale = 16;
1164
1165
6/6
✓ Branch 0 taken 613107 times.
✓ Branch 1 taken 12822987 times.
✓ Branch 2 taken 19500 times.
✓ Branch 3 taken 593607 times.
✓ Branch 4 taken 11407 times.
✓ Branch 5 taken 8093 times.
13436094 if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1166 1210028 const ScalingList *sl = pps->scaling_list_data_present_flag ?
1167
2/2
✓ Branch 0 taken 347752 times.
✓ Branch 1 taken 257262 times.
605014 &pps->scaling_list : &sps->scaling_list;
1168 605014 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
1169
1170 605014 matrix_id = 3 * matrix_id + c_idx;
1171
1172 605014 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
1173
2/2
✓ Branch 0 taken 112450 times.
✓ Branch 1 taken 492564 times.
605014 if (log2_trafo_size >= 4)
1174 112450 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
1175 }
1176 } else {
1177 420708 shift = 0;
1178 420708 add = 0;
1179 420708 scale = 0;
1180 420708 dc_scale = 0;
1181 }
1182
1183
6/6
✓ Branch 0 taken 5708700 times.
✓ Branch 1 taken 8148102 times.
✓ Branch 2 taken 225511 times.
✓ Branch 3 taken 5483189 times.
✓ Branch 4 taken 190277 times.
✓ Branch 5 taken 35234 times.
13856802 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 13856802 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 1802103 times.
✓ Branch 1 taken 12054699 times.
13856802 if (last_significant_coeff_x > 3) {
1195 1802103 int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_x);
1196 1802103 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1197 1802103 (2 + (last_significant_coeff_x & 1)) +
1198 suffix;
1199 }
1200
1201
2/2
✓ Branch 0 taken 1312171 times.
✓ Branch 1 taken 12544631 times.
13856802 if (last_significant_coeff_y > 3) {
1202 1312171 int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_y);
1203 1312171 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1204 1312171 (2 + (last_significant_coeff_y & 1)) +
1205 suffix;
1206 }
1207
1208
2/2
✓ Branch 0 taken 1488551 times.
✓ Branch 1 taken 12368251 times.
13856802 if (scan_idx == SCAN_VERT)
1209 1488551 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1210
1211 13856802 x_cg_last_sig = last_significant_coeff_x >> 2;
1212 13856802 y_cg_last_sig = last_significant_coeff_y >> 2;
1213
1214
3/3
✓ Branch 0 taken 10582786 times.
✓ Branch 1 taken 1785465 times.
✓ Branch 2 taken 1488551 times.
13856802 switch (scan_idx) {
1215 10582786 case SCAN_DIAG: {
1216 10582786 int last_x_c = last_significant_coeff_x & 3;
1217 10582786 int last_y_c = last_significant_coeff_y & 3;
1218
1219 10582786 scan_x_off = ff_hevc_diag_scan4x4_x;
1220 10582786 scan_y_off = ff_hevc_diag_scan4x4_y;
1221 10582786 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1222
2/2
✓ Branch 0 taken 4813164 times.
✓ Branch 1 taken 5769622 times.
10582786 if (trafo_size == 4) {
1223 4813164 scan_x_cg = scan_1x1;
1224 4813164 scan_y_cg = scan_1x1;
1225
2/2
✓ Branch 0 taken 2968862 times.
✓ Branch 1 taken 2800760 times.
5769622 } else if (trafo_size == 8) {
1226 2968862 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1227 2968862 scan_x_cg = diag_scan2x2_x;
1228 2968862 scan_y_cg = diag_scan2x2_y;
1229
2/2
✓ Branch 0 taken 2027109 times.
✓ Branch 1 taken 773651 times.
2800760 } else if (trafo_size == 16) {
1230 2027109 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1231 2027109 scan_x_cg = ff_hevc_diag_scan4x4_x;
1232 2027109 scan_y_cg = ff_hevc_diag_scan4x4_y;
1233 } else { // trafo_size == 32
1234 773651 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1235 773651 scan_x_cg = ff_hevc_diag_scan8x8_x;
1236 773651 scan_y_cg = ff_hevc_diag_scan8x8_y;
1237 }
1238 10582786 break;
1239 }
1240 1785465 case SCAN_HORIZ:
1241 1785465 scan_x_cg = horiz_scan2x2_x;
1242 1785465 scan_y_cg = horiz_scan2x2_y;
1243 1785465 scan_x_off = horiz_scan4x4_x;
1244 1785465 scan_y_off = horiz_scan4x4_y;
1245 1785465 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1246 1785465 break;
1247 1488551 default: //SCAN_VERT
1248 1488551 scan_x_cg = horiz_scan2x2_y;
1249 1488551 scan_y_cg = horiz_scan2x2_x;
1250 1488551 scan_x_off = horiz_scan4x4_y;
1251 1488551 scan_y_off = horiz_scan4x4_x;
1252 1488551 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1253 1488551 break;
1254 }
1255 13856802 num_coeff++;
1256 13856802 num_last_subset = (num_coeff - 1) >> 4;
1257
1258 13856802 max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1259 13856802 col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1260
2/2
✓ Branch 0 taken 11460260 times.
✓ Branch 1 taken 2396542 times.
13856802 if (max_xy < 4)
1261 11460260 col_limit = FFMIN(4, col_limit);
1262
2/2
✓ Branch 0 taken 1783000 times.
✓ Branch 1 taken 613542 times.
2396542 else if (max_xy < 8)
1263 1783000 col_limit = FFMIN(8, col_limit);
1264
2/2
✓ Branch 0 taken 286152 times.
✓ Branch 1 taken 327390 times.
613542 else if (max_xy < 12)
1265 286152 col_limit = FFMIN(24, col_limit);
1266
1267 // idct_dc reads coeffs[0] only and writes the whole block: no clear needed
1268 13856802 clear_rows = trafo_size;
1269
4/4
✓ Branch 0 taken 13436094 times.
✓ Branch 1 taken 420708 times.
✓ Branch 2 taken 13043456 times.
✓ Branch 3 taken 392638 times.
13856802 if (!lc->cu.cu_transquant_bypass_flag && !transform_skip_flag &&
1270
6/6
✓ Branch 0 taken 7730726 times.
✓ Branch 1 taken 5312730 times.
✓ Branch 2 taken 5434714 times.
✓ Branch 3 taken 2296012 times.
✓ Branch 4 taken 2323906 times.
✓ Branch 5 taken 3110808 times.
13043456 !(lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2)) {
1271
2/2
✓ Branch 0 taken 2436904 times.
✓ Branch 1 taken 7495744 times.
9932648 if (max_xy == 0)
1272 2436904 clear_rows = 0;
1273 }
1274
2/2
✓ Branch 0 taken 11419898 times.
✓ Branch 1 taken 2436904 times.
13856802 if (clear_rows)
1275 11419898 memset(coeffs, 0, clear_rows * trafo_size * sizeof(int16_t));
1276
1277
2/2
✓ Branch 0 taken 24358438 times.
✓ Branch 1 taken 13856802 times.
38215240 for (i = num_last_subset; i >= 0; i--) {
1278 int n, m;
1279 int x_cg, y_cg, x_c, y_c, pos;
1280 24358438 int implicit_non_zero_coeff = 0;
1281 int64_t trans_coeff_level;
1282 24358438 int prev_sig = 0;
1283 24358438 int offset = i << 4;
1284 24358438 int rice_init = 0;
1285
1286 uint8_t significant_coeff_flag_idx[16];
1287 24358438 uint8_t nb_significant_coeff_flag = 0;
1288
1289 24358438 x_cg = scan_x_cg[i];
1290 24358438 y_cg = scan_y_cg[i];
1291
1292
4/4
✓ Branch 0 taken 10501636 times.
✓ Branch 1 taken 13856802 times.
✓ Branch 2 taken 8105094 times.
✓ Branch 3 taken 2396542 times.
24358438 if ((i < num_last_subset) && (i > 0)) {
1293 8105094 int ctx_cg = 0;
1294
2/2
✓ Branch 0 taken 7449357 times.
✓ Branch 1 taken 655737 times.
8105094 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1295 7449357 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1296
2/2
✓ Branch 0 taken 6855367 times.
✓ Branch 1 taken 1249727 times.
8105094 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1297 6855367 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1298
1299 8105094 significant_coeff_group_flag[x_cg][y_cg] =
1300 8105094 significant_coeff_group_flag_decode(lc, c_idx, ctx_cg);
1301 8105094 implicit_non_zero_coeff = 1;
1302 } else {
1303 16253344 significant_coeff_group_flag[x_cg][y_cg] =
1304
5/6
✓ Branch 0 taken 14532547 times.
✓ Branch 1 taken 1720797 times.
✓ Branch 2 taken 675745 times.
✓ Branch 3 taken 13856802 times.
✓ Branch 4 taken 2396542 times.
✗ Branch 5 not taken.
18649886 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1305
1/2
✓ Branch 0 taken 2396542 times.
✗ Branch 1 not taken.
2396542 (x_cg == 0 && y_cg == 0));
1306 }
1307
1308 24358438 last_scan_pos = num_coeff - offset - 1;
1309
1310
2/2
✓ Branch 0 taken 13856802 times.
✓ Branch 1 taken 10501636 times.
24358438 if (i == num_last_subset) {
1311 13856802 n_end = last_scan_pos - 1;
1312 13856802 significant_coeff_flag_idx[0] = last_scan_pos;
1313 13856802 nb_significant_coeff_flag = 1;
1314 } else {
1315 10501636 n_end = 15;
1316 }
1317
1318
2/2
✓ Branch 0 taken 15454036 times.
✓ Branch 1 taken 8904402 times.
24358438 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1319 15454036 prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1320
2/2
✓ Branch 0 taken 15003734 times.
✓ Branch 1 taken 9354704 times.
24358438 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1321
2/2
✓ Branch 0 taken 5057908 times.
✓ Branch 1 taken 9945826 times.
15003734 prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1322
1323
4/4
✓ Branch 0 taken 21298299 times.
✓ Branch 1 taken 3060139 times.
✓ Branch 2 taken 17917105 times.
✓ Branch 3 taken 3381194 times.
24358438 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 17917105 int scf_offset = 0;
1350 int nb0;
1351
4/4
✓ Branch 0 taken 687068 times.
✓ Branch 1 taken 17230037 times.
✓ Branch 2 taken 592618 times.
✓ Branch 3 taken 94450 times.
17917105 if (sps->transform_skip_context_enabled &&
1352
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 592618 times.
592618 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1353 94450 ctx_idx_map_p = &ctx_idx_map[scan_idx][4 * 16];
1354
2/2
✓ Branch 0 taken 41170 times.
✓ Branch 1 taken 53280 times.
94450 if (c_idx == 0) {
1355 41170 scf_offset = 40;
1356 } else {
1357 53280 scf_offset = 14 + 27;
1358 }
1359 } else {
1360
2/2
✓ Branch 0 taken 3749944 times.
✓ Branch 1 taken 14072711 times.
17822655 if (c_idx != 0)
1361 3749944 scf_offset = 27;
1362
2/2
✓ Branch 0 taken 5594199 times.
✓ Branch 1 taken 12228456 times.
17822655 if (log2_trafo_size == 2) {
1363 5594199 ctx_idx_map_p = &ctx_idx_map[scan_idx][0];
1364 } else {
1365 12228456 ctx_idx_map_p = &ctx_idx_map[scan_idx][(prev_sig + 1) << 4];
1366
2/2
✓ Branch 0 taken 10128200 times.
✓ Branch 1 taken 2100256 times.
12228456 if (c_idx == 0) {
1367
4/4
✓ Branch 0 taken 6217592 times.
✓ Branch 1 taken 3910608 times.
✓ Branch 2 taken 2048467 times.
✓ Branch 3 taken 4169125 times.
10128200 if ((x_cg > 0 || y_cg > 0))
1368 5959075 scf_offset += 3;
1369
2/2
✓ Branch 0 taken 3633509 times.
✓ Branch 1 taken 6494691 times.
10128200 if (log2_trafo_size == 3) {
1370
2/2
✓ Branch 0 taken 2661097 times.
✓ Branch 1 taken 972412 times.
3633509 scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15;
1371 } else {
1372 6494691 scf_offset += 21;
1373 }
1374 } else {
1375
2/2
✓ Branch 0 taken 991587 times.
✓ Branch 1 taken 1108669 times.
2100256 if (log2_trafo_size == 3)
1376 991587 scf_offset += 9;
1377 else
1378 1108669 scf_offset += 12;
1379 }
1380 }
1381 }
1382 // the flag is a fresh bin: store always, advance conditionally
1383 17917105 nb0 = nb_significant_coeff_flag;
1384
2/2
✓ Branch 0 taken 165337250 times.
✓ Branch 1 taken 17917105 times.
183254355 for (n = n_end; n > 0; n--) {
1385 165337250 int sig = significant_coeff_flag_decode(lc, n, scf_offset, ctx_idx_map_p);
1386 165337250 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1387 165337250 nb_significant_coeff_flag += sig;
1388 }
1389
2/2
✓ Branch 0 taken 14475693 times.
✓ Branch 1 taken 3441412 times.
17917105 if (nb_significant_coeff_flag != nb0)
1390 14475693 implicit_non_zero_coeff = 0;
1391
2/2
✓ Branch 0 taken 17840312 times.
✓ Branch 1 taken 76793 times.
17917105 if (implicit_non_zero_coeff == 0) {
1392
4/4
✓ Branch 0 taken 685361 times.
✓ Branch 1 taken 17154951 times.
✓ Branch 2 taken 591196 times.
✓ Branch 3 taken 94165 times.
17840312 if (sps->transform_skip_context_enabled &&
1393
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 591196 times.
591196 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1394
2/2
✓ Branch 0 taken 40977 times.
✓ Branch 1 taken 53188 times.
94165 if (c_idx == 0) {
1395 40977 scf_offset = 42;
1396 } else {
1397 53188 scf_offset = 16 + 27;
1398 }
1399 } else {
1400
2/2
✓ Branch 0 taken 10745063 times.
✓ Branch 1 taken 7001084 times.
17746147 if (i == 0) {
1401
2/2
✓ Branch 0 taken 8113636 times.
✓ Branch 1 taken 2631427 times.
10745063 if (c_idx == 0)
1402 8113636 scf_offset = 0;
1403 else
1404 2631427 scf_offset = 27;
1405 } else {
1406 7001084 scf_offset = 2 + scf_offset;
1407 }
1408 }
1409 17840312 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1410 17840312 nb_significant_coeff_flag +=
1411 17840312 significant_coeff_flag_decode_0(lc, c_idx, scf_offset);
1412 } else {
1413 76793 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1414 76793 nb_significant_coeff_flag++;
1415 }
1416 }
1417
1418 24358438 n_end = nb_significant_coeff_flag;
1419
1420
1421
2/2
✓ Branch 0 taken 21194046 times.
✓ Branch 1 taken 3164392 times.
24358438 if (n_end) {
1422 int first_nz_pos_in_cg;
1423 int last_nz_pos_in_cg;
1424 21194046 int c_rice_param = 0;
1425 21194046 int first_greater1_coeff_idx = -1;
1426 uint8_t coeff_abs_level_greater1_flag[8];
1427 uint16_t coeff_sign_flag;
1428 21194046 int sum_abs = 0;
1429 int sign_hidden;
1430 int sb_type;
1431 21194046 int gt1_mask = 0;
1432
1433
1434 // initialize first elem of coeff_bas_level_greater1_flag
1435
4/4
✓ Branch 0 taken 7441497 times.
✓ Branch 1 taken 13752549 times.
✓ Branch 2 taken 6255124 times.
✓ Branch 3 taken 1186373 times.
21194046 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1436
1437
2/2
✓ Branch 0 taken 769625 times.
✓ Branch 1 taken 20424421 times.
21194046 if (sps->persistent_rice_adaptation_enabled) {
1438
3/4
✓ Branch 0 taken 685062 times.
✓ Branch 1 taken 84563 times.
✓ Branch 2 taken 685062 times.
✗ Branch 3 not taken.
769625 if (!transform_skip_flag && !lc->cu.cu_transquant_bypass_flag)
1439
2/2
✓ Branch 0 taken 224053 times.
✓ Branch 1 taken 461009 times.
685062 sb_type = 2 * (c_idx == 0 ? 1 : 0);
1440 else
1441
2/2
✓ Branch 0 taken 36677 times.
✓ Branch 1 taken 47886 times.
84563 sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1442 769625 c_rice_param = lc->stat_coeff[sb_type] / 4;
1443 }
1444
1445
4/4
✓ Branch 0 taken 7337244 times.
✓ Branch 1 taken 13856802 times.
✓ Branch 2 taken 3033014 times.
✓ Branch 3 taken 4304230 times.
21194046 if (!(i == num_last_subset) && greater1_ctx == 0)
1446 3033014 ctx_set++;
1447 21194046 greater1_ctx = 1;
1448 21194046 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 85187822 times.
✓ Branch 1 taken 21194046 times.
106381868 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1452 85187822 int inc = (ctx_set << 2) + greater1_ctx;
1453 85187822 int flag = coeff_abs_level_greater1_flag_decode(lc, c_idx, inc);
1454 85187822 coeff_abs_level_greater1_flag[m] = flag;
1455 85187822 gt1_mask |= flag << m;
1456 85187822 greater1_ctx = (greater1_ctx + (greater1_ctx - 1U < 2)) & (flag - 1);
1457 }
1458
2/2
✓ Branch 0 taken 9273048 times.
✓ Branch 1 taken 11920998 times.
21194046 if (gt1_mask)
1459 9273048 first_greater1_coeff_idx = ff_ctz(gt1_mask);
1460 21194046 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1461
1462
2/2
✓ Branch 0 taken 20479082 times.
✓ Branch 1 taken 714964 times.
21194046 if (lc->cu.cu_transquant_bypass_flag ||
1463
2/2
✓ Branch 0 taken 11276883 times.
✓ Branch 1 taken 9202199 times.
20479082 (lc->cu.pred_mode == MODE_INTRA &&
1464
6/6
✓ Branch 0 taken 505772 times.
✓ Branch 1 taken 10771111 times.
✓ Branch 2 taken 57405 times.
✓ Branch 3 taken 448367 times.
✓ Branch 4 taken 29611 times.
✓ Branch 5 taken 27794 times.
11276883 sps->implicit_rdpcm_enabled && transform_skip_flag &&
1465
4/4
✓ Branch 0 taken 16913 times.
✓ Branch 1 taken 12698 times.
✓ Branch 2 taken 5999 times.
✓ Branch 3 taken 20432591 times.
20451288 (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1466 explicit_rdpcm_flag)
1467 761455 sign_hidden = 0;
1468 else
1469 20432591 sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1470
1471
2/2
✓ Branch 0 taken 9273048 times.
✓ Branch 1 taken 11920998 times.
21194046 if (first_greater1_coeff_idx != -1) {
1472 9273048 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 17507855 times.
✓ Branch 1 taken 3686191 times.
✓ Branch 2 taken 7794410 times.
✓ Branch 3 taken 9713445 times.
21194046 if (!pps->sign_data_hiding_flag || !sign_hidden ) {
1475 11480601 coeff_sign_flag = coeff_sign_flag_decode(lc, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1476 } else {
1477 9713445 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 101157242 times.
✓ Branch 1 taken 21194046 times.
122351288 for (m = 0; m < n_end; m++) {
1481 int64_t sign;
1482
1483 101157242 n = significant_coeff_flag_idx[m];
1484 101157242 GET_COORD(offset, n);
1485
2/2
✓ Branch 0 taken 85187822 times.
✓ Branch 1 taken 15969420 times.
101157242 if (m < 8) {
1486 85187822 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1487
4/4
✓ Branch 0 taken 9273048 times.
✓ Branch 1 taken 75914774 times.
✓ Branch 2 taken 20722694 times.
✓ Branch 3 taken 64465128 times.
85187822 if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1488 20722694 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1489
1490 20722694 trans_coeff_level += last_coeff_abs_level_remaining;
1491
2/2
✓ Branch 0 taken 5238925 times.
✓ Branch 1 taken 15483769 times.
20722694 if (trans_coeff_level > (3 << c_rice_param))
1492
2/2
✓ Branch 0 taken 107884 times.
✓ Branch 1 taken 5131041 times.
5238925 c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1493
4/4
✓ Branch 0 taken 601790 times.
✓ Branch 1 taken 20120904 times.
✓ Branch 2 taken 182004 times.
✓ Branch 3 taken 419786 times.
20722694 if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1494 182004 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1495
2/2
✓ Branch 0 taken 20309 times.
✓ Branch 1 taken 161695 times.
182004 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1496 20309 lc->stat_coeff[sb_type]++;
1497
2/2
✓ Branch 0 taken 93774 times.
✓ Branch 1 taken 67921 times.
161695 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1498
2/2
✓ Branch 0 taken 20285 times.
✓ Branch 1 taken 73489 times.
93774 if (lc->stat_coeff[sb_type] > 0)
1499 20285 lc->stat_coeff[sb_type]--;
1500 182004 rice_init = 1;
1501 }
1502 }
1503 } else {
1504 15969420 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1505
1506 15969420 trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1507
2/2
✓ Branch 0 taken 1823639 times.
✓ Branch 1 taken 14145781 times.
15969420 if (trans_coeff_level > (3 << c_rice_param))
1508
2/2
✓ Branch 0 taken 47948 times.
✓ Branch 1 taken 1775691 times.
1823639 c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1509
4/4
✓ Branch 0 taken 495525 times.
✓ Branch 1 taken 15473895 times.
✓ Branch 2 taken 22670 times.
✓ Branch 3 taken 472855 times.
15969420 if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1510 22670 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1511
2/2
✓ Branch 0 taken 785 times.
✓ Branch 1 taken 21885 times.
22670 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1512 785 lc->stat_coeff[sb_type]++;
1513
2/2
✓ Branch 0 taken 15387 times.
✓ Branch 1 taken 6498 times.
21885 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1514
2/2
✓ Branch 0 taken 744 times.
✓ Branch 1 taken 14643 times.
15387 if (lc->stat_coeff[sb_type] > 0)
1515 744 lc->stat_coeff[sb_type]--;
1516 22670 rice_init = 1;
1517 }
1518 }
1519
4/4
✓ Branch 0 taken 90650668 times.
✓ Branch 1 taken 10506574 times.
✓ Branch 2 taken 69807660 times.
✓ Branch 3 taken 20843008 times.
101157242 if (pps->sign_data_hiding_flag && sign_hidden) {
1520 69807660 sum_abs += trans_coeff_level;
1521
4/4
✓ Branch 0 taken 9713445 times.
✓ Branch 1 taken 60094215 times.
✓ Branch 2 taken 4839491 times.
✓ Branch 3 taken 4873954 times.
69807660 if (n == first_nz_pos_in_cg && (sum_abs&1))
1522 4839491 trans_coeff_level = -trans_coeff_level;
1523 }
1524 // equiprobable sign: apply it branchless
1525 101157242 sign = -(int64_t)(coeff_sign_flag >> 15);
1526 101157242 trans_coeff_level = (trans_coeff_level ^ sign) - sign;
1527 101157242 coeff_sign_flag <<= 1;
1528
2/2
✓ Branch 0 taken 92379395 times.
✓ Branch 1 taken 8777847 times.
101157242 if(!lc->cu.cu_transquant_bypass_flag) {
1529
6/6
✓ Branch 0 taken 3256495 times.
✓ Branch 1 taken 89122900 times.
✓ Branch 2 taken 124715 times.
✓ Branch 3 taken 3131780 times.
✓ Branch 4 taken 25373 times.
✓ Branch 5 taken 99342 times.
92379395 if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1530
6/6
✓ Branch 0 taken 1014069 times.
✓ Branch 1 taken 2143084 times.
✓ Branch 2 taken 456467 times.
✓ Branch 3 taken 557602 times.
✓ Branch 4 taken 372832 times.
✓ Branch 5 taken 83635 times.
3157153 if(y_c || x_c || log2_trafo_size < 4) {
1531
4/4
✓ Branch 0 taken 731538 times.
✓ Branch 1 taken 926236 times.
✓ Branch 2 taken 413079 times.
✓ Branch 3 taken 1002665 times.
3073518 switch(log2_trafo_size) {
1532 731538 case 3: pos = (y_c << 3) + x_c; break;
1533 926236 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1534 413079 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1535 1002665 default: pos = (y_c << 2) + x_c; break;
1536 }
1537 3073518 scale_m = scale_matrix[pos];
1538 } else {
1539 83635 scale_m = dc_scale;
1540 }
1541 }
1542 92379395 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1543 92379395 trans_coeff_level = FFMAX(FFMIN(trans_coeff_level, 32767), -32768);
1544 }
1545 101157242 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1546 }
1547 }
1548 }
1549
1550
2/2
✓ Branch 0 taken 420708 times.
✓ Branch 1 taken 13436094 times.
13856802 if (lc->cu.cu_transquant_bypass_flag) {
1551
2/6
✓ Branch 0 taken 420708 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 420708 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
420708 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 392638 times.
✓ Branch 1 taken 13043456 times.
13436094 if (transform_skip_flag) {
1559
2/2
✓ Branch 0 taken 45633 times.
✓ Branch 1 taken 14213 times.
59846 int rot = sps->transform_skip_rotation_enabled &&
1560
2/2
✓ Branch 0 taken 59846 times.
✓ Branch 1 taken 332792 times.
452484 log2_trafo_size == 2 &&
1561
2/2
✓ Branch 0 taken 11850 times.
✓ Branch 1 taken 33783 times.
45633 lc->cu.pred_mode == MODE_INTRA;
1562
2/2
✓ Branch 0 taken 11850 times.
✓ Branch 1 taken 380788 times.
392638 if (rot) {
1563
2/2
✓ Branch 0 taken 94800 times.
✓ Branch 1 taken 11850 times.
106650 for (i = 0; i < 8; i++)
1564 94800 FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]);
1565 }
1566
1567 392638 s->hevcdsp.dequant(coeffs, log2_trafo_size);
1568
1569
4/4
✓ Branch 0 taken 389548 times.
✓ Branch 1 taken 3090 times.
✓ Branch 2 taken 56756 times.
✓ Branch 3 taken 332792 times.
392638 if (explicit_rdpcm_flag || (sps->implicit_rdpcm_enabled &&
1570
4/4
✓ Branch 0 taken 24612 times.
✓ Branch 1 taken 32144 times.
✓ Branch 2 taken 15060 times.
✓ Branch 3 taken 9552 times.
56756 lc->cu.pred_mode == MODE_INTRA &&
1571
2/2
✓ Branch 0 taken 5302 times.
✓ Branch 1 taken 9758 times.
15060 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1572
2/2
✓ Branch 0 taken 14854 times.
✓ Branch 1 taken 3090 times.
17944 int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26);
1573
1574 17944 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1575 }
1576
6/6
✓ Branch 0 taken 7730726 times.
✓ Branch 1 taken 5312730 times.
✓ Branch 2 taken 5434714 times.
✓ Branch 3 taken 2296012 times.
✓ Branch 4 taken 3110808 times.
✓ Branch 5 taken 2323906 times.
13043456 } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) {
1577 3110808 s->hevcdsp.transform_4x4_luma(coeffs);
1578 } else {
1579
2/2
✓ Branch 0 taken 2436904 times.
✓ Branch 1 taken 7495744 times.
9932648 if (max_xy == 0)
1580 2436904 s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1581 else
1582 7495744 s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1583 }
1584 }
1585
2/2
✓ Branch 0 taken 171429 times.
✓ Branch 1 taken 13685373 times.
13856802 if (lc->tu.cross_pf) {
1586 171429 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1587
1588
2/2
✓ Branch 0 taken 13540080 times.
✓ Branch 1 taken 171429 times.
13711509 for (i = 0; i < (trafo_size * trafo_size); i++) {
1589 13540080 coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1590 }
1591 }
1592 13856802 s->hevcdsp.add_residual[log2_trafo_size-2](dst, coeffs, stride);
1593 13856802 }
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