FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vvc/cabac.c
Date: 2025-01-20 09:27:23
Exec Total Coverage
Lines: 981 994 98.7%
Functions: 126 127 99.2%
Branches: 660 684 96.5%

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 273 static int cabac_reinit(VVCLocalContext *lc)
809 {
810
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 273 times.
273 return skip_bytes(&lc->ep->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
811 }
812
813 2196 static void cabac_init_state(VVCLocalContext *lc)
814 {
815 2196 const VVCSPS *sps = lc->fc->ps.sps;
816 2196 const H266RawSliceHeader *rsh = lc->sc->sh.r;
817 2196 const int qp = av_clip_uintp2(lc->sc->sh.slice_qp_y, 6);
818 2196 int init_type = 2 - rsh->sh_slice_type;
819
820 av_assert0(VVC_CONTEXTS == SYNTAX_ELEMENT_LAST);
821
822 2196 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 559 times.
✓ Branch 1 taken 1637 times.
✓ Branch 2 taken 559 times.
✗ Branch 3 not taken.
2196 if (rsh->sh_cabac_init_flag && !IS_I(rsh))
825 559 init_type ^= 3;
826
827
2/2
✓ Branch 0 taken 830088 times.
✓ Branch 1 taken 2196 times.
832284 for (int i = 0; i < VVC_CONTEXTS; i++) {
828 830088 VVCCabacState *state = &lc->ep->cabac_state[i];
829 830088 const int init_value = init_values[init_type][i];
830 830088 const int shift_idx = init_values[3][i];
831 830088 const int m = (init_value >> 3) - 4;
832 830088 const int n = ((init_value & 7) * 18) + 1;
833 830088 const int pre = av_clip(((m * (qp - 16)) >> 1) + n, 1, 127);
834
835 830088 state->state[0] = pre << 3;
836 830088 state->state[1] = pre << 7;
837 830088 state->shift[0] = (shift_idx >> 2 ) + 2;
838 830088 state->shift[1] = (shift_idx & 3 ) + 3 + state->shift[0];
839 }
840 2196 }
841
842 46705 int ff_vvc_cabac_init(VVCLocalContext *lc,
843 const int ctu_idx, const int rx, const int ry)
844 {
845 46705 int ret = 0;
846 46705 const VVCPPS *pps = lc->fc->ps.pps;
847 46705 const int first_ctb_in_slice = !ctu_idx;
848
4/4
✓ Branch 0 taken 5825 times.
✓ Branch 1 taken 40880 times.
✓ Branch 2 taken 2084 times.
✓ Branch 3 taken 3741 times.
46705 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 44996 times.
✓ Branch 1 taken 1709 times.
✓ Branch 2 taken 487 times.
✓ Branch 3 taken 44509 times.
46705 if (first_ctb_in_slice|| first_ctb_in_tile) {
851
4/4
✓ Branch 0 taken 1891 times.
✓ Branch 1 taken 305 times.
✓ Branch 2 taken 273 times.
✓ Branch 3 taken 1618 times.
2196 if (lc->sc->nb_eps == 1 && !first_ctb_in_slice)
852 273 ret = cabac_reinit(lc);
853
1/2
✓ Branch 0 taken 2196 times.
✗ Branch 1 not taken.
2196 if (!ret)
854 2196 cabac_init_state(lc);
855 }
856 46705 return ret;
857 }
858
859 //fixme
860 2046397 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 2046397 i = ff_ctz(c->low) - CABAC_BITS;
868 #endif
869
870 2046397 x = -CABAC_MASK;
871
872 #if CABAC_BITS == 16
873 2046397 x += (c->bytestream[0] << 9) + (c->bytestream[1] << 1);
874 #else
875 x += c->bytestream[0] << 1;
876 #endif
877
878 2046397 c->low += x << i;
879 #if !UNCHECKED_BITSTREAM_READER
880
2/2
✓ Branch 0 taken 2046287 times.
✓ Branch 1 taken 110 times.
2046397 if (c->bytestream < c->bytestream_end)
881 #endif
882 2046287 c->bytestream += CABAC_BITS / 8;
883 2046397 }
884
885 53075821 static int inline vvc_get_cabac(CABACContext *c, VVCCabacState* base, const int ctx)
886 {
887 53075821 VVCCabacState *s = base + ctx;
888 53075821 const int qRangeIdx = c->range >> 5;
889 53075821 const int pState = s->state[1] + (s->state[0] << 4);
890 53075821 const int valMps = pState >> 14;
891
2/2
✓ Branch 0 taken 21776860 times.
✓ Branch 1 taken 31298961 times.
53075821 const int RangeLPS = (qRangeIdx * ((valMps ? 32767 - pState : pState) >> 9 ) >> 1) + 4;
892 int bit, lps_mask;
893
894 53075821 c->range -= RangeLPS;
895 53075821 lps_mask = ((c->range<<(CABAC_BITS+1)) - c->low)>>31;
896
897 53075821 c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask;
898 53075821 c->range += (RangeLPS - c->range) & lps_mask;
899
900 53075821 bit = valMps ^ (lps_mask & 1);
901
902 53075821 lps_mask = ff_h264_norm_shift[c->range];
903 53075821 c->range <<= lps_mask;
904 53075821 c->low <<= lps_mask;
905
906
2/2
✓ Branch 0 taken 2046397 times.
✓ Branch 1 taken 51029424 times.
53075821 if (!(c->low & CABAC_MASK))
907 2046397 vvc_refill2(c);
908 53075821 s->state[0] = s->state[0] - (s->state[0] >> s->shift[0]) + (1023 * bit >> s->shift[0]);
909 53075821 s->state[1] = s->state[1] - (s->state[1] >> s->shift[1]) + (16383 * bit >> s->shift[1]);
910 53075821 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 239616 static int truncated_binary_decode(VVCLocalContext *lc, const int c_max)
917 {
918 239616 const int n = c_max + 1;
919 239616 const int k = av_log2(n);
920 239616 const int u = (1 << (k+1)) - n;
921 239616 int v = 0;
922
2/2
✓ Branch 0 taken 932762 times.
✓ Branch 1 taken 239616 times.
1172378 for (int i = 0; i < k; i++)
923 932762 v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
924
2/2
✓ Branch 0 taken 136735 times.
✓ Branch 1 taken 102881 times.
239616 if (v >= u) {
925 136735 v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
926 136735 v -= u;
927 }
928 239616 return v;
929 }
930
931 // 9.3.3.6 Limited k-th order Exp-Golomb binarization process
932 194757 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 194757 int pre_ext_len = 0;
935 int escape_length;
936 194757 int val = 0;
937
4/4
✓ Branch 0 taken 603057 times.
✓ Branch 1 taken 110 times.
✓ Branch 3 taken 408410 times.
✓ Branch 4 taken 194647 times.
603167 while ((pre_ext_len < max_pre_ext_len) && get_cabac_bypass(c))
938 408410 pre_ext_len++;
939
2/2
✓ Branch 0 taken 110 times.
✓ Branch 1 taken 194647 times.
194757 if (pre_ext_len == max_pre_ext_len)
940 110 escape_length = trunc_suffix_len;
941 else
942 194647 escape_length = pre_ext_len + k;
943
2/2
✓ Branch 0 taken 671348 times.
✓ Branch 1 taken 194757 times.
866105 while (escape_length-- > 0) {
944 671348 val = (val << 1) + get_cabac_bypass(c);
945 }
946 194757 val += ((1 << pre_ext_len) - 1) << k;
947 194757 return val;
948 }
949
950 static av_always_inline
951 3571598 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 3571598 const VVCFrameContext *fc = lc->fc;
955 3571598 const VVCSPS *sps = fc->ps.sps;
956 3571598 const int min_cb_width = fc->ps.pps->min_cb_width;
957 3571598 const int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
958 3571598 const int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
959 3571598 const int x_cb = x0 >> sps->min_cb_log2_size_y;
960 3571598 const int y_cb = y0 >> sps->min_cb_log2_size_y;
961
962
4/4
✓ Branch 0 taken 749821 times.
✓ Branch 1 taken 2821777 times.
✓ Branch 2 taken 626408 times.
✓ Branch 3 taken 123413 times.
3571598 if (lc->ctb_left_flag || x0b)
963 3448185 *left = SAMPLE_CTB(left_ctx, x_cb - 1, y_cb);
964
4/4
✓ Branch 0 taken 1119033 times.
✓ Branch 1 taken 2452565 times.
✓ Branch 2 taken 946220 times.
✓ Branch 3 taken 172813 times.
3571598 if (lc->ctb_up_flag || y0b)
965 3398785 *top = SAMPLE_CTB(top_ctx, x_cb, y_cb - 1);
966 3571598 }
967
968 static av_always_inline
969 553394 uint8_t get_inc(VVCLocalContext *lc, const uint8_t *ctx)
970 {
971 553394 uint8_t left = 0, top = 0;
972 553394 get_left_top(lc, &left, &top, lc->cu->x0, lc->cu->y0, ctx, ctx);
973 553394 return left + top;
974 }
975
976 23166 int ff_vvc_sao_merge_flag_decode(VVCLocalContext *lc)
977 {
978 23166 return GET_CABAC(SAO_MERGE_FLAG);
979 }
980
981 13126 int ff_vvc_sao_type_idx_decode(VVCLocalContext *lc)
982 {
983
2/2
✓ Branch 1 taken 8776 times.
✓ Branch 2 taken 4350 times.
13126 if (!GET_CABAC(SAO_TYPE_IDX))
984 8776 return SAO_NOT_APPLIED;
985
986
2/2
✓ Branch 1 taken 1175 times.
✓ Branch 2 taken 3175 times.
4350 if (!get_cabac_bypass(&lc->ep->cc))
987 1175 return SAO_BAND;
988 3175 return SAO_EDGE;
989 }
990
991 1353 int ff_vvc_sao_band_position_decode(VVCLocalContext *lc)
992 {
993 1353 int value = get_cabac_bypass(&lc->ep->cc);
994
995
2/2
✓ Branch 0 taken 5412 times.
✓ Branch 1 taken 1353 times.
6765 for (int i = 0; i < 4; i++)
996 5412 value = (value << 1) | get_cabac_bypass(&lc->ep->cc);
997 1353 return value;
998 }
999
1000 22552 int ff_vvc_sao_offset_abs_decode(VVCLocalContext *lc)
1001 {
1002 22552 int i = 0;
1003 22552 const int length = (1 << (FFMIN(lc->fc->ps.sps->bit_depth, 10) - 5)) - 1;
1004
1005
4/4
✓ Branch 0 taken 117515 times.
✓ Branch 1 taken 257 times.
✓ Branch 3 taken 95220 times.
✓ Branch 4 taken 22295 times.
117772 while (i < length && get_cabac_bypass(&lc->ep->cc))
1006 95220 i++;
1007 22552 return i;
1008 }
1009
1010 2469 int ff_vvc_sao_offset_sign_decode(VVCLocalContext *lc)
1011 {
1012 2469 return get_cabac_bypass(&lc->ep->cc);
1013 }
1014
1015 3175 int ff_vvc_sao_eo_class_decode(VVCLocalContext *lc)
1016 {
1017 3175 int ret = get_cabac_bypass(&lc->ep->cc) << 1;
1018 3175 ret |= get_cabac_bypass(&lc->ep->cc);
1019 3175 return ret;
1020 }
1021
1022 59418 int ff_vvc_alf_ctb_flag(VVCLocalContext *lc, const int rx, const int ry, const int c_idx)
1023 {
1024 59418 int inc = c_idx * 3;
1025 59418 const VVCFrameContext *fc = lc->fc;
1026
2/2
✓ Branch 0 taken 50499 times.
✓ Branch 1 taken 8919 times.
59418 if (lc->ctb_left_flag) {
1027 50499 const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1028 50499 inc += left->ctb_flag[c_idx];
1029 }
1030
2/2
✓ Branch 0 taken 44562 times.
✓ Branch 1 taken 14856 times.
59418 if (lc->ctb_up_flag) {
1031 44562 const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1032 44562 inc += above->ctb_flag[c_idx];
1033 }
1034 59418 return GET_CABAC(ALF_CTB_FLAG + inc);
1035 }
1036
1037 18743 int ff_vvc_alf_use_aps_flag(VVCLocalContext *lc)
1038 {
1039 18743 return GET_CABAC(ALF_USE_APS_FLAG);
1040 }
1041
1042 4928 int ff_vvc_alf_luma_prev_filter_idx(VVCLocalContext *lc)
1043 {
1044 4928 return truncated_binary_decode(lc, lc->sc->sh.r->sh_num_alf_aps_ids_luma - 1);
1045 }
1046
1047 2775 int ff_vvc_alf_luma_fixed_filter_idx(VVCLocalContext *lc)
1048 {
1049 2775 return truncated_binary_decode(lc, 15);
1050 }
1051
1052 16033 int ff_vvc_alf_ctb_filter_alt_idx(VVCLocalContext *lc, const int c_idx, const int num_chroma_filters)
1053 {
1054 16033 int i = 0;
1055 16033 const int length = num_chroma_filters - 1;
1056
1057
4/4
✓ Branch 0 taken 29261 times.
✓ Branch 1 taken 2861 times.
✓ Branch 3 taken 16089 times.
✓ Branch 4 taken 13172 times.
32122 while (i < length && GET_CABAC(ALF_CTB_FILTER_ALT_IDX + c_idx - 1))
1058 16089 i++;
1059 16033 return i;
1060 }
1061
1062 22609 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 12146 times.
✓ Branch 1 taken 10463 times.
22609 int inc = !idx ? ALF_CTB_CC_CB_IDC : ALF_CTB_CC_CR_IDC;
1065 22609 int i = 0;
1066 22609 const VVCFrameContext *fc = lc->fc;
1067
2/2
✓ Branch 0 taken 19914 times.
✓ Branch 1 taken 2695 times.
22609 if (lc->ctb_left_flag) {
1068 19914 const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1069 19914 inc += left->ctb_cc_idc[idx] != 0;
1070 }
1071
2/2
✓ Branch 0 taken 18700 times.
✓ Branch 1 taken 3909 times.
22609 if (lc->ctb_up_flag) {
1072 18700 const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1073 18700 inc += above->ctb_cc_idc[idx] != 0;
1074 }
1075
1076
2/2
✓ Branch 1 taken 12090 times.
✓ Branch 2 taken 10519 times.
22609 if (!GET_CABAC(inc))
1077 12090 return 0;
1078 10519 i++;
1079
4/4
✓ Branch 0 taken 17800 times.
✓ Branch 1 taken 1904 times.
✓ Branch 3 taken 9185 times.
✓ Branch 4 taken 8615 times.
19704 while (i < cc_filters_signalled && get_cabac_bypass(&lc->ep->cc))
1080 9185 i++;
1081 10519 return i;
1082 }
1083
1084 2030593 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 2030593 const VVCFrameContext *fc = lc->fc;
1088 2030593 const VVCPPS *pps = fc->ps.pps;
1089
4/4
✓ Branch 0 taken 2025929 times.
✓ Branch 1 taken 4664 times.
✓ Branch 2 taken 1977957 times.
✓ Branch 3 taken 47972 times.
2030593 const int is_inside = (x0 + cb_width <= pps->width) && (y0 + cb_height <= pps->height);
1090
1091
12/12
✓ Branch 0 taken 810596 times.
✓ Branch 1 taken 1219997 times.
✓ Branch 2 taken 588200 times.
✓ Branch 3 taken 222396 times.
✓ Branch 4 taken 582444 times.
✓ Branch 5 taken 5756 times.
✓ Branch 6 taken 580859 times.
✓ Branch 7 taken 1585 times.
✓ Branch 8 taken 49300 times.
✓ Branch 9 taken 531559 times.
✓ Branch 10 taken 1446398 times.
✓ Branch 11 taken 52636 times.
2030593 if ((a->btv || a->bth || a->ttv || a->tth || a->qt) && is_inside)
1092 {
1093 1446398 uint8_t inc = 0, left_height = cb_height, top_width = cb_width;
1094
1095 1446398 get_left_top(lc, &left_height, &top_width, x0, y0, fc->tab.cb_height[is_chroma], fc->tab.cb_width[is_chroma]);
1096 1446398 inc += left_height < cb_height;
1097 1446398 inc += top_width < cb_width;
1098 1446398 inc += (a->btv + a->bth + a->ttv + a->tth + 2 * a->qt - 1) / 2 * 3;
1099
1100 1446398 return GET_CABAC(SPLIT_CU_FLAG + inc);
1101
1102 }
1103 584195 return !is_inside;
1104 }
1105
1106 262070 static int split_qt_flag_decode(VVCLocalContext *lc, const int x0, const int y0, const int ch_type, const int cqt_depth)
1107 {
1108 262070 const VVCFrameContext *fc = lc->fc;
1109 262070 int inc = 0;
1110 262070 uint8_t depth_left = 0, depth_top = 0;
1111
1112 262070 get_left_top(lc, &depth_left, &depth_top, x0, y0, fc->tab.cqt_depth[ch_type], fc->tab.cqt_depth[ch_type]);
1113 262070 inc += depth_left > cqt_depth;
1114 262070 inc += depth_top > cqt_depth;
1115
2/2
✓ Branch 0 taken 196950 times.
✓ Branch 1 taken 65120 times.
262070 inc += (cqt_depth >= 2) * 3;
1116
1117 262070 return GET_CABAC(SPLIT_QT_FLAG + inc);
1118 }
1119
1120 699053 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 79420 times.
✓ Branch 1 taken 619633 times.
✓ Branch 2 taken 16485 times.
✓ Branch 3 taken 62935 times.
✓ Branch 4 taken 114748 times.
✓ Branch 5 taken 521370 times.
✓ Branch 6 taken 13825 times.
✓ Branch 7 taken 100923 times.
699053 if ((a->bth || a->tth) && (a->btv || a->ttv)) {
1124 int inc;
1125 535195 const int v = a->btv + a->ttv;
1126 535195 const int h = a->bth + a->tth;
1127
2/2
✓ Branch 0 taken 84364 times.
✓ Branch 1 taken 450831 times.
535195 if (v > h)
1128 84364 inc = 4;
1129
2/2
✓ Branch 0 taken 86668 times.
✓ Branch 1 taken 364163 times.
450831 else if (v < h)
1130 86668 inc = 3;
1131 else {
1132 364163 const VVCFrameContext *fc = lc->fc;
1133 364163 const VVCSPS *sps = fc->ps.sps;
1134 364163 const int min_cb_width = fc->ps.pps->min_cb_width;
1135 364163 const int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
1136 364163 const int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
1137 364163 const int x_cb = x0 >> sps->min_cb_log2_size_y;
1138 364163 const int y_cb = y0 >> sps->min_cb_log2_size_y;
1139
4/4
✓ Branch 0 taken 109461 times.
✓ Branch 1 taken 254702 times.
✓ Branch 2 taken 89807 times.
✓ Branch 3 taken 19654 times.
364163 const int available_a = lc->ctb_up_flag || y0b;
1140
4/4
✓ Branch 0 taken 69230 times.
✓ Branch 1 taken 294933 times.
✓ Branch 2 taken 54229 times.
✓ Branch 3 taken 15001 times.
364163 const int available_l = lc->ctb_left_flag || x0b;
1141
2/2
✓ Branch 0 taken 344509 times.
✓ Branch 1 taken 19654 times.
364163 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 349162 times.
✓ Branch 1 taken 15001 times.
364163 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 265972 times.
✓ Branch 1 taken 98191 times.
✓ Branch 2 taken 247765 times.
✓ Branch 3 taken 18207 times.
✓ Branch 4 taken 12912 times.
✓ Branch 5 taken 234853 times.
364163 if (da == dl || !available_a || !available_l)
1145 129310 inc = 0;
1146
2/2
✓ Branch 0 taken 120999 times.
✓ Branch 1 taken 113854 times.
234853 else if (da < dl)
1147 120999 inc = 1;
1148 else
1149 113854 inc = 2;
1150 }
1151 535195 return GET_CABAC(MTT_SPLIT_CU_VERTICAL_FLAG + inc);
1152 }
1153
4/4
✓ Branch 0 taken 63681 times.
✓ Branch 1 taken 100177 times.
✓ Branch 2 taken 62935 times.
✓ Branch 3 taken 746 times.
163858 return !(a->bth || a->tth);
1154 }
1155
1156 469846 static int mtt_split_cu_binary_flag_decode(VVCLocalContext *lc, const int mtt_split_cu_vertical_flag, const int mtt_depth)
1157 {
1158 469846 const int inc = (2 * mtt_split_cu_vertical_flag) + ((mtt_depth <= 1) ? 1 : 0);
1159 469846 return GET_CABAC(MTT_SPLIT_CU_BINARY_FLAG + inc);
1160 }
1161
1162 798524 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 155222 times.
✓ Branch 1 taken 643302 times.
✓ Branch 2 taken 38098 times.
✓ Branch 3 taken 117124 times.
✓ Branch 4 taken 33858 times.
✓ Branch 5 taken 4240 times.
✓ Branch 6 taken 746 times.
✓ Branch 7 taken 33112 times.
798524 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 798524 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 765412 times.
✓ Branch 1 taken 33112 times.
✓ Branch 2 taken 262070 times.
✓ Branch 3 taken 503342 times.
798524 if (allow_no_qt && a->qt) {
1173 262070 split_qt_flag = split_qt_flag_decode(lc, x0, y0, ch_type, cqt_depth);
1174 } else {
1175
3/4
✓ Branch 0 taken 503342 times.
✓ Branch 1 taken 33112 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 503342 times.
536454 split_qt_flag = !allow_no_qt || a->qt;
1176 }
1177
2/2
✓ Branch 0 taken 99471 times.
✓ Branch 1 taken 699053 times.
798524 if (split_qt_flag)
1178 99471 return SPLIT_QT;
1179 699053 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 583454 times.
✓ Branch 1 taken 115599 times.
✓ Branch 2 taken 410246 times.
✓ Branch 3 taken 173208 times.
✓ Branch 4 taken 182162 times.
✓ Branch 5 taken 228084 times.
699053 if ((a->btv && a->ttv && mtt_split_cu_vertical_flag) ||
1181
6/6
✓ Branch 0 taken 436340 times.
✓ Branch 1 taken 34629 times.
✓ Branch 2 taken 272082 times.
✓ Branch 3 taken 164258 times.
✓ Branch 4 taken 241762 times.
✓ Branch 5 taken 30320 times.
470969 (a->bth && a->tth && !mtt_split_cu_vertical_flag)) {
1182 469846 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 72666 times.
✓ Branch 1 taken 156541 times.
✓ Branch 2 taken 2322 times.
✓ Branch 3 taken 70344 times.
229207 if (!a->btv && !a->bth)
1185 2322 mtt_split_cu_binary_flag = 0;
1186
4/4
✓ Branch 0 taken 189576 times.
✓ Branch 1 taken 37309 times.
✓ Branch 2 taken 161204 times.
✓ Branch 3 taken 28372 times.
226885 else if (!a->ttv && !a->tth)
1187 161204 mtt_split_cu_binary_flag = 1;
1188
4/4
✓ Branch 0 taken 59011 times.
✓ Branch 1 taken 6670 times.
✓ Branch 2 taken 32512 times.
✓ Branch 3 taken 26499 times.
65681 else if (a->bth && a->ttv)
1189 32512 mtt_split_cu_binary_flag = 1 - mtt_split_cu_vertical_flag;
1190 else
1191 33169 mtt_split_cu_binary_flag = mtt_split_cu_vertical_flag;
1192 }
1193 699053 return mtt_split_modes[(mtt_split_cu_vertical_flag << 1) + mtt_split_cu_binary_flag];
1194 }
1195
1196 41362 int ff_vvc_non_inter_flag(VVCLocalContext *lc, const int x0, const int y0, const int ch_type)
1197 {
1198 41362 const VVCFrameContext *fc = lc->fc;
1199 41362 uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1200
1201 41362 get_left_top(lc, &left, &top, x0, y0, fc->tab.cpm[ch_type], fc->tab.cpm[ch_type]);
1202
4/4
✓ Branch 0 taken 30263 times.
✓ Branch 1 taken 11099 times.
✓ Branch 2 taken 5667 times.
✓ Branch 3 taken 24596 times.
41362 inc = left == MODE_INTRA || top == MODE_INTRA;
1203 41362 return GET_CABAC(NON_INTER_FLAG + inc);
1204 }
1205
1206 199114 int ff_vvc_pred_mode_flag(VVCLocalContext *lc, const int is_chroma)
1207 {
1208 199114 const VVCFrameContext *fc = lc->fc;
1209 199114 const CodingUnit *cu = lc->cu;
1210 199114 uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1211
1212 199114 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 156650 times.
✓ Branch 1 taken 42464 times.
✓ Branch 2 taken 17811 times.
✓ Branch 3 taken 138839 times.
199114 inc = left == MODE_INTRA || top == MODE_INTRA;
1214 199114 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 27878 int ff_vvc_intra_bdpcm_luma_flag(VVCLocalContext *lc)
1223 {
1224 27878 return GET_CABAC(INTRA_BDPCM_LUMA_FLAG);
1225 }
1226
1227 38 int ff_vvc_intra_bdpcm_luma_dir_flag(VVCLocalContext *lc)
1228 {
1229 38 return GET_CABAC(INTRA_BDPCM_LUMA_DIR_FLAG);
1230 }
1231
1232 24174 int ff_vvc_intra_bdpcm_chroma_flag(VVCLocalContext *lc)
1233 {
1234 24174 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 553394 int ff_vvc_cu_skip_flag(VVCLocalContext *lc, const uint8_t *cu_skip_flag)
1243 {
1244 553394 const int inc = get_inc(lc, cu_skip_flag);
1245 553394 return GET_CABAC(CU_SKIP_FLAG + inc);
1246 }
1247
1248 84747 int ff_vvc_pred_mode_ibc_flag(VVCLocalContext *lc, const int is_chroma)
1249 {
1250 84747 const VVCFrameContext *fc = lc->fc;
1251 84747 const CodingUnit *cu = lc->cu;
1252 84747 uint8_t left_mode = MODE_INTER, top_mode = MODE_INTER;
1253 int inc;
1254
1255 84747 get_left_top(lc, &left_mode, &top_mode, cu->x0, cu->y0, fc->tab.cpm[is_chroma], fc->tab.cpm[is_chroma]);
1256 84747 inc = (left_mode == MODE_IBC) + (top_mode == MODE_IBC);
1257 84747 return GET_CABAC(PRED_MODE_IBC_FLAG + inc);
1258 }
1259
1260 static av_always_inline
1261 358065 uint8_t get_mip_inc(VVCLocalContext *lc, const uint8_t *ctx)
1262 {
1263 358065 uint8_t left = 0, top = 0;
1264 358065 get_left_top(lc, &left, &top, lc->cu->x0, lc->cu->y0, ctx, ctx);
1265 358065 return (left & 1) + (top & 1);
1266 }
1267
1268 453580 int ff_vvc_intra_mip_flag(VVCLocalContext *lc, const uint8_t *intra_mip_flag)
1269 {
1270 453580 const int w = lc->cu->cb_width;
1271 453580 const int h = lc->cu->cb_height;
1272
4/4
✓ Branch 0 taken 384232 times.
✓ Branch 1 taken 69348 times.
✓ Branch 2 taken 358065 times.
✓ Branch 3 taken 26167 times.
453580 const int inc = (w > h * 2 || h > w * 2) ? 3 : get_mip_inc(lc, intra_mip_flag);
1273 453580 return GET_CABAC(INTRA_MIP_FLAG + inc);
1274 }
1275
1276 108018 int ff_vvc_intra_mip_transposed_flag(VVCLocalContext *lc)
1277 {
1278 108018 return get_cabac_bypass(&lc->ep->cc);
1279 }
1280
1281 108018 int ff_vvc_intra_mip_mode(VVCLocalContext *lc)
1282 {
1283 108018 const int w = lc->cu->cb_width;
1284 108018 const int h = lc->cu->cb_height;
1285
4/4
✓ Branch 0 taken 31050 times.
✓ Branch 1 taken 76968 times.
✓ Branch 2 taken 15739 times.
✓ Branch 3 taken 15311 times.
200725 const int c_max = (w == 4 && h == 4) ? 15 :
1286
8/8
✓ Branch 0 taken 76968 times.
✓ Branch 1 taken 15739 times.
✓ Branch 2 taken 54009 times.
✓ Branch 3 taken 22959 times.
✓ Branch 4 taken 17924 times.
✓ Branch 5 taken 36085 times.
✓ Branch 6 taken 10585 times.
✓ Branch 7 taken 7339 times.
92707 ((w == 4 || h == 4) || (w == 8 && h == 8)) ? 7: 5;
1287 108018 return truncated_binary_decode(lc, c_max);
1288 }
1289
1290 429638 int ff_vvc_intra_luma_ref_idx(VVCLocalContext *lc)
1291 {
1292 int i;
1293
2/2
✓ Branch 0 taken 473035 times.
✓ Branch 1 taken 25423 times.
498458 for (i = 0; i < 2; i++) {
1294
2/2
✓ Branch 1 taken 404215 times.
✓ Branch 2 taken 68820 times.
473035 if (!GET_CABAC(INTRA_LUMA_REF_IDX + i))
1295 404215 return i;
1296 }
1297 25423 return i;
1298 }
1299
1300 361942 int ff_vvc_intra_subpartitions_mode_flag(VVCLocalContext *lc)
1301 {
1302 361942 return GET_CABAC(INTRA_SUBPARTITIONS_MODE_FLAG);
1303 }
1304
1305 488004 enum IspType ff_vvc_isp_split_type(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1306 {
1307
2/2
✓ Branch 0 taken 425600 times.
✓ Branch 1 taken 62404 times.
488004 if (!intra_subpartitions_mode_flag)
1308 425600 return ISP_NO_SPLIT;
1309 62404 return 1 + GET_CABAC(INTRA_SUBPARTITIONS_SPLIT_FLAG);
1310 }
1311
1312 444607 int ff_vvc_intra_luma_mpm_flag(VVCLocalContext *lc)
1313 {
1314 444607 return GET_CABAC(INTRA_LUMA_MPM_FLAG);
1315 }
1316
1317 320712 int ff_vvc_intra_luma_not_planar_flag(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1318 {
1319
2/2
✓ Branch 0 taken 273223 times.
✓ Branch 1 taken 47489 times.
320712 return GET_CABAC(INTRA_LUMA_NOT_PLANAR_FLAG + !intra_subpartitions_mode_flag);
1320 }
1321
1322 192364 int ff_vvc_intra_luma_mpm_idx(VVCLocalContext *lc)
1323 {
1324 int i;
1325
4/4
✓ Branch 0 taken 361848 times.
✓ Branch 1 taken 14227 times.
✓ Branch 3 taken 183711 times.
✓ Branch 4 taken 178137 times.
376075 for (i = 0; i < 4 && get_cabac_bypass(&lc->ep->cc); i++)
1326 /* nothing */;
1327 192364 return i;
1328 }
1329
1330 123895 int ff_vvc_intra_luma_mpm_remainder(VVCLocalContext *lc)
1331 {
1332 123895 return truncated_binary_decode(lc, 60);
1333 }
1334
1335 205594 int ff_vvc_cclm_mode_flag(VVCLocalContext *lc)
1336 {
1337 205594 return GET_CABAC(CCLM_MODE_FLAG);
1338 }
1339
1340 91243 int ff_vvc_cclm_mode_idx(VVCLocalContext *lc)
1341 {
1342
2/2
✓ Branch 1 taken 51050 times.
✓ Branch 2 taken 40193 times.
91243 if (!GET_CABAC(CCLM_MODE_IDX))
1343 51050 return 0;
1344 40193 return get_cabac_bypass(&lc->ep->cc) + 1;
1345 }
1346
1347 135741 int ff_vvc_intra_chroma_pred_mode(VVCLocalContext *lc)
1348 {
1349
2/2
✓ Branch 1 taken 92739 times.
✓ Branch 2 taken 43002 times.
135741 if (!GET_CABAC(INTRA_CHROMA_PRED_MODE))
1350 92739 return 4;
1351 43002 return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1352 }
1353
1354 209686 int ff_vvc_general_merge_flag(VVCLocalContext *lc)
1355 {
1356 209686 return GET_CABAC(GENERAL_MERGE_FLAG);
1357 }
1358
1359 313224 static int get_inter_flag_inc(VVCLocalContext *lc, const int x0, const int y0)
1360 {
1361 313224 uint8_t left_merge = 0, top_merge = 0;
1362 313224 uint8_t left_affine = 0, top_affine = 0;
1363 313224 const VVCFrameContext *fc = lc->fc;
1364
1365 313224 get_left_top(lc, &left_merge, &top_merge, x0, y0, fc->tab.msf, fc->tab.msf);
1366 313224 get_left_top(lc, &left_affine, &top_affine, x0, y0, fc->tab.iaf, fc->tab.iaf);
1367
4/4
✓ Branch 0 taken 272925 times.
✓ Branch 1 taken 40299 times.
✓ Branch 2 taken 9757 times.
✓ Branch 3 taken 263168 times.
313224 return (left_merge || left_affine) + (top_merge + top_affine);
1368 }
1369
1370 284568 int ff_vvc_merge_subblock_flag(VVCLocalContext *lc)
1371 {
1372 284568 const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1373 284568 return GET_CABAC(MERGE_SUBBLOCK_FLAG + inc);
1374 }
1375
1376 50089 int ff_vvc_merge_subblock_idx(VVCLocalContext *lc, const int max_num_subblock_merge_cand)
1377 {
1378 int i;
1379
2/2
✓ Branch 1 taken 29855 times.
✓ Branch 2 taken 20234 times.
50089 if (!GET_CABAC(MERGE_SUBBLOCK_IDX))
1380 29855 return 0;
1381
4/4
✓ Branch 0 taken 33758 times.
✓ Branch 1 taken 2730 times.
✓ Branch 3 taken 16254 times.
✓ Branch 4 taken 17504 times.
36488 for (i = 1; i < max_num_subblock_merge_cand - 1 && get_cabac_bypass(&lc->ep->cc); i++)
1382 /* nothing */;
1383 20234 return i;
1384 }
1385
1386 218011 int ff_vvc_regular_merge_flag(VVCLocalContext *lc, const int cu_skip_flag)
1387 {
1388 218011 int inc = !cu_skip_flag;
1389 218011 return GET_CABAC(REGULAR_MERGE_FLAG + inc);
1390 }
1391
1392 252561 int ff_vvc_mmvd_merge_flag(VVCLocalContext *lc)
1393 {
1394 252561 return GET_CABAC(MMVD_MERGE_FLAG);
1395 }
1396
1397 55977 int ff_vvc_mmvd_cand_flag(VVCLocalContext *lc)
1398 {
1399 55977 return GET_CABAC(MMVD_CAND_FLAG);
1400 }
1401
1402 55977 static int mmvd_distance_idx_decode(VVCLocalContext *lc)
1403 {
1404 int i;
1405
2/2
✓ Branch 1 taken 14503 times.
✓ Branch 2 taken 41474 times.
55977 if (!GET_CABAC(MMVD_DISTANCE_IDX))
1406 14503 return 0;
1407
4/4
✓ Branch 0 taken 81142 times.
✓ Branch 1 taken 225 times.
✓ Branch 3 taken 39893 times.
✓ Branch 4 taken 41249 times.
81367 for (i = 1; i < 7 && get_cabac_bypass(&lc->ep->cc); i++)
1408 /* nothing */;
1409 41474 return i;
1410 }
1411
1412 55977 static int mmvd_direction_idx_decode(VVCLocalContext *lc)
1413 {
1414 55977 return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1415 }
1416
1417 55977 void ff_vvc_mmvd_offset_coding(VVCLocalContext *lc, Mv *mmvd_offset, const int ph_mmvd_fullpel_only_flag)
1418 {
1419
2/2
✓ Branch 0 taken 660 times.
✓ Branch 1 taken 55317 times.
55977 const int shift = ph_mmvd_fullpel_only_flag ? 4 : 2;
1420 55977 const int mmvd_distance = 1 << (mmvd_distance_idx_decode(lc) + shift);
1421 55977 const int mmvd_direction_idx = mmvd_direction_idx_decode(lc);
1422 55977 const int mmvd_signs[][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
1423 55977 mmvd_offset->x = mmvd_distance * mmvd_signs[mmvd_direction_idx][0];
1424 55977 mmvd_offset->y = mmvd_distance * mmvd_signs[mmvd_direction_idx][1];
1425 55977 }
1426
1427 231340 static PredMode get_luma_pred_mode(VVCLocalContext *lc)
1428 {
1429 231340 const VVCFrameContext *fc = lc->fc;
1430 231340 const CodingUnit *cu = lc->cu;
1431 PredMode pred_mode;
1432
1433
1/2
✓ Branch 0 taken 231340 times.
✗ Branch 1 not taken.
231340 if (cu->tree_type != DUAL_TREE_CHROMA) {
1434 231340 pred_mode = cu->pred_mode;
1435 } else {
1436 const int x_cb = cu->x0 >> fc->ps.sps->min_cb_log2_size_y;
1437 const int y_cb = cu->y0 >> fc->ps.sps->min_cb_log2_size_y;
1438 const int min_cb_width = fc->ps.pps->min_cb_width;
1439 pred_mode = SAMPLE_CTB(fc->tab.cpm[0], x_cb, y_cb);
1440 }
1441 231340 return pred_mode;
1442 }
1443
1444 231340 int ff_vvc_merge_idx(VVCLocalContext *lc)
1445 {
1446 231340 const VVCSPS *sps = lc->fc->ps.sps;
1447 231340 const int is_ibc = get_luma_pred_mode(lc) == MODE_IBC;
1448
2/2
✓ Branch 0 taken 13906 times.
✓ Branch 1 taken 217434 times.
231340 const int c_max = (is_ibc ? sps->max_num_ibc_merge_cand : sps->max_num_merge_cand) - 1;
1449 int i;
1450
1451
2/2
✓ Branch 1 taken 136794 times.
✓ Branch 2 taken 94546 times.
231340 if (!GET_CABAC(MERGE_IDX))
1452 136794 return 0;
1453
1454
4/4
✓ Branch 0 taken 181312 times.
✓ Branch 1 taken 10385 times.
✓ Branch 3 taken 97151 times.
✓ Branch 4 taken 84161 times.
191697 for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1455 /* nothing */;
1456 94546 return i;
1457 }
1458
1459 25615 int ff_vvc_merge_gpm_partition_idx(VVCLocalContext *lc)
1460 {
1461 25615 int i = 0;
1462
1463
2/2
✓ Branch 0 taken 153690 times.
✓ Branch 1 taken 25615 times.
179305 for (int j = 0; j < 6; j++)
1464 153690 i = (i << 1) | get_cabac_bypass(&lc->ep->cc);
1465
1466 25615 return i;
1467 }
1468
1469 51230 int ff_vvc_merge_gpm_idx(VVCLocalContext *lc, const int idx)
1470 {
1471 51230 const int c_max = lc->fc->ps.sps->max_num_gpm_merge_cand - idx - 1;
1472 int i;
1473
1474
2/2
✓ Branch 1 taken 28165 times.
✓ Branch 2 taken 23065 times.
51230 if (!GET_CABAC(MERGE_IDX))
1475 28165 return 0;
1476
1477
4/4
✓ Branch 0 taken 41020 times.
✓ Branch 1 taken 3879 times.
✓ Branch 3 taken 21834 times.
✓ Branch 4 taken 19186 times.
44899 for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1478 /* nothing */;
1479
1480 23065 return i;
1481 }
1482
1483 19469 int ff_vvc_ciip_flag(VVCLocalContext *lc)
1484 {
1485 19469 return GET_CABAC(CIIP_FLAG);
1486 }
1487
1488 74951 PredFlag ff_vvc_pred_flag(VVCLocalContext *lc, const int is_b)
1489 {
1490 74951 const int w = lc->cu->cb_width;
1491 74951 const int h = lc->cu->cb_height;
1492
2/2
✓ Branch 0 taken 7045 times.
✓ Branch 1 taken 67906 times.
74951 if (!is_b)
1493 7045 return PF_L0;
1494
2/2
✓ Branch 0 taken 59238 times.
✓ Branch 1 taken 8668 times.
67906 if (w + h > 12) {
1495 59238 const int log2 = av_log2(w) + av_log2(h);
1496 59238 const int inc = 7 - ((1 + log2)>>1);
1497
2/2
✓ Branch 1 taken 20574 times.
✓ Branch 2 taken 38664 times.
59238 if (GET_CABAC(INTER_PRED_IDC + inc))
1498 20574 return PF_BI;
1499 }
1500 47332 return PF_L0 + GET_CABAC(INTER_PRED_IDC + 5);
1501 }
1502
1503 28656 int ff_vvc_inter_affine_flag(VVCLocalContext *lc)
1504 {
1505 28656 const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1506 28656 return GET_CABAC(INTER_AFFINE_FLAG + inc);
1507 }
1508
1509 9103 int ff_vvc_cu_affine_type_flag(VVCLocalContext *lc)
1510 {
1511 9103 return GET_CABAC(CU_AFFINE_TYPE_FLAG);
1512 }
1513
1514 12092 int ff_vvc_sym_mvd_flag(VVCLocalContext *lc)
1515 {
1516 12092 return GET_CABAC(SYM_MVD_FLAG);
1517 }
1518
1519 66272 int ff_vvc_ref_idx_lx(VVCLocalContext *lc, const uint8_t nb_refs)
1520 {
1521 66272 const int c_max = nb_refs - 1;
1522 66272 const int max_ctx = FFMIN(c_max, 2);
1523 66272 int i = 0;
1524
1525
4/4
✓ Branch 0 taken 82333 times.
✓ Branch 1 taken 25615 times.
✓ Branch 3 taken 41676 times.
✓ Branch 4 taken 40657 times.
107948 while (i < max_ctx && GET_CABAC(REF_IDX_LX + i))
1526 41676 i++;
1527
2/2
✓ Branch 0 taken 14657 times.
✓ Branch 1 taken 51615 times.
66272 if (i == 2) {
1528
4/4
✓ Branch 0 taken 44898 times.
✓ Branch 1 taken 10367 times.
✓ Branch 3 taken 40608 times.
✓ Branch 4 taken 4290 times.
55265 while (i < c_max && get_cabac_bypass(&lc->ep->cc))
1529 40608 i++;
1530 }
1531 66272 return i;
1532 }
1533
1534 235848 int ff_vvc_abs_mvd_greater0_flag(VVCLocalContext *lc)
1535 {
1536 235848 return GET_CABAC(ABS_MVD_GREATER0_FLAG);
1537 }
1538
1539 164462 int ff_vvc_abs_mvd_greater1_flag(VVCLocalContext *lc)
1540 {
1541 164462 return GET_CABAC(ABS_MVD_GREATER1_FLAG);
1542 }
1543
1544 111369 int ff_vvc_abs_mvd_minus2(VVCLocalContext *lc)
1545 {
1546 111369 return limited_kth_order_egk_decode(&lc->ep->cc, 1, 15, 17);
1547 }
1548
1549 164462 int ff_vvc_mvd_sign_flag(VVCLocalContext *lc)
1550 {
1551 164462 return get_cabac_bypass(&lc->ep->cc);
1552 }
1553
1554 111219 int ff_vvc_mvp_lx_flag(VVCLocalContext *lc)
1555 {
1556 111219 return GET_CABAC(MVP_LX_FLAG);
1557 }
1558
1559 69293 static int amvr_flag(VVCLocalContext *lc, const int inter_affine_flag)
1560 {
1561 69293 return GET_CABAC(AMVR_FLAG + inter_affine_flag);
1562 }
1563
1564 57086 static int amvr_precision_idx(VVCLocalContext *lc, const int inc, const int c_max)
1565 {
1566 57086 int i = 0;
1567
2/2
✓ Branch 1 taken 13229 times.
✓ Branch 2 taken 43857 times.
57086 if (!GET_CABAC(AMVR_PRECISION_IDX + inc))
1568 13229 return 0;
1569 43857 i++;
1570
4/4
✓ Branch 0 taken 32761 times.
✓ Branch 1 taken 11096 times.
✓ Branch 3 taken 10704 times.
✓ Branch 4 taken 22057 times.
43857 if (i < c_max && GET_CABAC(AMVR_PRECISION_IDX + 1))
1571 10704 i++;
1572 43857 return i;
1573 }
1574
1575 84834 int ff_vvc_amvr_shift(VVCLocalContext *lc, const int inter_affine_flag,
1576 const PredMode pred_mode, const int has_amvr_flag)
1577 {
1578 84834 int amvr_shift = 2;
1579
2/2
✓ Branch 0 taken 79176 times.
✓ Branch 1 taken 5658 times.
84834 if (has_amvr_flag) {
1580
4/4
✓ Branch 0 taken 69293 times.
✓ Branch 1 taken 9883 times.
✓ Branch 3 taken 47203 times.
✓ Branch 4 taken 22090 times.
79176 if (pred_mode == MODE_IBC || amvr_flag(lc, inter_affine_flag)) {
1581 int idx;
1582
2/2
✓ Branch 0 taken 4504 times.
✓ Branch 1 taken 52582 times.
57086 if (inter_affine_flag) {
1583 4504 idx = amvr_precision_idx(lc, 2, 1);
1584 4504 amvr_shift = idx * 4;
1585
2/2
✓ Branch 0 taken 9883 times.
✓ Branch 1 taken 42699 times.
52582 } else if (pred_mode == MODE_IBC) {
1586 9883 idx = amvr_precision_idx(lc, 1, 1);
1587 9883 amvr_shift = 4 + idx * 2;
1588 } else {
1589 static const int shifts[] = {3, 4, 6};
1590 42699 idx = amvr_precision_idx(lc, 0, 2);
1591 42699 amvr_shift = shifts[idx];
1592 }
1593 }
1594 }
1595 84834 return amvr_shift;
1596 }
1597
1598 11245 int ff_vvc_bcw_idx(VVCLocalContext *lc, const int no_backward_pred_flag)
1599 {
1600
2/2
✓ Branch 0 taken 2438 times.
✓ Branch 1 taken 8807 times.
11245 const int c_max = no_backward_pred_flag ? 4 : 2;
1601 11245 int i = 1;
1602
2/2
✓ Branch 1 taken 6572 times.
✓ Branch 2 taken 4673 times.
11245 if (!GET_CABAC(BCW_IDX))
1603 6572 return 0;
1604
4/4
✓ Branch 0 taken 5525 times.
✓ Branch 1 taken 1836 times.
✓ Branch 3 taken 2688 times.
✓ Branch 4 taken 2837 times.
7361 while (i < c_max && get_cabac_bypass(&lc->ep->cc))
1605 2688 i++;
1606 4673 return i;
1607 }
1608
1609 388126 int ff_vvc_tu_cb_coded_flag(VVCLocalContext *lc)
1610 {
1611 388126 return GET_CABAC(TU_CB_CODED_FLAG + lc->cu->bdpcm_flag[1]);
1612 }
1613
1614 388126 int ff_vvc_tu_cr_coded_flag(VVCLocalContext *lc, int tu_cb_coded_flag)
1615 {
1616
2/2
✓ Branch 0 taken 388123 times.
✓ Branch 1 taken 3 times.
388126 return GET_CABAC(TU_CR_CODED_FLAG + (lc->cu->bdpcm_flag[1] ? 2 : tu_cb_coded_flag));
1617 }
1618
1619 790686 int ff_vvc_tu_y_coded_flag(VVCLocalContext *lc)
1620 {
1621 790686 const CodingUnit *cu = lc->cu;
1622 int inc;
1623
2/2
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 790648 times.
790686 if (cu->bdpcm_flag[0])
1624 38 inc = 1;
1625
2/2
✓ Branch 0 taken 598393 times.
✓ Branch 1 taken 192255 times.
790648 else if (cu->isp_split_type == ISP_NO_SPLIT)
1626 598393 inc = 0;
1627 else
1628 192255 inc = 2 + lc->parse.prev_tu_cbf_y;
1629 790686 lc->parse.prev_tu_cbf_y = GET_CABAC(TU_Y_CODED_FLAG + inc);
1630 790686 return lc->parse.prev_tu_cbf_y;
1631 }
1632
1633 1888 int ff_vvc_cu_qp_delta_abs(VVCLocalContext *lc)
1634 {
1635 int v, i, k;
1636
2/2
✓ Branch 1 taken 782 times.
✓ Branch 2 taken 1106 times.
1888 if (!GET_CABAC(CU_QP_DELTA_ABS))
1637 782 return 0;
1638
1639 // prefixVal
1640
4/4
✓ Branch 0 taken 2334 times.
✓ Branch 1 taken 35 times.
✓ Branch 3 taken 1263 times.
✓ Branch 4 taken 1071 times.
2369 for (v = 1; v < 5 && GET_CABAC(CU_QP_DELTA_ABS + 1); v++)
1641 /* nothing */;
1642
2/2
✓ Branch 0 taken 1071 times.
✓ Branch 1 taken 35 times.
1106 if (v < 5)
1643 1071 return v;
1644
1645 // 9.3.3.5 k-th order Exp-Golomb binarization process
1646 // suffixVal
1647
1648 // CuQpDeltaVal shall in the range of −( 32 + QpBdOffset / 2 ) to +( 31 + QpBdOffset / 2 )
1649 // so k = 6 should enough
1650
3/4
✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 31 times.
✓ Branch 4 taken 35 times.
66 for (k = 0; k < 6 && get_cabac_bypass(&lc->ep->cc); k++)
1651 /* nothing */;
1652 35 i = (1 << k) - 1;
1653 35 v = 0;
1654
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 35 times.
66 while (k--)
1655 31 v = (v << 1) + get_cabac_bypass(&lc->ep->cc);
1656 35 v += i;
1657
1658 35 return v + 5;
1659 }
1660
1661 1106 int ff_vvc_cu_qp_delta_sign_flag(VVCLocalContext *lc)
1662 {
1663 1106 return get_cabac_bypass(&lc->ep->cc);
1664 }
1665
1666 1029 int ff_vvc_cu_chroma_qp_offset_flag(VVCLocalContext *lc)
1667 {
1668 1029 return GET_CABAC(CU_CHROMA_QP_OFFSET_FLAG);
1669 }
1670
1671 931 int ff_vvc_cu_chroma_qp_offset_idx(VVCLocalContext *lc)
1672 {
1673 931 const int c_max = lc->fc->ps.pps->r->pps_chroma_qp_offset_list_len_minus1;
1674 int i;
1675
4/4
✓ Branch 0 taken 2076 times.
✓ Branch 1 taken 532 times.
✓ Branch 3 taken 1677 times.
✓ Branch 4 taken 399 times.
2608 for (i = 0; i < c_max && GET_CABAC(CU_CHROMA_QP_OFFSET_IDX); i++)
1676 /* nothing */;
1677 931 return i;
1678 }
1679
1680 1845646 static av_always_inline int last_significant_coeff_xy_prefix(VVCLocalContext *lc,
1681 const int log2_tb_size, const int log2_zo_tb_size, const int c_idx, const int ctx)
1682 {
1683 1845646 int i = 0;
1684 1845646 int max = (log2_zo_tb_size << 1) - 1;
1685 int ctx_offset, ctx_shift;
1686
2/2
✓ Branch 0 taken 15841 times.
✓ Branch 1 taken 1829805 times.
1845646 if (!log2_tb_size)
1687 15841 return 0;
1688
2/2
✓ Branch 0 taken 1327715 times.
✓ Branch 1 taken 502090 times.
1829805 if (!c_idx) {
1689 1327715 const int offset_y[] = {0, 0, 3, 6, 10, 15};
1690 1327715 ctx_offset = offset_y[log2_tb_size - 1];
1691 1327715 ctx_shift = (log2_tb_size + 1) >> 2;
1692 } else {
1693 502090 const int shifts[] = {0, 0, 0, 1, 2, 2, 2};
1694 502090 ctx_offset = 20;
1695 502090 ctx_shift = shifts[log2_tb_size];
1696 }
1697
4/4
✓ Branch 0 taken 4843253 times.
✓ Branch 1 taken 289911 times.
✓ Branch 3 taken 3303359 times.
✓ Branch 4 taken 1539894 times.
5133164 while (i < max && GET_CABAC(ctx + (i >> ctx_shift) + ctx_offset))
1698 3303359 i++;
1699 1829805 return i;
1700 }
1701
1702 922823 static av_always_inline int last_significant_coeff_x_prefix_decode(VVCLocalContext *lc,
1703 const int log2_tb_width, const int log2_zo_tb_width, const int c_idx)
1704 {
1705 922823 return last_significant_coeff_xy_prefix(lc, log2_tb_width, log2_zo_tb_width, c_idx, LAST_SIG_COEFF_X_PREFIX);
1706 }
1707
1708 922823 static av_always_inline int last_significant_coeff_y_prefix_decode(VVCLocalContext *lc,
1709 const int log2_tb_height, const int log2_zo_tb_height, const int c_idx)
1710 {
1711 922823 return last_significant_coeff_xy_prefix(lc, log2_tb_height, log2_zo_tb_height, c_idx, LAST_SIG_COEFF_Y_PREFIX);
1712 }
1713
1714 357323 static av_always_inline int last_sig_coeff_suffix_decode(VVCLocalContext *lc,
1715 const int last_significant_coeff_y_prefix)
1716 {
1717 357323 const int length = (last_significant_coeff_y_prefix >> 1) - 1;
1718 357323 int value = get_cabac_bypass(&lc->ep->cc);
1719
1720
2/2
✓ Branch 0 taken 150770 times.
✓ Branch 1 taken 357323 times.
508093 for (int i = 1; i < length; i++)
1721 150770 value = (value << 1) | get_cabac_bypass(&lc->ep->cc);
1722 357323 return value;
1723 }
1724
1725 149605 int ff_vvc_tu_joint_cbcr_residual_flag(VVCLocalContext *lc, const int tu_cb_coded_flag, const int tu_cr_coded_flag)
1726 {
1727 149605 return GET_CABAC(TU_JOINT_CBCR_RESIDUAL_FLAG + 2 * tu_cb_coded_flag + tu_cr_coded_flag - 1);
1728 }
1729
1730 637363 int ff_vvc_transform_skip_flag(VVCLocalContext *lc, const int inc)
1731 {
1732 637363 return GET_CABAC(TRANSFORM_SKIP_FLAG + inc);
1733 }
1734
1735 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1736 38885365 static int get_local_sum(const int *level, const int w, const int h,
1737 const int xc, const int yc, const int hist_value)
1738 {
1739 38885365 int loc_sum = 3 * hist_value;
1740 38885365 level += w * yc + xc;
1741
2/2
✓ Branch 0 taken 37462567 times.
✓ Branch 1 taken 1422798 times.
38885365 if (xc < w - 1) {
1742 37462567 loc_sum += level[1];
1743
2/2
✓ Branch 0 taken 35371300 times.
✓ Branch 1 taken 2091267 times.
37462567 if (xc < w - 2)
1744 35371300 loc_sum += level[2] - hist_value;
1745
2/2
✓ Branch 0 taken 34626830 times.
✓ Branch 1 taken 2835737 times.
37462567 if (yc < h - 1)
1746 34626830 loc_sum += level[w + 1] - hist_value;
1747 }
1748
2/2
✓ Branch 0 taken 36048516 times.
✓ Branch 1 taken 2836849 times.
38885365 if (yc < h - 1) {
1749 36048516 loc_sum += level[w];
1750
2/2
✓ Branch 0 taken 32691786 times.
✓ Branch 1 taken 3356730 times.
36048516 if (yc < h - 2)
1751 32691786 loc_sum += level[w << 1] - hist_value;
1752 }
1753 38885365 return loc_sum;
1754 }
1755
1756 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1757 897206 static int get_local_sum_ts(const int *level, const int w, const int h, const int xc, const int yc)
1758 {
1759 897206 int loc_sum = 0;
1760 897206 level += w * yc + xc;
1761
2/2
✓ Branch 0 taken 785148 times.
✓ Branch 1 taken 112058 times.
897206 if (xc > 0)
1762 785148 loc_sum += level[-1];
1763
2/2
✓ Branch 0 taken 784985 times.
✓ Branch 1 taken 112221 times.
897206 if (yc > 0)
1764 784985 loc_sum += level[-w];
1765 897206 return loc_sum;
1766 }
1767
1768 10902953 static int get_gtx_flag_inc(const ResidualCoding* rc, const int xc, const int yc, const int last)
1769 {
1770 10902953 const TransformBlock *tb = rc->tb;
1771 int inc;
1772
2/2
✓ Branch 0 taken 922823 times.
✓ Branch 1 taken 9980130 times.
10902953 if (last) {
1773 922823 const int incs[] = {0, 21, 21};
1774 922823 inc = incs[tb->c_idx];
1775 } else {
1776 9980130 const int d = xc + yc;
1777 9980130 const int local_sum_sig = get_local_sum(rc->sig_coeff_flag,
1778 9980130 tb->tb_width,tb->tb_height, xc, yc, rc->hist_value);
1779 9980130 const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1780 9980130 tb->tb_width, tb->tb_height, xc, yc, rc->hist_value);
1781 9980130 const int offset = FFMIN(loc_sum_abs_pass1 - local_sum_sig, 4);
1782
1783
2/2
✓ Branch 0 taken 7144136 times.
✓ Branch 1 taken 2835994 times.
9980130 if (!tb->c_idx)
1784
6/6
✓ Branch 0 taken 6681510 times.
✓ Branch 1 taken 462626 times.
✓ Branch 2 taken 5227995 times.
✓ Branch 3 taken 1453515 times.
✓ Branch 4 taken 3254302 times.
✓ Branch 5 taken 1973693 times.
7144136 inc = 1 + offset + (!d ? 15 : (d < 3 ? 10 : (d < 10 ? 5 : 0)));
1785 else
1786
2/2
✓ Branch 0 taken 150036 times.
✓ Branch 1 taken 2685958 times.
2835994 inc = 22 + offset + (!d ? 5 : 0);
1787 }
1788 10902953 return inc;
1789 }
1790
1791 13181569 static int abs_level_gtx_flag_decode(VVCLocalContext *lc, const int inc)
1792 {
1793 13181569 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1794 }
1795
1796 2278616 static int par_level_flag_decode(VVCLocalContext *lc, const int inc)
1797 {
1798 2278616 return GET_CABAC(PAR_LEVEL_FLAG + inc);
1799 }
1800
1801 90249 static int par_level_flag_ts_decode(VVCLocalContext *lc)
1802 {
1803 90249 const int inc = 32;
1804 90249 return GET_CABAC(PAR_LEVEL_FLAG + inc);
1805 }
1806
1807 1048622 static int sb_coded_flag_decode(VVCLocalContext *lc, const uint8_t *sb_coded_flag,
1808 const ResidualCoding *rc, const int xs, const int ys)
1809 {
1810 1048622 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1811 1048622 const TransformBlock *tb = rc->tb;
1812 1048622 const int w = rc->width_in_sbs;
1813 1048622 const int h = rc->height_in_sbs;
1814 int inc;
1815
1816
3/4
✓ Branch 0 taken 131736 times.
✓ Branch 1 taken 916886 times.
✓ Branch 2 taken 131736 times.
✗ Branch 3 not taken.
1048622 if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1817
2/2
✓ Branch 0 taken 79731 times.
✓ Branch 1 taken 52005 times.
131736 const int left = xs > 0 ? sb_coded_flag[-1] : 0;
1818
2/2
✓ Branch 0 taken 79712 times.
✓ Branch 1 taken 52024 times.
131736 const int above = ys > 0 ? sb_coded_flag[-w] : 0;
1819 131736 inc = left + above + 4;
1820 } else {
1821
2/2
✓ Branch 0 taken 797820 times.
✓ Branch 1 taken 119066 times.
916886 const int right = (xs < w - 1) ? sb_coded_flag[1] : 0;
1822
2/2
✓ Branch 0 taken 699998 times.
✓ Branch 1 taken 216888 times.
916886 const int bottom = (ys < h - 1) ? sb_coded_flag[w] : 0;
1823
2/2
✓ Branch 0 taken 330967 times.
✓ Branch 1 taken 585919 times.
916886 inc = (right | bottom) + (tb->c_idx ? 2 : 0);
1824 }
1825 1048622 return GET_CABAC(SB_CODED_FLAG + inc);
1826 }
1827
1828 18844534 static int sig_coeff_flag_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1829 {
1830 18844534 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1831 18844534 const TransformBlock *tb = rc->tb;
1832 int inc;
1833
1834
3/4
✓ Branch 0 taken 897206 times.
✓ Branch 1 taken 17947328 times.
✓ Branch 2 taken 897206 times.
✗ Branch 3 not taken.
18844534 if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1835 897206 const int local_num_sig = get_local_sum_ts(rc->sig_coeff_flag, tb->tb_width, tb->tb_height, xc, yc);
1836 897206 inc = 60 + local_num_sig;
1837 } else {
1838 17947328 const int d = xc + yc;
1839 17947328 const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1840 17947328 tb->tb_width, tb->tb_height, xc, yc, 0);
1841
1842
2/2
✓ Branch 0 taken 12586003 times.
✓ Branch 1 taken 5361325 times.
17947328 if (!tb->c_idx) {
1843
4/4
✓ Branch 0 taken 11144276 times.
✓ Branch 1 taken 1441727 times.
✓ Branch 2 taken 3266246 times.
✓ Branch 3 taken 7878030 times.
12586003 inc = 12 * FFMAX(0, rc->qstate - 1) + FFMIN((loc_sum_abs_pass1 + 1) >> 1, 3) + ((d < 2) ? 8 : (d < 5 ? 4 : 0));
1844 } else {
1845
2/2
✓ Branch 0 taken 485705 times.
✓ Branch 1 taken 4875620 times.
5361325 inc = 36 + 8 * FFMAX(0, rc->qstate - 1) + FFMIN((loc_sum_abs_pass1 + 1) >> 1, 3) + (d < 2 ? 4 : 0);
1846 }
1847 }
1848 18844534 return GET_CABAC(SIG_COEFF_FLAG + inc);
1849 }
1850
1851 977777 static int abs_get_rice_param(VVCLocalContext *lc, const ResidualCoding* rc,
1852 const int xc, const int yc, const int base_level)
1853 {
1854 977777 const VVCSPS *sps = lc->fc->ps.sps;
1855 977777 const TransformBlock* tb = rc->tb;
1856 977777 const int rice_params[] = {
1857 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2,
1858 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
1859 };
1860 int loc_sum_abs;
1861 int shift_val;
1862
1863 977777 loc_sum_abs = get_local_sum(rc->abs_level, tb->tb_width, tb->tb_height, xc,
1864 977777 yc, rc->hist_value);
1865
1866
1/2
✓ Branch 0 taken 977777 times.
✗ Branch 1 not taken.
977777 if (!sps->r->sps_rrc_rice_extension_flag) {
1867 977777 shift_val = 0;
1868 } else {
1869 shift_val = (av_log2(FFMAX(FFMIN(loc_sum_abs, 2048), 8)) - 3) & ~1;
1870 }
1871
1872 977777 loc_sum_abs = av_clip_uintp2((loc_sum_abs >> shift_val) - base_level * 5, 5);
1873
1874 977777 return rice_params[loc_sum_abs] + shift_val;
1875 }
1876
1877 1028444 static int abs_decode(VVCLocalContext *lc, const int c_rice_param)
1878 {
1879 1028444 const VVCSPS *sps = lc->fc->ps.sps;
1880 1028444 const int MAX_BIN = 6;
1881 1028444 int prefix = 0;
1882 1028444 int suffix = 0;
1883
1884
4/4
✓ Branch 0 taken 2377239 times.
✓ Branch 1 taken 83388 times.
✓ Branch 3 taken 1432183 times.
✓ Branch 4 taken 945056 times.
2460627 while (prefix < MAX_BIN && get_cabac_bypass(&lc->ep->cc))
1885 1432183 prefix++;
1886
2/2
✓ Branch 0 taken 945056 times.
✓ Branch 1 taken 83388 times.
1028444 if (prefix < MAX_BIN) {
1887
2/2
✓ Branch 0 taken 653755 times.
✓ Branch 1 taken 945056 times.
1598811 for (int i = 0; i < c_rice_param; i++) {
1888 653755 suffix = (suffix << 1) | get_cabac_bypass(&lc->ep->cc);
1889 }
1890 } else {
1891 83388 suffix = limited_kth_order_egk_decode(&lc->ep->cc,
1892 c_rice_param + 1,
1893 83388 26 - sps->log2_transform_range,
1894 83388 sps->log2_transform_range);
1895 }
1896 1028444 return suffix + (prefix << c_rice_param);
1897 }
1898
1899 622278 static int abs_remainder_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1900 {
1901 622278 const VVCSPS *sps = lc->fc->ps.sps;
1902 622278 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1903 622278 const int base_level[][2][2] = {
1904 { {4, 4}, {4, 4} },
1905 { {3, 2}, {2, 1} }
1906 };
1907 622278 const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc,
1908 622278 base_level[sps->r->sps_rrc_rice_extension_flag][sps->bit_depth > 12][IS_I(rsh)]);
1909 622278 const int rem = abs_decode(lc, c_rice_param);
1910
1911 622278 return rem;
1912 }
1913
1914 50667 static int abs_remainder_ts_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1915 {
1916 50667 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1917 50667 const int c_rice_param = rsh->sh_ts_residual_coding_rice_idx_minus1 + 1;
1918 50667 const int rem = abs_decode(lc, c_rice_param);
1919
1920 50667 return rem;
1921 }
1922
1923 11215692 static int coeff_sign_flag_decode(VVCLocalContext *lc)
1924 {
1925 11215692 return get_cabac_bypass(&lc->ep->cc);
1926 }
1927
1928 //9.3.4.2.10 Derivation process of ctxInc for the syntax element coeff_sign_flag for transform skip mode
1929 229629 static int coeff_sign_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
1930 {
1931 229629 const TransformBlock *tb = rc->tb;
1932 229629 const int w = tb->tb_width;
1933 229629 const int *level = rc->coeff_sign_level + yc * w + xc;
1934
2/2
✓ Branch 0 taken 205419 times.
✓ Branch 1 taken 24210 times.
229629 const int left_sign = xc ? level[-1] : 0;
1935
2/2
✓ Branch 0 taken 204845 times.
✓ Branch 1 taken 24784 times.
229629 const int above_sign = yc ? level[-w] : 0;
1936 229629 const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
1937 int inc;
1938
1939
2/2
✓ Branch 0 taken 83301 times.
✓ Branch 1 taken 146328 times.
229629 if (left_sign == -above_sign)
1940
2/2
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 83282 times.
83301 inc = bdpcm_flag ? 3 : 0;
1941
4/4
✓ Branch 0 taken 88831 times.
✓ Branch 1 taken 57497 times.
✓ Branch 2 taken 60332 times.
✓ Branch 3 taken 28499 times.
146328 else if (left_sign >= 0 && above_sign >= 0)
1942
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 60329 times.
60332 inc = bdpcm_flag ? 4 : 1;
1943 else
1944
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 85985 times.
85996 inc = bdpcm_flag ? 5 : 2;
1945 229629 return GET_CABAC(COEFF_SIGN_FLAG + inc);
1946 }
1947
1948 229629 static int abs_level_gt1_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
1949 {
1950 229629 const TransformBlock *tb = rc->tb;
1951 229629 const int *sig_coeff_flag = rc->sig_coeff_flag + yc * tb->tb_width + xc;
1952 int inc;
1953
1954
2/2
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 229596 times.
229629 if (cu->bdpcm_flag[tb->c_idx]) {
1955 33 inc = 67;
1956 } else {
1957
2/2
✓ Branch 0 taken 205388 times.
✓ Branch 1 taken 24208 times.
229596 const int l = xc > 0 ? sig_coeff_flag[-1] : 0;
1958
2/2
✓ Branch 0 taken 204818 times.
✓ Branch 1 taken 24778 times.
229596 const int a = yc > 0 ? sig_coeff_flag[-tb->tb_width] : 0;
1959 229596 inc = 64 + a + l;
1960 }
1961 229629 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1962 }
1963
1964 162264 static int abs_level_gtx_flag_ts_decode(VVCLocalContext *lc, const int j)
1965 {
1966 162264 const int inc = 67 + j;
1967 162264 return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1968 }
1969
1970 static const uint8_t qstate_translate_table[][2] = {
1971 { 0, 2 }, { 2, 0 }, { 1, 3 }, { 3, 1 }
1972 };
1973
1974 355499 static int dec_abs_level_decode(VVCLocalContext *lc, const ResidualCoding *rc,
1975 const int xc, const int yc, int *abs_level)
1976 {
1977 355499 const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc, 0);
1978 355499 const int dec_abs_level = abs_decode(lc, c_rice_param);
1979
2/2
✓ Branch 0 taken 214892 times.
✓ Branch 1 taken 140607 times.
355499 const int zero_pos = (rc->qstate < 2 ? 1 : 2) << c_rice_param;
1980
1981 355499 *abs_level = 0;
1982
2/2
✓ Branch 0 taken 323773 times.
✓ Branch 1 taken 31726 times.
355499 if (dec_abs_level != zero_pos) {
1983 323773 *abs_level = dec_abs_level;
1984
2/2
✓ Branch 0 taken 192543 times.
✓ Branch 1 taken 131230 times.
323773 if (dec_abs_level < zero_pos)
1985 192543 *abs_level += 1;
1986 }
1987 355499 return dec_abs_level;
1988 }
1989
1990 977777 static void ep_update_hist(EntryPoint *ep, ResidualCoding *rc,
1991 const int remainder, const int addin)
1992 {
1993 977777 int *stat = ep->stat_coeff + rc->tb->c_idx;
1994
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 977777 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
977777 if (rc->update_hist && remainder > 0) {
1995 *stat = (*stat + av_log2(remainder) + addin) >> 1;
1996 rc->update_hist = 0;
1997 }
1998 977777 }
1999
2000 951428 static void init_residual_coding(const VVCLocalContext *lc, ResidualCoding *rc,
2001 const int log2_zo_tb_width, const int log2_zo_tb_height,
2002 TransformBlock *tb)
2003 {
2004 951428 const VVCSPS *sps = lc->fc->ps.sps;
2005
2/2
✓ Branch 0 taken 98947 times.
✓ Branch 1 taken 852481 times.
951428 int log2_sb_w = (FFMIN(log2_zo_tb_width, log2_zo_tb_height ) < 2 ? 1 : 2 );
2006 951428 int log2_sb_h = log2_sb_w;
2007
2008
2/2
✓ Branch 0 taken 942409 times.
✓ Branch 1 taken 9019 times.
951428 if ( log2_zo_tb_width + log2_zo_tb_height > 3 ) {
2009
2/2
✓ Branch 0 taken 20498 times.
✓ Branch 1 taken 921911 times.
942409 if ( log2_zo_tb_width < 2 ) {
2010 20498 log2_sb_w = log2_zo_tb_width;
2011 20498 log2_sb_h = 4 - log2_sb_w;
2012
2/2
✓ Branch 0 taken 69430 times.
✓ Branch 1 taken 852481 times.
921911 } else if ( log2_zo_tb_height < 2 ) {
2013 69430 log2_sb_h = log2_zo_tb_height;
2014 69430 log2_sb_w = 4 - log2_sb_h;
2015 }
2016 }
2017 951428 rc->log2_sb_w = log2_sb_w;
2018 951428 rc->log2_sb_h = log2_sb_h;
2019 951428 rc->num_sb_coeff = 1 << (log2_sb_w + log2_sb_h);
2020 951428 rc->last_sub_block = ( 1 << ( log2_zo_tb_width + log2_zo_tb_height - (log2_sb_w + log2_sb_h))) - 1;
2021
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 951428 times.
951428 rc->hist_value = sps->r->sps_persistent_rice_adaptation_enabled_flag ? (1 << lc->ep->stat_coeff[tb->c_idx]) : 0;
2022 951428 rc->update_hist = sps->r->sps_persistent_rice_adaptation_enabled_flag ? 1 : 0;
2023 951428 rc->rem_bins_pass1 = (( 1 << ( log2_zo_tb_width + log2_zo_tb_height)) * 7 ) >> 2;
2024
2025
2026 951428 rc->sb_scan_x_off = ff_vvc_diag_scan_x[log2_zo_tb_width - log2_sb_w][log2_zo_tb_height - log2_sb_h];
2027 951428 rc->sb_scan_y_off = ff_vvc_diag_scan_y[log2_zo_tb_width - log2_sb_w][log2_zo_tb_height - log2_sb_h];
2028
2029 951428 rc->scan_x_off = ff_vvc_diag_scan_x[log2_sb_w][log2_sb_h];
2030 951428 rc->scan_y_off = ff_vvc_diag_scan_y[log2_sb_w][log2_sb_h];
2031
2032 951428 rc->infer_sb_cbf = 1;
2033
2034 951428 rc->width_in_sbs = (1 << (log2_zo_tb_width - log2_sb_w));
2035 951428 rc->height_in_sbs = (1 << (log2_zo_tb_height - log2_sb_h));
2036 951428 rc->nb_sbs = rc->width_in_sbs * rc->height_in_sbs;
2037
2038 951428 rc->last_scan_pos = rc->num_sb_coeff;
2039 951428 rc->qstate = 0;
2040
2041 951428 rc->tb = tb;
2042 951428 }
2043
2044 144843 static int residual_ts_coding_subblock(VVCLocalContext *lc, ResidualCoding* rc, const int i)
2045 {
2046 144843 const CodingUnit *cu = lc->cu;
2047 144843 TransformBlock *tb = rc->tb;
2048 144843 const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
2049 144843 const int xs = rc->sb_scan_x_off[i];
2050 144843 const int ys = rc->sb_scan_y_off[i];
2051 144843 uint8_t *sb_coded_flag = rc->sb_coded_flag + ys * rc->width_in_sbs + xs;
2052 144843 int infer_sb_sig_coeff_flag = 1;
2053 144843 int last_scan_pos_pass1 = -1, last_scan_pos_pass2 = -1, n;
2054 int abs_level_gtx_flag[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE];
2055 int abs_level_pass2[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE]; ///< AbsLevelPass2
2056
2057
4/4
✓ Branch 0 taken 28605 times.
✓ Branch 1 taken 116238 times.
✓ Branch 2 taken 15498 times.
✓ Branch 3 taken 13107 times.
144843 if (i != rc->last_sub_block || !rc->infer_sb_cbf)
2058 131736 *sb_coded_flag = sb_coded_flag_decode(lc, sb_coded_flag, rc, xs, ys);
2059 else
2060 13107 *sb_coded_flag = 1;
2061
4/4
✓ Branch 0 taken 57500 times.
✓ Branch 1 taken 87343 times.
✓ Branch 2 taken 36940 times.
✓ Branch 3 taken 20560 times.
144843 if (*sb_coded_flag && i < rc->last_sub_block)
2062 36940 rc->infer_sb_cbf = 0;
2063
2064 //first scan pass
2065
4/4
✓ Branch 0 taken 2296876 times.
✓ Branch 1 taken 140911 times.
✓ Branch 2 taken 2292944 times.
✓ Branch 3 taken 3932 times.
2437787 for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2066 2292944 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2067 2292944 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2068 2292944 const int off = yc * tb->tb_width + xc;
2069 2292944 int *sig_coeff_flag = rc->sig_coeff_flag + off;
2070 2292944 int *abs_level_pass1 = rc->abs_level_pass1 + off;
2071 2292944 int *coeff_sign_level = rc->coeff_sign_level + off;
2072 2292944 int par_level_flag = 0;
2073
2074 2292944 abs_level_gtx_flag[n] = 0;
2075 2292944 last_scan_pos_pass1 = n;
2076
6/6
✓ Branch 0 taken 900272 times.
✓ Branch 1 taken 1392672 times.
✓ Branch 2 taken 53860 times.
✓ Branch 3 taken 846412 times.
✓ Branch 4 taken 50794 times.
✓ Branch 5 taken 3066 times.
2292944 if (*sb_coded_flag && (n != rc->num_sb_coeff - 1 || !infer_sb_sig_coeff_flag)) {
2077 897206 *sig_coeff_flag = sig_coeff_flag_decode(lc, rc, xc, yc);
2078 897206 rc->rem_bins_pass1--;
2079
2/2
✓ Branch 0 taken 226563 times.
✓ Branch 1 taken 670643 times.
897206 if (*sig_coeff_flag)
2080 226563 infer_sb_sig_coeff_flag = 0;
2081 } else {
2082
5/6
✓ Branch 0 taken 90117 times.
✓ Branch 1 taken 1305621 times.
✓ Branch 2 taken 90117 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3066 times.
✓ Branch 5 taken 87051 times.
1395738 *sig_coeff_flag = (n == rc->num_sb_coeff - 1) && infer_sb_sig_coeff_flag && *sb_coded_flag;
2083 }
2084 2292944 *coeff_sign_level = 0;
2085
2/2
✓ Branch 0 taken 229629 times.
✓ Branch 1 taken 2063315 times.
2292944 if (*sig_coeff_flag) {
2086 229629 *coeff_sign_level = 1 - 2 * coeff_sign_flag_ts_decode(lc, cu, rc, xc, yc);
2087 229629 abs_level_gtx_flag[n] = abs_level_gt1_flag_ts_decode(lc, cu, rc, xc, yc);
2088 229629 rc->rem_bins_pass1 -= 2;
2089
2/2
✓ Branch 0 taken 90249 times.
✓ Branch 1 taken 139380 times.
229629 if (abs_level_gtx_flag[n]) {
2090 90249 par_level_flag = par_level_flag_ts_decode(lc);
2091 90249 rc->rem_bins_pass1--;
2092 }
2093 }
2094 2292944 *abs_level_pass1 = *sig_coeff_flag + par_level_flag + abs_level_gtx_flag[n];
2095 }
2096
2097 //greater than x scan pass
2098
4/4
✓ Branch 0 taken 2239557 times.
✓ Branch 1 taken 139052 times.
✓ Branch 2 taken 2233766 times.
✓ Branch 3 taken 5791 times.
2378609 for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2099 2233766 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2100 2233766 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2101 2233766 const int off = yc * tb->tb_width + xc;
2102
2103 2233766 abs_level_pass2[n] = rc->abs_level_pass1[off];
2104
4/4
✓ Branch 0 taken 2375005 times.
✓ Branch 1 taken 21025 times.
✓ Branch 2 taken 162264 times.
✓ Branch 3 taken 2212741 times.
2396030 for (int j = 1; j < 5 && abs_level_gtx_flag[n]; j++) {
2105 162264 abs_level_gtx_flag[n] = abs_level_gtx_flag_ts_decode(lc, j);
2106 162264 abs_level_pass2[n] += abs_level_gtx_flag[n] << 1;
2107 162264 rc->rem_bins_pass1--;
2108 }
2109 2233766 last_scan_pos_pass2 = n;
2110 }
2111
2112 /* remainder scan pass */
2113
2/2
✓ Branch 0 taken 2317200 times.
✓ Branch 1 taken 144843 times.
2462043 for (n = 0; n < rc->num_sb_coeff; n++) {
2114 2317200 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2115 2317200 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2116 2317200 const int off = yc * tb->tb_width + xc;
2117 2317200 const int *abs_level_pass1 = rc->abs_level_pass1 + off;
2118 2317200 int *abs_level = rc->abs_level + off;
2119 2317200 int *coeff_sign_level = rc->coeff_sign_level + off;
2120 2317200 int abs_remainder = 0;
2121
2122
6/6
✓ Branch 0 taken 2233766 times.
✓ Branch 1 taken 83434 times.
✓ Branch 2 taken 2215467 times.
✓ Branch 3 taken 18299 times.
✓ Branch 4 taken 83434 times.
✓ Branch 5 taken 2215467 times.
2317200 if ((n <= last_scan_pos_pass2 && abs_level_pass2[n] >= 10) ||
2123
2/2
✓ Branch 0 taken 59178 times.
✓ Branch 1 taken 24256 times.
83434 (n > last_scan_pos_pass2 && n <= last_scan_pos_pass1 &&
2124
4/4
✓ Branch 0 taken 46394 times.
✓ Branch 1 taken 12784 times.
✓ Branch 2 taken 24256 times.
✓ Branch 3 taken 2261861 times.
2298901 *abs_level_pass1 >= 2) ||
2125
2/2
✓ Branch 0 taken 19584 times.
✓ Branch 1 taken 4672 times.
24256 (n > last_scan_pos_pass1 && *sb_coded_flag))
2126 50667 abs_remainder = abs_remainder_ts_decode(lc, rc, xc, yc);
2127
2/2
✓ Branch 0 taken 2233766 times.
✓ Branch 1 taken 83434 times.
2317200 if (n <= last_scan_pos_pass2) {
2128 2233766 *abs_level = abs_level_pass2[n] + 2 * abs_remainder;
2129
2/2
✓ Branch 0 taken 59178 times.
✓ Branch 1 taken 24256 times.
83434 } else if (n <= last_scan_pos_pass1) {
2130 59178 *abs_level = *abs_level_pass1 + 2 * abs_remainder;
2131 } else {
2132 24256 *abs_level = abs_remainder;
2133
2/2
✓ Branch 0 taken 11413 times.
✓ Branch 1 taken 12843 times.
24256 if (abs_remainder) {
2134 //n > lastScanPosPass1
2135 11413 *coeff_sign_level = 1 - 2 * coeff_sign_flag_decode(lc);
2136 }
2137 }
2138
4/4
✓ Branch 0 taken 2316864 times.
✓ Branch 1 taken 336 times.
✓ Branch 2 taken 2292608 times.
✓ Branch 3 taken 24256 times.
2317200 if (!bdpcm_flag && n <= last_scan_pos_pass1) {
2139
2/2
✓ Branch 0 taken 2050586 times.
✓ Branch 1 taken 242022 times.
2292608 const int left = xc > 0 ? abs_level[-1] : 0;
2140
2/2
✓ Branch 0 taken 2050365 times.
✓ Branch 1 taken 242243 times.
2292608 const int above = yc > 0 ? abs_level[-tb->tb_width] : 0;
2141 2292608 const int pred = FFMAX(left, above);
2142
2143
4/4
✓ Branch 0 taken 139357 times.
✓ Branch 1 taken 2153251 times.
✓ Branch 2 taken 82840 times.
✓ Branch 3 taken 56517 times.
2292608 if (*abs_level == 1 && pred > 0)
2144 82840 *abs_level = pred;
2145
4/4
✓ Branch 0 taken 146756 times.
✓ Branch 1 taken 2063012 times.
✓ Branch 2 taken 37310 times.
✓ Branch 3 taken 109446 times.
2209768 else if (*abs_level > 0 && *abs_level <= pred)
2146 37310 (*abs_level)--;
2147 }
2148
2/2
✓ Branch 0 taken 241042 times.
✓ Branch 1 taken 2076158 times.
2317200 if (*abs_level) {
2149 241042 tb->coeffs[off] = *coeff_sign_level * *abs_level;
2150 241042 tb->max_scan_x = FFMAX(xc, tb->max_scan_x);
2151 241042 tb->max_scan_y = FFMAX(yc, tb->max_scan_y);
2152 241042 tb->min_scan_x = FFMIN(xc, tb->min_scan_x);
2153 241042 tb->min_scan_y = FFMIN(yc, tb->min_scan_y);
2154 } else {
2155 2076158 tb->coeffs[off] = 0;
2156 }
2157 }
2158
2159 144843 return 0;
2160 }
2161
2162 28605 static int hls_residual_ts_coding(VVCLocalContext *lc, TransformBlock *tb)
2163 {
2164 ResidualCoding rc;
2165 28605 tb->min_scan_x = tb->min_scan_y = INT_MAX;
2166 28605 init_residual_coding(lc, &rc, tb->log2_tb_width, tb->log2_tb_height, tb);
2167
2/2
✓ Branch 0 taken 144843 times.
✓ Branch 1 taken 28605 times.
173448 for (int i = 0; i <= rc.last_sub_block; i++) {
2168 144843 int ret = residual_ts_coding_subblock(lc, &rc, i);
2169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 144843 times.
144843 if (ret < 0)
2170 return ret;
2171 }
2172
2173 28605 return 0;
2174 }
2175
2176 2109887 static inline int residual_coding_subblock(VVCLocalContext *lc, ResidualCoding *rc, const int i)
2177 {
2178 2109887 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2179 2109887 TransformBlock *tb = rc->tb;
2180 int first_sig_scan_pos_sb, last_sig_scan_pos_sb;
2181 int first_pos_mode0, first_pos_mode1;
2182 2109887 int infer_sb_dc_sig_coeff_flag = 0;
2183 2109887 int n, sig_hidden_flag, sum = 0;
2184 int abs_level_gt2_flag[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE];
2185 2109887 const int start_qstate_sb = rc->qstate;
2186 2109887 const int xs = rc->sb_scan_x_off[i];
2187 2109887 const int ys = rc->sb_scan_y_off[i];
2188 2109887 uint8_t *sb_coded_flag = rc->sb_coded_flag + ys * rc->width_in_sbs + xs;
2189
2190
2191
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2109887 times.
2109887 av_assert0(rc->num_sb_coeff <= MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE);
2192
4/4
✓ Branch 0 taken 1187064 times.
✓ Branch 1 taken 922823 times.
✓ Branch 2 taken 916886 times.
✓ Branch 3 taken 270178 times.
2109887 if (i < rc->last_sub_block && i > 0) {
2193 916886 *sb_coded_flag = sb_coded_flag_decode(lc, sb_coded_flag, rc, xs, ys);
2194 916886 infer_sb_dc_sig_coeff_flag = 1;
2195 } else {
2196 1193001 *sb_coded_flag = 1;
2197 }
2198
8/8
✓ Branch 0 taken 1778136 times.
✓ Branch 1 taken 331751 times.
✓ Branch 2 taken 1708273 times.
✓ Branch 3 taken 69863 times.
✓ Branch 4 taken 53185 times.
✓ Branch 5 taken 1655088 times.
✓ Branch 6 taken 70682 times.
✓ Branch 7 taken 52366 times.
2109887 if (*sb_coded_flag && (xs > 3 || ys > 3) && !tb->c_idx)
2199 70682 lc->parse.mts_zero_out_sig_coeff_flag = 0;
2200
2201
2/2
✓ Branch 0 taken 331751 times.
✓ Branch 1 taken 1778136 times.
2109887 if (!*sb_coded_flag)
2202 331751 return 0;
2203
2204 1778136 first_sig_scan_pos_sb = rc->num_sb_coeff;
2205 1778136 last_sig_scan_pos_sb = -1;
2206
2/2
✓ Branch 0 taken 922823 times.
✓ Branch 1 taken 855313 times.
1778136 first_pos_mode0 = (i == rc->last_sub_block ? rc->last_scan_pos : rc->num_sb_coeff -1);
2207 1778136 first_pos_mode1 = first_pos_mode0;
2208
4/4
✓ Branch 0 taken 18944374 times.
✓ Branch 1 taken 1713779 times.
✓ Branch 2 taken 18880017 times.
✓ Branch 3 taken 64357 times.
20658153 for (n = first_pos_mode0; n >= 0 && rc->rem_bins_pass1 >= 4; n--) {
2209 18880017 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2210 18880017 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2211
4/4
✓ Branch 0 taken 2859992 times.
✓ Branch 1 taken 16020025 times.
✓ Branch 2 taken 922823 times.
✓ Branch 3 taken 1937169 times.
18880017 const int last = (xc == rc->last_significant_coeff_x && yc == rc->last_significant_coeff_y);
2212 18880017 int *abs_level_pass1 = rc->abs_level_pass1 + yc * tb->tb_width + xc;
2213 18880017 int *sig_coeff_flag = rc->sig_coeff_flag + yc * tb->tb_width + xc;
2214
2215
6/6
✓ Branch 0 taken 1713779 times.
✓ Branch 1 taken 17166238 times.
✓ Branch 2 taken 1703913 times.
✓ Branch 3 taken 9866 times.
✓ Branch 4 taken 17947328 times.
✓ Branch 5 taken 922823 times.
18880017 if ((n > 0 || !infer_sb_dc_sig_coeff_flag ) && !last) {
2216 17947328 *sig_coeff_flag = sig_coeff_flag_decode(lc, rc, xc, yc);
2217 17947328 rc->rem_bins_pass1--;
2218
2/2
✓ Branch 0 taken 9970264 times.
✓ Branch 1 taken 7977064 times.
17947328 if (*sig_coeff_flag)
2219 9970264 infer_sb_dc_sig_coeff_flag = 0;
2220 } else {
2221
5/8
✓ Branch 0 taken 9866 times.
✓ Branch 1 taken 922823 times.
✓ Branch 2 taken 9866 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 9866 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9866 times.
✗ Branch 7 not taken.
932689 *sig_coeff_flag = last || (!rc->scan_x_off[n] && !rc ->scan_y_off[n] &&
2222 infer_sb_dc_sig_coeff_flag);
2223 }
2224 18880017 *abs_level_pass1 = 0;
2225
2/2
✓ Branch 0 taken 10902953 times.
✓ Branch 1 taken 7977064 times.
18880017 if (*sig_coeff_flag) {
2226 10902953 int abs_level_gt1_flag, par_level_flag = 0;
2227 10902953 const int inc = get_gtx_flag_inc(rc, xc, yc, last);
2228 10902953 abs_level_gt1_flag = abs_level_gtx_flag_decode(lc, inc);
2229 10902953 rc->rem_bins_pass1--;
2230
2/2
✓ Branch 0 taken 2278616 times.
✓ Branch 1 taken 8624337 times.
10902953 if (abs_level_gt1_flag) {
2231 2278616 par_level_flag = par_level_flag_decode(lc, inc);
2232 2278616 abs_level_gt2_flag[n] = abs_level_gtx_flag_decode(lc, inc + 32);
2233 2278616 rc->rem_bins_pass1 -= 2;
2234 } else {
2235 8624337 abs_level_gt2_flag[n] = 0;
2236 }
2237
2/2
✓ Branch 0 taken 1764068 times.
✓ Branch 1 taken 9138885 times.
10902953 if (last_sig_scan_pos_sb == -1)
2238 1764068 last_sig_scan_pos_sb = n;
2239 10902953 first_sig_scan_pos_sb = n;
2240
2241 10902953 *abs_level_pass1 =
2242 10902953 1 + par_level_flag + abs_level_gt1_flag + (abs_level_gt2_flag[n] << 1);
2243 } else {
2244 7977064 abs_level_gt2_flag[n] = 0;
2245 }
2246
2247
2/2
✓ Branch 0 taken 17671970 times.
✓ Branch 1 taken 1208047 times.
18880017 if (rsh->sh_dep_quant_used_flag)
2248 17671970 rc->qstate = qstate_translate_table[rc->qstate][*abs_level_pass1 & 1];
2249
2250 18880017 first_pos_mode1 = n - 1;
2251 }
2252
2/2
✓ Branch 0 taken 18880017 times.
✓ Branch 1 taken 1778136 times.
20658153 for (n = first_pos_mode0; n > first_pos_mode1; n--) {
2253 18880017 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2254 18880017 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2255 18880017 const int *abs_level_pass1 = rc->abs_level_pass1 + yc * tb->tb_width + xc;
2256 18880017 int *abs_level = rc->abs_level + yc * tb->tb_width + xc;
2257
2258 18880017 *abs_level = *abs_level_pass1;
2259
2/2
✓ Branch 0 taken 622278 times.
✓ Branch 1 taken 18257739 times.
18880017 if (abs_level_gt2_flag[n]) {
2260 622278 const int abs_remainder = abs_remainder_decode(lc, rc, xc, yc);
2261 622278 ep_update_hist(lc->ep, rc, abs_remainder, 2);
2262 622278 *abs_level += 2 * abs_remainder;
2263 }
2264 }
2265
2/2
✓ Branch 0 taken 355499 times.
✓ Branch 1 taken 1778136 times.
2133635 for (n = first_pos_mode1; n >= 0; n--) {
2266 355499 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2267 355499 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2268 355499 int *abs_level = rc->abs_level + yc * tb->tb_width + xc;
2269
2270
1/2
✓ Branch 0 taken 355499 times.
✗ Branch 1 not taken.
355499 if (*sb_coded_flag) {
2271 355499 const int dec_abs_level = dec_abs_level_decode(lc, rc, xc, yc, abs_level);
2272 355499 ep_update_hist(lc->ep, rc, dec_abs_level, 0);
2273 }
2274
2/2
✓ Branch 0 taken 323773 times.
✓ Branch 1 taken 31726 times.
355499 if (*abs_level > 0) {
2275
2/2
✓ Branch 0 taken 7595 times.
✓ Branch 1 taken 316178 times.
323773 if (last_sig_scan_pos_sb == -1)
2276 7595 last_sig_scan_pos_sb = n;
2277 323773 first_sig_scan_pos_sb = n;
2278 }
2279
2/2
✓ Branch 0 taken 282809 times.
✓ Branch 1 taken 72690 times.
355499 if (rsh->sh_dep_quant_used_flag)
2280 282809 rc->qstate = qstate_translate_table[rc->qstate][*abs_level & 1];
2281 }
2282
2/2
✓ Branch 0 taken 34562 times.
✓ Branch 1 taken 1743574 times.
1812698 sig_hidden_flag = rsh->sh_sign_data_hiding_used_flag &&
2283
2/2
✓ Branch 0 taken 22447 times.
✓ Branch 1 taken 12115 times.
34562 (last_sig_scan_pos_sb - first_sig_scan_pos_sb > 3 ? 1 : 0);
2284
2285
2/2
✓ Branch 0 taken 1656890 times.
✓ Branch 1 taken 121246 times.
1778136 if (rsh->sh_dep_quant_used_flag)
2286 1656890 rc->qstate = start_qstate_sb;
2287
2/2
✓ Branch 0 taken 922823 times.
✓ Branch 1 taken 855313 times.
1778136 n = (i == rc->last_sub_block ? rc->last_scan_pos : rc->num_sb_coeff -1);
2288
2/2
✓ Branch 0 taken 19235516 times.
✓ Branch 1 taken 1778136 times.
21013652 for (/* nothing */; n >= 0; n--) {
2289 int trans_coeff_level;
2290 19235516 const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2291 19235516 const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2292 19235516 const int off = yc * tb->tb_width + xc;
2293 19235516 const int *abs_level = rc->abs_level + off;
2294
2295
2/2
✓ Branch 0 taken 11226726 times.
✓ Branch 1 taken 8008790 times.
19235516 if (*abs_level > 0) {
2296 11226726 int sign = 1;
2297
4/4
✓ Branch 0 taken 176798 times.
✓ Branch 1 taken 11049928 times.
✓ Branch 2 taken 154351 times.
✓ Branch 3 taken 22447 times.
11226726 if (!sig_hidden_flag || (n != first_sig_scan_pos_sb))
2298 11204279 sign = 1 - 2 * coeff_sign_flag_decode(lc);
2299
2/2
✓ Branch 0 taken 10539661 times.
✓ Branch 1 taken 687065 times.
11226726 if (rsh->sh_dep_quant_used_flag) {
2300 10539661 trans_coeff_level = (2 * *abs_level - (rc->qstate > 1)) * sign;
2301 } else {
2302 687065 trans_coeff_level = *abs_level * sign;
2303
2/2
✓ Branch 0 taken 176798 times.
✓ Branch 1 taken 510267 times.
687065 if (sig_hidden_flag) {
2304 176798 sum += *abs_level;
2305
4/4
✓ Branch 0 taken 22447 times.
✓ Branch 1 taken 154351 times.
✓ Branch 2 taken 11754 times.
✓ Branch 3 taken 10693 times.
176798 if (n == first_sig_scan_pos_sb && (sum % 2))
2306 11754 trans_coeff_level = -trans_coeff_level;
2307 }
2308 }
2309 11226726 tb->coeffs[off] = trans_coeff_level;
2310 11226726 tb->max_scan_x = FFMAX(xc, tb->max_scan_x);
2311 11226726 tb->max_scan_y = FFMAX(yc, tb->max_scan_y);
2312 }
2313
2/2
✓ Branch 0 taken 17954779 times.
✓ Branch 1 taken 1280737 times.
19235516 if (rsh->sh_dep_quant_used_flag)
2314 17954779 rc->qstate = qstate_translate_table[rc->qstate][*abs_level & 1];
2315 }
2316
2317 1778136 return 0;
2318 }
2319
2320 922823 static void derive_last_scan_pos(ResidualCoding *rc)
2321 {
2322 int xc, yc, xs, ys;
2323 do {
2324
2/2
✓ Branch 0 taken 6254359 times.
✓ Branch 1 taken 103770912 times.
110025271 if (!rc->last_scan_pos) {
2325 6254359 rc->last_scan_pos = rc->num_sb_coeff;
2326 6254359 rc->last_sub_block--;
2327 }
2328 110025271 rc->last_scan_pos--;
2329 110025271 xs = rc->sb_scan_x_off[rc->last_sub_block];
2330 110025271 ys = rc->sb_scan_y_off[rc->last_sub_block];
2331 110025271 xc = (xs << rc->log2_sb_w) + rc->scan_x_off[rc->last_scan_pos];
2332 110025271 yc = (ys << rc->log2_sb_h) + rc->scan_y_off[rc->last_scan_pos];
2333
4/4
✓ Branch 0 taken 103009746 times.
✓ Branch 1 taken 7015525 times.
✓ Branch 2 taken 6092702 times.
✓ Branch 3 taken 922823 times.
110025271 } while ((xc != rc->last_significant_coeff_x) || (yc != rc->last_significant_coeff_y));
2334 922823 }
2335
2336 922823 static void last_significant_coeff_x_y_decode(ResidualCoding *rc, VVCLocalContext *lc,
2337 const int log2_zo_tb_width, const int log2_zo_tb_height)
2338 {
2339 922823 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2340 922823 const TransformBlock *tb = rc->tb;
2341 int last_significant_coeff_x, last_significant_coeff_y;
2342
2343 922823 last_significant_coeff_x = last_significant_coeff_x_prefix_decode(lc,
2344 922823 tb->log2_tb_width, log2_zo_tb_width, tb->c_idx);
2345
2346 922823 last_significant_coeff_y = last_significant_coeff_y_prefix_decode(lc,
2347 922823 tb->log2_tb_height, log2_zo_tb_height, tb->c_idx);
2348
2349
2/2
✓ Branch 0 taken 200535 times.
✓ Branch 1 taken 722288 times.
922823 if (last_significant_coeff_x > 3) {
2350 200535 int suffix = last_sig_coeff_suffix_decode(lc, last_significant_coeff_x);
2351 200535 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
2352 200535 (2 + (last_significant_coeff_x & 1)) + suffix;
2353 }
2354
2/2
✓ Branch 0 taken 156788 times.
✓ Branch 1 taken 766035 times.
922823 if (last_significant_coeff_y > 3) {
2355 156788 int suffix = last_sig_coeff_suffix_decode(lc, last_significant_coeff_y);
2356 156788 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
2357 156788 (2 + (last_significant_coeff_y & 1)) + suffix;
2358 }
2359
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 922823 times.
922823 if (rsh->sh_reverse_last_sig_coeff_flag) {
2360 last_significant_coeff_x = (1 << log2_zo_tb_width) - 1 - last_significant_coeff_x;
2361 last_significant_coeff_y = (1 << log2_zo_tb_height) - 1 - last_significant_coeff_y;
2362 }
2363 922823 rc->last_significant_coeff_x = last_significant_coeff_x;
2364 922823 rc->last_significant_coeff_y = last_significant_coeff_y;
2365 922823 }
2366
2367 922823 static int hls_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
2368 {
2369 922823 const VVCSPS *sps = lc->fc->ps.sps;
2370 922823 const CodingUnit *cu = lc->cu;
2371 922823 const int log2_tb_width = tb->log2_tb_width;
2372 922823 const int log2_tb_height = tb->log2_tb_height;
2373 922823 const int c_idx = tb->c_idx;
2374 int log2_zo_tb_width, log2_zo_tb_height;
2375 ResidualCoding rc;
2376
2377
10/10
✓ Branch 0 taken 918110 times.
✓ Branch 1 taken 4713 times.
✓ Branch 2 taken 51033 times.
✓ Branch 3 taken 867077 times.
✓ Branch 4 taken 34142 times.
✓ Branch 5 taken 16891 times.
✓ Branch 6 taken 1636 times.
✓ Branch 7 taken 32506 times.
✓ Branch 8 taken 1533 times.
✓ Branch 9 taken 103 times.
922823 if (sps->r->sps_mts_enabled_flag && cu->sbt_flag && !c_idx && log2_tb_width == 5 && log2_tb_height < 6)
2378 1533 log2_zo_tb_width = 4;
2379 else
2380 921290 log2_zo_tb_width = FFMIN(log2_tb_width, 5 );
2381
2382
10/10
✓ Branch 0 taken 918110 times.
✓ Branch 1 taken 4713 times.
✓ Branch 2 taken 51033 times.
✓ Branch 3 taken 867077 times.
✓ Branch 4 taken 34142 times.
✓ Branch 5 taken 16891 times.
✓ Branch 6 taken 33952 times.
✓ Branch 7 taken 190 times.
✓ Branch 8 taken 2051 times.
✓ Branch 9 taken 31901 times.
922823 if (sps->r->sps_mts_enabled_flag && cu->sbt_flag && !c_idx && log2_tb_width < 6 && log2_tb_height == 5 )
2383 2051 log2_zo_tb_height = 4;
2384 else
2385 920772 log2_zo_tb_height = FFMIN(log2_tb_height, 5);
2386
2387 922823 init_residual_coding(lc, &rc, log2_zo_tb_width, log2_zo_tb_height, tb);
2388 922823 last_significant_coeff_x_y_decode(&rc, lc, log2_zo_tb_width, log2_zo_tb_height);
2389 922823 derive_last_scan_pos(&rc);
2390
2391
9/10
✓ Branch 0 taken 652645 times.
✓ Branch 1 taken 270178 times.
✓ Branch 2 taken 628051 times.
✓ Branch 3 taken 24594 times.
✓ Branch 4 taken 560537 times.
✓ Branch 5 taken 67514 times.
✓ Branch 6 taken 560537 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 427792 times.
✓ Branch 9 taken 132745 times.
922823 if (!rc.last_sub_block && log2_tb_width >= 2 && log2_tb_height >= 2 && !tb->ts && rc.last_scan_pos > 0)
2392 427792 lc->parse.lfnst_dc_only = 0;
2393
6/6
✓ Branch 0 taken 270178 times.
✓ Branch 1 taken 652645 times.
✓ Branch 2 taken 268208 times.
✓ Branch 3 taken 1970 times.
✓ Branch 4 taken 4550 times.
✓ Branch 5 taken 263658 times.
922823 if ((rc.last_sub_block > 0 && log2_tb_width >= 2 && log2_tb_height >= 2 ) ||
2394
8/8
✓ Branch 0 taken 146802 times.
✓ Branch 1 taken 512363 times.
✓ Branch 2 taken 84902 times.
✓ Branch 3 taken 61900 times.
✓ Branch 4 taken 41835 times.
✓ Branch 5 taken 43067 times.
✓ Branch 6 taken 51745 times.
✓ Branch 7 taken 51990 times.
659165 (rc.last_scan_pos > 7 && (log2_tb_width == 2 || log2_tb_width == 3 ) &&
2395 log2_tb_width == log2_tb_height))
2396 315403 lc->parse.lfnst_zero_out_sig_coeff_flag = 0;
2397
6/6
✓ Branch 0 taken 652645 times.
✓ Branch 1 taken 270178 times.
✓ Branch 2 taken 493605 times.
✓ Branch 3 taken 159040 times.
✓ Branch 4 taken 572130 times.
✓ Branch 5 taken 191653 times.
922823 if ((rc.last_sub_block > 0 || rc.last_scan_pos > 0 ) && !c_idx)
2398 572130 lc->parse.mts_dc_only = 0;
2399
2400 922823 memset(tb->coeffs, 0, tb->tb_width * tb->tb_height * sizeof(*tb->coeffs));
2401 922823 memset(rc.abs_level, 0, tb->tb_width * tb->tb_height * sizeof(rc.abs_level[0]));
2402 922823 memset(rc.sb_coded_flag, 0, rc.nb_sbs);
2403 922823 memset(rc.abs_level_pass1, 0, tb->tb_width * tb->tb_height * sizeof(rc.abs_level_pass1[0]));
2404 922823 memset(rc.sig_coeff_flag, 0, tb->tb_width * tb->tb_height * sizeof(rc.sig_coeff_flag[0]));
2405
2406
2/2
✓ Branch 0 taken 2109887 times.
✓ Branch 1 taken 922823 times.
3032710 for (int i = rc.last_sub_block; i >= 0; i--) {
2407 2109887 int ret = residual_coding_subblock(lc, &rc, i);
2408
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2109887 times.
2109887 if (ret < 0)
2409 return ret;
2410 }
2411
2412 922823 return 0;
2413 }
2414
2415 951428 int ff_vvc_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
2416 {
2417 951428 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2418
3/4
✓ Branch 0 taken 951428 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 28605 times.
✓ Branch 3 taken 922823 times.
951428 const int ts = !rsh->sh_ts_residual_coding_disabled_flag && tb->ts;
2419
2420
2/2
✓ Branch 0 taken 28605 times.
✓ Branch 1 taken 922823 times.
951428 return ts ? hls_residual_ts_coding(lc, tb) : hls_residual_coding(lc, tb);
2421 }
2422
2423 91987 int ff_vvc_cu_coded_flag(VVCLocalContext *lc)
2424 {
2425 91987 return GET_CABAC(CU_CODED_FLAG);
2426 }
2427
2428 130991 int ff_vvc_sbt_flag(VVCLocalContext *lc)
2429 {
2430 130991 const int w = lc->cu->cb_width;
2431 130991 const int h = lc->cu->cb_height;
2432 130991 const int inc = w * h <= 256;
2433 130991 return GET_CABAC(CU_SBT_FLAG + inc);
2434 }
2435
2436 31711 int ff_vvc_sbt_quad_flag(VVCLocalContext *lc)
2437 {
2438 31711 return GET_CABAC(CU_SBT_QUAD_FLAG);
2439 }
2440
2441 24966 int ff_vvc_sbt_horizontal_flag(VVCLocalContext *lc)
2442 {
2443 24966 const int w = lc->cu->cb_width;
2444 24966 const int h = lc->cu->cb_height;
2445
4/4
✓ Branch 0 taken 13306 times.
✓ Branch 1 taken 11660 times.
✓ Branch 2 taken 7290 times.
✓ Branch 3 taken 6016 times.
24966 const int inc = (w == h) ? 0 : ((w < h) ? 1 : 2);
2446 24966 return GET_CABAC(CU_SBT_HORIZONTAL_FLAG + inc);
2447 }
2448
2449 44595 int ff_vvc_sbt_pos_flag(VVCLocalContext *lc)
2450 {
2451 44595 return GET_CABAC(CU_SBT_POS_FLAG);
2452 }
2453
2454 182831 int ff_vvc_lfnst_idx(VVCLocalContext *lc, const int inc)
2455 {
2456
2/2
✓ Branch 1 taken 44755 times.
✓ Branch 2 taken 138076 times.
182831 if (!GET_CABAC(LFNST_IDX + inc))
2457 44755 return 0;
2458
2/2
✓ Branch 1 taken 84309 times.
✓ Branch 2 taken 53767 times.
138076 if (!GET_CABAC(LFNST_IDX + 2))
2459 84309 return 1;
2460 53767 return 2;
2461 }
2462
2463 246933 int ff_vvc_mts_idx(VVCLocalContext *lc)
2464 {
2465 int i;
2466
2/2
✓ Branch 0 taken 452090 times.
✓ Branch 1 taken 910 times.
453000 for (i = 0; i < 4; i++) {
2467
2/2
✓ Branch 1 taken 246023 times.
✓ Branch 2 taken 206067 times.
452090 if (!GET_CABAC(MTS_IDX + i))
2468 246023 return i;
2469 }
2470 910 return i;
2471 }
2472
2473 1709 int ff_vvc_end_of_slice_flag_decode(VVCLocalContext *lc)
2474 {
2475 1709 return get_cabac_terminate(&lc->ep->cc);
2476 }
2477
2478 487 int ff_vvc_end_of_tile_one_bit(VVCLocalContext *lc)
2479 {
2480 487 return get_cabac_terminate(&lc->ep->cc);
2481 }
2482
2483 153 int ff_vvc_end_of_subset_one_bit(VVCLocalContext *lc)
2484 {
2485 153 return get_cabac_terminate(&lc->ep->cc);
2486 }
2487