FFmpeg
cabac.c
Go to the documentation of this file.
1 /*
2  * VVC CABAC decoder
3  *
4  * Copyright (C) 2021 Nuo Mi
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include <assert.h>
24 
26 
27 #include "cabac.h"
28 #include "ctu.h"
29 #include "data.h"
30 
31 #define CABAC_MAX_BIN 31
32 
33 #define CNU 35
34 
112 };
113 
114 static_assert(VVC_CONTEXTS == SYNTAX_ELEMENT_LAST, "VVC_CONTEXTS wrong");
115 
116 static const uint8_t init_values[4][SYNTAX_ELEMENT_LAST] = {
117  {
118  //alf_ctb_flag
119  62, 39, 39, 54, 39, 39, 31, 39, 39,
120  //alf_use_aps_flag
121  46,
122  //alf_ctb_cc_cb_idc
123  18, 30, 31,
124  //alf_ctb_cc_cr_idc
125  18, 30, 31,
126  //alf_ctb_filter_alt_idx
127  11, 11,
128  //sao_merge_left_flag and sao_merge_up_flag
129  60,
130  //sao_type_idx_luma and sao_type_idx_chroma
131  13,
132  //split_cu_flag
133  19, 28, 38, 27, 29, 38, 20, 30, 31,
134  //split_qt_flag
135  27, 6, 15, 25, 19, 37,
136  //mtt_split_cu_vertical_flag
137  43, 42, 29, 27, 44,
138  //mtt_split_cu_binary_flag
139  36, 45, 36, 45,
140  //non_inter_flag
141  CNU, CNU,
142  //cu_skip_flag
143  0, 26, 28,
144  //pred_mode_ibc_flag
145  17, 42, 36,
146  //pred_mode_flag
147  CNU, CNU,
148  //pred_mode_plt_flag
149  25,
150  //cu_act_enabled_flag
151  52,
152  //intra_bdpcm_luma_flag
153  19,
154  //intra_bdpcm_luma_dir_flag
155  35,
156  //intra_mip_flag
157  33, 49, 50, 25,
158  //intra_luma_ref_idx
159  25, 60,
160  //intra_subpartitions_mode_flag
161  33,
162  //intra_subpartitions_split_flag
163  43,
164  //intra_luma_mpm_flag
165  45,
166  //intra_luma_not_planar_flag
167  13, 28,
168  //intra_bdpcm_chroma_flag
169  1,
170  //intra_bdpcm_chroma_dir_flag
171  27,
172  //cclm_mode_flag
173  59,
174  //cclm_mode_idx
175  27,
176  //intra_chroma_pred_mode
177  34,
178  //general_merge_flag
179  26,
180  //inter_pred_idc
181  CNU, CNU, CNU, CNU, CNU, CNU,
182  //inter_affine_flag
183  CNU, CNU, CNU,
184  //cu_affine_type_flag
185  CNU,
186  //sym_mvd_flag
187  CNU,
188  //ref_idx_l0 and ref_idx_l1
189  CNU, CNU,
190  //mvp_l0_flag and mvp_l1_flag
191  42,
192  //amvr_flag
193  CNU, CNU,
194  //amvr_precision_idx
195  35, 34, 35,
196  //bcw_idx
197  CNU,
198  //cu_coded_flag
199  6,
200  //cu_sbt_flag
201  CNU, CNU,
202  //cu_sbt_quad_flag
203  CNU,
204  //cu_sbt_horizontal_flag
205  CNU, CNU, CNU,
206  //cu_sbt_pos_flag
207  CNU,
208  //lfnst_idx
209  28, 52, 42,
210  //mts_idx
211  29, 0, 28, 0,
212  //copy_above_palette_indices_flag
213  42,
214  //palette_transpose_flag
215  42,
216  //run_copy_flag
217  50, 37, 45, 30, 46, 45, 38, 46,
218  //regular_merge_flag
219  CNU, CNU,
220  //mmvd_merge_flag
221  CNU,
222  //mmvd_cand_flag
223  CNU,
224  //mmvd_distance_idx
225  CNU,
226  //ciip_flag
227  CNU,
228  //merge_subblock_flag
229  CNU, CNU, CNU,
230  //merge_subblock_idx
231  CNU,
232  //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
233  34,
234  //abs_mvd_greater0_flag
235  14,
236  //abs_mvd_greater1_flag
237  45,
238  //tu_y_coded_flag
239  15, 12, 5, 7,
240  //tu_cb_coded_flag
241  12, 21,
242  //tu_cr_coded_flag
243  33, 28, 36,
244  //cu_qp_delta_abs
245  CNU, CNU,
246  //cu_chroma_qp_offset_flag
247  CNU,
248  //cu_chroma_qp_offset_idx
249  CNU,
250  //transform_skip_flag
251  25, 9,
252  //tu_joint_cbcr_residual_flag
253  12, 21, 35,
254  //last_sig_coeff_x_prefix
255  13, 5, 4, 21, 14, 4, 6, 14, 21, 11, 14, 7, 14, 5, 11, 21,
256  30, 22, 13, 42, 12, 4, 3,
257  //last_sig_coeff_y_prefix
258  13, 5, 4, 6, 13, 11, 14, 6, 5, 3, 14, 22, 6, 4, 3, 6,
259  22, 29, 20, 34, 12, 4, 3,
260  //sb_coded_flag
261  18, 31, 25, 15, 18, 20, 38,
262  //sig_coeff_flag
263  25, 19, 28, 14, 25, 20, 29, 30, 19, 37, 30, 38, 11, 38, 46, 54,
264  27, 39, 39, 39, 44, 39, 39, 39, 18, 39, 39, 39, 27, 39, 39, 39,
265  0, 39, 39, 39, 25, 27, 28, 37, 34, 53, 53, 46, 19, 46, 38, 39,
266  52, 39, 39, 39, 11, 39, 39, 39, 19, 39, 39, 39, 25, 28, 38,
267  //par_level_flag
268  33, 25, 18, 26, 34, 27, 25, 26, 19, 42, 35, 33, 19, 27, 35, 35,
269  34, 42, 20, 43, 20, 33, 25, 26, 42, 19, 27, 26, 50, 35, 20, 43,
270  11,
271  //abs_level_gtx_flag
272  25, 25, 11, 27, 20, 21, 33, 12, 28, 21, 22, 34, 28, 29, 29, 30,
273  36, 29, 45, 30, 23, 40, 33, 27, 28, 21, 37, 36, 37, 45, 38, 46,
274  25, 1, 40, 25, 33, 11, 17, 25, 25, 18, 4, 17, 33, 26, 19, 13,
275  33, 19, 20, 28, 22, 40, 9, 25, 18, 26, 35, 25, 26, 35, 28, 37,
276  11, 5, 5, 14, 10, 3, 3, 3,
277  //coeff_sign_flag
278  12, 17, 46, 28, 25, 46,
279  },
280  {
281  //alf_ctb_flag
282  13, 23, 46, 4, 61, 54, 19, 46, 54,
283  //alf_use_aps_flag
284  46,
285  //alf_ctb_cc_cb_idc
286  18, 21, 38,
287  //alf_ctb_cc_cr_idc
288  18, 21, 38,
289  //alf_ctb_filter_alt_idx
290  20, 12,
291  //sao_merge_left_flag and sao_merge_up_flag
292  60,
293  //sao_type_idx_luma and sao_type_idx_chroma
294  5,
295  //split_cu_flag
296  11, 35, 53, 12, 6, 30, 13, 15, 31,
297  //split_qt_flag
298  20, 14, 23, 18, 19, 6,
299  //mtt_split_cu_vertical_flag
300  43, 35, 37, 34, 52,
301  //mtt_split_cu_binary_flag
302  43, 37, 21, 22,
303  //non_inter_flag
304  25, 12,
305  //cu_skip_flag
306  57, 59, 45,
307  //pred_mode_ibc_flag
308  0, 57, 44,
309  //pred_mode_flag
310  40, 35,
311  //pred_mode_plt_flag
312  0,
313  //cu_act_enabled_flag
314  46,
315  //intra_bdpcm_luma_flag
316  40,
317  //intra_bdpcm_luma_dir_flag
318  36,
319  //intra_mip_flag
320  41, 57, 58, 26,
321  //intra_luma_ref_idx
322  25, 58,
323  //intra_subpartitions_mode_flag
324  33,
325  //intra_subpartitions_split_flag
326  36,
327  //intra_luma_mpm_flag
328  36,
329  //intra_luma_not_planar_flag
330  12, 20,
331  //intra_bdpcm_chroma_flag
332  0,
333  //intra_bdpcm_chroma_dir_flag
334  13,
335  //cclm_mode_flag
336  34,
337  //cclm_mode_idx
338  27,
339  //intra_chroma_pred_mode
340  25,
341  //general_merge_flag
342  21,
343  //inter_pred_idc
344  7, 6, 5, 12, 4, 40,
345  //inter_affine_flag
346  12, 13, 14,
347  //cu_affine_type_flag
348  35,
349  //sym_mvd_flag
350  28,
351  //ref_idx_l0 and ref_idx_l1
352  20, 35,
353  //mvp_l0_flag and mvp_l1_flag
354  34,
355  //amvr_flag
356  59, 58,
357  //amvr_precision_idx
358  60, 48, 60,
359  //bcw_idx
360  4,
361  //cu_coded_flag
362  5,
363  //cu_sbt_flag
364  56, 57,
365  //cu_sbt_quad_flag
366  42,
367  //cu_sbt_horizontal_flag
368  20, 43, 12,
369  //cu_sbt_pos_flag
370  28,
371  //lfnst_idx
372  37, 45, 27,
373  //mts_idx
374  45, 40, 27, 0,
375  //copy_above_palette_indices_flag
376  59,
377  //palette_transpose_flag
378  42,
379  //run_copy_flag
380  51, 30, 30, 38, 23, 38, 53, 46,
381  //regular_merge_flag
382  38, 7,
383  //mmvd_merge_flag
384  26,
385  //mmvd_cand_flag
386  43,
387  //mmvd_distance_idx
388  60,
389  //ciip_flag
390  57,
391  //merge_subblock_flag
392  48, 57, 44,
393  //merge_subblock_idx
394  5,
395  //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
396  20,
397  //abs_mvd_greater0_flag
398  44,
399  //abs_mvd_greater1_flag
400  43,
401  //tu_y_coded_flag
402  23, 5, 20, 7,
403  //tu_cb_coded_flag
404  25, 28,
405  //tu_cr_coded_flag
406  25, 29, 45,
407  //cu_qp_delta_abs
408  CNU, CNU,
409  //cu_chroma_qp_offset_flag
410  CNU,
411  //cu_chroma_qp_offset_idx
412  CNU,
413  //transform_skip_flag
414  25, 9,
415  //tu_joint_cbcr_residual_flag
416  27, 36, 45,
417  //last_sig_coeff_x_prefix
418  6, 13, 12, 6, 6, 12, 14, 14, 13, 12, 29, 7, 6, 13, 36, 28,
419  14, 13, 5, 26, 12, 4, 18,
420  //last_sig_coeff_y_prefix
421  5, 5, 12, 6, 6, 4, 6, 14, 5, 12, 14, 7, 13, 5, 13, 21,
422  14, 20, 12, 34, 11, 4, 18,
423  //sb_coded_flag
424  25, 30, 25, 45, 18, 12, 29,
425  //sig_coeff_flag
426  17, 41, 42, 29, 25, 49, 43, 37, 33, 58, 51, 30, 19, 38, 38, 46,
427  34, 54, 54, 39, 6, 39, 39, 39, 19, 39, 54, 39, 19, 39, 39, 39,
428  56, 39, 39, 39, 17, 34, 35, 21, 41, 59, 60, 38, 35, 45, 53, 54,
429  44, 39, 39, 39, 34, 38, 62, 39, 26, 39, 39, 39, 40, 35, 44,
430  //par_level_flag
431  18, 17, 33, 18, 26, 42, 25, 33, 26, 42, 27, 25, 34, 42, 42, 35,
432  26, 27, 42, 20, 20, 25, 25, 26, 11, 19, 27, 33, 42, 35, 35, 43,
433  3,
434  //abs_level_gtx_flag
435  0, 17, 26, 19, 35, 21, 25, 34, 20, 28, 29, 33, 27, 28, 29, 22,
436  34, 28, 44, 37, 38, 0, 25, 19, 20, 13, 14, 57, 44, 30, 30, 23,
437  17, 0, 1, 17, 25, 18, 0, 9, 25, 33, 34, 9, 25, 18, 26, 20,
438  25, 18, 19, 27, 29, 17, 9, 25, 10, 18, 4, 17, 33, 19, 20, 29,
439  18, 11, 4, 28, 2, 10, 3, 3,
440  //coeff_sign_flag
441  5, 10, 53, 43, 25, 46,
442  },
443  {
444  //alf_ctb_flag
445  33, 52, 46, 25, 61, 54, 25, 61, 54,
446  //alf_use_aps_flag
447  46,
448  //alf_ctb_cc_cb_idc
449  25, 35, 38,
450  //alf_ctb_cc_cr_idc
451  25, 28, 38,
452  //alf_ctb_filter_alt_idx
453  11, 26,
454  //sao_merge_left_flag and sao_merge_up_flag
455  2,
456  //sao_type_idx_luma and sao_type_idx_chroma
457  2,
458  //split_cu_flag
459  18, 27, 15, 18, 28, 45, 26, 7, 23,
460  //split_qt_flag
461  26, 36, 38, 18, 34, 21,
462  //mtt_split_cu_vertical_flag
463  43, 42, 37, 42, 44,
464  //mtt_split_cu_binary_flag
465  28, 29, 28, 29,
466  //non_inter_flag
467  25, 20,
468  //cu_skip_flag
469  57, 60, 46,
470  //pred_mode_ibc_flag
471  0, 43, 45,
472  //pred_mode_flag
473  40, 35,
474  //pred_mode_plt_flag
475  17,
476  //cu_act_enabled_flag
477  46,
478  //intra_bdpcm_luma_flag
479  19,
480  //intra_bdpcm_luma_dir_flag
481  21,
482  //intra_mip_flag
483  56, 57, 50, 26,
484  //intra_luma_ref_idx
485  25, 59,
486  //intra_subpartitions_mode_flag
487  33,
488  //intra_subpartitions_split_flag
489  43,
490  //intra_luma_mpm_flag
491  44,
492  //intra_luma_not_planar_flag
493  13, 6,
494  //intra_bdpcm_chroma_flag
495  0,
496  //intra_bdpcm_chroma_dir_flag
497  28,
498  //cclm_mode_flag
499  26,
500  //cclm_mode_idx
501  27,
502  //intra_chroma_pred_mode
503  25,
504  //general_merge_flag
505  6,
506  //inter_pred_idc
507  14, 13, 5, 4, 3, 40,
508  //inter_affine_flag
509  19, 13, 6,
510  //cu_affine_type_flag
511  35,
512  //sym_mvd_flag
513  28,
514  //ref_idx_l0 and ref_idx_l1
515  5, 35,
516  //mvp_l0_flag and mvp_l1_flag
517  34,
518  //amvr_flag
519  59, 50,
520  //amvr_precision_idx
521  38, 26, 60,
522  //bcw_idx
523  5,
524  //cu_coded_flag
525  12,
526  //cu_sbt_flag
527  41, 57,
528  //cu_sbt_quad_flag
529  42,
530  //cu_sbt_horizontal_flag
531  35, 51, 27,
532  //cu_sbt_pos_flag
533  28,
534  //lfnst_idx
535  52, 37, 27,
536  //mts_idx
537  45, 25, 27, 0,
538  //copy_above_palette_indices_flag
539  50,
540  //palette_transpose_flag
541  35,
542  //run_copy_flag
543  58, 45, 45, 30, 38, 45, 38, 46,
544  //regular_merge_flag
545  46, 15,
546  //mmvd_merge_flag
547  25,
548  //mmvd_cand_flag
549  43,
550  //mmvd_distance_idx
551  59,
552  //ciip_flag
553  57,
554  //merge_subblock_flag
555  25, 58, 45,
556  //merge_subblock_idx
557  4,
558  //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
559  18,
560  //abs_mvd_greater0_flag
561  51,
562  //abs_mvd_greater1_flag
563  36,
564  //tu_y_coded_flag
565  15, 6, 5, 14,
566  //tu_cb_coded_flag
567  25, 37,
568  //tu_cr_coded_flag
569  9, 36, 45,
570  //cu_qp_delta_abs
571  CNU, CNU,
572  //cu_chroma_qp_offset_flag
573  CNU,
574  //cu_chroma_qp_offset_idx
575  CNU,
576  //transform_skip_flag
577  25, 17,
578  //tu_joint_cbcr_residual_flag
579  42, 43, 52,
580  //last_sig_coeff_x_prefix
581  6, 6, 12, 14, 6, 4, 14, 7, 6, 4, 29, 7, 6, 6, 12, 28,
582  7, 13, 13, 35, 19, 5, 4,
583  //last_sig_coeff_y_prefix
584  5, 5, 20, 13, 13, 19, 21, 6, 12, 12, 14, 14, 5, 4, 12, 13,
585  7, 13, 12, 41, 11, 5, 27,
586  //sb_coded_flag
587  25, 45, 25, 14, 18, 35, 45,
588  //sig_coeff_flag
589  17, 41, 49, 36, 1, 49, 50, 37, 48, 51, 58, 45, 26, 45, 53, 46,
590  49, 54, 61, 39, 35, 39, 39, 39, 19, 54, 39, 39, 50, 39, 39, 39,
591  0, 39, 39, 39, 9, 49, 50, 36, 48, 59, 59, 38, 34, 45, 38, 31,
592  58, 39, 39, 39, 34, 38, 54, 39, 41, 39, 39, 39, 25, 50, 37,
593  //par_level_flag
594  33, 40, 25, 41, 26, 42, 25, 33, 26, 34, 27, 25, 41, 42, 42, 35,
595  33, 27, 35, 42, 43, 33, 25, 26, 34, 19, 27, 33, 42, 43, 35, 43,
596  11,
597  //abs_level_gtx_flag
598  0, 0, 33, 34, 35, 21, 25, 34, 35, 28, 29, 40, 42, 43, 29, 30,
599  49, 36, 37, 45, 38, 0, 40, 34, 43, 36, 37, 57, 52, 45, 38, 46,
600  25, 0, 0, 17, 25, 26, 0, 9, 25, 33, 19, 0, 25, 33, 26, 20,
601  25, 33, 27, 35, 22, 25, 1, 25, 33, 26, 12, 25, 33, 27, 28, 37,
602  19, 11, 4, 6, 3, 4, 4, 5,
603  //coeff_sign_flag
604  35, 25, 46, 28, 33, 38,
605  },
606  //shiftIdx
607  {
608  //alf_ctb_flag
609  0, 0, 0, 4, 0, 0, 1, 0, 0,
610  //alf_use_aps_flag
611  0,
612  //alf_ctb_cc_cb_idc
613  4, 1, 4,
614  //alf_ctb_cc_cr_idc
615  4, 1, 4,
616  //alf_ctb_filter_alt_idx
617  0, 0,
618  //sao_merge_left_flag and sao_merge_up_flag
619  0,
620  //sao_type_idx_luma and sao_type_idx_chroma
621  4,
622  //split_cu_flag
623  12, 13, 8, 8, 13, 12, 5, 9, 9,
624  //split_qt_flag
625  0, 8, 8, 12, 12, 8,
626  //mtt_split_cu_vertical_flag
627  9, 8, 9, 8, 5,
628  //mtt_split_cu_binary_flag
629  12, 13, 12, 13,
630  //non_inter_flag
631  1, 0,
632  //cu_skip_flag
633  5, 4, 8,
634  //pred_mode_ibc_flag
635  1, 5, 8,
636  //pred_mode_flag
637  5, 1,
638  //pred_mode_plt_flag
639  1,
640  //cu_act_enabled_flag
641  1,
642  //intra_bdpcm_luma_flag
643  1,
644  //intra_bdpcm_luma_dir_flag
645  4,
646  //intra_mip_flag
647  9, 10, 9, 6,
648  //intra_luma_ref_idx
649  5, 8,
650  //intra_subpartitions_mode_flag
651  9,
652  //intra_subpartitions_split_flag
653  2,
654  //intra_luma_mpm_flag
655  6,
656  //intra_luma_not_planar_flag
657  1, 5,
658  //intra_bdpcm_chroma_flag
659  1,
660  //intra_bdpcm_chroma_dir_flag
661  0,
662  //cclm_mode_flag
663  4,
664  //cclm_mode_idx
665  9,
666  //intra_chroma_pred_mode
667  5,
668  //general_merge_flag
669  4,
670  //inter_pred_idc
671  0, 0, 1, 4, 4, 0,
672  //inter_affine_flag
673  4, 0, 0,
674  //cu_affine_type_flag
675  4,
676  //sym_mvd_flag
677  5,
678  //ref_idx_l0 and ref_idx_l1
679  0, 4,
680  //mvp_l0_flag and mvp_l1_flag
681  12,
682  //amvr_flag
683  0, 0,
684  //amvr_precision_idx
685  4, 5, 0,
686  //bcw_idx
687  1,
688  //cu_coded_flag
689  4,
690  //cu_sbt_flag
691  1, 5,
692  //cu_sbt_quad_flag
693  10,
694  //cu_sbt_horizontal_flag
695  8, 4, 1,
696  //cu_sbt_pos_flag
697  13,
698  //lfnst_idx
699  9, 9, 10,
700  //mts_idx
701  8, 0, 9, 0,
702  //copy_above_palette_indices_flag
703  9,
704  //palette_transpose_flag
705  5,
706  //run_copy_flag
707  9, 6, 9, 10, 5, 0, 9, 5,
708  //regular_merge_flag
709  5, 5,
710  //mmvd_merge_flag
711  4,
712  //mmvd_cand_flag
713  10,
714  //mmvd_distance_idx
715  0,
716  //ciip_flag
717  1,
718  //merge_subblock_flag
719  4, 4, 4,
720  //merge_subblock_idx
721  0,
722  //merge_idx, merge_gpm_idx0, and merge_gpm_idx1
723  4,
724  //abs_mvd_greater0_flag
725  9,
726  //abs_mvd_greater1_flag
727  5,
728  //tu_y_coded_flag
729  5, 1, 8, 9,
730  //tu_cb_coded_flag
731  5, 0,
732  //tu_cr_coded_flag
733  2, 1, 0,
734  //cu_qp_delta_abs
735  8, 8,
736  //cu_chroma_qp_offset_flag
737  8,
738  //cu_chroma_qp_offset_idx
739  8,
740  //transform_skip_flag
741  1, 1,
742  //tu_joint_cbcr_residual_flag
743  1, 1, 0,
744  //last_sig_coeff_x_prefix
745  8, 5, 4, 5, 4, 4, 5, 4, 1, 0, 4, 1, 0, 0, 0, 0,
746  1, 0, 0, 0, 5, 4, 4,
747  //last_sig_coeff_y_prefix
748  8, 5, 8, 5, 5, 4, 5, 5, 4, 0, 5, 4, 1, 0, 0, 1,
749  4, 0, 0, 0, 6, 5, 5,
750  //sb_coded_flag
751  8, 5, 5, 8, 5, 8, 8,
752  //sig_coeff_flag
753  12, 9, 9, 10, 9, 9, 9, 10, 8, 8, 8, 10, 9, 13, 8, 8,
754  8, 8, 8, 5, 8, 0, 0, 0, 8, 8, 8, 8, 8, 0, 4, 4,
755  0, 0, 0, 0, 12, 12, 9, 13, 4, 5, 8, 9, 8, 12, 12, 8,
756  4, 0, 0, 0, 8, 8, 8, 8, 4, 0, 0, 0, 13, 13, 8,
757  //par_level_flag
758  8, 9, 12, 13, 13, 13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13,
759  10, 13, 13, 13, 13, 8, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13,
760  6,
761  //abs_level_gtx_flag
762  9, 5, 10, 13, 13, 10, 9, 10, 13, 13, 13, 9, 10, 10, 10, 13,
763  8, 9, 10, 10, 13, 8, 8, 9, 12, 12, 10, 5, 9, 9, 9, 13,
764  1, 5, 9, 9, 9, 6, 5, 9, 10, 10, 9, 9, 9, 9, 9, 9,
765  6, 8, 9, 9, 10, 1, 5, 8, 8, 9, 6, 6, 9, 8, 8, 9,
766  4, 2, 1, 6, 1, 1, 1, 1,
767  //coeff_sign_flag
768  1, 4, 4, 5, 8, 8,
769  }
770 };
771 
772 #define MAX_SUB_BLOCKS 16
773 #define MAX_SUB_BLOCK_SIZE 4
774 #define MAX_TB_SIZE 64
775 
776 typedef struct ResidualCoding {
777  //common for ts and non ts
779 
787 
790  int nb_sbs;
791 
792  const uint8_t *sb_scan_x_off;
793  const uint8_t *sb_scan_y_off;
794  const uint8_t *scan_x_off;
795  const uint8_t *scan_y_off;
796 
799  int abs_level_pass1[MAX_TB_SIZE * MAX_TB_SIZE]; ///< AbsLevelPass1[][]
801 
802  //for ts only
803  uint8_t infer_sb_cbf;
804  int coeff_sign_level[MAX_TB_SIZE * MAX_TB_SIZE]; ///< CoeffSignLevel[][]
805 
806  //for non ts only
807  int qstate;
812 
814 {
815  return skip_bytes(&lc->ep->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
816 }
817 
819 {
820  const VVCSPS *sps = lc->fc->ps.sps;
821  const H266RawSliceHeader *rsh = lc->sc->sh.r;
822  const int qp = av_clip_uintp2(lc->sc->sh.slice_qp_y, 6);
823  int init_type = 2 - rsh->sh_slice_type;
824 
825  ff_vvc_ep_init_stat_coeff(lc->ep, sps->bit_depth, sps->r->sps_persistent_rice_adaptation_enabled_flag);
826 
827  if (rsh->sh_cabac_init_flag && !IS_I(rsh))
828  init_type ^= 3;
829 
830  for (int i = 0; i < VVC_CONTEXTS; i++) {
831  VVCCabacState *state = &lc->ep->cabac_state[i];
832  const int init_value = init_values[init_type][i];
833  const int shift_idx = init_values[3][i];
834  const int m = (init_value >> 3) - 4;
835  const int n = ((init_value & 7) * 18) + 1;
836  const int pre = av_clip(((m * (qp - 16)) >> 1) + n, 1, 127);
837 
838  state->state[0] = pre << 3;
839  state->state[1] = pre << 7;
840  state->shift[0] = (shift_idx >> 2 ) + 2;
841  state->shift[1] = (shift_idx & 3 ) + 3 + state->shift[0];
842  }
843 }
844 
846  const int ctu_idx, const int rx, const int ry)
847 {
848  int ret = 0;
849  const VVCPPS *pps = lc->fc->ps.pps;
850  const int first_ctb_in_slice = !ctu_idx;
851  const int first_ctb_in_tile = rx == pps->ctb_to_col_bd[rx] && ry == pps->ctb_to_row_bd[ry];
852 
853  if (first_ctb_in_slice|| first_ctb_in_tile) {
854  if (lc->sc->nb_eps == 1 && !first_ctb_in_slice)
855  ret = cabac_reinit(lc);
856  if (!ret)
857  cabac_init_state(lc);
858  }
859  return ret;
860 }
861 
862 //fixme
863 static void vvc_refill2(CABACContext* c) {
864  int i;
865  unsigned x;
866 #if !HAVE_FAST_CLZ
867  x = c->low ^ (c->low - 1);
868  i = 7 - ff_h264_norm_shift[x >> (CABAC_BITS - 1)];
869 #else
870  i = ff_ctz(c->low) - CABAC_BITS;
871 #endif
872 
873  x = -CABAC_MASK;
874 
875 #if CABAC_BITS == 16
876  x += (c->bytestream[0] << 9) + (c->bytestream[1] << 1);
877 #else
878  x += c->bytestream[0] << 1;
879 #endif
880 
881  c->low += x << i;
882 #if !UNCHECKED_BITSTREAM_READER
883  if (c->bytestream < c->bytestream_end)
884 #endif
885  c->bytestream += CABAC_BITS / 8;
886 }
887 
888 static int inline vvc_get_cabac(CABACContext *c, VVCCabacState* base, const int ctx)
889 {
890  VVCCabacState *s = base + ctx;
891  const int qRangeIdx = c->range >> 5;
892  const int pState = s->state[1] + (s->state[0] << 4);
893  const int valMps = pState >> 14;
894  const int RangeLPS = (qRangeIdx * ((valMps ? 32767 - pState : pState) >> 9 ) >> 1) + 4;
895  int bit, lps_mask;
896 
897  c->range -= RangeLPS;
898  lps_mask = ((c->range<<(CABAC_BITS+1)) - c->low)>>31;
899 
900  c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask;
901  c->range += (RangeLPS - c->range) & lps_mask;
902 
903  bit = valMps ^ (lps_mask & 1);
904 
905  lps_mask = ff_h264_norm_shift[c->range];
906  c->range <<= lps_mask;
907  c->low <<= lps_mask;
908 
909  if (!(c->low & CABAC_MASK))
910  vvc_refill2(c);
911  s->state[0] = s->state[0] - (s->state[0] >> s->shift[0]) + (1023 * bit >> s->shift[0]);
912  s->state[1] = s->state[1] - (s->state[1] >> s->shift[1]) + (16383 * bit >> s->shift[1]);
913  return bit;
914 }
915 
916 #define GET_CABAC(ctx) vvc_get_cabac(&lc->ep->cc, lc->ep->cabac_state, ctx)
917 
918 //9.3.3.4 Truncated binary (TB) binarization process
919 static int truncated_binary_decode(VVCLocalContext *lc, const int c_max)
920 {
921  const int n = c_max + 1;
922  const int k = av_log2(n);
923  const int u = (1 << (k+1)) - n;
924  int v = 0;
925  for (int i = 0; i < k; i++)
926  v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
927  if (v >= u) {
928  v = (v << 1) | get_cabac_bypass(&lc->ep->cc);
929  v -= u;
930  }
931  return v;
932 }
933 
934 // 9.3.3.5 k-th order Exp - Golomb binarization process
935 static int kth_order_egk_decode(CABACContext *c, int k, const int max)
936 {
937  int bit = 1;
938  int value = 0;
939  int symbol = 0;
940 
941  while (bit) {
943  if (max - value < (bit << k))
944  return AVERROR_INVALIDDATA;
945  value += bit << k++;
946  }
947 
948  if (--k) {
949  for (int i = 0; i < k; i++)
950  symbol = (symbol << 1) | get_cabac_bypass(c);
951  value += symbol;
952  }
953 
954  if (value > max)
955  return AVERROR_INVALIDDATA;
956 
957  return value;
958 }
959 
960 // 9.3.3.6 Limited k-th order Exp-Golomb binarization process
961 static int limited_kth_order_egk_decode(CABACContext *c, const int k, const int max_pre_ext_len, const int trunc_suffix_len)
962 {
963  int pre_ext_len = 0;
964  int escape_length;
965  int val = 0;
966  while ((pre_ext_len < max_pre_ext_len) && get_cabac_bypass(c))
967  pre_ext_len++;
968  if (pre_ext_len == max_pre_ext_len)
969  escape_length = trunc_suffix_len;
970  else
971  escape_length = pre_ext_len + k;
972  while (escape_length-- > 0) {
973  val = (val << 1) + get_cabac_bypass(c);
974  }
975  val += ((1 << pre_ext_len) - 1) << k;
976  return val;
977 }
978 
979 // 9.3.3.7 Fixed-length binarization process
980 static int fixed_length_decode(CABACContext* c, const int len)
981 {
982  int value = 0;
983 
984  for (int i = 0; i < len; i++)
985  value = (value << 1) | get_cabac_bypass(c);
986 
987  return value;
988 }
989 
990 static av_always_inline
991 void get_left_top(const VVCLocalContext *lc, uint8_t *left, uint8_t *top,
992  const int x0, const int y0, const uint8_t *left_ctx, const uint8_t *top_ctx)
993 {
994  const VVCFrameContext *fc = lc->fc;
995  const VVCSPS *sps = fc->ps.sps;
996  const int min_cb_width = fc->ps.pps->min_cb_width;
997  const int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
998  const int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
999  const int x_cb = x0 >> sps->min_cb_log2_size_y;
1000  const int y_cb = y0 >> sps->min_cb_log2_size_y;
1001 
1002  if (lc->ctb_left_flag || x0b)
1003  *left = SAMPLE_CTB(left_ctx, x_cb - 1, y_cb);
1004  if (lc->ctb_up_flag || y0b)
1005  *top = SAMPLE_CTB(top_ctx, x_cb, y_cb - 1);
1006 }
1007 
1008 static av_always_inline
1009 uint8_t get_inc(VVCLocalContext *lc, const uint8_t *ctx)
1010 {
1011  uint8_t left = 0, top = 0;
1012  get_left_top(lc, &left, &top, lc->cu->x0, lc->cu->y0, ctx, ctx);
1013  return left + top;
1014 }
1015 
1017 {
1018  return GET_CABAC(SAO_MERGE_FLAG);
1019 }
1020 
1022 {
1023  if (!GET_CABAC(SAO_TYPE_IDX))
1024  return SAO_NOT_APPLIED;
1025 
1026  if (!get_cabac_bypass(&lc->ep->cc))
1027  return SAO_BAND;
1028  return SAO_EDGE;
1029 }
1030 
1032 {
1033  return fixed_length_decode(&lc->ep->cc, 5);
1034 }
1035 
1037 {
1038  int i = 0;
1039  const int length = (1 << (FFMIN(lc->fc->ps.sps->bit_depth, 10) - 5)) - 1;
1040 
1041  while (i < length && get_cabac_bypass(&lc->ep->cc))
1042  i++;
1043  return i;
1044 }
1045 
1047 {
1048  return get_cabac_bypass(&lc->ep->cc);
1049 }
1050 
1052 {
1053  return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1054 }
1055 
1056 int ff_vvc_alf_ctb_flag(VVCLocalContext *lc, const int rx, const int ry, const int c_idx)
1057 {
1058  int inc = c_idx * 3;
1059  const VVCFrameContext *fc = lc->fc;
1060  if (lc->ctb_left_flag) {
1061  const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1062  inc += left->ctb_flag[c_idx];
1063  }
1064  if (lc->ctb_up_flag) {
1065  const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1066  inc += above->ctb_flag[c_idx];
1067  }
1068  return GET_CABAC(ALF_CTB_FLAG + inc);
1069 }
1070 
1072 {
1073  return GET_CABAC(ALF_USE_APS_FLAG);
1074 }
1075 
1077 {
1078  return truncated_binary_decode(lc, lc->sc->sh.r->sh_num_alf_aps_ids_luma - 1);
1079 }
1080 
1082 {
1083  return truncated_binary_decode(lc, 15);
1084 }
1085 
1086 int ff_vvc_alf_ctb_filter_alt_idx(VVCLocalContext *lc, const int c_idx, const int num_chroma_filters)
1087 {
1088  int i = 0;
1089  const int length = num_chroma_filters - 1;
1090 
1091  while (i < length && GET_CABAC(ALF_CTB_FILTER_ALT_IDX + c_idx - 1))
1092  i++;
1093  return i;
1094 }
1095 
1096 int ff_vvc_alf_ctb_cc_idc(VVCLocalContext *lc, const int rx, const int ry, const int idx, const int cc_filters_signalled)
1097 {
1098  int inc = !idx ? ALF_CTB_CC_CB_IDC : ALF_CTB_CC_CR_IDC;
1099  int i = 0;
1100  const VVCFrameContext *fc = lc->fc;
1101  if (lc->ctb_left_flag) {
1102  const ALFParams *left = &CTB(fc->tab.alf, rx - 1, ry);
1103  inc += left->ctb_cc_idc[idx] != 0;
1104  }
1105  if (lc->ctb_up_flag) {
1106  const ALFParams *above = &CTB(fc->tab.alf, rx, ry - 1);
1107  inc += above->ctb_cc_idc[idx] != 0;
1108  }
1109 
1110  if (!GET_CABAC(inc))
1111  return 0;
1112  i++;
1113  while (i < cc_filters_signalled && get_cabac_bypass(&lc->ep->cc))
1114  i++;
1115  return i;
1116 }
1117 
1118 int ff_vvc_split_cu_flag(VVCLocalContext *lc, const int x0, const int y0,
1119  const int cb_width, const int cb_height, const int is_chroma, const VVCAllowedSplit *a)
1120 {
1121  const VVCFrameContext *fc = lc->fc;
1122  const VVCPPS *pps = fc->ps.pps;
1123  const int is_inside = (x0 + cb_width <= pps->width) && (y0 + cb_height <= pps->height);
1124 
1125  if ((a->btv || a->bth || a->ttv || a->tth || a->qt) && is_inside)
1126  {
1127  uint8_t inc = 0, left_height = cb_height, top_width = cb_width;
1128 
1129  get_left_top(lc, &left_height, &top_width, x0, y0, fc->tab.cb_height[is_chroma], fc->tab.cb_width[is_chroma]);
1130  inc += left_height < cb_height;
1131  inc += top_width < cb_width;
1132  inc += (a->btv + a->bth + a->ttv + a->tth + 2 * a->qt - 1) / 2 * 3;
1133 
1134  return GET_CABAC(SPLIT_CU_FLAG + inc);
1135 
1136  }
1137  return !is_inside;
1138 }
1139 
1140 static int split_qt_flag_decode(VVCLocalContext *lc, const int x0, const int y0, const int ch_type, const int cqt_depth)
1141 {
1142  const VVCFrameContext *fc = lc->fc;
1143  int inc = 0;
1144  uint8_t depth_left = 0, depth_top = 0;
1145 
1146  get_left_top(lc, &depth_left, &depth_top, x0, y0, fc->tab.cqt_depth[ch_type], fc->tab.cqt_depth[ch_type]);
1147  inc += depth_left > cqt_depth;
1148  inc += depth_top > cqt_depth;
1149  inc += (cqt_depth >= 2) * 3;
1150 
1151  return GET_CABAC(SPLIT_QT_FLAG + inc);
1152 }
1153 
1154 static int mtt_split_cu_vertical_flag_decode(VVCLocalContext *lc, const int x0, const int y0,
1155  const int cb_width, const int cb_height, const int ch_type, const VVCAllowedSplit* a)
1156 {
1157  if ((a->bth || a->tth) && (a->btv || a->ttv)) {
1158  int inc;
1159  const int v = a->btv + a->ttv;
1160  const int h = a->bth + a->tth;
1161  if (v > h)
1162  inc = 4;
1163  else if (v < h)
1164  inc = 3;
1165  else {
1166  const VVCFrameContext *fc = lc->fc;
1167  const VVCSPS *sps = fc->ps.sps;
1168  const int min_cb_width = fc->ps.pps->min_cb_width;
1169  const int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
1170  const int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
1171  const int x_cb = x0 >> sps->min_cb_log2_size_y;
1172  const int y_cb = y0 >> sps->min_cb_log2_size_y;
1173  const int available_a = lc->ctb_up_flag || y0b;
1174  const int available_l = lc->ctb_left_flag || x0b;
1175  const int da = cb_width / (available_a ? SAMPLE_CTB(fc->tab.cb_width[ch_type], x_cb, y_cb - 1) : 1);
1176  const int dl = cb_height / (available_l ? SAMPLE_CTB(fc->tab.cb_height[ch_type], x_cb - 1, y_cb) : 1);
1177 
1178  if (da == dl || !available_a || !available_l)
1179  inc = 0;
1180  else if (da < dl)
1181  inc = 1;
1182  else
1183  inc = 2;
1184  }
1186  }
1187  return !(a->bth || a->tth);
1188 }
1189 
1190 static int mtt_split_cu_binary_flag_decode(VVCLocalContext *lc, const int mtt_split_cu_vertical_flag, const int mtt_depth)
1191 {
1192  const int inc = (2 * mtt_split_cu_vertical_flag) + ((mtt_depth <= 1) ? 1 : 0);
1194 }
1195 
1196 VVCSplitMode ff_vvc_split_mode(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height,
1197  const int cqt_depth, const int mtt_depth, const int ch_type, const VVCAllowedSplit *a)
1198 {
1199  const int allow_no_qt = a->btv || a->bth || a->ttv || a->tth;
1200  int split_qt_flag;
1201  int mtt_split_cu_vertical_flag;
1202  int mtt_split_cu_binary_flag;
1203  const VVCSplitMode mtt_split_modes[] = {
1205  };
1206  if (allow_no_qt && a->qt) {
1207  split_qt_flag = split_qt_flag_decode(lc, x0, y0, ch_type, cqt_depth);
1208  } else {
1209  split_qt_flag = !allow_no_qt || a->qt;
1210  }
1211  if (split_qt_flag)
1212  return SPLIT_QT;
1213  mtt_split_cu_vertical_flag = mtt_split_cu_vertical_flag_decode(lc, x0, y0, cb_width, cb_height, ch_type, a);
1214  if ((a->btv && a->ttv && mtt_split_cu_vertical_flag) ||
1215  (a->bth && a->tth && !mtt_split_cu_vertical_flag)) {
1216  mtt_split_cu_binary_flag = mtt_split_cu_binary_flag_decode(lc, mtt_split_cu_vertical_flag, mtt_depth);
1217  } else {
1218  if (!a->btv && !a->bth)
1219  mtt_split_cu_binary_flag = 0;
1220  else if (!a->ttv && !a->tth)
1221  mtt_split_cu_binary_flag = 1;
1222  else if (a->bth && a->ttv)
1223  mtt_split_cu_binary_flag = 1 - mtt_split_cu_vertical_flag;
1224  else
1225  mtt_split_cu_binary_flag = mtt_split_cu_vertical_flag;
1226  }
1227  return mtt_split_modes[(mtt_split_cu_vertical_flag << 1) + mtt_split_cu_binary_flag];
1228 }
1229 
1230 int ff_vvc_non_inter_flag(VVCLocalContext *lc, const int x0, const int y0, const int ch_type)
1231 {
1232  const VVCFrameContext *fc = lc->fc;
1233  uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1234 
1235  get_left_top(lc, &left, &top, x0, y0, fc->tab.cpm[ch_type], fc->tab.cpm[ch_type]);
1236  inc = left == MODE_INTRA || top == MODE_INTRA;
1237  return GET_CABAC(NON_INTER_FLAG + inc);
1238 }
1239 
1240 int ff_vvc_pred_mode_flag(VVCLocalContext *lc, const int is_chroma)
1241 {
1242  const VVCFrameContext *fc = lc->fc;
1243  const CodingUnit *cu = lc->cu;
1244  uint8_t inc, left = MODE_INTER, top = MODE_INTER;
1245 
1246  get_left_top(lc, &left, &top, cu->x0, cu->y0, fc->tab.cpm[is_chroma], fc->tab.cpm[is_chroma]);
1247  inc = left == MODE_INTRA || top == MODE_INTRA;
1248  return GET_CABAC(PRED_MODE_FLAG + inc);
1249 }
1250 
1252 {
1253  return GET_CABAC(PRED_MODE_PLT_FLAG);
1254 }
1255 
1257 {
1259 }
1260 
1262 {
1264 }
1265 
1267 {
1269 }
1270 
1272 {
1274 }
1275 
1276 int ff_vvc_cu_skip_flag(VVCLocalContext *lc, const uint8_t *cu_skip_flag)
1277 {
1278  const int inc = get_inc(lc, cu_skip_flag);
1279  return GET_CABAC(CU_SKIP_FLAG + inc);
1280 }
1281 
1282 int ff_vvc_pred_mode_ibc_flag(VVCLocalContext *lc, const int is_chroma)
1283 {
1284  const VVCFrameContext *fc = lc->fc;
1285  const CodingUnit *cu = lc->cu;
1286  uint8_t left_mode = MODE_INTER, top_mode = MODE_INTER;
1287  int inc;
1288 
1289  get_left_top(lc, &left_mode, &top_mode, cu->x0, cu->y0, fc->tab.cpm[is_chroma], fc->tab.cpm[is_chroma]);
1290  inc = (left_mode == MODE_IBC) + (top_mode == MODE_IBC);
1291  return GET_CABAC(PRED_MODE_IBC_FLAG + inc);
1292 }
1293 
1294 static av_always_inline
1295 uint8_t get_mip_inc(VVCLocalContext *lc, const uint8_t *ctx)
1296 {
1297  uint8_t left = 0, top = 0;
1298  get_left_top(lc, &left, &top, lc->cu->x0, lc->cu->y0, ctx, ctx);
1299  return (left & 1) + (top & 1);
1300 }
1301 
1302 int ff_vvc_intra_mip_flag(VVCLocalContext *lc, const uint8_t *intra_mip_flag)
1303 {
1304  const int w = lc->cu->cb_width;
1305  const int h = lc->cu->cb_height;
1306  const int inc = (w > h * 2 || h > w * 2) ? 3 : get_mip_inc(lc, intra_mip_flag);
1307  return GET_CABAC(INTRA_MIP_FLAG + inc);
1308 }
1309 
1311 {
1312  return get_cabac_bypass(&lc->ep->cc);
1313 }
1314 
1316 {
1317  const int w = lc->cu->cb_width;
1318  const int h = lc->cu->cb_height;
1319  const int c_max = (w == 4 && h == 4) ? 15 :
1320  ((w == 4 || h == 4) || (w == 8 && h == 8)) ? 7: 5;
1321  return truncated_binary_decode(lc, c_max);
1322 }
1323 
1325 {
1326  int i;
1327  for (i = 0; i < 2; i++) {
1328  if (!GET_CABAC(INTRA_LUMA_REF_IDX + i))
1329  return i;
1330  }
1331  return i;
1332 }
1333 
1335 {
1337 }
1338 
1339 enum IspType ff_vvc_isp_split_type(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1340 {
1341  if (!intra_subpartitions_mode_flag)
1342  return ISP_NO_SPLIT;
1344 }
1345 
1347 {
1349 }
1350 
1351 int ff_vvc_intra_luma_not_planar_flag(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
1352 {
1353  return GET_CABAC(INTRA_LUMA_NOT_PLANAR_FLAG + !intra_subpartitions_mode_flag);
1354 }
1355 
1357 {
1358  int i;
1359  for (i = 0; i < 4 && get_cabac_bypass(&lc->ep->cc); i++)
1360  /* nothing */;
1361  return i;
1362 }
1363 
1365 {
1366  return truncated_binary_decode(lc, 60);
1367 }
1368 
1370 {
1371  return GET_CABAC(CCLM_MODE_FLAG);
1372 }
1373 
1375 {
1376  if (!GET_CABAC(CCLM_MODE_IDX))
1377  return 0;
1378  return get_cabac_bypass(&lc->ep->cc) + 1;
1379 }
1380 
1382 {
1384  return 4;
1385  return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1386 }
1387 
1389 {
1390  return kth_order_egk_decode(&lc->ep->cc, 0, max);
1391 }
1392 
1394 {
1395  return kth_order_egk_decode(&lc->ep->cc, 0, max);
1396 }
1397 
1399 {
1400  return fixed_length_decode(&lc->ep->cc, bit_depth);
1401 }
1402 
1404 {
1405  return get_cabac_bypass(&lc->ep->cc);
1406 }
1407 
1409 {
1411 }
1412 
1413 bool ff_vvc_run_copy_flag(VVCLocalContext *lc, const int prev_run_type, const int prev_run_position, const int cur_pos)
1414 {
1415  uint8_t run_left_lut[] = { 0, 1, 2, 3, 4 };
1416  uint8_t run_top_lut[] = { 5, 6, 6, 7, 7 };
1417 
1418  int bin_dist = cur_pos - prev_run_position - 1;
1419  uint8_t *run_lut = prev_run_type == 1 ? run_top_lut : run_left_lut;
1420  uint8_t ctx_inc = bin_dist <= 4 ? run_lut[bin_dist] : run_lut[4];
1421 
1422  return GET_CABAC(RUN_COPY_FLAG + ctx_inc);
1423 }
1424 
1426 {
1428 }
1429 
1430 int ff_vvc_palette_idx_idc(VVCLocalContext *lc, const int max_palette_index, const bool adjust)
1431 {
1432  return truncated_binary_decode(lc, max_palette_index - adjust);
1433 }
1434 
1436 {
1437  return kth_order_egk_decode(&lc->ep->cc, 5, max);
1438 }
1439 
1441 {
1442  return GET_CABAC(GENERAL_MERGE_FLAG);
1443 }
1444 
1445 static int get_inter_flag_inc(VVCLocalContext *lc, const int x0, const int y0)
1446 {
1447  uint8_t left_merge = 0, top_merge = 0;
1448  uint8_t left_affine = 0, top_affine = 0;
1449  const VVCFrameContext *fc = lc->fc;
1450 
1451  get_left_top(lc, &left_merge, &top_merge, x0, y0, fc->tab.msf, fc->tab.msf);
1452  get_left_top(lc, &left_affine, &top_affine, x0, y0, fc->tab.iaf, fc->tab.iaf);
1453  return (left_merge || left_affine) + (top_merge + top_affine);
1454 }
1455 
1457 {
1458  const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1459  return GET_CABAC(MERGE_SUBBLOCK_FLAG + inc);
1460 }
1461 
1462 int ff_vvc_merge_subblock_idx(VVCLocalContext *lc, const int max_num_subblock_merge_cand)
1463 {
1464  int i;
1466  return 0;
1467  for (i = 1; i < max_num_subblock_merge_cand - 1 && get_cabac_bypass(&lc->ep->cc); i++)
1468  /* nothing */;
1469  return i;
1470 }
1471 
1472 int ff_vvc_regular_merge_flag(VVCLocalContext *lc, const int cu_skip_flag)
1473 {
1474  int inc = !cu_skip_flag;
1475  return GET_CABAC(REGULAR_MERGE_FLAG + inc);
1476 }
1477 
1479 {
1480  return GET_CABAC(MMVD_MERGE_FLAG);
1481 }
1482 
1484 {
1485  return GET_CABAC(MMVD_CAND_FLAG);
1486 }
1487 
1489 {
1490  int i;
1492  return 0;
1493  for (i = 1; i < 7 && get_cabac_bypass(&lc->ep->cc); i++)
1494  /* nothing */;
1495  return i;
1496 }
1497 
1499 {
1500  return (get_cabac_bypass(&lc->ep->cc) << 1) | get_cabac_bypass(&lc->ep->cc);
1501 }
1502 
1503 void ff_vvc_mmvd_offset_coding(VVCLocalContext *lc, Mv *mmvd_offset, const int ph_mmvd_fullpel_only_flag)
1504 {
1505  const int shift = ph_mmvd_fullpel_only_flag ? 4 : 2;
1506  const int mmvd_distance = 1 << (mmvd_distance_idx_decode(lc) + shift);
1507  const int mmvd_direction_idx = mmvd_direction_idx_decode(lc);
1508  const int mmvd_signs[][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
1509  mmvd_offset->x = mmvd_distance * mmvd_signs[mmvd_direction_idx][0];
1510  mmvd_offset->y = mmvd_distance * mmvd_signs[mmvd_direction_idx][1];
1511 }
1512 
1514 {
1515  const VVCFrameContext *fc = lc->fc;
1516  const CodingUnit *cu = lc->cu;
1517  PredMode pred_mode;
1518 
1519  if (cu->tree_type != DUAL_TREE_CHROMA) {
1520  pred_mode = cu->pred_mode;
1521  } else {
1522  const int x_cb = cu->x0 >> fc->ps.sps->min_cb_log2_size_y;
1523  const int y_cb = cu->y0 >> fc->ps.sps->min_cb_log2_size_y;
1524  const int min_cb_width = fc->ps.pps->min_cb_width;
1525  pred_mode = SAMPLE_CTB(fc->tab.cpm[0], x_cb, y_cb);
1526  }
1527  return pred_mode;
1528 }
1529 
1531 {
1532  const VVCSPS *sps = lc->fc->ps.sps;
1533  const int is_ibc = get_luma_pred_mode(lc) == MODE_IBC;
1534  const int c_max = (is_ibc ? sps->max_num_ibc_merge_cand : sps->max_num_merge_cand) - 1;
1535  int i;
1536 
1537  if (!GET_CABAC(MERGE_IDX))
1538  return 0;
1539 
1540  for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1541  /* nothing */;
1542  return i;
1543 }
1544 
1546 {
1547  return fixed_length_decode(&lc->ep->cc, 6);
1548 }
1549 
1550 int ff_vvc_merge_gpm_idx(VVCLocalContext *lc, const int idx)
1551 {
1552  const int c_max = lc->fc->ps.sps->max_num_gpm_merge_cand - idx - 1;
1553  int i;
1554 
1555  if (!GET_CABAC(MERGE_IDX))
1556  return 0;
1557 
1558  for (i = 1; i < c_max && get_cabac_bypass(&lc->ep->cc); i++)
1559  /* nothing */;
1560 
1561  return i;
1562 }
1563 
1565 {
1566  return GET_CABAC(CIIP_FLAG);
1567 }
1568 
1570 {
1571  const int w = lc->cu->cb_width;
1572  const int h = lc->cu->cb_height;
1573  if (!is_b)
1574  return PF_L0;
1575  if (w + h > 12) {
1576  const int log2 = av_log2(w) + av_log2(h);
1577  const int inc = 7 - ((1 + log2)>>1);
1578  if (GET_CABAC(INTER_PRED_IDC + inc))
1579  return PF_BI;
1580  }
1581  return PF_L0 + GET_CABAC(INTER_PRED_IDC + 5);
1582 }
1583 
1585 {
1586  const int inc = get_inter_flag_inc(lc, lc->cu->x0, lc->cu->y0);
1587  return GET_CABAC(INTER_AFFINE_FLAG + inc);
1588 }
1589 
1591 {
1593 }
1594 
1596 {
1597  return GET_CABAC(SYM_MVD_FLAG);
1598 }
1599 
1600 int ff_vvc_ref_idx_lx(VVCLocalContext *lc, const uint8_t nb_refs)
1601 {
1602  const int c_max = nb_refs - 1;
1603  const int max_ctx = FFMIN(c_max, 2);
1604  int i = 0;
1605 
1606  while (i < max_ctx && GET_CABAC(REF_IDX_LX + i))
1607  i++;
1608  if (i == 2) {
1609  while (i < c_max && get_cabac_bypass(&lc->ep->cc))
1610  i++;
1611  }
1612  return i;
1613 }
1614 
1616 {
1618 }
1619 
1621 {
1623 }
1624 
1626 {
1627  return limited_kth_order_egk_decode(&lc->ep->cc, 1, 15, 17);
1628 }
1629 
1631 {
1632  return get_cabac_bypass(&lc->ep->cc);
1633 }
1634 
1636 {
1637  return GET_CABAC(MVP_LX_FLAG);
1638 }
1639 
1640 static int amvr_flag(VVCLocalContext *lc, const int inter_affine_flag)
1641 {
1642  return GET_CABAC(AMVR_FLAG + inter_affine_flag);
1643 }
1644 
1645 static int amvr_precision_idx(VVCLocalContext *lc, const int inc, const int c_max)
1646 {
1647  int i = 0;
1649  return 0;
1650  i++;
1651  if (i < c_max && GET_CABAC(AMVR_PRECISION_IDX + 1))
1652  i++;
1653  return i;
1654 }
1655 
1656 int ff_vvc_amvr_shift(VVCLocalContext *lc, const int inter_affine_flag,
1657  const PredMode pred_mode, const int has_amvr_flag)
1658 {
1659  int amvr_shift = 2;
1660  if (has_amvr_flag) {
1661  if (pred_mode == MODE_IBC || amvr_flag(lc, inter_affine_flag)) {
1662  int idx;
1663  if (inter_affine_flag) {
1664  idx = amvr_precision_idx(lc, 2, 1);
1665  amvr_shift = idx * 4;
1666  } else if (pred_mode == MODE_IBC) {
1667  idx = amvr_precision_idx(lc, 1, 1);
1668  amvr_shift = 4 + idx * 2;
1669  } else {
1670  static const int shifts[] = {3, 4, 6};
1671  idx = amvr_precision_idx(lc, 0, 2);
1672  amvr_shift = shifts[idx];
1673  }
1674  }
1675  }
1676  return amvr_shift;
1677 }
1678 
1679 int ff_vvc_bcw_idx(VVCLocalContext *lc, const int no_backward_pred_flag)
1680 {
1681  const int c_max = no_backward_pred_flag ? 4 : 2;
1682  int i = 1;
1683  if (!GET_CABAC(BCW_IDX))
1684  return 0;
1685  while (i < c_max && get_cabac_bypass(&lc->ep->cc))
1686  i++;
1687  return i;
1688 }
1689 
1691 {
1692  return GET_CABAC(TU_CB_CODED_FLAG + lc->cu->bdpcm_flag[1]);
1693 }
1694 
1695 int ff_vvc_tu_cr_coded_flag(VVCLocalContext *lc, int tu_cb_coded_flag)
1696 {
1697  return GET_CABAC(TU_CR_CODED_FLAG + (lc->cu->bdpcm_flag[1] ? 2 : tu_cb_coded_flag));
1698 }
1699 
1701 {
1702  const CodingUnit *cu = lc->cu;
1703  int inc;
1704  if (cu->bdpcm_flag[0])
1705  inc = 1;
1706  else if (cu->isp_split_type == ISP_NO_SPLIT)
1707  inc = 0;
1708  else
1709  inc = 2 + lc->parse.prev_tu_cbf_y;
1711  return lc->parse.prev_tu_cbf_y;
1712 }
1713 
1715 {
1717 }
1718 
1720 {
1721  int v, i, k;
1722  if (!GET_CABAC(CU_QP_DELTA_ABS))
1723  return 0;
1724 
1725  // prefixVal
1726  for (v = 1; v < 5 && GET_CABAC(CU_QP_DELTA_ABS + 1); v++)
1727  /* nothing */;
1728  if (v < 5)
1729  return v;
1730 
1731  // 9.3.3.5 k-th order Exp-Golomb binarization process
1732  // suffixVal
1733 
1734  // CuQpDeltaVal shall in the range of −( 32 + QpBdOffset / 2 ) to +( 31 + QpBdOffset / 2 )
1735  // so k = 6 should enough
1736  for (k = 0; k < 6 && get_cabac_bypass(&lc->ep->cc); k++)
1737  /* nothing */;
1738  i = (1 << k) - 1;
1739  v = 0;
1740  while (k--)
1741  v = (v << 1) + get_cabac_bypass(&lc->ep->cc);
1742  v += i;
1743 
1744  return v + 5;
1745 }
1746 
1748 {
1749  return get_cabac_bypass(&lc->ep->cc);
1750 }
1751 
1753 {
1755 }
1756 
1758 {
1759  const int c_max = lc->fc->ps.pps->r->pps_chroma_qp_offset_list_len_minus1;
1760  int i;
1761  for (i = 0; i < c_max && GET_CABAC(CU_CHROMA_QP_OFFSET_IDX); i++)
1762  /* nothing */;
1763  return i;
1764 }
1765 
1767  const int log2_tb_size, const int log2_zo_tb_size, const int c_idx, const int ctx)
1768 {
1769  int i = 0;
1770  int max = (log2_zo_tb_size << 1) - 1;
1771  int ctx_offset, ctx_shift;
1772  if (!log2_tb_size)
1773  return 0;
1774  if (!c_idx) {
1775  const int offset_y[] = {0, 0, 3, 6, 10, 15};
1776  ctx_offset = offset_y[log2_tb_size - 1];
1777  ctx_shift = (log2_tb_size + 1) >> 2;
1778  } else {
1779  const int shifts[] = {0, 0, 0, 1, 2, 2, 2};
1780  ctx_offset = 20;
1781  ctx_shift = shifts[log2_tb_size];
1782  }
1783  while (i < max && GET_CABAC(ctx + (i >> ctx_shift) + ctx_offset))
1784  i++;
1785  return i;
1786 }
1787 
1789  const int log2_tb_width, const int log2_zo_tb_width, const int c_idx)
1790 {
1791  return last_significant_coeff_xy_prefix(lc, log2_tb_width, log2_zo_tb_width, c_idx, LAST_SIG_COEFF_X_PREFIX);
1792 }
1793 
1795  const int log2_tb_height, const int log2_zo_tb_height, const int c_idx)
1796 {
1797  return last_significant_coeff_xy_prefix(lc, log2_tb_height, log2_zo_tb_height, c_idx, LAST_SIG_COEFF_Y_PREFIX);
1798 }
1799 
1801  const int last_significant_coeff_y_prefix)
1802 {
1803  const int length = (last_significant_coeff_y_prefix >> 1) - 1;
1804  int value = get_cabac_bypass(&lc->ep->cc);
1805 
1806  for (int i = 1; i < length; i++)
1807  value = (value << 1) | get_cabac_bypass(&lc->ep->cc);
1808  return value;
1809 }
1810 
1811 int ff_vvc_tu_joint_cbcr_residual_flag(VVCLocalContext *lc, const int tu_cb_coded_flag, const int tu_cr_coded_flag)
1812 {
1813  return GET_CABAC(TU_JOINT_CBCR_RESIDUAL_FLAG + 2 * tu_cb_coded_flag + tu_cr_coded_flag - 1);
1814 }
1815 
1817 {
1818  return GET_CABAC(TRANSFORM_SKIP_FLAG + inc);
1819 }
1820 
1821 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1822 static int get_local_sum(const int *level, const int w, const int h,
1823  const int xc, const int yc, const int hist_value)
1824 {
1825  int loc_sum = 3 * hist_value;
1826  level += w * yc + xc;
1827  if (xc < w - 1) {
1828  loc_sum += level[1];
1829  if (xc < w - 2)
1830  loc_sum += level[2] - hist_value;
1831  if (yc < h - 1)
1832  loc_sum += level[w + 1] - hist_value;
1833  }
1834  if (yc < h - 1) {
1835  loc_sum += level[w];
1836  if (yc < h - 2)
1837  loc_sum += level[w << 1] - hist_value;
1838  }
1839  return loc_sum;
1840 }
1841 
1842 //9.3.4.2.7 Derivation process for the variables locNumSig, locSumAbsPass1
1843 static int get_local_sum_ts(const int *level, const int w, const int h, const int xc, const int yc)
1844 {
1845  int loc_sum = 0;
1846  level += w * yc + xc;
1847  if (xc > 0)
1848  loc_sum += level[-1];
1849  if (yc > 0)
1850  loc_sum += level[-w];
1851  return loc_sum;
1852 }
1853 
1854 static int get_gtx_flag_inc(const ResidualCoding* rc, const int xc, const int yc, const int last)
1855 {
1856  const TransformBlock *tb = rc->tb;
1857  int inc;
1858  if (last) {
1859  const int incs[] = {0, 21, 21};
1860  inc = incs[tb->c_idx];
1861  } else {
1862  const int d = xc + yc;
1863  const int local_sum_sig = get_local_sum(rc->sig_coeff_flag,
1864  tb->tb_width,tb->tb_height, xc, yc, rc->hist_value);
1865  const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1866  tb->tb_width, tb->tb_height, xc, yc, rc->hist_value);
1867  const int offset = FFMIN(loc_sum_abs_pass1 - local_sum_sig, 4);
1868 
1869  if (!tb->c_idx)
1870  inc = 1 + offset + (!d ? 15 : (d < 3 ? 10 : (d < 10 ? 5 : 0)));
1871  else
1872  inc = 22 + offset + (!d ? 5 : 0);
1873  }
1874  return inc;
1875 }
1876 
1878 {
1879  return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
1880 }
1881 
1882 static int par_level_flag_decode(VVCLocalContext *lc, const int inc)
1883 {
1884  return GET_CABAC(PAR_LEVEL_FLAG + inc);
1885 }
1886 
1888 {
1889  const int inc = 32;
1890  return GET_CABAC(PAR_LEVEL_FLAG + inc);
1891 }
1892 
1893 static int sb_coded_flag_decode(VVCLocalContext *lc, const uint8_t *sb_coded_flag,
1894  const ResidualCoding *rc, const int xs, const int ys)
1895 {
1896  const H266RawSliceHeader *rsh = lc->sc->sh.r;
1897  const TransformBlock *tb = rc->tb;
1898  const int w = rc->width_in_sbs;
1899  const int h = rc->height_in_sbs;
1900  int inc;
1901 
1902  if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1903  const int left = xs > 0 ? sb_coded_flag[-1] : 0;
1904  const int above = ys > 0 ? sb_coded_flag[-w] : 0;
1905  inc = left + above + 4;
1906  } else {
1907  const int right = (xs < w - 1) ? sb_coded_flag[1] : 0;
1908  const int bottom = (ys < h - 1) ? sb_coded_flag[w] : 0;
1909  inc = (right | bottom) + (tb->c_idx ? 2 : 0);
1910  }
1911  return GET_CABAC(SB_CODED_FLAG + inc);
1912 }
1913 
1914 static int sig_coeff_flag_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1915 {
1916  const H266RawSliceHeader *rsh = lc->sc->sh.r;
1917  const TransformBlock *tb = rc->tb;
1918  int inc;
1919 
1920  if (tb->ts && !rsh->sh_ts_residual_coding_disabled_flag) {
1921  const int local_num_sig = get_local_sum_ts(rc->sig_coeff_flag, tb->tb_width, tb->tb_height, xc, yc);
1922  inc = 60 + local_num_sig;
1923  } else {
1924  const int d = xc + yc;
1925  const int loc_sum_abs_pass1 = get_local_sum(rc->abs_level_pass1,
1926  tb->tb_width, tb->tb_height, xc, yc, 0);
1927 
1928  if (!tb->c_idx) {
1929  inc = 12 * FFMAX(0, rc->qstate - 1) + FFMIN((loc_sum_abs_pass1 + 1) >> 1, 3) + ((d < 2) ? 8 : (d < 5 ? 4 : 0));
1930  } else {
1931  inc = 36 + 8 * FFMAX(0, rc->qstate - 1) + FFMIN((loc_sum_abs_pass1 + 1) >> 1, 3) + (d < 2 ? 4 : 0);
1932  }
1933  }
1934  return GET_CABAC(SIG_COEFF_FLAG + inc);
1935 }
1936 
1938  const int xc, const int yc, const int base_level)
1939 {
1940  const VVCSPS *sps = lc->fc->ps.sps;
1941  const TransformBlock* tb = rc->tb;
1942  const int rice_params[] = {
1943  0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2,
1944  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
1945  };
1946  int loc_sum_abs;
1947  int shift_val;
1948 
1949  loc_sum_abs = get_local_sum(rc->abs_level, tb->tb_width, tb->tb_height, xc,
1950  yc, rc->hist_value);
1951 
1952  if (!sps->r->sps_rrc_rice_extension_flag) {
1953  shift_val = 0;
1954  } else {
1955  shift_val = (av_log2(FFMAX(FFMIN(loc_sum_abs, 2048), 8)) - 3) & ~1;
1956  }
1957 
1958  loc_sum_abs = av_clip_uintp2((loc_sum_abs >> shift_val) - base_level * 5, 5);
1959 
1960  return rice_params[loc_sum_abs] + shift_val;
1961 }
1962 
1963 static int abs_decode(VVCLocalContext *lc, const int c_rice_param)
1964 {
1965  const VVCSPS *sps = lc->fc->ps.sps;
1966  const int MAX_BIN = 6;
1967  int prefix = 0;
1968  int suffix = 0;
1969 
1970  while (prefix < MAX_BIN && get_cabac_bypass(&lc->ep->cc))
1971  prefix++;
1972  if (prefix < MAX_BIN) {
1973  for (int i = 0; i < c_rice_param; i++) {
1974  suffix = (suffix << 1) | get_cabac_bypass(&lc->ep->cc);
1975  }
1976  } else {
1978  c_rice_param + 1,
1979  26 - sps->log2_transform_range,
1980  sps->log2_transform_range);
1981  }
1982  return suffix + (prefix << c_rice_param);
1983 }
1984 
1985 static int abs_remainder_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
1986 {
1987  const VVCSPS *sps = lc->fc->ps.sps;
1988  const H266RawSliceHeader *rsh = lc->sc->sh.r;
1989  const int base_level[][2][2] = {
1990  { {4, 4}, {4, 4} },
1991  { {3, 2}, {2, 1} }
1992  };
1993  const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc,
1994  base_level[sps->r->sps_rrc_rice_extension_flag][sps->bit_depth > 12][IS_I(rsh)]);
1995  const int rem = abs_decode(lc, c_rice_param);
1996 
1997  return rem;
1998 }
1999 
2000 static int abs_remainder_ts_decode(VVCLocalContext *lc, const ResidualCoding* rc, const int xc, const int yc)
2001 {
2002  const H266RawSliceHeader *rsh = lc->sc->sh.r;
2003  const int c_rice_param = rsh->sh_ts_residual_coding_rice_idx_minus1 + 1;
2004  const int rem = abs_decode(lc, c_rice_param);
2005 
2006  return rem;
2007 }
2008 
2010 {
2011  return get_cabac_bypass(&lc->ep->cc);
2012 }
2013 
2014 //9.3.4.2.10 Derivation process of ctxInc for the syntax element coeff_sign_flag for transform skip mode
2015 static int coeff_sign_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
2016 {
2017  const TransformBlock *tb = rc->tb;
2018  const int w = tb->tb_width;
2019  const int *level = rc->coeff_sign_level + yc * w + xc;
2020  const int left_sign = xc ? level[-1] : 0;
2021  const int above_sign = yc ? level[-w] : 0;
2022  const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
2023  int inc;
2024 
2025  if (left_sign == -above_sign)
2026  inc = bdpcm_flag ? 3 : 0;
2027  else if (left_sign >= 0 && above_sign >= 0)
2028  inc = bdpcm_flag ? 4 : 1;
2029  else
2030  inc = bdpcm_flag ? 5 : 2;
2031  return GET_CABAC(COEFF_SIGN_FLAG + inc);
2032 }
2033 
2034 static int abs_level_gt1_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
2035 {
2036  const TransformBlock *tb = rc->tb;
2037  const int *sig_coeff_flag = rc->sig_coeff_flag + yc * tb->tb_width + xc;
2038  int inc;
2039 
2040  if (cu->bdpcm_flag[tb->c_idx]) {
2041  inc = 67;
2042  } else {
2043  const int l = xc > 0 ? sig_coeff_flag[-1] : 0;
2044  const int a = yc > 0 ? sig_coeff_flag[-tb->tb_width] : 0;
2045  inc = 64 + a + l;
2046  }
2047  return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
2048 }
2049 
2050 static int abs_level_gtx_flag_ts_decode(VVCLocalContext *lc, const int j)
2051 {
2052  const int inc = 67 + j;
2053  return GET_CABAC(ABS_LEVEL_GTX_FLAG + inc);
2054 }
2055 
2056 static const uint8_t qstate_translate_table[][2] = {
2057  { 0, 2 }, { 2, 0 }, { 1, 3 }, { 3, 1 }
2058 };
2059 
2061  const int xc, const int yc, int *abs_level)
2062 {
2063  const int c_rice_param = abs_get_rice_param(lc, rc, xc, yc, 0);
2064  const int dec_abs_level = abs_decode(lc, c_rice_param);
2065  const int zero_pos = (rc->qstate < 2 ? 1 : 2) << c_rice_param;
2066 
2067  *abs_level = 0;
2068  if (dec_abs_level != zero_pos) {
2069  *abs_level = dec_abs_level;
2070  if (dec_abs_level < zero_pos)
2071  *abs_level += 1;
2072  }
2073  return dec_abs_level;
2074 }
2075 
2077  const int remainder, const int addin)
2078 {
2079  int *stat = ep->stat_coeff + rc->tb->c_idx;
2080  if (rc->update_hist && remainder > 0) {
2081  *stat = (*stat + av_log2(remainder) + addin) >> 1;
2082  rc->update_hist = 0;
2083  }
2084 }
2085 
2087  const int log2_zo_tb_width, const int log2_zo_tb_height,
2088  TransformBlock *tb)
2089 {
2090  const VVCSPS *sps = lc->fc->ps.sps;
2091  int log2_sb_w = (FFMIN(log2_zo_tb_width, log2_zo_tb_height ) < 2 ? 1 : 2 );
2092  int log2_sb_h = log2_sb_w;
2093 
2094  if ( log2_zo_tb_width + log2_zo_tb_height > 3 ) {
2095  if ( log2_zo_tb_width < 2 ) {
2096  log2_sb_w = log2_zo_tb_width;
2097  log2_sb_h = 4 - log2_sb_w;
2098  } else if ( log2_zo_tb_height < 2 ) {
2099  log2_sb_h = log2_zo_tb_height;
2100  log2_sb_w = 4 - log2_sb_h;
2101  }
2102  }
2103  rc->log2_sb_w = log2_sb_w;
2104  rc->log2_sb_h = log2_sb_h;
2105  rc->num_sb_coeff = 1 << (log2_sb_w + log2_sb_h);
2106  rc->last_sub_block = ( 1 << ( log2_zo_tb_width + log2_zo_tb_height - (log2_sb_w + log2_sb_h))) - 1;
2107  rc->hist_value = sps->r->sps_persistent_rice_adaptation_enabled_flag ? (1 << lc->ep->stat_coeff[tb->c_idx]) : 0;
2108  rc->update_hist = sps->r->sps_persistent_rice_adaptation_enabled_flag ? 1 : 0;
2109  rc->rem_bins_pass1 = (( 1 << ( log2_zo_tb_width + log2_zo_tb_height)) * 7 ) >> 2;
2110 
2111 
2112  rc->sb_scan_x_off = ff_vvc_diag_scan_x[log2_zo_tb_width - log2_sb_w][log2_zo_tb_height - log2_sb_h];
2113  rc->sb_scan_y_off = ff_vvc_diag_scan_y[log2_zo_tb_width - log2_sb_w][log2_zo_tb_height - log2_sb_h];
2114 
2115  rc->scan_x_off = ff_vvc_diag_scan_x[log2_sb_w][log2_sb_h];
2116  rc->scan_y_off = ff_vvc_diag_scan_y[log2_sb_w][log2_sb_h];
2117 
2118  rc->infer_sb_cbf = 1;
2119 
2120  rc->width_in_sbs = (1 << (log2_zo_tb_width - log2_sb_w));
2121  rc->height_in_sbs = (1 << (log2_zo_tb_height - log2_sb_h));
2122  rc->nb_sbs = rc->width_in_sbs * rc->height_in_sbs;
2123 
2124  rc->last_scan_pos = rc->num_sb_coeff;
2125  rc->qstate = 0;
2126 
2127  rc->tb = tb;
2128 }
2129 
2131 {
2132  const CodingUnit *cu = lc->cu;
2133  TransformBlock *tb = rc->tb;
2134  const int bdpcm_flag = cu->bdpcm_flag[tb->c_idx];
2135  const int xs = rc->sb_scan_x_off[i];
2136  const int ys = rc->sb_scan_y_off[i];
2137  uint8_t *sb_coded_flag = rc->sb_coded_flag + ys * rc->width_in_sbs + xs;
2138  int infer_sb_sig_coeff_flag = 1;
2139  int last_scan_pos_pass1 = -1, last_scan_pos_pass2 = -1, n;
2140  int abs_level_gtx_flag[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE];
2141  int abs_level_pass2[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE]; ///< AbsLevelPass2
2142 
2143  if (i != rc->last_sub_block || !rc->infer_sb_cbf)
2144  *sb_coded_flag = sb_coded_flag_decode(lc, sb_coded_flag, rc, xs, ys);
2145  else
2146  *sb_coded_flag = 1;
2147  if (*sb_coded_flag && i < rc->last_sub_block)
2148  rc->infer_sb_cbf = 0;
2149 
2150  //first scan pass
2151  for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2152  const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2153  const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2154  const int off = yc * tb->tb_width + xc;
2155  int *sig_coeff_flag = rc->sig_coeff_flag + off;
2156  int *abs_level_pass1 = rc->abs_level_pass1 + off;
2157  int *coeff_sign_level = rc->coeff_sign_level + off;
2158  int par_level_flag = 0;
2159 
2160  abs_level_gtx_flag[n] = 0;
2161  last_scan_pos_pass1 = n;
2162  if (*sb_coded_flag && (n != rc->num_sb_coeff - 1 || !infer_sb_sig_coeff_flag)) {
2163  *sig_coeff_flag = sig_coeff_flag_decode(lc, rc, xc, yc);
2164  rc->rem_bins_pass1--;
2165  if (*sig_coeff_flag)
2166  infer_sb_sig_coeff_flag = 0;
2167  } else {
2168  *sig_coeff_flag = (n == rc->num_sb_coeff - 1) && infer_sb_sig_coeff_flag && *sb_coded_flag;
2169  }
2170  *coeff_sign_level = 0;
2171  if (*sig_coeff_flag) {
2172  *coeff_sign_level = 1 - 2 * coeff_sign_flag_ts_decode(lc, cu, rc, xc, yc);
2173  abs_level_gtx_flag[n] = abs_level_gt1_flag_ts_decode(lc, cu, rc, xc, yc);
2174  rc->rem_bins_pass1 -= 2;
2175  if (abs_level_gtx_flag[n]) {
2176  par_level_flag = par_level_flag_ts_decode(lc);
2177  rc->rem_bins_pass1--;
2178  }
2179  }
2180  *abs_level_pass1 = *sig_coeff_flag + par_level_flag + abs_level_gtx_flag[n];
2181  }
2182 
2183  //greater than x scan pass
2184  for (n = 0; n < rc->num_sb_coeff && rc->rem_bins_pass1 >= 4; n++) {
2185  const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2186  const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2187  const int off = yc * tb->tb_width + xc;
2188 
2189  abs_level_pass2[n] = rc->abs_level_pass1[off];
2190  for (int j = 1; j < 5 && abs_level_gtx_flag[n]; j++) {
2191  abs_level_gtx_flag[n] = abs_level_gtx_flag_ts_decode(lc, j);
2192  abs_level_pass2[n] += abs_level_gtx_flag[n] << 1;
2193  rc->rem_bins_pass1--;
2194  }
2195  last_scan_pos_pass2 = n;
2196  }
2197 
2198  /* remainder scan pass */
2199  for (n = 0; n < rc->num_sb_coeff; n++) {
2200  const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2201  const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2202  const int off = yc * tb->tb_width + xc;
2203  const int *abs_level_pass1 = rc->abs_level_pass1 + off;
2204  int *abs_level = rc->abs_level + off;
2205  int *coeff_sign_level = rc->coeff_sign_level + off;
2206  int abs_remainder = 0;
2207 
2208  if ((n <= last_scan_pos_pass2 && abs_level_pass2[n] >= 10) ||
2209  (n > last_scan_pos_pass2 && n <= last_scan_pos_pass1 &&
2210  *abs_level_pass1 >= 2) ||
2211  (n > last_scan_pos_pass1 && *sb_coded_flag))
2212  abs_remainder = abs_remainder_ts_decode(lc, rc, xc, yc);
2213  if (n <= last_scan_pos_pass2) {
2214  *abs_level = abs_level_pass2[n] + 2 * abs_remainder;
2215  } else if (n <= last_scan_pos_pass1) {
2216  *abs_level = *abs_level_pass1 + 2 * abs_remainder;
2217  } else {
2218  *abs_level = abs_remainder;
2219  if (abs_remainder) {
2220  //n > lastScanPosPass1
2221  *coeff_sign_level = 1 - 2 * coeff_sign_flag_decode(lc);
2222  }
2223  }
2224  if (!bdpcm_flag && n <= last_scan_pos_pass1) {
2225  const int left = xc > 0 ? abs_level[-1] : 0;
2226  const int above = yc > 0 ? abs_level[-tb->tb_width] : 0;
2227  const int pred = FFMAX(left, above);
2228 
2229  if (*abs_level == 1 && pred > 0)
2230  *abs_level = pred;
2231  else if (*abs_level > 0 && *abs_level <= pred)
2232  (*abs_level)--;
2233  }
2234  if (*abs_level) {
2235  tb->coeffs[off] = *coeff_sign_level * *abs_level;
2236  tb->max_scan_x = FFMAX(xc, tb->max_scan_x);
2237  tb->max_scan_y = FFMAX(yc, tb->max_scan_y);
2238  tb->min_scan_x = FFMIN(xc, tb->min_scan_x);
2239  tb->min_scan_y = FFMIN(yc, tb->min_scan_y);
2240  } else {
2241  tb->coeffs[off] = 0;
2242  }
2243  }
2244 
2245  return 0;
2246 }
2247 
2249 {
2250  ResidualCoding rc;
2251  tb->min_scan_x = tb->min_scan_y = INT_MAX;
2252  init_residual_coding(lc, &rc, tb->log2_tb_width, tb->log2_tb_height, tb);
2253  for (int i = 0; i <= rc.last_sub_block; i++) {
2254  int ret = residual_ts_coding_subblock(lc, &rc, i);
2255  if (ret < 0)
2256  return ret;
2257  }
2258 
2259  return 0;
2260 }
2261 
2262 static inline int residual_coding_subblock(VVCLocalContext *lc, ResidualCoding *rc, const int i)
2263 {
2264  const H266RawSliceHeader *rsh = lc->sc->sh.r;
2265  TransformBlock *tb = rc->tb;
2266  int first_sig_scan_pos_sb, last_sig_scan_pos_sb;
2267  int first_pos_mode0, first_pos_mode1;
2268  int infer_sb_dc_sig_coeff_flag = 0;
2269  int n, sig_hidden_flag, sum = 0;
2270  int abs_level_gt2_flag[MAX_SUB_BLOCK_SIZE * MAX_SUB_BLOCK_SIZE];
2271  const int start_qstate_sb = rc->qstate;
2272  const int xs = rc->sb_scan_x_off[i];
2273  const int ys = rc->sb_scan_y_off[i];
2274  uint8_t *sb_coded_flag = rc->sb_coded_flag + ys * rc->width_in_sbs + xs;
2275 
2276 
2278  if (i < rc->last_sub_block && i > 0) {
2279  *sb_coded_flag = sb_coded_flag_decode(lc, sb_coded_flag, rc, xs, ys);
2280  infer_sb_dc_sig_coeff_flag = 1;
2281  } else {
2282  *sb_coded_flag = 1;
2283  }
2284  if (*sb_coded_flag && (xs > 3 || ys > 3) && !tb->c_idx)
2286 
2287  if (!*sb_coded_flag)
2288  return 0;
2289 
2290  first_sig_scan_pos_sb = rc->num_sb_coeff;
2291  last_sig_scan_pos_sb = -1;
2292  first_pos_mode0 = (i == rc->last_sub_block ? rc->last_scan_pos : rc->num_sb_coeff -1);
2293  first_pos_mode1 = first_pos_mode0;
2294  for (n = first_pos_mode0; n >= 0 && rc->rem_bins_pass1 >= 4; n--) {
2295  const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2296  const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2297  const int last = (xc == rc->last_significant_coeff_x && yc == rc->last_significant_coeff_y);
2298  int *abs_level_pass1 = rc->abs_level_pass1 + yc * tb->tb_width + xc;
2299  int *sig_coeff_flag = rc->sig_coeff_flag + yc * tb->tb_width + xc;
2300 
2301  if ((n > 0 || !infer_sb_dc_sig_coeff_flag ) && !last) {
2302  *sig_coeff_flag = sig_coeff_flag_decode(lc, rc, xc, yc);
2303  rc->rem_bins_pass1--;
2304  if (*sig_coeff_flag)
2305  infer_sb_dc_sig_coeff_flag = 0;
2306  } else {
2307  *sig_coeff_flag = last || (!rc->scan_x_off[n] && !rc ->scan_y_off[n] &&
2308  infer_sb_dc_sig_coeff_flag);
2309  }
2310  *abs_level_pass1 = 0;
2311  if (*sig_coeff_flag) {
2312  int abs_level_gt1_flag, par_level_flag = 0;
2313  const int inc = get_gtx_flag_inc(rc, xc, yc, last);
2314  abs_level_gt1_flag = abs_level_gtx_flag_decode(lc, inc);
2315  rc->rem_bins_pass1--;
2316  if (abs_level_gt1_flag) {
2317  par_level_flag = par_level_flag_decode(lc, inc);
2318  abs_level_gt2_flag[n] = abs_level_gtx_flag_decode(lc, inc + 32);
2319  rc->rem_bins_pass1 -= 2;
2320  } else {
2321  abs_level_gt2_flag[n] = 0;
2322  }
2323  if (last_sig_scan_pos_sb == -1)
2324  last_sig_scan_pos_sb = n;
2325  first_sig_scan_pos_sb = n;
2326 
2327  *abs_level_pass1 =
2328  1 + par_level_flag + abs_level_gt1_flag + (abs_level_gt2_flag[n] << 1);
2329  } else {
2330  abs_level_gt2_flag[n] = 0;
2331  }
2332 
2333  if (rsh->sh_dep_quant_used_flag)
2334  rc->qstate = qstate_translate_table[rc->qstate][*abs_level_pass1 & 1];
2335 
2336  first_pos_mode1 = n - 1;
2337  }
2338  for (n = first_pos_mode0; n > first_pos_mode1; n--) {
2339  const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2340  const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2341  const int *abs_level_pass1 = rc->abs_level_pass1 + yc * tb->tb_width + xc;
2342  int *abs_level = rc->abs_level + yc * tb->tb_width + xc;
2343 
2344  *abs_level = *abs_level_pass1;
2345  if (abs_level_gt2_flag[n]) {
2346  const int abs_remainder = abs_remainder_decode(lc, rc, xc, yc);
2347  ep_update_hist(lc->ep, rc, abs_remainder, 2);
2348  *abs_level += 2 * abs_remainder;
2349  }
2350  }
2351  for (n = first_pos_mode1; n >= 0; n--) {
2352  const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2353  const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2354  int *abs_level = rc->abs_level + yc * tb->tb_width + xc;
2355 
2356  if (*sb_coded_flag) {
2357  const int dec_abs_level = dec_abs_level_decode(lc, rc, xc, yc, abs_level);
2358  ep_update_hist(lc->ep, rc, dec_abs_level, 0);
2359  }
2360  if (*abs_level > 0) {
2361  if (last_sig_scan_pos_sb == -1)
2362  last_sig_scan_pos_sb = n;
2363  first_sig_scan_pos_sb = n;
2364  }
2365  if (rsh->sh_dep_quant_used_flag)
2366  rc->qstate = qstate_translate_table[rc->qstate][*abs_level & 1];
2367  }
2368  sig_hidden_flag = rsh->sh_sign_data_hiding_used_flag &&
2369  (last_sig_scan_pos_sb - first_sig_scan_pos_sb > 3 ? 1 : 0);
2370 
2371  if (rsh->sh_dep_quant_used_flag)
2372  rc->qstate = start_qstate_sb;
2373  n = (i == rc->last_sub_block ? rc->last_scan_pos : rc->num_sb_coeff -1);
2374  for (/* nothing */; n >= 0; n--) {
2375  int trans_coeff_level;
2376  const int xc = (xs << rc->log2_sb_w) + rc->scan_x_off[n];
2377  const int yc = (ys << rc->log2_sb_h) + rc->scan_y_off[n];
2378  const int off = yc * tb->tb_width + xc;
2379  const int *abs_level = rc->abs_level + off;
2380 
2381  if (*abs_level > 0) {
2382  int sign = 1;
2383  if (!sig_hidden_flag || (n != first_sig_scan_pos_sb))
2384  sign = 1 - 2 * coeff_sign_flag_decode(lc);
2385  if (rsh->sh_dep_quant_used_flag) {
2386  trans_coeff_level = (2 * *abs_level - (rc->qstate > 1)) * sign;
2387  } else {
2388  trans_coeff_level = *abs_level * sign;
2389  if (sig_hidden_flag) {
2390  sum += *abs_level;
2391  if (n == first_sig_scan_pos_sb && (sum % 2))
2392  trans_coeff_level = -trans_coeff_level;
2393  }
2394  }
2395  tb->coeffs[off] = trans_coeff_level;
2396  tb->max_scan_x = FFMAX(xc, tb->max_scan_x);
2397  tb->max_scan_y = FFMAX(yc, tb->max_scan_y);
2398  }
2399  if (rsh->sh_dep_quant_used_flag)
2400  rc->qstate = qstate_translate_table[rc->qstate][*abs_level & 1];
2401  }
2402 
2403  return 0;
2404 }
2405 
2407 {
2408  int xc, yc, xs, ys;
2409  do {
2410  if (!rc->last_scan_pos) {
2411  rc->last_scan_pos = rc->num_sb_coeff;
2412  rc->last_sub_block--;
2413  }
2414  rc->last_scan_pos--;
2415  xs = rc->sb_scan_x_off[rc->last_sub_block];
2416  ys = rc->sb_scan_y_off[rc->last_sub_block];
2417  xc = (xs << rc->log2_sb_w) + rc->scan_x_off[rc->last_scan_pos];
2418  yc = (ys << rc->log2_sb_h) + rc->scan_y_off[rc->last_scan_pos];
2419  } while ((xc != rc->last_significant_coeff_x) || (yc != rc->last_significant_coeff_y));
2420 }
2421 
2423  const int log2_zo_tb_width, const int log2_zo_tb_height)
2424 {
2425  const H266RawSliceHeader *rsh = lc->sc->sh.r;
2426  const TransformBlock *tb = rc->tb;
2427  int last_significant_coeff_x, last_significant_coeff_y;
2428 
2429  last_significant_coeff_x = last_significant_coeff_x_prefix_decode(lc,
2430  tb->log2_tb_width, log2_zo_tb_width, tb->c_idx);
2431 
2432  last_significant_coeff_y = last_significant_coeff_y_prefix_decode(lc,
2433  tb->log2_tb_height, log2_zo_tb_height, tb->c_idx);
2434 
2435  if (last_significant_coeff_x > 3) {
2436  int suffix = last_sig_coeff_suffix_decode(lc, last_significant_coeff_x);
2437  last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
2438  (2 + (last_significant_coeff_x & 1)) + suffix;
2439  }
2440  if (last_significant_coeff_y > 3) {
2441  int suffix = last_sig_coeff_suffix_decode(lc, last_significant_coeff_y);
2442  last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
2443  (2 + (last_significant_coeff_y & 1)) + suffix;
2444  }
2445  if (rsh->sh_reverse_last_sig_coeff_flag) {
2446  last_significant_coeff_x = (1 << log2_zo_tb_width) - 1 - last_significant_coeff_x;
2447  last_significant_coeff_y = (1 << log2_zo_tb_height) - 1 - last_significant_coeff_y;
2448  }
2449  rc->last_significant_coeff_x = last_significant_coeff_x;
2450  rc->last_significant_coeff_y = last_significant_coeff_y;
2451 }
2452 
2454 {
2455  const VVCSPS *sps = lc->fc->ps.sps;
2456  const CodingUnit *cu = lc->cu;
2457  const int log2_tb_width = tb->log2_tb_width;
2458  const int log2_tb_height = tb->log2_tb_height;
2459  const int c_idx = tb->c_idx;
2460  int log2_zo_tb_width, log2_zo_tb_height;
2461  ResidualCoding rc;
2462 
2463  if (sps->r->sps_mts_enabled_flag && cu->sbt_flag && !c_idx && log2_tb_width == 5 && log2_tb_height < 6)
2464  log2_zo_tb_width = 4;
2465  else
2466  log2_zo_tb_width = FFMIN(log2_tb_width, 5 );
2467 
2468  if (sps->r->sps_mts_enabled_flag && cu->sbt_flag && !c_idx && log2_tb_width < 6 && log2_tb_height == 5 )
2469  log2_zo_tb_height = 4;
2470  else
2471  log2_zo_tb_height = FFMIN(log2_tb_height, 5);
2472 
2473  init_residual_coding(lc, &rc, log2_zo_tb_width, log2_zo_tb_height, tb);
2474  last_significant_coeff_x_y_decode(&rc, lc, log2_zo_tb_width, log2_zo_tb_height);
2475  derive_last_scan_pos(&rc);
2476 
2477  if (!rc.last_sub_block && log2_tb_width >= 2 && log2_tb_height >= 2 && !tb->ts && rc.last_scan_pos > 0)
2478  lc->parse.lfnst_dc_only = 0;
2479  if ((rc.last_sub_block > 0 && log2_tb_width >= 2 && log2_tb_height >= 2 ) ||
2480  (rc.last_scan_pos > 7 && (log2_tb_width == 2 || log2_tb_width == 3 ) &&
2481  log2_tb_width == log2_tb_height))
2483  if ((rc.last_sub_block > 0 || rc.last_scan_pos > 0 ) && !c_idx)
2484  lc->parse.mts_dc_only = 0;
2485 
2486  memset(tb->coeffs, 0, tb->tb_width * tb->tb_height * sizeof(*tb->coeffs));
2487  memset(rc.abs_level, 0, tb->tb_width * tb->tb_height * sizeof(rc.abs_level[0]));
2488  memset(rc.sb_coded_flag, 0, rc.nb_sbs);
2489  memset(rc.abs_level_pass1, 0, tb->tb_width * tb->tb_height * sizeof(rc.abs_level_pass1[0]));
2490  memset(rc.sig_coeff_flag, 0, tb->tb_width * tb->tb_height * sizeof(rc.sig_coeff_flag[0]));
2491 
2492  for (int i = rc.last_sub_block; i >= 0; i--) {
2493  int ret = residual_coding_subblock(lc, &rc, i);
2494  if (ret < 0)
2495  return ret;
2496  }
2497 
2498  return 0;
2499 }
2500 
2502 {
2503  const H266RawSliceHeader *rsh = lc->sc->sh.r;
2504  const int ts = !rsh->sh_ts_residual_coding_disabled_flag && tb->ts;
2505 
2506  return ts ? hls_residual_ts_coding(lc, tb) : hls_residual_coding(lc, tb);
2507 }
2508 
2510 {
2511  return GET_CABAC(CU_CODED_FLAG);
2512 }
2513 
2515 {
2516  const int w = lc->cu->cb_width;
2517  const int h = lc->cu->cb_height;
2518  const int inc = w * h <= 256;
2519  return GET_CABAC(CU_SBT_FLAG + inc);
2520 }
2521 
2523 {
2524  return GET_CABAC(CU_SBT_QUAD_FLAG);
2525 }
2526 
2528 {
2529  const int w = lc->cu->cb_width;
2530  const int h = lc->cu->cb_height;
2531  const int inc = (w == h) ? 0 : ((w < h) ? 1 : 2);
2533 }
2534 
2536 {
2537  return GET_CABAC(CU_SBT_POS_FLAG);
2538 }
2539 
2541 {
2542  if (!GET_CABAC(LFNST_IDX + inc))
2543  return 0;
2544  if (!GET_CABAC(LFNST_IDX + 2))
2545  return 1;
2546  return 2;
2547 }
2548 
2550 {
2551  int i;
2552  for (i = 0; i < 4; i++) {
2553  if (!GET_CABAC(MTS_IDX + i))
2554  return i;
2555  }
2556  return i;
2557 }
2558 
2560 {
2561  return get_cabac_terminate(&lc->ep->cc);
2562 }
2563 
2565 {
2566  return get_cabac_terminate(&lc->ep->cc);
2567 }
2568 
2570 {
2571  return get_cabac_terminate(&lc->ep->cc);
2572 }
LAST_SIG_COEFF_Y_PREFIX
@ LAST_SIG_COEFF_Y_PREFIX
Definition: cabac.c:105
is_inside
static int is_inside(int x, int y, int w, int h)
Definition: vf_floodfill.c:53
VVCCabacState
Definition: ctu.h:358
COPY_ABOVE_PALETTE_INDICES_FLAG
@ COPY_ABOVE_PALETTE_INDICES_FLAG
Definition: cabac.c:83
VVCSPS
Definition: ps.h:58
ff_vvc_residual_coding
int ff_vvc_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
Definition: cabac.c:2501
TU_Y_CODED_FLAG
@ TU_Y_CODED_FLAG
Definition: cabac.c:96
get_luma_pred_mode
static PredMode get_luma_pred_mode(VVCLocalContext *lc)
Definition: cabac.c:1513
ff_vvc_cu_chroma_qp_offset_idx
int ff_vvc_cu_chroma_qp_offset_idx(VVCLocalContext *lc)
Definition: cabac.c:1757
ff_vvc_mmvd_offset_coding
void ff_vvc_mmvd_offset_coding(VVCLocalContext *lc, Mv *mmvd_offset, const int ph_mmvd_fullpel_only_flag)
Definition: cabac.c:1503
get_inter_flag_inc
static int get_inter_flag_inc(VVCLocalContext *lc, const int x0, const int y0)
Definition: cabac.c:1445
dec_abs_level_decode
static int dec_abs_level_decode(VVCLocalContext *lc, const ResidualCoding *rc, const int xc, const int yc, int *abs_level)
Definition: cabac.c:2060
level
uint8_t level
Definition: svq3.c:208
VVCPPS
Definition: ps.h:92
ff_vvc_sao_eo_class_decode
int ff_vvc_sao_eo_class_decode(VVCLocalContext *lc)
Definition: cabac.c:1051
av_clip
#define av_clip
Definition: common.h:100
ABS_MVD_GREATER0_FLAG
@ ABS_MVD_GREATER0_FLAG
Definition: cabac.c:94
get_inc
static av_always_inline uint8_t get_inc(VVCLocalContext *lc, const uint8_t *ctx)
Definition: cabac.c:1009
ResidualCoding::log2_sb_h
int log2_sb_h
Definition: cabac.c:781
last_significant_coeff_y_prefix_decode
static av_always_inline int last_significant_coeff_y_prefix_decode(VVCLocalContext *lc, const int log2_tb_height, const int log2_zo_tb_height, const int c_idx)
Definition: cabac.c:1794
abs_remainder_ts_decode
static int abs_remainder_ts_decode(VVCLocalContext *lc, const ResidualCoding *rc, const int xc, const int yc)
Definition: cabac.c:2000
ResidualCoding::sb_scan_x_off
const uint8_t * sb_scan_x_off
Definition: cabac.c:792
VVCLocalContext::mts_zero_out_sig_coeff_flag
int mts_zero_out_sig_coeff_flag
MtsZeroOutSigCoeffFlag;.
Definition: ctu.h:410
TransformBlock::tb_width
int tb_width
Definition: ctu.h:151
ff_vvc_new_palette_entries
int ff_vvc_new_palette_entries(VVCLocalContext *lc, const int bit_depth)
Definition: cabac.c:1398
VVCPPS::r
const H266RawPPS * r
RefStruct reference.
Definition: ps.h:93
abs_level_gt1_flag_ts_decode
static int abs_level_gt1_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
Definition: cabac.c:2034
ff_ctz
#define ff_ctz
Definition: intmath.h:105
SAO_BAND
@ SAO_BAND
Definition: hevcdec.h:164
split_qt_flag_decode
static int split_qt_flag_decode(VVCLocalContext *lc, const int x0, const int y0, const int ch_type, const int cqt_depth)
Definition: cabac.c:1140
ff_vvc_regular_merge_flag
int ff_vvc_regular_merge_flag(VVCLocalContext *lc, const int cu_skip_flag)
Definition: cabac.c:1472
av_clip_uintp2
#define av_clip_uintp2
Definition: common.h:124
coeff_sign_flag_ts_decode
static int coeff_sign_flag_ts_decode(VVCLocalContext *lc, const CodingUnit *cu, const ResidualCoding *rc, const int xc, const int yc)
Definition: cabac.c:2015
PRED_MODE_FLAG
@ PRED_MODE_FLAG
Definition: cabac.c:50
CodingUnit
Definition: hevcdec.h:290
H266RawSliceHeader::sh_ts_residual_coding_disabled_flag
uint8_t sh_ts_residual_coding_disabled_flag
Definition: cbs_h266.h:827
amvr_flag
static int amvr_flag(VVCLocalContext *lc, const int inter_affine_flag)
Definition: cabac.c:1640
REGULAR_MERGE_FLAG
@ REGULAR_MERGE_FLAG
Definition: cabac.c:86
SB_CODED_FLAG
@ SB_CODED_FLAG
Definition: cabac.c:106
ff_vvc_ref_idx_lx
int ff_vvc_ref_idx_lx(VVCLocalContext *lc, const uint8_t nb_refs)
Definition: cabac.c:1600
CodingUnit::bdpcm_flag
int bdpcm_flag[VVC_MAX_SAMPLE_ARRAYS]
BdpcmFlag.
Definition: ctu.h:327
ff_vvc_end_of_slice_flag_decode
int ff_vvc_end_of_slice_flag_decode(VVCLocalContext *lc)
Definition: cabac.c:2559
INTER_AFFINE_FLAG
@ INTER_AFFINE_FLAG
Definition: cabac.c:68
TransformBlock::min_scan_y
int min_scan_y
Definition: ctu.h:159
MODE_IBC
@ MODE_IBC
Definition: ctu.h:196
ff_vvc_intra_luma_ref_idx
int ff_vvc_intra_luma_ref_idx(VVCLocalContext *lc)
Definition: cabac.c:1324
ff_vvc_inter_affine_flag
int ff_vvc_inter_affine_flag(VVCLocalContext *lc)
Definition: cabac.c:1584
vvc_refill2
static void vvc_refill2(CABACContext *c)
Definition: cabac.c:863
data.h
SAO_TYPE_IDX
@ SAO_TYPE_IDX
Definition: cabac.c:42
u
#define u(width, name, range_min, range_max)
Definition: cbs_apv.c:68
REF_IDX_LX
@ REF_IDX_LX
Definition: cabac.c:71
NON_INTER_FLAG
@ NON_INTER_FLAG
Definition: cabac.c:47
GENERAL_MERGE_FLAG
@ GENERAL_MERGE_FLAG
Definition: cabac.c:66
VVCLocalContext::mts_dc_only
int mts_dc_only
MtsDcOnly.
Definition: ctu.h:409
ff_vvc_intra_mip_flag
int ff_vvc_intra_mip_flag(VVCLocalContext *lc, const uint8_t *intra_mip_flag)
Definition: cabac.c:1302
VVCLocalContext::sc
SliceContext * sc
Definition: ctu.h:420
TRANSFORM_SKIP_FLAG
@ TRANSFORM_SKIP_FLAG
Definition: cabac.c:102
ABS_LEVEL_GTX_FLAG
@ ABS_LEVEL_GTX_FLAG
Definition: cabac.c:109
ff_vvc_lfnst_idx
int ff_vvc_lfnst_idx(VVCLocalContext *lc, const int inc)
Definition: cabac.c:2540
SPLIT_BT_HOR
@ SPLIT_BT_HOR
Definition: ctu.h:130
INTRA_LUMA_NOT_PLANAR_FLAG
@ INTRA_LUMA_NOT_PLANAR_FLAG
Definition: cabac.c:60
Mv::y
int16_t y
vertical component of motion vector
Definition: hevcdec.h:305
ff_vvc_cu_affine_type_flag
int ff_vvc_cu_affine_type_flag(VVCLocalContext *lc)
Definition: cabac.c:1590
SAO_EDGE
@ SAO_EDGE
Definition: hevcdec.h:165
VVCSH::r
const H266RawSliceHeader * r
RefStruct reference.
Definition: ps.h:239
SAO_MERGE_FLAG
@ SAO_MERGE_FLAG
Definition: cabac.c:41
ff_vvc_mmvd_merge_flag
int ff_vvc_mmvd_merge_flag(VVCLocalContext *lc)
Definition: cabac.c:1478
CU_SBT_FLAG
@ CU_SBT_FLAG
Definition: cabac.c:77
base
uint8_t base
Definition: vp3data.h:128
ff_vvc_palette_escape_val_present_flag
bool ff_vvc_palette_escape_val_present_flag(VVCLocalContext *lc)
Definition: cabac.c:1403
TransformBlock::min_scan_x
int min_scan_x
Definition: ctu.h:158
MTT_SPLIT_CU_VERTICAL_FLAG
@ MTT_SPLIT_CU_VERTICAL_FLAG
Definition: cabac.c:45
VVCSplitMode
VVCSplitMode
Definition: ctu.h:127
get_cabac_terminate
static av_unused int get_cabac_terminate(CABACContext *c)
Definition: cabac_functions.h:187
max
#define max(a, b)
Definition: cuda_runtime.h:33
CU_SBT_QUAD_FLAG
@ CU_SBT_QUAD_FLAG
Definition: cabac.c:78
ff_vvc_ciip_flag
int ff_vvc_ciip_flag(VVCLocalContext *lc)
Definition: cabac.c:1564
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
ff_vvc_intra_luma_mpm_idx
int ff_vvc_intra_luma_mpm_idx(VVCLocalContext *lc)
Definition: cabac.c:1356
ResidualCoding::infer_sb_cbf
uint8_t infer_sb_cbf
Definition: cabac.c:803
TransformBlock::max_scan_y
int max_scan_y
Definition: ctu.h:157
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
SPLIT_CU_FLAG
@ SPLIT_CU_FLAG
Definition: cabac.c:43
ff_vvc_abs_mvd_greater0_flag
int ff_vvc_abs_mvd_greater0_flag(VVCLocalContext *lc)
Definition: cabac.c:1615
ff_vvc_isp_split_type
enum IspType ff_vvc_isp_split_type(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
Definition: cabac.c:1339
abs_remainder_decode
static int abs_remainder_decode(VVCLocalContext *lc, const ResidualCoding *rc, const int xc, const int yc)
Definition: cabac.c:1985
ep_update_hist
static void ep_update_hist(EntryPoint *ep, ResidualCoding *rc, const int remainder, const int addin)
Definition: cabac.c:2076
ff_vvc_sbt_quad_flag
int ff_vvc_sbt_quad_flag(VVCLocalContext *lc)
Definition: cabac.c:2522
VVCLocalContext::lfnst_zero_out_sig_coeff_flag
int lfnst_zero_out_sig_coeff_flag
LfnstZeroOutSigCoeffFlag.
Definition: ctu.h:407
LAST_SIG_COEFF_X_PREFIX
@ LAST_SIG_COEFF_X_PREFIX
Definition: cabac.c:104
abs_get_rice_param
static int abs_get_rice_param(VVCLocalContext *lc, const ResidualCoding *rc, const int xc, const int yc, const int base_level)
Definition: cabac.c:1937
TransformBlock::max_scan_x
int max_scan_x
Definition: ctu.h:156
CU_SBT_HORIZONTAL_FLAG
@ CU_SBT_HORIZONTAL_FLAG
Definition: cabac.c:79
SPLIT_QT
@ SPLIT_QT
Definition: ctu.h:133
VVCLocalContext::lfnst_dc_only
int lfnst_dc_only
LfnstDcOnly.
Definition: ctu.h:406
ff_vvc_intra_mip_transposed_flag
int ff_vvc_intra_mip_transposed_flag(VVCLocalContext *lc)
Definition: cabac.c:1310
bit
#define bit(string, value)
Definition: cbs_mpeg2.c:56
BCW_IDX
@ BCW_IDX
Definition: cabac.c:75
ff_vvc_palette_idx_idc
int ff_vvc_palette_idx_idc(VVCLocalContext *lc, const int max_palette_index, const bool adjust)
Definition: cabac.c:1430
GET_CABAC
#define GET_CABAC(ctx)
Definition: cabac.c:916
ResidualCoding::update_hist
int update_hist
Definition: cabac.c:784
SPLIT_BT_VER
@ SPLIT_BT_VER
Definition: ctu.h:132
ff_vvc_sao_offset_sign_decode
int ff_vvc_sao_offset_sign_decode(VVCLocalContext *lc)
Definition: cabac.c:1046
SYNTAX_ELEMENT_LAST
@ SYNTAX_ELEMENT_LAST
Definition: cabac.c:111
ff_vvc_intra_mip_mode
int ff_vvc_intra_mip_mode(VVCLocalContext *lc)
Definition: cabac.c:1315
VVCFrameParamSets::sps
const VVCSPS * sps
RefStruct reference.
Definition: ps.h:230
ResidualCoding::log2_sb_w
int log2_sb_w
Definition: cabac.c:780
CU_SBT_POS_FLAG
@ CU_SBT_POS_FLAG
Definition: cabac.c:80
VVCLocalContext::fc
VVCFrameContext * fc
Definition: ctu.h:421
CIIP_FLAG
@ CIIP_FLAG
Definition: cabac.c:90
EntryPoint::stat_coeff
int stat_coeff[VVC_MAX_SAMPLE_ARRAYS]
StatCoeff.
Definition: ctu.h:373
MODE_INTER
@ MODE_INTER
Definition: hevcdec.h:106
ResidualCoding::sb_coded_flag
uint8_t sb_coded_flag[MAX_SUB_BLOCKS *MAX_SUB_BLOCKS]
Definition: cabac.c:797
ff_vvc_cu_coded_flag
int ff_vvc_cu_coded_flag(VVCLocalContext *lc)
Definition: cabac.c:2509
TransformBlock::c_idx
uint8_t c_idx
Definition: ctu.h:146
ResidualCoding::sb_scan_y_off
const uint8_t * sb_scan_y_off
Definition: cabac.c:793
SPLIT_TT_VER
@ SPLIT_TT_VER
Definition: ctu.h:131
ResidualCoding::height_in_sbs
int height_in_sbs
Definition: cabac.c:789
SIG_COEFF_FLAG
@ SIG_COEFF_FLAG
Definition: cabac.c:107
val
static double val(void *priv, double ch)
Definition: aeval.c:77
H266RawPPS::pps_chroma_qp_offset_list_len_minus1
uint8_t pps_chroma_qp_offset_list_len_minus1
Definition: cbs_h266.h:560
CU_QP_DELTA_ABS
@ CU_QP_DELTA_ABS
Definition: cabac.c:99
ff_vvc_mvp_lx_flag
int ff_vvc_mvp_lx_flag(VVCLocalContext *lc)
Definition: cabac.c:1635
ABS_MVD_GREATER1_FLAG
@ ABS_MVD_GREATER1_FLAG
Definition: cabac.c:95
residual_coding_subblock
static int residual_coding_subblock(VVCLocalContext *lc, ResidualCoding *rc, const int i)
Definition: cabac.c:2262
CABAC_MASK
#define CABAC_MASK
Definition: cabac.h:39
CodingUnit::cb_width
int cb_width
Definition: ctu.h:293
mmvd_direction_idx_decode
static int mmvd_direction_idx_decode(VVCLocalContext *lc)
Definition: cabac.c:1498
last_sig_coeff_suffix_decode
static av_always_inline int last_sig_coeff_suffix_decode(VVCLocalContext *lc, const int last_significant_coeff_y_prefix)
Definition: cabac.c:1800
ff_vvc_split_cu_flag
int ff_vvc_split_cu_flag(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height, const int is_chroma, const VVCAllowedSplit *a)
Definition: cabac.c:1118
get_left_top
static av_always_inline void get_left_top(const VVCLocalContext *lc, uint8_t *left, uint8_t *top, const int x0, const int y0, const uint8_t *left_ctx, const uint8_t *top_ctx)
Definition: cabac.c:991
INTRA_BDPCM_LUMA_DIR_FLAG
@ INTRA_BDPCM_LUMA_DIR_FLAG
Definition: cabac.c:54
ff_h264_norm_shift
static const uint8_t *const ff_h264_norm_shift
Definition: cabac_functions.h:58
ResidualCoding::scan_x_off
const uint8_t * scan_x_off
Definition: cabac.c:794
ff_vvc_merge_gpm_idx
int ff_vvc_merge_gpm_idx(VVCLocalContext *lc, const int idx)
Definition: cabac.c:1550
INTRA_BDPCM_CHROMA_FLAG
@ INTRA_BDPCM_CHROMA_FLAG
Definition: cabac.c:61
mmvd_distance_idx_decode
static int mmvd_distance_idx_decode(VVCLocalContext *lc)
Definition: cabac.c:1488
MAX_TB_SIZE
#define MAX_TB_SIZE
Definition: cabac.c:774
ff_vvc_palette_escape_val
int ff_vvc_palette_escape_val(VVCLocalContext *lc, const int max)
Definition: cabac.c:1435
INTRA_LUMA_REF_IDX
@ INTRA_LUMA_REF_IDX
Definition: cabac.c:56
ff_vvc_tu_y_coded_flag
int ff_vvc_tu_y_coded_flag(VVCLocalContext *lc)
Definition: cabac.c:1700
MTT_SPLIT_CU_BINARY_FLAG
@ MTT_SPLIT_CU_BINARY_FLAG
Definition: cabac.c:46
s
#define s(width, name)
Definition: cbs_vp9.c:198
EntryPoint::cabac_state
VVCCabacState cabac_state[VVC_CONTEXTS]
Definition: ctu.h:376
H266RawSliceHeader::sh_cabac_init_flag
uint8_t sh_cabac_init_flag
Definition: cbs_h266.h:801
SAO_NOT_APPLIED
@ SAO_NOT_APPLIED
Definition: hevcdec.h:163
MTS_IDX
@ MTS_IDX
Definition: cabac.c:82
RUN_COPY_FLAG
@ RUN_COPY_FLAG
Definition: cabac.c:85
adjust
static int adjust(int x, int size)
Definition: mobiclip.c:514
last_significant_coeff_x_prefix_decode
static av_always_inline int last_significant_coeff_x_prefix_decode(VVCLocalContext *lc, const int log2_tb_width, const int log2_zo_tb_width, const int c_idx)
Definition: cabac.c:1788
LFNST_IDX
@ LFNST_IDX
Definition: cabac.c:81
abs_level_gtx_flag_ts_decode
static int abs_level_gtx_flag_ts_decode(VVCLocalContext *lc, const int j)
Definition: cabac.c:2050
hls_residual_ts_coding
static int hls_residual_ts_coding(VVCLocalContext *lc, TransformBlock *tb)
Definition: cabac.c:2248
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:494
MMVD_DISTANCE_IDX
@ MMVD_DISTANCE_IDX
Definition: cabac.c:89
INTRA_CHROMA_PRED_MODE
@ INTRA_CHROMA_PRED_MODE
Definition: cabac.c:65
sb_coded_flag_decode
static int sb_coded_flag_decode(VVCLocalContext *lc, const uint8_t *sb_coded_flag, const ResidualCoding *rc, const int xs, const int ys)
Definition: cabac.c:1893
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
SyntaxElement
SyntaxElement
Definition: cabac.c:35
ResidualCoding::abs_level_pass1
int abs_level_pass1[MAX_TB_SIZE *MAX_TB_SIZE]
AbsLevelPass1[][].
Definition: cabac.c:799
VVCLocalContext::parse
struct VVCLocalContext::@344 parse
MERGE_SUBBLOCK_FLAG
@ MERGE_SUBBLOCK_FLAG
Definition: cabac.c:91
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
ff_vvc_bcw_idx
int ff_vvc_bcw_idx(VVCLocalContext *lc, const int no_backward_pred_flag)
Definition: cabac.c:1679
CodingUnit::tree_type
VVCTreeType tree_type
Definition: ctu.h:290
vvc_get_cabac
static int vvc_get_cabac(CABACContext *c, VVCCabacState *base, const int ctx)
Definition: cabac.c:888
hls_residual_coding
static int hls_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
Definition: cabac.c:2453
ff_vvc_sbt_pos_flag
int ff_vvc_sbt_pos_flag(VVCLocalContext *lc)
Definition: cabac.c:2535
AMVR_PRECISION_IDX
@ AMVR_PRECISION_IDX
Definition: cabac.c:74
CU_CODED_FLAG
@ CU_CODED_FLAG
Definition: cabac.c:76
ff_vvc_intra_luma_not_planar_flag
int ff_vvc_intra_luma_not_planar_flag(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
Definition: cabac.c:1351
cabac_init_state
static void cabac_init_state(VVCLocalContext *lc)
Definition: cabac.c:818
ff_vvc_cu_skip_flag
int ff_vvc_cu_skip_flag(VVCLocalContext *lc, const uint8_t *cu_skip_flag)
Definition: cabac.c:1276
CCLM_MODE_IDX
@ CCLM_MODE_IDX
Definition: cabac.c:64
state
static struct @582 state
ResidualCoding::num_sb_coeff
int num_sb_coeff
Definition: cabac.c:785
cabac_reinit
static int cabac_reinit(VVCLocalContext *lc)
Definition: cabac.c:813
CodingUnit::sbt_flag
uint8_t sbt_flag
Definition: ctu.h:300
xs
#define xs(width, name, var, subs,...)
Definition: cbs_vp9.c:305
CNU
#define CNU
Definition: cabac.c:33
IspType
IspType
Definition: ctu.h:121
NULL
#define NULL
Definition: coverity.c:32
ff_vvc_pred_mode_plt_flag
int ff_vvc_pred_mode_plt_flag(VVCLocalContext *lc)
Definition: cabac.c:1251
VVCLocalContext
Definition: ctu.h:386
INTRA_LUMA_MPM_FLAG
@ INTRA_LUMA_MPM_FLAG
Definition: cabac.c:59
CU_CHROMA_QP_OFFSET_IDX
@ CU_CHROMA_QP_OFFSET_IDX
Definition: cabac.c:101
H266RawSliceHeader::sh_dep_quant_used_flag
uint8_t sh_dep_quant_used_flag
Definition: cbs_h266.h:824
get_local_sum_ts
static int get_local_sum_ts(const int *level, const int w, const int h, const int xc, const int yc)
Definition: cabac.c:1843
ff_vvc_cu_act_enabled_flag
int ff_vvc_cu_act_enabled_flag(VVCLocalContext *lc)
Definition: cabac.c:1714
ff_vvc_cu_chroma_qp_offset_flag
int ff_vvc_cu_chroma_qp_offset_flag(VVCLocalContext *lc)
Definition: cabac.c:1752
TransformBlock::log2_tb_width
int log2_tb_width
Definition: ctu.h:153
ff_vvc_sbt_horizontal_flag
int ff_vvc_sbt_horizontal_flag(VVCLocalContext *lc)
Definition: cabac.c:2527
ff_vvc_alf_ctb_filter_alt_idx
int ff_vvc_alf_ctb_filter_alt_idx(VVCLocalContext *lc, const int c_idx, const int num_chroma_filters)
Definition: cabac.c:1086
ff_vvc_palette_transpose_flag
bool ff_vvc_palette_transpose_flag(VVCLocalContext *lc)
Definition: cabac.c:1408
sig_coeff_flag_decode
static int sig_coeff_flag_decode(VVCLocalContext *lc, const ResidualCoding *rc, const int xc, const int yc)
Definition: cabac.c:1914
ResidualCoding::last_scan_pos
int last_scan_pos
Definition: cabac.c:808
VVCSPS::bit_depth
uint8_t bit_depth
BitDepth.
Definition: ps.h:69
SPLIT_TT_HOR
@ SPLIT_TT_HOR
Definition: ctu.h:129
Mv::x
int16_t x
horizontal component of motion vector
Definition: hevcdec.h:304
CTB
#define CTB(tab, x, y)
Definition: filter.c:267
ff_vvc_alf_use_aps_flag
int ff_vvc_alf_use_aps_flag(VVCLocalContext *lc)
Definition: cabac.c:1071
PF_BI
@ PF_BI
Definition: hevcdec.h:121
MERGE_IDX
@ MERGE_IDX
Definition: cabac.c:93
ff_vvc_diag_scan_y
const uint8_t ff_vvc_diag_scan_y[5][5][16 *16]
Definition: data.c:152
VVC_CONTEXTS
#define VVC_CONTEXTS
Definition: ctu.h:364
ff_vvc_tu_joint_cbcr_residual_flag
int ff_vvc_tu_joint_cbcr_residual_flag(VVCLocalContext *lc, const int tu_cb_coded_flag, const int tu_cr_coded_flag)
Definition: cabac.c:1811
ff_vvc_abs_mvd_minus2
int ff_vvc_abs_mvd_minus2(VVCLocalContext *lc)
Definition: cabac.c:1625
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
SAMPLE_CTB
#define SAMPLE_CTB(tab, x, y)
Definition: hevcdec.h:72
inc
static int inc(int num, int period)
Definition: perlin.c:34
ff_vvc_alf_luma_prev_filter_idx
int ff_vvc_alf_luma_prev_filter_idx(VVCLocalContext *lc)
Definition: cabac.c:1076
ResidualCoding::scan_y_off
const uint8_t * scan_y_off
Definition: cabac.c:795
cabac.h
ff_vvc_pred_mode_ibc_flag
int ff_vvc_pred_mode_ibc_flag(VVCLocalContext *lc, const int is_chroma)
Definition: cabac.c:1282
truncated_binary_decode
static int truncated_binary_decode(VVCLocalContext *lc, const int c_max)
Definition: cabac.c:919
H266RawSliceHeader::sh_reverse_last_sig_coeff_flag
uint8_t sh_reverse_last_sig_coeff_flag
Definition: cbs_h266.h:829
VVCFrameParamSets::pps
const VVCPPS * pps
RefStruct reference.
Definition: ps.h:231
TU_JOINT_CBCR_RESIDUAL_FLAG
@ TU_JOINT_CBCR_RESIDUAL_FLAG
Definition: cabac.c:103
limited_kth_order_egk_decode
static int limited_kth_order_egk_decode(CABACContext *c, const int k, const int max_pre_ext_len, const int trunc_suffix_len)
Definition: cabac.c:961
last_significant_coeff_x_y_decode
static void last_significant_coeff_x_y_decode(ResidualCoding *rc, VVCLocalContext *lc, const int log2_zo_tb_width, const int log2_zo_tb_height)
Definition: cabac.c:2422
ResidualCoding::rem_bins_pass1
int rem_bins_pass1
Definition: cabac.c:786
INTRA_MIP_FLAG
@ INTRA_MIP_FLAG
Definition: cabac.c:55
TransformBlock::tb_height
int tb_height
Definition: ctu.h:152
ff_vvc_intra_luma_mpm_remainder
int ff_vvc_intra_luma_mpm_remainder(VVCLocalContext *lc)
Definition: cabac.c:1364
TransformBlock::ts
uint8_t ts
transform_skip_flag
Definition: ctu.h:147
ff_vvc_intra_bdpcm_chroma_dir_flag
int ff_vvc_intra_bdpcm_chroma_dir_flag(VVCLocalContext *lc)
Definition: cabac.c:1271
ff_vvc_pred_flag
PredFlag ff_vvc_pred_flag(VVCLocalContext *lc, const int is_b)
Definition: cabac.c:1569
height
#define height
Definition: dsp.h:89
shift
static int shift(int a, int b)
Definition: bonk.c:261
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
ResidualCoding::hist_value
int hist_value
Definition: cabac.c:783
EntryPoint::cc
CABACContext cc
Definition: ctu.h:375
ff_vvc_merge_subblock_idx
int ff_vvc_merge_subblock_idx(VVCLocalContext *lc, const int max_num_subblock_merge_cand)
Definition: cabac.c:1462
get_cabac_bypass
#define get_cabac_bypass
Definition: cabac.h:149
ResidualCoding::coeff_sign_level
int coeff_sign_level[MAX_TB_SIZE *MAX_TB_SIZE]
CoeffSignLevel[][].
Definition: cabac.c:804
ff_vvc_merge_gpm_partition_idx
int ff_vvc_merge_gpm_partition_idx(VVCLocalContext *lc)
Definition: cabac.c:1545
INTRA_BDPCM_LUMA_FLAG
@ INTRA_BDPCM_LUMA_FLAG
Definition: cabac.c:53
init_residual_coding
static void init_residual_coding(const VVCLocalContext *lc, ResidualCoding *rc, const int log2_zo_tb_width, const int log2_zo_tb_height, TransformBlock *tb)
Definition: cabac.c:2086
ff_vvc_sym_mvd_flag
int ff_vvc_sym_mvd_flag(VVCLocalContext *lc)
Definition: cabac.c:1595
VVCLocalContext::ctb_up_flag
uint8_t ctb_up_flag
Definition: ctu.h:388
ff_vvc_end_of_tile_one_bit
int ff_vvc_end_of_tile_one_bit(VVCLocalContext *lc)
Definition: cabac.c:2564
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
ff_vvc_intra_subpartitions_mode_flag
int ff_vvc_intra_subpartitions_mode_flag(VVCLocalContext *lc)
Definition: cabac.c:1334
mtt_split_cu_binary_flag_decode
static int mtt_split_cu_binary_flag_decode(VVCLocalContext *lc, const int mtt_split_cu_vertical_flag, const int mtt_depth)
Definition: cabac.c:1190
CU_CHROMA_QP_OFFSET_FLAG
@ CU_CHROMA_QP_OFFSET_FLAG
Definition: cabac.c:100
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
TU_CB_CODED_FLAG
@ TU_CB_CODED_FLAG
Definition: cabac.c:97
qstate_translate_table
static const uint8_t qstate_translate_table[][2]
Definition: cabac.c:2056
av_zero_extend
#define av_zero_extend
Definition: common.h:151
last_significant_coeff_xy_prefix
static av_always_inline int last_significant_coeff_xy_prefix(VVCLocalContext *lc, const int log2_tb_size, const int log2_zo_tb_size, const int c_idx, const int ctx)
Definition: cabac.c:1766
ff_vvc_sao_band_position_decode
int ff_vvc_sao_band_position_decode(VVCLocalContext *lc)
Definition: cabac.c:1031
PRED_MODE_IBC_FLAG
@ PRED_MODE_IBC_FLAG
Definition: cabac.c:49
TU_CR_CODED_FLAG
@ TU_CR_CODED_FLAG
Definition: cabac.c:98
ResidualCoding::width_in_sbs
int width_in_sbs
Definition: cabac.c:788
ff_vvc_merge_idx
int ff_vvc_merge_idx(VVCLocalContext *lc)
Definition: cabac.c:1530
ff_vvc_merge_subblock_flag
int ff_vvc_merge_subblock_flag(VVCLocalContext *lc)
Definition: cabac.c:1456
ALFParams::ctb_cc_idc
uint8_t ctb_cc_idc[2]
alf_ctb_cc_cb_idc, alf_ctb_cc_cr_idc
Definition: ctu.h:492
ff_vvc_split_mode
VVCSplitMode ff_vvc_split_mode(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height, const int cqt_depth, const int mtt_depth, const int ch_type, const VVCAllowedSplit *a)
Definition: cabac.c:1196
kth_order_egk_decode
static int kth_order_egk_decode(CABACContext *c, int k, const int max)
Definition: cabac.c:935
H266RawSliceHeader
Definition: cbs_h266.h:771
AMVR_FLAG
@ AMVR_FLAG
Definition: cabac.c:73
COEFF_SIGN_FLAG
@ COEFF_SIGN_FLAG
Definition: cabac.c:110
MODE_INTRA
#define MODE_INTRA
Definition: vp3.c:84
ff_vvc_num_signalled_palette_entries
int ff_vvc_num_signalled_palette_entries(VVCLocalContext *lc, const int max)
Definition: cabac.c:1393
VVCAllowedSplit
Definition: ctu.h:467
SliceContext::nb_eps
int nb_eps
Definition: dec.h:117
CU_AFFINE_TYPE_FLAG
@ CU_AFFINE_TYPE_FLAG
Definition: cabac.c:69
ResidualCoding
Definition: cabac.c:776
ISP_NO_SPLIT
@ ISP_NO_SPLIT
Definition: ctu.h:122
ff_vvc_diag_scan_x
const uint8_t ff_vvc_diag_scan_x[5][5][16 *16]
Definition: data.c:27
ff_vvc_alf_ctb_flag
int ff_vvc_alf_ctb_flag(VVCLocalContext *lc, const int rx, const int ry, const int c_idx)
Definition: cabac.c:1056
H266RawSliceHeader::sh_ts_residual_coding_rice_idx_minus1
uint8_t sh_ts_residual_coding_rice_idx_minus1
Definition: cbs_h266.h:828
ff_vvc_abs_mvd_greater1_flag
int ff_vvc_abs_mvd_greater1_flag(VVCLocalContext *lc)
Definition: cabac.c:1620
ff_vvc_transform_skip_flag
int ff_vvc_transform_skip_flag(VVCLocalContext *lc, const int inc)
Definition: cabac.c:1816
MAX_SUB_BLOCKS
#define MAX_SUB_BLOCKS
Definition: cabac.c:772
av_always_inline
#define av_always_inline
Definition: attributes.h:68
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
ff_vvc_tu_cb_coded_flag
int ff_vvc_tu_cb_coded_flag(VVCLocalContext *lc)
Definition: cabac.c:1690
PF_L0
@ PF_L0
Definition: hevcdec.h:119
VVCLocalContext::prev_tu_cbf_y
int prev_tu_cbf_y
prevTuCbfY;
Definition: ctu.h:404
cabac_functions.h
CodingUnit::x0
int x0
Definition: ctu.h:291
EntryPoint
Definition: ctu.h:365
TransformBlock::coeffs
int * coeffs
Definition: ctu.h:166
len
int len
Definition: vorbis_enc_data.h:426
ResidualCoding::abs_level
int abs_level[MAX_TB_SIZE *MAX_TB_SIZE]
Definition: cabac.c:800
ff_vvc_end_of_subset_one_bit
int ff_vvc_end_of_subset_one_bit(VVCLocalContext *lc)
Definition: cabac.c:2569
ResidualCoding::sig_coeff_flag
int sig_coeff_flag[MAX_TB_SIZE *MAX_TB_SIZE]
Definition: cabac.c:798
fixed_length_decode
static int fixed_length_decode(CABACContext *c, const int len)
Definition: cabac.c:980
init_values
static const uint8_t init_values[4][SYNTAX_ELEMENT_LAST]
Definition: cabac.c:116
log2
#define log2(x)
Definition: libm.h:406
VVCLocalContext::cu
CodingUnit * cu
Definition: ctu.h:425
ff_vvc_sbt_flag
int ff_vvc_sbt_flag(VVCLocalContext *lc)
Definition: cabac.c:2514
ff_vvc_cu_qp_delta_abs
int ff_vvc_cu_qp_delta_abs(VVCLocalContext *lc)
Definition: cabac.c:1719
VVCSPS::max_num_gpm_merge_cand
uint8_t max_num_gpm_merge_cand
MaxNumGpmMergeCand.
Definition: ps.h:79
PRED_MODE_PLT_FLAG
@ PRED_MODE_PLT_FLAG
Definition: cabac.c:51
ResidualCoding::last_significant_coeff_x
int last_significant_coeff_x
Definition: cabac.c:809
ret
ret
Definition: filter_design.txt:187
pred
static const float pred[4]
Definition: siprdata.h:259
ff_vvc_pred_mode_flag
int ff_vvc_pred_mode_flag(VVCLocalContext *lc, const int is_chroma)
Definition: cabac.c:1240
ResidualCoding::last_significant_coeff_y
int last_significant_coeff_y
Definition: cabac.c:810
SPLIT_QT_FLAG
@ SPLIT_QT_FLAG
Definition: cabac.c:44
ff_vvc_alf_luma_fixed_filter_idx
int ff_vvc_alf_luma_fixed_filter_idx(VVCLocalContext *lc)
Definition: cabac.c:1081
H266RawSliceHeader::sh_slice_type
uint8_t sh_slice_type
Definition: cbs_h266.h:780
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
ff_vvc_mvd_sign_flag
int ff_vvc_mvd_sign_flag(VVCLocalContext *lc)
Definition: cabac.c:1630
CU_SKIP_FLAG
@ CU_SKIP_FLAG
Definition: cabac.c:48
CodingUnit::cb_height
int cb_height
Definition: ctu.h:294
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
ff_vvc_cu_qp_delta_sign_flag
int ff_vvc_cu_qp_delta_sign_flag(VVCLocalContext *lc)
Definition: cabac.c:1747
TransformBlock::log2_tb_height
int log2_tb_height
Definition: ctu.h:154
H266RawSliceHeader::sh_sign_data_hiding_used_flag
uint8_t sh_sign_data_hiding_used_flag
Definition: cbs_h266.h:826
ALF_CTB_CC_CR_IDC
@ ALF_CTB_CC_CR_IDC
Definition: cabac.c:39
suffix
const char * suffix
Definition: checkasm.c:379
CU_ACT_ENABLED_FLAG
@ CU_ACT_ENABLED_FLAG
Definition: cabac.c:52
DUAL_TREE_CHROMA
@ DUAL_TREE_CHROMA
Definition: ctu.h:172
ResidualCoding::nb_sbs
int nb_sbs
Definition: cabac.c:790
INTRA_SUBPARTITIONS_MODE_FLAG
@ INTRA_SUBPARTITIONS_MODE_FLAG
Definition: cabac.c:57
PredMode
PredMode
Definition: hevcdec.h:105
MERGE_SUBBLOCK_IDX
@ MERGE_SUBBLOCK_IDX
Definition: cabac.c:92
mtt_split_cu_vertical_flag_decode
static int mtt_split_cu_vertical_flag_decode(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height, const int ch_type, const VVCAllowedSplit *a)
Definition: cabac.c:1154
ff_vvc_cclm_mode_idx
int ff_vvc_cclm_mode_idx(VVCLocalContext *lc)
Definition: cabac.c:1374
ff_vvc_palette_predictor_run
int ff_vvc_palette_predictor_run(VVCLocalContext *lc, const int max)
Definition: cabac.c:1388
TransformBlock
Definition: ctu.h:144
PALETTE_TRANSPOSE_FLAG
@ PALETTE_TRANSPOSE_FLAG
Definition: cabac.c:84
VVCSH::slice_qp_y
int8_t slice_qp_y
SliceQpY.
Definition: ps.h:251
CodingUnit::pred_mode
enum PredMode pred_mode
PredMode.
Definition: hevcdec.h:294
INTRA_SUBPARTITIONS_SPLIT_FLAG
@ INTRA_SUBPARTITIONS_SPLIT_FLAG
Definition: cabac.c:58
residual_ts_coding_subblock
static int residual_ts_coding_subblock(VVCLocalContext *lc, ResidualCoding *rc, const int i)
Definition: cabac.c:2130
ff_vvc_sao_type_idx_decode
int ff_vvc_sao_type_idx_decode(VVCLocalContext *lc)
Definition: cabac.c:1021
ALF_CTB_FLAG
@ ALF_CTB_FLAG
Definition: cabac.c:36
ResidualCoding::qstate
int qstate
Definition: cabac.c:807
ff_vvc_cabac_init
int ff_vvc_cabac_init(VVCLocalContext *lc, const int ctu_idx, const int rx, const int ry)
Definition: cabac.c:845
ff_vvc_run_copy_flag
bool ff_vvc_run_copy_flag(VVCLocalContext *lc, const int prev_run_type, const int prev_run_position, const int cur_pos)
Definition: cabac.c:1413
pps
uint64_t pps
Definition: dovi_rpuenc.c:36
PAR_LEVEL_FLAG
@ PAR_LEVEL_FLAG
Definition: cabac.c:108
MMVD_MERGE_FLAG
@ MMVD_MERGE_FLAG
Definition: cabac.c:87
SYM_MVD_FLAG
@ SYM_MVD_FLAG
Definition: cabac.c:70
ALF_USE_APS_FLAG
@ ALF_USE_APS_FLAG
Definition: cabac.c:37
get_local_sum
static int get_local_sum(const int *level, const int w, const int h, const int xc, const int yc, const int hist_value)
Definition: cabac.c:1822
ALFParams
Definition: ctu.h:488
ff_vvc_sao_merge_flag_decode
int ff_vvc_sao_merge_flag_decode(VVCLocalContext *lc)
Definition: cabac.c:1016
Mv
Definition: hevcdec.h:303
ff_vvc_mts_idx
int ff_vvc_mts_idx(VVCLocalContext *lc)
Definition: cabac.c:2549
ff_vvc_general_merge_flag
int ff_vvc_general_merge_flag(VVCLocalContext *lc)
Definition: cabac.c:1440
ResidualCoding::tb
TransformBlock * tb
Definition: cabac.c:778
VVCFrameContext::ps
VVCFrameParamSets ps
Definition: dec.h:131
INTER_PRED_IDC
@ INTER_PRED_IDC
Definition: cabac.c:67
INTRA_BDPCM_CHROMA_DIR_FLAG
@ INTRA_BDPCM_CHROMA_DIR_FLAG
Definition: cabac.c:62
w
uint8_t w
Definition: llvidencdsp.c:39
ff_vvc_intra_chroma_pred_mode
int ff_vvc_intra_chroma_pred_mode(VVCLocalContext *lc)
Definition: cabac.c:1381
ALF_CTB_CC_CB_IDC
@ ALF_CTB_CC_CB_IDC
Definition: cabac.c:38
PredFlag
PredFlag
Definition: hevcdec.h:117
H266RawSliceHeader::sh_num_alf_aps_ids_luma
uint8_t sh_num_alf_aps_ids_luma
Definition: cbs_h266.h:784
SliceContext::sh
VVCSH sh
Definition: dec.h:115
par_level_flag_decode
static int par_level_flag_decode(VVCLocalContext *lc, const int inc)
Definition: cabac.c:1882
get_gtx_flag_inc
static int get_gtx_flag_inc(const ResidualCoding *rc, const int xc, const int yc, const int last)
Definition: cabac.c:1854
ff_vvc_tu_cr_coded_flag
int ff_vvc_tu_cr_coded_flag(VVCLocalContext *lc, int tu_cb_coded_flag)
Definition: cabac.c:1695
ResidualCoding::last_sub_block
int last_sub_block
Definition: cabac.c:782
ff_vvc_alf_ctb_cc_idc
int ff_vvc_alf_ctb_cc_idc(VVCLocalContext *lc, const int rx, const int ry, const int idx, const int cc_filters_signalled)
Definition: cabac.c:1096
CodingUnit::isp_split_type
enum IspType isp_split_type
IntraSubPartitionsSplitType.
Definition: ctu.h:317
VVCFrameContext
Definition: dec.h:122
ff_vvc_intra_luma_mpm_flag
int ff_vvc_intra_luma_mpm_flag(VVCLocalContext *lc)
Definition: cabac.c:1346
par_level_flag_ts_decode
static int par_level_flag_ts_decode(VVCLocalContext *lc)
Definition: cabac.c:1887
ALFParams::ctb_flag
uint8_t ctb_flag[3]
alf_ctb_flag[]
Definition: ctu.h:489
ff_vvc_sao_offset_abs_decode
int ff_vvc_sao_offset_abs_decode(VVCLocalContext *lc)
Definition: cabac.c:1036
IS_I
#define IS_I(rsh)
Definition: ps.h:38
ff_vvc_mmvd_cand_flag
int ff_vvc_mmvd_cand_flag(VVCLocalContext *lc)
Definition: cabac.c:1483
ALF_CTB_FILTER_ALT_IDX
@ ALF_CTB_FILTER_ALT_IDX
Definition: cabac.c:40
ff_vvc_amvr_shift
int ff_vvc_amvr_shift(VVCLocalContext *lc, const int inter_affine_flag, const PredMode pred_mode, const int has_amvr_flag)
Definition: cabac.c:1656
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
skip_bytes
static const av_unused uint8_t * skip_bytes(CABACContext *c, int n)
Skip n bytes and reset the decoder.
Definition: cabac_functions.h:203
MAX_SUB_BLOCK_SIZE
#define MAX_SUB_BLOCK_SIZE
Definition: cabac.c:773
ff_vvc_intra_bdpcm_luma_dir_flag
int ff_vvc_intra_bdpcm_luma_dir_flag(VVCLocalContext *lc)
Definition: cabac.c:1261
ff_vvc_intra_bdpcm_luma_flag
int ff_vvc_intra_bdpcm_luma_flag(VVCLocalContext *lc)
Definition: cabac.c:1256
h
h
Definition: vp9dsp_template.c:2070
ctu.h
amvr_precision_idx
static int amvr_precision_idx(VVCLocalContext *lc, const int inc, const int c_max)
Definition: cabac.c:1645
coeff_sign_flag_decode
static int coeff_sign_flag_decode(VVCLocalContext *lc)
Definition: cabac.c:2009
derive_last_scan_pos
static void derive_last_scan_pos(ResidualCoding *rc)
Definition: cabac.c:2406
VVCLocalContext::ep
EntryPoint * ep
Definition: ctu.h:422
CABAC_BITS
#define CABAC_BITS
Definition: cabac.h:38
abs_decode
static int abs_decode(VVCLocalContext *lc, const int c_rice_param)
Definition: cabac.c:1963
ff_vvc_ep_init_stat_coeff
void ff_vvc_ep_init_stat_coeff(EntryPoint *ep, const int bit_depth, const int persistent_rice_adaptation_enabled_flag)
Definition: ctu.c:2914
ff_vvc_non_inter_flag
int ff_vvc_non_inter_flag(VVCLocalContext *lc, const int x0, const int y0, const int ch_type)
Definition: cabac.c:1230
ff_vvc_cclm_mode_flag
int ff_vvc_cclm_mode_flag(VVCLocalContext *lc)
Definition: cabac.c:1369
CCLM_MODE_FLAG
@ CCLM_MODE_FLAG
Definition: cabac.c:63
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
CABACContext
Definition: cabac.h:41
MMVD_CAND_FLAG
@ MMVD_CAND_FLAG
Definition: cabac.c:88
get_mip_inc
static av_always_inline uint8_t get_mip_inc(VVCLocalContext *lc, const uint8_t *ctx)
Definition: cabac.c:1295
VVCLocalContext::ctb_left_flag
uint8_t ctb_left_flag
Definition: ctu.h:387
MVP_LX_FLAG
@ MVP_LX_FLAG
Definition: cabac.c:72
shifts
static const uint8_t shifts[2][12]
Definition: camellia.c:178
CodingUnit::y0
int y0
Definition: ctu.h:292
ff_vvc_intra_bdpcm_chroma_flag
int ff_vvc_intra_bdpcm_chroma_flag(VVCLocalContext *lc)
Definition: cabac.c:1266
ff_vvc_copy_above_palette_indices_flag
bool ff_vvc_copy_above_palette_indices_flag(VVCLocalContext *lc)
Definition: cabac.c:1425
abs_level_gtx_flag_decode
static int abs_level_gtx_flag_decode(VVCLocalContext *lc, const int inc)
Definition: cabac.c:1877