FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vvc/cabac.c
Date: 2026-05-02 03:33:10
Exec Total Coverage
Lines: 1019 1032 98.7%
Functions: 139 139 100.0%
Branches: 670 696 96.3%

Line Branch Exec Source
1 /*
2 * VVC CABAC decoder
3 *
4 * Copyright (C) 2021 Nuo Mi
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #include <assert.h>
24
25 #include "libavcodec/cabac_functions.h"
26
27 #include "cabac.h"
28 #include "ctu.h"
29 #include "data.h"
30
31 #define CABAC_MAX_BIN 31
32
33 #define CNU 35
34
35 enum SyntaxElement {
36 ALF_CTB_FLAG = 0,
37 ALF_USE_APS_FLAG = ALF_CTB_FLAG + 9,
38 ALF_CTB_CC_CB_IDC,
39 ALF_CTB_CC_CR_IDC = ALF_CTB_CC_CB_IDC + 3,
40 ALF_CTB_FILTER_ALT_IDX = ALF_CTB_CC_CR_IDC + 3,
41 SAO_MERGE_FLAG = ALF_CTB_FILTER_ALT_IDX + 2,
42 SAO_TYPE_IDX,
43 SPLIT_CU_FLAG,
44 SPLIT_QT_FLAG = SPLIT_CU_FLAG + 9,
45 MTT_SPLIT_CU_VERTICAL_FLAG = SPLIT_QT_FLAG + 6,
46 MTT_SPLIT_CU_BINARY_FLAG = MTT_SPLIT_CU_VERTICAL_FLAG + 5,
47 NON_INTER_FLAG = MTT_SPLIT_CU_BINARY_FLAG + 4,
48 CU_SKIP_FLAG = NON_INTER_FLAG + 2,
49 PRED_MODE_IBC_FLAG = CU_SKIP_FLAG + 3,
50 PRED_MODE_FLAG = PRED_MODE_IBC_FLAG + 3,
51 PRED_MODE_PLT_FLAG = PRED_MODE_FLAG + 2,
52 CU_ACT_ENABLED_FLAG,
53 INTRA_BDPCM_LUMA_FLAG,
54 INTRA_BDPCM_LUMA_DIR_FLAG,
55 INTRA_MIP_FLAG,
56 INTRA_LUMA_REF_IDX = INTRA_MIP_FLAG + 4,
57 INTRA_SUBPARTITIONS_MODE_FLAG = INTRA_LUMA_REF_IDX + 2,
58 INTRA_SUBPARTITIONS_SPLIT_FLAG,
59 INTRA_LUMA_MPM_FLAG,
60 INTRA_LUMA_NOT_PLANAR_FLAG,
61 INTRA_BDPCM_CHROMA_FLAG = INTRA_LUMA_NOT_PLANAR_FLAG + 2,
62 INTRA_BDPCM_CHROMA_DIR_FLAG,
63 CCLM_MODE_FLAG,
64 CCLM_MODE_IDX,
65 INTRA_CHROMA_PRED_MODE,
66 GENERAL_MERGE_FLAG,
67 INTER_PRED_IDC,
68 INTER_AFFINE_FLAG = INTER_PRED_IDC + 6,
69 CU_AFFINE_TYPE_FLAG = INTER_AFFINE_FLAG + 3,
70 SYM_MVD_FLAG,
71 REF_IDX_LX,
72 MVP_LX_FLAG = REF_IDX_LX + 2,
73 AMVR_FLAG,
74 AMVR_PRECISION_IDX = AMVR_FLAG + 2,
75 BCW_IDX = AMVR_PRECISION_IDX + 3,
76 CU_CODED_FLAG,
77 CU_SBT_FLAG,
78 CU_SBT_QUAD_FLAG = CU_SBT_FLAG + 2,
79 CU_SBT_HORIZONTAL_FLAG,
80 CU_SBT_POS_FLAG = CU_SBT_HORIZONTAL_FLAG + 3,
81 LFNST_IDX,
82 MTS_IDX = LFNST_IDX + 3,
83 COPY_ABOVE_PALETTE_INDICES_FLAG = MTS_IDX + 4,
84 PALETTE_TRANSPOSE_FLAG,
85 RUN_COPY_FLAG,
86 REGULAR_MERGE_FLAG = RUN_COPY_FLAG + 8,
87 MMVD_MERGE_FLAG = REGULAR_MERGE_FLAG + 2,
88 MMVD_CAND_FLAG,
89 MMVD_DISTANCE_IDX,
90 CIIP_FLAG,
91 MERGE_SUBBLOCK_FLAG,
92 MERGE_SUBBLOCK_IDX = MERGE_SUBBLOCK_FLAG + 3,
93 MERGE_IDX,
94 ABS_MVD_GREATER0_FLAG,
95 ABS_MVD_GREATER1_FLAG,
96 TU_Y_CODED_FLAG,
97 TU_CB_CODED_FLAG = TU_Y_CODED_FLAG + 4,
98 TU_CR_CODED_FLAG = TU_CB_CODED_FLAG + 2,
99 CU_QP_DELTA_ABS = TU_CR_CODED_FLAG + 3,
100 CU_CHROMA_QP_OFFSET_FLAG = CU_QP_DELTA_ABS + 2,
101 CU_CHROMA_QP_OFFSET_IDX,
102 TRANSFORM_SKIP_FLAG,
103 TU_JOINT_CBCR_RESIDUAL_FLAG = TRANSFORM_SKIP_FLAG + 2,
104 LAST_SIG_COEFF_X_PREFIX = TU_JOINT_CBCR_RESIDUAL_FLAG + 3,
105 LAST_SIG_COEFF_Y_PREFIX = LAST_SIG_COEFF_X_PREFIX +23,
106 SB_CODED_FLAG = LAST_SIG_COEFF_Y_PREFIX +23,
107 SIG_COEFF_FLAG = SB_CODED_FLAG + 7,
108 PAR_LEVEL_FLAG = SIG_COEFF_FLAG +63,
109 ABS_LEVEL_GTX_FLAG = PAR_LEVEL_FLAG +33,
110 COEFF_SIGN_FLAG = ABS_LEVEL_GTX_FLAG +72,
111 SYNTAX_ELEMENT_LAST = COEFF_SIGN_FLAG + 6,
112 };
113
114 static_assert(VVC_CONTEXTS == SYNTAX_ELEMENT_LAST, "VVC_CONTEXTS wrong");
115
116 static const uint8_t init_values[4][SYNTAX_ELEMENT_LAST] = {
117 {
118 //alf_ctb_flag
119 62, 39, 39, 54, 39, 39, 31, 39, 39,
120 //alf_use_aps_flag
121 46,
122 //alf_ctb_cc_cb_idc
123 18, 30, 31,
124 //alf_ctb_cc_cr_idc
125 18, 30, 31,
126 //alf_ctb_filter_alt_idx
127 11, 11,
128 //sao_merge_left_flag and sao_merge_up_flag
129 60,
130 //sao_type_idx_luma and sao_type_idx_chroma
131 13,
132 //split_cu_flag
133 19, 28, 38, 27, 29, 38, 20, 30, 31,
134 //split_qt_flag
135 27, 6, 15, 25, 19, 37,
136 //mtt_split_cu_vertical_flag
137 43, 42, 29, 27, 44,
138 //mtt_split_cu_binary_flag
139 36, 45, 36, 45,
140 //non_inter_flag
141 CNU, CNU,
142 //cu_skip_flag
143 0, 26, 28,
144 //pred_mode_ibc_flag
145 17, 42, 36,
146 //pred_mode_flag
147 CNU, CNU,
148 //pred_mode_plt_flag
149 25,
150 //cu_act_enabled_flag
151 52,
152 //intra_bdpcm_luma_flag
153 19,
154 //intra_bdpcm_luma_dir_flag
155 35,
156 //intra_mip_flag
157 33, 49, 50, 25,
158 //intra_luma_ref_idx
159 25, 60,
160 //intra_subpartitions_mode_flag
161 33,
162 //intra_subpartitions_split_flag
163 43,
164 //intra_luma_mpm_flag
165 45,
166 //intra_luma_not_planar_flag
167 13, 28,
168 //intra_bdpcm_chroma_flag
169 1,
170 //intra_bdpcm_chroma_dir_flag
171 27,
172 //cclm_mode_flag
173 59,
174 //cclm_mode_idx
175 27,
176 //intra_chroma_pred_mode
177 34,
178 //general_merge_flag
179 26,
180 //inter_pred_idc
181 CNU, CNU, CNU, CNU, CNU, CNU,
182 //inter_affine_flag
183 CNU, CNU, CNU,
184 //cu_affine_type_flag
185 CNU,
186 //sym_mvd_flag
187 CNU,
188 //ref_idx_l0 and ref_idx_l1
189 CNU, CNU,
190 //mvp_l0_flag and mvp_l1_flag
191 42,
192 //amvr_flag
193 CNU, CNU,
194 //amvr_precision_idx
195 35, 34, 35,
196 //bcw_idx
197 CNU,
198 //cu_coded_flag
199 6,
200 //cu_sbt_flag
201 CNU, CNU,
202 //cu_sbt_quad_flag
203 CNU,
204 //cu_sbt_horizontal_flag
205 CNU, CNU, CNU,
206 //cu_sbt_pos_flag
207 CNU,
208 //lfnst_idx
209 28, 52, 42,
210 //mts_idx
211 29, 0, 28, 0,
212 //copy_above_palette_indices_flag
213 42,
214 //palette_transpose_flag
215 42,
216 //run_copy_flag
217 50, 37, 45, 30, 46, 45, 38, 46,
218 //regular_merge_flag
219 CNU, CNU,
220 //mmvd_merge_flag
221 CNU,
222 //mmvd_cand_flag
223 CNU,
224 //mmvd_distance_idx
225 CNU,
226 //ciip_flag
227 CNU,
228 //merge_subblock_flag
229 CNU, CNU, CNU,
230 //merge_subblock_idx
231 CNU,
232 //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
233 34,
234 //abs_mvd_greater0_flag
235 14,
236 //abs_mvd_greater1_flag
237 45,
238 //tu_y_coded_flag
239 15, 12, 5, 7,
240 //tu_cb_coded_flag
241 12, 21,
242 //tu_cr_coded_flag
243 33, 28, 36,
244 //cu_qp_delta_abs
245 CNU, CNU,
246 //cu_chroma_qp_offset_flag
247 CNU,
248 //cu_chroma_qp_offset_idx
249 CNU,
250 //transform_skip_flag
251 25, 9,
252 //tu_joint_cbcr_residual_flag
253 12, 21, 35,
254 //last_sig_coeff_x_prefix
255 13, 5, 4, 21, 14, 4, 6, 14, 21, 11, 14, 7, 14, 5, 11, 21,
256 30, 22, 13, 42, 12, 4, 3,
257 //last_sig_coeff_y_prefix
258 13, 5, 4, 6, 13, 11, 14, 6, 5, 3, 14, 22, 6, 4, 3, 6,
259 22, 29, 20, 34, 12, 4, 3,
260 //sb_coded_flag
261 18, 31, 25, 15, 18, 20, 38,
262 //sig_coeff_flag
263 25, 19, 28, 14, 25, 20, 29, 30, 19, 37, 30, 38, 11, 38, 46, 54,
264 27, 39, 39, 39, 44, 39, 39, 39, 18, 39, 39, 39, 27, 39, 39, 39,
265 0, 39, 39, 39, 25, 27, 28, 37, 34, 53, 53, 46, 19, 46, 38, 39,
266 52, 39, 39, 39, 11, 39, 39, 39, 19, 39, 39, 39, 25, 28, 38,
267 //par_level_flag
268 33, 25, 18, 26, 34, 27, 25, 26, 19, 42, 35, 33, 19, 27, 35, 35,
269 34, 42, 20, 43, 20, 33, 25, 26, 42, 19, 27, 26, 50, 35, 20, 43,
270 11,
271 //abs_level_gtx_flag
272 25, 25, 11, 27, 20, 21, 33, 12, 28, 21, 22, 34, 28, 29, 29, 30,
273 36, 29, 45, 30, 23, 40, 33, 27, 28, 21, 37, 36, 37, 45, 38, 46,
274 25, 1, 40, 25, 33, 11, 17, 25, 25, 18, 4, 17, 33, 26, 19, 13,
275 33, 19, 20, 28, 22, 40, 9, 25, 18, 26, 35, 25, 26, 35, 28, 37,
276 11, 5, 5, 14, 10, 3, 3, 3,
277 //coeff_sign_flag
278 12, 17, 46, 28, 25, 46,
279 },
280 {
281 //alf_ctb_flag
282 13, 23, 46, 4, 61, 54, 19, 46, 54,
283 //alf_use_aps_flag
284 46,
285 //alf_ctb_cc_cb_idc
286 18, 21, 38,
287 //alf_ctb_cc_cr_idc
288 18, 21, 38,
289 //alf_ctb_filter_alt_idx
290 20, 12,
291 //sao_merge_left_flag and sao_merge_up_flag
292 60,
293 //sao_type_idx_luma and sao_type_idx_chroma
294 5,
295 //split_cu_flag
296 11, 35, 53, 12, 6, 30, 13, 15, 31,
297 //split_qt_flag
298 20, 14, 23, 18, 19, 6,
299 //mtt_split_cu_vertical_flag
300 43, 35, 37, 34, 52,
301 //mtt_split_cu_binary_flag
302 43, 37, 21, 22,
303 //non_inter_flag
304 25, 12,
305 //cu_skip_flag
306 57, 59, 45,
307 //pred_mode_ibc_flag
308 0, 57, 44,
309 //pred_mode_flag
310 40, 35,
311 //pred_mode_plt_flag
312 0,
313 //cu_act_enabled_flag
314 46,
315 //intra_bdpcm_luma_flag
316 40,
317 //intra_bdpcm_luma_dir_flag
318 36,
319 //intra_mip_flag
320 41, 57, 58, 26,
321 //intra_luma_ref_idx
322 25, 58,
323 //intra_subpartitions_mode_flag
324 33,
325 //intra_subpartitions_split_flag
326 36,
327 //intra_luma_mpm_flag
328 36,
329 //intra_luma_not_planar_flag
330 12, 20,
331 //intra_bdpcm_chroma_flag
332 0,
333 //intra_bdpcm_chroma_dir_flag
334 13,
335 //cclm_mode_flag
336 34,
337 //cclm_mode_idx
338 27,
339 //intra_chroma_pred_mode
340 25,
341 //general_merge_flag
342 21,
343 //inter_pred_idc
344 7, 6, 5, 12, 4, 40,
345 //inter_affine_flag
346 12, 13, 14,
347 //cu_affine_type_flag
348 35,
349 //sym_mvd_flag
350 28,
351 //ref_idx_l0 and ref_idx_l1
352 20, 35,
353 //mvp_l0_flag and mvp_l1_flag
354 34,
355 //amvr_flag
356 59, 58,
357 //amvr_precision_idx
358 60, 48, 60,
359 //bcw_idx
360 4,
361 //cu_coded_flag
362 5,
363 //cu_sbt_flag
364 56, 57,
365 //cu_sbt_quad_flag
366 42,
367 //cu_sbt_horizontal_flag
368 20, 43, 12,
369 //cu_sbt_pos_flag
370 28,
371 //lfnst_idx
372 37, 45, 27,
373 //mts_idx
374 45, 40, 27, 0,
375 //copy_above_palette_indices_flag
376 59,
377 //palette_transpose_flag
378 42,
379 //run_copy_flag
380 51, 30, 30, 38, 23, 38, 53, 46,
381 //regular_merge_flag
382 38, 7,
383 //mmvd_merge_flag
384 26,
385 //mmvd_cand_flag
386 43,
387 //mmvd_distance_idx
388 60,
389 //ciip_flag
390 57,
391 //merge_subblock_flag
392 48, 57, 44,
393 //merge_subblock_idx
394 5,
395 //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
396 20,
397 //abs_mvd_greater0_flag
398 44,
399 //abs_mvd_greater1_flag
400 43,
401 //tu_y_coded_flag
402 23, 5, 20, 7,
403 //tu_cb_coded_flag
404 25, 28,
405 //tu_cr_coded_flag
406 25, 29, 45,
407 //cu_qp_delta_abs
408 CNU, CNU,
409 //cu_chroma_qp_offset_flag
410 CNU,
411 //cu_chroma_qp_offset_idx
412 CNU,
413 //transform_skip_flag
414 25, 9,
415 //tu_joint_cbcr_residual_flag
416 27, 36, 45,
417 //last_sig_coeff_x_prefix
418 6, 13, 12, 6, 6, 12, 14, 14, 13, 12, 29, 7, 6, 13, 36, 28,
419 14, 13, 5, 26, 12, 4, 18,
420 //last_sig_coeff_y_prefix
421 5, 5, 12, 6, 6, 4, 6, 14, 5, 12, 14, 7, 13, 5, 13, 21,
422 14, 20, 12, 34, 11, 4, 18,
423 //sb_coded_flag
424 25, 30, 25, 45, 18, 12, 29,
425 //sig_coeff_flag
426 17, 41, 42, 29, 25, 49, 43, 37, 33, 58, 51, 30, 19, 38, 38, 46,
427 34, 54, 54, 39, 6, 39, 39, 39, 19, 39, 54, 39, 19, 39, 39, 39,
428 56, 39, 39, 39, 17, 34, 35, 21, 41, 59, 60, 38, 35, 45, 53, 54,
429 44, 39, 39, 39, 34, 38, 62, 39, 26, 39, 39, 39, 40, 35, 44,
430 //par_level_flag
431 18, 17, 33, 18, 26, 42, 25, 33, 26, 42, 27, 25, 34, 42, 42, 35,
432 26, 27, 42, 20, 20, 25, 25, 26, 11, 19, 27, 33, 42, 35, 35, 43,
433 3,
434 //abs_level_gtx_flag
435 0, 17, 26, 19, 35, 21, 25, 34, 20, 28, 29, 33, 27, 28, 29, 22,
436 34, 28, 44, 37, 38, 0, 25, 19, 20, 13, 14, 57, 44, 30, 30, 23,
437 17, 0, 1, 17, 25, 18, 0, 9, 25, 33, 34, 9, 25, 18, 26, 20,
438 25, 18, 19, 27, 29, 17, 9, 25, 10, 18, 4, 17, 33, 19, 20, 29,
439 18, 11, 4, 28, 2, 10, 3, 3,
440 //coeff_sign_flag
441 5, 10, 53, 43, 25, 46,
442 },
443 {
444 //alf_ctb_flag
445 33, 52, 46, 25, 61, 54, 25, 61, 54,
446 //alf_use_aps_flag
447 46,
448 //alf_ctb_cc_cb_idc
449 25, 35, 38,
450 //alf_ctb_cc_cr_idc
451 25, 28, 38,
452 //alf_ctb_filter_alt_idx
453 11, 26,
454 //sao_merge_left_flag and sao_merge_up_flag
455 2,
456 //sao_type_idx_luma and sao_type_idx_chroma
457 2,
458 //split_cu_flag
459 18, 27, 15, 18, 28, 45, 26, 7, 23,
460 //split_qt_flag
461 26, 36, 38, 18, 34, 21,
462 //mtt_split_cu_vertical_flag
463 43, 42, 37, 42, 44,
464 //mtt_split_cu_binary_flag
465 28, 29, 28, 29,
466 //non_inter_flag
467 25, 20,
468 //cu_skip_flag
469 57, 60, 46,
470 //pred_mode_ibc_flag
471 0, 43, 45,
472 //pred_mode_flag
473 40, 35,
474 //pred_mode_plt_flag
475 17,
476 //cu_act_enabled_flag
477 46,
478 //intra_bdpcm_luma_flag
479 19,
480 //intra_bdpcm_luma_dir_flag
481 21,
482 //intra_mip_flag
483 56, 57, 50, 26,
484 //intra_luma_ref_idx
485 25, 59,
486 //intra_subpartitions_mode_flag
487 33,
488 //intra_subpartitions_split_flag
489 43,
490 //intra_luma_mpm_flag
491 44,
492 //intra_luma_not_planar_flag
493 13, 6,
494 //intra_bdpcm_chroma_flag
495 0,
496 //intra_bdpcm_chroma_dir_flag
497 28,
498 //cclm_mode_flag
499 26,
500 //cclm_mode_idx
501 27,
502 //intra_chroma_pred_mode
503 25,
504 //general_merge_flag
505 6,
506 //inter_pred_idc
507 14, 13, 5, 4, 3, 40,
508 //inter_affine_flag
509 19, 13, 6,
510 //cu_affine_type_flag
511 35,
512 //sym_mvd_flag
513 28,
514 //ref_idx_l0 and ref_idx_l1
515 5, 35,
516 //mvp_l0_flag and mvp_l1_flag
517 34,
518 //amvr_flag
519 59, 50,
520 //amvr_precision_idx
521 38, 26, 60,
522 //bcw_idx
523 5,
524 //cu_coded_flag
525 12,
526 //cu_sbt_flag
527 41, 57,
528 //cu_sbt_quad_flag
529 42,
530 //cu_sbt_horizontal_flag
531 35, 51, 27,
532 //cu_sbt_pos_flag
533 28,
534 //lfnst_idx
535 52, 37, 27,
536 //mts_idx
537 45, 25, 27, 0,
538 //copy_above_palette_indices_flag
539 50,
540 //palette_transpose_flag
541 35,
542 //run_copy_flag
543 58, 45, 45, 30, 38, 45, 38, 46,
544 //regular_merge_flag
545 46, 15,
546 //mmvd_merge_flag
547 25,
548 //mmvd_cand_flag
549 43,
550 //mmvd_distance_idx
551 59,
552 //ciip_flag
553 57,
554 //merge_subblock_flag
555 25, 58, 45,
556 //merge_subblock_idx
557 4,
558 //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
559 18,
560 //abs_mvd_greater0_flag
561 51,
562 //abs_mvd_greater1_flag
563 36,
564 //tu_y_coded_flag
565 15, 6, 5, 14,
566 //tu_cb_coded_flag
567 25, 37,
568 //tu_cr_coded_flag
569 9, 36, 45,
570 //cu_qp_delta_abs
571 CNU, CNU,
572 //cu_chroma_qp_offset_flag
573 CNU,
574 //cu_chroma_qp_offset_idx
575 CNU,
576 //transform_skip_flag
577 25, 17,
578 //tu_joint_cbcr_residual_flag
579 42, 43, 52,
580 //last_sig_coeff_x_prefix
581 6, 6, 12, 14, 6, 4, 14, 7, 6, 4, 29, 7, 6, 6, 12, 28,
582 7, 13, 13, 35, 19, 5, 4,
583 //last_sig_coeff_y_prefix
584 5, 5, 20, 13, 13, 19, 21, 6, 12, 12, 14, 14, 5, 4, 12, 13,
585 7, 13, 12, 41, 11, 5, 27,
586 //sb_coded_flag
587 25, 45, 25, 14, 18, 35, 45,
588 //sig_coeff_flag
589 17, 41, 49, 36, 1, 49, 50, 37, 48, 51, 58, 45, 26, 45, 53, 46,
590 49, 54, 61, 39, 35, 39, 39, 39, 19, 54, 39, 39, 50, 39, 39, 39,
591 0, 39, 39, 39, 9, 49, 50, 36, 48, 59, 59, 38, 34, 45, 38, 31,
592 58, 39, 39, 39, 34, 38, 54, 39, 41, 39, 39, 39, 25, 50, 37,
593 //par_level_flag
594 33, 40, 25, 41, 26, 42, 25, 33, 26, 34, 27, 25, 41, 42, 42, 35,
595 33, 27, 35, 42, 43, 33, 25, 26, 34, 19, 27, 33, 42, 43, 35, 43,
596 11,
597 //abs_level_gtx_flag
598 0, 0, 33, 34, 35, 21, 25, 34, 35, 28, 29, 40, 42, 43, 29, 30,
599 49, 36, 37, 45, 38, 0, 40, 34, 43, 36, 37, 57, 52, 45, 38, 46,
600 25, 0, 0, 17, 25, 26, 0, 9, 25, 33, 19, 0, 25, 33, 26, 20,
601 25, 33, 27, 35, 22, 25, 1, 25, 33, 26, 12, 25, 33, 27, 28, 37,
602 19, 11, 4, 6, 3, 4, 4, 5,
603 //coeff_sign_flag
604 35, 25, 46, 28, 33, 38,
605 },
606 //shiftIdx
607 {
608 //alf_ctb_flag
609 0, 0, 0, 4, 0, 0, 1, 0, 0,
610 //alf_use_aps_flag
611 0,
612 //alf_ctb_cc_cb_idc
613 4, 1, 4,
614 //alf_ctb_cc_cr_idc
615 4, 1, 4,
616 //alf_ctb_filter_alt_idx
617 0, 0,
618 //sao_merge_left_flag and sao_merge_up_flag
619 0,
620 //sao_type_idx_luma and sao_type_idx_chroma
621 4,
622 //split_cu_flag
623 12, 13, 8, 8, 13, 12, 5, 9, 9,
624 //split_qt_flag
625 0, 8, 8, 12, 12, 8,
626 //mtt_split_cu_vertical_flag
627 9, 8, 9, 8, 5,
628 //mtt_split_cu_binary_flag
629 12, 13, 12, 13,
630 //non_inter_flag
631 1, 0,
632 //cu_skip_flag
633 5, 4, 8,
634 //pred_mode_ibc_flag
635 1, 5, 8,
636 //pred_mode_flag
637 5, 1,
638 //pred_mode_plt_flag
639 1,
640 //cu_act_enabled_flag
641 1,
642 //intra_bdpcm_luma_flag
643 1,
644 //intra_bdpcm_luma_dir_flag
645 4,
646 //intra_mip_flag
647 9, 10, 9, 6,
648 //intra_luma_ref_idx
649 5, 8,
650 //intra_subpartitions_mode_flag
651 9,
652 //intra_subpartitions_split_flag
653 2,
654 //intra_luma_mpm_flag
655 6,
656 //intra_luma_not_planar_flag
657 1, 5,
658 //intra_bdpcm_chroma_flag
659 1,
660 //intra_bdpcm_chroma_dir_flag
661 0,
662 //cclm_mode_flag
663 4,
664 //cclm_mode_idx
665 9,
666 //intra_chroma_pred_mode
667 5,
668 //general_merge_flag
669 4,
670 //inter_pred_idc
671 0, 0, 1, 4, 4, 0,
672 //inter_affine_flag
673 4, 0, 0,
674 //cu_affine_type_flag
675 4,
676 //sym_mvd_flag
677 5,
678 //ref_idx_l0 and ref_idx_l1
679 0, 4,
680 //mvp_l0_flag and mvp_l1_flag
681 12,
682 //amvr_flag
683 0, 0,
684 //amvr_precision_idx
685 4, 5, 0,
686 //bcw_idx
687 1,
688 //cu_coded_flag
689 4,
690 //cu_sbt_flag
691 1, 5,
692 //cu_sbt_quad_flag
693 10,
694 //cu_sbt_horizontal_flag
695 8, 4, 1,
696 //cu_sbt_pos_flag
697 13,
698 //lfnst_idx
699 9, 9, 10,
700 //mts_idx
701 8, 0, 9, 0,
702 //copy_above_palette_indices_flag
703 9,
704 //palette_transpose_flag
705 5,
706 //run_copy_flag
707 9, 6, 9, 10, 5, 0, 9, 5,
708 //regular_merge_flag
709 5, 5,
710 //mmvd_merge_flag
711 4,
712 //mmvd_cand_flag
713 10,
714 //mmvd_distance_idx
715 0,
716 //ciip_flag
717 1,
718 //merge_subblock_flag
719 4, 4, 4,
720 //merge_subblock_idx
721 0,
722 //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
723 4,
724 //abs_mvd_greater0_flag
725 9,
726 //abs_mvd_greater1_flag
727 5,
728 //tu_y_coded_flag
729 5, 1, 8, 9,
730 //tu_cb_coded_flag
731 5, 0,
732 //tu_cr_coded_flag
733 2, 1, 0,
734 //cu_qp_delta_abs
735 8, 8,
736 //cu_chroma_qp_offset_flag
737 8,
738 //cu_chroma_qp_offset_idx
739 8,
740 //transform_skip_flag
741 1, 1,
742 //tu_joint_cbcr_residual_flag
743 1, 1, 0,
744 //last_sig_coeff_x_prefix
745 8, 5, 4, 5, 4, 4, 5, 4, 1, 0, 4, 1, 0, 0, 0, 0,
746 1, 0, 0, 0, 5, 4, 4,
747 //last_sig_coeff_y_prefix
748 8, 5, 8, 5, 5, 4, 5, 5, 4, 0, 5, 4, 1, 0, 0, 1,
749 4, 0, 0, 0, 6, 5, 5,
750 //sb_coded_flag
751 8, 5, 5, 8, 5, 8, 8,
752 //sig_coeff_flag
753 12, 9, 9, 10, 9, 9, 9, 10, 8, 8, 8, 10, 9, 13, 8, 8,
754 8, 8, 8, 5, 8, 0, 0, 0, 8, 8, 8, 8, 8, 0, 4, 4,
755 0, 0, 0, 0, 12, 12, 9, 13, 4, 5, 8, 9, 8, 12, 12, 8,
756 4, 0, 0, 0, 8, 8, 8, 8, 4, 0, 0, 0, 13, 13, 8,
757 //par_level_flag
758 8, 9, 12, 13, 13, 13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13,
759 10, 13, 13, 13, 13, 8, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13,
760 6,
761 //abs_level_gtx_flag
762 9, 5, 10, 13, 13, 10, 9, 10, 13, 13, 13, 9, 10, 10, 10, 13,
763 8, 9, 10, 10, 13, 8, 8, 9, 12, 12, 10, 5, 9, 9, 9, 13,
764 1, 5, 9, 9, 9, 6, 5, 9, 10, 10, 9, 9, 9, 9, 9, 9,
765 6, 8, 9, 9, 10, 1, 5, 8, 8, 9, 6, 6, 9, 8, 8, 9,
766 4, 2, 1, 6, 1, 1, 1, 1,
767 //coeff_sign_flag
768 1, 4, 4, 5, 8, 8,
769 }
770 };
771
772 #define MAX_SUB_BLOCKS 16
773 #define MAX_SUB_BLOCK_SIZE 4
774 #define MAX_TB_SIZE 64
775
776 typedef struct ResidualCoding {
777 //common for ts and non ts
778 TransformBlock *tb;
779
780 int log2_sb_w;
781 int log2_sb_h;
782 int last_sub_block;
783 int hist_value;
784 int update_hist;
785 int num_sb_coeff;
786 int rem_bins_pass1;
787
788 int width_in_sbs;
789 int height_in_sbs;
790 int nb_sbs;
791
792 const uint8_t *sb_scan_x_off;
793 const uint8_t *sb_scan_y_off;
794 const uint8_t *scan_x_off;
795 const uint8_t *scan_y_off;
796
797 uint8_t sb_coded_flag[MAX_SUB_BLOCKS * MAX_SUB_BLOCKS];
798 int sig_coeff_flag[MAX_TB_SIZE * MAX_TB_SIZE];
799 int abs_level_pass1[MAX_TB_SIZE * MAX_TB_SIZE]; ///< AbsLevelPass1[][]
800 int abs_level[MAX_TB_SIZE * MAX_TB_SIZE];
801
802 //for ts only
803 uint8_t infer_sb_cbf;
804 int coeff_sign_level[MAX_TB_SIZE * MAX_TB_SIZE]; ///< CoeffSignLevel[][]
805
806 //for non ts only
807 int qstate;
808 int last_scan_pos;
809 int last_significant_coeff_x;
810 int last_significant_coeff_y;
811 } ResidualCoding;
812
813 273 static int cabac_reinit(VVCLocalContext *lc)
814 {
815
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 273 times.
273 return skip_bytes(&lc->ep->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
816 }
817
818 2394 static void cabac_init_state(VVCLocalContext *lc)
819 {
820 2394 const VVCSPS *sps = lc->fc->ps.sps;
821 2394 const H266RawSliceHeader *rsh = lc->sc->sh.r;
822 2394 const int qp = av_clip_uintp2(lc->sc->sh.slice_qp_y, 6);
823 2394 int init_type = 2 - rsh->sh_slice_type;
824
825 2394 ff_vvc_ep_init_stat_coeff(lc->ep, sps->bit_depth, sps->r->sps_persistent_rice_adaptation_enabled_flag);
826
827
3/4
✓ Branch 0 taken 576 times.
✓ Branch 1 taken 1818 times.
✓ Branch 2 taken 576 times.
✗ Branch 3 not taken.
2394 if (rsh->sh_cabac_init_flag && !IS_I(rsh))
828 576 init_type ^= 3;
829
830
2/2
✓ Branch 0 taken 904932 times.
✓ Branch 1 taken 2394 times.
907326 for (int i = 0; i < VVC_CONTEXTS; i++) {
831 904932 VVCCabacState *state = &lc->ep->cabac_state[i];
832 904932 const int init_value = init_values[init_type][i];
833 904932 const int shift_idx = init_values[3][i];
834 904932 const int m = (init_value >> 3) - 4;
835 904932 const int n = ((init_value & 7) * 18) + 1;
836 904932 const int pre = av_clip(((m * (qp - 16)) >> 1) + n, 1, 127);
837
838 904932 state->state[0] = pre << 3;
839 904932 state->state[1] = pre << 7;
840 904932 state->shift[0] = (shift_idx >> 2 ) + 2;
841 904932 state->shift[1] = (shift_idx & 3 ) + 3 + state->shift[0];
842 }
843 2394 }
844
845 55785 int ff_vvc_cabac_init(VVCLocalContext *lc,
846 const int ctu_idx, const int rx, const int ry)
847 {
848 55785 int ret = 0;
849 55785 const VVCPPS *pps = lc->fc->ps.pps;
850 55785 const int first_ctb_in_slice = !ctu_idx;
851
4/4
✓ Branch 0 taken 6889 times.
✓ Branch 1 taken 48896 times.
✓ Branch 2 taken 2282 times.
✓ Branch 3 taken 4607 times.
55785 const int first_ctb_in_tile = rx == pps->ctb_to_col_bd[rx] && ry == pps->ctb_to_row_bd[ry];
852
853
4/4
✓ Branch 0 taken 53918 times.
✓ Branch 1 taken 1867 times.
✓ Branch 2 taken 527 times.
✓ Branch 3 taken 53391 times.
55785 if (first_ctb_in_slice|| first_ctb_in_tile) {
854
4/4
✓ Branch 0 taken 2013 times.
✓ Branch 1 taken 381 times.
✓ Branch 2 taken 273 times.
✓ Branch 3 taken 1740 times.
2394 if (lc->sc->nb_eps == 1 && !first_ctb_in_slice)
855 273 ret = cabac_reinit(lc);
856
1/2
✓ Branch 0 taken 2394 times.
✗ Branch 1 not taken.
2394 if (!ret)
857 2394 cabac_init_state(lc);
858 }
859 55785 return ret;
860 }
861
862 //fixme
863 2250584 static void vvc_refill2(CABACContext* c) {
864 int i;
865 unsigned x;
866 #if !HAVE_FAST_CLZ
867 x = c->low ^ (c->low - 1);
868 i = 7 - ff_h264_norm_shift[x >> (CABAC_BITS - 1)];
869 #else
870 2250584 i = ff_ctz(c->low) - CABAC_BITS;
871 #endif
872
873 2250584 x = -CABAC_MASK;
874
875 #if CABAC_BITS == 16
876 2250584 x += (c->bytestream[0] << 9) + (c->bytestream[1] << 1);
877 #else
878 x += c->bytestream[0] << 1;
879 #endif
880
881 2250584 c->low += x << i;
882 #if !UNCHECKED_BITSTREAM_READER
883
2/2
✓ Branch 0 taken 2250463 times.
✓ Branch 1 taken 121 times.
2250584 if (c->bytestream < c->bytestream_end)
884 #endif
885 2250463 c->bytestream += CABAC_BITS / 8;
886 2250584 }
887
888 58547882 static int inline vvc_get_cabac(CABACContext *c, VVCCabacState* base, const int ctx)
889 {
890 58547882 VVCCabacState *s = base + ctx;
891 58547882 const int qRangeIdx = c->range >> 5;
892 58547882 const int pState = s->state[1] + (s->state[0] << 4);
893 58547882 const int valMps = pState >> 14;
894
2/2
✓ Branch 0 taken 24028614 times.
✓ Branch 1 taken 34519268 times.
58547882 const int RangeLPS = (qRangeIdx * ((valMps ? 32767 - pState : pState) >> 9 ) >> 1) + 4;
895 int bit, lps_mask;
896
897 58547882 c->range -= RangeLPS;
898 58547882 lps_mask = ((c->range<<(CABAC_BITS+1)) - c->low)>>31;
899
900 58547882 c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask;
901 58547882 c->range += (RangeLPS - c->range) & lps_mask;
902
903 58547882 bit = valMps ^ (lps_mask & 1);
904
905 58547882 lps_mask = ff_h264_norm_shift[c->range];
906 58547882 c->range <<= lps_mask;
907 58547882 c->low <<= lps_mask;
908
909
2/2
✓ Branch 0 taken 2250584 times.
✓ Branch 1 taken 56297298 times.
58547882 if (!(c->low & CABAC_MASK))
910 2250584 vvc_refill2(c);
911 58547882 s->state[0] = s->state[0] - (s->state[0] >> s->shift[0]) + (1023 * bit >> s->shift[0]);
912 58547882 s->state[1] = s->state[1] - (s->state[1] >> s->shift[1]) + (16383 * bit >> s->shift[1]);
913 58547882 return bit;
914 }
915
916 #define GET_CABAC(ctx) vvc_get_cabac(&lc->ep->cc, lc->ep->cabac_state, ctx)
917
918 //9.3.3.4 Truncated binary (TB) binarization process
919 359398 static int truncated_binary_decode(VVCLocalContext *lc, const int c_max)
920 {
921 359398 const int n = c_max + 1;
922 359398 const int k = av_log2(n);
923 359398 const int u = (1 << (k+1)) - n;
924 359398 int v = 0;
925
2/2
✓ Branch 0 taken 1229544 times.
✓ Branch 1 taken 359398 times.
1588942 for (int i = 0; i < k; i++)
926 1229544 v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
927
2/2
✓ Branch 0 taken 183378 times.
✓ Branch 1 taken 176020 times.
359398 if (v >= u) {
928 183378 v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
929 183378 v -= u;
930 }
931 359398 return v;
932 }
933
934 // 9.3.3.5 k-th order Exp - Golomb binarization process
935 50372 static int kth_order_egk_decode(CABACContext *c, int k, const int max)
936 {
937 50372 int bit = 1;
938 50372 int value = 0;
939 50372 int symbol = 0;
940
941
2/2
✓ Branch 0 taken 91119 times.
✓ Branch 1 taken 50372 times.
141491 while (bit) {
942 91119 bit = get_cabac_bypass(c);
943
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 91119 times.
91119 if (max - value < (bit << k))
944 return AVERROR_INVALIDDATA;
945 91119 value += bit << k++;
946 }
947
948
2/2
✓ Branch 0 taken 23986 times.
✓ Branch 1 taken 26386 times.
50372 if (--k) {
949
2/2
✓ Branch 0 taken 41492 times.
✓ Branch 1 taken 23986 times.
65478 for (int i = 0; i < k; i++)
950 41492 symbol = (symbol << 1) | get_cabac_bypass(c);
951 23986 value += symbol;
952 }
953
954
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 50372 times.
50372 if (value > max)
955 return AVERROR_INVALIDDATA;
956
957 50372 return value;
958 }
959
960 // 9.3.3.6 Limited k-th order Exp-Golomb binarization process
961 230103 static int limited_kth_order_egk_decode(CABACContext *c, const int k, const int max_pre_ext_len, const int trunc_suffix_len)
962 {
963 230103 int pre_ext_len = 0;
964 int escape_length;
965 230103 int val = 0;
966
4/4
✓ Branch 0 taken 706816 times.
✓ Branch 1 taken 110 times.
✓ Branch 3 taken 476823 times.
✓ Branch 4 taken 229993 times.
706926 while ((pre_ext_len < max_pre_ext_len) && get_cabac_bypass(c))
967 476823 pre_ext_len++;
968
2/2
✓ Branch 0 taken 110 times.
✓ Branch 1 taken 229993 times.
230103 if (pre_ext_len == max_pre_ext_len)
969 110 escape_length = trunc_suffix_len;
970 else
971 229993 escape_length = pre_ext_len + k;
972
2/2
✓ Branch 0 taken 775453 times.
✓ Branch 1 taken 230103 times.
1005556 while (escape_length-- > 0) {
973 775453 val = (val << 1) + get_cabac_bypass(c);
974 }
975 230103 val += ((1 << pre_ext_len) - 1) << k;
976 230103 return val;
977 }
978
979 // 9.3.3.7 Fixed-length binarization process
980 33621 static int fixed_length_decode(CABACContext* c, const int len)
981 {
982 33621 int value = 0;
983
984
2/2
✓ Branch 0 taken 216969 times.
✓ Branch 1 taken 33621 times.
250590 for (int i = 0; i < len; i++)
985 216969 value = (value << 1) | get_cabac_bypass(c);
986
987 33621 return value;
988 }
989
990 static av_always_inline
991 4103699 void get_left_top(const VVCLocalContext *lc, uint8_t *left, uint8_t *top,
992 const int x0, const int y0, const uint8_t *left_ctx, const uint8_t *top_ctx)
993 {
994 4103699 const VVCFrameContext *fc = lc->fc;
995 4103699 const VVCSPS *sps = fc->ps.sps;
996 4103699 const int min_cb_width = fc->ps.pps->min_cb_width;
997 4103699 const int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
998 4103699 const int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
999 4103699 const int x_cb = x0 >> sps->min_cb_log2_size_y;
1000 4103699 const int y_cb = y0 >> sps->min_cb_log2_size_y;
1001
1002
4/4
✓ Branch 0 taken 800720 times.
✓ Branch 1 taken 3302979 times.
✓ Branch 2 taken 668182 times.
✓ Branch 3 taken 132538 times.
4103699 if (lc->ctb_left_flag || x0b)
1003 3971161 *left = SAMPLE_CTB(left_ctx, x_cb - 1, y_cb);
1004
4/4
✓ Branch 0 taken 1233435 times.
✓ Branch 1 taken 2870264 times.
✓ Branch 2 taken 1044734 times.
✓ Branch 3 taken 188701 times.
4103699 if (lc->ctb_up_flag || y0b)
1005 3914998 *top = SAMPLE_CTB(top_ctx, x_cb, y_cb - 1);
1006 4103699 }
1007
1008 static av_always_inline
1009 686164 uint8_t get_inc(VVCLocalContext *lc, const uint8_t *ctx)
1010 {
1011 686164 uint8_t left = 0, top = 0;
1012 686164 get_left_top(lc, &left, &top, lc->cu->x0, lc->cu->y0, ctx, ctx);
1013 686164 return left + top;
1014 }
1015
1016 25043 int ff_vvc_sao_merge_flag_decode(VVCLocalContext *lc)
1017 {
1018 25043 return GET_CABAC(SAO_MERGE_FLAG);
1019 }
1020
1021 14344 int ff_vvc_sao_type_idx_decode(VVCLocalContext *lc)
1022 {
1023
2/2
✓ Branch 1 taken 9461 times.
✓ Branch 2 taken 4883 times.
14344 if (!GET_CABAC(SAO_TYPE_IDX))
1024 9461 return SAO_NOT_APPLIED;
1025
1026
2/2
✓ Branch 1 taken 1453 times.
✓ Branch 2 taken 3430 times.
4883 if (!get_cabac_bypass(&lc->ep->cc))
1027 1453 return SAO_BAND;
1028 3430 return SAO_EDGE;
1029 }
1030
1031 1773 int ff_vvc_sao_band_position_decode(VVCLocalContext *lc)
1032 {
1033 1773 return fixed_length_decode(&lc->ep->cc, 5);
1034 }
1035
1036 25700 int ff_vvc_sao_offset_abs_decode(VVCLocalContext *lc)
1037 {
1038 25700 int i = 0;
1039 25700 const int length = (1 << (FFMIN(lc->fc->ps.sps->bit_depth, 10) - 5)) - 1;
1040
1041
4/4
✓ Branch 0 taken 130647 times.
✓ Branch 1 taken 262 times.
✓ Branch 3 taken 105209 times.
✓ Branch 4 taken 25438 times.
130909 while (i < length && get_cabac_bypass(&lc->ep->cc))
1042 105209 i++;
1043 25700 return i;
1044 }
1045
1046 3338 int ff_vvc_sao_offset_sign_decode(VVCLocalContext *lc)
1047 {
1048 3338 return get_cabac_bypass(&lc->ep->cc);
1049 }
1050
1051 3430 int ff_vvc_sao_eo_class_decode(VVCLocalContext *lc)
1052 {
1053 3430 return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1054 }
1055
1056 65751 int ff_vvc_alf_ctb_flag(VVCLocalContext *lc, const int rx, const int ry, const int c_idx)
1057 {
1058 65751 int inc = c_idx * 3;
1059 65751 const VVCFrameContext *fc = lc->fc;
1060
2/2
✓ Branch 0 taken 56241 times.
✓ Branch 1 taken 9510 times.
65751 if (lc->ctb_left_flag) {
1061 56241 const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1062 56241 inc += left->ctb_flag[c_idx];
1063 }
1064
2/2
✓ Branch 0 taken 49854 times.
✓ Branch 1 taken 15897 times.
65751 if (lc->ctb_up_flag) {
1065 49854 const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1066 49854 inc += above->ctb_flag[c_idx];
1067 }
1068 65751 return GET_CABAC(ALF_CTB_FLAG + inc);
1069 }
1070
1071 20237 int ff_vvc_alf_use_aps_flag(VVCLocalContext *lc)
1072 {
1073 20237 return GET_CABAC(ALF_USE_APS_FLAG);
1074 }
1075
1076 5167 int ff_vvc_alf_luma_prev_filter_idx(VVCLocalContext *lc)
1077 {
1078 5167 return truncated_binary_decode(lc, lc->sc->sh.r->sh_num_alf_aps_ids_luma - 1);
1079 }
1080
1081 2803 int ff_vvc_alf_luma_fixed_filter_idx(VVCLocalContext *lc)
1082 {
1083 2803 return truncated_binary_decode(lc, 15);
1084 }
1085
1086 18421 int ff_vvc_alf_ctb_filter_alt_idx(VVCLocalContext *lc, const int c_idx, const int num_chroma_filters)
1087 {
1088 18421 int i = 0;
1089 18421 const int length = num_chroma_filters - 1;
1090
1091
4/4
✓ Branch 0 taken 34163 times.
✓ Branch 1 taken 3130 times.
✓ Branch 3 taken 18872 times.
✓ Branch 4 taken 15291 times.
37293 while (i < length && GET_CABAC(ALF_CTB_FILTER_ALT_IDX + c_idx - 1))
1092 18872 i++;
1093 18421 return i;
1094 }
1095
1096 22625 int ff_vvc_alf_ctb_cc_idc(VVCLocalContext *lc, const int rx, const int ry, const int idx, const int cc_filters_signalled)
1097 {
1098
2/2
✓ Branch 0 taken 12154 times.
✓ Branch 1 taken 10471 times.
22625 int inc = !idx ? ALF_CTB_CC_CB_IDC : ALF_CTB_CC_CR_IDC;
1099 22625 int i = 0;
1100 22625 const VVCFrameContext *fc = lc->fc;
1101
2/2
✓ Branch 0 taken 19914 times.
✓ Branch 1 taken 2711 times.
22625 if (lc->ctb_left_flag) {
1102 19914 const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1103 19914 inc += left->ctb_cc_idc[idx] != 0;
1104 }
1105
2/2
✓ Branch 0 taken 18700 times.
✓ Branch 1 taken 3925 times.
22625 if (lc->ctb_up_flag) {
1106 18700 const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1107 18700 inc += above->ctb_cc_idc[idx] != 0;
1108 }
1109
1110
2/2
✓ Branch 1 taken 12098 times.
✓ Branch 2 taken 10527 times.
22625 if (!GET_CABAC(inc))
1111 12098 return 0;
1112 10527 i++;
1113
4/4
✓ Branch 0 taken 17808 times.
✓ Branch 1 taken 1908 times.
✓ Branch 3 taken 9189 times.
✓ Branch 4 taken 8619 times.
19716 while (i < cc_filters_signalled && get_cabac_bypass(&lc->ep->cc))
1114 9189 i++;
1115 10527 return i;
1116 }
1117
1118 2277042 int ff_vvc_split_cu_flag(VVCLocalContext *lc, const int x0, const int y0,
1119 const int cb_width, const int cb_height, const int is_chroma, const VVCAllowedSplit *a)
1120 {
1121 2277042 const VVCFrameContext *fc = lc->fc;
1122 2277042 const VVCPPS *pps = fc->ps.pps;
1123
4/4
✓ Branch 0 taken 2272013 times.
✓ Branch 1 taken 5029 times.
✓ Branch 2 taken 2217266 times.
✓ Branch 3 taken 54747 times.
2277042 const int is_inside = (x0 + cb_width <= pps->width) && (y0 + cb_height <= pps->height);
1124
1125
12/12
✓ Branch 0 taken 905761 times.
✓ Branch 1 taken 1371281 times.
✓ Branch 2 taken 658413 times.
✓ Branch 3 taken 247348 times.
✓ Branch 4 taken 652586 times.
✓ Branch 5 taken 5827 times.
✓ Branch 6 taken 651001 times.
✓ Branch 7 taken 1585 times.
✓ Branch 8 taken 56499 times.
✓ Branch 9 taken 594502 times.
✓ Branch 10 taken 1622764 times.
✓ Branch 11 taken 59776 times.
2277042 if ((a->btv || a->bth || a->ttv || a->tth || a->qt) && is_inside)
1126 {
1127 1622764 uint8_t inc = 0, left_height = cb_height, top_width = cb_width;
1128
1129 1622764 get_left_top(lc, &left_height, &top_width, x0, y0, fc->tab.cb_height[is_chroma], fc->tab.cb_width[is_chroma]);
1130 1622764 inc += left_height < cb_height;
1131 1622764 inc += top_width < cb_width;
1132 1622764 inc += (a->btv + a->bth + a->ttv + a->tth + 2 * a->qt - 1) / 2 * 3;
1133
1134 1622764 return GET_CABAC(SPLIT_CU_FLAG + inc);
1135
1136 }
1137 654278 return !is_inside;
1138 }
1139
1140 295495 static int split_qt_flag_decode(VVCLocalContext *lc, const int x0, const int y0, const int ch_type, const int cqt_depth)
1141 {
1142 295495 const VVCFrameContext *fc = lc->fc;
1143 295495 int inc = 0;
1144 295495 uint8_t depth_left = 0, depth_top = 0;
1145
1146 295495 get_left_top(lc, &depth_left, &depth_top, x0, y0, fc->tab.cqt_depth[ch_type], fc->tab.cqt_depth[ch_type]);
1147 295495 inc += depth_left > cqt_depth;
1148 295495 inc += depth_top > cqt_depth;
1149
2/2
✓ Branch 0 taken 224088 times.
✓ Branch 1 taken 71407 times.
295495 inc += (cqt_depth >= 2) * 3;
1150
1151 295495 return GET_CABAC(SPLIT_QT_FLAG + inc);
1152 }
1153
1154 775925 static int mtt_split_cu_vertical_flag_decode(VVCLocalContext *lc, const int x0, const int y0,
1155 const int cb_width, const int cb_height, const int ch_type, const VVCAllowedSplit* a)
1156 {
1157
8/8
✓ Branch 0 taken 89104 times.
✓ Branch 1 taken 686821 times.
✓ Branch 2 taken 18204 times.
✓ Branch 3 taken 70900 times.
✓ Branch 4 taken 125700 times.
✓ Branch 5 taken 579325 times.
✓ Branch 6 taken 15072 times.
✓ Branch 7 taken 110628 times.
775925 if ((a->bth || a->tth) && (a->btv || a->ttv)) {
1158 int inc;
1159 594397 const int v = a->btv + a->ttv;
1160 594397 const int h = a->bth + a->tth;
1161
2/2
✓ Branch 0 taken 95794 times.
✓ Branch 1 taken 498603 times.
594397 if (v > h)
1162 95794 inc = 4;
1163
2/2
✓ Branch 0 taken 95839 times.
✓ Branch 1 taken 402764 times.
498603 else if (v < h)
1164 95839 inc = 3;
1165 else {
1166 402764 const VVCFrameContext *fc = lc->fc;
1167 402764 const VVCSPS *sps = fc->ps.sps;
1168 402764 const int min_cb_width = fc->ps.pps->min_cb_width;
1169 402764 const int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
1170 402764 const int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
1171 402764 const int x_cb = x0 >> sps->min_cb_log2_size_y;
1172 402764 const int y_cb = y0 >> sps->min_cb_log2_size_y;
1173
4/4
✓ Branch 0 taken 118293 times.
✓ Branch 1 taken 284471 times.
✓ Branch 2 taken 97192 times.
✓ Branch 3 taken 21101 times.
402764 const int available_a = lc->ctb_up_flag || y0b;
1174
4/4
✓ Branch 0 taken 73214 times.
✓ Branch 1 taken 329550 times.
✓ Branch 2 taken 57662 times.
✓ Branch 3 taken 15552 times.
402764 const int available_l = lc->ctb_left_flag || x0b;
1175
2/2
✓ Branch 0 taken 381663 times.
✓ Branch 1 taken 21101 times.
402764 const int da = cb_width / (available_a ? SAMPLE_CTB(fc->tab.cb_width[ch_type], x_cb, y_cb - 1) : 1);
1176
2/2
✓ Branch 0 taken 387212 times.
✓ Branch 1 taken 15552 times.
402764 const int dl = cb_height / (available_l ? SAMPLE_CTB(fc->tab.cb_height[ch_type], x_cb - 1, y_cb) : 1);
1177
1178
6/6
✓ Branch 0 taken 293880 times.
✓ Branch 1 taken 108884 times.
✓ Branch 2 taken 274262 times.
✓ Branch 3 taken 19618 times.
✓ Branch 4 taken 13415 times.
✓ Branch 5 taken 260847 times.
402764 if (da == dl || !available_a || !available_l)
1179 141917 inc = 0;
1180
2/2
✓ Branch 0 taken 136649 times.
✓ Branch 1 taken 124198 times.
260847 else if (da < dl)
1181 136649 inc = 1;
1182 else
1183 124198 inc = 2;
1184 }
1185 594397 return GET_CABAC(MTT_SPLIT_CU_VERTICAL_FLAG + inc);
1186 }
1187
4/4
✓ Branch 0 taken 71646 times.
✓ Branch 1 taken 109882 times.
✓ Branch 2 taken 70900 times.
✓ Branch 3 taken 746 times.
181528 return !(a->bth || a->tth);
1188 }
1189
1190 520688 static int mtt_split_cu_binary_flag_decode(VVCLocalContext *lc, const int mtt_split_cu_vertical_flag, const int mtt_depth)
1191 {
1192 520688 const int inc = (2 * mtt_split_cu_vertical_flag) + ((mtt_depth <= 1) ? 1 : 0);
1193 520688 return GET_CABAC(MTT_SPLIT_CU_BINARY_FLAG + inc);
1194 }
1195
1196 890161 VVCSplitMode ff_vvc_split_mode(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height,
1197 const int cqt_depth, const int mtt_depth, const int ch_type, const VVCAllowedSplit *a)
1198 {
1199
8/8
✓ Branch 0 taken 171852 times.
✓ Branch 1 taken 718309 times.
✓ Branch 2 taken 43522 times.
✓ Branch 3 taken 128330 times.
✓ Branch 4 taken 39239 times.
✓ Branch 5 taken 4283 times.
✓ Branch 6 taken 746 times.
✓ Branch 7 taken 38493 times.
890161 const int allow_no_qt = a->btv || a->bth || a->ttv || a->tth;
1200 int split_qt_flag;
1201 int mtt_split_cu_vertical_flag;
1202 int mtt_split_cu_binary_flag;
1203 890161 const VVCSplitMode mtt_split_modes[] = {
1204 SPLIT_TT_HOR, SPLIT_BT_HOR, SPLIT_TT_VER, SPLIT_BT_VER,
1205 };
1206
4/4
✓ Branch 0 taken 851668 times.
✓ Branch 1 taken 38493 times.
✓ Branch 2 taken 295495 times.
✓ Branch 3 taken 556173 times.
890161 if (allow_no_qt && a->qt) {
1207 295495 split_qt_flag = split_qt_flag_decode(lc, x0, y0, ch_type, cqt_depth);
1208 } else {
1209
3/4
✓ Branch 0 taken 556173 times.
✓ Branch 1 taken 38493 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 556173 times.
594666 split_qt_flag = !allow_no_qt || a->qt;
1210 }
1211
2/2
✓ Branch 0 taken 114236 times.
✓ Branch 1 taken 775925 times.
890161 if (split_qt_flag)
1212 114236 return SPLIT_QT;
1213 775925 mtt_split_cu_vertical_flag = mtt_split_cu_vertical_flag_decode(lc, x0, y0, cb_width, cb_height, ch_type, a);
1214
6/6
✓ Branch 0 taken 649363 times.
✓ Branch 1 taken 126562 times.
✓ Branch 2 taken 457217 times.
✓ Branch 3 taken 192146 times.
✓ Branch 4 taken 203771 times.
✓ Branch 5 taken 253446 times.
775925 if ((a->btv && a->ttv && mtt_split_cu_vertical_flag) ||
1215
6/6
✓ Branch 0 taken 484161 times.
✓ Branch 1 taken 38318 times.
✓ Branch 2 taken 300877 times.
✓ Branch 3 taken 183284 times.
✓ Branch 4 taken 267242 times.
✓ Branch 5 taken 33635 times.
522479 (a->bth && a->tth && !mtt_split_cu_vertical_flag)) {
1216 520688 mtt_split_cu_binary_flag = mtt_split_cu_binary_flag_decode(lc, mtt_split_cu_vertical_flag, mtt_depth);
1217 } else {
1218
4/4
✓ Branch 0 taken 80460 times.
✓ Branch 1 taken 174777 times.
✓ Branch 2 taken 2341 times.
✓ Branch 3 taken 78119 times.
255237 if (!a->btv && !a->bth)
1219 2341 mtt_split_cu_binary_flag = 0;
1220
4/4
✓ Branch 0 taken 210328 times.
✓ Branch 1 taken 42568 times.
✓ Branch 2 taken 179000 times.
✓ Branch 3 taken 31328 times.
252896 else if (!a->ttv && !a->tth)
1221 179000 mtt_split_cu_binary_flag = 1;
1222
4/4
✓ Branch 0 taken 66361 times.
✓ Branch 1 taken 7535 times.
✓ Branch 2 taken 37026 times.
✓ Branch 3 taken 29335 times.
73896 else if (a->bth && a->ttv)
1223 37026 mtt_split_cu_binary_flag = 1 - mtt_split_cu_vertical_flag;
1224 else
1225 36870 mtt_split_cu_binary_flag = mtt_split_cu_vertical_flag;
1226 }
1227 775925 return mtt_split_modes[(mtt_split_cu_vertical_flag << 1) + mtt_split_cu_binary_flag];
1228 }
1229
1230 42486 int ff_vvc_non_inter_flag(VVCLocalContext *lc, const int x0, const int y0, const int ch_type)
1231 {
1232 42486 const VVCFrameContext *fc = lc->fc;
1233 42486 uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1234
1235 42486 get_left_top(lc, &left, &top, x0, y0, fc->tab.cpm[ch_type], fc->tab.cpm[ch_type]);
1236
4/4
✓ Branch 0 taken 31276 times.
✓ Branch 1 taken 11210 times.
✓ Branch 2 taken 5716 times.
✓ Branch 3 taken 25560 times.
42486 inc = left == MODE_INTRA || top == MODE_INTRA;
1237 42486 return GET_CABAC(NON_INTER_FLAG + inc);
1238 }
1239
1240 211925 int ff_vvc_pred_mode_flag(VVCLocalContext *lc, const int is_chroma)
1241 {
1242 211925 const VVCFrameContext *fc = lc->fc;
1243 211925 const CodingUnit *cu = lc->cu;
1244 211925 uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1245
1246 211925 get_left_top(lc, &left, &top, cu->x0, cu->y0, fc->tab.cpm[is_chroma], fc->tab.cpm[is_chroma]);
1247
4/4
✓ Branch 0 taken 167881 times.
✓ Branch 1 taken 44044 times.
✓ Branch 2 taken 18663 times.
✓ Branch 3 taken 149218 times.
211925 inc = left == MODE_INTRA || top == MODE_INTRA;
1248 211925 return GET_CABAC(PRED_MODE_FLAG + inc);
1249 }
1250
1251 33521 int ff_vvc_pred_mode_plt_flag(VVCLocalContext *lc)
1252 {
1253 33521 return GET_CABAC(PRED_MODE_PLT_FLAG);
1254 }
1255
1256 57938 int ff_vvc_intra_bdpcm_luma_flag(VVCLocalContext *lc)
1257 {
1258 57938 return GET_CABAC(INTRA_BDPCM_LUMA_FLAG);
1259 }
1260
1261 18949 int ff_vvc_intra_bdpcm_luma_dir_flag(VVCLocalContext *lc)
1262 {
1263 18949 return GET_CABAC(INTRA_BDPCM_LUMA_DIR_FLAG);
1264 }
1265
1266 50258 int ff_vvc_intra_bdpcm_chroma_flag(VVCLocalContext *lc)
1267 {
1268 50258 return GET_CABAC(INTRA_BDPCM_CHROMA_FLAG);
1269 }
1270
1271 258 int ff_vvc_intra_bdpcm_chroma_dir_flag(VVCLocalContext *lc)
1272 {
1273 258 return GET_CABAC(INTRA_BDPCM_CHROMA_DIR_FLAG);
1274 }
1275
1276 686164 int ff_vvc_cu_skip_flag(VVCLocalContext *lc, const uint8_t *cu_skip_flag)
1277 {
1278 686164 const int inc = get_inc(lc, cu_skip_flag);
1279 686164 return GET_CABAC(CU_SKIP_FLAG + inc);
1280 }
1281
1282 189023 int ff_vvc_pred_mode_ibc_flag(VVCLocalContext *lc, const int is_chroma)
1283 {
1284 189023 const VVCFrameContext *fc = lc->fc;
1285 189023 const CodingUnit *cu = lc->cu;
1286 189023 uint8_t left_mode = MODE_INTER, top_mode = MODE_INTER;
1287 int inc;
1288
1289 189023 get_left_top(lc, &left_mode, &top_mode, cu->x0, cu->y0, fc->tab.cpm[is_chroma], fc->tab.cpm[is_chroma]);
1290 189023 inc = (left_mode == MODE_IBC) + (top_mode == MODE_IBC);
1291 189023 return GET_CABAC(PRED_MODE_IBC_FLAG + inc);
1292 }
1293
1294 static av_always_inline
1295 374620 uint8_t get_mip_inc(VVCLocalContext *lc, const uint8_t *ctx)
1296 {
1297 374620 uint8_t left = 0, top = 0;
1298 374620 get_left_top(lc, &left, &top, lc->cu->x0, lc->cu->y0, ctx, ctx);
1299 374620 return (left & 1) + (top & 1);
1300 }
1301
1302 474655 int ff_vvc_intra_mip_flag(VVCLocalContext *lc, const uint8_t *intra_mip_flag)
1303 {
1304 474655 const int w = lc->cu->cb_width;
1305 474655 const int h = lc->cu->cb_height;
1306
4/4
✓ Branch 0 taken 402353 times.
✓ Branch 1 taken 72302 times.
✓ Branch 2 taken 374620 times.
✓ Branch 3 taken 27733 times.
474655 const int inc = (w > h * 2 || h > w * 2) ? 3 : get_mip_inc(lc, intra_mip_flag);
1307 474655 return GET_CABAC(INTRA_MIP_FLAG + inc);
1308 }
1309
1310 111335 int ff_vvc_intra_mip_transposed_flag(VVCLocalContext *lc)
1311 {
1312 111335 return get_cabac_bypass(&lc->ep->cc);
1313 }
1314
1315 111335 int ff_vvc_intra_mip_mode(VVCLocalContext *lc)
1316 {
1317 111335 const int w = lc->cu->cb_width;
1318 111335 const int h = lc->cu->cb_height;
1319
4/4
✓ Branch 0 taken 32475 times.
✓ Branch 1 taken 78860 times.
✓ Branch 2 taken 16281 times.
✓ Branch 3 taken 16194 times.
206476 const int c_max = (w == 4 && h == 4) ? 15 :
1320
8/8
✓ Branch 0 taken 78860 times.
✓ Branch 1 taken 16281 times.
✓ Branch 2 taken 54719 times.
✓ Branch 3 taken 24141 times.
✓ Branch 4 taken 18293 times.
✓ Branch 5 taken 36426 times.
✓ Branch 6 taken 10861 times.
✓ Branch 7 taken 7432 times.
95141 ((w == 4 || h == 4) || (w == 8 && h == 8)) ? 7: 5;
1321 111335 return truncated_binary_decode(lc, c_max);
1322 }
1323
1324 445971 int ff_vvc_intra_luma_ref_idx(VVCLocalContext *lc)
1325 {
1326 int i;
1327
2/2
✓ Branch 0 taken 491103 times.
✓ Branch 1 taken 26705 times.
517808 for (i = 0; i < 2; i++) {
1328
2/2
✓ Branch 1 taken 419266 times.
✓ Branch 2 taken 71837 times.
491103 if (!GET_CABAC(INTRA_LUMA_REF_IDX + i))
1329 419266 return i;
1330 }
1331 26705 return i;
1332 }
1333
1334 371225 int ff_vvc_intra_subpartitions_mode_flag(VVCLocalContext *lc)
1335 {
1336 371225 return GET_CABAC(INTRA_SUBPARTITIONS_MODE_FLAG);
1337 }
1338
1339 506878 enum IspType ff_vvc_isp_split_type(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1340 {
1341
2/2
✓ Branch 0 taken 441671 times.
✓ Branch 1 taken 65207 times.
506878 if (!intra_subpartitions_mode_flag)
1342 441671 return ISP_NO_SPLIT;
1343 65207 return 1 + GET_CABAC(INTRA_SUBPARTITIONS_SPLIT_FLAG);
1344 }
1345
1346 461746 int ff_vvc_intra_luma_mpm_flag(VVCLocalContext *lc)
1347 {
1348 461746 return GET_CABAC(INTRA_LUMA_MPM_FLAG);
1349 }
1350
1351 333406 int ff_vvc_intra_luma_not_planar_flag(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1352 {
1353
2/2
✓ Branch 0 taken 283813 times.
✓ Branch 1 taken 49593 times.
333406 return GET_CABAC(INTRA_LUMA_NOT_PLANAR_FLAG + !intra_subpartitions_mode_flag);
1354 }
1355
1356 203367 int ff_vvc_intra_luma_mpm_idx(VVCLocalContext *lc)
1357 {
1358 int i;
1359
4/4
✓ Branch 0 taken 379629 times.
✓ Branch 1 taken 14577 times.
✓ Branch 3 taken 190839 times.
✓ Branch 4 taken 188790 times.
394206 for (i = 0; i < 4 && get_cabac_bypass(&lc->ep->cc); i++)
1360 /* nothing */;
1361 203367 return i;
1362 }
1363
1364 128340 int ff_vvc_intra_luma_mpm_remainder(VVCLocalContext *lc)
1365 {
1366 128340 return truncated_binary_decode(lc, 60);
1367 }
1368
1369 235191 int ff_vvc_cclm_mode_flag(VVCLocalContext *lc)
1370 {
1371 235191 return GET_CABAC(CCLM_MODE_FLAG);
1372 }
1373
1374 101418 int ff_vvc_cclm_mode_idx(VVCLocalContext *lc)
1375 {
1376
2/2
✓ Branch 1 taken 57124 times.
✓ Branch 2 taken 44294 times.
101418 if (!GET_CABAC(CCLM_MODE_IDX))
1377 57124 return 0;
1378 44294 return get_cabac_bypass(&lc->ep->cc) + 1;
1379 }
1380
1381 155203 int ff_vvc_intra_chroma_pred_mode(VVCLocalContext *lc)
1382 {
1383
2/2
✓ Branch 1 taken 110750 times.
✓ Branch 2 taken 44453 times.
155203 if (!GET_CABAC(INTRA_CHROMA_PRED_MODE))
1384 110750 return 4;
1385 44453 return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1386 }
1387
1388 43246 int ff_vvc_palette_predictor_run(VVCLocalContext *lc, const int max)
1389 {
1390 43246 return kth_order_egk_decode(&lc->ep->cc, 0, max);
1391 }
1392
1393 6977 int ff_vvc_num_signalled_palette_entries(VVCLocalContext *lc, const int max)
1394 {
1395 6977 return kth_order_egk_decode(&lc->ep->cc, 0, max);
1396 }
1397
1398 4254 int ff_vvc_new_palette_entries(VVCLocalContext *lc, const int bit_depth)
1399 {
1400 4254 return fixed_length_decode(&lc->ep->cc, bit_depth);
1401 }
1402
1403 6977 bool ff_vvc_palette_escape_val_present_flag(VVCLocalContext *lc)
1404 {
1405 6977 return get_cabac_bypass(&lc->ep->cc);
1406 }
1407
1408 6462 bool ff_vvc_palette_transpose_flag(VVCLocalContext *lc)
1409 {
1410 6462 return GET_CABAC(PALETTE_TRANSPOSE_FLAG);
1411 }
1412
1413 1000866 bool ff_vvc_run_copy_flag(VVCLocalContext *lc, const int prev_run_type, const int prev_run_position, const int cur_pos)
1414 {
1415 1000866 uint8_t run_left_lut[] = { 0, 1, 2, 3, 4 };
1416 1000866 uint8_t run_top_lut[] = { 5, 6, 6, 7, 7 };
1417
1418 1000866 int bin_dist = cur_pos - prev_run_position - 1;
1419
2/2
✓ Branch 0 taken 378928 times.
✓ Branch 1 taken 621938 times.
1000866 uint8_t *run_lut = prev_run_type == 1 ? run_top_lut : run_left_lut;
1420
2/2
✓ Branch 0 taken 330437 times.
✓ Branch 1 taken 670429 times.
1000866 uint8_t ctx_inc = bin_dist <= 4 ? run_lut[bin_dist] : run_lut[4];
1421
1422 1000866 return GET_CABAC(RUN_COPY_FLAG + ctx_inc);
1423 }
1424
1425 105524 bool ff_vvc_copy_above_palette_indices_flag(VVCLocalContext *lc)
1426 {
1427 105524 return GET_CABAC(COPY_ABOVE_PALETTE_INDICES_FLAG);
1428 }
1429
1430 111753 int ff_vvc_palette_idx_idc(VVCLocalContext *lc, const int max_palette_index, const bool adjust)
1431 {
1432 111753 return truncated_binary_decode(lc, max_palette_index - adjust);
1433 }
1434
1435 149 int ff_vvc_palette_escape_val(VVCLocalContext *lc, const int max)
1436 {
1437 149 return kth_order_egk_decode(&lc->ep->cc, 5, max);
1438 }
1439
1440 264024 int ff_vvc_general_merge_flag(VVCLocalContext *lc)
1441 {
1442 264024 return GET_CABAC(GENERAL_MERGE_FLAG);
1443 }
1444
1445 340611 static int get_inter_flag_inc(VVCLocalContext *lc, const int x0, const int y0)
1446 {
1447 340611 uint8_t left_merge = 0, top_merge = 0;
1448 340611 uint8_t left_affine = 0, top_affine = 0;
1449 340611 const VVCFrameContext *fc = lc->fc;
1450
1451 340611 get_left_top(lc, &left_merge, &top_merge, x0, y0, fc->tab.msf, fc->tab.msf);
1452 340611 get_left_top(lc, &left_affine, &top_affine, x0, y0, fc->tab.iaf, fc->tab.iaf);
1453
4/4
✓ Branch 0 taken 296273 times.
✓ Branch 1 taken 44338 times.
✓ Branch 2 taken 10016 times.
✓ Branch 3 taken 286257 times.
340611 return (left_merge || left_affine) + (top_merge + top_affine);
1454 }
1455
1456 310327 int ff_vvc_merge_subblock_flag(VVCLocalContext *lc)
1457 {
1458 310327 const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1459 310327 return GET_CABAC(MERGE_SUBBLOCK_FLAG + inc);
1460 }
1461
1462 54720 int ff_vvc_merge_subblock_idx(VVCLocalContext *lc, const int max_num_subblock_merge_cand)
1463 {
1464 int i;
1465
2/2
✓ Branch 1 taken 33823 times.
✓ Branch 2 taken 20897 times.
54720 if (!GET_CABAC(MERGE_SUBBLOCK_IDX))
1466 33823 return 0;
1467
4/4
✓ Branch 0 taken 34770 times.
✓ Branch 1 taken 2770 times.
✓ Branch 3 taken 16643 times.
✓ Branch 4 taken 18127 times.
37540 for (i = 1; i < max_num_subblock_merge_cand - 1 && get_cabac_bypass(&lc->ep->cc); i++)
1468 /* nothing */;
1469 20897 return i;
1470 }
1471
1472 236333 int ff_vvc_regular_merge_flag(VVCLocalContext *lc, const int cu_skip_flag)
1473 {
1474 236333 int inc = !cu_skip_flag;
1475 236333 return GET_CABAC(REGULAR_MERGE_FLAG + inc);
1476 }
1477
1478 276100 int ff_vvc_mmvd_merge_flag(VVCLocalContext *lc)
1479 {
1480 276100 return GET_CABAC(MMVD_MERGE_FLAG);
1481 }
1482
1483 58026 int ff_vvc_mmvd_cand_flag(VVCLocalContext *lc)
1484 {
1485 58026 return GET_CABAC(MMVD_CAND_FLAG);
1486 }
1487
1488 58026 static int mmvd_distance_idx_decode(VVCLocalContext *lc)
1489 {
1490 int i;
1491
2/2
✓ Branch 1 taken 15128 times.
✓ Branch 2 taken 42898 times.
58026 if (!GET_CABAC(MMVD_DISTANCE_IDX))
1492 15128 return 0;
1493
4/4
✓ Branch 0 taken 84223 times.
✓ Branch 1 taken 225 times.
✓ Branch 3 taken 41550 times.
✓ Branch 4 taken 42673 times.
84448 for (i = 1; i < 7 && get_cabac_bypass(&lc->ep->cc); i++)
1494 /* nothing */;
1495 42898 return i;
1496 }
1497
1498 58026 static int mmvd_direction_idx_decode(VVCLocalContext *lc)
1499 {
1500 58026 return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1501 }
1502
1503 58026 void ff_vvc_mmvd_offset_coding(VVCLocalContext *lc, Mv *mmvd_offset, const int ph_mmvd_fullpel_only_flag)
1504 {
1505
2/2
✓ Branch 0 taken 660 times.
✓ Branch 1 taken 57366 times.
58026 const int shift = ph_mmvd_fullpel_only_flag ? 4 : 2;
1506 58026 const int mmvd_distance = 1 << (mmvd_distance_idx_decode(lc) + shift);
1507 58026 const int mmvd_direction_idx = mmvd_direction_idx_decode(lc);
1508 58026 const int mmvd_signs[][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
1509 58026 mmvd_offset->x = mmvd_distance * mmvd_signs[mmvd_direction_idx][0];
1510 58026 mmvd_offset->y = mmvd_distance * mmvd_signs[mmvd_direction_idx][1];
1511 58026 }
1512
1513 272259 static PredMode get_luma_pred_mode(VVCLocalContext *lc)
1514 {
1515 272259 const VVCFrameContext *fc = lc->fc;
1516 272259 const CodingUnit *cu = lc->cu;
1517 PredMode pred_mode;
1518
1519
1/2
✓ Branch 0 taken 272259 times.
✗ Branch 1 not taken.
272259 if (cu->tree_type != DUAL_TREE_CHROMA) {
1520 272259 pred_mode = cu->pred_mode;
1521 } else {
1522 const int x_cb = cu->x0 >> fc->ps.sps->min_cb_log2_size_y;
1523 const int y_cb = cu->y0 >> fc->ps.sps->min_cb_log2_size_y;
1524 const int min_cb_width = fc->ps.pps->min_cb_width;
1525 pred_mode = SAMPLE_CTB(fc->tab.cpm[0], x_cb, y_cb);
1526 }
1527 272259 return pred_mode;
1528 }
1529
1530 272259 int ff_vvc_merge_idx(VVCLocalContext *lc)
1531 {
1532 272259 const VVCSPS *sps = lc->fc->ps.sps;
1533 272259 const int is_ibc = get_luma_pred_mode(lc) == MODE_IBC;
1534
2/2
✓ Branch 0 taken 30794 times.
✓ Branch 1 taken 241465 times.
272259 const int c_max = (is_ibc ? sps->max_num_ibc_merge_cand : sps->max_num_merge_cand) - 1;
1535 int i;
1536
1537
2/2
✓ Branch 1 taken 165884 times.
✓ Branch 2 taken 106375 times.
272259 if (!GET_CABAC(MERGE_IDX))
1538 165884 return 0;
1539
1540
4/4
✓ Branch 0 taken 202170 times.
✓ Branch 1 taken 11006 times.
✓ Branch 3 taken 106801 times.
✓ Branch 4 taken 95369 times.
213176 for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1541 /* nothing */;
1542 106375 return i;
1543 }
1544
1545 27594 int ff_vvc_merge_gpm_partition_idx(VVCLocalContext *lc)
1546 {
1547 27594 return fixed_length_decode(&lc->ep->cc, 6);
1548 }
1549
1550 55188 int ff_vvc_merge_gpm_idx(VVCLocalContext *lc, const int idx)
1551 {
1552 55188 const int c_max = lc->fc->ps.sps->max_num_gpm_merge_cand - idx - 1;
1553 int i;
1554
1555
2/2
✓ Branch 1 taken 30818 times.
✓ Branch 2 taken 24370 times.
55188 if (!GET_CABAC(MERGE_IDX))
1556 30818 return 0;
1557
1558
4/4
✓ Branch 0 taken 43274 times.
✓ Branch 1 taken 4114 times.
✓ Branch 3 taken 23018 times.
✓ Branch 4 taken 20256 times.
47388 for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1559 /* nothing */;
1560
1561 24370 return i;
1562 }
1563
1564 20147 int ff_vvc_ciip_flag(VVCLocalContext *lc)
1565 {
1566 20147 return GET_CABAC(CIIP_FLAG);
1567 }
1568
1569 81041 PredFlag ff_vvc_pred_flag(VVCLocalContext *lc, const int is_b)
1570 {
1571 81041 const int w = lc->cu->cb_width;
1572 81041 const int h = lc->cu->cb_height;
1573
2/2
✓ Branch 0 taken 7375 times.
✓ Branch 1 taken 73666 times.
81041 if (!is_b)
1574 7375 return PF_L0;
1575
2/2
✓ Branch 0 taken 64418 times.
✓ Branch 1 taken 9248 times.
73666 if (w + h > 12) {
1576 64418 const int log2 = av_log2(w) + av_log2(h);
1577 64418 const int inc = 7 - ((1 + log2)>>1);
1578
2/2
✓ Branch 1 taken 21784 times.
✓ Branch 2 taken 42634 times.
64418 if (GET_CABAC(INTER_PRED_IDC + inc))
1579 21784 return PF_BI;
1580 }
1581 51882 return PF_L0 + GET_CABAC(INTER_PRED_IDC + 5);
1582 }
1583
1584 30284 int ff_vvc_inter_affine_flag(VVCLocalContext *lc)
1585 {
1586 30284 const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1587 30284 return GET_CABAC(INTER_AFFINE_FLAG + inc);
1588 }
1589
1590 9332 int ff_vvc_cu_affine_type_flag(VVCLocalContext *lc)
1591 {
1592 9332 return GET_CABAC(CU_AFFINE_TYPE_FLAG);
1593 }
1594
1595 12921 int ff_vvc_sym_mvd_flag(VVCLocalContext *lc)
1596 {
1597 12921 return GET_CABAC(SYM_MVD_FLAG);
1598 }
1599
1600 71767 int ff_vvc_ref_idx_lx(VVCLocalContext *lc, const uint8_t nb_refs)
1601 {
1602 71767 const int c_max = nb_refs - 1;
1603 71767 const int max_ctx = FFMIN(c_max, 2);
1604 71767 int i = 0;
1605
1606
4/4
✓ Branch 0 taken 88542 times.
✓ Branch 1 taken 27339 times.
✓ Branch 3 taken 44114 times.
✓ Branch 4 taken 44428 times.
115881 while (i < max_ctx && GET_CABAC(REF_IDX_LX + i))
1607 44114 i++;
1608
2/2
✓ Branch 0 taken 14956 times.
✓ Branch 1 taken 56811 times.
71767 if (i == 2) {
1609
4/4
✓ Branch 0 taken 45136 times.
✓ Branch 1 taken 10535 times.
✓ Branch 3 taken 40715 times.
✓ Branch 4 taken 4421 times.
55671 while (i < c_max && get_cabac_bypass(&lc->ep->cc))
1610 40715 i++;
1611 }
1612 71767 return i;
1613 }
1614
1615 328252 int ff_vvc_abs_mvd_greater0_flag(VVCLocalContext *lc)
1616 {
1617 328252 return GET_CABAC(ABS_MVD_GREATER0_FLAG);
1618 }
1619
1620 204640 int ff_vvc_abs_mvd_greater1_flag(VVCLocalContext *lc)
1621 {
1622 204640 return GET_CABAC(ABS_MVD_GREATER1_FLAG);
1623 }
1624
1625 146119 int ff_vvc_abs_mvd_minus2(VVCLocalContext *lc)
1626 {
1627 146119 return limited_kth_order_egk_decode(&lc->ep->cc, 1, 15, 17);
1628 }
1629
1630 204640 int ff_vvc_mvd_sign_flag(VVCLocalContext *lc)
1631 {
1632 204640 return get_cabac_bypass(&lc->ep->cc);
1633 }
1634
1635 157623 int ff_vvc_mvp_lx_flag(VVCLocalContext *lc)
1636 {
1637 157623 return GET_CABAC(MVP_LX_FLAG);
1638 }
1639
1640 74308 static int amvr_flag(VVCLocalContext *lc, const int inter_affine_flag)
1641 {
1642 74308 return GET_CABAC(AMVR_FLAG + inter_affine_flag);
1643 }
1644
1645 85028 static int amvr_precision_idx(VVCLocalContext *lc, const int inc, const int c_max)
1646 {
1647 85028 int i = 0;
1648
2/2
✓ Branch 1 taken 28225 times.
✓ Branch 2 taken 56803 times.
85028 if (!GET_CABAC(AMVR_PRECISION_IDX + inc))
1649 28225 return 0;
1650 56803 i++;
1651
4/4
✓ Branch 0 taken 36735 times.
✓ Branch 1 taken 20068 times.
✓ Branch 3 taken 13063 times.
✓ Branch 4 taken 23672 times.
56803 if (i < c_max && GET_CABAC(AMVR_PRECISION_IDX + 1))
1652 13063 i++;
1653 56803 return i;
1654 }
1655
1656 114686 int ff_vvc_amvr_shift(VVCLocalContext *lc, const int inter_affine_flag,
1657 const PredMode pred_mode, const int has_amvr_flag)
1658 {
1659 114686 int amvr_shift = 2;
1660
2/2
✓ Branch 0 taken 107953 times.
✓ Branch 1 taken 6733 times.
114686 if (has_amvr_flag) {
1661
4/4
✓ Branch 0 taken 74308 times.
✓ Branch 1 taken 33645 times.
✓ Branch 3 taken 51383 times.
✓ Branch 4 taken 22925 times.
107953 if (pred_mode == MODE_IBC || amvr_flag(lc, inter_affine_flag)) {
1662 int idx;
1663
2/2
✓ Branch 0 taken 4569 times.
✓ Branch 1 taken 80459 times.
85028 if (inter_affine_flag) {
1664 4569 idx = amvr_precision_idx(lc, 2, 1);
1665 4569 amvr_shift = idx * 4;
1666
2/2
✓ Branch 0 taken 33645 times.
✓ Branch 1 taken 46814 times.
80459 } else if (pred_mode == MODE_IBC) {
1667 33645 idx = amvr_precision_idx(lc, 1, 1);
1668 33645 amvr_shift = 4 + idx * 2;
1669 } else {
1670 static const int shifts[] = {3, 4, 6};
1671 46814 idx = amvr_precision_idx(lc, 0, 2);
1672 46814 amvr_shift = shifts[idx];
1673 }
1674 }
1675 }
1676 114686 return amvr_shift;
1677 }
1678
1679 12147 int ff_vvc_bcw_idx(VVCLocalContext *lc, const int no_backward_pred_flag)
1680 {
1681
2/2
✓ Branch 0 taken 2598 times.
✓ Branch 1 taken 9549 times.
12147 const int c_max = no_backward_pred_flag ? 4 : 2;
1682 12147 int i = 1;
1683
2/2
✓ Branch 1 taken 7118 times.
✓ Branch 2 taken 5029 times.
12147 if (!GET_CABAC(BCW_IDX))
1684 7118 return 0;
1685
4/4
✓ Branch 0 taken 5911 times.
✓ Branch 1 taken 1982 times.
✓ Branch 3 taken 2864 times.
✓ Branch 4 taken 3047 times.
7893 while (i < c_max && get_cabac_bypass(&lc->ep->cc))
1686 2864 i++;
1687 5029 return i;
1688 }
1689
1690 444612 int ff_vvc_tu_cb_coded_flag(VVCLocalContext *lc)
1691 {
1692 444612 return GET_CABAC(TU_CB_CODED_FLAG + lc->cu->bdpcm_flag[1]);
1693 }
1694
1695 444612 int ff_vvc_tu_cr_coded_flag(VVCLocalContext *lc, int tu_cb_coded_flag)
1696 {
1697
2/2
✓ Branch 0 taken 444354 times.
✓ Branch 1 taken 258 times.
444612 return GET_CABAC(TU_CR_CODED_FLAG + (lc->cu->bdpcm_flag[1] ? 2 : tu_cb_coded_flag));
1698 }
1699
1700 842032 int ff_vvc_tu_y_coded_flag(VVCLocalContext *lc)
1701 {
1702 842032 const CodingUnit *cu = lc->cu;
1703 int inc;
1704
2/2
✓ Branch 0 taken 18582 times.
✓ Branch 1 taken 823450 times.
842032 if (cu->bdpcm_flag[0])
1705 18582 inc = 1;
1706
2/2
✓ Branch 0 taken 623555 times.
✓ Branch 1 taken 199895 times.
823450 else if (cu->isp_split_type == ISP_NO_SPLIT)
1707 623555 inc = 0;
1708 else
1709 199895 inc = 2 + lc->parse.prev_tu_cbf_y;
1710 842032 lc->parse.prev_tu_cbf_y = GET_CABAC(TU_Y_CODED_FLAG + inc);
1711 842032 return lc->parse.prev_tu_cbf_y;
1712 }
1713
1714 15652 int ff_vvc_cu_act_enabled_flag(VVCLocalContext *lc)
1715 {
1716 15652 return GET_CABAC(CU_ACT_ENABLED_FLAG);
1717 }
1718
1719 3618 int ff_vvc_cu_qp_delta_abs(VVCLocalContext *lc)
1720 {
1721 int v, i, k;
1722
2/2
✓ Branch 1 taken 2293 times.
✓ Branch 2 taken 1325 times.
3618 if (!GET_CABAC(CU_QP_DELTA_ABS))
1723 2293 return 0;
1724
1725 // prefixVal
1726
4/4
✓ Branch 0 taken 2601 times.
✓ Branch 1 taken 35 times.
✓ Branch 3 taken 1311 times.
✓ Branch 4 taken 1290 times.
2636 for (v = 1; v < 5 && GET_CABAC(CU_QP_DELTA_ABS + 1); v++)
1727 /* nothing */;
1728
2/2
✓ Branch 0 taken 1290 times.
✓ Branch 1 taken 35 times.
1325 if (v < 5)
1729 1290 return v;
1730
1731 // 9.3.3.5 k-th order Exp-Golomb binarization process
1732 // suffixVal
1733
1734 // CuQpDeltaVal shall in the range of −( 32 + QpBdOffset / 2 ) to +( 31 + QpBdOffset / 2 )
1735 // so k = 6 should enough
1736
3/4
✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 31 times.
✓ Branch 4 taken 35 times.
66 for (k = 0; k < 6 && get_cabac_bypass(&lc->ep->cc); k++)
1737 /* nothing */;
1738 35 i = (1 << k) - 1;
1739 35 v = 0;
1740
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 35 times.
66 while (k--)
1741 31 v = (v << 1) + get_cabac_bypass(&lc->ep->cc);
1742 35 v += i;
1743
1744 35 return v + 5;
1745 }
1746
1747 1325 int ff_vvc_cu_qp_delta_sign_flag(VVCLocalContext *lc)
1748 {
1749 1325 return get_cabac_bypass(&lc->ep->cc);
1750 }
1751
1752 1029 int ff_vvc_cu_chroma_qp_offset_flag(VVCLocalContext *lc)
1753 {
1754 1029 return GET_CABAC(CU_CHROMA_QP_OFFSET_FLAG);
1755 }
1756
1757 931 int ff_vvc_cu_chroma_qp_offset_idx(VVCLocalContext *lc)
1758 {
1759 931 const int c_max = lc->fc->ps.pps->r->pps_chroma_qp_offset_list_len_minus1;
1760 int i;
1761
4/4
✓ Branch 0 taken 2076 times.
✓ Branch 1 taken 532 times.
✓ Branch 3 taken 1677 times.
✓ Branch 4 taken 399 times.
2608 for (i = 0; i < c_max && GET_CABAC(CU_CHROMA_QP_OFFSET_IDX); i++)
1762 /* nothing */;
1763 931 return i;
1764 }
1765
1766 1936342 static av_always_inline int last_significant_coeff_xy_prefix(VVCLocalContext *lc,
1767 const int log2_tb_size, const int log2_zo_tb_size, const int c_idx, const int ctx)
1768 {
1769 1936342 int i = 0;
1770 1936342 int max = (log2_zo_tb_size << 1) - 1;
1771 int ctx_offset, ctx_shift;
1772
2/2
✓ Branch 0 taken 16594 times.
✓ Branch 1 taken 1919748 times.
1936342 if (!log2_tb_size)
1773 16594 return 0;
1774
2/2
✓ Branch 0 taken 1376432 times.
✓ Branch 1 taken 543316 times.
1919748 if (!c_idx) {
1775 1376432 const int offset_y[] = {0, 0, 3, 6, 10, 15};
1776 1376432 ctx_offset = offset_y[log2_tb_size - 1];
1777 1376432 ctx_shift = (log2_tb_size + 1) >> 2;
1778 } else {
1779 543316 const int shifts[] = {0, 0, 0, 1, 2, 2, 2};
1780 543316 ctx_offset = 20;
1781 543316 ctx_shift = shifts[log2_tb_size];
1782 }
1783
4/4
✓ Branch 0 taken 5051916 times.
✓ Branch 1 taken 309800 times.
✓ Branch 3 taken 3441968 times.
✓ Branch 4 taken 1609948 times.
5361716 while (i < max && GET_CABAC(ctx + (i >> ctx_shift) + ctx_offset))
1784 3441968 i++;
1785 1919748 return i;
1786 }
1787
1788 968171 static av_always_inline int last_significant_coeff_x_prefix_decode(VVCLocalContext *lc,
1789 const int log2_tb_width, const int log2_zo_tb_width, const int c_idx)
1790 {
1791 968171 return last_significant_coeff_xy_prefix(lc, log2_tb_width, log2_zo_tb_width, c_idx, LAST_SIG_COEFF_X_PREFIX);
1792 }
1793
1794 968171 static av_always_inline int last_significant_coeff_y_prefix_decode(VVCLocalContext *lc,
1795 const int log2_tb_height, const int log2_zo_tb_height, const int c_idx)
1796 {
1797 968171 return last_significant_coeff_xy_prefix(lc, log2_tb_height, log2_zo_tb_height, c_idx, LAST_SIG_COEFF_Y_PREFIX);
1798 }
1799
1800 370430 static av_always_inline int last_sig_coeff_suffix_decode(VVCLocalContext *lc,
1801 const int last_significant_coeff_y_prefix)
1802 {
1803 370430 const int length = (last_significant_coeff_y_prefix >> 1) - 1;
1804 370430 int value = get_cabac_bypass(&lc->ep->cc);
1805
1806
2/2
✓ Branch 0 taken 155188 times.
✓ Branch 1 taken 370430 times.
525618 for (int i = 1; i < length; i++)
1807 155188 value = (value << 1) | get_cabac_bypass(&lc->ep->cc);
1808 370430 return value;
1809 }
1810
1811 161245 int ff_vvc_tu_joint_cbcr_residual_flag(VVCLocalContext *lc, const int tu_cb_coded_flag, const int tu_cr_coded_flag)
1812 {
1813 161245 return GET_CABAC(TU_JOINT_CBCR_RESIDUAL_FLAG + 2 * tu_cb_coded_flag + tu_cr_coded_flag - 1);
1814 }
1815
1816 696962 int ff_vvc_transform_skip_flag(VVCLocalContext *lc, const int inc)
1817 {
1818 696962 return GET_CABAC(TRANSFORM_SKIP_FLAG + inc);
1819 }
1820
1821 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1822 40222006 static int get_local_sum(const int *level, const int w, const int h,
1823 const int xc, const int yc, const int hist_value)
1824 {
1825 40222006 int loc_sum = 3 * hist_value;
1826 40222006 level += w * yc + xc;
1827
2/2
✓ Branch 0 taken 38742003 times.
✓ Branch 1 taken 1480003 times.
40222006 if (xc < w - 1) {
1828 38742003 loc_sum += level[1];
1829
2/2
✓ Branch 0 taken 36549028 times.
✓ Branch 1 taken 2192975 times.
38742003 if (xc < w - 2)
1830 36549028 loc_sum += level[2] - hist_value;
1831
2/2
✓ Branch 0 taken 35820354 times.
✓ Branch 1 taken 2921649 times.
38742003 if (yc < h - 1)
1832 35820354 loc_sum += level[w + 1] - hist_value;
1833 }
1834
2/2
✓ Branch 0 taken 37299241 times.
✓ Branch 1 taken 2922765 times.
40222006 if (yc < h - 1) {
1835 37299241 loc_sum += level[w];
1836
2/2
✓ Branch 0 taken 33835146 times.
✓ Branch 1 taken 3464095 times.
37299241 if (yc < h - 2)
1837 33835146 loc_sum += level[w << 1] - hist_value;
1838 }
1839 40222006 return loc_sum;
1840 }
1841
1842 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1843 1637127 static int get_local_sum_ts(const int *level, const int w, const int h, const int xc, const int yc)
1844 {
1845 1637127 int loc_sum = 0;
1846 1637127 level += w * yc + xc;
1847
2/2
✓ Branch 0 taken 1417109 times.
✓ Branch 1 taken 220018 times.
1637127 if (xc > 0)
1848 1417109 loc_sum += level[-1];
1849
2/2
✓ Branch 0 taken 1425096 times.
✓ Branch 1 taken 212031 times.
1637127 if (yc > 0)
1850 1425096 loc_sum += level[-w];
1851 1637127 return loc_sum;
1852 }
1853
1854 11245282 static int get_gtx_flag_inc(const ResidualCoding* rc, const int xc, const int yc, const int last)
1855 {
1856 11245282 const TransformBlock *tb = rc->tb;
1857 int inc;
1858
2/2
✓ Branch 0 taken 968171 times.
✓ Branch 1 taken 10277111 times.
11245282 if (last) {
1859 968171 const int incs[] = {0, 21, 21};
1860 968171 inc = incs[tb->c_idx];
1861 } else {
1862 10277111 const int d = xc + yc;
1863 10277111 const int local_sum_sig = get_local_sum(rc->sig_coeff_flag,
1864 10277111 tb->tb_width,tb->tb_height, xc, yc, rc->hist_value);
1865 10277111 const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1866 10277111 tb->tb_width, tb->tb_height, xc, yc, rc->hist_value);
1867 10277111 const int offset = FFMIN(loc_sum_abs_pass1 - local_sum_sig, 4);
1868
1869
2/2
✓ Branch 0 taken 7379078 times.
✓ Branch 1 taken 2898033 times.
10277111 if (!tb->c_idx)
1870
6/6
✓ Branch 0 taken 6903056 times.
✓ Branch 1 taken 476022 times.
✓ Branch 2 taken 5415081 times.
✓ Branch 3 taken 1487975 times.
✓ Branch 4 taken 3332076 times.
✓ Branch 5 taken 2083005 times.
7379078 inc = 1 + offset + (!d ? 15 : (d < 3 ? 10 : (d < 10 ? 5 : 0)));
1871 else
1872
2/2
✓ Branch 0 taken 161511 times.
✓ Branch 1 taken 2736522 times.
2898033 inc = 22 + offset + (!d ? 5 : 0);
1873 }
1874 11245282 return inc;
1875 }
1876
1877 13604262 static int abs_level_gtx_flag_decode(VVCLocalContext *lc, const int inc)
1878 {
1879 13604262 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1880 }
1881
1882 2358980 static int par_level_flag_decode(VVCLocalContext *lc, const int inc)
1883 {
1884 2358980 return GET_CABAC(PAR_LEVEL_FLAG + inc);
1885 }
1886
1887 166154 static int par_level_flag_ts_decode(VVCLocalContext *lc)
1888 {
1889 166154 const int inc = 32;
1890 166154 return GET_CABAC(PAR_LEVEL_FLAG + inc);
1891 }
1892
1893 1200193 static int sb_coded_flag_decode(VVCLocalContext *lc, const uint8_t *sb_coded_flag,
1894 const ResidualCoding *rc, const int xs, const int ys)
1895 {
1896 1200193 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1897 1200193 const TransformBlock *tb = rc->tb;
1898 1200193 const int w = rc->width_in_sbs;
1899 1200193 const int h = rc->height_in_sbs;
1900 int inc;
1901
1902
3/4
✓ Branch 0 taken 248363 times.
✓ Branch 1 taken 951830 times.
✓ Branch 2 taken 248363 times.
✗ Branch 3 not taken.
1200193 if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1903
2/2
✓ Branch 0 taken 142072 times.
✓ Branch 1 taken 106291 times.
248363 const int left = xs > 0 ? sb_coded_flag[-1] : 0;
1904
2/2
✓ Branch 0 taken 147056 times.
✓ Branch 1 taken 101307 times.
248363 const int above = ys > 0 ? sb_coded_flag[-w] : 0;
1905 248363 inc = left + above + 4;
1906 } else {
1907
2/2
✓ Branch 0 taken 828187 times.
✓ Branch 1 taken 123643 times.
951830 const int right = (xs < w - 1) ? sb_coded_flag[1] : 0;
1908
2/2
✓ Branch 0 taken 727324 times.
✓ Branch 1 taken 224506 times.
951830 const int bottom = (ys < h - 1) ? sb_coded_flag[w] : 0;
1909
2/2
✓ Branch 0 taken 339845 times.
✓ Branch 1 taken 611985 times.
951830 inc = (right | bottom) + (tb->c_idx ? 2 : 0);
1910 }
1911 1200193 return GET_CABAC(SB_CODED_FLAG + inc);
1912 }
1913
1914 20288612 static int sig_coeff_flag_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1915 {
1916 20288612 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1917 20288612 const TransformBlock *tb = rc->tb;
1918 int inc;
1919
1920
3/4
✓ Branch 0 taken 1637127 times.
✓ Branch 1 taken 18651485 times.
✓ Branch 2 taken 1637127 times.
✗ Branch 3 not taken.
20288612 if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1921 1637127 const int local_num_sig = get_local_sum_ts(rc->sig_coeff_flag, tb->tb_width, tb->tb_height, xc, yc);
1922 1637127 inc = 60 + local_num_sig;
1923 } else {
1924 18651485 const int d = xc + yc;
1925 18651485 const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1926 18651485 tb->tb_width, tb->tb_height, xc, yc, 0);
1927
1928
2/2
✓ Branch 0 taken 13085080 times.
✓ Branch 1 taken 5566405 times.
18651485 if (!tb->c_idx) {
1929
4/4
✓ Branch 0 taken 11600347 times.
✓ Branch 1 taken 1484733 times.
✓ Branch 2 taken 3358528 times.
✓ Branch 3 taken 8241819 times.
13085080 inc = 12 * FFMAX(0, rc->qstate - 1) + FFMIN((loc_sum_abs_pass1 + 1) >> 1, 3) + ((d < 2) ? 8 : (d < 5 ? 4 : 0));
1930 } else {
1931
2/2
✓ Branch 0 taken 532885 times.
✓ Branch 1 taken 5033520 times.
5566405 inc = 36 + 8 * FFMAX(0, rc->qstate - 1) + FFMIN((loc_sum_abs_pass1 + 1) >> 1, 3) + (d < 2 ? 4 : 0);
1932 }
1933 }
1934 20288612 return GET_CABAC(SIG_COEFF_FLAG + inc);
1935 }
1936
1937 1016299 static int abs_get_rice_param(VVCLocalContext *lc, const ResidualCoding* rc,
1938 const int xc, const int yc, const int base_level)
1939 {
1940 1016299 const VVCSPS *sps = lc->fc->ps.sps;
1941 1016299 const TransformBlock* tb = rc->tb;
1942 1016299 const int rice_params[] = {
1943 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2,
1944 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
1945 };
1946 int loc_sum_abs;
1947 int shift_val;
1948
1949 1016299 loc_sum_abs = get_local_sum(rc->abs_level, tb->tb_width, tb->tb_height, xc,
1950 1016299 yc, rc->hist_value);
1951
1952
1/2
✓ Branch 0 taken 1016299 times.
✗ Branch 1 not taken.
1016299 if (!sps->r->sps_rrc_rice_extension_flag) {
1953 1016299 shift_val = 0;
1954 } else {
1955 shift_val = (av_log2(FFMAX(FFMIN(loc_sum_abs, 2048), 8)) - 3) & ~1;
1956 }
1957
1958 1016299 loc_sum_abs = av_clip_uintp2((loc_sum_abs >> shift_val) - base_level * 5, 5);
1959
1960 1016299 return rice_params[loc_sum_abs] + shift_val;
1961 }
1962
1963 1084697 static int abs_decode(VVCLocalContext *lc, const int c_rice_param)
1964 {
1965 1084697 const VVCSPS *sps = lc->fc->ps.sps;
1966 1084697 const int MAX_BIN = 6;
1967 1084697 int prefix = 0;
1968 1084697 int suffix = 0;
1969
1970
4/4
✓ Branch 0 taken 2476356 times.
✓ Branch 1 taken 83984 times.
✓ Branch 3 taken 1475643 times.
✓ Branch 4 taken 1000713 times.
2560340 while (prefix < MAX_BIN && get_cabac_bypass(&lc->ep->cc))
1971 1475643 prefix++;
1972
2/2
✓ Branch 0 taken 1000713 times.
✓ Branch 1 taken 83984 times.
1084697 if (prefix < MAX_BIN) {
1973
2/2
✓ Branch 0 taken 696247 times.
✓ Branch 1 taken 1000713 times.
1696960 for (int i = 0; i < c_rice_param; i++) {
1974 696247 suffix = (suffix << 1) | get_cabac_bypass(&lc->ep->cc);
1975 }
1976 } else {
1977 83984 suffix = limited_kth_order_egk_decode(&lc->ep->cc,
1978 c_rice_param + 1,
1979 83984 26 - sps->log2_transform_range,
1980 83984 sps->log2_transform_range);
1981 }
1982 1084697 return suffix + (prefix << c_rice_param);
1983 }
1984
1985 633633 static int abs_remainder_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1986 {
1987 633633 const VVCSPS *sps = lc->fc->ps.sps;
1988 633633 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1989 633633 const int base_level[][2][2] = {
1990 { {4, 4}, {4, 4} },
1991 { {3, 2}, {2, 1} }
1992 };
1993 633633 const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc,
1994 633633 base_level[sps->r->sps_rrc_rice_extension_flag][sps->bit_depth > 12][IS_I(rsh)]);
1995 633633 const int rem = abs_decode(lc, c_rice_param);
1996
1997 633633 return rem;
1998 }
1999
2000 68398 static int abs_remainder_ts_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
2001 {
2002 68398 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2003 68398 const int c_rice_param = rsh->sh_ts_residual_coding_rice_idx_minus1 + 1;
2004 68398 const int rem = abs_decode(lc, c_rice_param);
2005
2006 68398 return rem;
2007 }
2008
2009 11566531 static int coeff_sign_flag_decode(VVCLocalContext *lc)
2010 {
2011 11566531 return get_cabac_bypass(&lc->ep->cc);
2012 }
2013
2014 //9.3.4.2.10 Derivation process of ctxInc for the syntax element coeff_sign_flag for transform skip mode
2015 372847 static int coeff_sign_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
2016 {
2017 372847 const TransformBlock *tb = rc->tb;
2018 372847 const int w = tb->tb_width;
2019 372847 const int *level = rc->coeff_sign_level + yc * w + xc;
2020
2/2
✓ Branch 0 taken 326042 times.
✓ Branch 1 taken 46805 times.
372847 const int left_sign = xc ? level[-1] : 0;
2021
2/2
✓ Branch 0 taken 330975 times.
✓ Branch 1 taken 41872 times.
372847 const int above_sign = yc ? level[-w] : 0;
2022 372847 const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
2023 int inc;
2024
2025
2/2
✓ Branch 0 taken 142276 times.
✓ Branch 1 taken 230571 times.
372847 if (left_sign == -above_sign)
2026
2/2
✓ Branch 0 taken 7236 times.
✓ Branch 1 taken 135040 times.
142276 inc = bdpcm_flag ? 3 : 0;
2027
4/4
✓ Branch 0 taken 138600 times.
✓ Branch 1 taken 91971 times.
✓ Branch 2 taken 86099 times.
✓ Branch 3 taken 52501 times.
230571 else if (left_sign >= 0 && above_sign >= 0)
2028
2/2
✓ Branch 0 taken 1968 times.
✓ Branch 1 taken 84131 times.
86099 inc = bdpcm_flag ? 4 : 1;
2029 else
2030
2/2
✓ Branch 0 taken 3970 times.
✓ Branch 1 taken 140502 times.
144472 inc = bdpcm_flag ? 5 : 2;
2031 372847 return GET_CABAC(COEFF_SIGN_FLAG + inc);
2032 }
2033
2034 372847 static int abs_level_gt1_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
2035 {
2036 372847 const TransformBlock *tb = rc->tb;
2037 372847 const int *sig_coeff_flag = rc->sig_coeff_flag + yc * tb->tb_width + xc;
2038 int inc;
2039
2040
2/2
✓ Branch 0 taken 13174 times.
✓ Branch 1 taken 359673 times.
372847 if (cu->bdpcm_flag[tb->c_idx]) {
2041 13174 inc = 67;
2042 } else {
2043
2/2
✓ Branch 0 taken 314433 times.
✓ Branch 1 taken 45240 times.
359673 const int l = xc > 0 ? sig_coeff_flag[-1] : 0;
2044
2/2
✓ Branch 0 taken 319550 times.
✓ Branch 1 taken 40123 times.
359673 const int a = yc > 0 ? sig_coeff_flag[-tb->tb_width] : 0;
2045 359673 inc = 64 + a + l;
2046 }
2047 372847 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
2048 }
2049
2050 278569 static int abs_level_gtx_flag_ts_decode(VVCLocalContext *lc, const int j)
2051 {
2052 278569 const int inc = 67 + j;
2053 278569 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
2054 }
2055
2056 static const uint8_t qstate_translate_table[][2] = {
2057 { 0, 2 }, { 2, 0 }, { 1, 3 }, { 3, 1 }
2058 };
2059
2060 382666 static int dec_abs_level_decode(VVCLocalContext *lc, const ResidualCoding *rc,
2061 const int xc, const int yc, int *abs_level)
2062 {
2063 382666 const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc, 0);
2064 382666 const int dec_abs_level = abs_decode(lc, c_rice_param);
2065
2/2
✓ Branch 0 taken 237540 times.
✓ Branch 1 taken 145126 times.
382666 const int zero_pos = (rc->qstate < 2 ? 1 : 2) << c_rice_param;
2066
2067 382666 *abs_level = 0;
2068
2/2
✓ Branch 0 taken 346663 times.
✓ Branch 1 taken 36003 times.
382666 if (dec_abs_level != zero_pos) {
2069 346663 *abs_level = dec_abs_level;
2070
2/2
✓ Branch 0 taken 206122 times.
✓ Branch 1 taken 140541 times.
346663 if (dec_abs_level < zero_pos)
2071 206122 *abs_level += 1;
2072 }
2073 382666 return dec_abs_level;
2074 }
2075
2076 1016299 static void ep_update_hist(EntryPoint *ep, ResidualCoding *rc,
2077 const int remainder, const int addin)
2078 {
2079 1016299 int *stat = ep->stat_coeff + rc->tb->c_idx;
2080
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1016299 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1016299 if (rc->update_hist && remainder > 0) {
2081 *stat = (*stat + av_log2(remainder) + addin) >> 1;
2082 rc->update_hist = 0;
2083 }
2084 1016299 }
2085
2086 1024738 static void init_residual_coding(const VVCLocalContext *lc, ResidualCoding *rc,
2087 const int log2_zo_tb_width, const int log2_zo_tb_height,
2088 TransformBlock *tb)
2089 {
2090 1024738 const VVCSPS *sps = lc->fc->ps.sps;
2091
2/2
✓ Branch 0 taken 102794 times.
✓ Branch 1 taken 921944 times.
1024738 int log2_sb_w = (FFMIN(log2_zo_tb_width, log2_zo_tb_height ) < 2 ? 1 : 2 );
2092 1024738 int log2_sb_h = log2_sb_w;
2093
2094
2/2
✓ Branch 0 taken 1015712 times.
✓ Branch 1 taken 9026 times.
1024738 if ( log2_zo_tb_width + log2_zo_tb_height > 3 ) {
2095
2/2
✓ Branch 0 taken 21473 times.
✓ Branch 1 taken 994239 times.
1015712 if ( log2_zo_tb_width < 2 ) {
2096 21473 log2_sb_w = log2_zo_tb_width;
2097 21473 log2_sb_h = 4 - log2_sb_w;
2098
2/2
✓ Branch 0 taken 72295 times.
✓ Branch 1 taken 921944 times.
994239 } else if ( log2_zo_tb_height < 2 ) {
2099 72295 log2_sb_h = log2_zo_tb_height;
2100 72295 log2_sb_w = 4 - log2_sb_h;
2101 }
2102 }
2103 1024738 rc->log2_sb_w = log2_sb_w;
2104 1024738 rc->log2_sb_h = log2_sb_h;
2105 1024738 rc->num_sb_coeff = 1 << (log2_sb_w + log2_sb_h);
2106 1024738 rc->last_sub_block = ( 1 << ( log2_zo_tb_width + log2_zo_tb_height - (log2_sb_w + log2_sb_h))) - 1;
2107
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1024738 times.
1024738 rc->hist_value = sps->r->sps_persistent_rice_adaptation_enabled_flag ? (1 << lc->ep->stat_coeff[tb->c_idx]) : 0;
2108 1024738 rc->update_hist = sps->r->sps_persistent_rice_adaptation_enabled_flag ? 1 : 0;
2109 1024738 rc->rem_bins_pass1 = (( 1 << ( log2_zo_tb_width + log2_zo_tb_height)) * 7 ) >> 2;
2110
2111
2112 1024738 rc->sb_scan_x_off = ff_vvc_diag_scan_x[log2_zo_tb_width - log2_sb_w][log2_zo_tb_height - log2_sb_h];
2113 1024738 rc->sb_scan_y_off = ff_vvc_diag_scan_y[log2_zo_tb_width - log2_sb_w][log2_zo_tb_height - log2_sb_h];
2114
2115 1024738 rc->scan_x_off = ff_vvc_diag_scan_x[log2_sb_w][log2_sb_h];
2116 1024738 rc->scan_y_off = ff_vvc_diag_scan_y[log2_sb_w][log2_sb_h];
2117
2118 1024738 rc->infer_sb_cbf = 1;
2119
2120 1024738 rc->width_in_sbs = (1 << (log2_zo_tb_width - log2_sb_w));
2121 1024738 rc->height_in_sbs = (1 << (log2_zo_tb_height - log2_sb_h));
2122 1024738 rc->nb_sbs = rc->width_in_sbs * rc->height_in_sbs;
2123
2124 1024738 rc->last_scan_pos = rc->num_sb_coeff;
2125 1024738 rc->qstate = 0;
2126
2127 1024738 rc->tb = tb;
2128 1024738 }
2129
2130 272258 static int residual_ts_coding_subblock(VVCLocalContext *lc, ResidualCoding* rc, const int i)
2131 {
2132 272258 const CodingUnit *cu = lc->cu;
2133 272258 TransformBlock *tb = rc->tb;
2134 272258 const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
2135 272258 const int xs = rc->sb_scan_x_off[i];
2136 272258 const int ys = rc->sb_scan_y_off[i];
2137 272258 uint8_t *sb_coded_flag = rc->sb_coded_flag + ys * rc->width_in_sbs + xs;
2138 272258 int infer_sb_sig_coeff_flag = 1;
2139 272258 int last_scan_pos_pass1 = -1, last_scan_pos_pass2 = -1, n;
2140 int abs_level_gtx_flag[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE];
2141 int abs_level_pass2[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE]; ///< AbsLevelPass2
2142
2143
4/4
✓ Branch 0 taken 56567 times.
✓ Branch 1 taken 215691 times.
✓ Branch 2 taken 32672 times.
✓ Branch 3 taken 23895 times.
272258 if (i != rc->last_sub_block || !rc->infer_sb_cbf)
2144 248363 *sb_coded_flag = sb_coded_flag_decode(lc, sb_coded_flag, rc, xs, ys);
2145 else
2146 23895 *sb_coded_flag = 1;
2147
4/4
✓ Branch 0 taken 104489 times.
✓ Branch 1 taken 167769 times.
✓ Branch 2 taken 66307 times.
✓ Branch 3 taken 38182 times.
272258 if (*sb_coded_flag && i < rc->last_sub_block)
2148 66307 rc->infer_sb_cbf = 0;
2149
2150 //first scan pass
2151
4/4
✓ Branch 0 taken 4326323 times.
✓ Branch 1 taken 266395 times.
✓ Branch 2 taken 4320460 times.
✓ Branch 3 taken 5863 times.
4592718 for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2152 4320460 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2153 4320460 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2154 4320460 const int off = yc * tb->tb_width + xc;
2155 4320460 int *sig_coeff_flag = rc->sig_coeff_flag + off;
2156 4320460 int *abs_level_pass1 = rc->abs_level_pass1 + off;
2157 4320460 int *coeff_sign_level = rc->coeff_sign_level + off;
2158 4320460 int par_level_flag = 0;
2159
2160 4320460 abs_level_gtx_flag[n] = 0;
2161 4320460 last_scan_pos_pass1 = n;
2162
6/6
✓ Branch 0 taken 1643132 times.
✓ Branch 1 taken 2677328 times.
✓ Branch 2 taken 99053 times.
✓ Branch 3 taken 1544079 times.
✓ Branch 4 taken 93048 times.
✓ Branch 5 taken 6005 times.
4320460 if (*sb_coded_flag && (n != rc->num_sb_coeff - 1 || !infer_sb_sig_coeff_flag)) {
2163 1637127 *sig_coeff_flag = sig_coeff_flag_decode(lc, rc, xc, yc);
2164 1637127 rc->rem_bins_pass1--;
2165
2/2
✓ Branch 0 taken 366842 times.
✓ Branch 1 taken 1270285 times.
1637127 if (*sig_coeff_flag)
2166 366842 infer_sb_sig_coeff_flag = 0;
2167 } else {
2168
5/6
✓ Branch 0 taken 173347 times.
✓ Branch 1 taken 2509986 times.
✓ Branch 2 taken 173347 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6005 times.
✓ Branch 5 taken 167342 times.
2683333 *sig_coeff_flag = (n == rc->num_sb_coeff - 1) && infer_sb_sig_coeff_flag && *sb_coded_flag;
2169 }
2170 4320460 *coeff_sign_level = 0;
2171
2/2
✓ Branch 0 taken 372847 times.
✓ Branch 1 taken 3947613 times.
4320460 if (*sig_coeff_flag) {
2172 372847 *coeff_sign_level = 1 - 2 * coeff_sign_flag_ts_decode(lc, cu, rc, xc, yc);
2173 372847 abs_level_gtx_flag[n] = abs_level_gt1_flag_ts_decode(lc, cu, rc, xc, yc);
2174 372847 rc->rem_bins_pass1 -= 2;
2175
2/2
✓ Branch 0 taken 166154 times.
✓ Branch 1 taken 206693 times.
372847 if (abs_level_gtx_flag[n]) {
2176 166154 par_level_flag = par_level_flag_ts_decode(lc);
2177 166154 rc->rem_bins_pass1--;
2178 }
2179 }
2180 4320460 *abs_level_pass1 = *sig_coeff_flag + par_level_flag + abs_level_gtx_flag[n];
2181 }
2182
2183 //greater than x scan pass
2184
4/4
✓ Branch 0 taken 4235127 times.
✓ Branch 1 taken 263094 times.
✓ Branch 2 taken 4225963 times.
✓ Branch 3 taken 9164 times.
4498221 for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2185 4225963 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2186 4225963 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2187 4225963 const int off = yc * tb->tb_width + xc;
2188
2189 4225963 abs_level_pass2[n] = rc->abs_level_pass1[off];
2190
4/4
✓ Branch 0 taken 4479779 times.
✓ Branch 1 taken 24753 times.
✓ Branch 2 taken 278569 times.
✓ Branch 3 taken 4201210 times.
4504532 for (int j = 1; j < 5 && abs_level_gtx_flag[n]; j++) {
2191 278569 abs_level_gtx_flag[n] = abs_level_gtx_flag_ts_decode(lc, j);
2192 278569 abs_level_pass2[n] += abs_level_gtx_flag[n] << 1;
2193 278569 rc->rem_bins_pass1--;
2194 }
2195 4225963 last_scan_pos_pass2 = n;
2196 }
2197
2198 /* remainder scan pass */
2199
2/2
✓ Branch 0 taken 4355840 times.
✓ Branch 1 taken 272258 times.
4628098 for (n = 0; n < rc->num_sb_coeff; n++) {
2200 4355840 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2201 4355840 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2202 4355840 const int off = yc * tb->tb_width + xc;
2203 4355840 const int *abs_level_pass1 = rc->abs_level_pass1 + off;
2204 4355840 int *abs_level = rc->abs_level + off;
2205 4355840 int *coeff_sign_level = rc->coeff_sign_level + off;
2206 4355840 int abs_remainder = 0;
2207
2208
6/6
✓ Branch 0 taken 4225963 times.
✓ Branch 1 taken 129877 times.
✓ Branch 2 taken 4205553 times.
✓ Branch 3 taken 20410 times.
✓ Branch 4 taken 129877 times.
✓ Branch 5 taken 4205553 times.
4355840 if ((n <= last_scan_pos_pass2 && abs_level_pass2[n] >= 10) ||
2209
2/2
✓ Branch 0 taken 94497 times.
✓ Branch 1 taken 35380 times.
129877 (n > last_scan_pos_pass2 && n <= last_scan_pos_pass1 &&
2210
4/4
✓ Branch 0 taken 75057 times.
✓ Branch 1 taken 19440 times.
✓ Branch 2 taken 35380 times.
✓ Branch 3 taken 4280610 times.
4335430 *abs_level_pass1 >= 2) ||
2211
2/2
✓ Branch 0 taken 28548 times.
✓ Branch 1 taken 6832 times.
35380 (n > last_scan_pos_pass1 && *sb_coded_flag))
2212 68398 abs_remainder = abs_remainder_ts_decode(lc, rc, xc, yc);
2213
2/2
✓ Branch 0 taken 4225963 times.
✓ Branch 1 taken 129877 times.
4355840 if (n <= last_scan_pos_pass2) {
2214 4225963 *abs_level = abs_level_pass2[n] + 2 * abs_remainder;
2215
2/2
✓ Branch 0 taken 94497 times.
✓ Branch 1 taken 35380 times.
129877 } else if (n <= last_scan_pos_pass1) {
2216 94497 *abs_level = *abs_level_pass1 + 2 * abs_remainder;
2217 } else {
2218 35380 *abs_level = abs_remainder;
2219
2/2
✓ Branch 0 taken 15497 times.
✓ Branch 1 taken 19883 times.
35380 if (abs_remainder) {
2220 //n > lastScanPosPass1
2221 15497 *coeff_sign_level = 1 - 2 * coeff_sign_flag_decode(lc);
2222 }
2223 }
2224
4/4
✓ Branch 0 taken 4023024 times.
✓ Branch 1 taken 332816 times.
✓ Branch 2 taken 3989159 times.
✓ Branch 3 taken 33865 times.
4355840 if (!bdpcm_flag && n <= last_scan_pos_pass1) {
2225
2/2
✓ Branch 0 taken 3537168 times.
✓ Branch 1 taken 451991 times.
3989159 const int left = xc > 0 ? abs_level[-1] : 0;
2226
2/2
✓ Branch 0 taken 3555948 times.
✓ Branch 1 taken 433211 times.
3989159 const int above = yc > 0 ? abs_level[-tb->tb_width] : 0;
2227 3989159 const int pred = FFMAX(left, above);
2228
2229
4/4
✓ Branch 0 taken 202319 times.
✓ Branch 1 taken 3786840 times.
✓ Branch 2 taken 124664 times.
✓ Branch 3 taken 77655 times.
3989159 if (*abs_level == 1 && pred > 0)
2230 124664 *abs_level = pred;
2231
4/4
✓ Branch 0 taken 235009 times.
✓ Branch 1 taken 3629486 times.
✓ Branch 2 taken 59647 times.
✓ Branch 3 taken 175362 times.
3864495 else if (*abs_level > 0 && *abs_level <= pred)
2232 59647 (*abs_level)--;
2233 }
2234
2/2
✓ Branch 0 taken 388344 times.
✓ Branch 1 taken 3967496 times.
4355840 if (*abs_level) {
2235 388344 tb->coeffs[off] = *coeff_sign_level * *abs_level;
2236 388344 tb->max_scan_x = FFMAX(xc, tb->max_scan_x);
2237 388344 tb->max_scan_y = FFMAX(yc, tb->max_scan_y);
2238 388344 tb->min_scan_x = FFMIN(xc, tb->min_scan_x);
2239 388344 tb->min_scan_y = FFMIN(yc, tb->min_scan_y);
2240 } else {
2241 3967496 tb->coeffs[off] = 0;
2242 }
2243 }
2244
2245 272258 return 0;
2246 }
2247
2248 56567 static int hls_residual_ts_coding(VVCLocalContext *lc, TransformBlock *tb)
2249 {
2250 ResidualCoding rc;
2251 56567 tb->min_scan_x = tb->min_scan_y = INT_MAX;
2252 56567 init_residual_coding(lc, &rc, tb->log2_tb_width, tb->log2_tb_height, tb);
2253
2/2
✓ Branch 0 taken 272258 times.
✓ Branch 1 taken 56567 times.
328825 for (int i = 0; i <= rc.last_sub_block; i++) {
2254 272258 int ret = residual_ts_coding_subblock(lc, &rc, i);
2255
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 272258 times.
272258 if (ret < 0)
2256 return ret;
2257 }
2258
2259 56567 return 0;
2260 }
2261
2262 2199967 static inline int residual_coding_subblock(VVCLocalContext *lc, ResidualCoding *rc, const int i)
2263 {
2264 2199967 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2265 2199967 TransformBlock *tb = rc->tb;
2266 int first_sig_scan_pos_sb, last_sig_scan_pos_sb;
2267 int first_pos_mode0, first_pos_mode1;
2268 2199967 int infer_sb_dc_sig_coeff_flag = 0;
2269 2199967 int n, sig_hidden_flag, sum = 0;
2270 int abs_level_gt2_flag[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE];
2271 2199967 const int start_qstate_sb = rc->qstate;
2272 2199967 const int xs = rc->sb_scan_x_off[i];
2273 2199967 const int ys = rc->sb_scan_y_off[i];
2274 2199967 uint8_t *sb_coded_flag = rc->sb_coded_flag + ys * rc->width_in_sbs + xs;
2275
2276
2277
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2199967 times.
2199967 av_assert0(rc->num_sb_coeff <= MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE);
2278
4/4
✓ Branch 0 taken 1231796 times.
✓ Branch 1 taken 968171 times.
✓ Branch 2 taken 951830 times.
✓ Branch 3 taken 279966 times.
2199967 if (i < rc->last_sub_block && i > 0) {
2279 951830 *sb_coded_flag = sb_coded_flag_decode(lc, sb_coded_flag, rc, xs, ys);
2280 951830 infer_sb_dc_sig_coeff_flag = 1;
2281 } else {
2282 1248137 *sb_coded_flag = 1;
2283 }
2284
8/8
✓ Branch 0 taken 1854454 times.
✓ Branch 1 taken 345513 times.
✓ Branch 2 taken 1782755 times.
✓ Branch 3 taken 71699 times.
✓ Branch 4 taken 53914 times.
✓ Branch 5 taken 1728841 times.
✓ Branch 6 taken 72824 times.
✓ Branch 7 taken 52789 times.
2199967 if (*sb_coded_flag && (xs > 3 || ys > 3) && !tb->c_idx)
2285 72824 lc->parse.mts_zero_out_sig_coeff_flag = 0;
2286
2287
2/2
✓ Branch 0 taken 345513 times.
✓ Branch 1 taken 1854454 times.
2199967 if (!*sb_coded_flag)
2288 345513 return 0;
2289
2290 1854454 first_sig_scan_pos_sb = rc->num_sb_coeff;
2291 1854454 last_sig_scan_pos_sb = -1;
2292
2/2
✓ Branch 0 taken 968171 times.
✓ Branch 1 taken 886283 times.
1854454 first_pos_mode0 = (i == rc->last_sub_block ? rc->last_scan_pos : rc->num_sb_coeff -1);
2293 1854454 first_pos_mode1 = first_pos_mode0;
2294
4/4
✓ Branch 0 taken 19697579 times.
✓ Branch 1 taken 1786679 times.
✓ Branch 2 taken 19629804 times.
✓ Branch 3 taken 67775 times.
21484258 for (n = first_pos_mode0; n >= 0 && rc->rem_bins_pass1 >= 4; n--) {
2295 19629804 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2296 19629804 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2297
4/4
✓ Branch 0 taken 2968203 times.
✓ Branch 1 taken 16661601 times.
✓ Branch 2 taken 968171 times.
✓ Branch 3 taken 2000032 times.
19629804 const int last = (xc == rc->last_significant_coeff_x && yc == rc->last_significant_coeff_y);
2298 19629804 int *abs_level_pass1 = rc->abs_level_pass1 + yc * tb->tb_width + xc;
2299 19629804 int *sig_coeff_flag = rc->sig_coeff_flag + yc * tb->tb_width + xc;
2300
2301
6/6
✓ Branch 0 taken 1786679 times.
✓ Branch 1 taken 17843125 times.
✓ Branch 2 taken 1776531 times.
✓ Branch 3 taken 10148 times.
✓ Branch 4 taken 18651485 times.
✓ Branch 5 taken 968171 times.
19629804 if ((n > 0 || !infer_sb_dc_sig_coeff_flag ) && !last) {
2302 18651485 *sig_coeff_flag = sig_coeff_flag_decode(lc, rc, xc, yc);
2303 18651485 rc->rem_bins_pass1--;
2304
2/2
✓ Branch 0 taken 10266963 times.
✓ Branch 1 taken 8384522 times.
18651485 if (*sig_coeff_flag)
2305 10266963 infer_sb_dc_sig_coeff_flag = 0;
2306 } else {
2307
5/8
✓ Branch 0 taken 10148 times.
✓ Branch 1 taken 968171 times.
✓ Branch 2 taken 10148 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10148 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 10148 times.
✗ Branch 7 not taken.
978319 *sig_coeff_flag = last || (!rc->scan_x_off[n] && !rc ->scan_y_off[n] &&
2308 infer_sb_dc_sig_coeff_flag);
2309 }
2310 19629804 *abs_level_pass1 = 0;
2311
2/2
✓ Branch 0 taken 11245282 times.
✓ Branch 1 taken 8384522 times.
19629804 if (*sig_coeff_flag) {
2312 11245282 int abs_level_gt1_flag, par_level_flag = 0;
2313 11245282 const int inc = get_gtx_flag_inc(rc, xc, yc, last);
2314 11245282 abs_level_gt1_flag = abs_level_gtx_flag_decode(lc, inc);
2315 11245282 rc->rem_bins_pass1--;
2316
2/2
✓ Branch 0 taken 2358980 times.
✓ Branch 1 taken 8886302 times.
11245282 if (abs_level_gt1_flag) {
2317 2358980 par_level_flag = par_level_flag_decode(lc, inc);
2318 2358980 abs_level_gt2_flag[n] = abs_level_gtx_flag_decode(lc, inc + 32);
2319 2358980 rc->rem_bins_pass1 -= 2;
2320 } else {
2321 8886302 abs_level_gt2_flag[n] = 0;
2322 }
2323
2/2
✓ Branch 0 taken 1837790 times.
✓ Branch 1 taken 9407492 times.
11245282 if (last_sig_scan_pos_sb == -1)
2324 1837790 last_sig_scan_pos_sb = n;
2325 11245282 first_sig_scan_pos_sb = n;
2326
2327 11245282 *abs_level_pass1 =
2328 11245282 1 + par_level_flag + abs_level_gt1_flag + (abs_level_gt2_flag[n] << 1);
2329 } else {
2330 8384522 abs_level_gt2_flag[n] = 0;
2331 }
2332
2333
2/2
✓ Branch 0 taken 18081969 times.
✓ Branch 1 taken 1547835 times.
19629804 if (rsh->sh_dep_quant_used_flag)
2334 18081969 rc->qstate = qstate_translate_table[rc->qstate][*abs_level_pass1 & 1];
2335
2336 19629804 first_pos_mode1 = n - 1;
2337 }
2338
2/2
✓ Branch 0 taken 19629804 times.
✓ Branch 1 taken 1854454 times.
21484258 for (n = first_pos_mode0; n > first_pos_mode1; n--) {
2339 19629804 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2340 19629804 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2341 19629804 const int *abs_level_pass1 = rc->abs_level_pass1 + yc * tb->tb_width + xc;
2342 19629804 int *abs_level = rc->abs_level + yc * tb->tb_width + xc;
2343
2344 19629804 *abs_level = *abs_level_pass1;
2345
2/2
✓ Branch 0 taken 633633 times.
✓ Branch 1 taken 18996171 times.
19629804 if (abs_level_gt2_flag[n]) {
2346 633633 const int abs_remainder = abs_remainder_decode(lc, rc, xc, yc);
2347 633633 ep_update_hist(lc->ep, rc, abs_remainder, 2);
2348 633633 *abs_level += 2 * abs_remainder;
2349 }
2350 }
2351
2/2
✓ Branch 0 taken 382666 times.
✓ Branch 1 taken 1854454 times.
2237120 for (n = first_pos_mode1; n >= 0; n--) {
2352 382666 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2353 382666 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2354 382666 int *abs_level = rc->abs_level + yc * tb->tb_width + xc;
2355
2356
1/2
✓ Branch 0 taken 382666 times.
✗ Branch 1 not taken.
382666 if (*sb_coded_flag) {
2357 382666 const int dec_abs_level = dec_abs_level_decode(lc, rc, xc, yc, abs_level);
2358 382666 ep_update_hist(lc->ep, rc, dec_abs_level, 0);
2359 }
2360
2/2
✓ Branch 0 taken 346663 times.
✓ Branch 1 taken 36003 times.
382666 if (*abs_level > 0) {
2361
2/2
✓ Branch 0 taken 8583 times.
✓ Branch 1 taken 338080 times.
346663 if (last_sig_scan_pos_sb == -1)
2362 8583 last_sig_scan_pos_sb = n;
2363 346663 first_sig_scan_pos_sb = n;
2364 }
2365
2/2
✓ Branch 0 taken 291903 times.
✓ Branch 1 taken 90763 times.
382666 if (rsh->sh_dep_quant_used_flag)
2366 291903 rc->qstate = qstate_translate_table[rc->qstate][*abs_level & 1];
2367 }
2368
2/2
✓ Branch 0 taken 58763 times.
✓ Branch 1 taken 1795691 times.
1913217 sig_hidden_flag = rsh->sh_sign_data_hiding_used_flag &&
2369
2/2
✓ Branch 0 taken 40911 times.
✓ Branch 1 taken 17852 times.
58763 (last_sig_scan_pos_sb - first_sig_scan_pos_sb > 3 ? 1 : 0);
2370
2371
2/2
✓ Branch 0 taken 1709007 times.
✓ Branch 1 taken 145447 times.
1854454 if (rsh->sh_dep_quant_used_flag)
2372 1709007 rc->qstate = start_qstate_sb;
2373
2/2
✓ Branch 0 taken 968171 times.
✓ Branch 1 taken 886283 times.
1854454 n = (i == rc->last_sub_block ? rc->last_scan_pos : rc->num_sb_coeff -1);
2374
2/2
✓ Branch 0 taken 20012470 times.
✓ Branch 1 taken 1854454 times.
21866924 for (/* nothing */; n >= 0; n--) {
2375 int trans_coeff_level;
2376 20012470 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2377 20012470 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2378 20012470 const int off = yc * tb->tb_width + xc;
2379 20012470 const int *abs_level = rc->abs_level + off;
2380
2381
2/2
✓ Branch 0 taken 11591945 times.
✓ Branch 1 taken 8420525 times.
20012470 if (*abs_level > 0) {
2382 11591945 int sign = 1;
2383
4/4
✓ Branch 0 taken 325851 times.
✓ Branch 1 taken 11266094 times.
✓ Branch 2 taken 284940 times.
✓ Branch 3 taken 40911 times.
11591945 if (!sig_hidden_flag || (n != first_sig_scan_pos_sb))
2384 11551034 sign = 1 - 2 * coeff_sign_flag_decode(lc);
2385
2/2
✓ Branch 0 taken 10748462 times.
✓ Branch 1 taken 843483 times.
11591945 if (rsh->sh_dep_quant_used_flag) {
2386 10748462 trans_coeff_level = (2 * *abs_level - (rc->qstate > 1)) * sign;
2387 } else {
2388 843483 trans_coeff_level = *abs_level * sign;
2389
2/2
✓ Branch 0 taken 325851 times.
✓ Branch 1 taken 517632 times.
843483 if (sig_hidden_flag) {
2390 325851 sum += *abs_level;
2391
4/4
✓ Branch 0 taken 40911 times.
✓ Branch 1 taken 284940 times.
✓ Branch 2 taken 21117 times.
✓ Branch 3 taken 19794 times.
325851 if (n == first_sig_scan_pos_sb && (sum % 2))
2392 21117 trans_coeff_level = -trans_coeff_level;
2393 }
2394 }
2395 11591945 tb->coeffs[off] = trans_coeff_level;
2396 11591945 tb->max_scan_x = FFMAX(xc, tb->max_scan_x);
2397 11591945 tb->max_scan_y = FFMAX(yc, tb->max_scan_y);
2398 }
2399
2/2
✓ Branch 0 taken 18373872 times.
✓ Branch 1 taken 1638598 times.
20012470 if (rsh->sh_dep_quant_used_flag)
2400 18373872 rc->qstate = qstate_translate_table[rc->qstate][*abs_level & 1];
2401 }
2402
2403 1854454 return 0;
2404 }
2405
2406 968171 static void derive_last_scan_pos(ResidualCoding *rc)
2407 {
2408 int xc, yc, xs, ys;
2409 do {
2410
2/2
✓ Branch 0 taken 6536276 times.
✓ Branch 1 taken 108488981 times.
115025257 if (!rc->last_scan_pos) {
2411 6536276 rc->last_scan_pos = rc->num_sb_coeff;
2412 6536276 rc->last_sub_block--;
2413 }
2414 115025257 rc->last_scan_pos--;
2415 115025257 xs = rc->sb_scan_x_off[rc->last_sub_block];
2416 115025257 ys = rc->sb_scan_y_off[rc->last_sub_block];
2417 115025257 xc = (xs << rc->log2_sb_w) + rc->scan_x_off[rc->last_scan_pos];
2418 115025257 yc = (ys << rc->log2_sb_h) + rc->scan_y_off[rc->last_scan_pos];
2419
4/4
✓ Branch 0 taken 107616358 times.
✓ Branch 1 taken 7408899 times.
✓ Branch 2 taken 6440728 times.
✓ Branch 3 taken 968171 times.
115025257 } while ((xc != rc->last_significant_coeff_x) || (yc != rc->last_significant_coeff_y));
2420 968171 }
2421
2422 968171 static void last_significant_coeff_x_y_decode(ResidualCoding *rc, VVCLocalContext *lc,
2423 const int log2_zo_tb_width, const int log2_zo_tb_height)
2424 {
2425 968171 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2426 968171 const TransformBlock *tb = rc->tb;
2427 int last_significant_coeff_x, last_significant_coeff_y;
2428
2429 968171 last_significant_coeff_x = last_significant_coeff_x_prefix_decode(lc,
2430 968171 tb->log2_tb_width, log2_zo_tb_width, tb->c_idx);
2431
2432 968171 last_significant_coeff_y = last_significant_coeff_y_prefix_decode(lc,
2433 968171 tb->log2_tb_height, log2_zo_tb_height, tb->c_idx);
2434
2435
2/2
✓ Branch 0 taken 209380 times.
✓ Branch 1 taken 758791 times.
968171 if (last_significant_coeff_x > 3) {
2436 209380 int suffix = last_sig_coeff_suffix_decode(lc, last_significant_coeff_x);
2437 209380 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
2438 209380 (2 + (last_significant_coeff_x & 1)) + suffix;
2439 }
2440
2/2
✓ Branch 0 taken 161050 times.
✓ Branch 1 taken 807121 times.
968171 if (last_significant_coeff_y > 3) {
2441 161050 int suffix = last_sig_coeff_suffix_decode(lc, last_significant_coeff_y);
2442 161050 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
2443 161050 (2 + (last_significant_coeff_y & 1)) + suffix;
2444 }
2445
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 968171 times.
968171 if (rsh->sh_reverse_last_sig_coeff_flag) {
2446 last_significant_coeff_x = (1 << log2_zo_tb_width) - 1 - last_significant_coeff_x;
2447 last_significant_coeff_y = (1 << log2_zo_tb_height) - 1 - last_significant_coeff_y;
2448 }
2449 968171 rc->last_significant_coeff_x = last_significant_coeff_x;
2450 968171 rc->last_significant_coeff_y = last_significant_coeff_y;
2451 968171 }
2452
2453 968171 static int hls_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
2454 {
2455 968171 const VVCSPS *sps = lc->fc->ps.sps;
2456 968171 const CodingUnit *cu = lc->cu;
2457 968171 const int log2_tb_width = tb->log2_tb_width;
2458 968171 const int log2_tb_height = tb->log2_tb_height;
2459 968171 const int c_idx = tb->c_idx;
2460 int log2_zo_tb_width, log2_zo_tb_height;
2461 ResidualCoding rc;
2462
2463
10/10
✓ Branch 0 taken 959961 times.
✓ Branch 1 taken 8210 times.
✓ Branch 2 taken 51961 times.
✓ Branch 3 taken 908000 times.
✓ Branch 4 taken 34956 times.
✓ Branch 5 taken 17005 times.
✓ Branch 6 taken 1722 times.
✓ Branch 7 taken 33234 times.
✓ Branch 8 taken 1619 times.
✓ Branch 9 taken 103 times.
968171 if (sps->r->sps_mts_enabled_flag && cu->sbt_flag && !c_idx && log2_tb_width == 5 && log2_tb_height < 6)
2464 1619 log2_zo_tb_width = 4;
2465 else
2466 966552 log2_zo_tb_width = FFMIN(log2_tb_width, 5 );
2467
2468
10/10
✓ Branch 0 taken 959961 times.
✓ Branch 1 taken 8210 times.
✓ Branch 2 taken 51961 times.
✓ Branch 3 taken 908000 times.
✓ Branch 4 taken 34956 times.
✓ Branch 5 taken 17005 times.
✓ Branch 6 taken 34709 times.
✓ Branch 7 taken 247 times.
✓ Branch 8 taken 2102 times.
✓ Branch 9 taken 32607 times.
968171 if (sps->r->sps_mts_enabled_flag && cu->sbt_flag && !c_idx && log2_tb_width < 6 && log2_tb_height == 5 )
2469 2102 log2_zo_tb_height = 4;
2470 else
2471 966069 log2_zo_tb_height = FFMIN(log2_tb_height, 5);
2472
2473 968171 init_residual_coding(lc, &rc, log2_zo_tb_width, log2_zo_tb_height, tb);
2474 968171 last_significant_coeff_x_y_decode(&rc, lc, log2_zo_tb_width, log2_zo_tb_height);
2475 968171 derive_last_scan_pos(&rc);
2476
2477
9/10
✓ Branch 0 taken 688205 times.
✓ Branch 1 taken 279966 times.
✓ Branch 2 taken 662661 times.
✓ Branch 3 taken 25544 times.
✓ Branch 4 taken 592346 times.
✓ Branch 5 taken 70315 times.
✓ Branch 6 taken 592346 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 450637 times.
✓ Branch 9 taken 141709 times.
968171 if (!rc.last_sub_block && log2_tb_width >= 2 && log2_tb_height >= 2 && !tb->ts && rc.last_scan_pos > 0)
2478 450637 lc->parse.lfnst_dc_only = 0;
2479
6/6
✓ Branch 0 taken 279966 times.
✓ Branch 1 taken 688205 times.
✓ Branch 2 taken 277970 times.
✓ Branch 3 taken 1996 times.
✓ Branch 4 taken 4609 times.
✓ Branch 5 taken 273361 times.
968171 if ((rc.last_sub_block > 0 && log2_tb_width >= 2 && log2_tb_height >= 2 ) ||
2480
8/8
✓ Branch 0 taken 157326 times.
✓ Branch 1 taken 537484 times.
✓ Branch 2 taken 87549 times.
✓ Branch 3 taken 69777 times.
✓ Branch 4 taken 43678 times.
✓ Branch 5 taken 43871 times.
✓ Branch 6 taken 55062 times.
✓ Branch 7 taken 58393 times.
694810 (rc.last_scan_pos > 7 && (log2_tb_width == 2 || log2_tb_width == 3 ) &&
2481 log2_tb_width == log2_tb_height))
2482 328423 lc->parse.lfnst_zero_out_sig_coeff_flag = 0;
2483
6/6
✓ Branch 0 taken 688205 times.
✓ Branch 1 taken 279966 times.
✓ Branch 2 taken 519255 times.
✓ Branch 3 taken 168950 times.
✓ Branch 4 taken 590649 times.
✓ Branch 5 taken 208572 times.
968171 if ((rc.last_sub_block > 0 || rc.last_scan_pos > 0 ) && !c_idx)
2484 590649 lc->parse.mts_dc_only = 0;
2485
2486 968171 memset(tb->coeffs, 0, tb->tb_width * tb->tb_height * sizeof(*tb->coeffs));
2487 968171 memset(rc.abs_level, 0, tb->tb_width * tb->tb_height * sizeof(rc.abs_level[0]));
2488 968171 memset(rc.sb_coded_flag, 0, rc.nb_sbs);
2489 968171 memset(rc.abs_level_pass1, 0, tb->tb_width * tb->tb_height * sizeof(rc.abs_level_pass1[0]));
2490 968171 memset(rc.sig_coeff_flag, 0, tb->tb_width * tb->tb_height * sizeof(rc.sig_coeff_flag[0]));
2491
2492
2/2
✓ Branch 0 taken 2199967 times.
✓ Branch 1 taken 968171 times.
3168138 for (int i = rc.last_sub_block; i >= 0; i--) {
2493 2199967 int ret = residual_coding_subblock(lc, &rc, i);
2494
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2199967 times.
2199967 if (ret < 0)
2495 return ret;
2496 }
2497
2498 968171 return 0;
2499 }
2500
2501 1024738 int ff_vvc_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
2502 {
2503 1024738 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2504
3/4
✓ Branch 0 taken 1024738 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 56567 times.
✓ Branch 3 taken 968171 times.
1024738 const int ts = !rsh->sh_ts_residual_coding_disabled_flag && tb->ts;
2505
2506
2/2
✓ Branch 0 taken 56567 times.
✓ Branch 1 taken 968171 times.
1024738 return ts ? hls_residual_ts_coding(lc, tb) : hls_residual_coding(lc, tb);
2507 }
2508
2509 137181 int ff_vvc_cu_coded_flag(VVCLocalContext *lc)
2510 {
2511 137181 return GET_CABAC(CU_CODED_FLAG);
2512 }
2513
2514 135700 int ff_vvc_sbt_flag(VVCLocalContext *lc)
2515 {
2516 135700 const int w = lc->cu->cb_width;
2517 135700 const int h = lc->cu->cb_height;
2518 135700 const int inc = w * h <= 256;
2519 135700 return GET_CABAC(CU_SBT_FLAG + inc);
2520 }
2521
2522 32385 int ff_vvc_sbt_quad_flag(VVCLocalContext *lc)
2523 {
2524 32385 return GET_CABAC(CU_SBT_QUAD_FLAG);
2525 }
2526
2527 25537 int ff_vvc_sbt_horizontal_flag(VVCLocalContext *lc)
2528 {
2529 25537 const int w = lc->cu->cb_width;
2530 25537 const int h = lc->cu->cb_height;
2531
4/4
✓ Branch 0 taken 13683 times.
✓ Branch 1 taken 11854 times.
✓ Branch 2 taken 7401 times.
✓ Branch 3 taken 6282 times.
25537 const int inc = (w == h) ? 0 : ((w < h) ? 1 : 2);
2532 25537 return GET_CABAC(CU_SBT_HORIZONTAL_FLAG + inc);
2533 }
2534
2535 45453 int ff_vvc_sbt_pos_flag(VVCLocalContext *lc)
2536 {
2537 45453 return GET_CABAC(CU_SBT_POS_FLAG);
2538 }
2539
2540 190512 int ff_vvc_lfnst_idx(VVCLocalContext *lc, const int inc)
2541 {
2542
2/2
✓ Branch 1 taken 48740 times.
✓ Branch 2 taken 141772 times.
190512 if (!GET_CABAC(LFNST_IDX + inc))
2543 48740 return 0;
2544
2/2
✓ Branch 1 taken 86860 times.
✓ Branch 2 taken 54912 times.
141772 if (!GET_CABAC(LFNST_IDX + 2))
2545 86860 return 1;
2546 54912 return 2;
2547 }
2548
2549 253110 int ff_vvc_mts_idx(VVCLocalContext *lc)
2550 {
2551 int i;
2552
2/2
✓ Branch 0 taken 461226 times.
✓ Branch 1 taken 910 times.
462136 for (i = 0; i < 4; i++) {
2553
2/2
✓ Branch 1 taken 252200 times.
✓ Branch 2 taken 209026 times.
461226 if (!GET_CABAC(MTS_IDX + i))
2554 252200 return i;
2555 }
2556 910 return i;
2557 }
2558
2559 1867 int ff_vvc_end_of_slice_flag_decode(VVCLocalContext *lc)
2560 {
2561 1867 return get_cabac_terminate(&lc->ep->cc);
2562 }
2563
2564 527 int ff_vvc_end_of_tile_one_bit(VVCLocalContext *lc)
2565 {
2566 527 return get_cabac_terminate(&lc->ep->cc);
2567 }
2568
2569 153 int ff_vvc_end_of_subset_one_bit(VVCLocalContext *lc)
2570 {
2571 153 return get_cabac_terminate(&lc->ep->cc);
2572 }
2573