FFmpeg
Loading...
Searching...
No Matches
ctu.c
Go to the documentation of this file.
1/*
2 * VVC CTU(Coding Tree Unit) parser
3 *
4 * Copyright (C) 2022 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 "libavutil/error.h"
24#include "libavutil/refstruct.h"
25
26#include "cabac.h"
27#include "ctu.h"
28#include "inter.h"
29#include "intra.h"
30#include "mvs.h"
31
32#define PROF_TEMP_SIZE (PROF_BLOCK_SIZE) * sizeof(int16_t)
33
34#define TAB_MSM(fc, depth, x, y) fc->tab.msm[(depth)][((y) >> 5) * fc->ps.pps->width32 + ((x) >> 5)]
35#define TAB_ISPMF(fc, x, y) fc->tab.ispmf[((y) >> 6) * fc->ps.pps->width64 + ((x) >> 6)]
36
42
43static void set_tb_size(const VVCFrameContext *fc, const TransformBlock *tb)
44{
45 const int x_tb = tb->x0 >> MIN_TU_LOG2;
46 const int y_tb = tb->y0 >> MIN_TU_LOG2;
47 const int hs = fc->ps.sps->hshift[tb->c_idx];
48 const int vs = fc->ps.sps->vshift[tb->c_idx];
49 const int is_chroma = tb->c_idx != 0;
50 const int width = FFMAX(1, tb->tb_width >> (MIN_TU_LOG2 - hs));
51 const int end = y_tb + FFMAX(1, tb->tb_height >> (MIN_TU_LOG2 - vs));
52
53 for (int y = y_tb; y < end; y++) {
54 const int off = y * fc->ps.pps->min_tu_width + x_tb;
55 memset(fc->tab.tb_width [is_chroma] + off, tb->tb_width, width);
56 memset(fc->tab.tb_height[is_chroma] + off, tb->tb_height, width);
57 }
58}
59
60static void set_tb_tab(uint8_t *tab, uint8_t v, const VVCFrameContext *fc,
61 const TransformBlock *tb)
62{
63 const int width = tb->tb_width << fc->ps.sps->hshift[tb->c_idx];
64 const int height = tb->tb_height << fc->ps.sps->vshift[tb->c_idx];
65
66 for (int h = 0; h < height; h += MIN_TU_SIZE) {
67 const int y = (tb->y0 + h) >> MIN_TU_LOG2;
68 const int off = y * fc->ps.pps->min_tu_width + (tb->x0 >> MIN_TU_LOG2);
69 const int w = FFMAX(1, width >> MIN_TU_LOG2);
70 memset(tab + off, v, w);
71 }
72}
73
74// 8.7.1 Derivation process for quantization parameters
75static int get_qp_y_pred(const VVCLocalContext *lc)
76{
77 const VVCFrameContext *fc = lc->fc;
78 const VVCSPS *sps = fc->ps.sps;
79 const VVCPPS *pps = fc->ps.pps;
80 const CodingUnit *cu = lc->cu;
81 const int ctb_log2_size = sps->ctb_log2_size_y;
82 const int ctb_size_mask = (1 << ctb_log2_size) - 1;
83 const int xQg = lc->parse.cu_qg_top_left_x;
84 const int yQg = lc->parse.cu_qg_top_left_y;
85 const int min_cb_width = fc->ps.pps->min_cb_width;
86 const int x_cb = cu->x0 >> sps->min_cb_log2_size_y;
87 const int y_cb = cu->y0 >> sps->min_cb_log2_size_y;
88 const int rx = cu->x0 >> ctb_log2_size;
89 const int ry = cu->y0 >> ctb_log2_size;
90 const int in_same_ctb_a = ((xQg - 1) >> ctb_log2_size) == rx && (yQg >> ctb_log2_size) == ry;
91 const int in_same_ctb_b = (xQg >> ctb_log2_size) == rx && ((yQg - 1) >> ctb_log2_size) == ry;
92 int qPy_pred, qPy_a, qPy_b;
93
94 if (lc->na.cand_up) {
95 const int first_qg_in_ctu = !(xQg & ctb_size_mask) && !(yQg & ctb_size_mask);
96 const int qPy_up = fc->tab.qp[LUMA][x_cb + (y_cb - 1) * min_cb_width];
97 if (first_qg_in_ctu && pps->ctb_to_col_bd[xQg >> ctb_log2_size] == xQg >> ctb_log2_size)
98 return qPy_up;
99 }
100
101 // qPy_pred
102 qPy_pred = lc->ep->is_first_qg ? lc->sc->sh.slice_qp_y : lc->ep->qp_y;
103
104 // qPy_b
105 if (!lc->na.cand_up || !in_same_ctb_b)
106 qPy_b = qPy_pred;
107 else
108 qPy_b = fc->tab.qp[LUMA][x_cb + (y_cb - 1) * min_cb_width];
109
110 // qPy_a
111 if (!lc->na.cand_left || !in_same_ctb_a)
112 qPy_a = qPy_pred;
113 else
114 qPy_a = fc->tab.qp[LUMA][(x_cb - 1) + y_cb * min_cb_width];
115
116 av_assert2(qPy_a >= -fc->ps.sps->qp_bd_offset && qPy_a <= 63);
117 av_assert2(qPy_b >= -fc->ps.sps->qp_bd_offset && qPy_b <= 63);
118
119 return (qPy_a + qPy_b + 1) >> 1;
120}
121
122static void set_cb_tab(const VVCLocalContext *lc, uint8_t *tab, const uint8_t v)
123{
124 const VVCFrameContext *fc = lc->fc;
125 const VVCPPS *pps = fc->ps.pps;
126 const CodingUnit *cu = lc->cu;
127 const int log2_min_cb_size = fc->ps.sps->min_cb_log2_size_y;
128 const int x_cb = cu->x0 >> log2_min_cb_size;
129 const int y_cb = cu->y0 >> log2_min_cb_size;
130 const int cb_width = cu->cb_width;
131 const int cb_height = cu->cb_height;
132 int x = y_cb * pps->min_cb_width + x_cb;
133
134 for (int y = 0; y < (cb_height >> log2_min_cb_size); y++) {
135 const int width = cb_width >> log2_min_cb_size;
136
137 memset(&tab[x], v, width);
138 x += pps->min_cb_width;
139 }
140}
141
142static int set_qp_y(VVCLocalContext *lc, const int x0, const int y0, const int has_qp_delta)
143{
144 const VVCSPS *sps = lc->fc->ps.sps;
145 EntryPoint *ep = lc->ep;
146 CodingUnit *cu = lc->cu;
147 int cu_qp_delta = 0;
148
149 if (!lc->fc->ps.pps->r->pps_cu_qp_delta_enabled_flag) {
150 ep->qp_y = lc->sc->sh.slice_qp_y;
151 } else if (ep->is_first_qg || (lc->parse.cu_qg_top_left_x == x0 && lc->parse.cu_qg_top_left_y == y0)) {
152 ep->qp_y = get_qp_y_pred(lc);
153 ep->is_first_qg = 0;
154 }
155
156 if (has_qp_delta) {
157 const int cu_qp_delta_abs = ff_vvc_cu_qp_delta_abs(lc);
158
159 if (cu_qp_delta_abs)
160 cu_qp_delta = ff_vvc_cu_qp_delta_sign_flag(lc) ? -cu_qp_delta_abs : cu_qp_delta_abs;
161 if (cu_qp_delta > (31 + sps->qp_bd_offset / 2) || cu_qp_delta < -(32 + sps->qp_bd_offset / 2))
162 return AVERROR_INVALIDDATA;
164
165 if (cu_qp_delta) {
166 int off = sps->qp_bd_offset;
167 ep->qp_y = FFUMOD(ep->qp_y + cu_qp_delta + 64 + 2 * off, 64 + off) - off;
168 }
169 }
170
171 set_cb_tab(lc, lc->fc->tab.qp[LUMA], ep->qp_y);
172 cu->qp[LUMA] = ep->qp_y;
173
174 return 0;
175}
176
177static void set_qp_c_tab(const VVCLocalContext *lc, const TransformUnit *tu, const TransformBlock *tb)
178{
179 const int is_jcbcr = tu->joint_cbcr_residual_flag && tu->coded_flag[CB] && tu->coded_flag[CR];
180 const int idx = is_jcbcr ? JCBCR : tb->c_idx;
181
182 set_tb_tab(lc->fc->tab.qp[tb->c_idx], lc->cu->qp[idx], lc->fc, tb);
183}
184
185static void set_qp_c(VVCLocalContext *lc)
186{
187 const VVCFrameContext *fc = lc->fc;
188 const VVCSPS *sps = fc->ps.sps;
189 const VVCPPS *pps = fc->ps.pps;
190 const H266RawSliceHeader *rsh = lc->sc->sh.r;
191 CodingUnit *cu = lc->cu;
192 const int x_center = cu->x0 + cu->cb_width / 2;
193 const int y_center = cu->y0 + cu->cb_height / 2;
194 const int single_tree = cu->tree_type == SINGLE_TREE;
195 const int qp_luma = (single_tree ? lc->ep->qp_y : ff_vvc_get_qPy(fc, x_center, y_center)) + sps->qp_bd_offset;
196 const int qp_chroma = av_clip(qp_luma, 0, MAX_QP + sps->qp_bd_offset);
197 const int sh_chroma_qp_offset[] = {
198 rsh->sh_cb_qp_offset,
199 rsh->sh_cr_qp_offset,
201 };
202 int qp;
203
204 for (int i = CB - 1; i < CR + sps->r->sps_joint_cbcr_enabled_flag; i++) {
205 qp = sps->chroma_qp_table[i][qp_chroma];
206 qp = qp + pps->chroma_qp_offset[i] + sh_chroma_qp_offset[i] + lc->parse.chroma_qp_offset[i];
207 qp = av_clip(qp, -sps->qp_bd_offset, MAX_QP) + sps->qp_bd_offset;
208 cu->qp[i + 1] = qp;
209 }
210}
211
213{
214 TransformUnit *tu = av_refstruct_pool_get(fc->tu_pool);
215 if (!tu)
216 return NULL;
217
218 tu->next = NULL;
219
220 if (cu->tus.tail)
221 cu->tus.tail->next = tu;
222 else
223 cu->tus.head = tu;
224 cu->tus.tail = tu;
225
226 return tu;
227}
228
229static TransformUnit* add_tu(VVCFrameContext *fc, CodingUnit *cu, const int x0, const int y0, const int tu_width, const int tu_height)
230{
231 TransformUnit *tu = alloc_tu(fc, cu);
232
233 if (!tu)
234 return NULL;
235
236 tu->x0 = x0;
237 tu->y0 = y0;
238 tu->width = tu_width;
239 tu->height = tu_height;
241 memset(tu->coded_flag, 0, sizeof(tu->coded_flag));
242 tu->avail[LUMA] = tu->avail[CHROMA] = 0;
243 tu->nb_tbs = 0;
244
245 return tu;
246}
247
249 const int x0, const int y0, const int tb_width, const int tb_height, const int c_idx)
250{
251 TransformBlock *tb;
252
253 tb = &tu->tbs[tu->nb_tbs++];
254 tb->has_coeffs = 0;
255 tb->x0 = x0;
256 tb->y0 = y0;
257 tb->tb_width = tb_width;
258 tb->tb_height = tb_height;
259 tb->log2_tb_width = av_log2(tb_width);
260 tb->log2_tb_height = av_log2(tb_height);
261
262 tb->max_scan_x = tb->max_scan_y = 0;
263 tb->min_scan_x = tb->min_scan_y = 0;
264
265 tb->c_idx = c_idx;
266 tb->ts = 0;
267 tb->coeffs = lc->coeffs;
268 lc->coeffs += tb_width * tb_height;
269 tu->avail[!!c_idx] = true;
270 return tb;
271}
272
273static uint8_t tu_y_coded_flag_decode(VVCLocalContext *lc, const int is_sbt_not_coded,
274 const int sub_tu_index, const int is_isp, const int is_chroma_coded)
275{
276 uint8_t tu_y_coded_flag = 0;
277 const VVCSPS *sps = lc->fc->ps.sps;
278 CodingUnit *cu = lc->cu;
279
280 if (!is_sbt_not_coded) {
281 int has_y_coded_flag = sub_tu_index < cu->num_intra_subpartitions - 1 || !lc->parse.infer_tu_cbf_luma;
282 if (!is_isp) {
283 const int is_large = cu->cb_width > sps->max_tb_size_y || cu->cb_height > sps->max_tb_size_y;
284 has_y_coded_flag = (cu->pred_mode == MODE_INTRA && !cu->act_enabled_flag) || is_chroma_coded || is_large;
285 }
286 tu_y_coded_flag = has_y_coded_flag ? ff_vvc_tu_y_coded_flag(lc) : 1;
287 }
288 if (is_isp)
289 lc->parse.infer_tu_cbf_luma = lc->parse.infer_tu_cbf_luma && !tu_y_coded_flag;
290 return tu_y_coded_flag;
291}
292
293static void chroma_qp_offset_decode(VVCLocalContext *lc, const int is_128, const int is_chroma_coded)
294{
295 const VVCPPS *pps = lc->fc->ps.pps;
296 const H266RawSliceHeader *rsh = lc->sc->sh.r;
297
298 if ((is_128 || is_chroma_coded) &&
300 const int cu_chroma_qp_offset_flag = ff_vvc_cu_chroma_qp_offset_flag(lc);
301 if (cu_chroma_qp_offset_flag) {
302 int cu_chroma_qp_offset_idx = 0;
303 if (pps->r->pps_chroma_qp_offset_list_len_minus1 > 0)
304 cu_chroma_qp_offset_idx = ff_vvc_cu_chroma_qp_offset_idx(lc);
305 for (int i = CB - 1; i < JCBCR; i++)
306 lc->parse.chroma_qp_offset[i] = pps->chroma_qp_offset_list[cu_chroma_qp_offset_idx][i];
307 } else {
308 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
309 }
311 }
312}
313
314static int hls_transform_unit(VVCLocalContext *lc, int x0, int y0,int tu_width, int tu_height, int sub_tu_index, int ch_type)
315{
316 VVCFrameContext *fc = lc->fc;
317 const VVCSPS *sps = fc->ps.sps;
318 const VVCPPS *pps = fc->ps.pps;
319 CodingUnit *cu = lc->cu;
320 TransformUnit *tu = add_tu(fc, cu, x0, y0, tu_width, tu_height);
321 const int min_cb_width = pps->min_cb_width;
322 const VVCTreeType tree_type = cu->tree_type;
323 const int is_128 = cu->cb_width > 64 || cu->cb_height > 64;
324 const int is_isp = cu->isp_split_type != ISP_NO_SPLIT;
325 const int is_isp_last_tu = is_isp && (sub_tu_index == cu->num_intra_subpartitions - 1);
326 const int is_sbt_not_coded = cu->sbt_flag &&
327 ((sub_tu_index == 0 && cu->sbt_pos_flag) || (sub_tu_index == 1 && !cu->sbt_pos_flag));
328 const int chroma_available = tree_type != DUAL_TREE_LUMA && sps->r->sps_chroma_format_idc &&
329 (!is_isp || is_isp_last_tu);
330 int ret, xc, yc, wc, hc, is_chroma_coded;
331
332 if (!tu)
333 return AVERROR_INVALIDDATA;
334
335 if (tree_type == SINGLE_TREE && is_isp_last_tu) {
336 const int x_cu = x0 >> fc->ps.sps->min_cb_log2_size_y;
337 const int y_cu = y0 >> fc->ps.sps->min_cb_log2_size_y;
338 xc = SAMPLE_CTB(fc->tab.cb_pos_x[ch_type], x_cu, y_cu);
339 yc = SAMPLE_CTB(fc->tab.cb_pos_y[ch_type], x_cu, y_cu);
340 wc = SAMPLE_CTB(fc->tab.cb_width[ch_type], x_cu, y_cu);
341 hc = SAMPLE_CTB(fc->tab.cb_height[ch_type], x_cu, y_cu);
342 } else {
343 xc = x0, yc = y0, wc = tu_width, hc = tu_height;
344 }
345
346 if (chroma_available && !is_sbt_not_coded) {
349 }
350
351 is_chroma_coded = chroma_available && (tu->coded_flag[CB] || tu->coded_flag[CR]);
352
353 if (tree_type != DUAL_TREE_CHROMA) {
354 int has_qp_delta;
355 tu->coded_flag[LUMA] = tu_y_coded_flag_decode(lc, is_sbt_not_coded, sub_tu_index, is_isp, is_chroma_coded);
356 has_qp_delta = (is_128 || tu->coded_flag[LUMA] || is_chroma_coded) &&
357 pps->r->pps_cu_qp_delta_enabled_flag && !lc->parse.is_cu_qp_delta_coded;
358 ret = set_qp_y(lc, x0, y0, has_qp_delta);
359 if (ret < 0)
360 return ret;
361 add_tb(tu, lc, x0, y0, tu_width, tu_height, LUMA);
362 }
363 if (tree_type != DUAL_TREE_LUMA) {
364 chroma_qp_offset_decode(lc, is_128, is_chroma_coded);
365 if (chroma_available) {
366 const int hs = sps->hshift[CHROMA];
367 const int vs = sps->vshift[CHROMA];
368 add_tb(tu, lc, xc, yc, wc >> hs, hc >> vs, CB);
369 add_tb(tu, lc, xc, yc, wc >> hs, hc >> vs, CR);
370 }
371 }
372 if (sps->r->sps_joint_cbcr_enabled_flag && ((cu->pred_mode == MODE_INTRA &&
373 (tu->coded_flag[CB] || tu->coded_flag[CR])) ||
374 (tu->coded_flag[CB] && tu->coded_flag[CR])) &&
375 chroma_available) {
377 }
378
379 for (int i = 0; i < tu->nb_tbs; i++) {
380 TransformBlock *tb = &tu->tbs[i];
381 const int is_chroma = tb->c_idx != LUMA;
382 tb->has_coeffs = tu->coded_flag[tb->c_idx];
383 if (tb->has_coeffs && is_chroma)
384 tb->has_coeffs = tb->c_idx == CB ? 1 : !(tu->coded_flag[CB] && tu->joint_cbcr_residual_flag);
385 if (tb->has_coeffs) {
386 tb->ts = cu->bdpcm_flag[tb->c_idx];
387 if (sps->r->sps_transform_skip_enabled_flag && !cu->bdpcm_flag[tb->c_idx] &&
388 tb->tb_width <= sps->max_ts_size && tb->tb_height <= sps->max_ts_size &&
389 !cu->sbt_flag && (is_chroma || !is_isp)) {
390 tb->ts = ff_vvc_transform_skip_flag(lc, is_chroma);
391 }
392 ret = ff_vvc_residual_coding(lc, tb);
393 if (ret < 0)
394 return ret;
395 set_tb_tab(fc->tab.tu_coded_flag[tb->c_idx], tu->coded_flag[tb->c_idx], fc, tb);
396 } else if (cu->act_enabled_flag) {
397 memset(tb->coeffs, 0, tb->tb_width * tb->tb_height * sizeof(*tb->coeffs));
398 }
399 if (tb->c_idx != CR)
400 set_tb_size(fc, tb);
401 if (tb->c_idx == CB)
402 set_tb_tab(fc->tab.tu_joint_cbcr_residual_flag, tu->joint_cbcr_residual_flag, fc, tb);
403 }
404
405 return 0;
406}
407
408static int hls_transform_tree(VVCLocalContext *lc, int x0, int y0,int tu_width, int tu_height, int ch_type)
409{
410 const CodingUnit *cu = lc->cu;
411 const VVCSPS *sps = lc->fc->ps.sps;
412 int ret;
413
414 lc->parse.infer_tu_cbf_luma = 1;
415 if (cu->isp_split_type == ISP_NO_SPLIT && !cu->sbt_flag) {
416 if (tu_width > sps->max_tb_size_y || tu_height > sps->max_tb_size_y) {
417 const int ver_split_first = tu_width > sps->max_tb_size_y && tu_width > tu_height;
418 const int trafo_width = ver_split_first ? (tu_width / 2) : tu_width;
419 const int trafo_height = !ver_split_first ? (tu_height / 2) : tu_height;
420
421 #define TRANSFORM_TREE(x, y) do { \
422 ret = hls_transform_tree(lc, x, y, trafo_width, trafo_height, ch_type); \
423 if (ret < 0) \
424 return ret; \
425 } while (0)
426
427 TRANSFORM_TREE(x0, y0);
428 if (ver_split_first)
429 TRANSFORM_TREE(x0 + trafo_width, y0);
430 else
431 TRANSFORM_TREE(x0, y0 + trafo_height);
432
433 } else {
434 ret = hls_transform_unit(lc, x0, y0, tu_width, tu_height, 0, ch_type);
435 if (ret < 0)
436 return ret;
437
438 }
439 } else if (cu->sbt_flag) {
440 if (!cu->sbt_horizontal_flag) {
441 #define TRANSFORM_UNIT(x, width, idx) do { \
442 ret = hls_transform_unit(lc, x, y0, width, tu_height, idx, ch_type); \
443 if (ret < 0) \
444 return ret; \
445 } while (0)
446
447 const int trafo_width = tu_width * lc->parse.sbt_num_fourths_tb0 / 4;
448 TRANSFORM_UNIT(x0, trafo_width, 0);
449 TRANSFORM_UNIT(x0 + trafo_width, tu_width - trafo_width, 1);
450
451 #undef TRANSFORM_UNIT
452 } else {
453 #define TRANSFORM_UNIT(y, height, idx) do { \
454 ret = hls_transform_unit(lc, x0, y, tu_width, height, idx, ch_type); \
455 if (ret < 0) \
456 return ret; \
457 } while (0)
458
459 const int trafo_height = tu_height * lc->parse.sbt_num_fourths_tb0 / 4;
460 TRANSFORM_UNIT(y0, trafo_height, 0);
461 TRANSFORM_UNIT(y0 + trafo_height, tu_height - trafo_height, 1);
462
463 #undef TRANSFORM_UNIT
464 }
465 } else if (cu->isp_split_type == ISP_HOR_SPLIT) {
466 const int trafo_height = tu_height / cu->num_intra_subpartitions;
467 for (int i = 0; i < cu->num_intra_subpartitions; i++) {
468 ret = hls_transform_unit(lc, x0, y0 + trafo_height * i, tu_width, trafo_height, i, 0);
469 if (ret < 0)
470 return ret;
471 }
472 } else if (cu->isp_split_type == ISP_VER_SPLIT) {
473 const int trafo_width = tu_width / cu->num_intra_subpartitions;
474 for (int i = 0; i < cu->num_intra_subpartitions; i++) {
475 ret = hls_transform_unit(lc, x0 + trafo_width * i , y0, trafo_width, tu_height, i, 0);
476 if (ret < 0)
477 return ret;
478 }
479 }
480
481 return 0;
482}
483
484static int skipped_transform_tree(VVCLocalContext *lc, int x0, int y0,int tu_width, int tu_height)
485{
486 VVCFrameContext *fc = lc->fc;
487 const CodingUnit *cu = lc->cu;
488 const VVCSPS *sps = fc->ps.sps;
489
490 if (tu_width > sps->max_tb_size_y || tu_height > sps->max_tb_size_y) {
491 const int ver_split_first = tu_width > sps->max_tb_size_y && tu_width > tu_height;
492 const int trafo_width = ver_split_first ? (tu_width / 2) : tu_width;
493 const int trafo_height = !ver_split_first ? (tu_height / 2) : tu_height;
494
495 #define SKIPPED_TRANSFORM_TREE(x, y) do { \
496 int ret = skipped_transform_tree(lc, x, y, trafo_width, trafo_height); \
497 if (ret < 0) \
498 return ret; \
499 } while (0)
500
502 if (ver_split_first)
503 SKIPPED_TRANSFORM_TREE(x0 + trafo_width, y0);
504 else
505 SKIPPED_TRANSFORM_TREE(x0, y0 + trafo_height);
506 } else {
507 TransformUnit *tu = add_tu(fc, lc->cu, x0, y0, tu_width, tu_height);
508 int start, end;
509
510 if (!tu)
511 return AVERROR_INVALIDDATA;
512 ff_vvc_channel_range(&start, &end, cu->tree_type, sps->r->sps_chroma_format_idc);
513 for (int i = start; i < end; i++) {
514 TransformBlock *tb = add_tb(tu, lc, x0, y0, tu_width >> sps->hshift[i], tu_height >> sps->vshift[i], i);
515 if (i != CR)
516 set_tb_size(fc, tb);
517 }
518 }
519
520 return 0;
521}
522
523//6.4.1 Allowed quad split process
524//6.4.2 Allowed binary split process
525//6.4.3 Allowed ternary split process
526static void can_split(const VVCLocalContext *lc, int x0, int y0,int cb_width, int cb_height,
527 int mtt_depth, int depth_offset, int part_idx, VVCSplitMode last_split_mode,
528 VVCTreeType tree_type, VVCModeType mode_type, VVCAllowedSplit* split)
529{
530 int min_qt_size, max_bt_size, max_tt_size, max_mtt_depth;
531 const VVCFrameContext *fc = lc->fc;
532 const VVCSH *sh = &lc->sc->sh;
533 const VVCSPS *sps = fc->ps.sps;
534 const VVCPPS *pps = fc->ps.pps;
535 const int chroma = tree_type == DUAL_TREE_CHROMA;
536 int min_cb_size_y = sps->min_cb_size_y;
537 int *qt = &split->qt;
538 int *btv = &split->btv;
539 int *bth = &split->bth;
540 int *ttv = &split->ttv;
541 int *tth = &split->tth;
542
543 *qt = *bth = *btv = *tth = *ttv = 1;
544
545 if (mtt_depth)
546 *qt = 0;
547
548 min_qt_size = sh->min_qt_size[chroma];
549 if (cb_width <= min_qt_size)
550 *qt = 0;
551
552 if (chroma) {
553 int chroma_area = (cb_width >> sps->hshift[1]) * (cb_height >> sps->vshift[1]);
554 int chroma_width = cb_width >> sps->hshift[1];
555
556 if (chroma_width == 8)
557 *ttv = 0;
558 else if (chroma_width <= 4) {
559 if (chroma_width == 4)
560 *btv = 0;
561 *qt = 0;
562 }
563 if (mode_type == MODE_TYPE_INTRA)
564 *qt = *btv = *bth = *ttv = *tth = 0;
565 if (chroma_area <= 32) {
566 *ttv = *tth = 0;
567 if (chroma_area <= 16)
568 *btv = *bth = 0;
569 }
570 }
571 max_bt_size = sh->max_bt_size[chroma];
572 max_tt_size = sh->max_tt_size[chroma];
573 max_mtt_depth = sh->max_mtt_depth[chroma] + depth_offset;
574
575 if (mode_type == MODE_TYPE_INTER) {
576 int area = cb_width * cb_height;
577 if (area == 32)
578 *btv = *bth = 0;
579 else if (area == 64)
580 *ttv = *tth = 0;
581 }
582 if (cb_width <= 2 * min_cb_size_y) {
583 *ttv = 0;
584 if (cb_width <= min_cb_size_y)
585 *btv = 0;
586 }
587 if (cb_height <= 2 * min_cb_size_y) {
588 *tth = 0;
589 if (cb_height <= min_cb_size_y)
590 *bth = 0;
591 }
592 if (cb_width > max_bt_size || cb_height > max_bt_size)
593 *btv = *bth = 0;
594 max_tt_size = FFMIN(64, max_tt_size);
595 if (cb_width > max_tt_size || cb_height > max_tt_size)
596 *ttv = *tth = 0;
597 if (mtt_depth >= max_mtt_depth)
598 *btv = *bth = *ttv = *tth = 0;
599 if (x0 + cb_width > pps->width) {
600 *ttv = *tth = 0;
601 if (cb_height > 64)
602 *btv = 0;
603 if (y0 + cb_height <= pps->height)
604 *bth = 0;
605 else if (cb_width > min_qt_size)
606 *btv = *bth = 0;
607 }
608 if (y0 + cb_height > pps->height) {
609 *btv = *ttv = *tth = 0;
610 if (cb_width > 64)
611 *bth = 0;
612 }
613 if (mtt_depth > 0 && part_idx == 1) {
614 if (last_split_mode == SPLIT_TT_VER)
615 *btv = 0;
616 else if (last_split_mode == SPLIT_TT_HOR)
617 *bth = 0;
618 }
619 if (cb_width <= 64 && cb_height > 64)
620 *btv = 0;
621 if (cb_width > 64 && cb_height <= 64)
622 *bth = 0;
623}
624
625static int get_num_intra_subpartitions(enum IspType isp_split_type, int cb_width, int cb_height)
626{
627 if (isp_split_type == ISP_NO_SPLIT)
628 return 1;
629 if ((cb_width == 4 && cb_height == 8) || (cb_width == 8 && cb_height == 4))
630 return 2;
631 return 4;
632}
633
634static int get_cclm_enabled(const VVCLocalContext *lc, const int x0, const int y0)
635{
636 const VVCFrameContext *fc = lc->fc;
637 const VVCSPS *sps = fc->ps.sps;
638 int enabled = 0;
639
640 if (!sps->r->sps_cclm_enabled_flag)
641 return 0;
642 if (!sps->r->sps_qtbtt_dual_tree_intra_flag || !IS_I(lc->sc->sh.r) || sps->ctb_log2_size_y < 6)
643 return 1;
644 else {
645 const int x64 = x0 >> 6 << 6;
646 const int y64 = y0 >> 6 << 6;
647 const int y32 = y0 >> 5 << 5;
648 const int x64_cu = x64 >> fc->ps.sps->min_cb_log2_size_y;
649 const int y64_cu = y64 >> fc->ps.sps->min_cb_log2_size_y;
650 const int y32_cu = y32 >> fc->ps.sps->min_cb_log2_size_y;
651 const int min_cb_width = fc->ps.pps->min_cb_width;
652 const int depth = SAMPLE_CTB(fc->tab.cqt_depth[1], x64_cu, y64_cu);
653 const int min_depth = fc->ps.sps->ctb_log2_size_y - 6;
654 const VVCSplitMode msm64 = (VVCSplitMode)TAB_MSM(fc, 0, x64, y64);
655 const VVCSplitMode msm32 = (VVCSplitMode)TAB_MSM(fc, 1, x64, y32);
656
657 enabled = SAMPLE_CTB(fc->tab.cb_width[1], x64_cu, y64_cu) == 64 &&
658 SAMPLE_CTB(fc->tab.cb_height[1], x64_cu, y64_cu) == 64;
659 enabled |= depth == min_depth && msm64 == SPLIT_BT_HOR &&
660 SAMPLE_CTB(fc->tab.cb_width[1], x64_cu, y32_cu) == 64 &&
661 SAMPLE_CTB(fc->tab.cb_height[1], x64_cu, y32_cu) == 32;
662 enabled |= depth > min_depth;
663 enabled |= depth == min_depth && msm64 == SPLIT_BT_HOR && msm32 == SPLIT_BT_VER;
664
665 if (enabled) {
666 const int w = SAMPLE_CTB(fc->tab.cb_width[0], x64_cu, y64_cu);
667 const int h = SAMPLE_CTB(fc->tab.cb_height[0], x64_cu, y64_cu);
668 const int depth0 = SAMPLE_CTB(fc->tab.cqt_depth[0], x64_cu, y64_cu);
669 if ((w == 64 && h == 64 && TAB_ISPMF(fc, x64, y64)) ||
670 ((w < 64 || h < 64) && depth0 == min_depth))
671 return 0;
672 }
673
674 }
675
676 return enabled;
677}
678
679static int less(const void *a, const void *b)
680{
681 return *(const int*)a - *(const int*)b;
682}
683
684//8.4.2 Derivation process for luma intra prediction mode
685static enum IntraPredMode luma_intra_pred_mode(VVCLocalContext* lc, const int intra_subpartitions_mode_flag)
686{
687 VVCFrameContext *fc = lc->fc;
688 CodingUnit *cu = lc->cu;
689 const int x0 = cu->x0;
690 const int y0 = cu->y0;
691 enum IntraPredMode pred;
692 int intra_luma_not_planar_flag = 1;
693 int intra_luma_mpm_remainder = 0;
694 int intra_luma_mpm_flag = 1;
695 int intra_luma_mpm_idx = 0;
696
697 if (!cu->intra_luma_ref_idx)
698 intra_luma_mpm_flag = ff_vvc_intra_luma_mpm_flag(lc);
699 if (intra_luma_mpm_flag) {
700 if (!cu->intra_luma_ref_idx)
701 intra_luma_not_planar_flag = ff_vvc_intra_luma_not_planar_flag(lc, intra_subpartitions_mode_flag);
702 if (intra_luma_not_planar_flag)
703 intra_luma_mpm_idx = ff_vvc_intra_luma_mpm_idx(lc);
704 } else {
705 intra_luma_mpm_remainder = ff_vvc_intra_luma_mpm_remainder(lc);
706 }
707
708 if (!intra_luma_not_planar_flag) {
710 } else {
711 const VVCSPS *sps = fc->ps.sps;
712 const int x_a = (x0 - 1) >> sps->min_cb_log2_size_y;
713 const int y_a = (y0 + cu->cb_height - 1) >> sps->min_cb_log2_size_y;
714 const int x_b = (x0 + cu->cb_width - 1) >> sps->min_cb_log2_size_y;
715 const int y_b = (y0 - 1) >> sps->min_cb_log2_size_y;
716 int min_cb_width = fc->ps.pps->min_cb_width;
717 int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
718 int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
719 const int available_l = lc->ctb_left_flag || x0b;
720 const int available_u = lc->ctb_up_flag || y0b;
721
722 int a, b, cand[5];
723
724 if (!available_l || (SAMPLE_CTB(fc->tab.cpm[0], x_a, y_a) != MODE_INTRA) ||
725 SAMPLE_CTB(fc->tab.imf, x_a, y_a)) {
726 a = INTRA_PLANAR;
727 } else {
728 a = SAMPLE_CTB(fc->tab.ipm, x_a, y_a);
729 }
730
731 if (!available_u || (SAMPLE_CTB(fc->tab.cpm[0], x_b, y_b) != MODE_INTRA) ||
732 SAMPLE_CTB(fc->tab.imf, x_b, y_b) || !y0b) {
733 b = INTRA_PLANAR;
734 } else {
735 b = SAMPLE_CTB(fc->tab.ipm, x_b, y_b);
736 }
737
738 if (a == b && a > INTRA_DC) {
739 cand[0] = a;
740 cand[1] = 2 + ((a + 61) % 64);
741 cand[2] = 2 + ((a - 1) % 64);
742 cand[3] = 2 + ((a + 60) % 64);
743 cand[4] = 2 + (a % 64);
744 } else {
745 const int minab = FFMIN(a, b);
746 const int maxab = FFMAX(a, b);
747 if (a > INTRA_DC && b > INTRA_DC) {
748 const int diff = maxab - minab;
749 cand[0] = a;
750 cand[1] = b;
751 if (diff == 1) {
752 cand[2] = 2 + ((minab + 61) % 64);
753 cand[3] = 2 + ((maxab - 1) % 64);
754 cand[4] = 2 + ((minab + 60) % 64);
755 } else if (diff >= 62) {
756 cand[2] = 2 + ((minab - 1) % 64);
757 cand[3] = 2 + ((maxab + 61) % 64);
758 cand[4] = 2 + (minab % 64);
759 } else if (diff == 2) {
760 cand[2] = 2 + ((minab - 1) % 64);
761 cand[3] = 2 + ((minab + 61) % 64);
762 cand[4] = 2 + ((maxab - 1) % 64);
763 } else {
764 cand[2] = 2 + ((minab + 61) % 64);
765 cand[3] = 2 + ((minab - 1) % 64);
766 cand[4] = 2 + ((maxab + 61) % 64);
767 }
768 } else if (a > INTRA_DC || b > INTRA_DC) {
769 cand[0] = maxab;
770 cand[1] = 2 + ((maxab + 61 ) % 64);
771 cand[2] = 2 + ((maxab - 1) % 64);
772 cand[3] = 2 + ((maxab + 60 ) % 64);
773 cand[4] = 2 + (maxab % 64);
774 } else {
775 cand[0] = INTRA_DC;
776 cand[1] = INTRA_VERT;
777 cand[2] = INTRA_HORZ;
778 cand[3] = INTRA_VERT - 4;
779 cand[4] = INTRA_VERT + 4;
780 }
781 }
782 if (intra_luma_mpm_flag) {
783 pred = cand[intra_luma_mpm_idx];
784 } else {
785 qsort(cand, FF_ARRAY_ELEMS(cand), sizeof(cand[0]), less);
786 pred = intra_luma_mpm_remainder + 1;
787 for (int i = 0; i < FF_ARRAY_ELEMS(cand); i++) {
788 if (pred >= cand[i])
789 pred++;
790 }
791 }
792 }
793 return pred;
794}
795
797{
798 CodingUnit *cu = lc->cu;
799 const VVCTreeType tree_type = cu->tree_type;
800 const VVCSPS *sps = lc->fc->ps.sps;
801 const int cb_width = cu->cb_width;
802 const int cb_height = cu->cb_height;
803 const TransformUnit *tu = cu->tus.head;
804 int lfnst_width, lfnst_height, min_lfnst;
805 int lfnst_idx = 0;
806
807 memset(cu->apply_lfnst_flag, 0, sizeof(cu->apply_lfnst_flag));
808
809 if (!sps->r->sps_lfnst_enabled_flag || cu->pred_mode != MODE_INTRA || FFMAX(cb_width, cb_height) > sps->max_tb_size_y)
810 return 0;
811
812 while (tu) {
813 for (int j = 0; j < tu->nb_tbs; j++) {
814 const TransformBlock *tb = tu->tbs + j;
815 if (tu->coded_flag[tb->c_idx] && tb->ts)
816 return 0;
817 }
818 tu = tu->next;
819 }
820
821 if (tree_type == DUAL_TREE_CHROMA) {
822 lfnst_width = cb_width >> sps->hshift[1];
823 lfnst_height = cb_height >> sps->vshift[1];
824 } else {
825 const int vs = cu->isp_split_type == ISP_VER_SPLIT;
826 const int hs = cu->isp_split_type == ISP_HOR_SPLIT;
827 lfnst_width = vs ? cb_width / cu->num_intra_subpartitions : cb_width;
828 lfnst_height = hs ? cb_height / cu->num_intra_subpartitions : cb_height;
829 }
830 min_lfnst = FFMIN(lfnst_width, lfnst_height);
831 if (tree_type != DUAL_TREE_CHROMA && cu->intra_mip_flag && min_lfnst < 16)
832 return 0;
833
834 if (min_lfnst >= 4) {
836 lfnst_idx = ff_vvc_lfnst_idx(lc, tree_type != SINGLE_TREE);
837 }
838
839 if (lfnst_idx) {
840 cu->apply_lfnst_flag[LUMA] = tree_type != DUAL_TREE_CHROMA;
841 cu->apply_lfnst_flag[CB] = cu->apply_lfnst_flag[CR] = tree_type == DUAL_TREE_CHROMA;
842 }
843
844 return lfnst_idx;
845}
846
848{
849 const CodingUnit *cu = lc->cu;
850 const VVCSPS *sps = lc->fc->ps.sps;
851 const int cb_width = cu->cb_width;
852 const int cb_height = cu->cb_height;
853 const uint8_t transform_skip_flag = cu->tus.head->tbs[0].ts; //fix me
854 int mts_idx = MTS_DCT2_DCT2;
855 if (cu->tree_type != DUAL_TREE_CHROMA && !cu->lfnst_idx &&
856 !transform_skip_flag && FFMAX(cb_width, cb_height) <= 32 &&
857 cu->isp_split_type == ISP_NO_SPLIT && !cu->sbt_flag &&
859 if ((cu->pred_mode == MODE_INTER && sps->r->sps_explicit_mts_inter_enabled_flag) ||
860 (cu->pred_mode == MODE_INTRA && sps->r->sps_explicit_mts_intra_enabled_flag)) {
861 mts_idx = ff_vvc_mts_idx(lc);
862 }
863 }
864
865 return mts_idx;
866}
867
869{
870 const int x_center = (cu->x0 + cu->cb_width / 2) >> sps->min_cb_log2_size_y;
871 const int y_center = (cu->y0 + cu->cb_height / 2) >> sps->min_cb_log2_size_y;
872 const int min_cb_width = pps->min_cb_width;
873 const int intra_mip_flag = SAMPLE_CTB(fc->tab.imf, x_center, y_center);
874 const int cu_pred_mode = SAMPLE_CTB(fc->tab.cpm[0], x_center, y_center);
875 const int intra_pred_mode_y = SAMPLE_CTB(fc->tab.ipm, x_center, y_center);
876
877 if (intra_mip_flag) {
878 if (cu->tree_type == SINGLE_TREE && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444)
879 return INTRA_INVALID;
880 return INTRA_PLANAR;
881 }
882 if (cu_pred_mode == MODE_IBC || cu_pred_mode == MODE_PLT)
883 return INTRA_DC;
884 return intra_pred_mode_y;
885}
886
888 const int cclm_mode_flag, const int cclm_mode_idx, const int intra_chroma_pred_mode)
889{
890 const VVCFrameContext *fc = lc->fc;
891 CodingUnit *cu = lc->cu;
892 const VVCSPS *sps = fc->ps.sps;
893 const VVCPPS *pps = fc->ps.pps;
894 const int x_cb = cu->x0 >> sps->min_cb_log2_size_y;
895 const int y_cb = cu->y0 >> sps->min_cb_log2_size_y;
896 const int min_cb_width = pps->min_cb_width;
897 const int intra_mip_flag = SAMPLE_CTB(fc->tab.imf, x_cb, y_cb);
898 enum IntraPredMode luma_intra_pred_mode = SAMPLE_CTB(fc->tab.ipm, x_cb, y_cb);
899
900 if (cu->tree_type == SINGLE_TREE && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444 &&
901 (intra_chroma_pred_mode == 4 || cu->act_enabled_flag) && intra_mip_flag) {
904 return;
905 }
907
908 if (cu->act_enabled_flag) {
910 return;
911 }
912 if (cclm_mode_flag) {
913 cu->intra_pred_mode_c = INTRA_LT_CCLM + cclm_mode_idx;
914 } else if (intra_chroma_pred_mode == 4){
916 } else {
917 const static IntraPredMode pred_mode_c[][4 + 1] = {
922 };
923 const int modes[4] = {INTRA_PLANAR, INTRA_VERT, INTRA_HORZ, INTRA_DC};
924 int idx;
925
926 // This workaround is necessary to have 4:4:4 video decode correctly
927 // See VVC ticket https://jvet.hhi.fraunhofer.de/trac/vvc/ticket/1602
928 // and VTM source https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/blob/master/source/Lib/CommonLib/UnitTools.cpp#L736
929 if (cu->tree_type == SINGLE_TREE && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444 && intra_mip_flag) {
930 idx = 4;
931 } else {
932 for (idx = 0; idx < FF_ARRAY_ELEMS(modes); idx++) {
933 if (modes[idx] == luma_intra_pred_mode)
934 break;
935 }
936 }
937
938 cu->intra_pred_mode_c = pred_mode_c[intra_chroma_pred_mode][idx];
939 }
940 if (sps->r->sps_chroma_format_idc == CHROMA_FORMAT_422 && cu->intra_pred_mode_c <= INTRA_VDIAG) {
941 const static int mode_map_422[INTRA_VDIAG + 1] = {
942 0, 1, 61, 62, 63, 64, 65, 66, 2, 3, 5, 6, 8, 10, 12, 13,
943 14, 16, 18, 20, 22, 23, 24, 26, 28, 30, 31, 33, 34, 35, 36, 37,
944 38, 39, 40, 41, 41, 42, 43, 43, 44, 44, 45, 45, 46, 47, 48, 48,
945 49, 49, 50, 51, 51, 52, 52, 53, 54, 55, 55, 56, 56, 57, 57, 58,
946 59, 59, 60,
947 };
948 cu->intra_pred_mode_c = mode_map_422[cu->intra_pred_mode_c];
949 }
950}
951
952static av_always_inline uint8_t pack_mip_info(int intra_mip_flag,
953 int intra_mip_transposed_flag, int intra_mip_mode)
954{
955 return (intra_mip_mode << 2) | (intra_mip_transposed_flag << 1) | intra_mip_flag;
956}
957
959{
960 VVCFrameContext *fc = lc->fc;
961 const VVCSPS *sps = fc->ps.sps;
962 const VVCPPS *pps = fc->ps.pps;
963 CodingUnit *cu = lc->cu;
964 const int log2_min_cb_size = sps->min_cb_log2_size_y;
965 const int x0 = cu->x0;
966 const int y0 = cu->y0;
967 const int x_cb = x0 >> log2_min_cb_size;
968 const int y_cb = y0 >> log2_min_cb_size;
969 const int cb_width = cu->cb_width;
970 const int cb_height = cu->cb_height;
971
972 cu->intra_luma_ref_idx = 0;
973 if (sps->r->sps_bdpcm_enabled_flag && cb_width <= sps->max_ts_size && cb_height <= sps->max_ts_size)
975 if (cu->bdpcm_flag[LUMA]) {
977 } else {
978 if (sps->r->sps_mip_enabled_flag)
979 cu->intra_mip_flag = ff_vvc_intra_mip_flag(lc, fc->tab.imf);
980 if (cu->intra_mip_flag) {
981 int intra_mip_transposed_flag = ff_vvc_intra_mip_transposed_flag(lc);
982 int intra_mip_mode = ff_vvc_intra_mip_mode(lc);
983 int x = y_cb * pps->min_cb_width + x_cb;
984 for (int y = 0; y < (cb_height>>log2_min_cb_size); y++) {
985 int width = cb_width>>log2_min_cb_size;
986 const uint8_t mip_info = pack_mip_info(cu->intra_mip_flag,
987 intra_mip_transposed_flag, intra_mip_mode);
988 memset(&fc->tab.imf[x], mip_info, width);
989 x += pps->min_cb_width;
990 }
991 cu->intra_pred_mode_y = intra_mip_mode;
992 } else {
993 int intra_subpartitions_mode_flag = 0;
994 if (sps->r->sps_mrl_enabled_flag && ((y0 % sps->ctb_size_y) > 0))
996 if (sps->r->sps_isp_enabled_flag && !cu->intra_luma_ref_idx &&
997 (cb_width <= sps->max_tb_size_y && cb_height <= sps->max_tb_size_y) &&
998 (cb_width * cb_height > MIN_TU_SIZE * MIN_TU_SIZE) &&
999 !cu->act_enabled_flag)
1000 intra_subpartitions_mode_flag = ff_vvc_intra_subpartitions_mode_flag(lc);
1001 if (!(x0 & 63) && !(y0 & 63))
1002 TAB_ISPMF(fc, x0, y0) = intra_subpartitions_mode_flag;
1003 cu->isp_split_type = ff_vvc_isp_split_type(lc, intra_subpartitions_mode_flag);
1005 cu->intra_pred_mode_y = luma_intra_pred_mode(lc, intra_subpartitions_mode_flag);
1006 }
1007 }
1008 set_cb_tab(lc, fc->tab.ipm, cu->intra_pred_mode_y);
1009}
1010
1012{
1013 const VVCSPS *sps = lc->fc->ps.sps;
1014 CodingUnit *cu = lc->cu;
1015 const int hs = sps->hshift[CHROMA];
1016 const int vs = sps->vshift[CHROMA];
1017 int cclm_mode_flag = 0;
1018 int cclm_mode_idx = 0;
1019 int intra_chroma_pred_mode = 0;
1020
1021 if (!cu->act_enabled_flag) {
1022 cu->mip_chroma_direct_flag = 0;
1023 if (sps->r->sps_bdpcm_enabled_flag &&
1024 (cu->cb_width >> hs) <= sps->max_ts_size &&
1025 (cu->cb_height >> vs) <= sps->max_ts_size) {
1027 }
1028 if (cu->bdpcm_flag[CHROMA]) {
1030 } else {
1031 const int cclm_enabled = get_cclm_enabled(lc, cu->x0, cu->y0);
1032
1033 if (cclm_enabled)
1034 cclm_mode_flag = ff_vvc_cclm_mode_flag(lc);
1035
1036 if (cclm_mode_flag)
1037 cclm_mode_idx = ff_vvc_cclm_mode_idx(lc);
1038 else
1039 intra_chroma_pred_mode = ff_vvc_intra_chroma_pred_mode(lc);
1040 }
1041 }
1042
1043 if (!cu->bdpcm_flag[CHROMA])
1044 derive_chroma_intra_pred_mode(lc, cclm_mode_flag, cclm_mode_idx, intra_chroma_pred_mode);
1045}
1046
1048 const VVCTreeType tree_type,
1049 const VVCModeType mode_type)
1050{
1051 const VVCFrameContext *fc = lc->fc;
1052 CodingUnit *cu = lc->cu;
1053 const VVCSPS *sps = fc->ps.sps;
1054 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1055 const int ch_type = tree_type == DUAL_TREE_CHROMA ? 1 : 0;
1056 const int is_4x4 = cu->cb_width == 4 && cu->cb_height == 4;
1057 const int is_128 = cu->cb_width == 128 || cu->cb_height == 128;
1058 const int hs = sps->hshift[CHROMA];
1059 const int vs = sps->vshift[CHROMA];
1060 int pred_mode_flag;
1061 int pred_mode_ibc_flag;
1062 PredMode pred_mode;
1063
1064 cu->skip_flag = 0;
1065 if (!IS_I(rsh) || sps->r->sps_ibc_enabled_flag) {
1066 if (tree_type != DUAL_TREE_CHROMA &&
1067 ((!is_4x4 && mode_type != MODE_TYPE_INTRA) ||
1068 (sps->r->sps_ibc_enabled_flag && !is_128))) {
1069 cu->skip_flag = ff_vvc_cu_skip_flag(lc, fc->tab.skip);
1070 }
1071
1072 if (is_4x4 || mode_type == MODE_TYPE_INTRA || IS_I(rsh)) {
1073 pred_mode_flag = 1;
1074 } else if (mode_type == MODE_TYPE_INTER || cu->skip_flag) {
1075 pred_mode_flag = 0;
1076 } else {
1077 pred_mode_flag = ff_vvc_pred_mode_flag(lc, ch_type);
1078 }
1079 pred_mode = pred_mode_flag ? MODE_INTRA : MODE_INTER;
1080
1081 if (((IS_I(rsh) && !cu->skip_flag) ||
1082 (!IS_I(rsh) && (pred_mode != MODE_INTRA ||
1083 ((is_4x4 || mode_type == MODE_TYPE_INTRA) && !cu->skip_flag)))) &&
1084 !is_128 && mode_type != MODE_TYPE_INTER && sps->r->sps_ibc_enabled_flag &&
1085 tree_type != DUAL_TREE_CHROMA) {
1086 pred_mode_ibc_flag = ff_vvc_pred_mode_ibc_flag(lc, ch_type);
1087 } else if (cu->skip_flag && (is_4x4 || mode_type == MODE_TYPE_INTRA)) {
1088 pred_mode_ibc_flag = 1;
1089 } else if (is_128 || mode_type == MODE_TYPE_INTER || tree_type == DUAL_TREE_CHROMA) {
1090 pred_mode_ibc_flag = 0;
1091 } else {
1092 pred_mode_ibc_flag = (IS_I(rsh)) ? sps->r->sps_ibc_enabled_flag : 0;
1093 }
1094 if (pred_mode_ibc_flag)
1095 pred_mode = MODE_IBC;
1096 } else {
1097 pred_mode = MODE_INTRA;
1098 }
1099
1100 if (pred_mode == MODE_INTRA && sps->r->sps_palette_enabled_flag && !is_128 && !cu->skip_flag &&
1101 mode_type != MODE_TYPE_INTER && ((cu->cb_width * cu->cb_height) >
1102 (tree_type != DUAL_TREE_CHROMA ? 16 : (16 << hs << vs))) &&
1103 (mode_type != MODE_TYPE_INTRA || tree_type != DUAL_TREE_CHROMA)) {
1105 pred_mode = MODE_PLT;
1106 }
1107
1108 set_cb_tab(lc, fc->tab.cpm[cu->ch_type], pred_mode);
1109 if (tree_type == SINGLE_TREE)
1110 set_cb_tab(lc, fc->tab.cpm[CHROMA], pred_mode);
1111
1112 return pred_mode;
1113}
1114
1115static void sbt_info(VVCLocalContext *lc, const VVCSPS *sps)
1116{
1117 CodingUnit *cu = lc->cu;
1118 const int cb_width = cu->cb_width;
1119 const int cb_height = cu->cb_height;
1120
1121 if (cu->pred_mode == MODE_INTER && sps->r->sps_sbt_enabled_flag && !cu->ciip_flag
1122 && cb_width <= sps->max_tb_size_y && cb_height <= sps->max_tb_size_y) {
1123 const int sbt_ver_h = cb_width >= 8;
1124 const int sbt_hor_h = cb_height >= 8;
1125 cu->sbt_flag = 0;
1126 if (sbt_ver_h || sbt_hor_h)
1127 cu->sbt_flag = ff_vvc_sbt_flag(lc);
1128 if (cu->sbt_flag) {
1129 const int sbt_ver_q = cb_width >= 16;
1130 const int sbt_hor_q = cb_height >= 16;
1131 int cu_sbt_quad_flag = 0;
1132
1133 if ((sbt_ver_h || sbt_hor_h) && (sbt_ver_q || sbt_hor_q))
1134 cu_sbt_quad_flag = ff_vvc_sbt_quad_flag(lc);
1135 if (cu_sbt_quad_flag) {
1136 cu->sbt_horizontal_flag = sbt_hor_q;
1137 if (sbt_ver_q && sbt_hor_q)
1139 } else {
1140 cu->sbt_horizontal_flag = sbt_hor_h;
1141 if (sbt_ver_h && sbt_hor_h)
1143 }
1145
1146 {
1147 const int sbt_min = cu_sbt_quad_flag ? 1 : 2;
1148 lc->parse.sbt_num_fourths_tb0 = cu->sbt_pos_flag ? (4 - sbt_min) : sbt_min;
1149 }
1150 }
1151 }
1152}
1153
1155{
1156 const H266RawSPS *rsps = lc->fc->ps.sps->r;
1157 const CodingUnit *cu = lc->cu;
1158 int ret;
1159
1160 if (cu->tree_type != DUAL_TREE_CHROMA) {
1161 ret = set_qp_y(lc, cu->x0, cu->y0, 0);
1162 if (ret < 0)
1163 return ret;
1164 }
1166 set_qp_c(lc);
1167 ret = skipped_transform_tree(lc, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
1168 if (ret < 0)
1169 return ret;
1170 return 0;
1171}
1172
1173static void set_cb_pos(const VVCFrameContext *fc, const CodingUnit *cu)
1174{
1175 const VVCSPS *sps = fc->ps.sps;
1176 const VVCPPS *pps = fc->ps.pps;
1177 const int log2_min_cb_size = sps->min_cb_log2_size_y;
1178 const int x_cb = cu->x0 >> log2_min_cb_size;
1179 const int y_cb = cu->y0 >> log2_min_cb_size;
1180 const int ch_type = cu->ch_type;
1181 int x, y;
1182
1183 x = y_cb * pps->min_cb_width + x_cb;
1184 for (y = 0; y < (cu->cb_height >> log2_min_cb_size); y++) {
1185 const int width = cu->cb_width >> log2_min_cb_size;
1186
1187 for (int i = 0; i < width; i++) {
1188 fc->tab.cb_pos_x[ch_type][x + i] = cu->x0;
1189 fc->tab.cb_pos_y[ch_type][x + i] = cu->y0;
1190 }
1191 memset(&fc->tab.cb_width[ch_type][x], cu->cb_width, width);
1192 memset(&fc->tab.cb_height[ch_type][x], cu->cb_height, width);
1193 memset(&fc->tab.cqt_depth[ch_type][x], cu->cqt_depth, width);
1194
1195 x += pps->min_cb_width;
1196 }
1197}
1198
1199static CodingUnit* alloc_cu(VVCLocalContext *lc, const int x0, const int y0)
1200{
1201 VVCFrameContext *fc = lc->fc;
1202 const VVCSPS *sps = fc->ps.sps;
1203 const VVCPPS *pps = fc->ps.pps;
1204 const int rx = x0 >> sps->ctb_log2_size_y;
1205 const int ry = y0 >> sps->ctb_log2_size_y;
1206 CodingUnit **cus = fc->tab.cus + ry * pps->ctb_width + rx;
1207 CodingUnit *cu = av_refstruct_pool_get(fc->cu_pool);
1208
1209 if (!cu)
1210 return NULL;
1211 cu->next = NULL;
1212
1213 if (lc->cu)
1214 lc->cu->next = cu;
1215 else
1216 *cus = cu;
1217 lc->cu = cu;
1218
1219 return cu;
1220}
1221
1222static CodingUnit* add_cu(VVCLocalContext *lc, const int x0, const int y0,
1223 const int cb_width, const int cb_height, const int cqt_depth, const VVCTreeType tree_type)
1224{
1225 VVCFrameContext *fc = lc->fc;
1226 const int ch_type = tree_type == DUAL_TREE_CHROMA ? 1 : 0;
1227 CodingUnit *cu = alloc_cu(lc, x0, y0);
1228
1229 if (!cu)
1230 return NULL;
1231
1232 memset(&cu->pu, 0, sizeof(cu->pu));
1233
1234 lc->parse.prev_tu_cbf_y = 0;
1235
1236 cu->sbt_flag = 0;
1237 cu->act_enabled_flag = 0;
1238
1239 cu->tree_type = tree_type;
1240 cu->x0 = x0;
1241 cu->y0 = y0;
1242 cu->cb_width = cb_width;
1243 cu->cb_height = cb_height;
1244 cu->ch_type = ch_type;
1245 cu->cqt_depth = cqt_depth;
1246 cu->tus.head = cu->tus.tail = NULL;
1247 cu->bdpcm_flag[LUMA] = cu->bdpcm_flag[CB] = cu->bdpcm_flag[CR] = 0;
1249 cu->intra_mip_flag = 0;
1250 cu->ciip_flag = 0;
1251 cu->coded_flag = 1;
1253 cu->pu.dmvr_flag = 0;
1254
1255 set_cb_pos(fc, cu);
1256 return cu;
1257}
1258
1259static void set_cu_tabs(const VVCLocalContext *lc, const CodingUnit *cu)
1260{
1261 const VVCFrameContext *fc = lc->fc;
1262 const PredictionUnit *pu = &cu->pu;
1263 const TransformUnit *tu = cu->tus.head;
1264
1265 set_cb_tab(lc, fc->tab.mmi, pu->mi.motion_model_idc);
1266 set_cb_tab(lc, fc->tab.msf, pu->merge_subblock_flag);
1267 if (cu->tree_type != DUAL_TREE_CHROMA) {
1268 set_cb_tab(lc, fc->tab.skip, cu->skip_flag);
1269 set_cb_tab(lc, fc->tab.pcmf[LUMA], cu->bdpcm_flag[LUMA]);
1270 }
1271 if (cu->tree_type != DUAL_TREE_LUMA)
1272 set_cb_tab(lc, fc->tab.pcmf[CHROMA], cu->bdpcm_flag[CHROMA]);
1273
1274 while (tu) {
1275 for (int j = 0; j < tu->nb_tbs; j++) {
1276 const TransformBlock *tb = tu->tbs + j;
1277 if (tb->c_idx != LUMA)
1278 set_qp_c_tab(lc, tu, tb);
1279 }
1280 tu = tu->next;
1281 }
1282}
1283
1284//8.5.2.7 Derivation process for merge motion vector difference
1285static void derive_mmvd(const VVCLocalContext *lc, MvField *mvf, const Mv *mmvd_offset)
1286{
1287 const SliceContext *sc = lc->sc;
1288 Mv mmvd[2];
1289
1290 if (mvf->pred_flag == PF_BI) {
1291 const RefPicList *rpl = sc->rpl;
1292 const int poc = lc->fc->ps.ph.poc;
1293 const int diff[] = {
1294 poc - rpl[L0].refs[mvf->ref_idx[L0]].poc,
1295 poc - rpl[L1].refs[mvf->ref_idx[L1]].poc
1296 };
1297 const int sign = FFSIGN(diff[0]) != FFSIGN(diff[1]);
1298
1299 if (diff[0] == diff[1]) {
1300 mmvd[1] = mmvd[0] = *mmvd_offset;
1301 }
1302 else {
1303 const int i = FFABS(diff[0]) < FFABS(diff[1]);
1304 const int o = !i;
1305 mmvd[i] = *mmvd_offset;
1306 if (!rpl[L0].refs[mvf->ref_idx[L0]].is_lt && !rpl[L1].refs[mvf->ref_idx[L1]].is_lt) {
1307 ff_vvc_mv_scale(&mmvd[o], mmvd_offset, diff[i], diff[o]);
1308 }
1309 else {
1310 mmvd[o].x = sign ? -mmvd[i].x : mmvd[i].x;
1311 mmvd[o].y = sign ? -mmvd[i].y : mmvd[i].y;
1312 }
1313 }
1314 mvf->mv[0].x += mmvd[0].x;
1315 mvf->mv[0].y += mmvd[0].y;
1316 mvf->mv[1].x += mmvd[1].x;
1317 mvf->mv[1].y += mmvd[1].y;
1318 ff_vvc_clip_mv(&mvf->mv[0]);
1319 ff_vvc_clip_mv(&mvf->mv[1]);
1320 } else {
1321 const int idx = mvf->pred_flag - PF_L0;
1322 mvf->mv[idx].x += mmvd_offset->x;
1323 mvf->mv[idx].y += mmvd_offset->y;
1324 ff_vvc_clip_mv(&mvf->mv[idx]);
1325 }
1326
1327}
1328
1329static void mvf_to_mi(const MvField *mvf, MotionInfo *mi)
1330{
1331 mi->pred_flag = mvf->pred_flag;
1332 mi->bcw_idx = mvf->bcw_idx;
1333 mi->hpel_if_idx = mvf->hpel_if_idx;
1334 for (int i = 0; i < 2; i++) {
1335 const PredFlag mask = i + 1;
1336 if (mvf->pred_flag & mask) {
1337 mi->mv[i][0] = mvf->mv[i];
1338 mi->ref_idx[i] = mvf->ref_idx[i];
1339 }
1340 }
1341}
1342
1343static void mv_merge_refine_pred_flag(MvField *mvf, const int width, const int height)
1344{
1345 if (mvf->pred_flag == PF_BI && (width + height) == 12) {
1346 mvf->pred_flag = PF_L0;
1347 mvf->bcw_idx = 0;
1348 }
1349}
1350
1351// subblock-based inter prediction data
1353{
1354 const VVCFrameContext *fc = lc->fc;
1355 const VVCPH *ph = &fc->ps.ph;
1356 CodingUnit* cu = lc->cu;
1357 PredictionUnit *pu = &cu->pu;
1358 int merge_subblock_idx = 0;
1359
1360 if (ph->max_num_subblock_merge_cand > 1) {
1361 merge_subblock_idx = ff_vvc_merge_subblock_idx(lc, ph->max_num_subblock_merge_cand);
1362 }
1363 ff_vvc_sb_mv_merge_mode(lc, merge_subblock_idx, pu);
1364}
1365
1367{
1368 const VVCFrameContext *fc = lc->fc;
1369 const VVCSPS *sps = fc->ps.sps;
1370 const VVCPH *ph = &fc->ps.ph;
1371 const CodingUnit* cu = lc->cu;
1372 PredictionUnit *pu = &lc->cu->pu;
1373 int merge_idx = 0;
1374 Mv mmvd_offset;
1375 MvField mvf;
1376
1377 if (sps->r->sps_mmvd_enabled_flag)
1379 if (pu->mmvd_merge_flag) {
1380 int mmvd_cand_flag = 0;
1381 if (sps->max_num_merge_cand > 1)
1382 mmvd_cand_flag = ff_vvc_mmvd_cand_flag(lc);
1383 ff_vvc_mmvd_offset_coding(lc, &mmvd_offset, ph->r->ph_mmvd_fullpel_only_flag);
1384 merge_idx = mmvd_cand_flag;
1385 } else if (sps->max_num_merge_cand > 1) {
1386 merge_idx = ff_vvc_merge_idx(lc);
1387 }
1388 ff_vvc_luma_mv_merge_mode(lc, merge_idx, 0, &mvf);
1389 if (pu->mmvd_merge_flag)
1390 derive_mmvd(lc, &mvf, &mmvd_offset);
1392 ff_vvc_store_mvf(lc, &mvf);
1393 mvf_to_mi(&mvf, &pu->mi);
1394}
1395
1396static int ciip_flag_decode(VVCLocalContext *lc, const int ciip_avaiable, const int gpm_avaiable, const int is_128)
1397{
1398 const VVCFrameContext *fc = lc->fc;
1399 const VVCSPS *sps = fc->ps.sps;
1400 const CodingUnit *cu = lc->cu;
1401
1402 if (ciip_avaiable && gpm_avaiable)
1403 return ff_vvc_ciip_flag(lc);
1404 return sps->r->sps_ciip_enabled_flag && !cu->skip_flag &&
1405 !is_128 && (cu->cb_width * cu->cb_height >= 64);
1406}
1407
1409{
1410 const VVCFrameContext *fc = lc->fc;
1411 const VVCSPS *sps = fc->ps.sps;
1412 PredictionUnit *pu = &lc->cu->pu;
1413 int merge_gpm_idx[2];
1414
1415 pu->merge_gpm_flag = 1;
1417 merge_gpm_idx[0] = ff_vvc_merge_gpm_idx(lc, 0);
1418 merge_gpm_idx[1] = 0;
1419 if (sps->max_num_gpm_merge_cand > 2)
1420 merge_gpm_idx[1] = ff_vvc_merge_gpm_idx(lc, 1);
1421
1422 ff_vvc_luma_mv_merge_gpm(lc, merge_gpm_idx, pu->gpm_mv);
1423 ff_vvc_store_gpm_mvf(lc, pu);
1424}
1425
1427{
1428 const VVCFrameContext* fc = lc->fc;
1429 const VVCSPS* sps = fc->ps.sps;
1430 CodingUnit *cu = lc->cu;
1431 MotionInfo *mi = &cu->pu.mi;
1432 int merge_idx = 0;
1433 MvField mvf;
1434
1435 if (sps->max_num_merge_cand > 1)
1436 merge_idx = ff_vvc_merge_idx(lc);
1437 ff_vvc_luma_mv_merge_mode(lc, merge_idx, 1, &mvf);
1439 ff_vvc_store_mvf(lc, &mvf);
1440 mvf_to_mi(&mvf, mi);
1442 cu->intra_luma_ref_idx = 0;
1443 cu->intra_mip_flag = 0;
1444}
1445
1446// block-based inter prediction data
1448{
1449 const VVCFrameContext* fc = lc->fc;
1450 const VVCSPS *sps = fc->ps.sps;
1451 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1452 CodingUnit *cu = lc->cu;
1453 const int cb_width = cu->cb_width;
1454 const int cb_height = cu->cb_height;
1455 const int is_128 = cb_width == 128 || cb_height == 128;
1456 const int ciip_avaiable = sps->r->sps_ciip_enabled_flag &&
1457 !cu->skip_flag && (cb_width * cb_height >= 64);
1458 const int gpm_avaiable = sps->r->sps_gpm_enabled_flag && IS_B(rsh) &&
1459 (cb_width >= 8) && (cb_height >=8) &&
1460 (cb_width < 8 * cb_height) && (cb_height < 8 *cb_width);
1461
1462 int regular_merge_flag = 1;
1463
1464 if (!is_128 && (ciip_avaiable || gpm_avaiable))
1465 regular_merge_flag = ff_vvc_regular_merge_flag(lc, cu->skip_flag);
1466 if (regular_merge_flag) {
1468 } else {
1469 cu->ciip_flag = ciip_flag_decode(lc, ciip_avaiable, gpm_avaiable, is_128);
1470 if (cu->ciip_flag)
1471 merge_data_ciip(lc);
1472 else
1473 merge_data_gpm(lc);
1474 }
1475}
1476
1478{
1479 const VVCFrameContext* fc = lc->fc;
1480 const VVCSPS* sps = fc->ps.sps;
1481 MotionInfo *mi = &lc->cu->pu.mi;
1482 int merge_idx = 0;
1483 int ret;
1484
1485 mi->pred_flag = PF_IBC;
1486
1487 if (sps->max_num_ibc_merge_cand > 1)
1488 merge_idx = ff_vvc_merge_idx(lc);
1489
1490 ret = ff_vvc_luma_mv_merge_ibc(lc, merge_idx, &mi->mv[L0][0]);
1491 if (ret)
1492 return ret;
1493 ff_vvc_store_mv(lc, mi);
1494
1495 return 0;
1496}
1497
1499{
1500 const VVCFrameContext *fc = lc->fc;
1501 const VVCPH *ph = &fc->ps.ph;
1502 const CodingUnit *cu = lc->cu;
1503 PredictionUnit *pu = &lc->cu->pu;
1504 int ret;
1505
1506 pu->merge_gpm_flag = 0;
1507 pu->mi.num_sb_x = pu->mi.num_sb_y = 1;
1508 if (cu->pred_mode == MODE_IBC) {
1509 ret = merge_data_ibc(lc);
1510 if (ret)
1511 return ret;
1512 } else {
1513 if (ph->max_num_subblock_merge_cand > 0 && cu->cb_width >= 8 && cu->cb_height >= 8)
1515 if (pu->merge_subblock_flag)
1517 else
1518 merge_data_block(lc);
1519 }
1520 return 0;
1521}
1522
1523static void hls_mvd_coding(VVCLocalContext *lc, Mv* mvd)
1524{
1525 int32_t mv[2];
1526
1527 for (int i = 0; i < 2; i++) {
1529 }
1530
1531 for (int i = 0; i < 2; i++) {
1532 if (mv[i])
1534 }
1535
1536 for (int i = 0; i < 2; i++) {
1537 if (mv[i] > 0) {
1538 if (mv[i] == 2)
1539 mv[i] += ff_vvc_abs_mvd_minus2(lc);
1540 mv[i] = (1 - 2 * ff_vvc_mvd_sign_flag(lc)) * mv[i];
1541 }
1542 }
1543 mvd->x = mv[0];
1544 mvd->y = mv[1];
1545}
1546
1547static int bcw_idx_decode(VVCLocalContext *lc, const MotionInfo *mi, const int cb_width, const int cb_height)
1548{
1549 const VVCFrameContext *fc = lc->fc;
1550 const VVCSPS *sps = fc->ps.sps;
1551 const VVCPPS *pps = fc->ps.pps;
1552 const VVCPH *ph = &fc->ps.ph;
1553 const VVCSH *sh = &lc->sc->sh;
1554 const PredWeightTable *w = pps->r->pps_wp_info_in_ph_flag ? &ph->pwt : &sh->pwt;
1555 int bcw_idx = 0;
1556
1557 if (sps->r->sps_bcw_enabled_flag && mi->pred_flag == PF_BI &&
1558 !w->weight_flag[L0][LUMA][mi->ref_idx[0]] &&
1559 !w->weight_flag[L1][LUMA][mi->ref_idx[1]] &&
1560 !w->weight_flag[L0][CHROMA][mi->ref_idx[0]] &&
1561 !w->weight_flag[L1][CHROMA][mi->ref_idx[1]] &&
1562 cb_width * cb_height >= 256) {
1564 }
1565 return bcw_idx;
1566}
1567
1568static int8_t ref_idx_decode(VVCLocalContext *lc, const VVCSH *sh, const int sym_mvd_flag, const int lx)
1569{
1570 const H266RawSliceHeader *rsh = sh->r;
1571 int ref_idx = 0;
1572
1573 if (rsh->num_ref_idx_active[lx] > 1 && !sym_mvd_flag)
1574 ref_idx = ff_vvc_ref_idx_lx(lc, rsh->num_ref_idx_active[lx]);
1575 else if (sym_mvd_flag)
1576 ref_idx = sh->ref_idx_sym[lx];
1577 return ref_idx;
1578}
1579
1581 const int num_cp_mv, const int lx)
1582{
1583 const VVCFrameContext *fc = lc->fc;
1584 const VVCPH *ph = &fc->ps.ph;
1585 const PredictionUnit *pu = &lc->cu->pu;
1586 const MotionInfo *mi = &pu->mi;
1587 int has_no_zero_mvd = 0;
1588
1589 if (lx == L1 && ph->r->ph_mvd_l1_zero_flag && mi->pred_flag == PF_BI) {
1590 for (int j = 0; j < num_cp_mv; j++)
1591 AV_ZERO64(&mvds[lx][j]);
1592 } else {
1593 Mv *mvd0 = &mvds[lx][0];
1594 if (lx == L1 && pu->sym_mvd_flag) {
1595 mvd0->x = -mvds[L0][0].x;
1596 mvd0->y = -mvds[L0][0].y;
1597 } else {
1598 hls_mvd_coding(lc, mvd0);
1599 }
1600 has_no_zero_mvd |= (mvd0->x || mvd0->y);
1601 for (int j = 1; j < num_cp_mv; j++) {
1602 Mv *mvd = &mvds[lx][j];
1603 hls_mvd_coding(lc, mvd);
1604 mvd->x += mvd0->x;
1605 mvd->y += mvd0->y;
1606 has_no_zero_mvd |= (mvd->x || mvd->y);
1607 }
1608 }
1609 return has_no_zero_mvd;
1610}
1611
1612static void mvp_add_difference(MotionInfo *mi, const int num_cp_mv,
1613 const Mv mvds[2][MAX_CONTROL_POINTS], const int amvr_shift)
1614{
1615 for (int i = 0; i < 2; i++) {
1616 const PredFlag mask = i + PF_L0;
1617 if (mi->pred_flag & mask) {
1618 for (int j = 0; j < num_cp_mv; j++) {
1619 const Mv *mvd = &mvds[i][j];
1620 mi->mv[i][j].x += mvd->x * (1 << amvr_shift);
1621 mi->mv[i][j].y += mvd->y * (1 << amvr_shift);
1622 ff_vvc_wrap_mv(&mi->mv[i][j]);
1623 }
1624 }
1625 }
1626}
1627
1629{
1630 const VVCFrameContext *fc = lc->fc;
1631 const CodingUnit *cu = lc->cu;
1632 const PredictionUnit *pu = &lc->cu->pu;
1633 const VVCSPS *sps = fc->ps.sps;
1634 MotionInfo *mi = &lc->cu->pu.mi;
1635 int mvp_l0_flag = 0;
1636 int amvr_shift = 4;
1637 Mv *mv = &mi->mv[L0][0];
1638 int ret;
1639
1640 mi->pred_flag = PF_IBC;
1641 mi->num_sb_x = 1;
1642 mi->num_sb_y = 1;
1643
1644 hls_mvd_coding(lc, mv);
1645 if (sps->max_num_ibc_merge_cand > 1)
1646 mvp_l0_flag = ff_vvc_mvp_lx_flag(lc);
1647 if (sps->r->sps_amvr_enabled_flag && (mv->x || mv->y))
1648 amvr_shift = ff_vvc_amvr_shift(lc, pu->inter_affine_flag, cu->pred_mode, 1);
1649
1650 ret = ff_vvc_mvp_ibc(lc, mvp_l0_flag, amvr_shift, mv);
1651 if (ret)
1652 return ret;
1653 ff_vvc_store_mv(lc, mi);
1654
1655 return 0;
1656}
1657
1659{
1660 const VVCFrameContext *fc = lc->fc;
1661 const CodingUnit *cu = lc->cu;
1662 PredictionUnit *pu = &lc->cu->pu;
1663 const VVCSPS *sps = fc->ps.sps;
1664 const VVCPH *ph = &fc->ps.ph;
1665 const VVCSH *sh = &lc->sc->sh;
1666 const H266RawSliceHeader *rsh = sh->r;
1667 MotionInfo *mi = &pu->mi;
1668 const int cb_width = cu->cb_width;
1669 const int cb_height = cu->cb_height;
1670
1671 int mvp_lx_flag[2] = {0};
1672 int cu_affine_type_flag = 0;
1673 int num_cp_mv;
1674 int amvr_enabled, has_no_zero_mvd = 0, amvr_shift;
1675 Mv mvds[2][MAX_CONTROL_POINTS];
1676
1677 mi->pred_flag = ff_vvc_pred_flag(lc, IS_B(rsh));
1678 if (sps->r->sps_affine_enabled_flag && cb_width >= 16 && cb_height >= 16) {
1680 set_cb_tab(lc, fc->tab.iaf, pu->inter_affine_flag);
1681 if (sps->r->sps_6param_affine_enabled_flag && pu->inter_affine_flag)
1682 cu_affine_type_flag = ff_vvc_cu_affine_type_flag(lc);
1683 }
1684 mi->motion_model_idc = pu->inter_affine_flag + cu_affine_type_flag;
1685 num_cp_mv = mi->motion_model_idc + 1;
1686
1687 if (sps->r->sps_smvd_enabled_flag && !ph->r->ph_mvd_l1_zero_flag &&
1688 mi->pred_flag == PF_BI && !pu->inter_affine_flag &&
1689 sh->ref_idx_sym[0] > -1 && sh->ref_idx_sym[1] > -1)
1691
1692 for (int i = L0; i <= L1; i++) {
1693 const PredFlag pred_flag = PF_L0 + !i;
1694 if (mi->pred_flag != pred_flag) {
1695 mi->ref_idx[i] = ref_idx_decode(lc, sh, pu->sym_mvd_flag, i);
1696 has_no_zero_mvd |= mvds_decode(lc, mvds, num_cp_mv, i);
1697 mvp_lx_flag[i] = ff_vvc_mvp_lx_flag(lc);
1698 }
1699 }
1700
1701 amvr_enabled = mi->motion_model_idc == MOTION_TRANSLATION ?
1702 sps->r->sps_amvr_enabled_flag : sps->r->sps_affine_amvr_enabled_flag;
1703 amvr_enabled &= has_no_zero_mvd;
1704
1705 amvr_shift = ff_vvc_amvr_shift(lc, pu->inter_affine_flag, cu->pred_mode, amvr_enabled);
1706
1707 mi->hpel_if_idx = amvr_shift == 3;
1708 mi->bcw_idx = bcw_idx_decode(lc, mi, cb_width, cb_height);
1709
1710 if (mi->motion_model_idc)
1711 ff_vvc_affine_mvp(lc, mvp_lx_flag, amvr_shift, mi);
1712 else
1713 ff_vvc_mvp(lc, mvp_lx_flag, amvr_shift, mi);
1714
1715 mvp_add_difference(mi, num_cp_mv, mvds, amvr_shift);
1716
1717 if (mi->motion_model_idc)
1718 ff_vvc_store_sb_mvs(lc, pu);
1719 else
1720 ff_vvc_store_mv(lc, &pu->mi);
1721
1722 return 0;
1723}
1724
1725// derive bdofFlag from 8.5.6 Decoding process for inter blocks
1726// derive dmvr from 8.5.1 General decoding process for coding units coded in inter prediction mode
1728{
1729 const VVCFrameContext *fc = lc->fc;
1730 const VVCPPS *pps = fc->ps.pps;
1731 const VVCPH *ph = &fc->ps.ph;
1732 const VVCSH *sh = &lc->sc->sh;
1733 const int poc = ph->poc;
1734 const MotionInfo *mi = &pu->mi;
1735 const int8_t *ref_idx = mi->ref_idx;
1736 const VVCRefPic *rp0 = &lc->sc->rpl[L0].refs[ref_idx[L0]];
1737 const VVCRefPic *rp1 = &lc->sc->rpl[L1].refs[ref_idx[L1]];
1738 const CodingUnit *cu = lc->cu;
1739 const PredWeightTable *w = pps->r->pps_wp_info_in_ph_flag ? &fc->ps.ph.pwt : &sh->pwt;
1740
1741 pu->bdof_flag = 0;
1742
1743 if (mi->pred_flag == PF_BI &&
1744 (poc - rp0->poc == rp1->poc - poc) &&
1745 !rp0->is_lt && !rp1->is_lt &&
1746 !cu->ciip_flag &&
1747 !mi->bcw_idx &&
1748 !w->weight_flag[L0][LUMA][ref_idx[L0]] && !w->weight_flag[L1][LUMA][ref_idx[L1]] &&
1749 !w->weight_flag[L0][CHROMA][ref_idx[L0]] && !w->weight_flag[L1][CHROMA][ref_idx[L1]] &&
1750 cu->cb_width >= 8 && cu->cb_height >= 8 &&
1751 (cu->cb_width * cu->cb_height >= 128) &&
1752 !rp0->is_scaled && !rp1->is_scaled) {
1753 if (!ph->r->ph_bdof_disabled_flag &&
1754 mi->motion_model_idc == MOTION_TRANSLATION &&
1755 !pu->merge_subblock_flag &&
1756 !pu->sym_mvd_flag)
1757 pu->bdof_flag = 1;
1758 if (!ph->r->ph_dmvr_disabled_flag &&
1759 pu->general_merge_flag &&
1760 !pu->mmvd_merge_flag)
1761 pu->dmvr_flag = 1;
1762 }
1763}
1764
1765// part of 8.5.1 General decoding process for coding units coded in inter prediction mode
1767{
1768 const CodingUnit *cu = lc->cu;
1769 PredictionUnit *pu = &lc->cu->pu;
1770
1771 derive_dmvr_bdof_flag(lc, pu);
1772 if (pu->dmvr_flag || pu->bdof_flag) {
1773 pu->mi.num_sb_x = (cu->cb_width > 16) ? (cu->cb_width >> 4) : 1;
1774 pu->mi.num_sb_y = (cu->cb_height > 16) ? (cu->cb_height >> 4) : 1;
1775 }
1776}
1777
1778static void fill_dmvr_info(const VVCLocalContext *lc)
1779{
1780 const VVCFrameContext *fc = lc->fc;
1781 const CodingUnit *cu = lc->cu;
1782
1783 if (cu->pred_mode == MODE_IBC || cu->pred_mode == MODE_PLT) {
1784 ff_vvc_set_intra_mvf(lc, true, cu->pred_mode == MODE_IBC ? PF_IBC : PF_PLT, false);
1785 } else {
1786 const VVCPPS *pps = fc->ps.pps;
1787 const int w = cu->cb_width >> MIN_PU_LOG2;
1788
1789 for (int y = cu->y0 >> MIN_PU_LOG2; y < (cu->y0 + cu->cb_height) >> MIN_PU_LOG2; y++) {
1790 const int idx = pps->min_pu_width * y + (cu->x0 >> MIN_PU_LOG2);
1791 const MvField *mvf = fc->tab.mvf + idx;
1792 MvField *dmvr_mvf = fc->ref->tab_dmvr_mvf + idx;
1793
1794 memcpy(dmvr_mvf, mvf, sizeof(MvField) * w);
1795 }
1796 }
1797}
1798
1800{
1801 const CodingUnit *cu = lc->cu;
1802 PredictionUnit *pu = &lc->cu->pu;
1803 const MotionInfo *mi = &pu->mi;
1804 int ret = 0;
1805
1806 pu->general_merge_flag = 1;
1807 if (!cu->skip_flag)
1809
1810 if (pu->general_merge_flag) {
1811 ret = hls_merge_data(lc);
1812 } else if (cu->pred_mode == MODE_IBC) {
1813 ret = mvp_data_ibc(lc);
1814 } else {
1815 ret = mvp_data(lc);
1816 }
1817
1818 if (ret)
1819 return ret;
1820
1821 if (cu->pred_mode == MODE_IBC) {
1823 } else if (!pu->merge_gpm_flag && !pu->inter_affine_flag && !pu->merge_subblock_flag) {
1826 }
1827
1828 if (!pu->dmvr_flag)
1829 fill_dmvr_info(lc);
1830 return ret;
1831}
1832
1833static TransformUnit* palette_add_tu(VVCLocalContext *lc, const int start, const int end, const VVCTreeType tree_type)
1834{
1835 CodingUnit *cu = lc->cu;
1836 const VVCSPS *sps = lc->fc->ps.sps;
1837 TransformUnit *tu = add_tu(lc->fc, cu, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
1838
1839 if (!tu)
1840 return NULL;
1841
1842 for (int c = start; c < end; c++) {
1843 const int w = tu->width >> sps->hshift[c];
1844 const int h = tu->height >> sps->vshift[c];
1845 TransformBlock *tb = add_tb(tu, lc, tu->x0, tu->y0, w, h, c);
1846 if (c != CR)
1847 set_tb_size(lc->fc, tb);
1848 }
1849
1850 for (int i = 0; i < FF_ARRAY_ELEMS(cu->plt); i++)
1851 cu->plt[i].size = 0;
1852
1853 return tu;
1854}
1855
1856static int palette_predicted(VVCLocalContext *lc, const bool local_dual_tree, int start, int end,
1857 bool *predictor_reused, const int predictor_size, const int max_entries)
1858{
1859 CodingUnit *cu = lc->cu;
1860 int nb_predicted = 0;
1861
1862 if (local_dual_tree) {
1863 start = LUMA;
1865 }
1866
1867 for (int i = 0; i < predictor_size && nb_predicted < max_entries; i++) {
1868 const int run = ff_vvc_palette_predictor_run(lc, predictor_size - i);
1869 if (run < 0)
1870 return run;
1871
1872 if (run == 1)
1873 break;
1874
1875 if (run > 1)
1876 i += run - 1;
1877
1878 predictor_reused[i] = true;
1879 for (int c = start; c < end; c++)
1880 cu->plt[c].entries[nb_predicted] = lc->ep->pp[c].entries[i];
1881 nb_predicted++;
1882 }
1883
1884 for (int c = start; c < end; c++)
1885 cu->plt[c].size = nb_predicted;
1886
1887 return 0;
1888}
1889
1890static int palette_signaled(VVCLocalContext *lc, const bool local_dual_tree,
1891 const int start, const int end, const int max_entries)
1892{
1893 const VVCSPS *sps = lc->fc->ps.sps;
1894 CodingUnit *cu = lc->cu;
1895 const int nb_predicted = cu->plt[start].size;
1896 const int nb_signaled = nb_predicted < max_entries ? ff_vvc_num_signalled_palette_entries(lc, max_entries - nb_predicted) : 0;
1897 const int size = nb_predicted + nb_signaled;
1898 const bool dual_tree_luma = local_dual_tree && cu->tree_type == DUAL_TREE_LUMA;
1899
1900 if (nb_signaled < 0)
1901 return AVERROR_INVALIDDATA;
1902
1903 for (int c = start; c < end; c++) {
1904 Palette *plt = cu->plt + c;
1905 for (int i = nb_predicted; i < size; i++) {
1906 plt->entries[i] = ff_vvc_new_palette_entries(lc, sps->bit_depth);
1907 if (dual_tree_luma) {
1908 plt[CB].entries[i] = 1 << (sps->bit_depth - 1);
1909 plt[CR].entries[i] = 1 << (sps->bit_depth - 1);
1910 }
1911 }
1912 plt->size = size;
1913 }
1914
1915 return 0;
1916}
1917
1918static void palette_update_predictor(VVCLocalContext *lc, const bool local_dual_tree, int start, int end,
1919 bool *predictor_reused, const int predictor_size)
1920{
1921 CodingUnit *cu = lc->cu;
1922 const int max_predictor = VVC_MAX_NUM_PALETTE_PREDICTOR_SIZE >> (cu->tree_type != SINGLE_TREE && !local_dual_tree);
1923
1924 if (local_dual_tree) {
1925 start = LUMA;
1927 }
1928
1929 for (int c = start; c < end; c++) {
1930 Palette *pp = lc->ep->pp + c;
1931 Palette *plt = cu->plt + c;
1932 int i = cu->plt[start].size;;
1933
1934 // copy unused predictors to the end of plt
1935 for (int j = 0; j < predictor_size && i < max_predictor; j++) {
1936 if (!predictor_reused[j]) {
1937 plt->entries[i] = pp->entries[j];
1938 i++;
1939 }
1940 }
1941
1942 memcpy(pp->entries, plt->entries, i * sizeof(pp->entries[0]));
1943 pp->size = i;
1944 }
1945}
1946
1947static int palette_qp(VVCLocalContext *lc, VVCTreeType tree_type, const bool escape_present)
1948{
1949 const VVCFrameContext *fc = lc->fc;
1950 const VVCPPS *pps = fc->ps.pps;
1951 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1952 const CodingUnit *cu = lc->cu;
1953 int ret;
1954
1955 if (tree_type != DUAL_TREE_CHROMA) {
1956 const bool has_qp_delta = escape_present &&
1957 pps->r->pps_cu_qp_delta_enabled_flag && !lc->parse.is_cu_qp_delta_coded;
1958 ret = set_qp_y(lc, cu->x0, cu->y0, has_qp_delta);
1959 if (ret < 0)
1960 return ret;
1961 }
1962
1963 if (tree_type != DUAL_TREE_LUMA) {
1965 chroma_qp_offset_decode(lc, 0, 1);
1966 set_qp_c(lc);
1967 }
1968
1969 return 0;
1970}
1971
1972#define PALETTE_SET_PIXEL(xc, yc, pix) \
1973 do { \
1974 const int off = ((xc) >> hs) + ((yc) >> vs) * tb->tb_width; \
1975 if (sps->bit_depth == 8) \
1976 u8[off] = pix; \
1977 else \
1978 u16[off] = pix; \
1979 } while (0)
1980
1981#define PALETTE_INDEX(x, y) index[(y) * width + (x)]
1982
1983// 6.5.3 Horizontal and vertical traverse scan order array initialization process
1984// The hTravScan and vTravScan tables require approximately 576 KB of memory.
1985// To save space, we use a macro to achieve the same functionality.
1986#define TRAV_COL(p, wlog, mask) ((p & mask) ^ (-((p >> wlog) & 1) & mask))
1987#define TRAV_ROW(p, hlog) (p >> hlog)
1988#define TRAV(trans, p, wlog, hlog, mask) (trans ? TRAV_ROW((p), hlog) : TRAV_COL((p), wlog, mask))
1989#define TRAV_X(pos) TRAV(transpose, pos, wlog2, hlog2, wmask)
1990#define TRAV_Y(pos) TRAV(!transpose, pos, hlog2, wlog2, hmask)
1991
1993 const int max_index, const int subset_id, const bool transpose,
1994 uint8_t *run_type, uint8_t *index, int *prev_run_pos, bool *adjust)
1995{
1996 const CodingUnit *cu = lc->cu;
1997 TransformUnit *tu = cu->tus.head;
1998 const VVCSPS *sps = lc->fc->ps.sps;
1999 const int width = tu->tbs[0].tb_width;
2000 const int height = tu->tbs[0].tb_height;
2001 const int min_pos = subset_id << 4;
2002 const int max_pos = FFMIN(min_pos + 16, width * height);
2003 const int wmask = width - 1;
2004 const int hmask = height - 1;
2005 const int wlog2 = av_log2(width);
2006 const int hlog2 = av_log2(height);
2007 const int start_idx = tu->tbs[0].c_idx;
2008 const uint8_t esc = cu->plt[tu->tbs[0].c_idx].size;
2009 uint8_t run_copy[16] = { 0 };
2010
2011 for (int i = min_pos; i < max_pos; i++) {
2012 const int xc = TRAV_X(i);
2013 const int yc = TRAV_Y(i);
2014
2015 if (i > 0 && max_index > 0)
2016 run_copy[i - min_pos] = ff_vvc_run_copy_flag(lc, run_type[i - 1], *prev_run_pos, i);
2017
2018 run_type[i] = 0;
2019 if (max_index > 0 && !run_copy[i - min_pos]) {
2020 if (((!transpose && yc > 0) || (transpose && xc > 0))
2021 && i > 0 && !run_type[i - 1]) {
2023 }
2024 *prev_run_pos = i;
2025 } else if (i > 0) {
2026 run_type[i] = run_type[i - 1];
2027 }
2028 }
2029
2030 for (int i = min_pos; i < max_pos; i++) {
2031 const int xc = TRAV_X(i);
2032 const int yc = TRAV_Y(i);
2033 const int prev_xc = i > 0 ? TRAV_X(i - 1) : 0;
2034 const int prev_yc = i > 0 ? TRAV_Y(i - 1) : 0;
2035
2036 int idx = 0;
2037 if (max_index > 0 && !run_copy[i - min_pos] && !run_type[i]) {
2038 if (max_index - *adjust > 0)
2039 idx = ff_vvc_palette_idx_idc(lc, max_index, *adjust);
2040 if (i > 0) {
2041 const int ref_idx = !run_type[i - 1] ?
2042 PALETTE_INDEX(prev_xc, prev_yc) : PALETTE_INDEX(xc - transpose, yc - !transpose);
2043 idx += (idx >= ref_idx);
2044 }
2045 *adjust = true;
2046 } else {
2047 idx = PALETTE_INDEX(prev_xc, prev_yc);
2048 }
2049
2050 if (!run_type[i])
2051 PALETTE_INDEX(xc, yc) = idx;
2052 else
2053 PALETTE_INDEX(xc, yc) = PALETTE_INDEX(xc - transpose, yc - !transpose);
2054 }
2055
2056 for (int c = 0; c < tu->nb_tbs; c++) {
2057 TransformBlock *tb = &tu->tbs[c];
2058 const int c_idx = tb->c_idx;
2059 const Palette *plt = &cu->plt[c_idx];
2060 const int scale = ff_vvc_palette_derive_scale(lc, tu, tb);
2061 const int hs = sps->hshift[c_idx] - sps->hshift[start_idx];
2062 const int vs = sps->vshift[c_idx] - sps->vshift[start_idx];
2063 uint8_t *u8 = (uint8_t *)tb->coeffs;
2064 uint16_t *u16 = (uint16_t *)tb->coeffs;
2065
2066 for (int i = min_pos; i < max_pos; i++) {
2067 const int xc = TRAV_X(i);
2068 const int yc = TRAV_Y(i);
2069 if (!(xc & hs) && !(yc & vs)) {
2070 const int v = PALETTE_INDEX(xc, yc);
2071 if (v == esc) {
2072 const int coeff = ff_vvc_palette_escape_val(lc, (1 << sps->bit_depth) - 1);
2073 if (coeff < 0)
2074 return AVERROR_INVALIDDATA;
2075 const int pixel = av_clip_intp2(RSHIFT(coeff * scale, 6), sps->bit_depth);
2076 PALETTE_SET_PIXEL(xc, yc, pixel);
2077 } else {
2078 PALETTE_SET_PIXEL(xc, yc, plt->entries[v]);
2079 }
2080 }
2081 }
2082 }
2083
2084 return 0;
2085}
2086
2087static int hls_palette_coding(VVCLocalContext *lc, const VVCTreeType tree_type)
2088{
2089 const VVCFrameContext *fc = lc->fc;
2090 const VVCSPS *sps = fc->ps.sps;
2091 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2092 CodingUnit *cu = lc->cu;
2093 Palette *pp = lc->ep->pp;
2094 const int max_entries = tree_type == SINGLE_TREE ? 31 : 15;
2095 const bool local_dual_tree = tree_type != SINGLE_TREE &&
2096 (!IS_I(rsh) || (IS_I(rsh) && !sps->r->sps_qtbtt_dual_tree_intra_flag));
2097 bool escape_present = false;
2098 bool transpose = false;
2099 bool adjust = false;
2100 int max_index = 0;
2101 int prev_run_pos = 0;
2102
2103 int predictor_size, start, end, ret;
2105 uint8_t run_type[MAX_PALETTE_CU_SIZE * MAX_PALETTE_CU_SIZE];
2107
2108 TransformUnit *tu;
2109
2110 ff_vvc_channel_range(&start, &end, tree_type, sps->r->sps_chroma_format_idc);
2111
2112 tu = palette_add_tu(lc, start, end, tree_type);
2113 if (!tu)
2114 return AVERROR(ENOMEM);
2115
2116 predictor_size = pp[start].size;
2117 memset(reused, 0, sizeof(reused[0]) * predictor_size);
2118
2119 ret = palette_predicted(lc, local_dual_tree, start, end, reused, predictor_size, max_entries);
2120 if (ret < 0)
2121 return ret;
2122
2123 ret = palette_signaled(lc, local_dual_tree, start, end, max_entries);
2124 if (ret < 0)
2125 return ret;
2126
2127 palette_update_predictor(lc, local_dual_tree, start, end, reused, predictor_size);
2128
2129 if (cu->plt[start].size > 0)
2130 escape_present = ff_vvc_palette_escape_val_present_flag(lc);
2131
2132 max_index = cu->plt[start].size - 1 + escape_present;
2133 if (max_index > 0) {
2134 adjust = false;
2136 }
2137
2138 ret = palette_qp(lc, tree_type, escape_present);
2139 if (ret < 0)
2140 return ret;
2141
2142 index[0] = 0;
2143 for (int i = 0; i <= (tu->tbs[0].tb_width * tu->tbs[0].tb_height - 1) >> 4; i++) {
2144 ret = palette_subblock_data(lc, max_index, i, transpose,
2145 run_type, index, &prev_run_pos, &adjust);
2146 if (ret < 0)
2147 return ret;
2148 }
2149
2150 return 0;
2151}
2152
2154{
2155 const VVCSPS *sps = lc->fc->ps.sps;
2156 const CodingUnit *cu = lc->cu;
2157 const VVCTreeType tree_type = cu->tree_type;
2158 const bool pred_mode_plt_flag = cu->pred_mode == MODE_PLT;
2159 int ret = 0;
2160
2161 if (tree_type == SINGLE_TREE || tree_type == DUAL_TREE_LUMA) {
2162 if (pred_mode_plt_flag) {
2163 if ((ret = hls_palette_coding(lc, tree_type)) < 0)
2164 return ret;
2165 ff_vvc_set_intra_mvf(lc, false, PF_PLT, false);
2166 } else {
2168 ff_vvc_set_intra_mvf(lc, false, PF_INTRA, cu->ciip_flag);
2169 }
2170 }
2171 if ((tree_type == SINGLE_TREE || tree_type == DUAL_TREE_CHROMA) && sps->r->sps_chroma_format_idc) {
2172 if (pred_mode_plt_flag && tree_type == DUAL_TREE_CHROMA) {
2173 if ((ret = hls_palette_coding(lc, tree_type)) < 0)
2174 return ret;
2175 } else if (!pred_mode_plt_flag) {
2177 }
2178 }
2179
2180 return ret;
2181}
2182
2183static int hls_coding_unit(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height,
2184 int cqt_depth, const VVCTreeType tree_type, VVCModeType mode_type)
2185{
2186 const VVCFrameContext *fc = lc->fc;
2187 const VVCSPS *sps = fc->ps.sps;
2188 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2189 const int is_128 = cb_width > 64 || cb_height > 64;
2190 int ret = 0;
2191
2192 CodingUnit *cu = add_cu(lc, x0, y0, cb_width, cb_height, cqt_depth, tree_type);
2193
2194 if (!cu)
2195 return AVERROR(ENOMEM);
2196
2197 ff_vvc_set_neighbour_available(lc, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
2198
2199 if (IS_I(rsh) && is_128)
2200 mode_type = MODE_TYPE_INTRA;
2201 cu->pred_mode = pred_mode_decode(lc, tree_type, mode_type);
2202
2203 if (cu->pred_mode == MODE_INTRA && sps->r->sps_act_enabled_flag && tree_type == SINGLE_TREE)
2205
2206 if (cu->pred_mode == MODE_INTRA || cu->pred_mode == MODE_PLT)
2207 ret = intra_data(lc);
2208 else if (tree_type != DUAL_TREE_CHROMA) /* MODE_INTER or MODE_IBC */
2209 ret = inter_data(lc);
2210
2211 if (ret < 0)
2212 return ret;
2213
2214 if (cu->pred_mode != MODE_INTRA && cu->pred_mode != MODE_PLT && !lc->cu->pu.general_merge_flag)
2216 else
2217 cu->coded_flag = !(cu->skip_flag || cu->pred_mode == MODE_PLT);
2218
2219 if (cu->coded_flag) {
2220 sbt_info(lc, sps);
2221 if (sps->r->sps_act_enabled_flag && cu->pred_mode != MODE_INTRA && tree_type == SINGLE_TREE)
2223 lc->parse.lfnst_dc_only = 1;
2225 lc->parse.mts_dc_only = 1;
2227 ret = hls_transform_tree(lc, x0, y0, cb_width, cb_height, cu->ch_type);
2228 if (ret < 0)
2229 return ret;
2230 cu->lfnst_idx = lfnst_idx_decode(lc);
2231 cu->mts_idx = mts_idx_decode(lc);
2232 set_qp_c(lc);
2233 } else if (cu->pred_mode != MODE_PLT) {
2235 if (ret < 0)
2236 return ret;
2237 }
2238 set_cu_tabs(lc, cu);
2239
2240 return 0;
2241}
2242
2244 const VVCSplitMode split, const int cb_width, const int cb_height, const VVCModeType mode_type_curr)
2245{
2246 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2247 const VVCSPS *sps = lc->fc->ps.sps;
2248 const int area = cb_width * cb_height;
2249
2250 if ((IS_I(rsh) && sps->r->sps_qtbtt_dual_tree_intra_flag) ||
2251 mode_type_curr != MODE_TYPE_ALL || !sps->r->sps_chroma_format_idc ||
2252 sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444)
2253 return 0;
2254 if ((area == 64 && (split == SPLIT_QT || split == SPLIT_TT_HOR || split == SPLIT_TT_VER)) ||
2255 (area == 32 && (split == SPLIT_BT_HOR || split == SPLIT_BT_VER)))
2256 return 1;
2257 if ((area == 64 && (split == SPLIT_BT_HOR || split == SPLIT_BT_VER) && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_420) ||
2258 (area == 128 && (split == SPLIT_TT_HOR || split == SPLIT_TT_VER) && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_420) ||
2259 (cb_width == 8 && split == SPLIT_BT_VER) || (cb_width == 16 && split == SPLIT_TT_VER))
2260 return 1 + !IS_I(rsh);
2261
2262 return 0;
2263}
2264
2265static VVCModeType mode_type_decode(VVCLocalContext *lc, const int x0, const int y0,
2266 const int cb_width, const int cb_height, const VVCSplitMode split, const int ch_type,
2267 const VVCModeType mode_type_curr)
2268{
2269 VVCModeType mode_type;
2270 const int mode_type_condition = derive_mode_type_condition(lc, split, cb_width, cb_height, mode_type_curr);
2271
2272 if (mode_type_condition == 1)
2273 mode_type = MODE_TYPE_INTRA;
2274 else if (mode_type_condition == 2) {
2275 mode_type = ff_vvc_non_inter_flag(lc, x0, y0, ch_type) ? MODE_TYPE_INTRA : MODE_TYPE_INTER;
2276 } else {
2277 mode_type = mode_type_curr;
2278 }
2279
2280 return mode_type;
2281}
2282
2283static int hls_coding_tree(VVCLocalContext *lc,
2284 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2285 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, int part_idx,
2286 VVCSplitMode last_split_mode, VVCTreeType tree_type_curr, VVCModeType mode_type_curr);
2287
2289 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2290 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2291 VVCTreeType tree_type, VVCModeType mode_type)
2292{
2293#define CODING_TREE(x, idx) do { \
2294 ret = hls_coding_tree(lc, x, y0, cb_width / 2, cb_height, \
2295 qg_on_y, qg_on_c, cb_sub_div + 1, cqt_depth, mtt_depth + 1, \
2296 depth_offset, idx, SPLIT_BT_VER, tree_type, mode_type); \
2297 if (ret < 0) \
2298 return ret; \
2299} while (0);
2300
2301 const VVCPPS *pps = lc->fc->ps.pps;
2302 const int x1 = x0 + cb_width / 2;
2303 int ret = 0;
2304
2305 depth_offset += (x0 + cb_width > pps->width) ? 1 : 0;
2306 CODING_TREE(x0, 0);
2307 if (x1 < pps->width)
2308 CODING_TREE(x1, 1);
2309
2310 return 0;
2311
2312#undef CODING_TREE
2313}
2314
2316 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2317 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2318 VVCTreeType tree_type, VVCModeType mode_type)
2319{
2320#define CODING_TREE(y, idx) do { \
2321 ret = hls_coding_tree(lc, x0, y, cb_width , cb_height / 2, \
2322 qg_on_y, qg_on_c, cb_sub_div + 1, cqt_depth, mtt_depth + 1, \
2323 depth_offset, idx, SPLIT_BT_HOR, tree_type, mode_type); \
2324 if (ret < 0) \
2325 return ret; \
2326 } while (0);
2327
2328 const VVCPPS *pps = lc->fc->ps.pps;
2329 const int y1 = y0 + (cb_height / 2);
2330 int ret = 0;
2331
2332 depth_offset += (y0 + cb_height > pps->height) ? 1 : 0;
2333 CODING_TREE(y0, 0);
2334 if (y1 < pps->height)
2335 CODING_TREE(y1, 1);
2336
2337 return 0;
2338
2339#undef CODING_TREE
2340}
2341
2343 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2344 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2345 VVCTreeType tree_type, VVCModeType mode_type)
2346{
2347#define CODING_TREE(x, w, sub_div, idx) do { \
2348 ret = hls_coding_tree(lc, x, y0, w, cb_height, \
2349 qg_on_y, qg_on_c, sub_div, cqt_depth, mtt_depth + 1, \
2350 depth_offset, idx, SPLIT_TT_VER, tree_type, mode_type); \
2351 if (ret < 0) \
2352 return ret; \
2353 } while (0);
2354
2355 const VVCSH *sh = &lc->sc->sh;
2356 const int x1 = x0 + cb_width / 4;
2357 const int x2 = x0 + cb_width * 3 / 4;
2358 int ret;
2359
2360 qg_on_y = qg_on_y && (cb_sub_div + 2 <= sh->cu_qp_delta_subdiv);
2361 qg_on_c = qg_on_c && (cb_sub_div + 2 <= sh->cu_chroma_qp_offset_subdiv);
2362
2363 CODING_TREE(x0, cb_width / 4, cb_sub_div + 2, 0);
2364 CODING_TREE(x1, cb_width / 2, cb_sub_div + 1, 1);
2365 CODING_TREE(x2, cb_width / 4, cb_sub_div + 2, 2);
2366
2367 return 0;
2368
2369#undef CODING_TREE
2370}
2371
2373 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2374 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2375 VVCTreeType tree_type, VVCModeType mode_type)
2376{
2377#define CODING_TREE(y, h, sub_div, idx) do { \
2378 ret = hls_coding_tree(lc, x0, y, cb_width, h, \
2379 qg_on_y, qg_on_c, sub_div, cqt_depth, mtt_depth + 1, \
2380 depth_offset, idx, SPLIT_TT_HOR, tree_type, mode_type); \
2381 if (ret < 0) \
2382 return ret; \
2383 } while (0);
2384
2385 const VVCSH *sh = &lc->sc->sh;
2386 const int y1 = y0 + (cb_height / 4);
2387 const int y2 = y0 + (3 * cb_height / 4);
2388 int ret;
2389
2390 qg_on_y = qg_on_y && (cb_sub_div + 2 <= sh->cu_qp_delta_subdiv);
2391 qg_on_c = qg_on_c && (cb_sub_div + 2 <= sh->cu_chroma_qp_offset_subdiv);
2392
2393 CODING_TREE(y0, cb_height / 4, cb_sub_div + 2, 0);
2394 CODING_TREE(y1, cb_height / 2, cb_sub_div + 1, 1);
2395 CODING_TREE(y2, cb_height / 4, cb_sub_div + 2, 2);
2396
2397 return 0;
2398
2399#undef CODING_TREE
2400}
2401
2403 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2404 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2405 VVCTreeType tree_type, VVCModeType mode_type)
2406{
2407#define CODING_TREE(x, y, idx) do { \
2408 ret = hls_coding_tree(lc, x, y, cb_width / 2, cb_height / 2, \
2409 qg_on_y, qg_on_c, cb_sub_div + 2, cqt_depth + 1, 0, 0, \
2410 idx, SPLIT_QT, tree_type, mode_type); \
2411 if (ret < 0) \
2412 return ret; \
2413 } while (0);
2414
2415 const VVCPPS *pps = lc->fc->ps.pps;
2416 const int x1 = x0 + cb_width / 2;
2417 const int y1 = y0 + cb_height / 2;
2418 int ret = 0;
2419
2420 CODING_TREE(x0, y0, 0);
2421 if (x1 < pps->width)
2422 CODING_TREE(x1, y0, 1);
2423 if (y1 < pps->height)
2424 CODING_TREE(x0, y1, 2);
2425 if (x1 < pps->width &&
2426 y1 < pps->height)
2427 CODING_TREE(x1, y1, 3);
2428
2429 return 0;
2430
2431#undef CODING_TREE
2432}
2433
2435 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2436 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2437 VVCTreeType tree_type, VVCModeType mode_type);
2438
2446
2448 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2449 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, int part_idx,
2450 VVCSplitMode last_split_mode, VVCTreeType tree_type_curr, VVCModeType mode_type_curr)
2451{
2452 VVCFrameContext *fc = lc->fc;
2453 const VVCPPS *pps = fc->ps.pps;
2454 const VVCSH *sh = &lc->sc->sh;
2455 const H266RawSliceHeader *rsh = sh->r;
2456 const int ch_type = tree_type_curr == DUAL_TREE_CHROMA;
2457 int ret;
2458 VVCAllowedSplit allowed;
2459
2460 if (pps->r->pps_cu_qp_delta_enabled_flag && qg_on_y && cb_sub_div <= sh->cu_qp_delta_subdiv) {
2462 lc->parse.cu_qg_top_left_x = x0;
2463 lc->parse.cu_qg_top_left_y = y0;
2464 }
2465 if (rsh->sh_cu_chroma_qp_offset_enabled_flag && qg_on_c &&
2466 cb_sub_div <= sh->cu_chroma_qp_offset_subdiv) {
2468 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
2469 }
2470
2471 can_split(lc, x0, y0, cb_width, cb_height, mtt_depth, depth_offset, part_idx,
2472 last_split_mode, tree_type_curr, mode_type_curr, &allowed);
2473 if (ff_vvc_split_cu_flag(lc, x0, y0, cb_width, cb_height, ch_type, &allowed)) {
2474 VVCSplitMode split = ff_vvc_split_mode(lc, x0, y0, cb_width, cb_height, cqt_depth, mtt_depth, ch_type, &allowed);
2475 VVCModeType mode_type = mode_type_decode(lc, x0, y0, cb_width, cb_height, split, ch_type, mode_type_curr);
2476
2477 VVCTreeType tree_type = (mode_type == MODE_TYPE_INTRA) ? DUAL_TREE_LUMA : tree_type_curr;
2478
2479 if (split != SPLIT_QT) {
2480 if (!(x0 & 31) && !(y0 & 31) && mtt_depth <= 1)
2481 TAB_MSM(fc, mtt_depth, x0, y0) = split;
2482 }
2483 ret = coding_tree[split - 1](lc, x0, y0, cb_width, cb_height, qg_on_y, qg_on_c,
2484 cb_sub_div, cqt_depth, mtt_depth, depth_offset, tree_type, mode_type);
2485 if (ret < 0)
2486 return ret;
2487 if (mode_type_curr == MODE_TYPE_ALL && mode_type == MODE_TYPE_INTRA) {
2488 ret = hls_coding_tree(lc, x0, y0, cb_width, cb_height, 0, qg_on_c, cb_sub_div,
2489 cqt_depth, mtt_depth, 0, 0, split, DUAL_TREE_CHROMA, mode_type);
2490 if (ret < 0)
2491 return ret;
2492 }
2493 } else {
2494 ret = hls_coding_unit(lc, x0, y0, cb_width, cb_height, cqt_depth, tree_type_curr, mode_type_curr);
2495 if (ret < 0)
2496 return ret;
2497 }
2498
2499 return 0;
2500}
2501
2503 const int x0, const int y0, const int cb_size, const int cqt_depth)
2504{
2505 const VVCSH *sh = &lc->sc->sh;
2506 const H266RawSliceHeader *rsh = sh->r;
2507 const VVCPPS *pps = lc->fc->ps.pps;
2508 const int cb_subdiv = 2 * cqt_depth;
2509 int ret;
2510
2511 if (cb_size > 64) {
2512 #define DUAL_TREE(x, y) do { \
2513 ret = dual_tree_implicit_qt_split(lc, x, y, cb_size / 2, cqt_depth + 1); \
2514 if (ret < 0) \
2515 return ret; \
2516 } while (0)
2517
2518 const int x1 = x0 + (cb_size / 2);
2519 const int y1 = y0 + (cb_size / 2);
2520 if (pps->r->pps_cu_qp_delta_enabled_flag && cb_subdiv <= sh->cu_qp_delta_subdiv) {
2522 lc->parse.cu_qg_top_left_x = x0;
2523 lc->parse.cu_qg_top_left_y = y0;
2524 }
2525 if (rsh->sh_cu_chroma_qp_offset_enabled_flag && cb_subdiv <= sh->cu_chroma_qp_offset_subdiv) {
2527 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
2528 }
2529 DUAL_TREE(x0, y0);
2530 if (x1 < pps->width)
2531 DUAL_TREE(x1, y0);
2532 if (y1 < pps->height)
2533 DUAL_TREE(x0, y1);
2534 if (x1 < pps->width && y1 < pps->height)
2535 DUAL_TREE(x1, y1);
2536 #undef DUAL_TREE
2537 } else {
2538 #define CODING_TREE(tree_type) do { \
2539 const int qg_on_y = tree_type == DUAL_TREE_LUMA; \
2540 ret = hls_coding_tree(lc, x0, y0, cb_size, cb_size, qg_on_y, !qg_on_y, \
2541 cb_subdiv, cqt_depth, 0, 0, 0, SPLIT_NONE, tree_type, MODE_TYPE_ALL); \
2542 if (ret < 0) \
2543 return ret; \
2544 } while (0)
2547 #undef CODING_TREE
2548 }
2549 return 0;
2550}
2551
2552#define SET_SAO(elem, value) \
2553do { \
2554 if (!sao_merge_up_flag && !sao_merge_left_flag) \
2555 sao->elem = value; \
2556 else if (sao_merge_left_flag) \
2557 sao->elem = CTB(fc->tab.sao, rx-1, ry).elem; \
2558 else if (sao_merge_up_flag) \
2559 sao->elem = CTB(fc->tab.sao, rx, ry-1).elem; \
2560 else \
2561 sao->elem = 0; \
2562} while (0)
2563
2564static void hls_sao(VVCLocalContext *lc, const int rx, const int ry)
2565{
2566 VVCFrameContext *fc = lc->fc;
2567 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2568 int sao_merge_left_flag = 0;
2569 int sao_merge_up_flag = 0;
2570 SAOParams *sao = &CTB(fc->tab.sao, rx, ry);
2571 int c_idx, i;
2572
2574 if (rx > 0) {
2575 if (lc->ctb_left_flag)
2576 sao_merge_left_flag = ff_vvc_sao_merge_flag_decode(lc);
2577 }
2578 if (ry > 0 && !sao_merge_left_flag) {
2579 if (lc->ctb_up_flag)
2580 sao_merge_up_flag = ff_vvc_sao_merge_flag_decode(lc);
2581 }
2582 }
2583
2584 for (c_idx = 0; c_idx < (fc->ps.sps->r->sps_chroma_format_idc ? 3 : 1); c_idx++) {
2585 const int sao_used_flag = !c_idx ? rsh->sh_sao_luma_used_flag : rsh->sh_sao_chroma_used_flag;
2586 if (!sao_used_flag) {
2587 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
2588 continue;
2589 }
2590
2591 if (c_idx == 2) {
2592 sao->type_idx[2] = sao->type_idx[1];
2593 sao->eo_class[2] = sao->eo_class[1];
2594 } else {
2595 SET_SAO(type_idx[c_idx], ff_vvc_sao_type_idx_decode(lc));
2596 }
2597
2598 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
2599 continue;
2600
2601 for (i = 0; i < 4; i++)
2602 SET_SAO(offset_abs[c_idx][i], ff_vvc_sao_offset_abs_decode(lc));
2603
2604 if (sao->type_idx[c_idx] == SAO_BAND) {
2605 for (i = 0; i < 4; i++) {
2606 if (sao->offset_abs[c_idx][i]) {
2607 SET_SAO(offset_sign[c_idx][i],
2609 } else {
2610 sao->offset_sign[c_idx][i] = 0;
2611 }
2612 }
2613 SET_SAO(band_position[c_idx], ff_vvc_sao_band_position_decode(lc));
2614 } else if (c_idx != 2) {
2615 SET_SAO(eo_class[c_idx], ff_vvc_sao_eo_class_decode(lc));
2616 }
2617
2618 // Inferred parameters
2619 sao->offset_val[c_idx][0] = 0;
2620 for (i = 0; i < 4; i++) {
2621 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
2622 if (sao->type_idx[c_idx] == SAO_EDGE) {
2623 if (i > 1)
2624 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
2625 } else if (sao->offset_sign[c_idx][i]) {
2626 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
2627 }
2628 sao->offset_val[c_idx][i + 1] *= 1 << (fc->ps.sps->bit_depth - FFMIN(10, fc->ps.sps->bit_depth));
2629 }
2630 }
2631}
2632
2633static void alf_params(VVCLocalContext *lc, const int rx, const int ry)
2634{
2635 const VVCFrameContext *fc = lc->fc;
2636 const H266RawSliceHeader *sh = lc->sc->sh.r;
2637 ALFParams *alf = &CTB(fc->tab.alf, rx, ry);
2638
2639 alf->ctb_flag[LUMA] = alf->ctb_flag[CB] = alf->ctb_flag[CR] = 0;
2640 alf->ctb_cc_idc[0] = alf->ctb_cc_idc[1] = 0;
2641 if (sh->sh_alf_enabled_flag) {
2642 alf->ctb_flag[LUMA] = ff_vvc_alf_ctb_flag(lc, rx, ry, LUMA);
2643 if (alf->ctb_flag[LUMA]) {
2644 uint8_t alf_use_aps_flag = 0;
2645 if (sh->sh_num_alf_aps_ids_luma > 0)
2646 alf_use_aps_flag = ff_vvc_alf_use_aps_flag(lc);
2647 if (alf_use_aps_flag) {
2648 alf->ctb_filt_set_idx_y = 16;
2649 if (sh->sh_num_alf_aps_ids_luma > 1)
2651 } else {
2653 }
2654 }
2655 for (int c_idx = CB; c_idx <= CR; c_idx++) {
2656 const uint8_t alf_enabled_flag =
2658 if (alf_enabled_flag) {
2659 const VVCALF *aps = fc->ps.alf_list[sh->sh_alf_aps_id_chroma];
2660 alf->ctb_flag[c_idx] = ff_vvc_alf_ctb_flag(lc, rx, ry, c_idx);
2661 alf->alf_ctb_filter_alt_idx[c_idx - 1] = 0;
2662 if (alf->ctb_flag[c_idx] && aps->num_chroma_filters > 1)
2663 alf->alf_ctb_filter_alt_idx[c_idx - 1] = ff_vvc_alf_ctb_filter_alt_idx(lc, c_idx, aps->num_chroma_filters);
2664 }
2665 }
2666 }
2667 if (fc->ps.sps->r->sps_ccalf_enabled_flag) {
2668 const uint8_t cc_enabled[] = { sh->sh_alf_cc_cb_enabled_flag, sh->sh_alf_cc_cr_enabled_flag };
2669 const uint8_t cc_aps_id[] = { sh->sh_alf_cc_cb_aps_id, sh->sh_alf_cc_cr_aps_id };
2670 for (int i = 0; i < 2; i++) {
2671 if (cc_enabled[i]) {
2672 const VVCALF *aps = fc->ps.alf_list[cc_aps_id[i]];
2673 alf->ctb_cc_idc[i] = ff_vvc_alf_ctb_cc_idc(lc, rx, ry, i, aps->num_cc_filters[i]);
2674 }
2675 }
2676 }
2677}
2678
2679static void deblock_params(VVCLocalContext *lc, const int rx, const int ry)
2680{
2681 VVCFrameContext *fc = lc->fc;
2682 const VVCSH *sh = &lc->sc->sh;
2683 CTB(fc->tab.deblock, rx, ry) = sh->deblock;
2684}
2685
2687 const int x0, const int y0, const int ctu_idx, const int rx, const int ry)
2688{
2689 const VVCFrameContext *fc = lc->fc;
2690 const VVCSPS *sps = fc->ps.sps;
2691 const VVCPPS *pps = fc->ps.pps;
2692 const VVCSH *sh = &lc->sc->sh;
2693 const H266RawSliceHeader *rsh = sh->r;
2694 const unsigned int ctb_size = sps->ctb_size_y;
2695 int ret = 0;
2696
2697 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
2698
2699 hls_sao(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
2700 alf_params(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
2701 deblock_params(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
2702
2703 if (IS_I(rsh) && sps->r->sps_qtbtt_dual_tree_intra_flag)
2704 ret = dual_tree_implicit_qt_split(lc, x0, y0, ctb_size, 0);
2705 else
2706 ret = hls_coding_tree(lc, x0, y0, ctb_size, ctb_size,
2707 1, 1, 0, 0, 0, 0, 0, SPLIT_NONE, SINGLE_TREE, MODE_TYPE_ALL);
2708 if (ret < 0)
2709 return ret;
2710
2711 if (rx == pps->ctb_to_col_bd[rx + 1] - 1) {
2712 if (ctu_idx == sh->num_ctus_in_curr_slice - 1) {
2713 const int end_of_slice_one_bit = ff_vvc_end_of_slice_flag_decode(lc);
2714 if (!end_of_slice_one_bit)
2715 return AVERROR_INVALIDDATA;
2716 } else {
2717 if (ry == pps->ctb_to_row_bd[ry + 1] - 1) {
2718 const int end_of_tile_one_bit = ff_vvc_end_of_tile_one_bit(lc);
2719 if (!end_of_tile_one_bit)
2720 return AVERROR_INVALIDDATA;
2721 } else {
2722 if (fc->ps.sps->r->sps_entropy_coding_sync_enabled_flag) {
2723 const int end_of_subset_one_bit = ff_vvc_end_of_subset_one_bit(lc);
2724 if (!end_of_subset_one_bit)
2725 return AVERROR_INVALIDDATA;
2726 }
2727 }
2728 }
2729 }
2730
2731 return 0;
2732}
2733
2734static int has_inter_luma(const CodingUnit *cu)
2735{
2736 return cu->pred_mode != MODE_INTRA && cu->pred_mode != MODE_PLT && cu->tree_type != DUAL_TREE_CHROMA;
2737}
2738
2739static int pred_get_y(const VVCLocalContext *lc, const int y0, const Mv *mv, const int height)
2740{
2741 const VVCPPS *pps = lc->fc->ps.pps;
2742 const int idx = lc->sc->sh.r->curr_subpic_idx;
2743 const int top = pps->subpic_y[idx];
2744 const int bottom = top + pps->subpic_height[idx];
2745
2746 return av_clip(y0 + (mv->y >> 4) + height, top, bottom);
2747}
2748
2749static void cu_get_max_y(const CodingUnit *cu, int max_y[2][VVC_MAX_REF_ENTRIES], const VVCLocalContext *lc)
2750{
2751 const VVCFrameContext *fc = lc->fc;
2752 const PredictionUnit *pu = &cu->pu;
2753
2754 if (pu->merge_gpm_flag) {
2755 for (int i = 0; i < FF_ARRAY_ELEMS(pu->gpm_mv); i++) {
2756 const MvField *mvf = pu->gpm_mv + i;
2757 const int lx = mvf->pred_flag - PF_L0;
2758 const int idx = mvf->ref_idx[lx];
2759 const int y = pred_get_y(lc, cu->y0, mvf->mv + lx, cu->cb_height);
2760
2761 max_y[lx][idx] = FFMAX(max_y[lx][idx], y);
2762 }
2763 } else {
2764 const MotionInfo *mi = &pu->mi;
2765 const int max_dmvr_off = (!pu->inter_affine_flag && pu->dmvr_flag) ? 2 : 0;
2766 const int sbw = cu->cb_width / mi->num_sb_x;
2767 const int sbh = cu->cb_height / mi->num_sb_y;
2768 for (int sby = 0; sby < mi->num_sb_y; sby++) {
2769 for (int sbx = 0; sbx < mi->num_sb_x; sbx++) {
2770 const int x0 = cu->x0 + sbx * sbw;
2771 const int y0 = cu->y0 + sby * sbh;
2772 const MvField *mvf = ff_vvc_get_mvf(fc, x0, y0);
2773 for (int lx = 0; lx < 2; lx++) {
2774 const PredFlag mask = 1 << lx;
2775 if (mvf->pred_flag & mask) {
2776 const int idx = mvf->ref_idx[lx];
2777 const int y = pred_get_y(lc, y0, mvf->mv + lx, sbh);
2778
2779 max_y[lx][idx] = FFMAX(max_y[lx][idx], y + max_dmvr_off);
2780 }
2781 }
2782 }
2783 }
2784 }
2785}
2786
2787static void ctu_get_pred(VVCLocalContext *lc, const int rs)
2788{
2789 const VVCFrameContext *fc = lc->fc;
2790 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2791 CTU *ctu = fc->tab.ctus + rs;
2792 const CodingUnit *cu = fc->tab.cus[rs];
2793
2794 ctu->has_dmvr = 0;
2795
2796 if (IS_I(rsh))
2797 return;
2798
2799 for (int lx = 0; lx < 2; lx++)
2800 memset(ctu->max_y[lx], -1, sizeof(ctu->max_y[0][0]) * rsh->num_ref_idx_active[lx]);
2801
2802 while (cu) {
2803 if (has_inter_luma(cu)) {
2804 cu_get_max_y(cu, ctu->max_y, lc);
2805 ctu->has_dmvr |= cu->pu.dmvr_flag;
2806 }
2807 cu = cu->next;
2808 }
2809 ctu->max_y_idx[0] = ctu->max_y_idx[1] = 0;
2810}
2811
2813 const int ctu_idx, const int rs, const int rx, const int ry)
2814{
2815 const VVCFrameContext *fc = lc->fc;
2816 const VVCSPS *sps = fc->ps.sps;
2817 const VVCPPS *pps = fc->ps.pps;
2818 const int x_ctb = rx << sps->ctb_log2_size_y;
2819 const int y_ctb = ry << sps->ctb_log2_size_y;
2820 const int ctb_size = 1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y;
2821 EntryPoint* ep = lc->ep;
2822 int ret;
2823
2824 if (rx == pps->ctb_to_col_bd[rx]) {
2825 ep->num_hmvp = 0;
2826 ep->num_hmvp_ibc = 0;
2827 ep->is_first_qg = ry == pps->ctb_to_row_bd[ry] || !ctu_idx;
2828 }
2829
2830 lc->coeffs = fc->tab.coeffs + rs * ctb_size * VVC_MAX_SAMPLE_ARRAYS;
2831 lc->cu = NULL;
2832
2833 ret = ff_vvc_cabac_init(lc, ctu_idx, rx, ry);
2834 if (ret < 0)
2835 return ret;
2836 ff_vvc_decode_neighbour(lc, x_ctb, y_ctb, rx, ry, rs);
2837 ret = hls_coding_tree_unit(lc, x_ctb, y_ctb, ctu_idx, rx, ry);
2838 if (ret < 0)
2839 return ret;
2840 ctu_get_pred(lc, rs);
2841
2842 return 0;
2843}
2844
2845void ff_vvc_decode_neighbour(VVCLocalContext *lc, const int x_ctb, const int y_ctb,
2846 const int rx, const int ry, const int rs)
2847{
2848 VVCFrameContext *fc = lc->fc;
2849 const int ctb_size = fc->ps.sps->ctb_size_y;
2850
2851 lc->end_of_tiles_x = fc->ps.pps->width;
2852 lc->end_of_tiles_y = fc->ps.pps->height;
2853 if (fc->ps.pps->ctb_to_col_bd[rx] != fc->ps.pps->ctb_to_col_bd[rx + 1])
2854 lc->end_of_tiles_x = FFMIN(x_ctb + ctb_size, lc->end_of_tiles_x);
2855 if (fc->ps.pps->ctb_to_row_bd[ry] != fc->ps.pps->ctb_to_row_bd[ry + 1])
2856 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, lc->end_of_tiles_y);
2857
2858 lc->boundary_flags = 0;
2859 if (rx > 0 && fc->ps.pps->ctb_to_col_bd[rx] != fc->ps.pps->ctb_to_col_bd[rx - 1])
2861 if (rx > 0 && fc->tab.slice_idx[rs] != fc->tab.slice_idx[rs - 1])
2863 if (ry > 0 && fc->ps.pps->ctb_to_row_bd[ry] != fc->ps.pps->ctb_to_row_bd[ry - 1])
2865 if (ry > 0 && fc->tab.slice_idx[rs] != fc->tab.slice_idx[rs - fc->ps.pps->ctb_width])
2867 if (fc->ps.sps->r->sps_subpic_ctu_top_left_x[lc->sc->sh.r->curr_subpic_idx] == rx)
2869 if (fc->ps.sps->r->sps_subpic_ctu_top_left_y[lc->sc->sh.r->curr_subpic_idx] == ry)
2871 lc->ctb_left_flag = rx > 0 && !(lc->boundary_flags & BOUNDARY_LEFT_TILE);
2873 lc->ctb_up_right_flag = lc->ctb_up_flag && (fc->ps.pps->ctb_to_col_bd[rx] == fc->ps.pps->ctb_to_col_bd[rx + 1]) &&
2874 (fc->ps.pps->ctb_to_row_bd[ry] == fc->ps.pps->ctb_to_row_bd[ry - 1]);
2876}
2877
2879 const int x0, const int y0, const int w, const int h)
2880{
2881 const int log2_ctb_size = lc->fc->ps.sps->ctb_log2_size_y;
2882 const int x0b = av_zero_extend(x0, log2_ctb_size);
2883 const int y0b = av_zero_extend(y0, log2_ctb_size);
2884
2885 lc->na.cand_up = (lc->ctb_up_flag || y0b);
2886 lc->na.cand_left = (lc->ctb_left_flag || x0b);
2887 lc->na.cand_up_left = (x0b || y0b) ? lc->na.cand_left && lc->na.cand_up : lc->ctb_up_left_flag;
2888 lc->na.cand_up_right_sap =
2889 (x0b + w == 1 << log2_ctb_size) ? lc->ctb_up_right_flag && !y0b : lc->na.cand_up;
2890 lc->na.cand_up_right = lc->na.cand_up_right_sap && (x0 + w) < lc->end_of_tiles_x;
2891}
2892
2894{
2895 while (*cus) {
2896 CodingUnit *cu = *cus;
2897 TransformUnit **head = &cu->tus.head;
2898
2899 *cus = cu->next;
2900
2901 while (*head) {
2902 TransformUnit *tu = *head;
2903 *head = tu->next;
2904 av_refstruct_unref(&tu);
2905 }
2906 cu->tus.tail = NULL;
2907
2908 av_refstruct_unref(&cu);
2909 }
2910}
2911
2912int ff_vvc_get_qPy(const VVCFrameContext *fc, const int xc, const int yc)
2913{
2914 const int min_cb_log2_size_y = fc->ps.sps->min_cb_log2_size_y;
2915 const int x = xc >> min_cb_log2_size_y;
2916 const int y = yc >> min_cb_log2_size_y;
2917 return fc->tab.qp[LUMA][x + y * fc->ps.pps->min_cb_width];
2918}
2919
2921 const int bit_depth, const int persistent_rice_adaptation_enabled_flag)
2922{
2923 for (size_t i = 0; i < FF_ARRAY_ELEMS(ep->stat_coeff); ++i) {
2924 ep->stat_coeff[i] =
2925 persistent_rice_adaptation_enabled_flag ? 2 * (av_log2(bit_depth - 10)) : 0;
2926 }
2927}
2928
2929void ff_vvc_channel_range(int *start, int *end, const VVCTreeType tree_type, const uint8_t chroma_format_idc)
2930{
2931 const bool has_chroma = chroma_format_idc && tree_type != DUAL_TREE_LUMA;
2932 const bool has_luma = tree_type != DUAL_TREE_CHROMA;
2933
2934 *start = has_luma ? LUMA : CB;
2935 *end = has_chroma ? VVC_MAX_SAMPLE_ARRAYS : CB;
2936}
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition af_astats.c:246
static char * split(char *message, char delim)
int32_t
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition avassert.h:68
#define pixel
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static int FUNC sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
static int FUNC ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
static int FUNC aps(CodedBitstreamContext *ctx, RWContext *rw, H266RawAPS *current, int prefix)
#define av_clip_intp2
Definition common.h:121
#define av_clip
Definition common.h:100
#define FFUMOD(a, b)
Definition common.h:66
#define RSHIFT(a, b)
Definition common.h:56
#define av_zero_extend
Definition common.h:151
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition common.h:74
#define FFSIGN(a)
Definition common.h:75
#define NULL
Definition coverity.c:32
static int inter_data(VVCLocalContext *lc)
Definition ctu.c:1799
static void alf_params(VVCLocalContext *lc, const int rx, const int ry)
Definition ctu.c:2633
static void set_qp_c(VVCLocalContext *lc)
Definition ctu.c:185
static void palette_update_predictor(VVCLocalContext *lc, const bool local_dual_tree, int start, int end, bool *predictor_reused, const int predictor_size)
Definition ctu.c:1918
static void mvp_add_difference(MotionInfo *mi, const int num_cp_mv, const Mv mvds[2][MAX_CONTROL_POINTS], const int amvr_shift)
Definition ctu.c:1612
static int mvp_data(VVCLocalContext *lc)
Definition ctu.c:1658
static int skipped_transform_tree(VVCLocalContext *lc, int x0, int y0, int tu_width, int tu_height)
Definition ctu.c:484
static const coding_tree_fn coding_tree[]
Definition ctu.c:2439
static void merge_data_block(VVCLocalContext *lc)
Definition ctu.c:1447
void ff_vvc_channel_range(int *start, int *end, const VVCTreeType tree_type, const uint8_t chroma_format_idc)
Definition ctu.c:2929
static void set_cu_tabs(const VVCLocalContext *lc, const CodingUnit *cu)
Definition ctu.c:1259
static int pred_get_y(const VVCLocalContext *lc, const int y0, const Mv *mv, const int height)
Definition ctu.c:2739
static int has_inter_luma(const CodingUnit *cu)
Definition ctu.c:2734
static void merge_data_ciip(VVCLocalContext *lc)
Definition ctu.c:1426
#define TAB_ISPMF(fc, x, y)
Definition ctu.c:35
static uint8_t tu_y_coded_flag_decode(VVCLocalContext *lc, const int is_sbt_not_coded, const int sub_tu_index, const int is_isp, const int is_chroma_coded)
Definition ctu.c:273
static void sbt_info(VVCLocalContext *lc, const VVCSPS *sps)
Definition ctu.c:1115
static CodingUnit * add_cu(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height, const int cqt_depth, const VVCTreeType tree_type)
Definition ctu.c:1222
static int coding_tree_btv(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c, int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, VVCTreeType tree_type, VVCModeType mode_type)
Definition ctu.c:2288
static int get_cclm_enabled(const VVCLocalContext *lc, const int x0, const int y0)
Definition ctu.c:634
static int get_num_intra_subpartitions(enum IspType isp_split_type, int cb_width, int cb_height)
Definition ctu.c:625
static int hls_coding_tree_unit(VVCLocalContext *lc, const int x0, const int y0, const int ctu_idx, const int rx, const int ry)
Definition ctu.c:2686
static void ctu_get_pred(VVCLocalContext *lc, const int rs)
Definition ctu.c:2787
static void hls_mvd_coding(VVCLocalContext *lc, Mv *mvd)
Definition ctu.c:1523
static void chroma_qp_offset_decode(VVCLocalContext *lc, const int is_128, const int is_chroma_coded)
Definition ctu.c:293
static TransformUnit * add_tu(VVCFrameContext *fc, CodingUnit *cu, const int x0, const int y0, const int tu_width, const int tu_height)
Definition ctu.c:229
static int hls_merge_data(VVCLocalContext *lc)
Definition ctu.c:1498
static void set_cb_pos(const VVCFrameContext *fc, const CodingUnit *cu)
Definition ctu.c:1173
static int dual_tree_implicit_qt_split(VVCLocalContext *lc, const int x0, const int y0, const int cb_size, const int cqt_depth)
Definition ctu.c:2502
static void derive_dmvr_bdof_flag(const VVCLocalContext *lc, PredictionUnit *pu)
Definition ctu.c:1727
static TransformBlock * add_tb(TransformUnit *tu, VVCLocalContext *lc, const int x0, const int y0, const int tb_width, const int tb_height, const int c_idx)
Definition ctu.c:248
static VVCModeType mode_type_decode(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height, const VVCSplitMode split, const int ch_type, const VVCModeType mode_type_curr)
Definition ctu.c:2265
static int palette_subblock_data(VVCLocalContext *lc, const int max_index, const int subset_id, const bool transpose, uint8_t *run_type, uint8_t *index, int *prev_run_pos, bool *adjust)
Definition ctu.c:1992
#define PALETTE_SET_PIXEL(xc, yc, pix)
Definition ctu.c:1972
static void cu_get_max_y(const CodingUnit *cu, int max_y[2][VVC_MAX_REF_ENTRIES], const VVCLocalContext *lc)
Definition ctu.c:2749
VVCModeType
Definition ctu.c:37
@ MODE_TYPE_INTRA
Definition ctu.c:40
@ MODE_TYPE_INTER
Definition ctu.c:39
@ MODE_TYPE_ALL
Definition ctu.c:38
static int palette_qp(VVCLocalContext *lc, VVCTreeType tree_type, const bool escape_present)
Definition ctu.c:1947
static int bcw_idx_decode(VVCLocalContext *lc, const MotionInfo *mi, const int cb_width, const int cb_height)
Definition ctu.c:1547
static int hls_transform_tree(VVCLocalContext *lc, int x0, int y0, int tu_width, int tu_height, int ch_type)
Definition ctu.c:408
void ff_vvc_set_neighbour_available(VVCLocalContext *lc, const int x0, const int y0, const int w, const int h)
Definition ctu.c:2878
#define TAB_MSM(fc, depth, x, y)
Definition ctu.c:34
static TransformUnit * palette_add_tu(VVCLocalContext *lc, const int start, const int end, const VVCTreeType tree_type)
Definition ctu.c:1833
static void merge_data_regular(VVCLocalContext *lc)
Definition ctu.c:1366
static void derive_mmvd(const VVCLocalContext *lc, MvField *mvf, const Mv *mmvd_offset)
Definition ctu.c:1285
static void derive_chroma_intra_pred_mode(VVCLocalContext *lc, const int cclm_mode_flag, const int cclm_mode_idx, const int intra_chroma_pred_mode)
Definition ctu.c:887
static int coding_tree_qt(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c, int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, VVCTreeType tree_type, VVCModeType mode_type)
Definition ctu.c:2402
#define DUAL_TREE(x, y)
static PredMode pred_mode_decode(VVCLocalContext *lc, const VVCTreeType tree_type, const VVCModeType mode_type)
Definition ctu.c:1047
static int merge_data_ibc(VVCLocalContext *lc)
Definition ctu.c:1477
static int intra_data(VVCLocalContext *lc)
Definition ctu.c:2153
static void set_tb_size(const VVCFrameContext *fc, const TransformBlock *tb)
Definition ctu.c:43
static void merge_data_subblock(VVCLocalContext *lc)
Definition ctu.c:1352
#define SET_SAO(elem, value)
Definition ctu.c:2552
static int palette_signaled(VVCLocalContext *lc, const bool local_dual_tree, const int start, const int end, const int max_entries)
Definition ctu.c:1890
void ff_vvc_ctu_free_cus(CodingUnit **cus)
Definition ctu.c:2893
int ff_vvc_coding_tree_unit(VVCLocalContext *lc, const int ctu_idx, const int rs, const int rx, const int ry)
parse a CTU
Definition ctu.c:2812
#define TRANSFORM_TREE(x, y)
static void set_tb_tab(uint8_t *tab, uint8_t v, const VVCFrameContext *fc, const TransformBlock *tb)
Definition ctu.c:60
#define TRANSFORM_UNIT(x, width, idx)
void ff_vvc_decode_neighbour(VVCLocalContext *lc, const int x_ctb, const int y_ctb, const int rx, const int ry, const int rs)
Definition ctu.c:2845
int(* coding_tree_fn)(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c, int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, VVCTreeType tree_type, VVCModeType mode_type)
Definition ctu.c:2434
int ff_vvc_get_qPy(const VVCFrameContext *fc, const int xc, const int yc)
Definition ctu.c:2912
static void deblock_params(VVCLocalContext *lc, const int rx, const int ry)
Definition ctu.c:2679
static void intra_chroma_pred_modes(VVCLocalContext *lc)
Definition ctu.c:1011
static void mv_merge_refine_pred_flag(MvField *mvf, const int width, const int height)
Definition ctu.c:1343
#define TRAV_Y(pos)
Definition ctu.c:1990
#define PALETTE_INDEX(x, y)
Definition ctu.c:1981
static int palette_predicted(VVCLocalContext *lc, const bool local_dual_tree, int start, int end, bool *predictor_reused, const int predictor_size, const int max_entries)
Definition ctu.c:1856
static int8_t ref_idx_decode(VVCLocalContext *lc, const VVCSH *sh, const int sym_mvd_flag, const int lx)
Definition ctu.c:1568
static int mvp_data_ibc(VVCLocalContext *lc)
Definition ctu.c:1628
static int coding_tree_tth(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c, int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, VVCTreeType tree_type, VVCModeType mode_type)
Definition ctu.c:2372
static void set_qp_c_tab(const VVCLocalContext *lc, const TransformUnit *tu, const TransformBlock *tb)
Definition ctu.c:177
static int hls_palette_coding(VVCLocalContext *lc, const VVCTreeType tree_type)
Definition ctu.c:2087
static int coding_tree_ttv(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c, int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, VVCTreeType tree_type, VVCModeType mode_type)
Definition ctu.c:2342
static enum IntraPredMode derive_center_luma_intra_pred_mode(const VVCFrameContext *fc, const VVCSPS *sps, const VVCPPS *pps, const CodingUnit *cu)
Definition ctu.c:868
static void intra_luma_pred_modes(VVCLocalContext *lc)
Definition ctu.c:958
static void mvf_to_mi(const MvField *mvf, MotionInfo *mi)
Definition ctu.c:1329
static int less(const void *a, const void *b)
Definition ctu.c:679
static int ciip_flag_decode(VVCLocalContext *lc, const int ciip_avaiable, const int gpm_avaiable, const int is_128)
Definition ctu.c:1396
static void hls_sao(VVCLocalContext *lc, const int rx, const int ry)
Definition ctu.c:2564
static void merge_data_gpm(VVCLocalContext *lc)
Definition ctu.c:1408
#define SKIPPED_TRANSFORM_TREE(x, y)
static void refine_regular_subblock(const VVCLocalContext *lc)
Definition ctu.c:1766
static void fill_dmvr_info(const VVCLocalContext *lc)
Definition ctu.c:1778
static int skipped_transform_tree_unit(VVCLocalContext *lc)
Definition ctu.c:1154
static int coding_tree_bth(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c, int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, VVCTreeType tree_type, VVCModeType mode_type)
Definition ctu.c:2315
static void can_split(const VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int mtt_depth, int depth_offset, int part_idx, VVCSplitMode last_split_mode, VVCTreeType tree_type, VVCModeType mode_type, VVCAllowedSplit *split)
Definition ctu.c:526
static void set_cb_tab(const VVCLocalContext *lc, uint8_t *tab, const uint8_t v)
Definition ctu.c:122
static int mvds_decode(VVCLocalContext *lc, Mv mvds[2][MAX_CONTROL_POINTS], const int num_cp_mv, const int lx)
Definition ctu.c:1580
static TransformUnit * alloc_tu(VVCFrameContext *fc, CodingUnit *cu)
Definition ctu.c:212
static int set_qp_y(VVCLocalContext *lc, const int x0, const int y0, const int has_qp_delta)
Definition ctu.c:142
void ff_vvc_ep_init_stat_coeff(EntryPoint *ep, const int bit_depth, const int persistent_rice_adaptation_enabled_flag)
Definition ctu.c:2920
static int derive_mode_type_condition(const VVCLocalContext *lc, const VVCSplitMode split, const int cb_width, const int cb_height, const VVCModeType mode_type_curr)
Definition ctu.c:2243
static enum IntraPredMode luma_intra_pred_mode(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
Definition ctu.c:685
static MtsIdx mts_idx_decode(VVCLocalContext *lc)
Definition ctu.c:847
static int hls_transform_unit(VVCLocalContext *lc, int x0, int y0, int tu_width, int tu_height, int sub_tu_index, int ch_type)
Definition ctu.c:314
static int get_qp_y_pred(const VVCLocalContext *lc)
Definition ctu.c:75
static int hls_coding_tree(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c, int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, int part_idx, VVCSplitMode last_split_mode, VVCTreeType tree_type_curr, VVCModeType mode_type_curr)
Definition ctu.c:2447
static int lfnst_idx_decode(VVCLocalContext *lc)
Definition ctu.c:796
static CodingUnit * alloc_cu(VVCLocalContext *lc, const int x0, const int y0)
Definition ctu.c:1199
#define TRAV_X(pos)
Definition ctu.c:1989
static int hls_coding_unit(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int cqt_depth, const VVCTreeType tree_type, VVCModeType mode_type)
Definition ctu.c:2183
#define CODING_TREE(x, idx)
static av_always_inline uint8_t pack_mip_info(int intra_mip_flag, int intra_mip_transposed_flag, int intra_mip_mode)
Definition ctu.c:952
IspType
Definition ctu.h:121
@ ISP_NO_SPLIT
Definition ctu.h:122
@ ISP_VER_SPLIT
Definition ctu.h:124
@ ISP_HOR_SPLIT
Definition ctu.h:123
@ MODE_PLT
Definition ctu.h:195
@ MODE_IBC
Definition ctu.h:196
@ MOTION_TRANSLATION
Definition ctu.h:219
@ PF_PLT
Definition ctu.h:230
@ PF_IBC
Definition ctu.h:229
#define BOUNDARY_LEFT_SUBPIC
Definition ctu.h:429
VVCTreeType
Definition ctu.h:169
@ DUAL_TREE_LUMA
Definition ctu.h:171
@ DUAL_TREE_CHROMA
Definition ctu.h:172
@ SINGLE_TREE
Definition ctu.h:170
#define MIN_TU_SIZE
Definition ctu.h:46
@ INTRA_HORZ
Definition ctu.h:237
@ INTRA_VDIAG
Definition ctu.h:240
@ INTRA_LT_CCLM
Definition ctu.h:241
@ INTRA_VERT
Definition ctu.h:239
@ INTRA_INVALID
Definition ctu.h:234
#define MAX_PALETTE_CU_SIZE
Definition ctu.h:39
#define MAX_CONTROL_POINTS
Definition ctu.h:67
#define BOUNDARY_UPPER_SUBPIC
Definition ctu.h:432
MtsIdx
Definition ctu.h:136
@ MTS_DCT2_DCT2
Definition ctu.h:137
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
static const uint16_t fc[]
Definition dcaenc.h:43
#define MIN_TU_LOG2
MinTbLog2SizeY.
Definition dec.h:41
#define MIN_PU_LOG2
Definition dec.h:42
#define JCBCR
Definition dec.h:39
uint64_t pps
Definition dovi_rpuenc.c:36
error code definitions
int ret
Definition ffplay.c:391
static const int32_t max_pos[4]
Size of the MP-MLQ fixed excitation codebooks.
Definition g723_1dec.c:97
static void run_copy(const SwsFrame *out, const SwsFrame *in, int y, int h, const SwsPass *pass)
Definition graph.c:282
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
int index
Definition gxfenc.c:90
#define CHROMA(h)
Definition h264dec.h:88
int a
#define LUMA
Definition filter.c:31
#define CR
Definition filter.c:33
#define CTB(tab, x, y)
Definition filter.c:267
#define CB
Definition filter.c:32
#define BOUNDARY_UPPER_SLICE
Definition hevcdec.h:441
#define L1
Definition hevcdec.h:57
#define BOUNDARY_LEFT_TILE
Definition hevcdec.h:440
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
@ PF_INTRA
Definition hevcdec.h:118
#define MAX_QP
Definition hevcdec.h:48
IntraPredMode
Definition hevcdec.h:124
@ INTRA_DC
Definition hevcdec.h:126
@ INTRA_PLANAR
Definition hevcdec.h:125
@ 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 L0
Definition hevcdec.h:56
#define BOUNDARY_UPPER_TILE
Definition hevcdec.h:442
#define BOUNDARY_LEFT_SLICE
Definition hevcdec.h:439
#define b
Definition input.c:43
#define av_log2
Definition intmath.h:84
int ff_vvc_palette_derive_scale(VVCLocalContext *lc, const TransformUnit *tu, TransformBlock *tb)
Definition intra.c:680
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition intra.c:278
#define AV_ZERO64(d)
static const int8_t mv[256][2]
Definition 4xm.c:81
static int luma_intra_pred_mode(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCSPS *sps, int x0, int y0, int pu_size, int prev_intra_luma_pred_flag)
8.4.1
Definition hevcdec.c:2254
#define transpose(x)
@ VVC_MAX_NUM_PALETTE_PREDICTOR_SIZE
Definition vvc.h:159
@ VVC_MAX_REF_ENTRIES
Definition vvc.h:115
@ VVC_MAX_SAMPLE_ARRAYS
Definition vvc.h:77
#define av_always_inline
Definition attributes.h:72
uint8_t w
Definition llvidencdsp.c:39
static const uint16_t mask[17]
Definition lzw.c:38
#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
@ SPLIT_NONE
Definition mss12.c:37
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition refstruct.c:121
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
Definition refstruct.c:315
#define FF_ARRAY_ELEMS(a)
static const SiprModeParam modes[MODE_COUNT]
Definition sipr.c:70
static const float pred[4]
Definition siprdata.h:259
uint8_t ctb_flag[3]
alf_ctb_flag[]
Definition ctu.h:489
uint8_t alf_ctb_filter_alt_idx[2]
alf_ctb_filter_alt_idx[]
Definition ctu.h:491
uint8_t ctb_filt_set_idx_y
AlfCtbFiltSetIdxY.
Definition ctu.h:490
uint8_t ctb_cc_idc[2]
alf_ctb_cc_cb_idc, alf_ctb_cc_cr_idc
Definition ctu.h:492
Definition ctu.h:345
int max_y[2][VVC_MAX_REF_ENTRIES]
Definition ctu.h:346
int has_dmvr
Definition ctu.h:348
int max_y_idx[2]
Definition ctu.h:347
int apply_lfnst_flag[VVC_MAX_SAMPLE_ARRAYS]
ApplyLfnstFlag[].
Definition ctu.h:329
TransformUnit * head
RefStruct reference.
Definition ctu.h:332
enum PredMode pred_mode
PredMode.
Definition hevcdec.h:294
Palette plt[VVC_MAX_SAMPLE_ARRAYS]
Definition ctu.h:338
int mip_chroma_direct_flag
MipChromaDirectFlag.
Definition ctu.h:325
int bdpcm_flag[VVC_MAX_SAMPLE_ARRAYS]
BdpcmFlag.
Definition ctu.h:327
int cqt_depth
Definition ctu.h:296
uint8_t sbt_horizontal_flag
Definition ctu.h:301
enum IspType isp_split_type
IntraSubPartitionsSplitType.
Definition ctu.h:317
uint8_t coded_flag
Definition ctu.h:298
int cb_width
Definition ctu.h:293
uint8_t sbt_pos_flag
Definition ctu.h:302
struct CodingUnit * next
RefStruct reference.
Definition ctu.h:342
uint8_t skip_flag
cu_skip_flag;
Definition ctu.h:311
MtsIdx mts_idx
Definition ctu.h:305
IntraPredMode intra_pred_mode_y
IntraPredModeY.
Definition ctu.h:323
int cb_height
Definition ctu.h:294
int lfnst_idx
Definition ctu.h:304
VVCTreeType tree_type
Definition ctu.h:290
PredictionUnit pu
Definition ctu.h:340
uint8_t ciip_flag
Definition ctu.h:314
int x0
Definition ctu.h:291
uint8_t intra_luma_ref_idx
IntraLumaRefLineIdx[][].
Definition ctu.h:309
IntraPredMode intra_pred_mode_c
IntraPredModeC.
Definition ctu.h:324
int y0
Definition ctu.h:292
int num_intra_subpartitions
Definition ctu.h:321
TransformUnit * tail
RefStruct reference.
Definition ctu.h:333
struct CodingUnit::@377377256006074143206227277326325371142325360110 tus
int ch_type
Definition ctu.h:295
uint8_t intra_mip_flag
intra_mip_flag
Definition ctu.h:310
uint8_t sbt_flag
Definition ctu.h:300
uint8_t act_enabled_flag
Definition ctu.h:307
int8_t qp[4]
QpY, Qp′Cb, Qp′Cr, Qp′CbCr.
Definition ctu.h:336
int num_hmvp_ibc
NumHmvpIbcCand.
Definition ctu.h:383
int num_hmvp
NumHmvpCand.
Definition ctu.h:381
int stat_coeff[VVC_MAX_SAMPLE_ARRAYS]
StatCoeff.
Definition ctu.h:373
int8_t qp_y
QpY.
Definition ctu.h:366
uint8_t is_first_qg
Definition ctu.h:368
Palette pp[VVC_MAX_SAMPLE_ARRAYS]
Definition ctu.h:378
uint8_t pps_cu_qp_delta_enabled_flag
Definition cbs_h266.h:553
uint8_t sps_chroma_format_idc
Definition cbs_h266.h:315
uint8_t sh_alf_cr_enabled_flag
Definition cbs_h266.h:788
uint8_t sh_alf_cb_enabled_flag
Definition cbs_h266.h:787
uint8_t sh_alf_enabled_flag
Definition cbs_h266.h:784
uint8_t num_ref_idx_active[2]
NumRefIdxActive[].
Definition cbs_h266.h:840
int8_t sh_cb_qp_offset
Definition cbs_h266.h:809
uint8_t sh_num_alf_aps_ids_luma
Definition cbs_h266.h:785
uint8_t sh_cu_chroma_qp_offset_enabled_flag
Definition cbs_h266.h:812
uint8_t sh_alf_cc_cb_enabled_flag
Definition cbs_h266.h:790
uint8_t sh_sao_chroma_used_flag
Definition cbs_h266.h:815
uint8_t sh_alf_cc_cr_enabled_flag
Definition cbs_h266.h:792
uint16_t curr_subpic_idx
CurrSubpicIdx.
Definition cbs_h266.h:838
uint8_t sh_sao_luma_used_flag
Definition cbs_h266.h:814
int8_t sh_joint_cbcr_qp_offset
Definition cbs_h266.h:811
uint8_t sh_alf_aps_id_chroma
Definition cbs_h266.h:789
uint8_t sh_alf_cc_cb_aps_id
Definition cbs_h266.h:791
int8_t sh_cr_qp_offset
Definition cbs_h266.h:810
uint8_t sh_alf_cc_cr_aps_id
Definition cbs_h266.h:793
int num_sb_x
Definition ctu.h:255
int num_sb_y
Definition ctu.h:255
MotionModelIdc motion_model_idc
MotionModelIdc.
Definition ctu.h:247
uint8_t hpel_if_idx
hpelIfIdx
Definition ctu.h:207
int8_t ref_idx[2]
refIdxL0, refIdxL1
Definition hevcdec.h:310
int8_t pred_flag
Definition hevcdec.h:311
uint8_t bcw_idx
bcwIdx
Definition ctu.h:208
Mv mv[2]
mvL0, vvL1
Definition hevcdec.h:309
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
uint8_t size
Definition ctu.h:285
uint16_t entries[VVC_MAX_NUM_PALETTE_PREDICTOR_SIZE]
Definition ctu.h:286
uint8_t mmvd_merge_flag
Definition ctu.h:260
uint8_t merge_gpm_flag
Definition ctu.h:267
MotionInfo mi
Definition ctu.h:273
uint8_t inter_affine_flag
Definition ctu.h:262
uint8_t dmvr_flag
Definition ctu.h:276
MvField gpm_mv[2]
Definition ctu.h:269
uint8_t merge_subblock_flag
Definition ctu.h:265
uint8_t general_merge_flag
Definition ctu.h:259
uint8_t gpm_partition_idx
Definition ctu.h:268
int sym_mvd_flag
Definition ctu.h:271
uint8_t bdof_flag
Definition ctu.h:277
VVCRefPic refs[VVC_MAX_REF_ENTRIES]
Definition dec.h:58
int offset_sign[3][4]
sao_offset_sign
Definition dsp.h:36
int16_t offset_val[3][5]
SaoOffsetVal.
Definition dsp.h:42
int eo_class[3]
sao_eo_class
Definition dsp.h:40
int offset_abs[3][4]
sao_offset_abs
Definition dsp.h:35
uint8_t type_idx[3]
sao_type_idx
Definition dsp.h:44
VVCSH sh
Definition dec.h:115
RefPicList * rpl
Definition dec.h:118
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
uint8_t has_coeffs
Definition ctu.h:145
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
uint8_t nb_tbs
Definition ctu.h:185
int height
Definition ctu.h:179
uint8_t coded_flag[VVC_MAX_SAMPLE_ARRAYS]
tu_y_coded_flag, tu_cb_coded_flag, tu_cr_coded_flag
Definition ctu.h:184
TransformBlock tbs[VVC_MAX_SAMPLE_ARRAYS]
Definition ctu.h:186
bool avail[CHROMA+1]
Definition ctu.h:180
int width
Definition ctu.h:178
uint8_t joint_cbcr_residual_flag
tu_joint_cbcr_residual_flag
Definition ctu.h:182
struct TransformUnit * next
RefStruct reference.
Definition ctu.h:188
Definition ps.h:171
struct VVCFrameContext::@062157055061031125261364230274065254203010127363 tab
VVCFrameParamSets ps
Definition dec.h:131
int8_t * qp[VVC_MAX_SAMPLE_ARRAYS]
Definition dec.h:165
const VVCSPS * sps
RefStruct reference.
Definition ps.h:230
const VVCPPS * pps
RefStruct reference.
Definition ps.h:231
int cu_qg_top_left_y
CuQgTopLeftY.
Definition ctu.h:399
int cu_qg_top_left_x
CuQgTopLeftX.
Definition ctu.h:398
uint8_t is_cu_qp_delta_coded
IsCuQpDeltaCoded.
Definition ctu.h:397
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 infer_tu_cbf_luma
InferTuCbfLuma.
Definition ctu.h:403
int prev_tu_cbf_y
prevTuCbfY;
Definition ctu.h:404
uint8_t ctb_up_right_flag
Definition ctu.h:389
int sbt_num_fourths_tb0
SbtNumFourthsTb0.
Definition ctu.h:395
int * coeffs
Definition ctu.h:423
uint8_t ctb_up_flag
Definition ctu.h:388
VVCFrameContext * fc
Definition ctu.h:421
int chroma_qp_offset[3]
CuQpOffsetCb, CuQpOffsetCr, CuQpOffsetCbCr.
Definition ctu.h:401
uint8_t ctb_up_left_flag
Definition ctu.h:390
NeighbourAvailable na
Definition ctu.h:440
int mts_zero_out_sig_coeff_flag
MtsZeroOutSigCoeffFlag;.
Definition ctu.h:410
int is_cu_chroma_qp_offset_coded
IsCuChromaQpOffsetCoded.
Definition ctu.h:400
SliceContext * sc
Definition ctu.h:420
int end_of_tiles_x
Definition ctu.h:391
uint8_t ctb_left_flag
Definition ctu.h:387
int boundary_flags
Definition ctu.h:435
int lfnst_dc_only
LfnstDcOnly.
Definition ctu.h:406
int end_of_tiles_y
Definition ctu.h:392
Definition ps.h:147
int32_t poc
PicOrderCntVal.
Definition ps.h:153
Definition ps.h:92
const H266RawPPS * r
RefStruct reference.
Definition ps.h:93
int is_lt
Definition dec.h:50
int poc
Definition dec.h:49
int is_scaled
RprConstraintsActiveFlag.
Definition dec.h:53
Definition ps.h:238
uint8_t max_tt_size[2]
MaxTtSizeY, MaxTtSizeC.
Definition ps.h:259
uint8_t min_qt_size[2]
MinQtSizeY, MinQtSizeC.
Definition ps.h:257
uint8_t cu_qp_delta_subdiv
CuQpDeltaSubdiv.
Definition ps.h:261
const H266RawSliceHeader * r
RefStruct reference.
Definition ps.h:239
int8_t slice_qp_y
SliceQpY.
Definition ps.h:251
uint32_t num_ctus_in_curr_slice
NumCtusInCurrSlice.
Definition ps.h:243
uint8_t max_mtt_depth[2]
MaxMttDepthY, MaxMttDepthC.
Definition ps.h:260
PredWeightTable pwt
Definition ps.h:247
int8_t ref_idx_sym[2]
RefIdxSymL0, RefIdxSymL1.
Definition ps.h:248
DBParams deblock
Definition ps.h:254
uint8_t max_bt_size[2]
MaxBtSizeY, MaxBtSizeC.
Definition ps.h:258
uint8_t cu_chroma_qp_offset_subdiv
CuChromaQpOffsetSubdiv.
Definition ps.h:262
Definition ps.h:58
uint8_t ctb_log2_size_y
CtbLog2SizeY.
Definition ps.h:71
const H266RawSPS * r
RefStruct reference.
Definition ps.h:59
uint8_t run
Definition svq3.c:207
#define height
Definition dsp.h:99
#define width
Definition dsp.h:99
int size
static const struct twinvq_data tab
#define mi
static const double coeff[2][5]
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static av_always_inline void chroma(WaveformContext *s, AVFrame *in, AVFrame *out, int component, int intensity, int offset_y, int offset_x, int column, int mirror, int jobnr, int nb_jobs)
#define MODE_INTRA
Definition vp3.c:83
static double c[64]
int ff_vvc_intra_bdpcm_chroma_dir_flag(VVCLocalContext *lc)
Definition cabac.c:1275
int ff_vvc_abs_mvd_greater0_flag(VVCLocalContext *lc)
Definition cabac.c:1619
int ff_vvc_end_of_slice_flag_decode(VVCLocalContext *lc)
Definition cabac.c:2563
int ff_vvc_pred_mode_ibc_flag(VVCLocalContext *lc, const int is_chroma)
Definition cabac.c:1286
int ff_vvc_palette_predictor_run(VVCLocalContext *lc, const int max)
Definition cabac.c:1392
int ff_vvc_palette_escape_val(VVCLocalContext *lc, const int max)
Definition cabac.c:1439
int ff_vvc_mmvd_merge_flag(VVCLocalContext *lc)
Definition cabac.c:1482
int ff_vvc_sao_offset_abs_decode(VVCLocalContext *lc)
Definition cabac.c:1040
int ff_vvc_sbt_quad_flag(VVCLocalContext *lc)
Definition cabac.c:2526
int ff_vvc_intra_bdpcm_luma_dir_flag(VVCLocalContext *lc)
Definition cabac.c:1265
int ff_vvc_cclm_mode_idx(VVCLocalContext *lc)
Definition cabac.c:1378
int ff_vvc_cabac_init(VVCLocalContext *lc, const int ctu_idx, const int rx, const int ry)
Definition cabac.c:845
int ff_vvc_cu_skip_flag(VVCLocalContext *lc, const uint8_t *cu_skip_flag)
Definition cabac.c:1280
int ff_vvc_cclm_mode_flag(VVCLocalContext *lc)
Definition cabac.c:1373
int ff_vvc_end_of_tile_one_bit(VVCLocalContext *lc)
Definition cabac.c:2568
int ff_vvc_end_of_subset_one_bit(VVCLocalContext *lc)
Definition cabac.c:2573
int ff_vvc_alf_luma_fixed_filter_idx(VVCLocalContext *lc)
Definition cabac.c:1085
int ff_vvc_abs_mvd_minus2(VVCLocalContext *lc)
Definition cabac.c:1629
int ff_vvc_intra_luma_not_planar_flag(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
Definition cabac.c:1355
int ff_vvc_mmvd_cand_flag(VVCLocalContext *lc)
Definition cabac.c:1487
int ff_vvc_merge_gpm_partition_idx(VVCLocalContext *lc)
Definition cabac.c:1549
int ff_vvc_intra_bdpcm_luma_flag(VVCLocalContext *lc)
Definition cabac.c:1260
int ff_vvc_sao_offset_sign_decode(VVCLocalContext *lc)
Definition cabac.c:1050
int ff_vvc_alf_luma_prev_filter_idx(VVCLocalContext *lc)
Definition cabac.c:1080
int ff_vvc_sbt_pos_flag(VVCLocalContext *lc)
Definition cabac.c:2539
int ff_vvc_sao_type_idx_decode(VVCLocalContext *lc)
Definition cabac.c:1025
int ff_vvc_lfnst_idx(VVCLocalContext *lc, const int inc)
Definition cabac.c:2544
int ff_vvc_intra_subpartitions_mode_flag(VVCLocalContext *lc)
Definition cabac.c:1338
int ff_vvc_ciip_flag(VVCLocalContext *lc)
Definition cabac.c:1568
int ff_vvc_sym_mvd_flag(VVCLocalContext *lc)
Definition cabac.c:1599
int ff_vvc_alf_use_aps_flag(VVCLocalContext *lc)
Definition cabac.c:1075
int ff_vvc_intra_bdpcm_chroma_flag(VVCLocalContext *lc)
Definition cabac.c:1270
int ff_vvc_amvr_shift(VVCLocalContext *lc, const int inter_affine_flag, const PredMode pred_mode, const int has_amvr_flag)
Definition cabac.c:1660
int ff_vvc_pred_mode_flag(VVCLocalContext *lc, const int is_chroma)
Definition cabac.c:1244
int ff_vvc_intra_luma_mpm_flag(VVCLocalContext *lc)
Definition cabac.c:1350
int ff_vvc_cu_chroma_qp_offset_idx(VVCLocalContext *lc)
Definition cabac.c:1761
int ff_vvc_cu_chroma_qp_offset_flag(VVCLocalContext *lc)
Definition cabac.c:1756
int ff_vvc_mvp_lx_flag(VVCLocalContext *lc)
Definition cabac.c:1639
int ff_vvc_intra_mip_mode(VVCLocalContext *lc)
Definition cabac.c:1319
int ff_vvc_mvd_sign_flag(VVCLocalContext *lc)
Definition cabac.c:1634
int ff_vvc_pred_mode_plt_flag(VVCLocalContext *lc)
Definition cabac.c:1255
int ff_vvc_cu_act_enabled_flag(VVCLocalContext *lc)
Definition cabac.c:1718
int ff_vvc_intra_luma_mpm_idx(VVCLocalContext *lc)
Definition cabac.c:1360
int ff_vvc_sbt_horizontal_flag(VVCLocalContext *lc)
Definition cabac.c:2531
bool ff_vvc_palette_escape_val_present_flag(VVCLocalContext *lc)
Definition cabac.c:1407
int ff_vvc_intra_luma_ref_idx(VVCLocalContext *lc)
Definition cabac.c:1328
int ff_vvc_sao_eo_class_decode(VVCLocalContext *lc)
Definition cabac.c:1055
int ff_vvc_sao_merge_flag_decode(VVCLocalContext *lc)
Definition cabac.c:1020
int ff_vvc_merge_gpm_idx(VVCLocalContext *lc, const int idx)
Definition cabac.c:1554
void ff_vvc_mmvd_offset_coding(VVCLocalContext *lc, Mv *mmvd_offset, const int ph_mmvd_fullpel_only_flag)
Definition cabac.c:1507
int ff_vvc_cu_coded_flag(VVCLocalContext *lc)
Definition cabac.c:2513
int ff_vvc_cu_affine_type_flag(VVCLocalContext *lc)
Definition cabac.c:1594
int ff_vvc_sbt_flag(VVCLocalContext *lc)
Definition cabac.c:2518
int ff_vvc_regular_merge_flag(VVCLocalContext *lc, const int cu_skip_flag)
Definition cabac.c:1476
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:1200
int ff_vvc_intra_chroma_pred_mode(VVCLocalContext *lc)
Definition cabac.c:1385
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:1100
int ff_vvc_intra_mip_flag(VVCLocalContext *lc, const uint8_t *intra_mip_flag)
Definition cabac.c:1306
bool ff_vvc_copy_above_palette_indices_flag(VVCLocalContext *lc)
Definition cabac.c:1429
int ff_vvc_alf_ctb_filter_alt_idx(VVCLocalContext *lc, const int c_idx, const int num_chroma_filters)
Definition cabac.c:1090
int ff_vvc_mts_idx(VVCLocalContext *lc)
Definition cabac.c:2553
int ff_vvc_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
Definition cabac.c:2505
int ff_vvc_tu_cr_coded_flag(VVCLocalContext *lc, int tu_cb_coded_flag)
Definition cabac.c:1699
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:1122
int ff_vvc_merge_subblock_idx(VVCLocalContext *lc, const int max_num_subblock_merge_cand)
Definition cabac.c:1466
int ff_vvc_tu_cb_coded_flag(VVCLocalContext *lc)
Definition cabac.c:1694
int ff_vvc_new_palette_entries(VVCLocalContext *lc, const int bit_depth)
Definition cabac.c:1402
int ff_vvc_merge_subblock_flag(VVCLocalContext *lc)
Definition cabac.c:1460
bool ff_vvc_palette_transpose_flag(VVCLocalContext *lc)
Definition cabac.c:1412
int ff_vvc_non_inter_flag(VVCLocalContext *lc, const int x0, const int y0, const int ch_type)
Definition cabac.c:1234
int ff_vvc_alf_ctb_flag(VVCLocalContext *lc, const int rx, const int ry, const int c_idx)
Definition cabac.c:1060
int ff_vvc_abs_mvd_greater1_flag(VVCLocalContext *lc)
Definition cabac.c:1624
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:1417
int ff_vvc_sao_band_position_decode(VVCLocalContext *lc)
Definition cabac.c:1035
int ff_vvc_tu_y_coded_flag(VVCLocalContext *lc)
Definition cabac.c:1704
int ff_vvc_intra_mip_transposed_flag(VVCLocalContext *lc)
Definition cabac.c:1314
int ff_vvc_num_signalled_palette_entries(VVCLocalContext *lc, const int max)
Definition cabac.c:1397
int ff_vvc_bcw_idx(VVCLocalContext *lc, const int no_backward_pred_flag)
Definition cabac.c:1683
int ff_vvc_intra_luma_mpm_remainder(VVCLocalContext *lc)
Definition cabac.c:1368
int ff_vvc_transform_skip_flag(VVCLocalContext *lc, const int inc)
Definition cabac.c:1820
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:1815
int ff_vvc_inter_affine_flag(VVCLocalContext *lc)
Definition cabac.c:1588
int ff_vvc_general_merge_flag(VVCLocalContext *lc)
Definition cabac.c:1444
int ff_vvc_cu_qp_delta_abs(VVCLocalContext *lc)
Definition cabac.c:1723
PredFlag ff_vvc_pred_flag(VVCLocalContext *lc, const int is_b)
Definition cabac.c:1573
int ff_vvc_cu_qp_delta_sign_flag(VVCLocalContext *lc)
Definition cabac.c:1751
int ff_vvc_ref_idx_lx(VVCLocalContext *lc, const uint8_t nb_refs)
Definition cabac.c:1604
enum IspType ff_vvc_isp_split_type(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
Definition cabac.c:1343
int ff_vvc_merge_idx(VVCLocalContext *lc)
Definition cabac.c:1534
int ff_vvc_palette_idx_idc(VVCLocalContext *lc, const int max_palette_index, const bool adjust)
Definition cabac.c:1434
void ff_vvc_luma_mv_merge_mode(VVCLocalContext *lc, const int merge_idx, const int ciip_flag, MvField *mv)
Definition mvs.c:829
int ff_vvc_luma_mv_merge_ibc(VVCLocalContext *lc, const int merge_idx, Mv *mv)
Definition mvs.c:1742
void ff_vvc_store_gpm_mvf(const VVCLocalContext *lc, const PredictionUnit *pu)
Definition mvs.c:457
int ff_vvc_no_backward_pred_flag(const VVCLocalContext *lc)
Definition mvs.c:121
void ff_vvc_store_mvf(const VVCLocalContext *lc, const MvField *mvf)
Definition mvs.c:502
void ff_vvc_mvp(VVCLocalContext *lc, const int *mvp_lx_flag, const int amvr_shift, MotionInfo *mi)
Definition mvs.c:1614
void ff_vvc_sb_mv_merge_mode(VVCLocalContext *lc, const int merge_subblock_idx, PredictionUnit *pu)
Definition mvs.c:1424
void ff_vvc_luma_mv_merge_gpm(VVCLocalContext *lc, const int merge_gpm_idx[2], MvField *mv)
Definition mvs.c:842
void ff_vvc_update_hmvp(VVCLocalContext *lc, const MotionInfo *mi)
Definition mvs.c:1951
MvField * ff_vvc_get_mvf(const VVCFrameContext *fc, const int x0, const int y0)
Definition mvs.c:1970
void ff_vvc_set_intra_mvf(const VVCLocalContext *lc, const bool dmvr, const PredFlag pf, const bool ciip_flag)
Definition mvs.c:271
void ff_vvc_clip_mv(Mv *mv)
Definition mvs.c:1902
void ff_vvc_mv_scale(Mv *dst, const Mv *src, int td, int tb)
Definition mvs.c:71
int ff_vvc_mvp_ibc(VVCLocalContext *lc, const int mvp_l0_flag, const int amvr_shift, Mv *mv)
Definition mvs.c:1733
void ff_vvc_wrap_mv(Mv *mv)
Definition mvs.c:1910
void ff_vvc_store_sb_mvs(const VVCLocalContext *lc, PredictionUnit *pu)
Definition mvs.c:412
void ff_vvc_store_mv(const VVCLocalContext *lc, const MotionInfo *mi)
Definition mvs.c:508
void ff_vvc_affine_mvp(VVCLocalContext *lc, const int *mvp_lx_flag, const int amvr_shift, MotionInfo *mi)
Definition mvs.c:1871
@ CHROMA_FORMAT_420
Definition ps.h:53
@ CHROMA_FORMAT_444
Definition ps.h:55
@ CHROMA_FORMAT_422
Definition ps.h:54
#define IS_I(rsh)
Definition ps.h:38
#define IS_B(rsh)
Definition ps.h:40