FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vvc/cabac.c
Date: 2024-07-16 12:46:59
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 1777 static void cabac_init_state(VVCLocalContext *lc)
814 {
815 1777 const VVCSPS *sps = lc->fc->ps.sps;
816 1777 const H266RawSliceHeader *rsh = lc->sc->sh.r;
817 1777 const int qp = av_clip_uintp2(lc->sc->sh.slice_qp_y, 6);
818 1777 int init_type = 2 - rsh->sh_slice_type;
819
820 av_assert0(VVC_CONTEXTS == SYNTAX_ELEMENT_LAST);
821
822 1777 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 485 times.
✓ Branch 1 taken 1292 times.
✓ Branch 2 taken 485 times.
✗ Branch 3 not taken.
1777 if (rsh->sh_cabac_init_flag && !IS_I(rsh))
825 485 init_type ^= 3;
826
827
2/2
✓ Branch 0 taken 671706 times.
✓ Branch 1 taken 1777 times.
673483 for (int i = 0; i < VVC_CONTEXTS; i++) {
828 671706 VVCCabacState *state = &lc->ep->cabac_state[i];
829 671706 const int init_value = init_values[init_type][i];
830 671706 const int shift_idx = init_values[3][i];
831 671706 const int m = (init_value >> 3) - 4;
832 671706 const int n = ((init_value & 7) * 18) + 1;
833 671706 const int pre = av_clip(((m * (qp - 16)) >> 1) + n, 1, 127);
834
835 671706 state->state[0] = pre << 3;
836 671706 state->state[1] = pre << 7;
837 671706 state->shift[0] = (shift_idx >> 2 ) + 2;
838 671706 state->shift[1] = (shift_idx & 3 ) + 3 + state->shift[0];
839 }
840 1777 }
841
842 43183 int ff_vvc_cabac_init(VVCLocalContext *lc,
843 const int ctu_idx, const int rx, const int ry)
844 {
845 43183 int ret = 0;
846 43183 const VVCPPS *pps = lc->fc->ps.pps;
847 43183 const int first_ctb_in_slice = !ctu_idx;
848
4/4
✓ Branch 0 taken 4926 times.
✓ Branch 1 taken 38257 times.
✓ Branch 2 taken 1667 times.
✓ Branch 3 taken 3259 times.
43183 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 41600 times.
✓ Branch 1 taken 1583 times.
✓ Branch 2 taken 194 times.
✓ Branch 3 taken 41406 times.
43183 if (first_ctb_in_slice|| first_ctb_in_tile) {
851
3/4
✓ Branch 0 taken 1497 times.
✓ Branch 1 taken 280 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1497 times.
1777 if (lc->sc->nb_eps == 1 && !first_ctb_in_slice)
852 ret = cabac_reinit(lc);
853
1/2
✓ Branch 0 taken 1777 times.
✗ Branch 1 not taken.
1777 if (!ret)
854 1777 cabac_init_state(lc);
855 }
856 43183 return ret;
857 }
858
859 //fixme
860 1389011 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 1389011 i = ff_ctz(c->low) - CABAC_BITS;
868 #endif
869
870 1389011 x = -CABAC_MASK;
871
872 #if CABAC_BITS == 16
873 1389011 x += (c->bytestream[0] << 9) + (c->bytestream[1] << 1);
874 #else
875 x += c->bytestream[0] << 1;
876 #endif
877
878 1389011 c->low += x << i;
879 #if !UNCHECKED_BITSTREAM_READER
880
2/2
✓ Branch 0 taken 1388908 times.
✓ Branch 1 taken 103 times.
1389011 if (c->bytestream < c->bytestream_end)
881 #endif
882 1388908 c->bytestream += CABAC_BITS / 8;
883 1389011 }
884
885 37287635 static int inline vvc_get_cabac(CABACContext *c, VVCCabacState* base, const int ctx)
886 {
887 37287635 VVCCabacState *s = base + ctx;
888 37287635 const int qRangeIdx = c->range >> 5;
889 37287635 const int pState = s->state[1] + (s->state[0] << 4);
890 37287635 const int valMps = pState >> 14;
891
2/2
✓ Branch 0 taken 14979839 times.
✓ Branch 1 taken 22307796 times.
37287635 const int RangeLPS = (qRangeIdx * ((valMps ? 32767 - pState : pState) >> 9 ) >> 1) + 4;
892 int bit, lps_mask;
893
894 37287635 c->range -= RangeLPS;
895 37287635 lps_mask = ((c->range<<(CABAC_BITS+1)) - c->low)>>31;
896
897 37287635 c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask;
898 37287635 c->range += (RangeLPS - c->range) & lps_mask;
899
900 37287635 bit = valMps ^ (lps_mask & 1);
901
902 37287635 lps_mask = ff_h264_norm_shift[c->range];
903 37287635 c->range <<= lps_mask;
904 37287635 c->low <<= lps_mask;
905
906
2/2
✓ Branch 0 taken 1389011 times.
✓ Branch 1 taken 35898624 times.
37287635 if (!(c->low & CABAC_MASK))
907 1389011 vvc_refill2(c);
908 37287635 s->state[0] = s->state[0] - (s->state[0] >> s->shift[0]) + (1023 * bit >> s->shift[0]);
909 37287635 s->state[1] = s->state[1] - (s->state[1] >> s->shift[1]) + (16383 * bit >> s->shift[1]);
910 37287635 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 160128 static int truncated_binary_decode(VVCLocalContext *lc, const int c_max)
917 {
918 160128 const int n = c_max + 1;
919 160128 const int k = av_log2(n);
920 160128 const int u = (1 << (k+1)) - n;
921 160128 int v = 0;
922
2/2
✓ Branch 0 taken 606191 times.
✓ Branch 1 taken 160128 times.
766319 for (int i = 0; i < k; i++)
923 606191 v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
924
2/2
✓ Branch 0 taken 88980 times.
✓ Branch 1 taken 71148 times.
160128 if (v >= u) {
925 88980 v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
926 88980 v -= u;
927 }
928 160128 return v;
929 }
930
931 // 9.3.3.6 Limited k-th order Exp-Golomb binarization process
932 76249 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 76249 int pre_ext_len = 0;
935 int escape_length;
936 76249 int val = 0;
937
3/4
✓ Branch 0 taken 136954 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 60705 times.
✓ Branch 4 taken 76249 times.
136954 while ((pre_ext_len < max_pre_ext_len) && get_cabac_bypass(c))
938 60705 pre_ext_len++;
939
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 76249 times.
76249 if (pre_ext_len == max_pre_ext_len)
940 escape_length = trunc_suffix_len;
941 else
942 76249 escape_length = pre_ext_len + k;
943
2/2
✓ Branch 0 taken 142034 times.
✓ Branch 1 taken 76249 times.
218283 while (escape_length-- > 0) {
944 142034 val = (val << 1) + get_cabac_bypass(c);
945 }
946 76249 val += ((1 << pre_ext_len) - 1) << k;
947 76249 return val;
948 }
949
950 static av_always_inline
951 2839503 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 2839503 const VVCFrameContext *fc = lc->fc;
955 2839503 const VVCSPS *sps = fc->ps.sps;
956 2839503 const int min_cb_width = fc->ps.pps->min_cb_width;
957 2839503 const int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
958 2839503 const int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
959 2839503 const int x_cb = x0 >> sps->min_cb_log2_size_y;
960 2839503 const int y_cb = y0 >> sps->min_cb_log2_size_y;
961
962
4/4
✓ Branch 0 taken 489764 times.
✓ Branch 1 taken 2349739 times.
✓ Branch 2 taken 398519 times.
✓ Branch 3 taken 91245 times.
2839503 if (lc->ctb_left_flag || x0b)
963 2748258 *left = SAMPLE_CTB(left_ctx, x_cb - 1, y_cb);
964
4/4
✓ Branch 0 taken 808477 times.
✓ Branch 1 taken 2031026 times.
✓ Branch 2 taken 666869 times.
✓ Branch 3 taken 141608 times.
2839503 if (lc->ctb_up_flag || y0b)
965 2697895 *top = SAMPLE_CTB(top_ctx, x_cb, y_cb - 1);
966 2839503 }
967
968 static av_always_inline
969 683778 uint8_t get_inc(VVCLocalContext *lc, const uint8_t *ctx)
970 {
971 683778 uint8_t left = 0, top = 0;
972 683778 get_left_top(lc, &left, &top, lc->cu->x0, lc->cu->y0, ctx, ctx);
973 683778 return left + top;
974 }
975
976 19078 int ff_vvc_sao_merge_flag_decode(VVCLocalContext *lc)
977 {
978 19078 return GET_CABAC(SAO_MERGE_FLAG);
979 }
980
981 9355 int ff_vvc_sao_type_idx_decode(VVCLocalContext *lc)
982 {
983
2/2
✓ Branch 1 taken 6482 times.
✓ Branch 2 taken 2873 times.
9355 if (!GET_CABAC(SAO_TYPE_IDX))
984 6482 return SAO_NOT_APPLIED;
985
986
2/2
✓ Branch 1 taken 946 times.
✓ Branch 2 taken 1927 times.
2873 if (!get_cabac_bypass(&lc->ep->cc))
987 946 return SAO_BAND;
988 1927 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 13928 int ff_vvc_sao_offset_abs_decode(VVCLocalContext *lc)
1001 {
1002 13928 int i = 0;
1003 13928 const int length = (1 << (FFMIN(lc->fc->ps.sps->bit_depth, 10) - 5)) - 1;
1004
1005
4/4
✓ Branch 0 taken 40696 times.
✓ Branch 1 taken 118 times.
✓ Branch 3 taken 26886 times.
✓ Branch 4 taken 13810 times.
40814 while (i < length && get_cabac_bypass(&lc->ep->cc))
1006 26886 i++;
1007 13928 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 1927 int ff_vvc_sao_eo_class_decode(VVCLocalContext *lc)
1016 {
1017 1927 int ret = get_cabac_bypass(&lc->ep->cc) << 1;
1018 1927 ret |= get_cabac_bypass(&lc->ep->cc);
1019 1927 return ret;
1020 }
1021
1022 54039 int ff_vvc_alf_ctb_flag(VVCLocalContext *lc, const int rx, const int ry, const int c_idx)
1023 {
1024 54039 int inc = c_idx * 3;
1025 54039 const VVCFrameContext *fc = lc->fc;
1026
2/2
✓ Branch 0 taken 46777 times.
✓ Branch 1 taken 7262 times.
54039 if (lc->ctb_left_flag) {
1027 46777 const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1028 46777 inc += left->ctb_flag[c_idx];
1029 }
1030
2/2
✓ Branch 0 taken 41176 times.
✓ Branch 1 taken 12863 times.
54039 if (lc->ctb_up_flag) {
1031 41176 const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1032 41176 inc += above->ctb_flag[c_idx];
1033 }
1034 54039 return GET_CABAC(ALF_CTB_FLAG + inc);
1035 }
1036
1037 17026 int ff_vvc_alf_use_aps_flag(VVCLocalContext *lc)
1038 {
1039 17026 return GET_CABAC(ALF_USE_APS_FLAG);
1040 }
1041
1042 4492 int ff_vvc_alf_luma_prev_filter_idx(VVCLocalContext *lc)
1043 {
1044 4492 return truncated_binary_decode(lc, lc->sc->sh.r->sh_num_alf_aps_ids_luma - 1);
1045 }
1046
1047 2378 int ff_vvc_alf_luma_fixed_filter_idx(VVCLocalContext *lc)
1048 {
1049 2378 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 19930 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 9089 times.
19930 int inc = !idx ? ALF_CTB_CC_CB_IDC : ALF_CTB_CC_CR_IDC;
1065 19930 int i = 0;
1066 19930 const VVCFrameContext *fc = lc->fc;
1067
2/2
✓ Branch 0 taken 18156 times.
✓ Branch 1 taken 1774 times.
19930 if (lc->ctb_left_flag) {
1068 18156 const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1069 18156 inc += left->ctb_cc_idc[idx] != 0;
1070 }
1071
2/2
✓ Branch 0 taken 17033 times.
✓ Branch 1 taken 2897 times.
19930 if (lc->ctb_up_flag) {
1072 17033 const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1073 17033 inc += above->ctb_cc_idc[idx] != 0;
1074 }
1075
1076
2/2
✓ Branch 1 taken 11565 times.
✓ Branch 2 taken 8365 times.
19930 if (!GET_CABAC(inc))
1077 11565 return 0;
1078 8365 i++;
1079
4/4
✓ Branch 0 taken 14390 times.
✓ Branch 1 taken 1109 times.
✓ Branch 3 taken 7134 times.
✓ Branch 4 taken 7256 times.
15499 while (i < cc_filters_signalled && get_cabac_bypass(&lc->ep->cc))
1080 7134 i++;
1081 8365 return i;
1082 }
1083
1084 1529932 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 1529932 const VVCFrameContext *fc = lc->fc;
1088 1529932 const VVCPPS *pps = fc->ps.pps;
1089
4/4
✓ Branch 0 taken 1526079 times.
✓ Branch 1 taken 3853 times.
✓ Branch 2 taken 1481521 times.
✓ Branch 3 taken 44558 times.
1529932 const int is_inside = (x0 + cb_width <= pps->width) && (y0 + cb_height <= pps->height);
1090
1091
12/12
✓ Branch 0 taken 553954 times.
✓ Branch 1 taken 975978 times.
✓ Branch 2 taken 396845 times.
✓ Branch 3 taken 157109 times.
✓ Branch 4 taken 392896 times.
✓ Branch 5 taken 3949 times.
✓ Branch 6 taken 392785 times.
✓ Branch 7 taken 111 times.
✓ Branch 8 taken 26328 times.
✓ Branch 9 taken 366457 times.
✓ Branch 10 taken 1115064 times.
✓ Branch 11 taken 48411 times.
1529932 if ((a->btv || a->bth || a->ttv || a->tth || a->qt) && is_inside)
1092 {
1093 1115064 uint8_t inc = 0, left_height = cb_height, top_width = cb_width;
1094
1095 1115064 get_left_top(lc, &left_height, &top_width, x0, y0, fc->tab.cb_height[is_chroma], fc->tab.cb_width[is_chroma]);
1096 1115064 inc += left_height < cb_height;
1097 1115064 inc += top_width < cb_width;
1098 1115064 inc += (a->btv + a->bth + a->ttv + a->tth + 2 * a->qt - 1) / 2 * 3;
1099
1100 1115064 return GET_CABAC(SPLIT_CU_FLAG + inc);
1101
1102 }
1103 414868 return !is_inside;
1104 }
1105
1106 225719 static int split_qt_flag_decode(VVCLocalContext *lc, const int x0, const int y0, const int ch_type, const int cqt_depth)
1107 {
1108 225719 const VVCFrameContext *fc = lc->fc;
1109 225719 int inc = 0;
1110 225719 uint8_t depth_left = 0, depth_top = 0;
1111
1112 225719 get_left_top(lc, &depth_left, &depth_top, x0, y0, fc->tab.cqt_depth[ch_type], fc->tab.cqt_depth[ch_type]);
1113 225719 inc += depth_left > cqt_depth;
1114 225719 inc += depth_top > cqt_depth;
1115
2/2
✓ Branch 0 taken 165015 times.
✓ Branch 1 taken 60704 times.
225719 inc += (cqt_depth >= 2) * 3;
1116
1117 225719 return GET_CABAC(SPLIT_QT_FLAG + inc);
1118 }
1119
1120 521615 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 43971 times.
✓ Branch 1 taken 477644 times.
✓ Branch 2 taken 11271 times.
✓ Branch 3 taken 32700 times.
✓ Branch 4 taken 78969 times.
✓ Branch 5 taken 409946 times.
✓ Branch 6 taken 10315 times.
✓ Branch 7 taken 68654 times.
521615 if ((a->bth || a->tth) && (a->btv || a->ttv)) {
1124 int inc;
1125 420261 const int v = a->btv + a->ttv;
1126 420261 const int h = a->bth + a->tth;
1127
2/2
✓ Branch 0 taken 61973 times.
✓ Branch 1 taken 358288 times.
420261 if (v > h)
1128 61973 inc = 4;
1129
2/2
✓ Branch 0 taken 65622 times.
✓ Branch 1 taken 292666 times.
358288 else if (v < h)
1130 65622 inc = 3;
1131 else {
1132 292666 const VVCFrameContext *fc = lc->fc;
1133 292666 const VVCSPS *sps = fc->ps.sps;
1134 292666 const int min_cb_width = fc->ps.pps->min_cb_width;
1135 292666 const int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
1136 292666 const int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
1137 292666 const int x_cb = x0 >> sps->min_cb_log2_size_y;
1138 292666 const int y_cb = y0 >> sps->min_cb_log2_size_y;
1139
4/4
✓ Branch 0 taken 84484 times.
✓ Branch 1 taken 208182 times.
✓ Branch 2 taken 69188 times.
✓ Branch 3 taken 15296 times.
292666 const int available_a = lc->ctb_up_flag || y0b;
1140
4/4
✓ Branch 0 taken 50483 times.
✓ Branch 1 taken 242183 times.
✓ Branch 2 taken 39570 times.
✓ Branch 3 taken 10913 times.
292666 const int available_l = lc->ctb_left_flag || x0b;
1141
2/2
✓ Branch 0 taken 277370 times.
✓ Branch 1 taken 15296 times.
292666 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 281753 times.
✓ Branch 1 taken 10913 times.
292666 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 213049 times.
✓ Branch 1 taken 79617 times.
✓ Branch 2 taken 198755 times.
✓ Branch 3 taken 14294 times.
✓ Branch 4 taken 9511 times.
✓ Branch 5 taken 189244 times.
292666 if (da == dl || !available_a || !available_l)
1145 103422 inc = 0;
1146
2/2
✓ Branch 0 taken 95658 times.
✓ Branch 1 taken 93586 times.
189244 else if (da < dl)
1147 95658 inc = 1;
1148 else
1149 93586 inc = 2;
1150 }
1151 420261 return GET_CABAC(MTT_SPLIT_CU_VERTICAL_FLAG + inc);
1152 }
1153
4/4
✓ Branch 0 taken 32722 times.
✓ Branch 1 taken 68632 times.
✓ Branch 2 taken 32700 times.
✓ Branch 3 taken 22 times.
101354 return !(a->bth || a->tth);
1154 }
1155
1156 364101 static int mtt_split_cu_binary_flag_decode(VVCLocalContext *lc, const int mtt_split_cu_vertical_flag, const int mtt_depth)
1157 {
1158 364101 const int inc = (2 * mtt_split_cu_vertical_flag) + ((mtt_depth <= 1) ? 1 : 0);
1159 364101 return GET_CABAC(MTT_SPLIT_CU_BINARY_FLAG + inc);
1160 }
1161
1162 602133 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 107630 times.
✓ Branch 1 taken 494503 times.
✓ Branch 2 taken 25854 times.
✓ Branch 3 taken 81776 times.
✓ Branch 4 taken 22566 times.
✓ Branch 5 taken 3288 times.
✓ Branch 6 taken 22 times.
✓ Branch 7 taken 22544 times.
602133 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 602133 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 579589 times.
✓ Branch 1 taken 22544 times.
✓ Branch 2 taken 225719 times.
✓ Branch 3 taken 353870 times.
602133 if (allow_no_qt && a->qt) {
1173 225719 split_qt_flag = split_qt_flag_decode(lc, x0, y0, ch_type, cqt_depth);
1174 } else {
1175
3/4
✓ Branch 0 taken 353870 times.
✓ Branch 1 taken 22544 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 353870 times.
376414 split_qt_flag = !allow_no_qt || a->qt;
1176 }
1177
2/2
✓ Branch 0 taken 80518 times.
✓ Branch 1 taken 521615 times.
602133 if (split_qt_flag)
1178 80518 return SPLIT_QT;
1179 521615 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 442626 times.
✓ Branch 1 taken 78989 times.
✓ Branch 2 taken 323676 times.
✓ Branch 3 taken 118950 times.
✓ Branch 4 taken 145752 times.
✓ Branch 5 taken 177924 times.
521615 if ((a->btv && a->ttv && mtt_split_cu_vertical_flag) ||
1181
6/6
✓ Branch 0 taken 326646 times.
✓ Branch 1 taken 17045 times.
✓ Branch 2 taken 208854 times.
✓ Branch 3 taken 117792 times.
✓ Branch 4 taken 186177 times.
✓ Branch 5 taken 22677 times.
343691 (a->bth && a->tth && !mtt_split_cu_vertical_flag)) {
1182 364101 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 52103 times.
✓ Branch 1 taken 105411 times.
✓ Branch 2 taken 672 times.
✓ Branch 3 taken 51431 times.
157514 if (!a->btv && !a->bth)
1185 672 mtt_split_cu_binary_flag = 0;
1186
4/4
✓ Branch 0 taken 129997 times.
✓ Branch 1 taken 26845 times.
✓ Branch 2 taken 109553 times.
✓ Branch 3 taken 20444 times.
156842 else if (!a->ttv && !a->tth)
1187 109553 mtt_split_cu_binary_flag = 1;
1188
4/4
✓ Branch 0 taken 42964 times.
✓ Branch 1 taken 4325 times.
✓ Branch 2 taken 23313 times.
✓ Branch 3 taken 19651 times.
47289 else if (a->bth && a->ttv)
1189 23313 mtt_split_cu_binary_flag = 1 - mtt_split_cu_vertical_flag;
1190 else
1191 23976 mtt_split_cu_binary_flag = mtt_split_cu_vertical_flag;
1192 }
1193 521615 return mtt_split_modes[(mtt_split_cu_vertical_flag << 1) + mtt_split_cu_binary_flag];
1194 }
1195
1196 27488 int ff_vvc_non_inter_flag(VVCLocalContext *lc, const int x0, const int y0, const int ch_type)
1197 {
1198 27488 const VVCFrameContext *fc = lc->fc;
1199 27488 uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1200
1201 27488 get_left_top(lc, &left, &top, x0, y0, fc->tab.cpm[ch_type], fc->tab.cpm[ch_type]);
1202
4/4
✓ Branch 0 taken 20554 times.
✓ Branch 1 taken 6934 times.
✓ Branch 2 taken 2764 times.
✓ Branch 3 taken 17790 times.
27488 inc = left == MODE_INTRA || top == MODE_INTRA;
1203 27488 return GET_CABAC(NON_INTER_FLAG + inc);
1204 }
1205
1206 180642 int ff_vvc_pred_mode_flag(VVCLocalContext *lc, const int is_chroma)
1207 {
1208 180642 const VVCFrameContext *fc = lc->fc;
1209 180642 const CodingUnit *cu = lc->cu;
1210 180642 uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1211
1212 180642 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 142720 times.
✓ Branch 1 taken 37922 times.
✓ Branch 2 taken 14658 times.
✓ Branch 3 taken 128062 times.
180642 inc = left == MODE_INTRA || top == MODE_INTRA;
1214 180642 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 443610 int ff_vvc_cu_skip_flag(VVCLocalContext *lc, const uint8_t *cu_skip_flag)
1243 {
1244 443610 const int inc = get_inc(lc, cu_skip_flag);
1245 443610 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 302809 int ff_vvc_intra_luma_ref_idx(VVCLocalContext *lc)
1283 {
1284 int i;
1285
2/2
✓ Branch 0 taken 325672 times.
✓ Branch 1 taken 14394 times.
340066 for (i = 0; i < 2; i++) {
1286
2/2
✓ Branch 1 taken 288415 times.
✓ Branch 2 taken 37257 times.
325672 if (!GET_CABAC(INTRA_LUMA_REF_IDX + i))
1287 288415 return i;
1288 }
1289 14394 return i;
1290 }
1291
1292 273413 int ff_vvc_intra_subpartitions_mode_flag(VVCLocalContext *lc)
1293 {
1294 273413 return GET_CABAC(INTRA_SUBPARTITIONS_MODE_FLAG);
1295 }
1296
1297 335676 enum IspType ff_vvc_isp_split_type(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1298 {
1299
2/2
✓ Branch 0 taken 286763 times.
✓ Branch 1 taken 48913 times.
335676 if (!intra_subpartitions_mode_flag)
1300 286763 return ISP_NO_SPLIT;
1301 48913 return 1 + GET_CABAC(INTRA_SUBPARTITIONS_SPLIT_FLAG);
1302 }
1303
1304 312813 int ff_vvc_intra_luma_mpm_flag(VVCLocalContext *lc)
1305 {
1306 312813 return GET_CABAC(INTRA_LUMA_MPM_FLAG);
1307 }
1308
1309 234506 int ff_vvc_intra_luma_not_planar_flag(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1310 {
1311
2/2
✓ Branch 0 taken 197182 times.
✓ Branch 1 taken 37324 times.
234506 return GET_CABAC(INTRA_LUMA_NOT_PLANAR_FLAG + !intra_subpartitions_mode_flag);
1312 }
1313
1314 130431 int ff_vvc_intra_luma_mpm_idx(VVCLocalContext *lc)
1315 {
1316 int i;
1317
4/4
✓ Branch 0 taken 234813 times.
✓ Branch 1 taken 8036 times.
✓ Branch 3 taken 112418 times.
✓ Branch 4 taken 122395 times.
242849 for (i = 0; i < 4 && get_cabac_bypass(&lc->ep->cc); i++)
1318 /* nothing */;
1319 130431 return i;
1320 }
1321
1322 78307 int ff_vvc_intra_luma_mpm_remainder(VVCLocalContext *lc)
1323 {
1324 78307 return truncated_binary_decode(lc, 60);
1325 }
1326
1327 147077 int ff_vvc_cclm_mode_flag(VVCLocalContext *lc)
1328 {
1329 147077 return GET_CABAC(CCLM_MODE_FLAG);
1330 }
1331
1332 62091 int ff_vvc_cclm_mode_idx(VVCLocalContext *lc)
1333 {
1334
2/2
✓ Branch 1 taken 37148 times.
✓ Branch 2 taken 24943 times.
62091 if (!GET_CABAC(CCLM_MODE_IDX))
1335 37148 return 0;
1336 24943 return get_cabac_bypass(&lc->ep->cc) + 1;
1337 }
1338
1339 96209 int ff_vvc_intra_chroma_pred_mode(VVCLocalContext *lc)
1340 {
1341
2/2
✓ Branch 1 taken 73157 times.
✓ Branch 2 taken 23052 times.
96209 if (!GET_CABAC(INTRA_CHROMA_PRED_MODE))
1342 73157 return 4;
1343 23052 return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1344 }
1345
1346 168217 int ff_vvc_general_merge_flag(VVCLocalContext *lc)
1347 {
1348 168217 return GET_CABAC(GENERAL_MERGE_FLAG);
1349 }
1350
1351 301890 static int get_inter_flag_inc(VVCLocalContext *lc, const int x0, const int y0)
1352 {
1353 301890 uint8_t left_merge = 0, top_merge = 0;
1354 301890 uint8_t left_affine = 0, top_affine = 0;
1355 301890 const VVCFrameContext *fc = lc->fc;
1356
1357 301890 get_left_top(lc, &left_merge, &top_merge, x0, y0, fc->tab.msf, fc->tab.msf);
1358 301890 get_left_top(lc, &left_affine, &top_affine, x0, y0, fc->tab.iaf, fc->tab.iaf);
1359
4/4
✓ Branch 0 taken 261861 times.
✓ Branch 1 taken 40029 times.
✓ Branch 2 taken 9358 times.
✓ Branch 3 taken 252503 times.
301890 return (left_merge || left_affine) + (top_merge + top_affine);
1360 }
1361
1362 276219 int ff_vvc_merge_subblock_flag(VVCLocalContext *lc)
1363 {
1364 276219 const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1365 276219 return GET_CABAC(MERGE_SUBBLOCK_FLAG + inc);
1366 }
1367
1368 48721 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 29703 times.
✓ Branch 2 taken 19018 times.
48721 if (!GET_CABAC(MERGE_SUBBLOCK_IDX))
1372 29703 return 0;
1373
4/4
✓ Branch 0 taken 32545 times.
✓ Branch 1 taken 1772 times.
✓ Branch 3 taken 15299 times.
✓ Branch 4 taken 17246 times.
34317 for (i = 1; i < max_num_subblock_merge_cand - 1 && get_cabac_bypass(&lc->ep->cc); i++)
1374 /* nothing */;
1375 19018 return i;
1376 }
1377
1378 215698 int ff_vvc_regular_merge_flag(VVCLocalContext *lc, const int cu_skip_flag)
1379 {
1380 215698 int inc = !cu_skip_flag;
1381 215698 return GET_CABAC(REGULAR_MERGE_FLAG + inc);
1382 }
1383
1384 250158 int ff_vvc_mmvd_merge_flag(VVCLocalContext *lc)
1385 {
1386 250158 return GET_CABAC(MMVD_MERGE_FLAG);
1387 }
1388
1389 54381 int ff_vvc_mmvd_cand_flag(VVCLocalContext *lc)
1390 {
1391 54381 return GET_CABAC(MMVD_CAND_FLAG);
1392 }
1393
1394 54381 static int mmvd_distance_idx_decode(VVCLocalContext *lc)
1395 {
1396 int i;
1397
2/2
✓ Branch 1 taken 14303 times.
✓ Branch 2 taken 40078 times.
54381 if (!GET_CABAC(MMVD_DISTANCE_IDX))
1398 14303 return 0;
1399
4/4
✓ Branch 0 taken 75686 times.
✓ Branch 1 taken 5 times.
✓ Branch 3 taken 35613 times.
✓ Branch 4 taken 40073 times.
75691 for (i = 1; i < 7 && get_cabac_bypass(&lc->ep->cc); i++)
1400 /* nothing */;
1401 40078 return i;
1402 }
1403
1404 54381 static int mmvd_direction_idx_decode(VVCLocalContext *lc)
1405 {
1406 54381 return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1407 }
1408
1409 54381 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 54381 times.
54381 const int shift = ph_mmvd_fullpel_only_flag ? 4 : 2;
1412 54381 const int mmvd_distance = 1 << (mmvd_distance_idx_decode(lc) + shift);
1413 54381 const int mmvd_direction_idx = mmvd_direction_idx_decode(lc);
1414 54381 const int mmvd_signs[][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
1415 54381 mmvd_offset->x = mmvd_distance * mmvd_signs[mmvd_direction_idx][0];
1416 54381 mmvd_offset->y = mmvd_distance * mmvd_signs[mmvd_direction_idx][1];
1417 54381 }
1418
1419 211294 static PredMode get_luma_pred_mode(VVCLocalContext *lc)
1420 {
1421 211294 const VVCFrameContext *fc = lc->fc;
1422 211294 const CodingUnit *cu = lc->cu;
1423 PredMode pred_mode;
1424
1425
1/2
✓ Branch 0 taken 211294 times.
✗ Branch 1 not taken.
211294 if (cu->tree_type != DUAL_TREE_CHROMA) {
1426 211294 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 211294 return pred_mode;
1434 }
1435
1436 211294 int ff_vvc_merge_idx(VVCLocalContext *lc)
1437 {
1438 211294 const VVCSPS *sps = lc->fc->ps.sps;
1439 211294 const int is_ibc = get_luma_pred_mode(lc) == MODE_IBC;
1440
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 211294 times.
211294 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 124529 times.
✓ Branch 2 taken 86765 times.
211294 if (!GET_CABAC(MERGE_IDX))
1444 124529 return 0;
1445
1446
4/4
✓ Branch 0 taken 167730 times.
✓ Branch 1 taken 8849 times.
✓ Branch 3 taken 89814 times.
✓ Branch 4 taken 77916 times.
176579 for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1447 /* nothing */;
1448 86765 return i;
1449 }
1450
1451 24737 int ff_vvc_merge_gpm_partition_idx(VVCLocalContext *lc)
1452 {
1453 24737 int i = 0;
1454
1455
2/2
✓ Branch 0 taken 148422 times.
✓ Branch 1 taken 24737 times.
173159 for (int j = 0; j < 6; j++)
1456 148422 i = (i << 1) | get_cabac_bypass(&lc->ep->cc);
1457
1458 24737 return i;
1459 }
1460
1461 49474 int ff_vvc_merge_gpm_idx(VVCLocalContext *lc, const int idx)
1462 {
1463 49474 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 27851 times.
✓ Branch 2 taken 21623 times.
49474 if (!GET_CABAC(MERGE_IDX))
1467 27851 return 0;
1468
1469
4/4
✓ Branch 0 taken 37385 times.
✓ Branch 1 taken 3577 times.
✓ Branch 3 taken 19339 times.
✓ Branch 4 taken 18046 times.
40962 for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1470 /* nothing */;
1471
1472 21623 return i;
1473 }
1474
1475 18681 int ff_vvc_ciip_flag(VVCLocalContext *lc)
1476 {
1477 18681 return GET_CABAC(CIIP_FLAG);
1478 }
1479
1480 57785 PredFlag ff_vvc_pred_flag(VVCLocalContext *lc, const int is_b)
1481 {
1482 57785 const int w = lc->cu->cb_width;
1483 57785 const int h = lc->cu->cb_height;
1484
2/2
✓ Branch 0 taken 1938 times.
✓ Branch 1 taken 55847 times.
57785 if (!is_b)
1485 1938 return PF_L0;
1486
2/2
✓ Branch 0 taken 50274 times.
✓ Branch 1 taken 5573 times.
55847 if (w + h > 12) {
1487 50274 const int log2 = av_log2(w) + av_log2(h);
1488 50274 const int inc = 7 - ((1 + log2)>>1);
1489
2/2
✓ Branch 1 taken 17075 times.
✓ Branch 2 taken 33199 times.
50274 if (GET_CABAC(INTER_PRED_IDC + inc))
1490 17075 return PF_BI;
1491 }
1492 38772 return PF_L0 + GET_CABAC(INTER_PRED_IDC + 5);
1493 }
1494
1495 25671 int ff_vvc_inter_affine_flag(VVCLocalContext *lc)
1496 {
1497 25671 const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1498 25671 return GET_CABAC(INTER_AFFINE_FLAG + inc);
1499 }
1500
1501 9102 int ff_vvc_cu_affine_type_flag(VVCLocalContext *lc)
1502 {
1503 9102 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 47090 int ff_vvc_ref_idx_lx(VVCLocalContext *lc, const uint8_t nb_refs)
1512 {
1513 47090 const int c_max = nb_refs - 1;
1514 47090 const int max_ctx = FFMIN(c_max, 2);
1515 47090 int i = 0;
1516
1517
4/4
✓ Branch 0 taken 47969 times.
✓ Branch 1 taken 10636 times.
✓ Branch 3 taken 11515 times.
✓ Branch 4 taken 36454 times.
58605 while (i < max_ctx && GET_CABAC(REF_IDX_LX + i))
1518 11515 i++;
1519
2/2
✓ Branch 0 taken 594 times.
✓ Branch 1 taken 46496 times.
47090 if (i == 2) {
1520
4/4
✓ Branch 0 taken 529 times.
✓ Branch 1 taken 417 times.
✓ Branch 3 taken 352 times.
✓ Branch 4 taken 177 times.
946 while (i < c_max && get_cabac_bypass(&lc->ep->cc))
1521 352 i++;
1522 }
1523 47090 return i;
1524 }
1525
1526 162332 int ff_vvc_abs_mvd_greater0_flag(VVCLocalContext *lc)
1527 {
1528 162332 return GET_CABAC(ABS_MVD_GREATER0_FLAG);
1529 }
1530
1531 113271 int ff_vvc_abs_mvd_greater1_flag(VVCLocalContext *lc)
1532 {
1533 113271 return GET_CABAC(ABS_MVD_GREATER1_FLAG);
1534 }
1535
1536 66424 int ff_vvc_abs_mvd_minus2(VVCLocalContext *lc)
1537 {
1538 66424 return limited_kth_order_egk_decode(&lc->ep->cc, 1, 15, 17);
1539 }
1540
1541 113271 int ff_vvc_mvd_sign_flag(VVCLocalContext *lc)
1542 {
1543 113271 return get_cabac_bypass(&lc->ep->cc);
1544 }
1545
1546 74860 int ff_vvc_mvp_lx_flag(VVCLocalContext *lc)
1547 {
1548 74860 return GET_CABAC(MVP_LX_FLAG);
1549 }
1550
1551 52299 static int amvr_flag(VVCLocalContext *lc, const int inter_affine_flag)
1552 {
1553 52299 return GET_CABAC(AMVR_FLAG + inter_affine_flag);
1554 }
1555
1556 32618 static int amvr_precision_idx(VVCLocalContext *lc, const int inc, const int c_max)
1557 {
1558 32618 int i = 0;
1559
2/2
✓ Branch 1 taken 7266 times.
✓ Branch 2 taken 25352 times.
32618 if (!GET_CABAC(AMVR_PRECISION_IDX + inc))
1560 7266 return 0;
1561 25352 i++;
1562
4/4
✓ Branch 0 taken 21799 times.
✓ Branch 1 taken 3553 times.
✓ Branch 3 taken 3570 times.
✓ Branch 4 taken 18229 times.
25352 if (i < c_max && GET_CABAC(AMVR_PRECISION_IDX + 1))
1563 3570 i++;
1564 25352 return i;
1565 }
1566
1567 58863 int ff_vvc_amvr_shift(VVCLocalContext *lc, const int inter_affine_flag,
1568 const PredMode pred_mode, const int has_amvr_flag)
1569 {
1570 58863 int amvr_shift = 2;
1571
2/2
✓ Branch 0 taken 53377 times.
✓ Branch 1 taken 5486 times.
58863 if (has_amvr_flag) {
1572
4/4
✓ Branch 0 taken 52299 times.
✓ Branch 1 taken 1078 times.
✓ Branch 3 taken 31540 times.
✓ Branch 4 taken 20759 times.
53377 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 28952 times.
32618 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 27874 times.
28952 } 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 27874 idx = amvr_precision_idx(lc, 0, 2);
1583 27874 amvr_shift = shifts[idx];
1584 }
1585 }
1586 }
1587 58863 return amvr_shift;
1588 }
1589
1590 11078 int ff_vvc_bcw_idx(VVCLocalContext *lc, const int no_backward_pred_flag)
1591 {
1592
2/2
✓ Branch 0 taken 2374 times.
✓ Branch 1 taken 8704 times.
11078 const int c_max = no_backward_pred_flag ? 4 : 2;
1593 11078 int i = 1;
1594
2/2
✓ Branch 1 taken 6514 times.
✓ Branch 2 taken 4564 times.
11078 if (!GET_CABAC(BCW_IDX))
1595 6514 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 291776 int ff_vvc_tu_cb_coded_flag(VVCLocalContext *lc)
1602 {
1603 291776 return GET_CABAC(TU_CB_CODED_FLAG + lc->cu->bdpcm_flag[1]);
1604 }
1605
1606 291776 int ff_vvc_tu_cr_coded_flag(VVCLocalContext *lc, int tu_cb_coded_flag)
1607 {
1608
2/2
✓ Branch 0 taken 291773 times.
✓ Branch 1 taken 3 times.
291776 return GET_CABAC(TU_CR_CODED_FLAG + (lc->cu->bdpcm_flag[1] ? 2 : tu_cb_coded_flag));
1609 }
1610
1611 554509 int ff_vvc_tu_y_coded_flag(VVCLocalContext *lc)
1612 {
1613 554509 const CodingUnit *cu = lc->cu;
1614 int inc;
1615
2/2
✓ Branch 0 taken 34 times.
✓ Branch 1 taken 554475 times.
554509 if (cu->bdpcm_flag[0])
1616 34 inc = 1;
1617
2/2
✓ Branch 0 taken 402301 times.
✓ Branch 1 taken 152174 times.
554475 else if (cu->isp_split_type == ISP_NO_SPLIT)
1618 402301 inc = 0;
1619 else
1620 152174 inc = 2 + lc->parse.prev_tu_cbf_y;
1621 554509 lc->parse.prev_tu_cbf_y = GET_CABAC(TU_Y_CODED_FLAG + inc);
1622 554509 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 1317052 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 1317052 int i = 0;
1676 1317052 int max = (log2_zo_tb_size << 1) - 1;
1677 int ctx_offset, ctx_shift;
1678
2/2
✓ Branch 0 taken 12524 times.
✓ Branch 1 taken 1304528 times.
1317052 if (!log2_tb_size)
1679 12524 return 0;
1680
2/2
✓ Branch 0 taken 1001996 times.
✓ Branch 1 taken 302532 times.
1304528 if (!c_idx) {
1681 1001996 const int offset_y[] = {0, 0, 3, 6, 10, 15};
1682 1001996 ctx_offset = offset_y[log2_tb_size - 1];
1683 1001996 ctx_shift = (log2_tb_size + 1) >> 2;
1684 } else {
1685 302532 const int shifts[] = {0, 0, 0, 1, 2, 2, 2};
1686 302532 ctx_offset = 20;
1687 302532 ctx_shift = shifts[log2_tb_size];
1688 }
1689
4/4
✓ Branch 0 taken 3436245 times.
✓ Branch 1 taken 188986 times.
✓ Branch 3 taken 2320703 times.
✓ Branch 4 taken 1115542 times.
3625231 while (i < max && GET_CABAC(ctx + (i >> ctx_shift) + ctx_offset))
1690 2320703 i++;
1691 1304528 return i;
1692 }
1693
1694 658526 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 658526 return last_significant_coeff_xy_prefix(lc, log2_tb_width, log2_zo_tb_width, c_idx, LAST_SIG_COEFF_X_PREFIX);
1698 }
1699
1700 658526 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 658526 return last_significant_coeff_xy_prefix(lc, log2_tb_height, log2_zo_tb_height, c_idx, LAST_SIG_COEFF_Y_PREFIX);
1704 }
1705
1706 255361 static av_always_inline int last_sig_coeff_suffix_decode(VVCLocalContext *lc,
1707 const int last_significant_coeff_y_prefix)
1708 {
1709 255361 const int length = (last_significant_coeff_y_prefix >> 1) - 1;
1710 255361 int value = get_cabac_bypass(&lc->ep->cc);
1711
1712
2/2
✓ Branch 0 taken 101164 times.
✓ Branch 1 taken 255361 times.
356525 for (int i = 1; i < length; i++)
1713 101164 value = (value << 1) | get_cabac_bypass(&lc->ep->cc);
1714 255361 return value;
1715 }
1716
1717 86480 int ff_vvc_tu_joint_cbcr_residual_flag(VVCLocalContext *lc, const int tu_cb_coded_flag, const int tu_cr_coded_flag)
1718 {
1719 86480 return GET_CABAC(TU_JOINT_CBCR_RESIDUAL_FLAG + 2 * tu_cb_coded_flag + tu_cr_coded_flag - 1);
1720 }
1721
1722 511653 int ff_vvc_transform_skip_flag(VVCLocalContext *lc, const int inc)
1723 {
1724 511653 return GET_CABAC(TRANSFORM_SKIP_FLAG + inc);
1725 }
1726
1727 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1728 26683999 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 26683999 int loc_sum = 3 * hist_value;
1732 26683999 level += w * yc + xc;
1733
2/2
✓ Branch 0 taken 25668747 times.
✓ Branch 1 taken 1015252 times.
26683999 if (xc < w - 1) {
1734 25668747 loc_sum += level[1];
1735
2/2
✓ Branch 0 taken 24217177 times.
✓ Branch 1 taken 1451570 times.
25668747 if (xc < w - 2)
1736 24217177 loc_sum += level[2] - hist_value;
1737
2/2
✓ Branch 0 taken 23752391 times.
✓ Branch 1 taken 1916356 times.
25668747 if (yc < h - 1)
1738 23752391 loc_sum += level[w + 1] - hist_value;
1739 }
1740
2/2
✓ Branch 0 taken 24767553 times.
✓ Branch 1 taken 1916446 times.
26683999 if (yc < h - 1) {
1741 24767553 loc_sum += level[w];
1742
2/2
✓ Branch 0 taken 22524584 times.
✓ Branch 1 taken 2242969 times.
24767553 if (yc < h - 2)
1743 22524584 loc_sum += level[w << 1] - hist_value;
1744 }
1745 26683999 return loc_sum;
1746 }
1747
1748 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1749 725539 static int get_local_sum_ts(const int *level, const int w, const int h, const int xc, const int yc)
1750 {
1751 725539 int loc_sum = 0;
1752 725539 level += w * yc + xc;
1753
2/2
✓ Branch 0 taken 635439 times.
✓ Branch 1 taken 90100 times.
725539 if (xc > 0)
1754 635439 loc_sum += level[-1];
1755
2/2
✓ Branch 0 taken 636570 times.
✓ Branch 1 taken 88969 times.
725539 if (yc > 0)
1756 636570 loc_sum += level[-w];
1757 725539 return loc_sum;
1758 }
1759
1760 7592905 static int get_gtx_flag_inc(const ResidualCoding* rc, const int xc, const int yc, const int last)
1761 {
1762 7592905 const TransformBlock *tb = rc->tb;
1763 int inc;
1764
2/2
✓ Branch 0 taken 658526 times.
✓ Branch 1 taken 6934379 times.
7592905 if (last) {
1765 658526 const int incs[] = {0, 21, 21};
1766 658526 inc = incs[tb->c_idx];
1767 } else {
1768 6934379 const int d = xc + yc;
1769 6934379 const int local_sum_sig = get_local_sum(rc->sig_coeff_flag,
1770 6934379 tb->tb_width,tb->tb_height, xc, yc, rc->hist_value);
1771 6934379 const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1772 6934379 tb->tb_width, tb->tb_height, xc, yc, rc->hist_value);
1773 6934379 const int offset = FFMIN(loc_sum_abs_pass1 - local_sum_sig, 4);
1774
1775
2/2
✓ Branch 0 taken 5044513 times.
✓ Branch 1 taken 1889866 times.
6934379 if (!tb->c_idx)
1776
6/6
✓ Branch 0 taken 4695983 times.
✓ Branch 1 taken 348530 times.
✓ Branch 2 taken 3623895 times.
✓ Branch 3 taken 1072088 times.
✓ Branch 4 taken 2337704 times.
✓ Branch 5 taken 1286191 times.
5044513 inc = 1 + offset + (!d ? 15 : (d < 3 ? 10 : (d < 10 ? 5 : 0)));
1777 else
1778
2/2
✓ Branch 0 taken 93621 times.
✓ Branch 1 taken 1796245 times.
1889866 inc = 22 + offset + (!d ? 5 : 0);
1779 }
1780 7592905 return inc;
1781 }
1782
1783 8847217 static int abs_level_gtx_flag_decode(VVCLocalContext *lc, const int inc)
1784 {
1785 8847217 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1786 }
1787
1788 1254312 static int par_level_flag_decode(VVCLocalContext *lc, const int inc)
1789 {
1790 1254312 return GET_CABAC(PAR_LEVEL_FLAG + inc);
1791 }
1792
1793 68129 static int par_level_flag_ts_decode(VVCLocalContext *lc)
1794 {
1795 68129 const int inc = 32;
1796 68129 return GET_CABAC(PAR_LEVEL_FLAG + inc);
1797 }
1798
1799 707341 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 707341 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1803 707341 const TransformBlock *tb = rc->tb;
1804 707341 const int w = rc->width_in_sbs;
1805 707341 const int h = rc->height_in_sbs;
1806 int inc;
1807
1808
3/4
✓ Branch 0 taken 111801 times.
✓ Branch 1 taken 595540 times.
✓ Branch 2 taken 111801 times.
✗ Branch 3 not taken.
707341 if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1809
2/2
✓ Branch 0 taken 67932 times.
✓ Branch 1 taken 43869 times.
111801 const int left = xs > 0 ? sb_coded_flag[-1] : 0;
1810
2/2
✓ Branch 0 taken 68511 times.
✓ Branch 1 taken 43290 times.
111801 const int above = ys > 0 ? sb_coded_flag[-w] : 0;
1811 111801 inc = left + above + 4;
1812 } else {
1813
2/2
✓ Branch 0 taken 512958 times.
✓ Branch 1 taken 82582 times.
595540 const int right = (xs < w - 1) ? sb_coded_flag[1] : 0;
1814
2/2
✓ Branch 0 taken 437896 times.
✓ Branch 1 taken 157644 times.
595540 const int bottom = (ys < h - 1) ? sb_coded_flag[w] : 0;
1815
2/2
✓ Branch 0 taken 239124 times.
✓ Branch 1 taken 356416 times.
595540 inc = (right | bottom) + (tb->c_idx ? 2 : 0);
1816 }
1817 707341 return GET_CABAC(SB_CODED_FLAG + inc);
1818 }
1819
1820 13153115 static int sig_coeff_flag_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1821 {
1822 13153115 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1823 13153115 const TransformBlock *tb = rc->tb;
1824 int inc;
1825
1826
3/4
✓ Branch 0 taken 725539 times.
✓ Branch 1 taken 12427576 times.
✓ Branch 2 taken 725539 times.
✗ Branch 3 not taken.
13153115 if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1827 725539 const int local_num_sig = get_local_sum_ts(rc->sig_coeff_flag, tb->tb_width, tb->tb_height, xc, yc);
1828 725539 inc = 60 + local_num_sig;
1829 } else {
1830 12427576 const int d = xc + yc;
1831 12427576 const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1832 12427576 tb->tb_width, tb->tb_height, xc, yc, 0);
1833
1834
2/2
✓ Branch 0 taken 8804973 times.
✓ Branch 1 taken 3622603 times.
12427576 if (!tb->c_idx) {
1835
4/4
✓ Branch 0 taken 7725444 times.
✓ Branch 1 taken 1079529 times.
✓ Branch 2 taken 2384912 times.
✓ Branch 3 taken 5340532 times.
8804973 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 306409 times.
✓ Branch 1 taken 3316194 times.
3622603 inc = 36 + 8 * FFMAX(0, rc->qstate - 1) + FFMIN((loc_sum_abs_pass1 + 1) >> 1, 3) + (d < 2 ? 4 : 0);
1838 }
1839 }
1840 13153115 return GET_CABAC(SIG_COEFF_FLAG + inc);
1841 }
1842
1843 387665 static int abs_get_rice_param(VVCLocalContext *lc, const ResidualCoding* rc,
1844 const int xc, const int yc, const int base_level)
1845 {
1846 387665 const VVCSPS *sps = lc->fc->ps.sps;
1847 387665 const TransformBlock* tb = rc->tb;
1848 387665 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 387665 loc_sum_abs = get_local_sum(rc->abs_level, tb->tb_width, tb->tb_height, xc,
1856 387665 yc, rc->hist_value);
1857
1858
1/2
✓ Branch 0 taken 387665 times.
✗ Branch 1 not taken.
387665 if (!sps->r->sps_rrc_rice_extension_flag) {
1859 387665 shift_val = 0;
1860 } else {
1861 shift_val = (av_log2(FFMAX(FFMIN(loc_sum_abs, 2048), 8)) - 3) & ~1;
1862 }
1863
1864 387665 loc_sum_abs = av_clip_uintp2((loc_sum_abs >> shift_val) - base_level * 5, 5);
1865
1866 387665 return rice_params[loc_sum_abs] + shift_val;
1867 }
1868
1869 423486 static int abs_decode(VVCLocalContext *lc, const int c_rice_param)
1870 {
1871 423486 const VVCSPS *sps = lc->fc->ps.sps;
1872 423486 const int MAX_BIN = 6;
1873 423486 int prefix = 0;
1874 423486 int suffix = 0;
1875
1876
4/4
✓ Branch 0 taken 818287 times.
✓ Branch 1 taken 9825 times.
✓ Branch 3 taken 404626 times.
✓ Branch 4 taken 413661 times.
828112 while (prefix < MAX_BIN && get_cabac_bypass(&lc->ep->cc))
1877 404626 prefix++;
1878
2/2
✓ Branch 0 taken 413661 times.
✓ Branch 1 taken 9825 times.
423486 if (prefix < MAX_BIN) {
1879
2/2
✓ Branch 0 taken 209394 times.
✓ Branch 1 taken 413661 times.
623055 for (int i = 0; i < c_rice_param; i++) {
1880 209394 suffix = (suffix << 1) | get_cabac_bypass(&lc->ep->cc);
1881 }
1882 } else {
1883 9825 suffix = limited_kth_order_egk_decode(&lc->ep->cc,
1884 c_rice_param + 1,
1885 9825 26 - sps->log2_transform_range,
1886 9825 sps->log2_transform_range);
1887 }
1888 423486 return suffix + (prefix << c_rice_param);
1889 }
1890
1891 221530 static int abs_remainder_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1892 {
1893 221530 const VVCSPS *sps = lc->fc->ps.sps;
1894 221530 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1895 221530 const int base_level[][2][2] = {
1896 { {4, 4}, {4, 4} },
1897 { {3, 2}, {2, 1} }
1898 };
1899 221530 const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc,
1900 221530 base_level[sps->r->sps_rrc_rice_extension_flag][sps->bit_depth > 12][IS_I(rsh)]);
1901 221530 const int rem = abs_decode(lc, c_rice_param);
1902
1903 221530 return rem;
1904 }
1905
1906 35821 static int abs_remainder_ts_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1907 {
1908 35821 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1909 35821 const int c_rice_param = rsh->sh_ts_residual_coding_rice_idx_minus1 + 1;
1910 35821 const int rem = abs_decode(lc, c_rice_param);
1911
1912 35821 return rem;
1913 }
1914
1915 7752159 static int coeff_sign_flag_decode(VVCLocalContext *lc)
1916 {
1917 7752159 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 181689 static int coeff_sign_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
1922 {
1923 181689 const TransformBlock *tb = rc->tb;
1924 181689 const int w = tb->tb_width;
1925 181689 const int *level = rc->coeff_sign_level + yc * w + xc;
1926
2/2
✓ Branch 0 taken 162334 times.
✓ Branch 1 taken 19355 times.
181689 const int left_sign = xc ? level[-1] : 0;
1927
2/2
✓ Branch 0 taken 162334 times.
✓ Branch 1 taken 19355 times.
181689 const int above_sign = yc ? level[-w] : 0;
1928 181689 const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
1929 int inc;
1930
1931
2/2
✓ Branch 0 taken 67321 times.
✓ Branch 1 taken 114368 times.
181689 if (left_sign == -above_sign)
1932
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 67304 times.
67321 inc = bdpcm_flag ? 3 : 0;
1933
4/4
✓ Branch 0 taken 71946 times.
✓ Branch 1 taken 42422 times.
✓ Branch 2 taken 50298 times.
✓ Branch 3 taken 21648 times.
114368 else if (left_sign >= 0 && above_sign >= 0)
1934
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 50295 times.
50298 inc = bdpcm_flag ? 4 : 1;
1935 else
1936
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 64059 times.
64070 inc = bdpcm_flag ? 5 : 2;
1937 181689 return GET_CABAC(COEFF_SIGN_FLAG + inc);
1938 }
1939
1940 181689 static int abs_level_gt1_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
1941 {
1942 181689 const TransformBlock *tb = rc->tb;
1943 181689 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 181658 times.
181689 if (cu->bdpcm_flag[tb->c_idx]) {
1947 31 inc = 67;
1948 } else {
1949
2/2
✓ Branch 0 taken 162305 times.
✓ Branch 1 taken 19353 times.
181658 const int l = xc > 0 ? sig_coeff_flag[-1] : 0;
1950
2/2
✓ Branch 0 taken 162309 times.
✓ Branch 1 taken 19349 times.
181658 const int a = yc > 0 ? sig_coeff_flag[-tb->tb_width] : 0;
1951 181658 inc = 64 + a + l;
1952 }
1953 181689 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1954 }
1955
1956 117907 static int abs_level_gtx_flag_ts_decode(VVCLocalContext *lc, const int j)
1957 {
1958 117907 const int inc = 67 + j;
1959 117907 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 166135 static int dec_abs_level_decode(VVCLocalContext *lc, const ResidualCoding *rc,
1967 const int xc, const int yc, int *abs_level)
1968 {
1969 166135 const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc, 0);
1970 166135 const int dec_abs_level = abs_decode(lc, c_rice_param);
1971
2/2
✓ Branch 0 taken 83816 times.
✓ Branch 1 taken 82319 times.
166135 const int zero_pos = (rc->qstate < 2 ? 1 : 2) << c_rice_param;
1972
1973 166135 *abs_level = 0;
1974
2/2
✓ Branch 0 taken 150850 times.
✓ Branch 1 taken 15285 times.
166135 if (dec_abs_level != zero_pos) {
1975 150850 *abs_level = dec_abs_level;
1976
2/2
✓ Branch 0 taken 101360 times.
✓ Branch 1 taken 49490 times.
150850 if (dec_abs_level < zero_pos)
1977 101360 *abs_level += 1;
1978 }
1979 166135 return dec_abs_level;
1980 }
1981
1982 387665 static void ep_update_hist(EntryPoint *ep, ResidualCoding *rc,
1983 const int remainder, const int addin)
1984 {
1985 387665 int *stat = ep->stat_coeff + rc->tb->c_idx;
1986
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 387665 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
387665 if (rc->update_hist && remainder > 0) {
1987 *stat = (*stat + av_log2(remainder) + addin) >> 1;
1988 rc->update_hist = 0;
1989 }
1990 387665 }
1991
1992 681658 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 681658 const VVCSPS *sps = lc->fc->ps.sps;
1997
2/2
✓ Branch 0 taken 60057 times.
✓ Branch 1 taken 621601 times.
681658 int log2_sb_w = (FFMIN(log2_zo_tb_width, log2_zo_tb_height ) < 2 ? 1 : 2 );
1998 681658 int log2_sb_h = log2_sb_w;
1999
2000
2/2
✓ Branch 0 taken 679923 times.
✓ Branch 1 taken 1735 times.
681658 if ( log2_zo_tb_width + log2_zo_tb_height > 3 ) {
2001
2/2
✓ Branch 0 taken 15251 times.
✓ Branch 1 taken 664672 times.
679923 if ( log2_zo_tb_width < 2 ) {
2002 15251 log2_sb_w = log2_zo_tb_width;
2003 15251 log2_sb_h = 4 - log2_sb_w;
2004
2/2
✓ Branch 0 taken 43071 times.
✓ Branch 1 taken 621601 times.
664672 } else if ( log2_zo_tb_height < 2 ) {
2005 43071 log2_sb_h = log2_zo_tb_height;
2006 43071 log2_sb_w = 4 - log2_sb_h;
2007 }
2008 }
2009 681658 rc->log2_sb_w = log2_sb_w;
2010 681658 rc->log2_sb_h = log2_sb_h;
2011 681658 rc->num_sb_coeff = 1 << (log2_sb_w + log2_sb_h);
2012 681658 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 681658 times.
681658 rc->hist_value = sps->r->sps_persistent_rice_adaptation_enabled_flag ? (1 << lc->ep->stat_coeff[tb->c_idx]) : 0;
2014 681658 rc->update_hist = sps->r->sps_persistent_rice_adaptation_enabled_flag ? 1 : 0;
2015 681658 rc->rem_bins_pass1 = (( 1 << ( log2_zo_tb_width + log2_zo_tb_height)) * 7 ) >> 2;
2016
2017
2018 681658 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 681658 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 681658 rc->scan_x_off = ff_vvc_diag_scan_x[log2_sb_w][log2_sb_h];
2022 681658 rc->scan_y_off = ff_vvc_diag_scan_y[log2_sb_w][log2_sb_h];
2023
2024 681658 rc->infer_sb_cbf = 1;
2025
2026 681658 rc->width_in_sbs = (1 << (log2_zo_tb_width - log2_sb_w));
2027 681658 rc->height_in_sbs = (1 << (log2_zo_tb_height - log2_sb_h));
2028 681658 rc->nb_sbs = rc->width_in_sbs * rc->height_in_sbs;
2029
2030 681658 rc->last_scan_pos = rc->num_sb_coeff;
2031 681658 rc->qstate = 0;
2032
2033 681658 rc->tb = tb;
2034 681658 }
2035
2036 122116 static int residual_ts_coding_subblock(VVCLocalContext *lc, ResidualCoding* rc, const int i)
2037 {
2038 122116 const CodingUnit *cu = lc->cu;
2039 122116 TransformBlock *tb = rc->tb;
2040 122116 const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
2041 122116 const int xs = rc->sb_scan_x_off[i];
2042 122116 const int ys = rc->sb_scan_y_off[i];
2043 122116 uint8_t *sb_coded_flag = rc->sb_coded_flag + ys * rc->width_in_sbs + xs;
2044 122116 int infer_sb_sig_coeff_flag = 1;
2045 122116 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 23132 times.
✓ Branch 1 taken 98984 times.
✓ Branch 2 taken 12817 times.
✓ Branch 3 taken 10315 times.
122116 if (i != rc->last_sub_block || !rc->infer_sb_cbf)
2050 111801 *sb_coded_flag = sb_coded_flag_decode(lc, sb_coded_flag, rc, xs, ys);
2051 else
2052 10315 *sb_coded_flag = 1;
2053
4/4
✓ Branch 0 taken 46412 times.
✓ Branch 1 taken 75704 times.
✓ Branch 2 taken 30093 times.
✓ Branch 3 taken 16319 times.
122116 if (*sb_coded_flag && i < rc->last_sub_block)
2054 30093 rc->infer_sb_cbf = 0;
2055
2056 //first scan pass
2057
4/4
✓ Branch 0 taken 1938890 times.
✓ Branch 1 taken 119234 times.
✓ Branch 2 taken 1936008 times.
✓ Branch 3 taken 2882 times.
2058124 for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2058 1936008 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2059 1936008 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2060 1936008 const int off = yc * tb->tb_width + xc;
2061 1936008 int *sig_coeff_flag = rc->sig_coeff_flag + off;
2062 1936008 int *abs_level_pass1 = rc->abs_level_pass1 + off;
2063 1936008 int *coeff_sign_level = rc->coeff_sign_level + off;
2064 1936008 int par_level_flag = 0;
2065
2066 1936008 abs_level_gtx_flag[n] = 0;
2067 1936008 last_scan_pos_pass1 = n;
2068
6/6
✓ Branch 0 taken 728104 times.
✓ Branch 1 taken 1207904 times.
✓ Branch 2 taken 43731 times.
✓ Branch 3 taken 684373 times.
✓ Branch 4 taken 41166 times.
✓ Branch 5 taken 2565 times.
1936008 if (*sb_coded_flag && (n != rc->num_sb_coeff - 1 || !infer_sb_sig_coeff_flag)) {
2069 725539 *sig_coeff_flag = sig_coeff_flag_decode(lc, rc, xc, yc);
2070 725539 rc->rem_bins_pass1--;
2071
2/2
✓ Branch 0 taken 179124 times.
✓ Branch 1 taken 546415 times.
725539 if (*sig_coeff_flag)
2072 179124 infer_sb_sig_coeff_flag = 0;
2073 } else {
2074
5/6
✓ Branch 0 taken 78068 times.
✓ Branch 1 taken 1132401 times.
✓ Branch 2 taken 78068 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2565 times.
✓ Branch 5 taken 75503 times.
1210469 *sig_coeff_flag = (n == rc->num_sb_coeff - 1) && infer_sb_sig_coeff_flag && *sb_coded_flag;
2075 }
2076 1936008 *coeff_sign_level = 0;
2077
2/2
✓ Branch 0 taken 181689 times.
✓ Branch 1 taken 1754319 times.
1936008 if (*sig_coeff_flag) {
2078 181689 *coeff_sign_level = 1 - 2 * coeff_sign_flag_ts_decode(lc, cu, rc, xc, yc);
2079 181689 abs_level_gtx_flag[n] = abs_level_gt1_flag_ts_decode(lc, cu, rc, xc, yc);
2080 181689 rc->rem_bins_pass1 -= 2;
2081
2/2
✓ Branch 0 taken 68129 times.
✓ Branch 1 taken 113560 times.
181689 if (abs_level_gtx_flag[n]) {
2082 68129 par_level_flag = par_level_flag_ts_decode(lc);
2083 68129 rc->rem_bins_pass1--;
2084 }
2085 }
2086 1936008 *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 1896722 times.
✓ Branch 1 taken 117884 times.
✓ Branch 2 taken 1892490 times.
✓ Branch 3 taken 4232 times.
2014606 for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2091 1892490 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2092 1892490 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2093 1892490 const int off = yc * tb->tb_width + xc;
2094
2095 1892490 abs_level_pass2[n] = rc->abs_level_pass1[off];
2096
4/4
✓ Branch 0 taken 1996187 times.
✓ Branch 1 taken 14210 times.
✓ Branch 2 taken 117907 times.
✓ Branch 3 taken 1878280 times.
2010397 for (int j = 1; j < 5 && abs_level_gtx_flag[n]; j++) {
2097 117907 abs_level_gtx_flag[n] = abs_level_gtx_flag_ts_decode(lc, j);
2098 117907 abs_level_pass2[n] += abs_level_gtx_flag[n] << 1;
2099 117907 rc->rem_bins_pass1--;
2100 }
2101 1892490 last_scan_pos_pass2 = n;
2102 }
2103
2104 /* remainder scan pass */
2105
2/2
✓ Branch 0 taken 1953568 times.
✓ Branch 1 taken 122116 times.
2075684 for (n = 0; n < rc->num_sb_coeff; n++) {
2106 1953568 const int