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