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