FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vvc/cabac.c
Date: 2024-05-03 15:42:48
Exec Total Coverage
Lines: 948 990 95.8%
Functions: 121 126 96.0%
Branches: 620 686 90.4%

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 #include "libavcodec/cabac_functions.h"
23
24 #include "cabac.h"
25 #include "ctu.h"
26 #include "data.h"
27
28 #define CABAC_MAX_BIN 31
29
30 #define CNU 35
31
32 enum SyntaxElement {
33 ALF_CTB_FLAG = 0,
34 ALF_USE_APS_FLAG = ALF_CTB_FLAG + 9,
35 ALF_CTB_CC_CB_IDC,
36 ALF_CTB_CC_CR_IDC = ALF_CTB_CC_CB_IDC + 3,
37 ALF_CTB_FILTER_ALT_IDX = ALF_CTB_CC_CR_IDC + 3,
38 SAO_MERGE_FLAG = ALF_CTB_FILTER_ALT_IDX + 2,
39 SAO_TYPE_IDX,
40 SPLIT_CU_FLAG,
41 SPLIT_QT_FLAG = SPLIT_CU_FLAG + 9,
42 MTT_SPLIT_CU_VERTICAL_FLAG = SPLIT_QT_FLAG + 6,
43 MTT_SPLIT_CU_BINARY_FLAG = MTT_SPLIT_CU_VERTICAL_FLAG + 5,
44 NON_INTER_FLAG = MTT_SPLIT_CU_BINARY_FLAG + 4,
45 CU_SKIP_FLAG = NON_INTER_FLAG + 2,
46 PRED_MODE_IBC_FLAG = CU_SKIP_FLAG + 3,
47 PRED_MODE_FLAG = PRED_MODE_IBC_FLAG + 3,
48 PRED_MODE_PLT_FLAG = PRED_MODE_FLAG + 2,
49 CU_ACT_ENABLED_FLAG,
50 INTRA_BDPCM_LUMA_FLAG,
51 INTRA_BDPCM_LUMA_DIR_FLAG,
52 INTRA_MIP_FLAG,
53 INTRA_LUMA_REF_IDX = INTRA_MIP_FLAG + 4,
54 INTRA_SUBPARTITIONS_MODE_FLAG = INTRA_LUMA_REF_IDX + 2,
55 INTRA_SUBPARTITIONS_SPLIT_FLAG,
56 INTRA_LUMA_MPM_FLAG,
57 INTRA_LUMA_NOT_PLANAR_FLAG,
58 INTRA_BDPCM_CHROMA_FLAG = INTRA_LUMA_NOT_PLANAR_FLAG + 2,
59 INTRA_BDPCM_CHROMA_DIR_FLAG,
60 CCLM_MODE_FLAG,
61 CCLM_MODE_IDX,
62 INTRA_CHROMA_PRED_MODE,
63 GENERAL_MERGE_FLAG,
64 INTER_PRED_IDC,
65 INTER_AFFINE_FLAG = INTER_PRED_IDC + 6,
66 CU_AFFINE_TYPE_FLAG = INTER_AFFINE_FLAG + 3,
67 SYM_MVD_FLAG,
68 REF_IDX_LX,
69 MVP_LX_FLAG = REF_IDX_LX + 2,
70 AMVR_FLAG,
71 AMVR_PRECISION_IDX = AMVR_FLAG + 2,
72 BCW_IDX = AMVR_PRECISION_IDX + 3,
73 CU_CODED_FLAG,
74 CU_SBT_FLAG,
75 CU_SBT_QUAD_FLAG = CU_SBT_FLAG + 2,
76 CU_SBT_HORIZONTAL_FLAG,
77 CU_SBT_POS_FLAG = CU_SBT_HORIZONTAL_FLAG + 3,
78 LFNST_IDX,
79 MTS_IDX = LFNST_IDX + 3,
80 COPY_ABOVE_PALETTE_INDICES_FLAG = MTS_IDX + 4,
81 PALETTE_TRANSPOSE_FLAG,
82 RUN_COPY_FLAG,
83 REGULAR_MERGE_FLAG = RUN_COPY_FLAG + 8,
84 MMVD_MERGE_FLAG = REGULAR_MERGE_FLAG + 2,
85 MMVD_CAND_FLAG,
86 MMVD_DISTANCE_IDX,
87 CIIP_FLAG,
88 MERGE_SUBBLOCK_FLAG,
89 MERGE_SUBBLOCK_IDX = MERGE_SUBBLOCK_FLAG + 3,
90 MERGE_IDX,
91 ABS_MVD_GREATER0_FLAG,
92 ABS_MVD_GREATER1_FLAG,
93 TU_Y_CODED_FLAG,
94 TU_CB_CODED_FLAG = TU_Y_CODED_FLAG + 4,
95 TU_CR_CODED_FLAG = TU_CB_CODED_FLAG + 2,
96 CU_QP_DELTA_ABS = TU_CR_CODED_FLAG + 3,
97 CU_CHROMA_QP_OFFSET_FLAG = CU_QP_DELTA_ABS + 2,
98 CU_CHROMA_QP_OFFSET_IDX,
99 TRANSFORM_SKIP_FLAG,
100 TU_JOINT_CBCR_RESIDUAL_FLAG = TRANSFORM_SKIP_FLAG + 2,
101 LAST_SIG_COEFF_X_PREFIX = TU_JOINT_CBCR_RESIDUAL_FLAG + 3,
102 LAST_SIG_COEFF_Y_PREFIX = LAST_SIG_COEFF_X_PREFIX +23,
103 SB_CODED_FLAG = LAST_SIG_COEFF_Y_PREFIX +23,
104 SIG_COEFF_FLAG = SB_CODED_FLAG + 7,
105 PAR_LEVEL_FLAG = SIG_COEFF_FLAG +63,
106 ABS_LEVEL_GTX_FLAG = PAR_LEVEL_FLAG +33,
107 COEFF_SIGN_FLAG = ABS_LEVEL_GTX_FLAG +72,
108 SYNTAX_ELEMENT_LAST = COEFF_SIGN_FLAG + 6,
109 };
110
111 static const uint8_t init_values[4][SYNTAX_ELEMENT_LAST] = {
112 {
113 //alf_ctb_flag
114 62, 39, 39, 54, 39, 39, 31, 39, 39,
115 //alf_use_aps_flag
116 46,
117 //alf_ctb_cc_cb_idc
118 18, 30, 31,
119 //alf_ctb_cc_cr_idc
120 18, 30, 31,
121 //alf_ctb_filter_alt_idx
122 11, 11,
123 //sao_merge_left_flag and sao_merge_up_flag
124 60,
125 //sao_type_idx_luma and sao_type_idx_chroma
126 13,
127 //split_cu_flag
128 19, 28, 38, 27, 29, 38, 20, 30, 31,
129 //split_qt_flag
130 27, 6, 15, 25, 19, 37,
131 //mtt_split_cu_vertical_flag
132 43, 42, 29, 27, 44,
133 //mtt_split_cu_binary_flag
134 36, 45, 36, 45,
135 //non_inter_flag
136 CNU, CNU,
137 //cu_skip_flag
138 0, 26, 28,
139 //pred_mode_ibc_flag
140 17, 42, 36,
141 //pred_mode_flag
142 CNU, CNU,
143 //pred_mode_plt_flag
144 25,
145 //cu_act_enabled_flag
146 52,
147 //intra_bdpcm_luma_flag
148 19,
149 //intra_bdpcm_luma_dir_flag
150 35,
151 //intra_mip_flag
152 33, 49, 50, 25,
153 //intra_luma_ref_idx
154 25, 60,
155 //intra_subpartitions_mode_flag
156 33,
157 //intra_subpartitions_split_flag
158 43,
159 //intra_luma_mpm_flag
160 45,
161 //intra_luma_not_planar_flag
162 13, 28,
163 //intra_bdpcm_chroma_flag
164 1,
165 //intra_bdpcm_chroma_dir_flag
166 27,
167 //cclm_mode_flag
168 59,
169 //cclm_mode_idx
170 27,
171 //intra_chroma_pred_mode
172 34,
173 //general_merge_flag
174 26,
175 //inter_pred_idc
176 CNU, CNU, CNU, CNU, CNU, CNU,
177 //inter_affine_flag
178 CNU, CNU, CNU,
179 //cu_affine_type_flag
180 CNU,
181 //sym_mvd_flag
182 CNU,
183 //ref_idx_l0 and ref_idx_l1
184 CNU, CNU,
185 //mvp_l0_flag and mvp_l1_flag
186 42,
187 //amvr_flag
188 CNU, CNU,
189 //amvr_precision_idx
190 35, 34, 35,
191 //bcw_idx
192 CNU,
193 //cu_coded_flag
194 6,
195 //cu_sbt_flag
196 CNU, CNU,
197 //cu_sbt_quad_flag
198 CNU,
199 //cu_sbt_horizontal_flag
200 CNU, CNU, CNU,
201 //cu_sbt_pos_flag
202 CNU,
203 //lfnst_idx
204 28, 52, 42,
205 //mts_idx
206 29, 0, 28, 0,
207 //copy_above_palette_indices_flag
208 42,
209 //palette_transpose_flag
210 42,
211 //run_copy_flag
212 50, 37, 45, 30, 46, 45, 38, 46,
213 //regular_merge_flag
214 CNU, CNU,
215 //mmvd_merge_flag
216 CNU,
217 //mmvd_cand_flag
218 CNU,
219 //mmvd_distance_idx
220 CNU,
221 //ciip_flag
222 CNU,
223 //merge_subblock_flag
224 CNU, CNU, CNU,
225 //merge_subblock_idx
226 CNU,
227 //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
228 34,
229 //abs_mvd_greater0_flag
230 14,
231 //abs_mvd_greater1_flag
232 45,
233 //tu_y_coded_flag
234 15, 12, 5, 7,
235 //tu_cb_coded_flag
236 12, 21,
237 //tu_cr_coded_flag
238 33, 28, 36,
239 //cu_qp_delta_abs
240 CNU, CNU,
241 //cu_chroma_qp_offset_flag
242 CNU,
243 //cu_chroma_qp_offset_idx
244 CNU,
245 //transform_skip_flag
246 25, 9,
247 //tu_joint_cbcr_residual_flag
248 12, 21, 35,
249 //last_sig_coeff_x_prefix
250 13, 5, 4, 21, 14, 4, 6, 14, 21, 11, 14, 7, 14, 5, 11, 21,
251 30, 22, 13, 42, 12, 4, 3,
252 //last_sig_coeff_y_prefix
253 13, 5, 4, 6, 13, 11, 14, 6, 5, 3, 14, 22, 6, 4, 3, 6,
254 22, 29, 20, 34, 12, 4, 3,
255 //sb_coded_flag
256 18, 31, 25, 15, 18, 20, 38,
257 //sig_coeff_flag
258 25, 19, 28, 14, 25, 20, 29, 30, 19, 37, 30, 38, 11, 38, 46, 54,
259 27, 39, 39, 39, 44, 39, 39, 39, 18, 39, 39, 39, 27, 39, 39, 39,
260 0, 39, 39, 39, 25, 27, 28, 37, 34, 53, 53, 46, 19, 46, 38, 39,
261 52, 39, 39, 39, 11, 39, 39, 39, 19, 39, 39, 39, 25, 28, 38,
262 //par_level_flag
263 33, 25, 18, 26, 34, 27, 25, 26, 19, 42, 35, 33, 19, 27, 35, 35,
264 34, 42, 20, 43, 20, 33, 25, 26, 42, 19, 27, 26, 50, 35, 20, 43,
265 11,
266 //abs_level_gtx_flag
267 25, 25, 11, 27, 20, 21, 33, 12, 28, 21, 22, 34, 28, 29, 29, 30,
268 36, 29, 45, 30, 23, 40, 33, 27, 28, 21, 37, 36, 37, 45, 38, 46,
269 25, 1, 40, 25, 33, 11, 17, 25, 25, 18, 4, 17, 33, 26, 19, 13,
270 33, 19, 20, 28, 22, 40, 9, 25, 18, 26, 35, 25, 26, 35, 28, 37,
271 11, 5, 5, 14, 10, 3, 3, 3,
272 //coeff_sign_flag
273 12, 17, 46, 28, 25, 46,
274 },
275 {
276 //alf_ctb_flag
277 13, 23, 46, 4, 61, 54, 19, 46, 54,
278 //alf_use_aps_flag
279 46,
280 //alf_ctb_cc_cb_idc
281 18, 21, 38,
282 //alf_ctb_cc_cr_idc
283 18, 21, 38,
284 //alf_ctb_filter_alt_idx
285 20, 12,
286 //sao_merge_left_flag and sao_merge_up_flag
287 60,
288 //sao_type_idx_luma and sao_type_idx_chroma
289 5,
290 //split_cu_flag
291 11, 35, 53, 12, 6, 30, 13, 15, 31,
292 //split_qt_flag
293 20, 14, 23, 18, 19, 6,
294 //mtt_split_cu_vertical_flag
295 43, 35, 37, 34, 52,
296 //mtt_split_cu_binary_flag
297 43, 37, 21, 22,
298 //non_inter_flag
299 25, 12,
300 //cu_skip_flag
301 57, 59, 45,
302 //pred_mode_ibc_flag
303 0, 57, 44,
304 //pred_mode_flag
305 40, 35,
306 //pred_mode_plt_flag
307 0,
308 //cu_act_enabled_flag
309 46,
310 //intra_bdpcm_luma_flag
311 40,
312 //intra_bdpcm_luma_dir_flag
313 36,
314 //intra_mip_flag
315 41, 57, 58, 26,
316 //intra_luma_ref_idx
317 25, 58,
318 //intra_subpartitions_mode_flag
319 33,
320 //intra_subpartitions_split_flag
321 36,
322 //intra_luma_mpm_flag
323 36,
324 //intra_luma_not_planar_flag
325 12, 20,
326 //intra_bdpcm_chroma_flag
327 0,
328 //intra_bdpcm_chroma_dir_flag
329 13,
330 //cclm_mode_flag
331 34,
332 //cclm_mode_idx
333 27,
334 //intra_chroma_pred_mode
335 25,
336 //general_merge_flag
337 21,
338 //inter_pred_idc
339 7, 6, 5, 12, 4, 40,
340 //inter_affine_flag
341 12, 13, 14,
342 //cu_affine_type_flag
343 35,
344 //sym_mvd_flag
345 28,
346 //ref_idx_l0 and ref_idx_l1
347 20, 35,
348 //mvp_l0_flag and mvp_l1_flag
349 34,
350 //amvr_flag
351 59, 58,
352 //amvr_precision_idx
353 60, 48, 60,
354 //bcw_idx
355 4,
356 //cu_coded_flag
357 5,
358 //cu_sbt_flag
359 56, 57,
360 //cu_sbt_quad_flag
361 42,
362 //cu_sbt_horizontal_flag
363 20, 43, 12,
364 //cu_sbt_pos_flag
365 28,
366 //lfnst_idx
367 37, 45, 27,
368 //mts_idx
369 45, 40, 27, 0,
370 //copy_above_palette_indices_flag
371 59,
372 //palette_transpose_flag
373 42,
374 //run_copy_flag
375 51, 30, 30, 38, 23, 38, 53, 46,
376 //regular_merge_flag
377 38, 7,
378 //mmvd_merge_flag
379 26,
380 //mmvd_cand_flag
381 43,
382 //mmvd_distance_idx
383 60,
384 //ciip_flag
385 57,
386 //merge_subblock_flag
387 48, 57, 44,
388 //merge_subblock_idx
389 5,
390 //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
391 20,
392 //abs_mvd_greater0_flag
393 44,
394 //abs_mvd_greater1_flag
395 43,
396 //tu_y_coded_flag
397 23, 5, 20, 7,
398 //tu_cb_coded_flag
399 25, 28,
400 //tu_cr_coded_flag
401 25, 29, 45,
402 //cu_qp_delta_abs
403 CNU, CNU,
404 //cu_chroma_qp_offset_flag
405 CNU,
406 //cu_chroma_qp_offset_idx
407 CNU,
408 //transform_skip_flag
409 25, 9,
410 //tu_joint_cbcr_residual_flag
411 27, 36, 45,
412 //last_sig_coeff_x_prefix
413 6, 13, 12, 6, 6, 12, 14, 14, 13, 12, 29, 7, 6, 13, 36, 28,
414 14, 13, 5, 26, 12, 4, 18,
415 //last_sig_coeff_y_prefix
416 5, 5, 12, 6, 6, 4, 6, 14, 5, 12, 14, 7, 13, 5, 13, 21,
417 14, 20, 12, 34, 11, 4, 18,
418 //sb_coded_flag
419 25, 30, 25, 45, 18, 12, 29,
420 //sig_coeff_flag
421 17, 41, 42, 29, 25, 49, 43, 37, 33, 58, 51, 30, 19, 38, 38, 46,
422 34, 54, 54, 39, 6, 39, 39, 39, 19, 39, 54, 39, 19, 39, 39, 39,
423 56, 39, 39, 39, 17, 34, 35, 21, 41, 59, 60, 38, 35, 45, 53, 54,
424 44, 39, 39, 39, 34, 38, 62, 39, 26, 39, 39, 39, 40, 35, 44,
425 //par_level_flag
426 18, 17, 33, 18, 26, 42, 25, 33, 26, 42, 27, 25, 34, 42, 42, 35,
427 26, 27, 42, 20, 20, 25, 25, 26, 11, 19, 27, 33, 42, 35, 35, 43,
428 3,
429 //abs_level_gtx_flag
430 0, 17, 26, 19, 35, 21, 25, 34, 20, 28, 29, 33, 27, 28, 29, 22,
431 34, 28, 44, 37, 38, 0, 25, 19, 20, 13, 14, 57, 44, 30, 30, 23,
432 17, 0, 1, 17, 25, 18, 0, 9, 25, 33, 34, 9, 25, 18, 26, 20,
433 25, 18, 19, 27, 29, 17, 9, 25, 10, 18, 4, 17, 33, 19, 20, 29,
434 18, 11, 4, 28, 2, 10, 3, 3,
435 //coeff_sign_flag
436 5, 10, 53, 43, 25, 46,
437 },
438 {
439 //alf_ctb_flag
440 33, 52, 46, 25, 61, 54, 25, 61, 54,
441 //alf_use_aps_flag
442 46,
443 //alf_ctb_cc_cb_idc
444 25, 35, 38,
445 //alf_ctb_cc_cr_idc
446 25, 28, 38,
447 //alf_ctb_filter_alt_idx
448 11, 26,
449 //sao_merge_left_flag and sao_merge_up_flag
450 2,
451 //sao_type_idx_luma and sao_type_idx_chroma
452 2,
453 //split_cu_flag
454 18, 27, 15, 18, 28, 45, 26, 7, 23,
455 //split_qt_flag
456 26, 36, 38, 18, 34, 21,
457 //mtt_split_cu_vertical_flag
458 43, 42, 37, 42, 44,
459 //mtt_split_cu_binary_flag
460 28, 29, 28, 29,
461 //non_inter_flag
462 25, 20,
463 //cu_skip_flag
464 57, 60, 46,
465 //pred_mode_ibc_flag
466 0, 43, 45,
467 //pred_mode_flag
468 40, 35,
469 //pred_mode_plt_flag
470 17,
471 //cu_act_enabled_flag
472 46,
473 //intra_bdpcm_luma_flag
474 19,
475 //intra_bdpcm_luma_dir_flag
476 21,
477 //intra_mip_flag
478 56, 57, 50, 26,
479 //intra_luma_ref_idx
480 25, 59,
481 //intra_subpartitions_mode_flag
482 33,
483 //intra_subpartitions_split_flag
484 43,
485 //intra_luma_mpm_flag
486 44,
487 //intra_luma_not_planar_flag
488 13, 6,
489 //intra_bdpcm_chroma_flag
490 0,
491 //intra_bdpcm_chroma_dir_flag
492 28,
493 //cclm_mode_flag
494 26,
495 //cclm_mode_idx
496 27,
497 //intra_chroma_pred_mode
498 25,
499 //general_merge_flag
500 6,
501 //inter_pred_idc
502 14, 13, 5, 4, 3, 40,
503 //inter_affine_flag
504 19, 13, 6,
505 //cu_affine_type_flag
506 35,
507 //sym_mvd_flag
508 28,
509 //ref_idx_l0 and ref_idx_l1
510 5, 35,
511 //mvp_l0_flag and mvp_l1_flag
512 34,
513 //amvr_flag
514 59, 50,
515 //amvr_precision_idx
516 38, 26, 60,
517 //bcw_idx
518 5,
519 //cu_coded_flag
520 12,
521 //cu_sbt_flag
522 41, 57,
523 //cu_sbt_quad_flag
524 42,
525 //cu_sbt_horizontal_flag
526 35, 51, 27,
527 //cu_sbt_pos_flag
528 28,
529 //lfnst_idx
530 52, 37, 27,
531 //mts_idx
532 45, 25, 27, 0,
533 //copy_above_palette_indices_flag
534 50,
535 //palette_transpose_flag
536 35,
537 //run_copy_flag
538 58, 45, 45, 30, 38, 45, 38, 46,
539 //regular_merge_flag
540 46, 15,
541 //mmvd_merge_flag
542 25,
543 //mmvd_cand_flag
544 43,
545 //mmvd_distance_idx
546 59,
547 //ciip_flag
548 57,
549 //merge_subblock_flag
550 25, 58, 45,
551 //merge_subblock_idx
552 4,
553 //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
554 18,
555 //abs_mvd_greater0_flag
556 51,
557 //abs_mvd_greater1_flag
558 36,
559 //tu_y_coded_flag
560 15, 6, 5, 14,
561 //tu_cb_coded_flag
562 25, 37,
563 //tu_cr_coded_flag
564 9, 36, 45,
565 //cu_qp_delta_abs
566 CNU, CNU,
567 //cu_chroma_qp_offset_flag
568 CNU,
569 //cu_chroma_qp_offset_idx
570 CNU,
571 //transform_skip_flag
572 25, 17,
573 //tu_joint_cbcr_residual_flag
574 42, 43, 52,
575 //last_sig_coeff_x_prefix
576 6, 6, 12, 14, 6, 4, 14, 7, 6, 4, 29, 7, 6, 6, 12, 28,
577 7, 13, 13, 35, 19, 5, 4,
578 //last_sig_coeff_y_prefix
579 5, 5, 20, 13, 13, 19, 21, 6, 12, 12, 14, 14, 5, 4, 12, 13,
580 7, 13, 12, 41, 11, 5, 27,
581 //sb_coded_flag
582 25, 45, 25, 14, 18, 35, 45,
583 //sig_coeff_flag
584 17, 41, 49, 36, 1, 49, 50, 37, 48, 51, 58, 45, 26, 45, 53, 46,
585 49, 54, 61, 39, 35, 39, 39, 39, 19, 54, 39, 39, 50, 39, 39, 39,
586 0, 39, 39, 39, 9, 49, 50, 36, 48, 59, 59, 38, 34, 45, 38, 31,
587 58, 39, 39, 39, 34, 38, 54, 39, 41, 39, 39, 39, 25, 50, 37,
588 //par_level_flag
589 33, 40, 25, 41, 26, 42, 25, 33, 26, 34, 27, 25, 41, 42, 42, 35,
590 33, 27, 35, 42, 43, 33, 25, 26, 34, 19, 27, 33, 42, 43, 35, 43,
591 11,
592 //abs_level_gtx_flag
593 0, 0, 33, 34, 35, 21, 25, 34, 35, 28, 29, 40, 42, 43, 29, 30,
594 49, 36, 37, 45, 38, 0, 40, 34, 43, 36, 37, 57, 52, 45, 38, 46,
595 25, 0, 0, 17, 25, 26, 0, 9, 25, 33, 19, 0, 25, 33, 26, 20,
596 25, 33, 27, 35, 22, 25, 1, 25, 33, 26, 12, 25, 33, 27, 28, 37,
597 19, 11, 4, 6, 3, 4, 4, 5,
598 //coeff_sign_flag
599 35, 25, 46, 28, 33, 38,
600 },
601 //shiftIdx
602 {
603 //alf_ctb_flag
604 0, 0, 0, 4, 0, 0, 1, 0, 0,
605 //alf_use_aps_flag
606 0,
607 //alf_ctb_cc_cb_idc
608 4, 1, 4,
609 //alf_ctb_cc_cr_idc
610 4, 1, 4,
611 //alf_ctb_filter_alt_idx
612 0, 0,
613 //sao_merge_left_flag and sao_merge_up_flag
614 0,
615 //sao_type_idx_luma and sao_type_idx_chroma
616 4,
617 //split_cu_flag
618 12, 13, 8, 8, 13, 12, 5, 9, 9,
619 //split_qt_flag
620 0, 8, 8, 12, 12, 8,
621 //mtt_split_cu_vertical_flag
622 9, 8, 9, 8, 5,
623 //mtt_split_cu_binary_flag
624 12, 13, 12, 13,
625 //non_inter_flag
626 1, 0,
627 //cu_skip_flag
628 5, 4, 8,
629 //pred_mode_ibc_flag
630 1, 5, 8,
631 //pred_mode_flag
632 5, 1,
633 //pred_mode_plt_flag
634 1,
635 //cu_act_enabled_flag
636 1,
637 //intra_bdpcm_luma_flag
638 1,
639 //intra_bdpcm_luma_dir_flag
640 4,
641 //intra_mip_flag
642 9, 10, 9, 6,
643 //intra_luma_ref_idx
644 5, 8,
645 //intra_subpartitions_mode_flag
646 9,
647 //intra_subpartitions_split_flag
648 2,
649 //intra_luma_mpm_flag
650 6,
651 //intra_luma_not_planar_flag
652 1, 5,
653 //intra_bdpcm_chroma_flag
654 1,
655 //intra_bdpcm_chroma_dir_flag
656 0,
657 //cclm_mode_flag
658 4,
659 //cclm_mode_idx
660 9,
661 //intra_chroma_pred_mode
662 5,
663 //general_merge_flag
664 4,
665 //inter_pred_idc
666 0, 0, 1, 4, 4, 0,
667 //inter_affine_flag
668 4, 0, 0,
669 //cu_affine_type_flag
670 4,
671 //sym_mvd_flag
672 5,
673 //ref_idx_l0 and ref_idx_l1
674 0, 4,
675 //mvp_l0_flag and mvp_l1_flag
676 12,
677 //amvr_flag
678 0, 0,
679 //amvr_precision_idx
680 4, 5, 0,
681 //bcw_idx
682 1,
683 //cu_coded_flag
684 4,
685 //cu_sbt_flag
686 1, 5,
687 //cu_sbt_quad_flag
688 10,
689 //cu_sbt_horizontal_flag
690 8, 4, 1,
691 //cu_sbt_pos_flag
692 13,
693 //lfnst_idx
694 9, 9, 10,
695 //mts_idx
696 8, 0, 9, 0,
697 //copy_above_palette_indices_flag
698 9,
699 //palette_transpose_flag
700 5,
701 //run_copy_flag
702 9, 6, 9, 10, 5, 0, 9, 5,
703 //regular_merge_flag
704 5, 5,
705 //mmvd_merge_flag
706 4,
707 //mmvd_cand_flag
708 10,
709 //mmvd_distance_idx
710 0,
711 //ciip_flag
712 1,
713 //merge_subblock_flag
714 4, 4, 4,
715 //merge_subblock_idx
716 0,
717 //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
718 4,
719 //abs_mvd_greater0_flag
720 9,
721 //abs_mvd_greater1_flag
722 5,
723 //tu_y_coded_flag
724 5, 1, 8, 9,
725 //tu_cb_coded_flag
726 5, 0,
727 //tu_cr_coded_flag
728 2, 1, 0,
729 //cu_qp_delta_abs
730 8, 8,
731 //cu_chroma_qp_offset_flag
732 8,
733 //cu_chroma_qp_offset_idx
734 8,
735 //transform_skip_flag
736 1, 1,
737 //tu_joint_cbcr_residual_flag
738 1, 1, 0,
739 //last_sig_coeff_x_prefix
740 8, 5, 4, 5, 4, 4, 5, 4, 1, 0, 4, 1, 0, 0, 0, 0,
741 1, 0, 0, 0, 5, 4, 4,
742 //last_sig_coeff_y_prefix
743 8, 5, 8, 5, 5, 4, 5, 5, 4, 0, 5, 4, 1, 0, 0, 1,
744 4, 0, 0, 0, 6, 5, 5,
745 //sb_coded_flag
746 8, 5, 5, 8, 5, 8, 8,
747 //sig_coeff_flag
748 12, 9, 9, 10, 9, 9, 9, 10, 8, 8, 8, 10, 9, 13, 8, 8,
749 8, 8, 8, 5, 8, 0, 0, 0, 8, 8, 8, 8, 8, 0, 4, 4,
750 0, 0, 0, 0, 12, 12, 9, 13, 4, 5, 8, 9, 8, 12, 12, 8,
751 4, 0, 0, 0, 8, 8, 8, 8, 4, 0, 0, 0, 13, 13, 8,
752 //par_level_flag
753 8, 9, 12, 13, 13, 13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13,
754 10, 13, 13, 13, 13, 8, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13,
755 6,
756 //abs_level_gtx_flag
757 9, 5, 10, 13, 13, 10, 9, 10, 13, 13, 13, 9, 10, 10, 10, 13,
758 8, 9, 10, 10, 13, 8, 8, 9, 12, 12, 10, 5, 9, 9, 9, 13,
759 1, 5, 9, 9, 9, 6, 5, 9, 10, 10, 9, 9, 9, 9, 9, 9,
760 6, 8, 9, 9, 10, 1, 5, 8, 8, 9, 6, 6, 9, 8, 8, 9,
761 4, 2, 1, 6, 1, 1, 1, 1,
762 //coeff_sign_flag
763 1, 4, 4, 5, 8, 8,
764 }
765 };
766
767 #define MAX_SUB_BLOCKS 16
768 #define MAX_SUB_BLOCK_SIZE 4
769 #define MAX_TB_SIZE 64
770
771 typedef struct ResidualCoding {
772 //common for ts and non ts
773 TransformBlock *tb;
774
775 int log2_sb_w;
776 int log2_sb_h;
777 int last_sub_block;
778 int hist_value;
779 int update_hist;
780 int num_sb_coeff;
781 int rem_bins_pass1;
782
783 int width_in_sbs;
784 int height_in_sbs;
785 int nb_sbs;
786
787 const uint8_t *sb_scan_x_off;
788 const uint8_t *sb_scan_y_off;
789 const uint8_t *scan_x_off;
790 const uint8_t *scan_y_off;
791
792 uint8_t sb_coded_flag[MAX_SUB_BLOCKS * MAX_SUB_BLOCKS];
793 int sig_coeff_flag[MAX_TB_SIZE * MAX_TB_SIZE];
794 int abs_level_pass1[MAX_TB_SIZE * MAX_TB_SIZE]; ///< AbsLevelPass1[][]
795 int abs_level[MAX_TB_SIZE * MAX_TB_SIZE];
796
797 //for ts only
798 uint8_t infer_sb_cbf;
799 int coeff_sign_level[MAX_TB_SIZE * MAX_TB_SIZE]; ///< CoeffSignLevel[][]
800
801 //for non ts only
802 int qstate;
803 int last_scan_pos;
804 int last_significant_coeff_x;
805 int last_significant_coeff_y;
806 } ResidualCoding;
807
808 static int cabac_reinit(VVCLocalContext *lc)
809 {
810 return skip_bytes(&lc->ep->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
811 }
812
813 1772 static void cabac_init_state(VVCLocalContext *lc)
814 {
815 1772 const VVCSPS *sps = lc->fc->ps.sps;
816 1772 const H266RawSliceHeader *rsh = lc->sc->sh.r;
817 1772 const int qp = av_clip_uintp2(lc->sc->sh.slice_qp_y, 6);
818 1772 int init_type = 2 - rsh->sh_slice_type;
819
820 av_assert0(VVC_CONTEXTS == SYNTAX_ELEMENT_LAST);
821
822 1772 ff_vvc_ep_init_stat_coeff(lc->ep, sps->bit_depth, sps->r->sps_persistent_rice_adaptation_enabled_flag);
823
824
3/4
✓ Branch 0 taken 483 times.
✓ Branch 1 taken 1289 times.
✓ Branch 2 taken 483 times.
✗ Branch 3 not taken.
1772 if (rsh->sh_cabac_init_flag && !IS_I(rsh))
825 483 init_type ^= 3;
826
827
2/2
✓ Branch 0 taken 669816 times.
✓ Branch 1 taken 1772 times.
671588 for (int i = 0; i < VVC_CONTEXTS; i++) {
828 669816 VVCCabacState *state = &lc->ep->cabac_state[i];
829 669816 const int init_value = init_values[init_type][i];
830 669816 const int shift_idx = init_values[3][i];
831 669816 const int m = (init_value >> 3) - 4;
832 669816 const int n = ((init_value & 7) * 18) + 1;
833 669816 const int pre = av_clip(((m * (qp - 16)) >> 1) + n, 1, 127);
834
835 669816 state->state[0] = pre << 3;
836 669816 state->state[1] = pre << 7;
837 669816 state->shift[0] = (shift_idx >> 2 ) + 2;
838 669816 state->shift[1] = (shift_idx & 3 ) + 3 + state->shift[0];
839 }
840 1772 }
841
842 42891 int ff_vvc_cabac_init(VVCLocalContext *lc,
843 const int ctu_idx, const int rx, const int ry)
844 {
845 42891 int ret = 0;
846 42891 const VVCPPS *pps = lc->fc->ps.pps;
847 42891 const int first_ctb_in_slice = !ctu_idx;
848
4/4
✓ Branch 0 taken 4898 times.
✓ Branch 1 taken 37993 times.
✓ Branch 2 taken 1662 times.
✓ Branch 3 taken 3236 times.
42891 const int first_ctb_in_tile = rx == pps->ctb_to_col_bd[rx] && ry == pps->ctb_to_row_bd[ry];
849
850
4/4
✓ Branch 0 taken 41313 times.
✓ Branch 1 taken 1578 times.
✓ Branch 2 taken 194 times.
✓ Branch 3 taken 41119 times.
42891 if (first_ctb_in_slice|| first_ctb_in_tile) {
851
3/4
✓ Branch 0 taken 1492 times.
✓ Branch 1 taken 280 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1492 times.
1772 if (lc->sc->nb_eps == 1 && !first_ctb_in_slice)
852 ret = cabac_reinit(lc);
853
1/2
✓ Branch 0 taken 1772 times.
✗ Branch 1 not taken.
1772 if (!ret)
854 1772 cabac_init_state(lc);
855 }
856 42891 return ret;
857 }
858
859 //fixme
860 1376498 static void vvc_refill2(CABACContext* c) {
861 int i;
862 unsigned x;
863 #if !HAVE_FAST_CLZ
864 x = c->low ^ (c->low - 1);
865 i = 7 - ff_h264_norm_shift[x >> (CABAC_BITS - 1)];
866 #else
867 1376498 i = ff_ctz(c->low) - CABAC_BITS;
868 #endif
869
870 1376498 x = -CABAC_MASK;
871
872 #if CABAC_BITS == 16
873 1376498 x += (c->bytestream[0] << 9) + (c->bytestream[1] << 1);
874 #else
875 x += c->bytestream[0] << 1;
876 #endif
877
878 1376498 c->low += x << i;
879 #if !UNCHECKED_BITSTREAM_READER
880
2/2
✓ Branch 0 taken 1376395 times.
✓ Branch 1 taken 103 times.
1376498 if (c->bytestream < c->bytestream_end)
881 #endif
882 1376395 c->bytestream += CABAC_BITS / 8;
883 1376498 }
884
885 36965314 static int inline vvc_get_cabac(CABACContext *c, VVCCabacState* base, const int ctx)
886 {
887 36965314 VVCCabacState *s = base + ctx;
888 36965314 const int qRangeIdx = c->range >> 5;
889 36965314 const int pState = s->state[1] + (s->state[0] << 4);
890 36965314 const int valMps = pState >> 14;
891
2/2
✓ Branch 0 taken 14853640 times.
✓ Branch 1 taken 22111674 times.
36965314 const int RangeLPS = (qRangeIdx * ((valMps ? 32767 - pState : pState) >> 9 ) >> 1) + 4;
892 int bit, lps_mask;
893
894 36965314 c->range -= RangeLPS;
895 36965314 lps_mask = ((c->range<<(CABAC_BITS+1)) - c->low)>>31;
896
897 36965314 c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask;
898 36965314 c->range += (RangeLPS - c->range) & lps_mask;
899
900 36965314 bit = valMps ^ (lps_mask & 1);
901
902 36965314 lps_mask = ff_h264_norm_shift[c->range];
903 36965314 c->range <<= lps_mask;
904 36965314 c->low <<= lps_mask;
905
906
2/2
✓ Branch 0 taken 1376498 times.
✓ Branch 1 taken 35588816 times.
36965314 if (!(c->low & CABAC_MASK))
907 1376498 vvc_refill2(c);
908 36965314 s->state[0] = s->state[0] - (s->state[0] >> s->shift[0]) + (1023 * bit >> s->shift[0]);
909 36965314 s->state[1] = s->state[1] - (s->state[1] >> s->shift[1]) + (16383 * bit >> s->shift[1]);
910 36965314 return bit;
911 }
912
913 #define GET_CABAC(ctx) vvc_get_cabac(&lc->ep->cc, lc->ep->cabac_state, ctx)
914
915 //9.3.3.4 Truncated binary (TB) binarization process
916 158201 static int truncated_binary_decode(VVCLocalContext *lc, const int c_max)
917 {
918 158201 const int n = c_max + 1;
919 158201 const int k = av_log2(n);
920 158201 const int u = (1 << (k+1)) - n;
921 158201 int v = 0;
922
2/2
✓ Branch 0 taken 596938 times.
✓ Branch 1 taken 158201 times.
755139 for (int i = 0; i < k; i++)
923 596938 v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
924
2/2
✓ Branch 0 taken 87418 times.
✓ Branch 1 taken 70783 times.
158201 if (v >= u) {
925 87418 v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
926 87418 v -= u;
927 }
928 158201 return v;
929 }
930
931 // 9.3.3.6 Limited k-th order Exp-Golomb binarization process
932 75553 static int limited_kth_order_egk_decode(CABACContext *c, const int k, const int max_pre_ext_len, const int trunc_suffix_len)
933 {
934 75553 int pre_ext_len = 0;
935 int escape_length;
936 75553 int val = 0;
937
3/4
✓ Branch 0 taken 135632 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 60079 times.
✓ Branch 4 taken 75553 times.
135632 while ((pre_ext_len < max_pre_ext_len) && get_cabac_bypass(c))
938 60079 pre_ext_len++;
939
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 75553 times.
75553 if (pre_ext_len == max_pre_ext_len)
940 escape_length = trunc_suffix_len;
941 else
942 75553 escape_length = pre_ext_len + k;
943
2/2
✓ Branch 0 taken 140712 times.
✓ Branch 1 taken 75553 times.
216265 while (escape_length-- > 0) {
944 140712 val = (val << 1) + get_cabac_bypass(c);
945 }
946 75553 val += ((1 << pre_ext_len) - 1) << k;
947 75553 return val;
948 }
949
950 static av_always_inline
951 2811179 void get_left_top(const VVCLocalContext *lc, uint8_t *left, uint8_t *top,
952 const int x0, const int y0, const uint8_t *left_ctx, const uint8_t *top_ctx)
953 {
954 2811179 const VVCFrameContext *fc = lc->fc;
955 2811179 const VVCSPS *sps = fc->ps.sps;
956 2811179 const int min_cb_width = fc->ps.pps->min_cb_width;
957 2811179 const int x0b = av_mod_uintp2(x0, sps->ctb_log2_size_y);
958 2811179 const int y0b = av_mod_uintp2(y0, sps->ctb_log2_size_y);
959 2811179 const int x_cb = x0 >> sps->min_cb_log2_size_y;
960 2811179 const int y_cb = y0 >> sps->min_cb_log2_size_y;
961
962
4/4
✓ Branch 0 taken 486350 times.
✓ Branch 1 taken 2324829 times.
✓ Branch 2 taken 395781 times.
✓ Branch 3 taken 90569 times.
2811179 if (lc->ctb_left_flag || x0b)
963 2720610 *left = SAMPLE_CTB(left_ctx, x_cb - 1, y_cb);
964
4/4
✓ Branch 0 taken 802756 times.
✓ Branch 1 taken 2008423 times.
✓ Branch 2 taken 662288 times.
✓ Branch 3 taken 140468 times.
2811179 if (lc->ctb_up_flag || y0b)
965 2670711 *top = SAMPLE_CTB(top_ctx, x_cb, y_cb - 1);
966 2811179 }
967
968 static av_always_inline
969 680437 uint8_t get_inc(VVCLocalContext *lc, const uint8_t *ctx)
970 {
971 680437 uint8_t left = 0, top = 0;
972 680437 get_left_top(lc, &left, &top, lc->cu->x0, lc->cu->y0, ctx, ctx);
973 680437 return left + top;
974 }
975
976 18868 int ff_vvc_sao_merge_flag_decode(VVCLocalContext *lc)
977 {
978 18868 return GET_CABAC(SAO_MERGE_FLAG);
979 }
980
981 9289 int ff_vvc_sao_type_idx_decode(VVCLocalContext *lc)
982 {
983
2/2
✓ Branch 1 taken 6420 times.
✓ Branch 2 taken 2869 times.
9289 if (!GET_CABAC(SAO_TYPE_IDX))
984 6420 return SAO_NOT_APPLIED;
985
986
2/2
✓ Branch 1 taken 946 times.
✓ Branch 2 taken 1923 times.
2869 if (!get_cabac_bypass(&lc->ep->cc))
987 946 return SAO_BAND;
988 1923 return SAO_EDGE;
989 }
990
991 1031 int ff_vvc_sao_band_position_decode(VVCLocalContext *lc)
992 {
993 1031 int value = get_cabac_bypass(&lc->ep->cc);
994
995
2/2
✓ Branch 0 taken 4124 times.
✓ Branch 1 taken 1031 times.
5155 for (int i = 0; i < 4; i++)
996 4124 value = (value << 1) | get_cabac_bypass(&lc->ep->cc);
997 1031 return value;
998 }
999
1000 13912 int ff_vvc_sao_offset_abs_decode(VVCLocalContext *lc)
1001 {
1002 13912 int i = 0;
1003 13912 const int length = (1 << (FFMIN(lc->fc->ps.sps->bit_depth, 10) - 5)) - 1;
1004
1005
4/4
✓ Branch 0 taken 40654 times.
✓ Branch 1 taken 118 times.
✓ Branch 3 taken 26860 times.
✓ Branch 4 taken 13794 times.
40772 while (i < length && get_cabac_bypass(&lc->ep->cc))
1006 26860 i++;
1007 13912 return i;
1008 }
1009
1010 1496 int ff_vvc_sao_offset_sign_decode(VVCLocalContext *lc)
1011 {
1012 1496 return get_cabac_bypass(&lc->ep->cc);
1013 }
1014
1015 1923 int ff_vvc_sao_eo_class_decode(VVCLocalContext *lc)
1016 {
1017 1923 int ret = get_cabac_bypass(&lc->ep->cc) << 1;
1018 1923 ret |= get_cabac_bypass(&lc->ep->cc);
1019 1923 return ret;
1020 }
1021
1022 53219 int ff_vvc_alf_ctb_flag(VVCLocalContext *lc, const int rx, const int ry, const int c_idx)
1023 {
1024 53219 int inc = c_idx * 3;
1025 53219 const VVCFrameContext *fc = lc->fc;
1026
2/2
✓ Branch 0 taken 46033 times.
✓ Branch 1 taken 7186 times.
53219 if (lc->ctb_left_flag) {
1027 46033 const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1028 46033 inc += left->ctb_flag[c_idx];
1029 }
1030
2/2
✓ Branch 0 taken 40483 times.
✓ Branch 1 taken 12736 times.
53219 if (lc->ctb_up_flag) {
1031 40483 const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1032 40483 inc += above->ctb_flag[c_idx];
1033 }
1034 53219 return GET_CABAC(ALF_CTB_FLAG + inc);
1035 }
1036
1037 16761 int ff_vvc_alf_use_aps_flag(VVCLocalContext *lc)
1038 {
1039 16761 return GET_CABAC(ALF_USE_APS_FLAG);
1040 }
1041
1042 4402 int ff_vvc_alf_luma_prev_filter_idx(VVCLocalContext *lc)
1043 {
1044 4402 return truncated_binary_decode(lc, lc->sc->sh.r->sh_num_alf_aps_ids_luma - 1);
1045 }
1046
1047 2356 int ff_vvc_alf_luma_fixed_filter_idx(VVCLocalContext *lc)
1048 {
1049 2356 return truncated_binary_decode(lc, 15);
1050 }
1051
1052 13873 int ff_vvc_alf_ctb_filter_alt_idx(VVCLocalContext *lc, const int c_idx, const int num_chroma_filters)
1053 {
1054 13873 int i = 0;
1055 13873 const int length = num_chroma_filters - 1;
1056
1057
4/4
✓ Branch 0 taken 24680 times.
✓ Branch 1 taken 2208 times.
✓ Branch 3 taken 13015 times.
✓ Branch 4 taken 11665 times.
26888 while (i < length && GET_CABAC(ALF_CTB_FILTER_ALT_IDX + c_idx - 1))
1058 13015 i++;
1059 13873 return i;
1060 }
1061
1062 19826 int ff_vvc_alf_ctb_cc_idc(VVCLocalContext *lc, const int rx, const int ry, const int idx, const int cc_filters_signalled)
1063 {
1064
2/2
✓ Branch 0 taken 10841 times.
✓ Branch 1 taken 8985 times.
19826 int inc = !idx ? ALF_CTB_CC_CB_IDC : ALF_CTB_CC_CR_IDC;
1065 19826 int i = 0;
1066 19826 const VVCFrameContext *fc = lc->fc;
1067
2/2
✓ Branch 0 taken 18060 times.
✓ Branch 1 taken 1766 times.
19826 if (lc->ctb_left_flag) {
1068 18060 const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1069 18060 inc += left->ctb_cc_idc[idx] != 0;
1070 }
1071
2/2
✓ Branch 0 taken 16942 times.
✓ Branch 1 taken 2884 times.
19826 if (lc->ctb_up_flag) {
1072 16942 const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1073 16942 inc += above->ctb_cc_idc[idx] != 0;
1074 }
1075
1076
2/2
✓ Branch 1 taken 11474 times.
✓ Branch 2 taken 8352 times.
19826 if (!GET_CABAC(inc))
1077 11474 return 0;
1078 8352 i++;
1079
4/4
✓ Branch 0 taken 14390 times.
✓ Branch 1 taken 1096 times.
✓ Branch 3 taken 7134 times.
✓ Branch 4 taken 7256 times.
15486 while (i < cc_filters_signalled && get_cabac_bypass(&lc->ep->cc))
1080 7134 i++;
1081 8352 return i;
1082 }
1083
1084 1509458 int ff_vvc_split_cu_flag(VVCLocalContext *lc, const int x0, const int y0,
1085 const int cb_width, const int cb_height, const int is_chroma, const VVCAllowedSplit *a)
1086 {
1087 1509458 const VVCFrameContext *fc = lc->fc;
1088 1509458 const VVCPPS *pps = fc->ps.pps;
1089
4/4
✓ Branch 0 taken 1505609 times.
✓ Branch 1 taken 3849 times.
✓ Branch 2 taken 1461148 times.
✓ Branch 3 taken 44461 times.
1509458 const int is_inside = (x0 + cb_width <= pps->width) && (y0 + cb_height <= pps->height);
1090
1091
12/12
✓ Branch 0 taken 546697 times.
✓ Branch 1 taken 962761 times.
✓ Branch 2 taken 391341 times.
✓ Branch 3 taken 155356 times.
✓ Branch 4 taken 387392 times.
✓ Branch 5 taken 3949 times.
✓ Branch 6 taken 387281 times.
✓ Branch 7 taken 111 times.
✓ Branch 8 taken 25993 times.
✓ Branch 9 taken 361288 times.
✓ Branch 10 taken 1099860 times.
✓ Branch 11 taken 48310 times.
1509458 if ((a->btv || a->bth || a->ttv || a->tth || a->qt) && is_inside)
1092 {
1093 1099860 uint8_t inc = 0, left_height = cb_height, top_width = cb_width;
1094
1095 1099860 get_left_top(lc, &left_height, &top_width, x0, y0, fc->tab.cb_height[is_chroma], fc->tab.cb_width[is_chroma]);
1096 1099860 inc += left_height < cb_height;
1097 1099860 inc += top_width < cb_width;
1098 1099860 inc += (a->btv + a->bth + a->ttv + a->tth + 2 * a->qt - 1) / 2 * 3;
1099
1100 1099860 return GET_CABAC(SPLIT_CU_FLAG + inc);
1101
1102 }
1103 409598 return !is_inside;
1104 }
1105
1106 222711 static int split_qt_flag_decode(VVCLocalContext *lc, const int x0, const int y0, const int ch_type, const int cqt_depth)
1107 {
1108 222711 const VVCFrameContext *fc = lc->fc;
1109 222711 int inc = 0;
1110 222711 uint8_t depth_left = 0, depth_top = 0;
1111
1112 222711 get_left_top(lc, &depth_left, &depth_top, x0, y0, fc->tab.cqt_depth[ch_type], fc->tab.cqt_depth[ch_type]);
1113 222711 inc += depth_left > cqt_depth;
1114 222711 inc += depth_top > cqt_depth;
1115
2/2
✓ Branch 0 taken 162817 times.
✓ Branch 1 taken 59894 times.
222711 inc += (cqt_depth >= 2) * 3;
1116
1117 222711 return GET_CABAC(SPLIT_QT_FLAG + inc);
1118 }
1119
1120 514556 static int mtt_split_cu_vertical_flag_decode(VVCLocalContext *lc, const int x0, const int y0,
1121 const int cb_width, const int cb_height, const int ch_type, const VVCAllowedSplit* a)
1122 {
1123
8/8
✓ Branch 0 taken 43532 times.
✓ Branch 1 taken 471024 times.
✓ Branch 2 taken 11138 times.
✓ Branch 3 taken 32394 times.
✓ Branch 4 taken 78339 times.
✓ Branch 5 taken 403823 times.
✓ Branch 6 taken 10161 times.
✓ Branch 7 taken 68178 times.
514556 if ((a->bth || a->tth) && (a->btv || a->ttv)) {
1124 int inc;
1125 413984 const int v = a->btv + a->ttv;
1126 413984 const int h = a->bth + a->tth;
1127
2/2
✓ Branch 0 taken 61147 times.
✓ Branch 1 taken 352837 times.
413984 if (v > h)
1128 61147 inc = 4;
1129
2/2
✓ Branch 0 taken 64436 times.
✓ Branch 1 taken 288401 times.
352837 else if (v < h)
1130 64436 inc = 3;
1131 else {
1132 288401 const VVCFrameContext *fc = lc->fc;
1133 288401 const VVCSPS *sps = fc->ps.sps;
1134 288401 const int min_cb_width = fc->ps.pps->min_cb_width;
1135 288401 const int x0b = av_mod_uintp2(x0, sps->ctb_log2_size_y);
1136 288401 const int y0b = av_mod_uintp2(y0, sps->ctb_log2_size_y);
1137 288401 const int x_cb = x0 >> sps->min_cb_log2_size_y;
1138 288401 const int y_cb = y0 >> sps->min_cb_log2_size_y;
1139
4/4
✓ Branch 0 taken 83507 times.
✓ Branch 1 taken 204894 times.
✓ Branch 2 taken 68387 times.
✓ Branch 3 taken 15120 times.
288401 const int available_a = lc->ctb_up_flag || y0b;
1140
4/4
✓ Branch 0 taken 49881 times.
✓ Branch 1 taken 238520 times.
✓ Branch 2 taken 39114 times.
✓ Branch 3 taken 10767 times.
288401 const int available_l = lc->ctb_left_flag || x0b;
1141
2/2
✓ Branch 0 taken 273281 times.
✓ Branch 1 taken 15120 times.
288401 const int da = cb_width / (available_a ? SAMPLE_CTB(fc->tab.cb_width[ch_type], x_cb, y_cb - 1) : 1);
1142
2/2
✓ Branch 0 taken 277634 times.
✓ Branch 1 taken 10767 times.
288401 const int dl = cb_height / (available_l ? SAMPLE_CTB(fc->tab.cb_height[ch_type], x_cb - 1, y_cb) : 1);
1143
1144
6/6
✓ Branch 0 taken 209930 times.
✓ Branch 1 taken 78471 times.
✓ Branch 2 taken 195810 times.
✓ Branch 3 taken 14120 times.
✓ Branch 4 taken 9367 times.
✓ Branch 5 taken 186443 times.
288401 if (da == dl || !available_a || !available_l)
1145 101958 inc = 0;
1146
2/2
✓ Branch 0 taken 94428 times.
✓ Branch 1 taken 92015 times.
186443 else if (da < dl)
1147 94428 inc = 1;
1148 else
1149 92015 inc = 2;
1150 }
1151 413984 return GET_CABAC(MTT_SPLIT_CU_VERTICAL_FLAG + inc);
1152 }
1153
4/4
✓ Branch 0 taken 32416 times.
✓ Branch 1 taken 68156 times.
✓ Branch 2 taken 32394 times.
✓ Branch 3 taken 22 times.
100572 return !(a->bth || a->tth);
1154 }
1155
1156 358425 static int mtt_split_cu_binary_flag_decode(VVCLocalContext *lc, const int mtt_split_cu_vertical_flag, const int mtt_depth)
1157 {
1158 358425 const int inc = (2 * mtt_split_cu_vertical_flag) + ((mtt_depth <= 1) ? 1 : 0);
1159 358425 return GET_CABAC(MTT_SPLIT_CU_BINARY_FLAG + inc);
1160 }
1161
1162 594030 VVCSplitMode ff_vvc_split_mode(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height,
1163 const int cqt_depth, const int mtt_depth, const int ch_type, const VVCAllowedSplit *a)
1164 {
1165
8/8
✓ Branch 0 taken 106658 times.
✓ Branch 1 taken 487372 times.
✓ Branch 2 taken 25533 times.
✓ Branch 3 taken 81125 times.
✓ Branch 4 taken 22245 times.
✓ Branch 5 taken 3288 times.
✓ Branch 6 taken 22 times.
✓ Branch 7 taken 22223 times.
594030 const int allow_no_qt = a->btv || a->bth || a->ttv || a->tth;
1166 int split_qt_flag;
1167 int mtt_split_cu_vertical_flag;
1168 int mtt_split_cu_binary_flag;
1169 594030 const VVCSplitMode mtt_split_modes[] = {
1170 SPLIT_TT_HOR, SPLIT_BT_HOR, SPLIT_TT_VER, SPLIT_BT_VER,
1171 };
1172
4/4
✓ Branch 0 taken 571807 times.
✓ Branch 1 taken 22223 times.
✓ Branch 2 taken 222711 times.
✓ Branch 3 taken 349096 times.
594030 if (allow_no_qt && a->qt) {
1173 222711 split_qt_flag = split_qt_flag_decode(lc, x0, y0, ch_type, cqt_depth);
1174 } else {
1175
3/4
✓ Branch 0 taken 349096 times.
✓ Branch 1 taken 22223 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 349096 times.
371319 split_qt_flag = !allow_no_qt || a->qt;
1176 }
1177
2/2
✓ Branch 0 taken 79474 times.
✓ Branch 1 taken 514556 times.
594030 if (split_qt_flag)
1178 79474 return SPLIT_QT;
1179 514556 mtt_split_cu_vertical_flag = mtt_split_cu_vertical_flag_decode(lc, x0, y0, cb_width, cb_height, ch_type, a);
1180
6/6
✓ Branch 0 taken 436197 times.
✓ Branch 1 taken 78359 times.
✓ Branch 2 taken 318892 times.
✓ Branch 3 taken 117305 times.
✓ Branch 4 taken 143859 times.
✓ Branch 5 taken 175033 times.
514556 if ((a->btv && a->ttv && mtt_split_cu_vertical_flag) ||
1181
6/6
✓ Branch 0 taken 322593 times.
✓ Branch 1 taken 16930 times.
✓ Branch 2 taken 205662 times.
✓ Branch 3 taken 116931 times.
✓ Branch 4 taken 183392 times.
✓ Branch 5 taken 22270 times.
339523 (a->bth && a->tth && !mtt_split_cu_vertical_flag)) {
1182 358425 mtt_split_cu_binary_flag = mtt_split_cu_binary_flag_decode(lc, mtt_split_cu_vertical_flag, mtt_depth);
1183 } else {
1184
4/4
✓ Branch 0 taken 51924 times.
✓ Branch 1 taken 104207 times.
✓ Branch 2 taken 672 times.
✓ Branch 3 taken 51252 times.
156131 if (!a->btv && !a->bth)
1185 672 mtt_split_cu_binary_flag = 0;
1186
4/4
✓ Branch 0 taken 128904 times.
✓ Branch 1 taken 26555 times.
✓ Branch 2 taken 108824 times.
✓ Branch 3 taken 20080 times.
155459 else if (!a->ttv && !a->tth)
1187 108824 mtt_split_cu_binary_flag = 1;
1188
4/4
✓ Branch 0 taken 42344 times.
✓ Branch 1 taken 4291 times.
✓ Branch 2 taken 23051 times.
✓ Branch 3 taken 19293 times.
46635 else if (a->bth && a->ttv)
1189 23051 mtt_split_cu_binary_flag = 1 - mtt_split_cu_vertical_flag;
1190 else
1191 23584 mtt_split_cu_binary_flag = mtt_split_cu_vertical_flag;
1192 }
1193 514556 return mtt_split_modes[(mtt_split_cu_vertical_flag << 1) + mtt_split_cu_binary_flag];
1194 }
1195
1196 27439 int ff_vvc_non_inter_flag(VVCLocalContext *lc, const int x0, const int y0, const int ch_type)
1197 {
1198 27439 const VVCFrameContext *fc = lc->fc;
1199 27439 uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1200
1201 27439 get_left_top(lc, &left, &top, x0, y0, fc->tab.cpm[ch_type], fc->tab.cpm[ch_type]);
1202
4/4
✓ Branch 0 taken 20511 times.
✓ Branch 1 taken 6928 times.
✓ Branch 2 taken 2759 times.
✓ Branch 3 taken 17752 times.
27439 inc = left == MODE_INTRA || top == MODE_INTRA;
1203 27439 return GET_CABAC(NON_INTER_FLAG + inc);
1204 }
1205
1206 179156 int ff_vvc_pred_mode_flag(VVCLocalContext *lc, const int is_chroma)
1207 {
1208 179156 const VVCFrameContext *fc = lc->fc;
1209 179156 const CodingUnit *cu = lc->cu;
1210 179156 uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1211
1212 179156 get_left_top(lc, &left, &top, cu->x0, cu->y0, fc->tab.cpm[is_chroma], fc->tab.cpm[is_chroma]);
1213
4/4
✓ Branch 0 taken 141568 times.
✓ Branch 1 taken 37588 times.
✓ Branch 2 taken 14459 times.
✓ Branch 3 taken 127109 times.
179156 inc = left == MODE_INTRA || top == MODE_INTRA;
1214 179156 return GET_CABAC(PRED_MODE_FLAG + inc);
1215 }
1216
1217 int ff_vvc_pred_mode_plt_flag(VVCLocalContext *lc)
1218 {
1219 return GET_CABAC(PRED_MODE_PLT_FLAG);
1220 }
1221
1222 21430 int ff_vvc_intra_bdpcm_luma_flag(VVCLocalContext *lc)
1223 {
1224 21430 return GET_CABAC(INTRA_BDPCM_LUMA_FLAG);
1225 }
1226
1227 34 int ff_vvc_intra_bdpcm_luma_dir_flag(VVCLocalContext *lc)
1228 {
1229 34 return GET_CABAC(INTRA_BDPCM_LUMA_DIR_FLAG);
1230 }
1231
1232 18703 int ff_vvc_intra_bdpcm_chroma_flag(VVCLocalContext *lc)
1233 {
1234 18703 return GET_CABAC(INTRA_BDPCM_CHROMA_FLAG);
1235 }
1236
1237 3 int ff_vvc_intra_bdpcm_chroma_dir_flag(VVCLocalContext *lc)
1238 {
1239 3 return GET_CABAC(INTRA_BDPCM_CHROMA_DIR_FLAG);
1240 }
1241
1242 440269 int ff_vvc_cu_skip_flag(VVCLocalContext *lc, const uint8_t *cu_skip_flag)
1243 {
1244 440269 const int inc = get_inc(lc, cu_skip_flag);
1245 440269 return GET_CABAC(CU_SKIP_FLAG + inc);
1246 }
1247
1248 3032 int ff_vvc_pred_mode_ibc_flag(VVCLocalContext *lc, const int is_chroma)
1249 {
1250 3032 const VVCFrameContext *fc = lc->fc;
1251 3032 const CodingUnit *cu = lc->cu;
1252 3032 uint8_t left_mode = MODE_INTER, top_mode = MODE_INTER;
1253 int inc;
1254
1255 3032 get_left_top(lc, &left_mode, &top_mode, cu->x0, cu->y0, fc->tab.cpm[is_chroma], fc->tab.cpm[is_chroma]);
1256 3032 inc = (left_mode == MODE_IBC) + (top_mode == MODE_IBC);
1257 3032 return GET_CABAC(PRED_MODE_IBC_FLAG + inc);
1258 }
1259
1260 311631 int ff_vvc_intra_mip_flag(VVCLocalContext *lc, const uint8_t *intra_mip_flag)
1261 {
1262 311631 const int w = lc->cu->cb_width;
1263 311631 const int h = lc->cu->cb_height;
1264
4/4
✓ Branch 0 taken 258658 times.
✓ Branch 1 taken 52973 times.
✓ Branch 2 taken 240168 times.
✓ Branch 3 taken 18490 times.
311631 const int inc = (w > h * 2 || h > w * 2) ? 3 : get_inc(lc, intra_mip_flag);
1265 311631 return GET_CABAC(INTRA_MIP_FLAG + inc);
1266 }
1267
1268 74951 int ff_vvc_intra_mip_transposed_flag(VVCLocalContext *lc)
1269 {
1270 74951 return get_cabac_bypass(&lc->ep->cc);
1271 }
1272
1273 74951 int ff_vvc_intra_mip_mode(VVCLocalContext *lc)
1274 {
1275 74951 const int w = lc->cu->cb_width;
1276 74951 const int h = lc->cu->cb_height;
1277
4/4
✓ Branch 0 taken 18395 times.
✓ Branch 1 taken 56556 times.
✓ Branch 2 taken 10538 times.
✓ Branch 3 taken 7857 times.
142045 const int c_max = (w == 4 && h == 4) ? 15 :
1278
8/8
✓ Branch 0 taken 56556 times.
✓ Branch 1 taken 10538 times.
✓ Branch 2 taken 40748 times.
✓ Branch 3 taken 15808 times.
✓ Branch 4 taken 13210 times.
✓ Branch 5 taken 27538 times.
✓ Branch 6 taken 7617 times.
✓ Branch 7 taken 5593 times.
67094 ((w == 4 || h == 4) || (w == 8 && h == 8)) ? 7: 5;
1279 74951 return truncated_binary_decode(lc, c_max);
1280 }
1281
1282 296122 int ff_vvc_intra_luma_ref_idx(VVCLocalContext *lc)
1283 {
1284 int i;
1285
2/2
✓ Branch 0 taken 318440 times.
✓ Branch 1 taken 13937 times.
332377 for (i = 0; i < 2; i++) {
1286
2/2
✓ Branch 1 taken 282185 times.
✓ Branch 2 taken 36255 times.
318440 if (!GET_CABAC(INTRA_LUMA_REF_IDX + i))
1287 282185 return i;
1288 }
1289 13937 return i;
1290 }
1291
1292 266915 int ff_vvc_intra_subpartitions_mode_flag(VVCLocalContext *lc)
1293 {
1294 266915 return GET_CABAC(INTRA_SUBPARTITIONS_MODE_FLAG);
1295 }
1296
1297 328269 enum IspType ff_vvc_isp_split_type(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1298 {
1299
2/2
✓ Branch 0 taken 280328 times.
✓ Branch 1 taken 47941 times.
328269 if (!intra_subpartitions_mode_flag)
1300 280328 return ISP_NO_SPLIT;
1301 47941 return 1 + GET_CABAC(INTRA_SUBPARTITIONS_SPLIT_FLAG);
1302 }
1303
1304 305951 int ff_vvc_intra_luma_mpm_flag(VVCLocalContext *lc)
1305 {
1306 305951 return GET_CABAC(INTRA_LUMA_MPM_FLAG);
1307 }
1308
1309 229459 int ff_vvc_intra_luma_not_planar_flag(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1310 {
1311
2/2
✓ Branch 0 taken 192882 times.
✓ Branch 1 taken 36577 times.
229459 return GET_CABAC(INTRA_LUMA_NOT_PLANAR_FLAG + !intra_subpartitions_mode_flag);
1312 }
1313
1314 127936 int ff_vvc_intra_luma_mpm_idx(VVCLocalContext *lc)
1315 {
1316 int i;
1317
4/4
✓ Branch 0 taken 230306 times.
✓ Branch 1 taken 7857 times.
✓ Branch 3 taken 110227 times.
✓ Branch 4 taken 120079 times.
238163 for (i = 0; i < 4 && get_cabac_bypass(&lc->ep->cc); i++)
1318 /* nothing */;
1319 127936 return i;
1320 }
1321
1322 76492 int ff_vvc_intra_luma_mpm_remainder(VVCLocalContext *lc)
1323 {
1324 76492 return truncated_binary_decode(lc, 60);
1325 }
1326
1327 144600 int ff_vvc_cclm_mode_flag(VVCLocalContext *lc)
1328 {
1329 144600 return GET_CABAC(CCLM_MODE_FLAG);
1330 }
1331
1332 61263 int ff_vvc_cclm_mode_idx(VVCLocalContext *lc)
1333 {
1334
2/2
✓ Branch 1 taken 36677 times.
✓ Branch 2 taken 24586 times.
61263 if (!GET_CABAC(CCLM_MODE_IDX))
1335 36677 return 0;
1336 24586 return get_cabac_bypass(&lc->ep->cc) + 1;
1337 }
1338
1339 94432 int ff_vvc_intra_chroma_pred_mode(VVCLocalContext *lc)
1340 {
1341
2/2
✓ Branch 1 taken 71713 times.
✓ Branch 2 taken 22719 times.
94432 if (!GET_CABAC(INTRA_CHROMA_PRED_MODE))
1342 71713 return 4;
1343 22719 return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1344 }
1345
1346 167173 int ff_vvc_general_merge_flag(VVCLocalContext *lc)
1347 {
1348 167173 return GET_CABAC(GENERAL_MERGE_FLAG);
1349 }
1350
1351 299272 static int get_inter_flag_inc(VVCLocalContext *lc, const int x0, const int y0)
1352 {
1353 299272 uint8_t left_merge = 0, top_merge = 0;
1354 299272 uint8_t left_affine = 0, top_affine = 0;
1355 299272 const VVCFrameContext *fc = lc->fc;
1356
1357 299272 get_left_top(lc, &left_merge, &top_merge, x0, y0, fc->tab.msf, fc->tab.msf);
1358 299272 get_left_top(lc, &left_affine, &top_affine, x0, y0, fc->tab.iaf, fc->tab.iaf);
1359
4/4
✓ Branch 0 taken 259511 times.
✓ Branch 1 taken 39761 times.
✓ Branch 2 taken 9232 times.
✓ Branch 3 taken 250279 times.
299272 return (left_merge || left_affine) + (top_merge + top_affine);
1360 }
1361
1362 273947 int ff_vvc_merge_subblock_flag(VVCLocalContext *lc)
1363 {
1364 273947 const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1365 273947 return GET_CABAC(MERGE_SUBBLOCK_FLAG + inc);
1366 }
1367
1368 48394 int ff_vvc_merge_subblock_idx(VVCLocalContext *lc, const int max_num_subblock_merge_cand)
1369 {
1370 int i;
1371
2/2
✓ Branch 1 taken 29559 times.
✓ Branch 2 taken 18835 times.
48394 if (!GET_CABAC(MERGE_SUBBLOCK_IDX))
1372 29559 return 0;
1373
4/4
✓ Branch 0 taken 32219 times.
✓ Branch 1 taken 1759 times.
✓ Branch 3 taken 15143 times.
✓ Branch 4 taken 17076 times.
33978 for (i = 1; i < max_num_subblock_merge_cand - 1 && get_cabac_bypass(&lc->ep->cc); i++)
1374 /* nothing */;
1375 18835 return i;
1376 }
1377
1378 213807 int ff_vvc_regular_merge_flag(VVCLocalContext *lc, const int cu_skip_flag)
1379 {
1380 213807 int inc = !cu_skip_flag;
1381 213807 return GET_CABAC(REGULAR_MERGE_FLAG + inc);
1382 }
1383
1384 248548 int ff_vvc_mmvd_merge_flag(VVCLocalContext *lc)
1385 {
1386 248548 return GET_CABAC(MMVD_MERGE_FLAG);
1387 }
1388
1389 53777 int ff_vvc_mmvd_cand_flag(VVCLocalContext *lc)
1390 {
1391 53777 return GET_CABAC(MMVD_CAND_FLAG);
1392 }
1393
1394 53777 static int mmvd_distance_idx_decode(VVCLocalContext *lc)
1395 {
1396 int i;
1397
2/2
✓ Branch 1 taken 14297 times.
✓ Branch 2 taken 39480 times.
53777 if (!GET_CABAC(MMVD_DISTANCE_IDX))
1398 14297 return 0;
1399
4/4
✓ Branch 0 taken 74409 times.
✓ Branch 1 taken 5 times.
✓ Branch 3 taken 34934 times.
✓ Branch 4 taken 39475 times.
74414 for (i = 1; i < 7 && get_cabac_bypass(&lc->ep->cc); i++)
1400 /* nothing */;
1401 39480 return i;
1402 }
1403
1404 53777 static int mmvd_direction_idx_decode(VVCLocalContext *lc)
1405 {
1406 53777 return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1407 }
1408
1409 53777 void ff_vvc_mmvd_offset_coding(VVCLocalContext *lc, Mv *mmvd_offset, const int ph_mmvd_fullpel_only_flag)
1410 {
1411
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 53777 times.
53777 const int shift = ph_mmvd_fullpel_only_flag ? 4 : 2;
1412 53777 const int mmvd_distance = 1 << (mmvd_distance_idx_decode(lc) + shift);
1413 53777 const int mmvd_direction_idx = mmvd_direction_idx_decode(lc);
1414 53777 const int mmvd_signs[][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
1415 53777 mmvd_offset->x = mmvd_distance * mmvd_signs[mmvd_direction_idx][0];
1416 53777 mmvd_offset->y = mmvd_distance * mmvd_signs[mmvd_direction_idx][1];
1417 53777 }
1418
1419 210178 static PredMode get_luma_pred_mode(VVCLocalContext *lc)
1420 {
1421 210178 const VVCFrameContext *fc = lc->fc;
1422 210178 const CodingUnit *cu = lc->cu;
1423 PredMode pred_mode;
1424
1425
1/2
✓ Branch 0 taken 210178 times.
✗ Branch 1 not taken.
210178 if (cu->tree_type != DUAL_TREE_CHROMA) {
1426 210178 pred_mode = cu->pred_mode;
1427 } else {
1428 const int x_cb = cu->x0 >> fc->ps.sps->min_cb_log2_size_y;
1429 const int y_cb = cu->y0 >> fc->ps.sps->min_cb_log2_size_y;
1430 const int min_cb_width = fc->ps.pps->min_cb_width;
1431 pred_mode = SAMPLE_CTB(fc->tab.cpm[0], x_cb, y_cb);
1432 }
1433 210178 return pred_mode;
1434 }
1435
1436 210178 int ff_vvc_merge_idx(VVCLocalContext *lc)
1437 {
1438 210178 const VVCSPS *sps = lc->fc->ps.sps;
1439 210178 const int is_ibc = get_luma_pred_mode(lc) == MODE_IBC;
1440
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 210178 times.
210178 const int c_max = (is_ibc ? sps->max_num_ibc_merge_cand : sps->max_num_merge_cand) - 1;
1441 int i;
1442
1443
2/2
✓ Branch 1 taken 123762 times.
✓ Branch 2 taken 86416 times.
210178 if (!GET_CABAC(MERGE_IDX))
1444 123762 return 0;
1445
1446
4/4
✓ Branch 0 taken 167055 times.
✓ Branch 1 taken 8809 times.
✓ Branch 3 taken 89448 times.
✓ Branch 4 taken 77607 times.
175864 for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1447 /* nothing */;
1448 86416 return i;
1449 }
1450
1451 24398 int ff_vvc_merge_gpm_partition_idx(VVCLocalContext *lc)
1452 {
1453 24398 int i = 0;
1454
1455
2/2
✓ Branch 0 taken 146388 times.
✓ Branch 1 taken 24398 times.
170786 for (int j = 0; j < 6; j++)
1456 146388 i = (i << 1) | get_cabac_bypass(&lc->ep->cc);
1457
1458 24398 return i;
1459 }
1460
1461 48796 int ff_vvc_merge_gpm_idx(VVCLocalContext *lc, const int idx)
1462 {
1463 48796 const int c_max = lc->fc->ps.sps->max_num_gpm_merge_cand - idx - 1;
1464 int i;
1465
1466
2/2
✓ Branch 1 taken 27438 times.
✓ Branch 2 taken 21358 times.
48796 if (!GET_CABAC(MERGE_IDX))
1467 27438 return 0;
1468
1469
4/4
✓ Branch 0 taken 36950 times.
✓ Branch 1 taken 3535 times.
✓ Branch 3 taken 19127 times.
✓ Branch 4 taken 17823 times.
40485 for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1470 /* nothing */;
1471
1472 21358 return i;
1473 }
1474
1475 18493 int ff_vvc_ciip_flag(VVCLocalContext *lc)
1476 {
1477 18493 return GET_CABAC(CIIP_FLAG);
1478 }
1479
1480 57321 PredFlag ff_vvc_pred_flag(VVCLocalContext *lc, const int is_b)
1481 {
1482 57321 const int w = lc->cu->cb_width;
1483 57321 const int h = lc->cu->cb_height;
1484
2/2
✓ Branch 0 taken 1938 times.
✓ Branch 1 taken 55383 times.
57321 if (!is_b)
1485 1938 return PF_L0;
1486
2/2
✓ Branch 0 taken 49811 times.
✓ Branch 1 taken 5572 times.
55383 if (w + h > 12) {
1487 49811 const int log2 = av_log2(w) + av_log2(h);
1488 49811 const int inc = 7 - ((1 + log2)>>1);
1489
2/2
✓ Branch 1 taken 17018 times.
✓ Branch 2 taken 32793 times.
49811 if (GET_CABAC(INTER_PRED_IDC + inc))
1490 17018 return PF_BI;
1491 }
1492 38365 return PF_L0 + GET_CABAC(INTER_PRED_IDC + 5);
1493 }
1494
1495 25325 int ff_vvc_inter_affine_flag(VVCLocalContext *lc)
1496 {
1497 25325 const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1498 25325 return GET_CABAC(INTER_AFFINE_FLAG + inc);
1499 }
1500
1501 9001 int ff_vvc_cu_affine_type_flag(VVCLocalContext *lc)
1502 {
1503 9001 return GET_CABAC(CU_AFFINE_TYPE_FLAG);
1504 }
1505
1506 11430 int ff_vvc_sym_mvd_flag(VVCLocalContext *lc)
1507 {
1508 11430 return GET_CABAC(SYM_MVD_FLAG);
1509 }
1510
1511 46681 int ff_vvc_ref_idx_lx(VVCLocalContext *lc, const uint8_t nb_refs)
1512 {
1513 46681 const int c_max = nb_refs - 1;
1514 46681 const int max_ctx = FFMIN(c_max, 2);
1515 46681 int i = 0;
1516
1517
4/4
✓ Branch 0 taken 47528 times.
✓ Branch 1 taken 10568 times.
✓ Branch 3 taken 11415 times.
✓ Branch 4 taken 36113 times.
58096 while (i < max_ctx && GET_CABAC(REF_IDX_LX + i))
1518 11415 i++;
1519
2/2
✓ Branch 0 taken 572 times.
✓ Branch 1 taken 46109 times.
46681 if (i == 2) {
1520
4/4
✓ Branch 0 taken 529 times.
✓ Branch 1 taken 395 times.
✓ Branch 3 taken 352 times.
✓ Branch 4 taken 177 times.
924 while (i < c_max && get_cabac_bypass(&lc->ep->cc))
1521 352 i++;
1522 }
1523 46681 return i;
1524 }
1525
1526 161126 int ff_vvc_abs_mvd_greater0_flag(VVCLocalContext *lc)
1527 {
1528 161126 return GET_CABAC(ABS_MVD_GREATER0_FLAG);
1529 }
1530
1531 112328 int ff_vvc_abs_mvd_greater1_flag(VVCLocalContext *lc)
1532 {
1533 112328 return GET_CABAC(ABS_MVD_GREATER1_FLAG);
1534 }
1535
1536 65730 int ff_vvc_abs_mvd_minus2(VVCLocalContext *lc)
1537 {
1538 65730 return limited_kth_order_egk_decode(&lc->ep->cc, 1, 15, 17);
1539 }
1540
1541 112328 int ff_vvc_mvd_sign_flag(VVCLocalContext *lc)
1542 {
1543 112328 return get_cabac_bypass(&lc->ep->cc);
1544 }
1545
1546 74339 int ff_vvc_mvp_lx_flag(VVCLocalContext *lc)
1547 {
1548 74339 return GET_CABAC(MVP_LX_FLAG);
1549 }
1550
1551 51941 static int amvr_flag(VVCLocalContext *lc, const int inter_affine_flag)
1552 {
1553 51941 return GET_CABAC(AMVR_FLAG + inter_affine_flag);
1554 }
1555
1556 32275 static int amvr_precision_idx(VVCLocalContext *lc, const int inc, const int c_max)
1557 {
1558 32275 int i = 0;
1559
2/2
✓ Branch 1 taken 7223 times.
✓ Branch 2 taken 25052 times.
32275 if (!GET_CABAC(AMVR_PRECISION_IDX + inc))
1560 7223 return 0;
1561 25052 i++;
1562
4/4
✓ Branch 0 taken 21499 times.
✓ Branch 1 taken 3553 times.
✓ Branch 3 taken 3498 times.
✓ Branch 4 taken 18001 times.
25052 if (i < c_max && GET_CABAC(AMVR_PRECISION_IDX + 1))
1563 3498 i++;
1564 25052 return i;
1565 }
1566
1567 58399 int ff_vvc_amvr_shift(VVCLocalContext *lc, const int inter_affine_flag,
1568 const PredMode pred_mode, const int has_amvr_flag)
1569 {
1570 58399 int amvr_shift = 2;
1571
2/2
✓ Branch 0 taken 53019 times.
✓ Branch 1 taken 5380 times.
58399 if (has_amvr_flag) {
1572
4/4
✓ Branch 0 taken 51941 times.
✓ Branch 1 taken 1078 times.
✓ Branch 3 taken 31197 times.
✓ Branch 4 taken 20744 times.
53019 if (pred_mode == MODE_IBC || amvr_flag(lc, inter_affine_flag)) {
1573 int idx;
1574
2/2
✓ Branch 0 taken 3666 times.
✓ Branch 1 taken 28609 times.
32275 if (inter_affine_flag) {
1575 3666 idx = amvr_precision_idx(lc, 2, 1);
1576 3666 amvr_shift = idx * 4;
1577
2/2
✓ Branch 0 taken 1078 times.
✓ Branch 1 taken 27531 times.
28609 } else if (pred_mode == MODE_IBC) {
1578 1078 idx = amvr_precision_idx(lc, 1, 1);
1579 1078 amvr_shift = 4 + idx * 2;
1580 } else {
1581 static const int shifts[] = {3, 4, 6};
1582 27531 idx = amvr_precision_idx(lc, 0, 2);
1583 27531 amvr_shift = shifts[idx];
1584 }
1585 }
1586 }
1587 58399 return amvr_shift;
1588 }
1589
1590 11024 int ff_vvc_bcw_idx(VVCLocalContext *lc, const int no_backward_pred_flag)
1591 {
1592
2/2
✓ Branch 0 taken 2320 times.
✓ Branch 1 taken 8704 times.
11024 const int c_max = no_backward_pred_flag ? 4 : 2;
1593 11024 int i = 1;
1594
2/2
✓ Branch 1 taken 6460 times.
✓ Branch 2 taken 4564 times.
11024 if (!GET_CABAC(BCW_IDX))
1595 6460 return 0;
1596
4/4
✓ Branch 0 taken 5364 times.
✓ Branch 1 taken 1785 times.
✓ Branch 3 taken 2585 times.
✓ Branch 4 taken 2779 times.
7149 while (i < c_max && get_cabac_bypass(&lc->ep->cc))
1597 2585 i++;
1598 4564 return i;
1599 }
1600
1601 288411 int ff_vvc_tu_cb_coded_flag(VVCLocalContext *lc)
1602 {
1603 288411 return GET_CABAC(TU_CB_CODED_FLAG + lc->cu->bdpcm_flag[1]);
1604 }
1605
1606 288411 int ff_vvc_tu_cr_coded_flag(VVCLocalContext *lc, int tu_cb_coded_flag)
1607 {
1608
2/2
✓ Branch 0 taken 288408 times.
✓ Branch 1 taken 3 times.
288411 return GET_CABAC(TU_CR_CODED_FLAG + (lc->cu->bdpcm_flag[1] ? 2 : tu_cb_coded_flag));
1609 }
1610
1611 544724 int ff_vvc_tu_y_coded_flag(VVCLocalContext *lc)
1612 {
1613 544724 const CodingUnit *cu = lc->cu;
1614 int inc;
1615
2/2
✓ Branch 0 taken 34 times.
✓ Branch 1 taken 544690 times.
544724 if (cu->bdpcm_flag[0])
1616 34 inc = 1;
1617
2/2
✓ Branch 0 taken 395674 times.
✓ Branch 1 taken 149016 times.
544690 else if (cu->isp_split_type == ISP_NO_SPLIT)
1618 395674 inc = 0;
1619 else
1620 149016 inc = 2 + lc->parse.prev_tu_cbf_y;
1621 544724 lc->parse.prev_tu_cbf_y = GET_CABAC(TU_Y_CODED_FLAG + inc);
1622 544724 return lc->parse.prev_tu_cbf_y;
1623 }
1624
1625 376 int ff_vvc_cu_qp_delta_abs(VVCLocalContext *lc)
1626 {
1627 int v, i, k;
1628
1/2
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
376 if (!GET_CABAC(CU_QP_DELTA_ABS))
1629 376 return 0;
1630
1631 // prefixVal
1632 for (v = 1; v < 5 && GET_CABAC(CU_QP_DELTA_ABS + 1); v++)
1633 /* nothing */;
1634 if (v < 5)
1635 return v;
1636
1637 // 9.3.3.5 k-th order Exp-Golomb binarization process
1638 // suffixVal
1639
1640 // CuQpDeltaVal shall in the range of −( 32 + QpBdOffset / 2 ) to +( 31 + QpBdOffset / 2 )
1641 // so k = 6 should enough
1642 for (k = 0; k < 6 && get_cabac_bypass(&lc->ep->cc); k++)
1643 /* nothing */;
1644 i = (1 << k) - 1;
1645 v = 0;
1646 while (k--)
1647 v = (v << 1) + get_cabac_bypass(&lc->ep->cc);
1648 v += i;
1649
1650 return v + 5;
1651 }
1652
1653 int ff_vvc_cu_qp_delta_sign_flag(VVCLocalContext *lc)
1654 {
1655 return get_cabac_bypass(&lc->ep->cc);
1656 }
1657
1658 int ff_vvc_cu_chroma_qp_offset_flag(VVCLocalContext *lc)
1659 {
1660 return GET_CABAC(CU_CHROMA_QP_OFFSET_FLAG);
1661 }
1662
1663 int ff_vvc_cu_chroma_qp_offset_idx(VVCLocalContext *lc)
1664 {
1665 const int c_max = lc->fc->ps.pps->r->pps_chroma_qp_offset_list_len_minus1;
1666 int i;
1667 for (i = 0; i < c_max && GET_CABAC(CU_CHROMA_QP_OFFSET_IDX); i++)
1668 /* nothing */;
1669 return i;
1670 }
1671
1672 1299872 static av_always_inline int last_significant_coeff_xy_prefix(VVCLocalContext *lc,
1673 const int log2_tb_size, const int log2_zo_tb_size, const int c_idx, const int ctx)
1674 {
1675 1299872 int i = 0;
1676 1299872 int max = (log2_zo_tb_size << 1) - 1;
1677 int ctx_offset, ctx_shift;
1678
2/2
✓ Branch 0 taken 12420 times.
✓ Branch 1 taken 1287452 times.
1299872 if (!log2_tb_size)
1679 12420 return 0;
1680
2/2
✓ Branch 0 taken 987388 times.
✓ Branch 1 taken 300064 times.
1287452 if (!c_idx) {
1681 987388 const int offset_y[] = {0, 0, 3, 6, 10, 15};
1682 987388 ctx_offset = offset_y[log2_tb_size - 1];
1683 987388 ctx_shift = (log2_tb_size + 1) >> 2;
1684 } else {
1685 300064 const int shifts[] = {0, 0, 0, 1, 2, 2, 2};
1686 300064 ctx_offset = 20;
1687 300064 ctx_shift = shifts[log2_tb_size];
1688 }
1689
4/4
✓ Branch 0 taken 3398422 times.
✓ Branch 1 taken 188597 times.
✓ Branch 3 taken 2299567 times.
✓ Branch 4 taken 1098855 times.
3587019 while (i < max && GET_CABAC(ctx + (i >> ctx_shift) + ctx_offset))
1690 2299567 i++;
1691 1287452 return i;
1692 }
1693
1694 649936 static av_always_inline int last_significant_coeff_x_prefix_decode(VVCLocalContext *lc,
1695 const int log2_tb_width, const int log2_zo_tb_width, const int c_idx)
1696 {
1697 649936 return last_significant_coeff_xy_prefix(lc, log2_tb_width, log2_zo_tb_width, c_idx, LAST_SIG_COEFF_X_PREFIX);
1698 }
1699
1700 649936 static av_always_inline int last_significant_coeff_y_prefix_decode(VVCLocalContext *lc,
1701 const int log2_tb_height, const int log2_zo_tb_height, const int c_idx)
1702 {
1703 649936 return last_significant_coeff_xy_prefix(lc, log2_tb_height, log2_zo_tb_height, c_idx, LAST_SIG_COEFF_Y_PREFIX);
1704 }
1705
1706 253232 static av_always_inline int last_sig_coeff_suffix_decode(VVCLocalContext *lc,
1707 const int last_significant_coeff_y_prefix)
1708 {
1709 253232 const int length = (last_significant_coeff_y_prefix >> 1) - 1;
1710 253232 int value = get_cabac_bypass(&lc->ep->cc);
1711
1712
2/2
✓ Branch 0 taken 100555 times.
✓ Branch 1 taken 253232 times.
353787 for (int i = 1; i < length; i++)
1713 100555 value = (value << 1) | get_cabac_bypass(&lc->ep->cc);
1714 253232 return value;
1715 }
1716
1717 85479 int ff_vvc_tu_joint_cbcr_residual_flag(VVCLocalContext *lc, const int tu_cb_coded_flag, const int tu_cr_coded_flag)
1718 {
1719 85479 return GET_CABAC(TU_JOINT_CBCR_RESIDUAL_FLAG + 2 * tu_cb_coded_flag + tu_cr_coded_flag - 1);
1720 }
1721
1722 505442 int ff_vvc_transform_skip_flag(VVCLocalContext *lc, const int inc)
1723 {
1724 505442 return GET_CABAC(TRANSFORM_SKIP_FLAG + inc);
1725 }
1726
1727 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1728 26499979 static int get_local_sum(const int *level, const int w, const int h,
1729 const int xc, const int yc, const int hist_value)
1730 {
1731 26499979 int loc_sum = 3 * hist_value;
1732 26499979 level += w * yc + xc;
1733
2/2
✓ Branch 0 taken 25486916 times.
✓ Branch 1 taken 1013063 times.
26499979 if (xc < w - 1) {
1734 25486916 loc_sum += level[1];
1735
2/2
✓ Branch 0 taken 24039698 times.
✓ Branch 1 taken 1447218 times.
25486916 if (xc < w - 2)
1736 24039698 loc_sum += level[2] - hist_value;
1737
2/2
✓ Branch 0 taken 23580130 times.
✓ Branch 1 taken 1906786 times.
25486916 if (yc < h - 1)
1738 23580130 loc_sum += level[w + 1] - hist_value;
1739 }
1740
2/2
✓ Branch 0 taken 24593103 times.
✓ Branch 1 taken 1906876 times.
26499979 if (yc < h - 1) {
1741 24593103 loc_sum += level[w];
1742
2/2
✓ Branch 0 taken 22362599 times.
✓ Branch 1 taken 2230504 times.
24593103 if (yc < h - 2)
1743 22362599 loc_sum += level[w << 1] - hist_value;
1744 }
1745 26499979 return loc_sum;
1746 }
1747
1748 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1749 722777 static int get_local_sum_ts(const int *level, const int w, const int h, const int xc, const int yc)
1750 {
1751 722777 int loc_sum = 0;
1752 722777 level += w * yc + xc;
1753
2/2
✓ Branch 0 taken 632973 times.
✓ Branch 1 taken 89804 times.
722777 if (xc > 0)
1754 632973 loc_sum += level[-1];
1755
2/2
✓ Branch 0 taken 634160 times.
✓ Branch 1 taken 88617 times.
722777 if (yc > 0)
1756 634160 loc_sum += level[-w];
1757 722777 return loc_sum;
1758 }
1759
1760 7535238 static int get_gtx_flag_inc(const ResidualCoding* rc, const int xc, const int yc, const int last)
1761 {
1762 7535238 const TransformBlock *tb = rc->tb;
1763 int inc;
1764
2/2
✓ Branch 0 taken 649936 times.
✓ Branch 1 taken 6885302 times.
7535238 if (last) {
1765 649936 const int incs[] = {0, 21, 21};
1766 649936 inc = incs[tb->c_idx];
1767 } else {
1768 6885302 const int d = xc + yc;
1769 6885302 const int local_sum_sig = get_local_sum(rc->sig_coeff_flag,
1770 6885302 tb->tb_width,tb->tb_height, xc, yc, rc->hist_value);
1771 6885302 const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1772 6885302 tb->tb_width, tb->tb_height, xc, yc, rc->hist_value);
1773 6885302 const int offset = FFMIN(loc_sum_abs_pass1 - local_sum_sig, 4);
1774
1775
2/2
✓ Branch 0 taken 4997616 times.
✓ Branch 1 taken 1887686 times.
6885302 if (!tb->c_idx)
1776
6/6
✓ Branch 0 taken 4654098 times.
✓ Branch 1 taken 343518 times.
✓ Branch 2 taken 3595805 times.
✓ Branch 3 taken 1058293 times.
✓ Branch 4 taken 2315520 times.
✓ Branch 5 taken 1280285 times.
4997616 inc = 1 + offset + (!d ? 15 : (d < 3 ? 10 : (d < 10 ? 5 : 0)));
1777 else
1778
2/2
✓ Branch 0 taken 93007 times.
✓ Branch 1 taken 1794679 times.
1887686 inc = 22 + offset + (!d ? 5 : 0);
1779 }
1780 7535238 return inc;
1781 }
1782
1783 8781192 static int abs_level_gtx_flag_decode(VVCLocalContext *lc, const int inc)
1784 {
1785 8781192 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1786 }
1787
1788 1245954 static int par_level_flag_decode(VVCLocalContext *lc, const int inc)
1789 {
1790 1245954 return GET_CABAC(PAR_LEVEL_FLAG + inc);
1791 }
1792
1793 67919 static int par_level_flag_ts_decode(VVCLocalContext *lc)
1794 {
1795 67919 const int inc = 32;
1796 67919 return GET_CABAC(PAR_LEVEL_FLAG + inc);
1797 }
1798
1799 704259 static int sb_coded_flag_decode(VVCLocalContext *lc, const uint8_t *sb_coded_flag,
1800 const ResidualCoding *rc, const int xs, const int ys)
1801 {
1802 704259 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1803 704259 const TransformBlock *tb = rc->tb;
1804 704259 const int w = rc->width_in_sbs;
1805 704259 const int h = rc->height_in_sbs;
1806 int inc;
1807
1808
3/4
✓ Branch 0 taken 111347 times.
✓ Branch 1 taken 592912 times.
✓ Branch 2 taken 111347 times.
✗ Branch 3 not taken.
704259 if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1809
2/2
✓ Branch 0 taken 67700 times.
✓ Branch 1 taken 43647 times.
111347 const int left = xs > 0 ? sb_coded_flag[-1] : 0;
1810
2/2
✓ Branch 0 taken 68319 times.
✓ Branch 1 taken 43028 times.
111347 const int above = ys > 0 ? sb_coded_flag[-w] : 0;
1811 111347 inc = left + above + 4;
1812 } else {
1813
2/2
✓ Branch 0 taken 510532 times.
✓ Branch 1 taken 82380 times.
592912 const int right = (xs < w - 1) ? sb_coded_flag[1] : 0;
1814
2/2
✓ Branch 0 taken 436270 times.
✓ Branch 1 taken 156642 times.
592912 const int bottom = (ys < h - 1) ? sb_coded_flag[w] : 0;
1815
2/2
✓ Branch 0 taken 239107 times.
✓ Branch 1 taken 353805 times.
592912 inc = (right | bottom) + (tb->c_idx ? 2 : 0);
1816 }
1817 704259 return GET_CABAC(SB_CODED_FLAG + inc);
1818 }
1819
1820 13065391 static int sig_coeff_flag_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1821 {
1822 13065391 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1823 13065391 const TransformBlock *tb = rc->tb;
1824 int inc;
1825
1826
3/4
✓ Branch 0 taken 722777 times.
✓ Branch 1 taken 12342614 times.
✓ Branch 2 taken 722777 times.
✗ Branch 3 not taken.
13065391 if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1827 722777 const int local_num_sig = get_local_sum_ts(rc->sig_coeff_flag, tb->tb_width, tb->tb_height, xc, yc);
1828 722777 inc = 60 + local_num_sig;
1829 } else {
1830 12342614 const int d = xc + yc;
1831 12342614 const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1832 12342614 tb->tb_width, tb->tb_height, xc, yc, 0);
1833
1834
2/2
✓ Branch 0 taken 8723165 times.
✓ Branch 1 taken 3619449 times.
12342614 if (!tb->c_idx) {
1835
4/4
✓ Branch 0 taken 7658833 times.
✓ Branch 1 taken 1064332 times.
✓ Branch 2 taken 2356280 times.
✓ Branch 3 taken 5302553 times.
8723165 inc = 12 * FFMAX(0, rc->qstate - 1) + FFMIN((loc_sum_abs_pass1 + 1) >> 1, 3) + ((d < 2) ? 8 : (d < 5 ? 4 : 0));
1836 } else {
1837
2/2
✓ Branch 0 taken 304866 times.
✓ Branch 1 taken 3314583 times.
3619449 inc = 36 + 8 * FFMAX(0, rc->qstate - 1) + FFMIN((loc_sum_abs_pass1 + 1) >> 1, 3) + (d < 2 ? 4 : 0);
1838 }
1839 }
1840 13065391 return GET_CABAC(SIG_COEFF_FLAG + inc);
1841 }
1842
1843 386761 static int abs_get_rice_param(VVCLocalContext *lc, const ResidualCoding* rc,
1844 const int xc, const int yc, const int base_level)
1845 {
1846 386761 const VVCSPS *sps = lc->fc->ps.sps;
1847 386761 const TransformBlock* tb = rc->tb;
1848 386761 const int rice_params[] = {
1849 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2,
1850 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
1851 };
1852 int loc_sum_abs;
1853 int shift_val;
1854
1855 386761 loc_sum_abs = get_local_sum(rc->abs_level, tb->tb_width, tb->tb_height, xc,
1856 386761 yc, rc->hist_value);
1857
1858
1/2
✓ Branch 0 taken 386761 times.
✗ Branch 1 not taken.
386761 if (!sps->r->sps_rrc_rice_extension_flag) {
1859 386761 shift_val = 0;
1860 } else {
1861 shift_val = (av_log2(FFMAX(FFMIN(loc_sum_abs, 2048), 8)) - 3) & ~1;
1862 }
1863
1864 386761 loc_sum_abs = av_clip_uintp2((loc_sum_abs >> shift_val) - base_level * 5, 5);
1865
1866 386761 return rice_params[loc_sum_abs] + shift_val;
1867 }
1868
1869 422564 static int abs_decode(VVCLocalContext *lc, const int c_rice_param)
1870 {
1871 422564 const VVCSPS *sps = lc->fc->ps.sps;
1872 422564 const int MAX_BIN = 6;
1873 422564 int prefix = 0;
1874 422564 int suffix = 0;
1875
1876
4/4
✓ Branch 0 taken 816863 times.
✓ Branch 1 taken 9823 times.
✓ Branch 3 taken 404122 times.
✓ Branch 4 taken 412741 times.
826686 while (prefix < MAX_BIN && get_cabac_bypass(&lc->ep->cc))
1877 404122 prefix++;
1878
2/2
✓ Branch 0 taken 412741 times.
✓ Branch 1 taken 9823 times.
422564 if (prefix < MAX_BIN) {
1879
2/2
✓ Branch 0 taken 209372 times.
✓ Branch 1 taken 412741 times.
622113 for (int i = 0; i < c_rice_param; i++) {
1880 209372 suffix = (suffix << 1) | get_cabac_bypass(&lc->ep->cc);
1881 }
1882 } else {
1883 9823 suffix = limited_kth_order_egk_decode(&lc->ep->cc,
1884 c_rice_param + 1,
1885 9823 26 - sps->log2_transform_range,
1886 9823 sps->log2_transform_range);
1887 }
1888 422564 return suffix + (prefix << c_rice_param);
1889 }
1890
1891 220632 static int abs_remainder_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1892 {
1893 220632 const VVCSPS *sps = lc->fc->ps.sps;
1894 220632 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1895 220632 const int base_level[][2][2] = {
1896 { {4, 4}, {4, 4} },
1897 { {3, 2}, {2, 1} }
1898 };
1899 220632 const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc,
1900 220632 base_level[sps->r->sps_rrc_rice_extension_flag][sps->bit_depth > 12][IS_I(rsh)]);
1901 220632 const int rem = abs_decode(lc, c_rice_param);
1902
1903 220632 return rem;
1904 }
1905
1906 35803 static int abs_remainder_ts_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1907 {
1908 35803 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1909 35803 const int c_rice_param = rsh->sh_ts_residual_coding_rice_idx_minus1 + 1;
1910 35803 const int rem = abs_decode(lc, c_rice_param);
1911
1912 35803 return rem;
1913 }
1914
1915 7694482 static int coeff_sign_flag_decode(VVCLocalContext *lc)
1916 {
1917 7694482 return get_cabac_bypass(&lc->ep->cc);
1918 }
1919
1920 //9.3.4.2.10 Derivation process of ctxInc for the syntax element coeff_sign_flag for transform skip mode
1921 181051 static int coeff_sign_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
1922 {
1923 181051 const TransformBlock *tb = rc->tb;
1924 181051 const int w = tb->tb_width;
1925 181051 const int *level = rc->coeff_sign_level + yc * w + xc;
1926
2/2
✓ Branch 0 taken 161730 times.
✓ Branch 1 taken 19321 times.
181051 const int left_sign = xc ? level[-1] : 0;
1927
2/2
✓ Branch 0 taken 161740 times.
✓ Branch 1 taken 19311 times.
181051 const int above_sign = yc ? level[-w] : 0;
1928 181051 const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
1929 int inc;
1930
1931
2/2
✓ Branch 0 taken 67101 times.
✓ Branch 1 taken 113950 times.
181051 if (left_sign == -above_sign)
1932
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 67084 times.
67101 inc = bdpcm_flag ? 3 : 0;
1933
4/4
✓ Branch 0 taken 71632 times.
✓ Branch 1 taken 42318 times.
✓ Branch 2 taken 50024 times.
✓ Branch 3 taken 21608 times.
113950 else if (left_sign >= 0 && above_sign >= 0)
1934
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 50021 times.
50024 inc = bdpcm_flag ? 4 : 1;
1935 else
1936
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 63915 times.
63926 inc = bdpcm_flag ? 5 : 2;
1937 181051 return GET_CABAC(COEFF_SIGN_FLAG + inc);
1938 }
1939
1940 181051 static int abs_level_gt1_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
1941 {
1942 181051 const TransformBlock *tb = rc->tb;
1943 181051 const int *sig_coeff_flag = rc->sig_coeff_flag + yc * tb->tb_width + xc;
1944 int inc;
1945
1946
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 181020 times.
181051 if (cu->bdpcm_flag[tb->c_idx]) {
1947 31 inc = 67;
1948 } else {
1949
2/2
✓ Branch 0 taken 161701 times.
✓ Branch 1 taken 19319 times.
181020 const int l = xc > 0 ? sig_coeff_flag[-1] : 0;
1950
2/2
✓ Branch 0 taken 161715 times.
✓ Branch 1 taken 19305 times.
181020 const int a = yc > 0 ? sig_coeff_flag[-tb->tb_width] : 0;
1951 181020 inc = 64 + a + l;
1952 }
1953 181051 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1954 }
1955
1956 117687 static int abs_level_gtx_flag_ts_decode(VVCLocalContext *lc, const int j)
1957 {
1958 117687 const int inc = 67 + j;
1959 117687 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1960 }
1961
1962 static const uint8_t qstate_translate_table[][2] = {
1963 { 0, 2 }, { 2, 0 }, { 1, 3 }, { 3, 1 }
1964 };
1965
1966 166129 static int dec_abs_level_decode(VVCLocalContext *lc, const ResidualCoding *rc,
1967 const int xc, const int yc, int *abs_level)
1968 {
1969 166129 const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc, 0);
1970 166129 const int dec_abs_level = abs_decode(lc, c_rice_param);
1971
2/2
✓ Branch 0 taken 83812 times.
✓ Branch 1 taken 82317 times.
166129 const int zero_pos = (rc->qstate < 2 ? 1 : 2) << c_rice_param;
1972
1973 166129 *abs_level = 0;
1974
2/2
✓ Branch 0 taken 150844 times.
✓ Branch 1 taken 15285 times.
166129 if (dec_abs_level != zero_pos) {
1975 150844 *abs_level = dec_abs_level;
1976
2/2
✓ Branch 0 taken 101354 times.
✓ Branch 1 taken 49490 times.
150844 if (dec_abs_level < zero_pos)
1977 101354 *abs_level += 1;
1978 }
1979 166129 return dec_abs_level;
1980 }
1981
1982 386761 static void ep_update_hist(EntryPoint *ep, ResidualCoding *rc,
1983 const int remainder, const int addin)
1984 {
1985 386761 int *stat = ep->stat_coeff + rc->tb->c_idx;
1986
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 386761 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
386761 if (rc->update_hist && remainder > 0) {
1987 *stat = (*stat + av_log2(remainder) + addin) >> 1;
1988 rc->update_hist = 0;
1989 }
1990 386761 }
1991
1992 672930 static void init_residual_coding(const VVCLocalContext *lc, ResidualCoding *rc,
1993 const int log2_zo_tb_width, const int log2_zo_tb_height,
1994 TransformBlock *tb)
1995 {
1996 672930 const VVCSPS *sps = lc->fc->ps.sps;
1997
2/2
✓ Branch 0 taken 59291 times.
✓ Branch 1 taken 613639 times.
672930 int log2_sb_w = (FFMIN(log2_zo_tb_width, log2_zo_tb_height ) < 2 ? 1 : 2 );
1998 672930 int log2_sb_h = log2_sb_w;
1999
2000
2/2
✓ Branch 0 taken 671195 times.
✓ Branch 1 taken 1735 times.
672930 if ( log2_zo_tb_width + log2_zo_tb_height > 3 ) {
2001
2/2
✓ Branch 0 taken 15093 times.
✓ Branch 1 taken 656102 times.
671195 if ( log2_zo_tb_width < 2 ) {
2002 15093 log2_sb_w = log2_zo_tb_width;
2003 15093 log2_sb_h = 4 - log2_sb_w;
2004
2/2
✓ Branch 0 taken 42463 times.
✓ Branch 1 taken 613639 times.
656102 } else if ( log2_zo_tb_height < 2 ) {
2005 42463 log2_sb_h = log2_zo_tb_height;
2006 42463 log2_sb_w = 4 - log2_sb_h;
2007 }
2008 }
2009 672930 rc->log2_sb_w = log2_sb_w;
2010 672930 rc->log2_sb_h = log2_sb_h;
2011 672930 rc->num_sb_coeff = 1 << (log2_sb_w + log2_sb_h);
2012 672930 rc->last_sub_block = ( 1 << ( log2_zo_tb_width + log2_zo_tb_height - (log2_sb_w + log2_sb_h))) - 1;
2013
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 672930 times.
672930 rc->hist_value = sps->r->sps_persistent_rice_adaptation_enabled_flag ? (1 << lc->ep->stat_coeff[tb->c_idx]) : 0;
2014 672930 rc->update_hist = sps->r->sps_persistent_rice_adaptation_enabled_flag ? 1 : 0;
2015 672930 rc->rem_bins_pass1 = (( 1 << ( log2_zo_tb_width + log2_zo_tb_height)) * 7 ) >> 2;
2016
2017
2018 672930 rc->sb_scan_x_off = ff_vvc_diag_scan_x[log2_zo_tb_width - log2_sb_w][log2_zo_tb_height - log2_sb_h];
2019 672930 rc->sb_scan_y_off = ff_vvc_diag_scan_y[log2_zo_tb_width - log2_sb_w][log2_zo_tb_height - log2_sb_h];
2020
2021 672930 rc->scan_x_off = ff_vvc_diag_scan_x[log2_sb_w][log2_sb_h];
2022 672930 rc->scan_y_off = ff_vvc_diag_scan_y[log2_sb_w][log2_sb_h];
2023
2024 672930 rc->infer_sb_cbf = 1;
2025
2026 672930 rc->width_in_sbs = (1 << (log2_zo_tb_width - log2_sb_w));
2027 672930 rc->height_in_sbs = (1 << (log2_zo_tb_height - log2_sb_h));
2028 672930 rc->nb_sbs = rc->width_in_sbs * rc->height_in_sbs;
2029
2030 672930 rc->last_scan_pos = rc->num_sb_coeff;
2031 672930 rc->qstate = 0;
2032
2033 672930 rc->tb = tb;
2034 672930 }
2035
2036 121568 static int residual_ts_coding_subblock(VVCLocalContext *lc, ResidualCoding* rc, const int i)
2037 {
2038 121568 const CodingUnit *cu = lc->cu;
2039 121568 TransformBlock *tb = rc->tb;
2040 121568 const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
2041 121568 const int xs = rc->sb_scan_x_off[i];
2042 121568 const int ys = rc->sb_scan_y_off[i];
2043 121568 uint8_t *sb_coded_flag = rc->sb_coded_flag + ys * rc->width_in_sbs + xs;
2044 121568 int infer_sb_sig_coeff_flag = 1;
2045 121568 int last_scan_pos_pass1 = -1, last_scan_pos_pass2 = -1, n;
2046 int abs_level_gtx_flag[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE];
2047 int abs_level_pass2[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE]; ///< AbsLevelPass2
2048
2049
4/4
✓ Branch 0 taken 22994 times.
✓ Branch 1 taken 98574 times.
✓ Branch 2 taken 12773 times.
✓ Branch 3 taken 10221 times.
121568 if (i != rc->last_sub_block || !rc->infer_sb_cbf)
2050 111347 *sb_coded_flag = sb_coded_flag_decode(lc, sb_coded_flag, rc, xs, ys);
2051 else
2052 10221 *sb_coded_flag = 1;
2053
4/4
✓ Branch 0 taken 46238 times.
✓ Branch 1 taken 75330 times.
✓ Branch 2 taken 30035 times.
✓ Branch 3 taken 16203 times.
121568 if (*sb_coded_flag && i < rc->last_sub_block)
2054 30035 rc->infer_sb_cbf = 0;
2055
2056 //first scan pass
2057
4/4
✓ Branch 0 taken 1930126 times.
✓ Branch 1 taken 118690 times.
✓ Branch 2 taken 1927248 times.
✓ Branch 3 taken 2878 times.
2048816 for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2058 1927248 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2059 1927248 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2060 1927248 const int off = yc * tb->tb_width + xc;
2061 1927248 int *sig_coeff_flag = rc->sig_coeff_flag + off;
2062 1927248 int *abs_level_pass1 = rc->abs_level_pass1 + off;
2063 1927248 int *coeff_sign_level = rc->coeff_sign_level + off;
2064 1927248 int par_level_flag = 0;
2065
2066 1927248 abs_level_gtx_flag[n] = 0;
2067 1927248 last_scan_pos_pass1 = n;
2068
6/6
✓ Branch 0 taken 725328 times.
✓ Branch 1 taken 1201920 times.
✓ Branch 2 taken 43561 times.
✓ Branch 3 taken 681767 times.
✓ Branch 4 taken 41010 times.
✓ Branch 5 taken 2551 times.
1927248 if (*sb_coded_flag && (n != rc->num_sb_coeff - 1 || !infer_sb_sig_coeff_flag)) {
2069 722777 *sig_coeff_flag = sig_coeff_flag_decode(lc, rc, xc, yc);
2070 722777 rc->rem_bins_pass1--;
2071
2/2
✓ Branch 0 taken 178500 times.
✓ Branch 1 taken 544277 times.
722777 if (*sig_coeff_flag)
2072 178500 infer_sb_sig_coeff_flag = 0;
2073 } else {
2074
5/6
✓ Branch 0 taken 77680 times.
✓ Branch 1 taken 1126791 times.
✓ Branch 2 taken 77680 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2551 times.
✓ Branch 5 taken 75129 times.
1204471 *sig_coeff_flag = (n == rc->num_sb_coeff - 1) && infer_sb_sig_coeff_flag && *sb_coded_flag;
2075 }
2076 1927248 *coeff_sign_level = 0;
2077
2/2
✓ Branch 0 taken 181051 times.
✓ Branch 1 taken 1746197 times.
1927248 if (*sig_coeff_flag) {
2078 181051 *coeff_sign_level = 1 - 2 * coeff_sign_flag_ts_decode(lc, cu, rc, xc, yc);
2079 181051 abs_level_gtx_flag[n] = abs_level_gt1_flag_ts_decode(lc, cu, rc, xc, yc);
2080 181051 rc->rem_bins_pass1 -= 2;
2081
2/2
✓ Branch 0 taken 67919 times.
✓ Branch 1 taken 113132 times.
181051 if (abs_level_gtx_flag[n]) {
2082 67919 par_level_flag = par_level_flag_ts_decode(lc);
2083 67919 rc->rem_bins_pass1--;
2084 }
2085 }
2086 1927248 *abs_level_pass1 = *sig_coeff_flag + par_level_flag + abs_level_gtx_flag[n];
2087 }
2088
2089 //greater than x scan pass
2090
4/4
✓ Branch 0 taken 1888014 times.
✓ Branch 1 taken 117340 times.
✓ Branch 2 taken 1883786 times.
✓ Branch 3 taken 4228 times.
2005354 for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2091 1883786 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2092 1883786 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2093 1883786 const int off = yc * tb->tb_width + xc;
2094
2095 1883786 abs_level_pass2[n] = rc->abs_level_pass1[off];
2096
4/4
✓ Branch 0 taken 1987263 times.
✓ Branch 1 taken 14210 times.
✓ Branch 2 taken 117687 times.
✓ Branch 3 taken 1869576 times.
2001473 for (int j = 1; j < 5 && abs_level_gtx_flag[n]; j++) {
2097 117687 abs_level_gtx_flag[n] = abs_level_gtx_flag_ts_decode(lc, j);
2098 117687 abs_level_pass2[n] += abs_level_gtx_flag[n] << 1;
2099 117687 rc->rem_bins_pass1--;
2100 }
2101 1883786 last_scan_pos_pass2 = n;
2102 }
2103
2104 /* remainder scan pass */
2105
2/2
✓ Branch 0 taken 1944800 times.
✓ Branch 1 taken 121568 times.
2066368 for (n = 0; n < rc->num_sb_coeff; n++) {
2106 1944800 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2107 1944800 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2108 1944800 const int off = yc * tb->tb_width + xc;
2109 1944800 const int *abs_level_pass1 = rc->abs_level_pass1 + off;
2110 1944800 int *abs_level = rc->abs_level + off;
2111 1944800 int *coeff_sign_level = rc->coeff_sign_level + off;
2112 1944800 int abs_remainder = 0;
2113
2114
6/6
✓ Branch 0 taken 1883786 times.
✓ Branch 1 taken 61014 times.
✓ Branch 2 taken 1871524 times.
✓ Branch 3 taken 12262 times.
✓ Branch 4 taken 61014 times.
✓ Branch 5 taken 1871524 times.
1944800 if ((n <= last_scan_pos_pass2 && abs_level_pass2[n] >= 10) ||
2115
2/2
✓ Branch 0 taken 43462 times.
✓ Branch 1 taken 17552 times.
61014 (n > last_scan_pos_pass2 && n <= last_scan_pos_pass1 &&
2116
4/4
✓ Branch 0 taken 34257 times.
✓ Branch 1 taken 9205 times.
✓ Branch 2 taken 17552 times.
✓ Branch 3 taken 1905781 times.
1932538 *abs_level_pass1 >= 2) ||
2117
2/2
✓ Branch 0 taken 14336 times.
✓ Branch 1 taken 3216 times.
17552 (n > last_scan_pos_pass1 && *sb_coded_flag))
2118 35803 abs_remainder = abs_remainder_ts_decode(lc, rc, xc, yc);
2119
2/2
✓ Branch 0 taken 1883786 times.
✓ Branch 1 taken 61014 times.
1944800 if (n <= last_scan_pos_pass2) {
2120 1883786 *abs_level = abs_level_pass2[n] + 2 * abs_remainder;
2121
2/2
✓ Branch 0 taken 43462 times.
✓ Branch 1 taken 17552 times.
61014 } else if (n <= last_scan_pos_pass1) {
2122 43462 *abs_level = *abs_level_pass1 + 2 * abs_remainder;
2123 } else {
2124 17552 *abs_level = abs_remainder;
2125
2/2
✓ Branch 0 taken 8400 times.
✓ Branch 1 taken 9152 times.
17552 if (abs_remainder) {
2126 //n > lastScanPosPass1
2127 8400 *coeff_sign_level = 1 - 2 * coeff_sign_flag_decode(lc);
2128 }
2129 }
2130
4/4
✓ Branch 0 taken 1944496 times.
✓ Branch 1 taken 304 times.
✓ Branch 2 taken 1926944 times.
✓ Branch 3 taken 17552 times.
1944800 if (!bdpcm_flag && n <= last_scan_pos_pass1) {
2131
2/2
✓ Branch 0 taken 1726298 times.
✓ Branch 1 taken 200646 times.
1926944 const int left = xc > 0 ? abs_level[-1] : 0;
2132
2/2
✓ Branch 0 taken 1728977 times.
✓ Branch 1 taken 197967 times.
1926944 const int above = yc > 0 ? abs_level[-tb->tb_width] : 0;
2133 1926944 const int pred = FFMAX(left, above);
2134
2135
4/4
✓ Branch 0 taken 113109 times.
✓ Branch 1 taken 1813835 times.
✓ Branch 2 taken 66211 times.
✓ Branch 3 taken 46898 times.
1926944 if (*abs_level == 1 && pred > 0)
2136 66211 *abs_level = pred;
2137
4/4
✓ Branch 0 taken 114809 times.
✓ Branch 1 taken 1745924 times.
✓ Branch 2 taken 28043 times.
✓ Branch 3 taken 86766 times.
1860733 else if (*abs_level > 0 && *abs_level <= pred)
2138 28043 (*abs_level)--;
2139 }
2140
2/2
✓ Branch 0 taken 189451 times.
✓ Branch 1 taken 1755349 times.
1944800 if (*abs_level) {
2141 189451 tb->coeffs[off] = *coeff_sign_level * *abs_level;
2142 189451 tb->max_scan_x = FFMAX(xc, tb->max_scan_x);
2143 189451 tb->max_scan_y = FFMAX(yc, tb->max_scan_y);
2144 189451 tb->min_scan_x = FFMIN(xc, tb->min_scan_x);
2145 189451 tb->min_scan_y = FFMIN(yc, tb->min_scan_y);
2146 } else {
2147 1755349 tb->coeffs[off] = 0;
2148 }
2149 }
2150
2151 121568 return 0;
2152 }
2153
2154 22994 static int hls_residual_ts_coding(VVCLocalContext *lc, TransformBlock *tb)
2155 {
2156 ResidualCoding rc;
2157 22994 tb->min_scan_x = tb->min_scan_y = INT_MAX;
2158 22994 init_residual_coding(lc, &rc, tb->log2_tb_width, tb->log2_tb_height, tb);
2159
2/2
✓ Branch 0 taken 121568 times.
✓ Branch 1 taken 22994 times.
144562 for (int i = 0; i <= rc.last_sub_block; i++) {
2160 121568 int ret = residual_ts_coding_subblock(lc, &rc, i);
2161
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 121568 times.
121568 if (ret < 0)
2162 return ret;
2163 }
2164
2165 22994 return 0;
2166 }
2167
2168 1435725 static inline int residual_coding_subblock(VVCLocalContext *lc, ResidualCoding *rc, const int i)
2169 {
2170 1435725 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2171 1435725 TransformBlock *tb = rc->tb;
2172 int first_sig_scan_pos_sb, last_sig_scan_pos_sb;
2173 int first_pos_mode0, first_pos_mode1;
2174 1435725 int infer_sb_dc_sig_coeff_flag = 0;
2175 1435725 int n, sig_hidden_flag, sum = 0;
2176 int abs_level_gt2_flag[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE];
2177 1435725 const int start_qstate_sb = rc->qstate;
2178 1435725 const int xs = rc->sb_scan_x_off[i];
2179 1435725 const int ys = rc->sb_scan_y_off[i];
2180 1435725 uint8_t *sb_coded_flag = rc->sb_coded_flag + ys * rc->width_in_sbs + xs;
2181
2182
2183
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1435725 times.
1435725 av_assert0(rc->num_sb_coeff <= MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE);
2184
4/4
✓ Branch 0 taken 785789 times.
✓ Branch 1 taken 649936 times.
✓ Branch 2 taken 592912 times.
✓ Branch 3 taken 192877 times.
1435725 if (i < rc->last_sub_block && i > 0) {
2185 592912 *sb_coded_flag = sb_coded_flag_decode(lc, sb_coded_flag, rc, xs, ys);
2186 592912 infer_sb_dc_sig_coeff_flag = 1;
2187 } else {
2188 842813 *sb_coded_flag = 1;
2189 }
2190
8/8
✓ Branch 0 taken 1231344 times.
✓ Branch 1 taken 204381 times.
✓ Branch 2 taken 1179983 times.
✓ Branch 3 taken 51361 times.
✓ Branch 4 taken 28369 times.
✓ Branch 5 taken 1151614 times.
✓ Branch 6 taken 37865 times.
✓ Branch 7 taken 41865 times.
1435725 if (*sb_coded_flag && (xs > 3 || ys > 3) && !tb->c_idx)
2191 37865 lc->parse.mts_zero_out_sig_coeff_flag = 0;
2192
2193
2/2
✓ Branch 0 taken 204381 times.
✓ Branch 1 taken 1231344 times.
1435725 if (!*sb_coded_flag)
2194 204381 return 0;
2195
2196 1231344 first_sig_scan_pos_sb = rc->num_sb_coeff;
2197 1231344 last_sig_scan_pos_sb = -1;
2198
2/2
✓ Branch 0 taken 649936 times.
✓ Branch 1 taken 581408 times.
1231344 first_pos_mode0 = (i == rc->last_sub_block ? rc->last_scan_pos : rc->num_sb_coeff -1);
2199 1231344 first_pos_mode1 = first_pos_mode0;
2200
4/4
✓ Branch 0 taken 13031939 times.
✓ Branch 1 taken 1198071 times.
✓ Branch 2 taken 12998666 times.
✓ Branch 3 taken 33273 times.
14230010 for (n = first_pos_mode0; n >= 0 && rc->rem_bins_pass1 >= 4; n--) {
2201 12998666 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2202 12998666 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2203
4/4
✓ Branch 0 taken 1942953 times.
✓ Branch 1 taken 11055713 times.
✓ Branch 2 taken 649936 times.
✓ Branch 3 taken 1293017 times.
12998666 const int last = (xc == rc->last_significant_coeff_x && yc == rc->last_significant_coeff_y);
2204 12998666 int *abs_level_pass1 = rc->abs_level_pass1 + yc * tb->tb_width + xc;
2205 12998666 int *sig_coeff_flag = rc->sig_coeff_flag + yc * tb->tb_width + xc;
2206
2207
6/6
✓ Branch 0 taken 1198071 times.
✓ Branch 1 taken 11800595 times.
✓ Branch 2 taken 1191955 times.
✓ Branch 3 taken 6116 times.
✓ Branch 4 taken 12342614 times.
✓ Branch 5 taken 649936 times.
12998666 if ((n > 0 || !infer_sb_dc_sig_coeff_flag ) && !last) {
2208 12342614 *sig_coeff_flag = sig_coeff_flag_decode(lc, rc, xc, yc);
2209 12342614 rc->rem_bins_pass1--;
2210
2/2
✓ Branch 0 taken 6879186 times.
✓ Branch 1 taken 5463428 times.
12342614 if (*sig_coeff_flag)
2211 6879186 infer_sb_dc_sig_coeff_flag = 0;
2212 } else {
2213
5/8
✓ Branch 0 taken 6116 times.
✓ Branch 1 taken 649936 times.
✓ Branch 2 taken 6116 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6116 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6116 times.
✗ Branch 7 not taken.
656052 *sig_coeff_flag = last || (!rc->scan_x_off[n] && !rc ->scan_y_off[n] &&
2214 infer_sb_dc_sig_coeff_flag);
2215 }
2216 12998666 *abs_level_pass1 = 0;
2217
2/2
✓ Branch 0 taken 7535238 times.
✓ Branch 1 taken 5463428 times.
12998666 if (*sig_coeff_flag) {
2218 7535238 int abs_level_gt1_flag, par_level_flag = 0;
2219 7535238 const int inc = get_gtx_flag_inc(rc, xc, yc, last);
2220 7535238 abs_level_gt1_flag = abs_level_gtx_flag_decode(lc, inc);
2221 7535238 rc->rem_bins_pass1--;
2222
2/2
✓ Branch 0 taken 1245954 times.
✓ Branch 1 taken 6289284 times.
7535238 if (abs_level_gt1_flag) {
2223 1245954 par_level_flag = par_level_flag_decode(lc, inc);
2224 1245954 abs_level_gt2_flag[n] = abs_level_gtx_flag_decode(lc, inc + 32);
2225 1245954 rc->rem_bins_pass1 -= 2;
2226 } else {
2227 6289284 abs_level_gt2_flag[n] = 0;
2228 }
2229
2/2
✓ Branch 0 taken 1223717 times.
✓ Branch 1 taken 6311521 times.
7535238 if (last_sig_scan_pos_sb == -1)
2230 1223717 last_sig_scan_pos_sb = n;
2231 7535238 first_sig_scan_pos_sb = n;
2232
2233 7535238 *abs_level_pass1 =
2234 7535238 1 + par_level_flag + abs_level_gt1_flag + (abs_level_gt2_flag[n] << 1);
2235 } else {
2236 5463428 abs_level_gt2_flag[n] = 0;
2237 }
2238
2239
1/2
✓ Branch 0 taken 12998666 times.
✗ Branch 1 not taken.
12998666 if (rsh->sh_dep_quant_used_flag)
2240 12998666 rc->qstate = qstate_translate_table[rc->qstate][*abs_level_pass1 & 1];
2241
2242 12998666 first_pos_mode1 = n - 1;
2243 }
2244
2/2
✓ Branch 0 taken 12998666 times.
✓ Branch 1 taken 1231344 times.
14230010 for (n = first_pos_mode0; n > first_pos_mode1; n--) {
2245 12998666 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2246 12998666 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2247 12998666 const int *abs_level_pass1 = rc->abs_level_pass1 + yc * tb->tb_width + xc;
2248 12998666 int *abs_level = rc->abs_level + yc * tb->tb_width + xc;
2249
2250 12998666 *abs_level = *abs_level_pass1;
2251
2/2
✓ Branch 0 taken 220632 times.
✓ Branch 1 taken 12778034 times.
12998666 if (abs_level_gt2_flag[n]) {
2252 220632 const int abs_remainder = abs_remainder_decode(lc, rc, xc, yc);
2253 220632 ep_update_hist(lc->ep, rc, abs_remainder, 2);
2254 220632 *abs_level += 2 * abs_remainder;
2255 }
2256 }
2257
2/2
✓ Branch 0 taken 166129 times.
✓ Branch 1 taken 1231344 times.
1397473 for (n = first_pos_mode1; n >= 0; n--) {
2258 166129 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2259 166129 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2260 166129 int *abs_level = rc->abs_level + yc * tb->tb_width + xc;
2261
2262
1/2
✓ Branch 0 taken 166129 times.
✗ Branch 1 not taken.
166129 if (*sb_coded_flag) {
2263 166129 const int dec_abs_level = dec_abs_level_decode(lc, rc, xc, yc, abs_level);
2264 166129 ep_update_hist(lc->ep, rc, dec_abs_level, 0);
2265 }
2266
2/2
✓ Branch 0 taken 150844 times.
✓ Branch 1 taken 15285 times.
166129 if (*abs_level > 0) {
2267
2/2
✓ Branch 0 taken 1951 times.
✓ Branch 1 taken 148893 times.
150844 if (last_sig_scan_pos_sb == -1)
2268 1951 last_sig_scan_pos_sb = n;
2269 150844 first_sig_scan_pos_sb = n;
2270 }
2271
1/2
✓ Branch 0 taken 166129 times.
✗ Branch 1 not taken.
166129 if (rsh->sh_dep_quant_used_flag)
2272 166129 rc->qstate = qstate_translate_table[rc->qstate][*abs_level & 1];
2273 }
2274
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1231344 times.
1231344 sig_hidden_flag = rsh->sh_sign_data_hiding_used_flag &&
2275 (last_sig_scan_pos_sb - first_sig_scan_pos_sb > 3 ? 1 : 0);
2276
2277
1/2
✓ Branch 0 taken 1231344 times.
✗ Branch 1 not taken.
1231344 if (rsh->sh_dep_quant_used_flag)
2278 1231344 rc->qstate = start_qstate_sb;
2279
2/2
✓ Branch 0 taken 649936 times.
✓ Branch 1 taken 581408 times.
1231344 n = (i == rc->last_sub_block ? rc->last_scan_pos : rc->num_sb_coeff -1);
2280
2/2
✓ Branch 0 taken 13164795 times.
✓ Branch 1 taken 1231344 times.
14396139 for (/* nothing */; n >= 0; n--) {
2281 int trans_coeff_level;
2282 13164795 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2283 13164795 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2284 13164795 const int off = yc * tb->tb_width + xc;
2285 13164795 const int *abs_level = rc->abs_level + off;
2286
2287
2/2
✓ Branch 0 taken 7686082 times.
✓ Branch 1 taken 5478713 times.
13164795 if (*abs_level > 0) {
2288 7686082 int sign = 1;
2289
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7686082 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7686082 if (!sig_hidden_flag || (n != first_sig_scan_pos_sb))
2290 7686082 sign = 1 - 2 * coeff_sign_flag_decode(lc);
2291
1/2
✓ Branch 0 taken 7686082 times.
✗ Branch 1 not taken.
7686082 if (rsh->sh_dep_quant_used_flag) {
2292 7686082 trans_coeff_level = (2 * *abs_level - (rc->qstate > 1)) * sign;
2293 } else {
2294 trans_coeff_level = *abs_level * sign;
2295 if (sig_hidden_flag) {
2296 sum += *abs_level;
2297 if (n == first_sig_scan_pos_sb && (sum % 2))
2298 trans_coeff_level = -trans_coeff_level;
2299 }
2300 }
2301 7686082 tb->coeffs[off] = trans_coeff_level;
2302 7686082 tb->max_scan_x = FFMAX(xc, tb->max_scan_x);
2303 7686082 tb->max_scan_y = FFMAX(yc, tb->max_scan_y);
2304 }
2305
1/2
✓ Branch 0 taken 13164795 times.
✗ Branch 1 not taken.
13164795 if (rsh->sh_dep_quant_used_flag)
2306 13164795 rc->qstate = qstate_translate_table[rc->qstate][*abs_level & 1];
2307 }
2308
2309 1231344 return 0;
2310 }
2311
2312 649936 static void derive_last_scan_pos(ResidualCoding *rc)
2313 {
2314 int xc, yc, xs, ys;
2315 do {
2316
2/2
✓ Branch 0 taken 4875837 times.
✓ Branch 1 taken 80285992 times.
85161829 if (!rc->last_scan_pos) {
2317 4875837 rc->last_scan_pos = rc->num_sb_coeff;
2318 4875837 rc->last_sub_block--;
2319 }
2320 85161829 rc->last_scan_pos--;
2321 85161829 xs = rc->sb_scan_x_off[rc->last_sub_block];
2322 85161829 ys = rc->sb_scan_y_off[rc->last_sub_block];
2323 85161829 xc = (xs << rc->log2_sb_w) + rc->scan_x_off[rc->last_scan_pos];
2324 85161829 yc = (ys << rc->log2_sb_h) + rc->scan_y_off[rc->last_scan_pos];
2325
4/4
✓ Branch 0 taken 79762175 times.
✓ Branch 1 taken 5399654 times.
✓ Branch 2 taken 4749718 times.
✓ Branch 3 taken 649936 times.
85161829 } while ((xc != rc->last_significant_coeff_x) || (yc != rc->last_significant_coeff_y));
2326 649936 }
2327
2328 649936 static void last_significant_coeff_x_y_decode(ResidualCoding *rc, VVCLocalContext *lc,
2329 const int log2_zo_tb_width, const int log2_zo_tb_height)
2330 {
2331 649936 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2332 649936 const TransformBlock *tb = rc->tb;
2333 int last_significant_coeff_x, last_significant_coeff_y;
2334
2335 649936 last_significant_coeff_x = last_significant_coeff_x_prefix_decode(lc,
2336 649936 tb->log2_tb_width, log2_zo_tb_width, tb->c_idx);
2337
2338 649936 last_significant_coeff_y = last_significant_coeff_y_prefix_decode(lc,
2339 649936 tb->log2_tb_height, log2_zo_tb_height, tb->c_idx);
2340
2341
2/2
✓ Branch 0 taken 143959 times.
✓ Branch 1 taken 505977 times.
649936 if (last_significant_coeff_x > 3) {
2342 143959 int suffix = last_sig_coeff_suffix_decode(lc, last_significant_coeff_x);
2343 143959 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
2344 143959 (2 + (last_significant_coeff_x & 1)) + suffix;
2345 }
2346
2/2
✓ Branch 0 taken 109273 times.
✓ Branch 1 taken 540663 times.
649936 if (last_significant_coeff_y > 3) {
2347 109273 int suffix = last_sig_coeff_suffix_decode(lc, last_significant_coeff_y);
2348 109273 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
2349 109273 (2 + (last_significant_coeff_y & 1)) + suffix;
2350 }
2351
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 649936 times.
649936 if (rsh->sh_reverse_last_sig_coeff_flag) {
2352 last_significant_coeff_x = (1 << log2_zo_tb_width) - 1 - last_significant_coeff_x;
2353 last_significant_coeff_y = (1 << log2_zo_tb_height) - 1 - last_significant_coeff_y;
2354 }
2355 649936 rc->last_significant_coeff_x = last_significant_coeff_x;
2356 649936 rc->last_significant_coeff_y = last_significant_coeff_y;
2357 649936 }
2358
2359 649936 static int hls_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
2360 {
2361 649936 const VVCSPS *sps = lc->fc->ps.sps;
2362 649936 const CodingUnit *cu = lc->cu;
2363 649936 const int log2_tb_width = tb->log2_tb_width;
2364 649936 const int log2_tb_height = tb->log2_tb_height;
2365 649936 const int c_idx = tb->c_idx;
2366 int log2_zo_tb_width, log2_zo_tb_height;
2367 ResidualCoding rc;
2368
2369
10/10
✓ Branch 0 taken 646846 times.
✓ Branch 1 taken 3090 times.
✓ Branch 2 taken 39968 times.
✓ Branch 3 taken 606878 times.
✓ Branch 4 taken 30600 times.
✓ Branch 5 taken 9368 times.
✓ Branch 6 taken 1486 times.
✓ Branch 7 taken 29114 times.
✓ Branch 8 taken 1383 times.
✓ Branch 9 taken 103 times.
649936 if (sps->r->sps_mts_enabled_flag && cu->sbt_flag && !c_idx && log2_tb_width == 5 && log2_tb_height < 6)
2370 1383 log2_zo_tb_width = 4;
2371 else
2372 648553 log2_zo_tb_width = FFMIN(log2_tb_width, 5 );
2373
2374
10/10
✓ Branch 0 taken 646846 times.
✓ Branch 1 taken 3090 times.
✓ Branch 2 taken 39968 times.
✓ Branch 3 taken 606878 times.
✓ Branch 4 taken 30600 times.
✓ Branch 5 taken 9368 times.
✓ Branch 6 taken 30410 times.
✓ Branch 7 taken 190 times.
✓ Branch 8 taken 1892 times.
✓ Branch 9 taken 28518 times.
649936 if (sps->r->sps_mts_enabled_flag && cu->sbt_flag && !c_idx && log2_tb_width < 6 && log2_tb_height == 5 )
2375 1892 log2_zo_tb_height = 4;
2376 else
2377 648044 log2_zo_tb_height = FFMIN(log2_tb_height, 5);
2378
2379 649936 init_residual_coding(lc, &rc, log2_zo_tb_width, log2_zo_tb_height, tb);
2380 649936 last_significant_coeff_x_y_decode(&rc, lc, log2_zo_tb_width, log2_zo_tb_height);
2381 649936 derive_last_scan_pos(&rc);
2382
2383
9/10
✓ Branch 0 taken 457059 times.
✓ Branch 1 taken 192877 times.
✓ Branch 2 taken 441261 times.
✓ Branch 3 taken 15798 times.
✓ Branch 4 taken 400673 times.
✓ Branch 5 taken 40588 times.
✓ Branch 6 taken 400673 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 302757 times.
✓ Branch 9 taken 97916 times.
649936 if (!rc.last_sub_block && log2_tb_width >= 2 && log2_tb_height >= 2 && !tb->ts && rc.last_scan_pos > 0)
2384 302757 lc->parse.lfnst_dc_only = 0;
2385
6/6
✓ Branch 0 taken 192877 times.
✓ Branch 1 taken 457059 times.
✓ Branch 2 taken 192481 times.
✓ Branch 3 taken 396 times.
✓ Branch 4 taken 2279 times.
✓ Branch 5 taken 190202 times.
649936 if ((rc.last_sub_block > 0 && log2_tb_width >= 2 && log2_tb_height >= 2 ) ||
2386
8/8
✓ Branch 0 taken 99820 times.
✓ Branch 1 taken 359914 times.
✓ Branch 2 taken 61361 times.
✓ Branch 3 taken 38459 times.
✓ Branch 4 taken 28927 times.
✓ Branch 5 taken 32434 times.
✓ Branch 6 taken 30492 times.
✓ Branch 7 taken 36894 times.
459734 (rc.last_scan_pos > 7 && (log2_tb_width == 2 || log2_tb_width == 3 ) &&
2387 log2_tb_width == log2_tb_height))
2388 220694 lc->parse.lfnst_zero_out_sig_coeff_flag = 0;
2389
6/6
✓ Branch 0 taken 457059 times.
✓ Branch 1 taken 192877 times.
✓ Branch 2 taken 344629 times.
✓ Branch 3 taken 112430 times.
✓ Branch 4 taken 421088 times.
✓ Branch 5 taken 116418 times.
649936 if ((rc.last_sub_block > 0 || rc.last_scan_pos > 0 ) && !c_idx)
2390 421088 lc->parse.mts_dc_only = 0;
2391
2392 649936 memset(tb->coeffs, 0, tb->tb_width * tb->tb_height * sizeof(*tb->coeffs));
2393 649936 memset(rc.abs_level, 0, tb->tb_width * tb->tb_height * sizeof(rc.abs_level[0]));
2394 649936 memset(rc.sb_coded_flag, 0, rc.nb_sbs);
2395 649936 memset(rc.abs_level_pass1, 0, tb->tb_width * tb->tb_height * sizeof(rc.abs_level_pass1[0]));
2396 649936 memset(rc.sig_coeff_flag, 0, tb->tb_width * tb->tb_height * sizeof(rc.sig_coeff_flag[0]));
2397
2398
2/2
✓ Branch 0 taken 1435725 times.
✓ Branch 1 taken 649936 times.
2085661 for (int i = rc.last_sub_block; i >= 0; i--) {
2399 1435725 int ret = residual_coding_subblock(lc, &rc, i);
2400
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1435725 times.
1435725 if (ret < 0)
2401 return ret;
2402 }
2403
2404 649936 return 0;
2405 }
2406
2407 672930 int ff_vvc_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
2408 {
2409 672930 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2410
3/4
✓ Branch 0 taken 672930 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 22994 times.
✓ Branch 3 taken 649936 times.
672930 const int ts = !rsh->sh_ts_residual_coding_disabled_flag && tb->ts;
2411
2412
2/2
✓ Branch 0 taken 22994 times.
✓ Branch 1 taken 649936 times.
672930 return ts ? hls_residual_ts_coding(lc, tb) : hls_residual_coding(lc, tb);
2413 }
2414
2415 58663 int ff_vvc_cu_coded_flag(VVCLocalContext *lc)
2416 {
2417 58663 return GET_CABAC(CU_CODED_FLAG);
2418 }
2419
2420 116358 int ff_vvc_sbt_flag(VVCLocalContext *lc)
2421 {
2422 116358 const int w = lc->cu->cb_width;
2423 116358 const int h = lc->cu->cb_height;
2424 116358 const int inc = w * h <= 256;
2425 116358 return GET_CABAC(CU_SBT_FLAG + inc);
2426 }
2427
2428 27376 int ff_vvc_sbt_quad_flag(VVCLocalContext *lc)
2429 {
2430 27376 return GET_CABAC(CU_SBT_QUAD_FLAG);
2431 }
2432
2433 22043 int ff_vvc_sbt_horizontal_flag(VVCLocalContext *lc)
2434 {
2435 22043 const int w = lc->cu->cb_width;
2436 22043 const int h = lc->cu->cb_height;
2437
4/4
✓ Branch 0 taken 11805 times.
✓ Branch 1 taken 10238 times.
✓ Branch 2 taken 6658 times.
✓ Branch 3 taken 5147 times.
22043 const int inc = (w == h) ? 0 : ((w < h) ? 1 : 2);
2438 22043 return GET_CABAC(CU_SBT_HORIZONTAL_FLAG + inc);
2439 }
2440
2441 37108 int ff_vvc_sbt_pos_flag(VVCLocalContext *lc)
2442 {
2443 37108 return GET_CABAC(CU_SBT_POS_FLAG);
2444 }
2445
2446 131097 int ff_vvc_lfnst_idx(VVCLocalContext *lc, const int inc)
2447 {
2448
2/2
✓ Branch 1 taken 33843 times.
✓ Branch 2 taken 97254 times.
131097 if (!GET_CABAC(LFNST_IDX + inc))
2449 33843 return 0;
2450
2/2
✓ Branch 1 taken 61109 times.
✓ Branch 2 taken 36145 times.
97254 if (!GET_CABAC(LFNST_IDX + 2))
2451 61109 return 1;
2452 36145 return 2;
2453 }
2454
2455 180867 int ff_vvc_mts_idx(VVCLocalContext *lc)
2456 {
2457 int i;
2458
1/2
✓ Branch 0 taken 328443 times.
✗ Branch 1 not taken.
328443 for (i = 0; i < 4; i++) {
2459
2/2
✓ Branch 1 taken 180867 times.
✓ Branch 2 taken 147576 times.
328443 if (!GET_CABAC(MTS_IDX + i))
2460 180867 return i;
2461 }
2462 return i;
2463 }
2464
2465 1578 int ff_vvc_end_of_slice_flag_decode(VVCLocalContext *lc)
2466 {
2467 1578 return get_cabac_terminate(&lc->ep->cc);
2468 }
2469
2470 194 int ff_vvc_end_of_tile_one_bit(VVCLocalContext *lc)
2471 {
2472 194 return get_cabac_terminate(&lc->ep->cc);
2473 }
2474
2475 150 int ff_vvc_end_of_subset_one_bit(VVCLocalContext *lc)
2476 {
2477 150 return get_cabac_terminate(&lc->ep->cc);
2478 }
2479