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 } else {
1319 const int idx = mvf->pred_flag - PF_L0;
1320 mvf->mv[idx].x += mmvd_offset->x;
1321 mvf->mv[idx].y += mmvd_offset->y;
1322 }
1323
1324}
1325
1326static void mvf_to_mi(const MvField *mvf, MotionInfo *mi)
1327{
1328 mi->pred_flag = mvf->pred_flag;
1329 mi->bcw_idx = mvf->bcw_idx;
1330 mi->hpel_if_idx = mvf->hpel_if_idx;
1331 for (int i = 0; i < 2; i++) {
1332 const PredFlag mask = i + 1;
1333 if (mvf->pred_flag & mask) {
1334 mi->mv[i][0] = mvf->mv[i];
1335 mi->ref_idx[i] = mvf->ref_idx[i];
1336 }
1337 }
1338}
1339
1340static void mv_merge_refine_pred_flag(MvField *mvf, const int width, const int height)
1341{
1342 if (mvf->pred_flag == PF_BI && (width + height) == 12) {
1343 mvf->pred_flag = PF_L0;
1344 mvf->bcw_idx = 0;
1345 }
1346}
1347
1348// subblock-based inter prediction data
1350{
1351 const VVCFrameContext *fc = lc->fc;
1352 const VVCPH *ph = &fc->ps.ph;
1353 CodingUnit* cu = lc->cu;
1354 PredictionUnit *pu = &cu->pu;
1355 int merge_subblock_idx = 0;
1356
1357 if (ph->max_num_subblock_merge_cand > 1) {
1358 merge_subblock_idx = ff_vvc_merge_subblock_idx(lc, ph->max_num_subblock_merge_cand);
1359 }
1360 ff_vvc_sb_mv_merge_mode(lc, merge_subblock_idx, pu);
1361}
1362
1364{
1365 const VVCFrameContext *fc = lc->fc;
1366 const VVCSPS *sps = fc->ps.sps;
1367 const VVCPH *ph = &fc->ps.ph;
1368 const CodingUnit* cu = lc->cu;
1369 PredictionUnit *pu = &lc->cu->pu;
1370 int merge_idx = 0;
1371 Mv mmvd_offset;
1372 MvField mvf;
1373
1374 if (sps->r->sps_mmvd_enabled_flag)
1376 if (pu->mmvd_merge_flag) {
1377 int mmvd_cand_flag = 0;
1378 if (sps->max_num_merge_cand > 1)
1379 mmvd_cand_flag = ff_vvc_mmvd_cand_flag(lc);
1380 ff_vvc_mmvd_offset_coding(lc, &mmvd_offset, ph->r->ph_mmvd_fullpel_only_flag);
1381 merge_idx = mmvd_cand_flag;
1382 } else if (sps->max_num_merge_cand > 1) {
1383 merge_idx = ff_vvc_merge_idx(lc);
1384 }
1385 ff_vvc_luma_mv_merge_mode(lc, merge_idx, 0, &mvf);
1386 if (pu->mmvd_merge_flag)
1387 derive_mmvd(lc, &mvf, &mmvd_offset);
1389 ff_vvc_store_mvf(lc, &mvf);
1390 mvf_to_mi(&mvf, &pu->mi);
1391}
1392
1393static int ciip_flag_decode(VVCLocalContext *lc, const int ciip_avaiable, const int gpm_avaiable, const int is_128)
1394{
1395 const VVCFrameContext *fc = lc->fc;
1396 const VVCSPS *sps = fc->ps.sps;
1397 const CodingUnit *cu = lc->cu;
1398
1399 if (ciip_avaiable && gpm_avaiable)
1400 return ff_vvc_ciip_flag(lc);
1401 return sps->r->sps_ciip_enabled_flag && !cu->skip_flag &&
1402 !is_128 && (cu->cb_width * cu->cb_height >= 64);
1403}
1404
1406{
1407 const VVCFrameContext *fc = lc->fc;
1408 const VVCSPS *sps = fc->ps.sps;
1409 PredictionUnit *pu = &lc->cu->pu;
1410 int merge_gpm_idx[2];
1411
1412 pu->merge_gpm_flag = 1;
1414 merge_gpm_idx[0] = ff_vvc_merge_gpm_idx(lc, 0);
1415 merge_gpm_idx[1] = 0;
1416 if (sps->max_num_gpm_merge_cand > 2)
1417 merge_gpm_idx[1] = ff_vvc_merge_gpm_idx(lc, 1);
1418
1419 ff_vvc_luma_mv_merge_gpm(lc, merge_gpm_idx, pu->gpm_mv);
1420 ff_vvc_store_gpm_mvf(lc, pu);
1421}
1422
1424{
1425 const VVCFrameContext* fc = lc->fc;
1426 const VVCSPS* sps = fc->ps.sps;
1427 CodingUnit *cu = lc->cu;
1428 MotionInfo *mi = &cu->pu.mi;
1429 int merge_idx = 0;
1430 MvField mvf;
1431
1432 if (sps->max_num_merge_cand > 1)
1433 merge_idx = ff_vvc_merge_idx(lc);
1434 ff_vvc_luma_mv_merge_mode(lc, merge_idx, 1, &mvf);
1436 ff_vvc_store_mvf(lc, &mvf);
1437 mvf_to_mi(&mvf, mi);
1439 cu->intra_luma_ref_idx = 0;
1440 cu->intra_mip_flag = 0;
1441}
1442
1443// block-based inter prediction data
1445{
1446 const VVCFrameContext* fc = lc->fc;
1447 const VVCSPS *sps = fc->ps.sps;
1448 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1449 CodingUnit *cu = lc->cu;
1450 const int cb_width = cu->cb_width;
1451 const int cb_height = cu->cb_height;
1452 const int is_128 = cb_width == 128 || cb_height == 128;
1453 const int ciip_avaiable = sps->r->sps_ciip_enabled_flag &&
1454 !cu->skip_flag && (cb_width * cb_height >= 64);
1455 const int gpm_avaiable = sps->r->sps_gpm_enabled_flag && IS_B(rsh) &&
1456 (cb_width >= 8) && (cb_height >=8) &&
1457 (cb_width < 8 * cb_height) && (cb_height < 8 *cb_width);
1458
1459 int regular_merge_flag = 1;
1460
1461 if (!is_128 && (ciip_avaiable || gpm_avaiable))
1462 regular_merge_flag = ff_vvc_regular_merge_flag(lc, cu->skip_flag);
1463 if (regular_merge_flag) {
1465 } else {
1466 cu->ciip_flag = ciip_flag_decode(lc, ciip_avaiable, gpm_avaiable, is_128);
1467 if (cu->ciip_flag)
1468 merge_data_ciip(lc);
1469 else
1470 merge_data_gpm(lc);
1471 }
1472}
1473
1475{
1476 const VVCFrameContext* fc = lc->fc;
1477 const VVCSPS* sps = fc->ps.sps;
1478 MotionInfo *mi = &lc->cu->pu.mi;
1479 int merge_idx = 0;
1480 int ret;
1481
1482 mi->pred_flag = PF_IBC;
1483
1484 if (sps->max_num_ibc_merge_cand > 1)
1485 merge_idx = ff_vvc_merge_idx(lc);
1486
1487 ret = ff_vvc_luma_mv_merge_ibc(lc, merge_idx, &mi->mv[L0][0]);
1488 if (ret)
1489 return ret;
1490 ff_vvc_store_mv(lc, mi);
1491
1492 return 0;
1493}
1494
1496{
1497 const VVCFrameContext *fc = lc->fc;
1498 const VVCPH *ph = &fc->ps.ph;
1499 const CodingUnit *cu = lc->cu;
1500 PredictionUnit *pu = &lc->cu->pu;
1501 int ret;
1502
1503 pu->merge_gpm_flag = 0;
1504 pu->mi.num_sb_x = pu->mi.num_sb_y = 1;
1505 if (cu->pred_mode == MODE_IBC) {
1506 ret = merge_data_ibc(lc);
1507 if (ret)
1508 return ret;
1509 } else {
1510 if (ph->max_num_subblock_merge_cand > 0 && cu->cb_width >= 8 && cu->cb_height >= 8)
1512 if (pu->merge_subblock_flag)
1514 else
1515 merge_data_block(lc);
1516 }
1517 return 0;
1518}
1519
1520static void hls_mvd_coding(VVCLocalContext *lc, Mv* mvd)
1521{
1522 int32_t mv[2];
1523
1524 for (int i = 0; i < 2; i++) {
1526 }
1527
1528 for (int i = 0; i < 2; i++) {
1529 if (mv[i])
1531 }
1532
1533 for (int i = 0; i < 2; i++) {
1534 if (mv[i] > 0) {
1535 if (mv[i] == 2)
1536 mv[i] += ff_vvc_abs_mvd_minus2(lc);
1537 mv[i] = (1 - 2 * ff_vvc_mvd_sign_flag(lc)) * mv[i];
1538 }
1539 }
1540 mvd->x = mv[0];
1541 mvd->y = mv[1];
1542}
1543
1544static int bcw_idx_decode(VVCLocalContext *lc, const MotionInfo *mi, const int cb_width, const int cb_height)
1545{
1546 const VVCFrameContext *fc = lc->fc;
1547 const VVCSPS *sps = fc->ps.sps;
1548 const VVCPPS *pps = fc->ps.pps;
1549 const VVCPH *ph = &fc->ps.ph;
1550 const VVCSH *sh = &lc->sc->sh;
1551 const PredWeightTable *w = pps->r->pps_wp_info_in_ph_flag ? &ph->pwt : &sh->pwt;
1552 int bcw_idx = 0;
1553
1554 if (sps->r->sps_bcw_enabled_flag && mi->pred_flag == PF_BI &&
1555 !w->weight_flag[L0][LUMA][mi->ref_idx[0]] &&
1556 !w->weight_flag[L1][LUMA][mi->ref_idx[1]] &&
1557 !w->weight_flag[L0][CHROMA][mi->ref_idx[0]] &&
1558 !w->weight_flag[L1][CHROMA][mi->ref_idx[1]] &&
1559 cb_width * cb_height >= 256) {
1561 }
1562 return bcw_idx;
1563}
1564
1565static int8_t ref_idx_decode(VVCLocalContext *lc, const VVCSH *sh, const int sym_mvd_flag, const int lx)
1566{
1567 const H266RawSliceHeader *rsh = sh->r;
1568 int ref_idx = 0;
1569
1570 if (rsh->num_ref_idx_active[lx] > 1 && !sym_mvd_flag)
1571 ref_idx = ff_vvc_ref_idx_lx(lc, rsh->num_ref_idx_active[lx]);
1572 else if (sym_mvd_flag)
1573 ref_idx = sh->ref_idx_sym[lx];
1574 return ref_idx;
1575}
1576
1578 const int num_cp_mv, const int lx)
1579{
1580 const VVCFrameContext *fc = lc->fc;
1581 const VVCPH *ph = &fc->ps.ph;
1582 const PredictionUnit *pu = &lc->cu->pu;
1583 const MotionInfo *mi = &pu->mi;
1584 int has_no_zero_mvd = 0;
1585
1586 if (lx == L1 && ph->r->ph_mvd_l1_zero_flag && mi->pred_flag == PF_BI) {
1587 for (int j = 0; j < num_cp_mv; j++)
1588 AV_ZERO64(&mvds[lx][j]);
1589 } else {
1590 Mv *mvd0 = &mvds[lx][0];
1591 if (lx == L1 && pu->sym_mvd_flag) {
1592 mvd0->x = -mvds[L0][0].x;
1593 mvd0->y = -mvds[L0][0].y;
1594 } else {
1595 hls_mvd_coding(lc, mvd0);
1596 }
1597 has_no_zero_mvd |= (mvd0->x || mvd0->y);
1598 for (int j = 1; j < num_cp_mv; j++) {
1599 Mv *mvd = &mvds[lx][j];
1600 hls_mvd_coding(lc, mvd);
1601 mvd->x += mvd0->x;
1602 mvd->y += mvd0->y;
1603 has_no_zero_mvd |= (mvd->x || mvd->y);
1604 }
1605 }
1606 return has_no_zero_mvd;
1607}
1608
1609static void mvp_add_difference(MotionInfo *mi, const int num_cp_mv,
1610 const Mv mvds[2][MAX_CONTROL_POINTS], const int amvr_shift)
1611{
1612 for (int i = 0; i < 2; i++) {
1613 const PredFlag mask = i + PF_L0;
1614 if (mi->pred_flag & mask) {
1615 for (int j = 0; j < num_cp_mv; j++) {
1616 const Mv *mvd = &mvds[i][j];
1617 mi->mv[i][j].x += mvd->x * (1 << amvr_shift);
1618 mi->mv[i][j].y += mvd->y * (1 << amvr_shift);
1619 }
1620 }
1621 }
1622}
1623
1625{
1626 const VVCFrameContext *fc = lc->fc;
1627 const CodingUnit *cu = lc->cu;
1628 const PredictionUnit *pu = &lc->cu->pu;
1629 const VVCSPS *sps = fc->ps.sps;
1630 MotionInfo *mi = &lc->cu->pu.mi;
1631 int mvp_l0_flag = 0;
1632 int amvr_shift = 4;
1633 Mv *mv = &mi->mv[L0][0];
1634 int ret;
1635
1636 mi->pred_flag = PF_IBC;
1637 mi->num_sb_x = 1;
1638 mi->num_sb_y = 1;
1639
1640 hls_mvd_coding(lc, mv);
1641 if (sps->max_num_ibc_merge_cand > 1)
1642 mvp_l0_flag = ff_vvc_mvp_lx_flag(lc);
1643 if (sps->r->sps_amvr_enabled_flag && (mv->x || mv->y))
1644 amvr_shift = ff_vvc_amvr_shift(lc, pu->inter_affine_flag, cu->pred_mode, 1);
1645
1646 ret = ff_vvc_mvp_ibc(lc, mvp_l0_flag, amvr_shift, mv);
1647 if (ret)
1648 return ret;
1649 ff_vvc_store_mv(lc, mi);
1650
1651 return 0;
1652}
1653
1655{
1656 const VVCFrameContext *fc = lc->fc;
1657 const CodingUnit *cu = lc->cu;
1658 PredictionUnit *pu = &lc->cu->pu;
1659 const VVCSPS *sps = fc->ps.sps;
1660 const VVCPH *ph = &fc->ps.ph;
1661 const VVCSH *sh = &lc->sc->sh;
1662 const H266RawSliceHeader *rsh = sh->r;
1663 MotionInfo *mi = &pu->mi;
1664 const int cb_width = cu->cb_width;
1665 const int cb_height = cu->cb_height;
1666
1667 int mvp_lx_flag[2] = {0};
1668 int cu_affine_type_flag = 0;
1669 int num_cp_mv;
1670 int amvr_enabled, has_no_zero_mvd = 0, amvr_shift;
1671 Mv mvds[2][MAX_CONTROL_POINTS];
1672
1673 mi->pred_flag = ff_vvc_pred_flag(lc, IS_B(rsh));
1674 if (sps->r->sps_affine_enabled_flag && cb_width >= 16 && cb_height >= 16) {
1676 set_cb_tab(lc, fc->tab.iaf, pu->inter_affine_flag);
1677 if (sps->r->sps_6param_affine_enabled_flag && pu->inter_affine_flag)
1678 cu_affine_type_flag = ff_vvc_cu_affine_type_flag(lc);
1679 }
1680 mi->motion_model_idc = pu->inter_affine_flag + cu_affine_type_flag;
1681 num_cp_mv = mi->motion_model_idc + 1;
1682
1683 if (sps->r->sps_smvd_enabled_flag && !ph->r->ph_mvd_l1_zero_flag &&
1684 mi->pred_flag == PF_BI && !pu->inter_affine_flag &&
1685 sh->ref_idx_sym[0] > -1 && sh->ref_idx_sym[1] > -1)
1687
1688 for (int i = L0; i <= L1; i++) {
1689 const PredFlag pred_flag = PF_L0 + !i;
1690 if (mi->pred_flag != pred_flag) {
1691 mi->ref_idx[i] = ref_idx_decode(lc, sh, pu->sym_mvd_flag, i);
1692 has_no_zero_mvd |= mvds_decode(lc, mvds, num_cp_mv, i);
1693 mvp_lx_flag[i] = ff_vvc_mvp_lx_flag(lc);
1694 }
1695 }
1696
1697 amvr_enabled = mi->motion_model_idc == MOTION_TRANSLATION ?
1698 sps->r->sps_amvr_enabled_flag : sps->r->sps_affine_amvr_enabled_flag;
1699 amvr_enabled &= has_no_zero_mvd;
1700
1701 amvr_shift = ff_vvc_amvr_shift(lc, pu->inter_affine_flag, cu->pred_mode, amvr_enabled);
1702
1703 mi->hpel_if_idx = amvr_shift == 3;
1704 mi->bcw_idx = bcw_idx_decode(lc, mi, cb_width, cb_height);
1705
1706 if (mi->motion_model_idc)
1707 ff_vvc_affine_mvp(lc, mvp_lx_flag, amvr_shift, mi);
1708 else
1709 ff_vvc_mvp(lc, mvp_lx_flag, amvr_shift, mi);
1710
1711 mvp_add_difference(mi, num_cp_mv, mvds, amvr_shift);
1712
1713 if (mi->motion_model_idc)
1714 ff_vvc_store_sb_mvs(lc, pu);
1715 else
1716 ff_vvc_store_mv(lc, &pu->mi);
1717
1718 return 0;
1719}
1720
1721// derive bdofFlag from 8.5.6 Decoding process for inter blocks
1722// derive dmvr from 8.5.1 General decoding process for coding units coded in inter prediction mode
1724{
1725 const VVCFrameContext *fc = lc->fc;
1726 const VVCPPS *pps = fc->ps.pps;
1727 const VVCPH *ph = &fc->ps.ph;
1728 const VVCSH *sh = &lc->sc->sh;
1729 const int poc = ph->poc;
1730 const MotionInfo *mi = &pu->mi;
1731 const int8_t *ref_idx = mi->ref_idx;
1732 const VVCRefPic *rp0 = &lc->sc->rpl[L0].refs[ref_idx[L0]];
1733 const VVCRefPic *rp1 = &lc->sc->rpl[L1].refs[ref_idx[L1]];
1734 const CodingUnit *cu = lc->cu;
1735 const PredWeightTable *w = pps->r->pps_wp_info_in_ph_flag ? &fc->ps.ph.pwt : &sh->pwt;
1736
1737 pu->bdof_flag = 0;
1738
1739 if (mi->pred_flag == PF_BI &&
1740 (poc - rp0->poc == rp1->poc - poc) &&
1741 !rp0->is_lt && !rp1->is_lt &&
1742 !cu->ciip_flag &&
1743 !mi->bcw_idx &&
1744 !w->weight_flag[L0][LUMA][ref_idx[L0]] && !w->weight_flag[L1][LUMA][ref_idx[L1]] &&
1745 !w->weight_flag[L0][CHROMA][ref_idx[L0]] && !w->weight_flag[L1][CHROMA][ref_idx[L1]] &&
1746 cu->cb_width >= 8 && cu->cb_height >= 8 &&
1747 (cu->cb_width * cu->cb_height >= 128) &&
1748 !rp0->is_scaled && !rp1->is_scaled) {
1749 if (!ph->r->ph_bdof_disabled_flag &&
1750 mi->motion_model_idc == MOTION_TRANSLATION &&
1751 !pu->merge_subblock_flag &&
1752 !pu->sym_mvd_flag)
1753 pu->bdof_flag = 1;
1754 if (!ph->r->ph_dmvr_disabled_flag &&
1755 pu->general_merge_flag &&
1756 !pu->mmvd_merge_flag)
1757 pu->dmvr_flag = 1;
1758 }
1759}
1760
1761// part of 8.5.1 General decoding process for coding units coded in inter prediction mode
1763{
1764 const CodingUnit *cu = lc->cu;
1765 PredictionUnit *pu = &lc->cu->pu;
1766
1767 derive_dmvr_bdof_flag(lc, pu);
1768 if (pu->dmvr_flag || pu->bdof_flag) {
1769 pu->mi.num_sb_x = (cu->cb_width > 16) ? (cu->cb_width >> 4) : 1;
1770 pu->mi.num_sb_y = (cu->cb_height > 16) ? (cu->cb_height >> 4) : 1;
1771 }
1772}
1773
1774static void fill_dmvr_info(const VVCLocalContext *lc)
1775{
1776 const VVCFrameContext *fc = lc->fc;
1777 const CodingUnit *cu = lc->cu;
1778
1779 if (cu->pred_mode == MODE_IBC || cu->pred_mode == MODE_PLT) {
1780 ff_vvc_set_intra_mvf(lc, true, cu->pred_mode == MODE_IBC ? PF_IBC : PF_PLT, false);
1781 } else {
1782 const VVCPPS *pps = fc->ps.pps;
1783 const int w = cu->cb_width >> MIN_PU_LOG2;
1784
1785 for (int y = cu->y0 >> MIN_PU_LOG2; y < (cu->y0 + cu->cb_height) >> MIN_PU_LOG2; y++) {
1786 const int idx = pps->min_pu_width * y + (cu->x0 >> MIN_PU_LOG2);
1787 const MvField *mvf = fc->tab.mvf + idx;
1788 MvField *dmvr_mvf = fc->ref->tab_dmvr_mvf + idx;
1789
1790 memcpy(dmvr_mvf, mvf, sizeof(MvField) * w);
1791 }
1792 }
1793}
1794
1796{
1797 const CodingUnit *cu = lc->cu;
1798 PredictionUnit *pu = &lc->cu->pu;
1799 const MotionInfo *mi = &pu->mi;
1800 int ret = 0;
1801
1802 pu->general_merge_flag = 1;
1803 if (!cu->skip_flag)
1805
1806 if (pu->general_merge_flag) {
1807 ret = hls_merge_data(lc);
1808 } else if (cu->pred_mode == MODE_IBC) {
1809 ret = mvp_data_ibc(lc);
1810 } else {
1811 ret = mvp_data(lc);
1812 }
1813
1814 if (ret)
1815 return ret;
1816
1817 if (cu->pred_mode == MODE_IBC) {
1819 } else if (!pu->merge_gpm_flag && !pu->inter_affine_flag && !pu->merge_subblock_flag) {
1822 }
1823
1824 if (!pu->dmvr_flag)
1825 fill_dmvr_info(lc);
1826 return ret;
1827}
1828
1829static TransformUnit* palette_add_tu(VVCLocalContext *lc, const int start, const int end, const VVCTreeType tree_type)
1830{
1831 CodingUnit *cu = lc->cu;
1832 const VVCSPS *sps = lc->fc->ps.sps;
1833 TransformUnit *tu = add_tu(lc->fc, cu, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
1834
1835 if (!tu)
1836 return NULL;
1837
1838 for (int c = start; c < end; c++) {
1839 const int w = tu->width >> sps->hshift[c];
1840 const int h = tu->height >> sps->vshift[c];
1841 TransformBlock *tb = add_tb(tu, lc, tu->x0, tu->y0, w, h, c);
1842 if (c != CR)
1843 set_tb_size(lc->fc, tb);
1844 }
1845
1846 for (int i = 0; i < FF_ARRAY_ELEMS(cu->plt); i++)
1847 cu->plt[i].size = 0;
1848
1849 return tu;
1850}
1851
1852static int palette_predicted(VVCLocalContext *lc, const bool local_dual_tree, int start, int end,
1853 bool *predictor_reused, const int predictor_size, const int max_entries)
1854{
1855 CodingUnit *cu = lc->cu;
1856 int nb_predicted = 0;
1857
1858 if (local_dual_tree) {
1859 start = LUMA;
1861 }
1862
1863 for (int i = 0; i < predictor_size && nb_predicted < max_entries; i++) {
1864 const int run = ff_vvc_palette_predictor_run(lc, predictor_size - i);
1865 if (run < 0)
1866 return run;
1867
1868 if (run == 1)
1869 break;
1870
1871 if (run > 1)
1872 i += run - 1;
1873
1874 predictor_reused[i] = true;
1875 for (int c = start; c < end; c++)
1876 cu->plt[c].entries[nb_predicted] = lc->ep->pp[c].entries[i];
1877 nb_predicted++;
1878 }
1879
1880 for (int c = start; c < end; c++)
1881 cu->plt[c].size = nb_predicted;
1882
1883 return 0;
1884}
1885
1886static int palette_signaled(VVCLocalContext *lc, const bool local_dual_tree,
1887 const int start, const int end, const int max_entries)
1888{
1889 const VVCSPS *sps = lc->fc->ps.sps;
1890 CodingUnit *cu = lc->cu;
1891 const int nb_predicted = cu->plt[start].size;
1892 const int nb_signaled = nb_predicted < max_entries ? ff_vvc_num_signalled_palette_entries(lc, max_entries - nb_predicted) : 0;
1893 const int size = nb_predicted + nb_signaled;
1894 const bool dual_tree_luma = local_dual_tree && cu->tree_type == DUAL_TREE_LUMA;
1895
1896 if (nb_signaled < 0)
1897 return AVERROR_INVALIDDATA;
1898
1899 for (int c = start; c < end; c++) {
1900 Palette *plt = cu->plt + c;
1901 for (int i = nb_predicted; i < size; i++) {
1902 plt->entries[i] = ff_vvc_new_palette_entries(lc, sps->bit_depth);
1903 if (dual_tree_luma) {
1904 plt[CB].entries[i] = 1 << (sps->bit_depth - 1);
1905 plt[CR].entries[i] = 1 << (sps->bit_depth - 1);
1906 }
1907 }
1908 plt->size = size;
1909 }
1910
1911 return 0;
1912}
1913
1914static void palette_update_predictor(VVCLocalContext *lc, const bool local_dual_tree, int start, int end,
1915 bool *predictor_reused, const int predictor_size)
1916{
1917 CodingUnit *cu = lc->cu;
1918 const int max_predictor = VVC_MAX_NUM_PALETTE_PREDICTOR_SIZE >> (cu->tree_type != SINGLE_TREE && !local_dual_tree);
1919
1920 if (local_dual_tree) {
1921 start = LUMA;
1923 }
1924
1925 for (int c = start; c < end; c++) {
1926 Palette *pp = lc->ep->pp + c;
1927 Palette *plt = cu->plt + c;
1928 int i = cu->plt[start].size;;
1929
1930 // copy unused predictors to the end of plt
1931 for (int j = 0; j < predictor_size && i < max_predictor; j++) {
1932 if (!predictor_reused[j]) {
1933 plt->entries[i] = pp->entries[j];
1934 i++;
1935 }
1936 }
1937
1938 memcpy(pp->entries, plt->entries, i * sizeof(pp->entries[0]));
1939 pp->size = i;
1940 }
1941}
1942
1943static int palette_qp(VVCLocalContext *lc, VVCTreeType tree_type, const bool escape_present)
1944{
1945 const VVCFrameContext *fc = lc->fc;
1946 const VVCPPS *pps = fc->ps.pps;
1947 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1948 const CodingUnit *cu = lc->cu;
1949 int ret;
1950
1951 if (tree_type != DUAL_TREE_CHROMA) {
1952 const bool has_qp_delta = escape_present &&
1953 pps->r->pps_cu_qp_delta_enabled_flag && !lc->parse.is_cu_qp_delta_coded;
1954 ret = set_qp_y(lc, cu->x0, cu->y0, has_qp_delta);
1955 if (ret < 0)
1956 return ret;
1957 }
1958
1959 if (tree_type != DUAL_TREE_LUMA) {
1961 chroma_qp_offset_decode(lc, 0, 1);
1962 set_qp_c(lc);
1963 }
1964
1965 return 0;
1966}
1967
1968#define PALETTE_SET_PIXEL(xc, yc, pix) \
1969 do { \
1970 const int off = ((xc) >> hs) + ((yc) >> vs) * tb->tb_width; \
1971 if (sps->bit_depth == 8) \
1972 u8[off] = pix; \
1973 else \
1974 u16[off] = pix; \
1975 } while (0)
1976
1977#define PALETTE_INDEX(x, y) index[(y) * width + (x)]
1978
1979// 6.5.3 Horizontal and vertical traverse scan order array initialization process
1980// The hTravScan and vTravScan tables require approximately 576 KB of memory.
1981// To save space, we use a macro to achieve the same functionality.
1982#define TRAV_COL(p, wlog, mask) ((p & mask) ^ (-((p >> wlog) & 1) & mask))
1983#define TRAV_ROW(p, hlog) (p >> hlog)
1984#define TRAV(trans, p, wlog, hlog, mask) (trans ? TRAV_ROW((p), hlog) : TRAV_COL((p), wlog, mask))
1985#define TRAV_X(pos) TRAV(transpose, pos, wlog2, hlog2, wmask)
1986#define TRAV_Y(pos) TRAV(!transpose, pos, hlog2, wlog2, hmask)
1987
1989 const int max_index, const int subset_id, const bool transpose,
1990 uint8_t *run_type, uint8_t *index, int *prev_run_pos, bool *adjust)
1991{
1992 const CodingUnit *cu = lc->cu;
1993 TransformUnit *tu = cu->tus.head;
1994 const VVCSPS *sps = lc->fc->ps.sps;
1995 const int width = tu->tbs[0].tb_width;
1996 const int height = tu->tbs[0].tb_height;
1997 const int min_pos = subset_id << 4;
1998 const int max_pos = FFMIN(min_pos + 16, width * height);
1999 const int wmask = width - 1;
2000 const int hmask = height - 1;
2001 const int wlog2 = av_log2(width);
2002 const int hlog2 = av_log2(height);
2003 const int start_idx = tu->tbs[0].c_idx;
2004 const uint8_t esc = cu->plt[tu->tbs[0].c_idx].size;
2005 uint8_t run_copy[16] = { 0 };
2006
2007 for (int i = min_pos; i < max_pos; i++) {
2008 const int xc = TRAV_X(i);
2009 const int yc = TRAV_Y(i);
2010
2011 if (i > 0 && max_index > 0)
2012 run_copy[i - min_pos] = ff_vvc_run_copy_flag(lc, run_type[i - 1], *prev_run_pos, i);
2013
2014 run_type[i] = 0;
2015 if (max_index > 0 && !run_copy[i - min_pos]) {
2016 if (((!transpose && yc > 0) || (transpose && xc > 0))
2017 && i > 0 && !run_type[i - 1]) {
2019 }
2020 *prev_run_pos = i;
2021 } else if (i > 0) {
2022 run_type[i] = run_type[i - 1];
2023 }
2024 }
2025
2026 for (int i = min_pos; i < max_pos; i++) {
2027 const int xc = TRAV_X(i);
2028 const int yc = TRAV_Y(i);
2029 const int prev_xc = i > 0 ? TRAV_X(i - 1) : 0;
2030 const int prev_yc = i > 0 ? TRAV_Y(i - 1) : 0;
2031
2032 int idx = 0;
2033 if (max_index > 0 && !run_copy[i - min_pos] && !run_type[i]) {
2034 if (max_index - *adjust > 0)
2035 idx = ff_vvc_palette_idx_idc(lc, max_index, *adjust);
2036 if (i > 0) {
2037 const int ref_idx = !run_type[i - 1] ?
2038 PALETTE_INDEX(prev_xc, prev_yc) : PALETTE_INDEX(xc - transpose, yc - !transpose);
2039 idx += (idx >= ref_idx);
2040 }
2041 *adjust = true;
2042 } else {
2043 idx = PALETTE_INDEX(prev_xc, prev_yc);
2044 }
2045
2046 if (!run_type[i])
2047 PALETTE_INDEX(xc, yc) = idx;
2048 else
2049 PALETTE_INDEX(xc, yc) = PALETTE_INDEX(xc - transpose, yc - !transpose);
2050 }
2051
2052 for (int c = 0; c < tu->nb_tbs; c++) {
2053 TransformBlock *tb = &tu->tbs[c];
2054 const int c_idx = tb->c_idx;
2055 const Palette *plt = &cu->plt[c_idx];
2056 const int scale = ff_vvc_palette_derive_scale(lc, tu, tb);
2057 const int hs = sps->hshift[c_idx] - sps->hshift[start_idx];
2058 const int vs = sps->vshift[c_idx] - sps->vshift[start_idx];
2059 uint8_t *u8 = (uint8_t *)tb->coeffs;
2060 uint16_t *u16 = (uint16_t *)tb->coeffs;
2061
2062 for (int i = min_pos; i < max_pos; i++) {
2063 const int xc = TRAV_X(i);
2064 const int yc = TRAV_Y(i);
2065 if (!(xc & hs) && !(yc & vs)) {
2066 const int v = PALETTE_INDEX(xc, yc);
2067 if (v == esc) {
2068 const int coeff = ff_vvc_palette_escape_val(lc, (1 << sps->bit_depth) - 1);
2069 if (coeff < 0)
2070 return AVERROR_INVALIDDATA;
2071 const int pixel = av_clip_intp2(RSHIFT(coeff * scale, 6), sps->bit_depth);
2072 PALETTE_SET_PIXEL(xc, yc, pixel);
2073 } else {
2074 PALETTE_SET_PIXEL(xc, yc, plt->entries[v]);
2075 }
2076 }
2077 }
2078 }
2079
2080 return 0;
2081}
2082
2083static int hls_palette_coding(VVCLocalContext *lc, const VVCTreeType tree_type)
2084{
2085 const VVCFrameContext *fc = lc->fc;
2086 const VVCSPS *sps = fc->ps.sps;
2087 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2088 CodingUnit *cu = lc->cu;
2089 Palette *pp = lc->ep->pp;
2090 const int max_entries = tree_type == SINGLE_TREE ? 31 : 15;
2091 const bool local_dual_tree = tree_type != SINGLE_TREE &&
2092 (!IS_I(rsh) || (IS_I(rsh) && !sps->r->sps_qtbtt_dual_tree_intra_flag));
2093 bool escape_present = false;
2094 bool transpose = false;
2095 bool adjust = false;
2096 int max_index = 0;
2097 int prev_run_pos = 0;
2098
2099 int predictor_size, start, end, ret;
2101 uint8_t run_type[MAX_PALETTE_CU_SIZE * MAX_PALETTE_CU_SIZE];
2103
2104 TransformUnit *tu;
2105
2106 ff_vvc_channel_range(&start, &end, tree_type, sps->r->sps_chroma_format_idc);
2107
2108 tu = palette_add_tu(lc, start, end, tree_type);
2109 if (!tu)
2110 return AVERROR(ENOMEM);
2111
2112 predictor_size = pp[start].size;
2113 memset(reused, 0, sizeof(reused[0]) * predictor_size);
2114
2115 ret = palette_predicted(lc, local_dual_tree, start, end, reused, predictor_size, max_entries);
2116 if (ret < 0)
2117 return ret;
2118
2119 ret = palette_signaled(lc, local_dual_tree, start, end, max_entries);
2120 if (ret < 0)
2121 return ret;
2122
2123 palette_update_predictor(lc, local_dual_tree, start, end, reused, predictor_size);
2124
2125 if (cu->plt[start].size > 0)
2126 escape_present = ff_vvc_palette_escape_val_present_flag(lc);
2127
2128 max_index = cu->plt[start].size - 1 + escape_present;
2129 if (max_index > 0) {
2130 adjust = false;
2132 }
2133
2134 ret = palette_qp(lc, tree_type, escape_present);
2135 if (ret < 0)
2136 return ret;
2137
2138 index[0] = 0;
2139 for (int i = 0; i <= (tu->tbs[0].tb_width * tu->tbs[0].tb_height - 1) >> 4; i++) {
2140 ret = palette_subblock_data(lc, max_index, i, transpose,
2141 run_type, index, &prev_run_pos, &adjust);
2142 if (ret < 0)
2143 return ret;
2144 }
2145
2146 return 0;
2147}
2148
2150{
2151 const VVCSPS *sps = lc->fc->ps.sps;
2152 const CodingUnit *cu = lc->cu;
2153 const VVCTreeType tree_type = cu->tree_type;
2154 const bool pred_mode_plt_flag = cu->pred_mode == MODE_PLT;
2155 int ret = 0;
2156
2157 if (tree_type == SINGLE_TREE || tree_type == DUAL_TREE_LUMA) {
2158 if (pred_mode_plt_flag) {
2159 if ((ret = hls_palette_coding(lc, tree_type)) < 0)
2160 return ret;
2161 ff_vvc_set_intra_mvf(lc, false, PF_PLT, false);
2162 } else {
2164 ff_vvc_set_intra_mvf(lc, false, PF_INTRA, cu->ciip_flag);
2165 }
2166 }
2167 if ((tree_type == SINGLE_TREE || tree_type == DUAL_TREE_CHROMA) && sps->r->sps_chroma_format_idc) {
2168 if (pred_mode_plt_flag && tree_type == DUAL_TREE_CHROMA) {
2169 if ((ret = hls_palette_coding(lc, tree_type)) < 0)
2170 return ret;
2171 } else if (!pred_mode_plt_flag) {
2173 }
2174 }
2175
2176 return ret;
2177}
2178
2179static int hls_coding_unit(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height,
2180 int cqt_depth, const VVCTreeType tree_type, VVCModeType mode_type)
2181{
2182 const VVCFrameContext *fc = lc->fc;
2183 const VVCSPS *sps = fc->ps.sps;
2184 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2185 const int is_128 = cb_width > 64 || cb_height > 64;
2186 int ret = 0;
2187
2188 CodingUnit *cu = add_cu(lc, x0, y0, cb_width, cb_height, cqt_depth, tree_type);
2189
2190 if (!cu)
2191 return AVERROR(ENOMEM);
2192
2193 ff_vvc_set_neighbour_available(lc, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
2194
2195 if (IS_I(rsh) && is_128)
2196 mode_type = MODE_TYPE_INTRA;
2197 cu->pred_mode = pred_mode_decode(lc, tree_type, mode_type);
2198
2199 if (cu->pred_mode == MODE_INTRA && sps->r->sps_act_enabled_flag && tree_type == SINGLE_TREE)
2201
2202 if (cu->pred_mode == MODE_INTRA || cu->pred_mode == MODE_PLT)
2203 ret = intra_data(lc);
2204 else if (tree_type != DUAL_TREE_CHROMA) /* MODE_INTER or MODE_IBC */
2205 ret = inter_data(lc);
2206
2207 if (ret < 0)
2208 return ret;
2209
2210 if (cu->pred_mode != MODE_INTRA && cu->pred_mode != MODE_PLT && !lc->cu->pu.general_merge_flag)
2212 else
2213 cu->coded_flag = !(cu->skip_flag || cu->pred_mode == MODE_PLT);
2214
2215 if (cu->coded_flag) {
2216 sbt_info(lc, sps);
2217 if (sps->r->sps_act_enabled_flag && cu->pred_mode != MODE_INTRA && tree_type == SINGLE_TREE)
2219 lc->parse.lfnst_dc_only = 1;
2221 lc->parse.mts_dc_only = 1;
2223 ret = hls_transform_tree(lc, x0, y0, cb_width, cb_height, cu->ch_type);
2224 if (ret < 0)
2225 return ret;
2226 cu->lfnst_idx = lfnst_idx_decode(lc);
2227 cu->mts_idx = mts_idx_decode(lc);
2228 set_qp_c(lc);
2229 } else if (cu->pred_mode != MODE_PLT) {
2231 if (ret < 0)
2232 return ret;
2233 }
2234 set_cu_tabs(lc, cu);
2235
2236 return 0;
2237}
2238
2240 const VVCSplitMode split, const int cb_width, const int cb_height, const VVCModeType mode_type_curr)
2241{
2242 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2243 const VVCSPS *sps = lc->fc->ps.sps;
2244 const int area = cb_width * cb_height;
2245
2246 if ((IS_I(rsh) && sps->r->sps_qtbtt_dual_tree_intra_flag) ||
2247 mode_type_curr != MODE_TYPE_ALL || !sps->r->sps_chroma_format_idc ||
2248 sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444)
2249 return 0;
2250 if ((area == 64 && (split == SPLIT_QT || split == SPLIT_TT_HOR || split == SPLIT_TT_VER)) ||
2251 (area == 32 && (split == SPLIT_BT_HOR || split == SPLIT_BT_VER)))
2252 return 1;
2253 if ((area == 64 && (split == SPLIT_BT_HOR || split == SPLIT_BT_VER) && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_420) ||
2254 (area == 128 && (split == SPLIT_TT_HOR || split == SPLIT_TT_VER) && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_420) ||
2255 (cb_width == 8 && split == SPLIT_BT_VER) || (cb_width == 16 && split == SPLIT_TT_VER))
2256 return 1 + !IS_I(rsh);
2257
2258 return 0;
2259}
2260
2261static VVCModeType mode_type_decode(VVCLocalContext *lc, const int x0, const int y0,
2262 const int cb_width, const int cb_height, const VVCSplitMode split, const int ch_type,
2263 const VVCModeType mode_type_curr)
2264{
2265 VVCModeType mode_type;
2266 const int mode_type_condition = derive_mode_type_condition(lc, split, cb_width, cb_height, mode_type_curr);
2267
2268 if (mode_type_condition == 1)
2269 mode_type = MODE_TYPE_INTRA;
2270 else if (mode_type_condition == 2) {
2271 mode_type = ff_vvc_non_inter_flag(lc, x0, y0, ch_type) ? MODE_TYPE_INTRA : MODE_TYPE_INTER;
2272 } else {
2273 mode_type = mode_type_curr;
2274 }
2275
2276 return mode_type;
2277}
2278
2279static int hls_coding_tree(VVCLocalContext *lc,
2280 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2281 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, int part_idx,
2282 VVCSplitMode last_split_mode, VVCTreeType tree_type_curr, VVCModeType mode_type_curr);
2283
2285 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2286 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2287 VVCTreeType tree_type, VVCModeType mode_type)
2288{
2289#define CODING_TREE(x, idx) do { \
2290 ret = hls_coding_tree(lc, x, y0, cb_width / 2, cb_height, \
2291 qg_on_y, qg_on_c, cb_sub_div + 1, cqt_depth, mtt_depth + 1, \
2292 depth_offset, idx, SPLIT_BT_VER, tree_type, mode_type); \
2293 if (ret < 0) \
2294 return ret; \
2295} while (0);
2296
2297 const VVCPPS *pps = lc->fc->ps.pps;
2298 const int x1 = x0 + cb_width / 2;
2299 int ret = 0;
2300
2301 depth_offset += (x0 + cb_width > pps->width) ? 1 : 0;
2302 CODING_TREE(x0, 0);
2303 if (x1 < pps->width)
2304 CODING_TREE(x1, 1);
2305
2306 return 0;
2307
2308#undef CODING_TREE
2309}
2310
2312 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2313 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2314 VVCTreeType tree_type, VVCModeType mode_type)
2315{
2316#define CODING_TREE(y, idx) do { \
2317 ret = hls_coding_tree(lc, x0, y, cb_width , cb_height / 2, \
2318 qg_on_y, qg_on_c, cb_sub_div + 1, cqt_depth, mtt_depth + 1, \
2319 depth_offset, idx, SPLIT_BT_HOR, tree_type, mode_type); \
2320 if (ret < 0) \
2321 return ret; \
2322 } while (0);
2323
2324 const VVCPPS *pps = lc->fc->ps.pps;
2325 const int y1 = y0 + (cb_height / 2);
2326 int ret = 0;
2327
2328 depth_offset += (y0 + cb_height > pps->height) ? 1 : 0;
2329 CODING_TREE(y0, 0);
2330 if (y1 < pps->height)
2331 CODING_TREE(y1, 1);
2332
2333 return 0;
2334
2335#undef CODING_TREE
2336}
2337
2339 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2340 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2341 VVCTreeType tree_type, VVCModeType mode_type)
2342{
2343#define CODING_TREE(x, w, sub_div, idx) do { \
2344 ret = hls_coding_tree(lc, x, y0, w, cb_height, \
2345 qg_on_y, qg_on_c, sub_div, cqt_depth, mtt_depth + 1, \
2346 depth_offset, idx, SPLIT_TT_VER, tree_type, mode_type); \
2347 if (ret < 0) \
2348 return ret; \
2349 } while (0);
2350
2351 const VVCSH *sh = &lc->sc->sh;
2352 const int x1 = x0 + cb_width / 4;
2353 const int x2 = x0 + cb_width * 3 / 4;
2354 int ret;
2355
2356 qg_on_y = qg_on_y && (cb_sub_div + 2 <= sh->cu_qp_delta_subdiv);
2357 qg_on_c = qg_on_c && (cb_sub_div + 2 <= sh->cu_chroma_qp_offset_subdiv);
2358
2359 CODING_TREE(x0, cb_width / 4, cb_sub_div + 2, 0);
2360 CODING_TREE(x1, cb_width / 2, cb_sub_div + 1, 1);
2361 CODING_TREE(x2, cb_width / 4, cb_sub_div + 2, 2);
2362
2363 return 0;
2364
2365#undef CODING_TREE
2366}
2367
2369 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2370 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2371 VVCTreeType tree_type, VVCModeType mode_type)
2372{
2373#define CODING_TREE(y, h, sub_div, idx) do { \
2374 ret = hls_coding_tree(lc, x0, y, cb_width, h, \
2375 qg_on_y, qg_on_c, sub_div, cqt_depth, mtt_depth + 1, \
2376 depth_offset, idx, SPLIT_TT_HOR, tree_type, mode_type); \
2377 if (ret < 0) \
2378 return ret; \
2379 } while (0);
2380
2381 const VVCSH *sh = &lc->sc->sh;
2382 const int y1 = y0 + (cb_height / 4);
2383 const int y2 = y0 + (3 * cb_height / 4);
2384 int ret;
2385
2386 qg_on_y = qg_on_y && (cb_sub_div + 2 <= sh->cu_qp_delta_subdiv);
2387 qg_on_c = qg_on_c && (cb_sub_div + 2 <= sh->cu_chroma_qp_offset_subdiv);
2388
2389 CODING_TREE(y0, cb_height / 4, cb_sub_div + 2, 0);
2390 CODING_TREE(y1, cb_height / 2, cb_sub_div + 1, 1);
2391 CODING_TREE(y2, cb_height / 4, cb_sub_div + 2, 2);
2392
2393 return 0;
2394
2395#undef CODING_TREE
2396}
2397
2399 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2400 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2401 VVCTreeType tree_type, VVCModeType mode_type)
2402{
2403#define CODING_TREE(x, y, idx) do { \
2404 ret = hls_coding_tree(lc, x, y, cb_width / 2, cb_height / 2, \
2405 qg_on_y, qg_on_c, cb_sub_div + 2, cqt_depth + 1, 0, 0, \
2406 idx, SPLIT_QT, tree_type, mode_type); \
2407 if (ret < 0) \
2408 return ret; \
2409 } while (0);
2410
2411 const VVCPPS *pps = lc->fc->ps.pps;
2412 const int x1 = x0 + cb_width / 2;
2413 const int y1 = y0 + cb_height / 2;
2414 int ret = 0;
2415
2416 CODING_TREE(x0, y0, 0);
2417 if (x1 < pps->width)
2418 CODING_TREE(x1, y0, 1);
2419 if (y1 < pps->height)
2420 CODING_TREE(x0, y1, 2);
2421 if (x1 < pps->width &&
2422 y1 < pps->height)
2423 CODING_TREE(x1, y1, 3);
2424
2425 return 0;
2426
2427#undef CODING_TREE
2428}
2429
2431 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2432 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2433 VVCTreeType tree_type, VVCModeType mode_type);
2434
2442
2444 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2445 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, int part_idx,
2446 VVCSplitMode last_split_mode, VVCTreeType tree_type_curr, VVCModeType mode_type_curr)
2447{
2448 VVCFrameContext *fc = lc->fc;
2449 const VVCPPS *pps = fc->ps.pps;
2450 const VVCSH *sh = &lc->sc->sh;
2451 const H266RawSliceHeader *rsh = sh->r;
2452 const int ch_type = tree_type_curr == DUAL_TREE_CHROMA;
2453 int ret;
2454 VVCAllowedSplit allowed;
2455
2456 if (pps->r->pps_cu_qp_delta_enabled_flag && qg_on_y && cb_sub_div <= sh->cu_qp_delta_subdiv) {
2458 lc->parse.cu_qg_top_left_x = x0;
2459 lc->parse.cu_qg_top_left_y = y0;
2460 }
2461 if (rsh->sh_cu_chroma_qp_offset_enabled_flag && qg_on_c &&
2462 cb_sub_div <= sh->cu_chroma_qp_offset_subdiv) {
2464 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
2465 }
2466
2467 can_split(lc, x0, y0, cb_width, cb_height, mtt_depth, depth_offset, part_idx,
2468 last_split_mode, tree_type_curr, mode_type_curr, &allowed);
2469 if (ff_vvc_split_cu_flag(lc, x0, y0, cb_width, cb_height, ch_type, &allowed)) {
2470 VVCSplitMode split = ff_vvc_split_mode(lc, x0, y0, cb_width, cb_height, cqt_depth, mtt_depth, ch_type, &allowed);
2471 VVCModeType mode_type = mode_type_decode(lc, x0, y0, cb_width, cb_height, split, ch_type, mode_type_curr);
2472
2473 VVCTreeType tree_type = (mode_type == MODE_TYPE_INTRA) ? DUAL_TREE_LUMA : tree_type_curr;
2474
2475 if (split != SPLIT_QT) {
2476 if (!(x0 & 31) && !(y0 & 31) && mtt_depth <= 1)
2477 TAB_MSM(fc, mtt_depth, x0, y0) = split;
2478 }
2479 ret = coding_tree[split - 1](lc, x0, y0, cb_width, cb_height, qg_on_y, qg_on_c,
2480 cb_sub_div, cqt_depth, mtt_depth, depth_offset, tree_type, mode_type);
2481 if (ret < 0)
2482 return ret;
2483 if (mode_type_curr == MODE_TYPE_ALL && mode_type == MODE_TYPE_INTRA) {
2484 ret = hls_coding_tree(lc, x0, y0, cb_width, cb_height, 0, qg_on_c, cb_sub_div,
2485 cqt_depth, mtt_depth, 0, 0, split, DUAL_TREE_CHROMA, mode_type);
2486 if (ret < 0)
2487 return ret;
2488 }
2489 } else {
2490 ret = hls_coding_unit(lc, x0, y0, cb_width, cb_height, cqt_depth, tree_type_curr, mode_type_curr);
2491 if (ret < 0)
2492 return ret;
2493 }
2494
2495 return 0;
2496}
2497
2499 const int x0, const int y0, const int cb_size, const int cqt_depth)
2500{
2501 const VVCSH *sh = &lc->sc->sh;
2502 const H266RawSliceHeader *rsh = sh->r;
2503 const VVCPPS *pps = lc->fc->ps.pps;
2504 const int cb_subdiv = 2 * cqt_depth;
2505 int ret;
2506
2507 if (cb_size > 64) {
2508 #define DUAL_TREE(x, y) do { \
2509 ret = dual_tree_implicit_qt_split(lc, x, y, cb_size / 2, cqt_depth + 1); \
2510 if (ret < 0) \
2511 return ret; \
2512 } while (0)
2513
2514 const int x1 = x0 + (cb_size / 2);
2515 const int y1 = y0 + (cb_size / 2);
2516 if (pps->r->pps_cu_qp_delta_enabled_flag && cb_subdiv <= sh->cu_qp_delta_subdiv) {
2518 lc->parse.cu_qg_top_left_x = x0;
2519 lc->parse.cu_qg_top_left_y = y0;
2520 }
2521 if (rsh->sh_cu_chroma_qp_offset_enabled_flag && cb_subdiv <= sh->cu_chroma_qp_offset_subdiv) {
2523 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
2524 }
2525 DUAL_TREE(x0, y0);
2526 if (x1 < pps->width)
2527 DUAL_TREE(x1, y0);
2528 if (y1 < pps->height)
2529 DUAL_TREE(x0, y1);
2530 if (x1 < pps->width && y1 < pps->height)
2531 DUAL_TREE(x1, y1);
2532 #undef DUAL_TREE
2533 } else {
2534 #define CODING_TREE(tree_type) do { \
2535 const int qg_on_y = tree_type == DUAL_TREE_LUMA; \
2536 ret = hls_coding_tree(lc, x0, y0, cb_size, cb_size, qg_on_y, !qg_on_y, \
2537 cb_subdiv, cqt_depth, 0, 0, 0, SPLIT_NONE, tree_type, MODE_TYPE_ALL); \
2538 if (ret < 0) \
2539 return ret; \
2540 } while (0)
2543 #undef CODING_TREE
2544 }
2545 return 0;
2546}
2547
2548#define SET_SAO(elem, value) \
2549do { \
2550 if (!sao_merge_up_flag && !sao_merge_left_flag) \
2551 sao->elem = value; \
2552 else if (sao_merge_left_flag) \
2553 sao->elem = CTB(fc->tab.sao, rx-1, ry).elem; \
2554 else if (sao_merge_up_flag) \
2555 sao->elem = CTB(fc->tab.sao, rx, ry-1).elem; \
2556 else \
2557 sao->elem = 0; \
2558} while (0)
2559
2560static void hls_sao(VVCLocalContext *lc, const int rx, const int ry)
2561{
2562 VVCFrameContext *fc = lc->fc;
2563 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2564 int sao_merge_left_flag = 0;
2565 int sao_merge_up_flag = 0;
2566 SAOParams *sao = &CTB(fc->tab.sao, rx, ry);
2567 int c_idx, i;
2568
2570 if (rx > 0) {
2571 if (lc->ctb_left_flag)
2572 sao_merge_left_flag = ff_vvc_sao_merge_flag_decode(lc);
2573 }
2574 if (ry > 0 && !sao_merge_left_flag) {
2575 if (lc->ctb_up_flag)
2576 sao_merge_up_flag = ff_vvc_sao_merge_flag_decode(lc);
2577 }
2578 }
2579
2580 for (c_idx = 0; c_idx < (fc->ps.sps->r->sps_chroma_format_idc ? 3 : 1); c_idx++) {
2581 const int sao_used_flag = !c_idx ? rsh->sh_sao_luma_used_flag : rsh->sh_sao_chroma_used_flag;
2582 if (!sao_used_flag) {
2583 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
2584 continue;
2585 }
2586
2587 if (c_idx == 2) {
2588 sao->type_idx[2] = sao->type_idx[1];
2589 sao->eo_class[2] = sao->eo_class[1];
2590 } else {
2591 SET_SAO(type_idx[c_idx], ff_vvc_sao_type_idx_decode(lc));
2592 }
2593
2594 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
2595 continue;
2596
2597 for (i = 0; i < 4; i++)
2598 SET_SAO(offset_abs[c_idx][i], ff_vvc_sao_offset_abs_decode(lc));
2599
2600 if (sao->type_idx[c_idx] == SAO_BAND) {
2601 for (i = 0; i < 4; i++) {
2602 if (sao->offset_abs[c_idx][i]) {
2603 SET_SAO(offset_sign[c_idx][i],
2605 } else {
2606 sao->offset_sign[c_idx][i] = 0;
2607 }
2608 }
2609 SET_SAO(band_position[c_idx], ff_vvc_sao_band_position_decode(lc));
2610 } else if (c_idx != 2) {
2611 SET_SAO(eo_class[c_idx], ff_vvc_sao_eo_class_decode(lc));
2612 }
2613
2614 // Inferred parameters
2615 sao->offset_val[c_idx][0] = 0;
2616 for (i = 0; i < 4; i++) {
2617 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
2618 if (sao->type_idx[c_idx] == SAO_EDGE) {
2619 if (i > 1)
2620 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
2621 } else if (sao->offset_sign[c_idx][i]) {
2622 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
2623 }
2624 sao->offset_val[c_idx][i + 1] *= 1 << (fc->ps.sps->bit_depth - FFMIN(10, fc->ps.sps->bit_depth));
2625 }
2626 }
2627}
2628
2629static void alf_params(VVCLocalContext *lc, const int rx, const int ry)
2630{
2631 const VVCFrameContext *fc = lc->fc;
2632 const H266RawSliceHeader *sh = lc->sc->sh.r;
2633 ALFParams *alf = &CTB(fc->tab.alf, rx, ry);
2634
2635 alf->ctb_flag[LUMA] = alf->ctb_flag[CB] = alf->ctb_flag[CR] = 0;
2636 alf->ctb_cc_idc[0] = alf->ctb_cc_idc[1] = 0;
2637 if (sh->sh_alf_enabled_flag) {
2638 alf->ctb_flag[LUMA] = ff_vvc_alf_ctb_flag(lc, rx, ry, LUMA);
2639 if (alf->ctb_flag[LUMA]) {
2640 uint8_t alf_use_aps_flag = 0;
2641 if (sh->sh_num_alf_aps_ids_luma > 0)
2642 alf_use_aps_flag = ff_vvc_alf_use_aps_flag(lc);
2643 if (alf_use_aps_flag) {
2644 alf->ctb_filt_set_idx_y = 16;
2645 if (sh->sh_num_alf_aps_ids_luma > 1)
2647 } else {
2649 }
2650 }
2651 for (int c_idx = CB; c_idx <= CR; c_idx++) {
2652 const uint8_t alf_enabled_flag =
2654 if (alf_enabled_flag) {
2655 const VVCALF *aps = fc->ps.alf_list[sh->sh_alf_aps_id_chroma];
2656 alf->ctb_flag[c_idx] = ff_vvc_alf_ctb_flag(lc, rx, ry, c_idx);
2657 alf->alf_ctb_filter_alt_idx[c_idx - 1] = 0;
2658 if (alf->ctb_flag[c_idx] && aps->num_chroma_filters > 1)
2659 alf->alf_ctb_filter_alt_idx[c_idx - 1] = ff_vvc_alf_ctb_filter_alt_idx(lc, c_idx, aps->num_chroma_filters);
2660 }
2661 }
2662 }
2663 if (fc->ps.sps->r->sps_ccalf_enabled_flag) {
2664 const uint8_t cc_enabled[] = { sh->sh_alf_cc_cb_enabled_flag, sh->sh_alf_cc_cr_enabled_flag };
2665 const uint8_t cc_aps_id[] = { sh->sh_alf_cc_cb_aps_id, sh->sh_alf_cc_cr_aps_id };
2666 for (int i = 0; i < 2; i++) {
2667 if (cc_enabled[i]) {
2668 const VVCALF *aps = fc->ps.alf_list[cc_aps_id[i]];
2669 alf->ctb_cc_idc[i] = ff_vvc_alf_ctb_cc_idc(lc, rx, ry, i, aps->num_cc_filters[i]);
2670 }
2671 }
2672 }
2673}
2674
2675static void deblock_params(VVCLocalContext *lc, const int rx, const int ry)
2676{
2677 VVCFrameContext *fc = lc->fc;
2678 const VVCSH *sh = &lc->sc->sh;
2679 CTB(fc->tab.deblock, rx, ry) = sh->deblock;
2680}
2681
2683 const int x0, const int y0, const int ctu_idx, const int rx, const int ry)
2684{
2685 const VVCFrameContext *fc = lc->fc;
2686 const VVCSPS *sps = fc->ps.sps;
2687 const VVCPPS *pps = fc->ps.pps;
2688 const VVCSH *sh = &lc->sc->sh;
2689 const H266RawSliceHeader *rsh = sh->r;
2690 const unsigned int ctb_size = sps->ctb_size_y;
2691 int ret = 0;
2692
2693 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
2694
2695 hls_sao(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
2696 alf_params(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
2697 deblock_params(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
2698
2699 if (IS_I(rsh) && sps->r->sps_qtbtt_dual_tree_intra_flag)
2700 ret = dual_tree_implicit_qt_split(lc, x0, y0, ctb_size, 0);
2701 else
2702 ret = hls_coding_tree(lc, x0, y0, ctb_size, ctb_size,
2703 1, 1, 0, 0, 0, 0, 0, SPLIT_NONE, SINGLE_TREE, MODE_TYPE_ALL);
2704 if (ret < 0)
2705 return ret;
2706
2707 if (rx == pps->ctb_to_col_bd[rx + 1] - 1) {
2708 if (ctu_idx == sh->num_ctus_in_curr_slice - 1) {
2709 const int end_of_slice_one_bit = ff_vvc_end_of_slice_flag_decode(lc);
2710 if (!end_of_slice_one_bit)
2711 return AVERROR_INVALIDDATA;
2712 } else {
2713 if (ry == pps->ctb_to_row_bd[ry + 1] - 1) {
2714 const int end_of_tile_one_bit = ff_vvc_end_of_tile_one_bit(lc);
2715 if (!end_of_tile_one_bit)
2716 return AVERROR_INVALIDDATA;
2717 } else {
2718 if (fc->ps.sps->r->sps_entropy_coding_sync_enabled_flag) {
2719 const int end_of_subset_one_bit = ff_vvc_end_of_subset_one_bit(lc);
2720 if (!end_of_subset_one_bit)
2721 return AVERROR_INVALIDDATA;
2722 }
2723 }
2724 }
2725 }
2726
2727 return 0;
2728}
2729
2730static int has_inter_luma(const CodingUnit *cu)
2731{
2732 return cu->pred_mode != MODE_INTRA && cu->pred_mode != MODE_PLT && cu->tree_type != DUAL_TREE_CHROMA;
2733}
2734
2735static int pred_get_y(const VVCLocalContext *lc, const int y0, const Mv *mv, const int height)
2736{
2737 const VVCPPS *pps = lc->fc->ps.pps;
2738 const int idx = lc->sc->sh.r->curr_subpic_idx;
2739 const int top = pps->subpic_y[idx];
2740 const int bottom = top + pps->subpic_height[idx];
2741
2742 return av_clip(y0 + (mv->y >> 4) + height, top, bottom);
2743}
2744
2745static void cu_get_max_y(const CodingUnit *cu, int max_y[2][VVC_MAX_REF_ENTRIES], const VVCLocalContext *lc)
2746{
2747 const VVCFrameContext *fc = lc->fc;
2748 const PredictionUnit *pu = &cu->pu;
2749
2750 if (pu->merge_gpm_flag) {
2751 for (int i = 0; i < FF_ARRAY_ELEMS(pu->gpm_mv); i++) {
2752 const MvField *mvf = pu->gpm_mv + i;
2753 const int lx = mvf->pred_flag - PF_L0;
2754 const int idx = mvf->ref_idx[lx];
2755 const int y = pred_get_y(lc, cu->y0, mvf->mv + lx, cu->cb_height);
2756
2757 max_y[lx][idx] = FFMAX(max_y[lx][idx], y);
2758 }
2759 } else {
2760 const MotionInfo *mi = &pu->mi;
2761 const int max_dmvr_off = (!pu->inter_affine_flag && pu->dmvr_flag) ? 2 : 0;
2762 const int sbw = cu->cb_width / mi->num_sb_x;
2763 const int sbh = cu->cb_height / mi->num_sb_y;
2764 for (int sby = 0; sby < mi->num_sb_y; sby++) {
2765 for (int sbx = 0; sbx < mi->num_sb_x; sbx++) {
2766 const int x0 = cu->x0 + sbx * sbw;
2767 const int y0 = cu->y0 + sby * sbh;
2768 const MvField *mvf = ff_vvc_get_mvf(fc, x0, y0);
2769 for (int lx = 0; lx < 2; lx++) {
2770 const PredFlag mask = 1 << lx;
2771 if (mvf->pred_flag & mask) {
2772 const int idx = mvf->ref_idx[lx];
2773 const int y = pred_get_y(lc, y0, mvf->mv + lx, sbh);
2774
2775 max_y[lx][idx] = FFMAX(max_y[lx][idx], y + max_dmvr_off);
2776 }
2777 }
2778 }
2779 }
2780 }
2781}
2782
2783static void ctu_get_pred(VVCLocalContext *lc, const int rs)
2784{
2785 const VVCFrameContext *fc = lc->fc;
2786 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2787 CTU *ctu = fc->tab.ctus + rs;
2788 const CodingUnit *cu = fc->tab.cus[rs];
2789
2790 ctu->has_dmvr = 0;
2791
2792 if (IS_I(rsh))
2793 return;
2794
2795 for (int lx = 0; lx < 2; lx++)
2796 memset(ctu->max_y[lx], -1, sizeof(ctu->max_y[0][0]) * rsh->num_ref_idx_active[lx]);
2797
2798 while (cu) {
2799 if (has_inter_luma(cu)) {
2800 cu_get_max_y(cu, ctu->max_y, lc);
2801 ctu->has_dmvr |= cu->pu.dmvr_flag;
2802 }
2803 cu = cu->next;
2804 }
2805 ctu->max_y_idx[0] = ctu->max_y_idx[1] = 0;
2806}
2807
2809 const int ctu_idx, const int rs, const int rx, const int ry)
2810{
2811 const VVCFrameContext *fc = lc->fc;
2812 const VVCSPS *sps = fc->ps.sps;
2813 const VVCPPS *pps = fc->ps.pps;
2814 const int x_ctb = rx << sps->ctb_log2_size_y;
2815 const int y_ctb = ry << sps->ctb_log2_size_y;
2816 const int ctb_size = 1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y;
2817 EntryPoint* ep = lc->ep;
2818 int ret;
2819
2820 if (rx == pps->ctb_to_col_bd[rx]) {
2821 ep->num_hmvp = 0;
2822 ep->num_hmvp_ibc = 0;
2823 ep->is_first_qg = ry == pps->ctb_to_row_bd[ry] || !ctu_idx;
2824 }
2825
2826 lc->coeffs = fc->tab.coeffs + rs * ctb_size * VVC_MAX_SAMPLE_ARRAYS;
2827 lc->cu = NULL;
2828
2829 ff_vvc_cabac_init(lc, ctu_idx, rx, ry);
2830 ff_vvc_decode_neighbour(lc, x_ctb, y_ctb, rx, ry, rs);
2831 ret = hls_coding_tree_unit(lc, x_ctb, y_ctb, ctu_idx, rx, ry);
2832 if (ret < 0)
2833 return ret;
2834 ctu_get_pred(lc, rs);
2835
2836 return 0;
2837}
2838
2839void ff_vvc_decode_neighbour(VVCLocalContext *lc, const int x_ctb, const int y_ctb,
2840 const int rx, const int ry, const int rs)
2841{
2842 VVCFrameContext *fc = lc->fc;
2843 const int ctb_size = fc->ps.sps->ctb_size_y;
2844
2845 lc->end_of_tiles_x = fc->ps.pps->width;
2846 lc->end_of_tiles_y = fc->ps.pps->height;
2847 if (fc->ps.pps->ctb_to_col_bd[rx] != fc->ps.pps->ctb_to_col_bd[rx + 1])
2848 lc->end_of_tiles_x = FFMIN(x_ctb + ctb_size, lc->end_of_tiles_x);
2849 if (fc->ps.pps->ctb_to_row_bd[ry] != fc->ps.pps->ctb_to_row_bd[ry + 1])
2850 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, lc->end_of_tiles_y);
2851
2852 lc->boundary_flags = 0;
2853 if (rx > 0 && fc->ps.pps->ctb_to_col_bd[rx] != fc->ps.pps->ctb_to_col_bd[rx - 1])
2855 if (rx > 0 && fc->tab.slice_idx[rs] != fc->tab.slice_idx[rs - 1])
2857 if (ry > 0 && fc->ps.pps->ctb_to_row_bd[ry] != fc->ps.pps->ctb_to_row_bd[ry - 1])
2859 if (ry > 0 && fc->tab.slice_idx[rs] != fc->tab.slice_idx[rs - fc->ps.pps->ctb_width])
2861 if (fc->ps.sps->r->sps_subpic_ctu_top_left_x[lc->sc->sh.r->curr_subpic_idx] == rx)
2863 if (fc->ps.sps->r->sps_subpic_ctu_top_left_y[lc->sc->sh.r->curr_subpic_idx] == ry)
2865 lc->ctb_left_flag = rx > 0 && !(lc->boundary_flags & BOUNDARY_LEFT_TILE);
2867 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]) &&
2868 (fc->ps.pps->ctb_to_row_bd[ry] == fc->ps.pps->ctb_to_row_bd[ry - 1]);
2870}
2871
2873 const int x0, const int y0, const int w, const int h)
2874{
2875 const int log2_ctb_size = lc->fc->ps.sps->ctb_log2_size_y;
2876 const int x0b = av_zero_extend(x0, log2_ctb_size);
2877 const int y0b = av_zero_extend(y0, log2_ctb_size);
2878
2879 lc->na.cand_up = (lc->ctb_up_flag || y0b);
2880 lc->na.cand_left = (lc->ctb_left_flag || x0b);
2881 lc->na.cand_up_left = (x0b || y0b) ? lc->na.cand_left && lc->na.cand_up : lc->ctb_up_left_flag;
2882 lc->na.cand_up_right_sap =
2883 (x0b + w == 1 << log2_ctb_size) ? lc->ctb_up_right_flag && !y0b : lc->na.cand_up;
2884 lc->na.cand_up_right = lc->na.cand_up_right_sap && (x0 + w) < lc->end_of_tiles_x;
2885}
2886
2888{
2889 while (*cus) {
2890 CodingUnit *cu = *cus;
2891 TransformUnit **head = &cu->tus.head;
2892
2893 *cus = cu->next;
2894
2895 while (*head) {
2896 TransformUnit *tu = *head;
2897 *head = tu->next;
2898 av_refstruct_unref(&tu);
2899 }
2900 cu->tus.tail = NULL;
2901
2902 av_refstruct_unref(&cu);
2903 }
2904}
2905
2906int ff_vvc_get_qPy(const VVCFrameContext *fc, const int xc, const int yc)
2907{
2908 const int min_cb_log2_size_y = fc->ps.sps->min_cb_log2_size_y;
2909 const int x = xc >> min_cb_log2_size_y;
2910 const int y = yc >> min_cb_log2_size_y;
2911 return fc->tab.qp[LUMA][x + y * fc->ps.pps->min_cb_width];
2912}
2913
2915 const int bit_depth, const int persistent_rice_adaptation_enabled_flag)
2916{
2917 for (size_t i = 0; i < FF_ARRAY_ELEMS(ep->stat_coeff); ++i) {
2918 ep->stat_coeff[i] =
2919 persistent_rice_adaptation_enabled_flag ? 2 * (av_log2(bit_depth - 10)) : 0;
2920 }
2921}
2922
2923void ff_vvc_channel_range(int *start, int *end, const VVCTreeType tree_type, const uint8_t chroma_format_idc)
2924{
2925 const bool has_chroma = chroma_format_idc && tree_type != DUAL_TREE_LUMA;
2926 const bool has_luma = tree_type != DUAL_TREE_CHROMA;
2927
2928 *start = has_luma ? LUMA : CB;
2929 *end = has_chroma ? VVC_MAX_SAMPLE_ARRAYS : CB;
2930}
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:1795
static void alf_params(VVCLocalContext *lc, const int rx, const int ry)
Definition ctu.c:2629
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:1914
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:1609
static int mvp_data(VVCLocalContext *lc)
Definition ctu.c:1654
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:2435
static void merge_data_block(VVCLocalContext *lc)
Definition ctu.c:1444
void ff_vvc_channel_range(int *start, int *end, const VVCTreeType tree_type, const uint8_t chroma_format_idc)
Definition ctu.c:2923
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:2735
static int has_inter_luma(const CodingUnit *cu)
Definition ctu.c:2730
static void merge_data_ciip(VVCLocalContext *lc)
Definition ctu.c:1423
#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:2284
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:2682
static void ctu_get_pred(VVCLocalContext *lc, const int rs)
Definition ctu.c:2783
static void hls_mvd_coding(VVCLocalContext *lc, Mv *mvd)
Definition ctu.c:1520
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:1495
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:2498
static void derive_dmvr_bdof_flag(const VVCLocalContext *lc, PredictionUnit *pu)
Definition ctu.c:1723
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:2261
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:1988
#define PALETTE_SET_PIXEL(xc, yc, pix)
Definition ctu.c:1968
static void cu_get_max_y(const CodingUnit *cu, int max_y[2][VVC_MAX_REF_ENTRIES], const VVCLocalContext *lc)
Definition ctu.c:2745
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:1943
static int bcw_idx_decode(VVCLocalContext *lc, const MotionInfo *mi, const int cb_width, const int cb_height)
Definition ctu.c:1544
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:2872
#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:1829
static void merge_data_regular(VVCLocalContext *lc)
Definition ctu.c:1363
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:2398
#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:1474
static int intra_data(VVCLocalContext *lc)
Definition ctu.c:2149
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:1349
#define SET_SAO(elem, value)
Definition ctu.c:2548
static int palette_signaled(VVCLocalContext *lc, const bool local_dual_tree, const int start, const int end, const int max_entries)
Definition ctu.c:1886
void ff_vvc_ctu_free_cus(CodingUnit **cus)
Definition ctu.c:2887
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:2808
#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:2839
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:2430
int ff_vvc_get_qPy(const VVCFrameContext *fc, const int xc, const int yc)
Definition ctu.c:2906
static void deblock_params(VVCLocalContext *lc, const int rx, const int ry)
Definition ctu.c:2675
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:1340
#define TRAV_Y(pos)
Definition ctu.c:1986
#define PALETTE_INDEX(x, y)
Definition ctu.c:1977
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:1852
static int8_t ref_idx_decode(VVCLocalContext *lc, const VVCSH *sh, const int sym_mvd_flag, const int lx)
Definition ctu.c:1565
static int mvp_data_ibc(VVCLocalContext *lc)
Definition ctu.c:1624
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:2368
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:2083
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:2338
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:1326
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:1393
static void hls_sao(VVCLocalContext *lc, const int rx, const int ry)
Definition ctu.c:2560
static void merge_data_gpm(VVCLocalContext *lc)
Definition ctu.c:1405
#define SKIPPED_TRANSFORM_TREE(x, y)
static void refine_regular_subblock(const VVCLocalContext *lc)
Definition ctu.c:1762
static void fill_dmvr_info(const VVCLocalContext *lc)
Definition ctu.c:1774
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:2311
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:1577
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:2914
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:2239
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:2443
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:1985
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:2179
#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
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:2230
#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:120
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:297
#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:552
uint8_t sps_chroma_format_idc
Definition cbs_h266.h:314
uint8_t sh_alf_cr_enabled_flag
Definition cbs_h266.h:787
uint8_t sh_alf_cb_enabled_flag
Definition cbs_h266.h:786
uint8_t sh_alf_enabled_flag
Definition cbs_h266.h:783
uint8_t num_ref_idx_active[2]
NumRefIdxActive[].
Definition cbs_h266.h:839
int8_t sh_cb_qp_offset
Definition cbs_h266.h:808
uint8_t sh_num_alf_aps_ids_luma
Definition cbs_h266.h:784
uint8_t sh_cu_chroma_qp_offset_enabled_flag
Definition cbs_h266.h:811
uint8_t sh_alf_cc_cb_enabled_flag
Definition cbs_h266.h:789
uint8_t sh_sao_chroma_used_flag
Definition cbs_h266.h:814
uint8_t sh_alf_cc_cr_enabled_flag
Definition cbs_h266.h:791
uint16_t curr_subpic_idx
CurrSubpicIdx.
Definition cbs_h266.h:837
uint8_t sh_sao_luma_used_flag
Definition cbs_h266.h:813
int8_t sh_joint_cbcr_qp_offset
Definition cbs_h266.h:810
uint8_t sh_alf_aps_id_chroma
Definition cbs_h266.h:788
uint8_t sh_alf_cc_cb_aps_id
Definition cbs_h266.h:790
int8_t sh_cr_qp_offset
Definition cbs_h266.h:809
uint8_t sh_alf_cc_cr_aps_id
Definition cbs_h266.h:792
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:89
#define width
Definition dsp.h:89
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:1271
int ff_vvc_abs_mvd_greater0_flag(VVCLocalContext *lc)
Definition cabac.c:1615
int ff_vvc_end_of_slice_flag_decode(VVCLocalContext *lc)
Definition cabac.c:2559
int ff_vvc_pred_mode_ibc_flag(VVCLocalContext *lc, const int is_chroma)
Definition cabac.c:1282
int ff_vvc_palette_predictor_run(VVCLocalContext *lc, const int max)
Definition cabac.c:1388
int ff_vvc_palette_escape_val(VVCLocalContext *lc, const int max)
Definition cabac.c:1435
int ff_vvc_mmvd_merge_flag(VVCLocalContext *lc)
Definition cabac.c:1478
int ff_vvc_sao_offset_abs_decode(VVCLocalContext *lc)
Definition cabac.c:1036
int ff_vvc_sbt_quad_flag(VVCLocalContext *lc)
Definition cabac.c:2522
int ff_vvc_intra_bdpcm_luma_dir_flag(VVCLocalContext *lc)
Definition cabac.c:1261
int ff_vvc_cclm_mode_idx(VVCLocalContext *lc)
Definition cabac.c:1374
int ff_vvc_cabac_init(VVCLocalContext *lc, const int ctu_idx, const int rx, const int ry)
Definition cabac.c:845
int ff_vvc_cu_skip_flag(VVCLocalContext *lc, const uint8_t *cu_skip_flag)
Definition cabac.c:1276
int ff_vvc_cclm_mode_flag(VVCLocalContext *lc)
Definition cabac.c:1369
int ff_vvc_end_of_tile_one_bit(VVCLocalContext *lc)
Definition cabac.c:2564
int ff_vvc_end_of_subset_one_bit(VVCLocalContext *lc)
Definition cabac.c:2569
int ff_vvc_alf_luma_fixed_filter_idx(VVCLocalContext *lc)
Definition cabac.c:1081
int ff_vvc_abs_mvd_minus2(VVCLocalContext *lc)
Definition cabac.c:1625
int ff_vvc_intra_luma_not_planar_flag(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
Definition cabac.c:1351
int ff_vvc_mmvd_cand_flag(VVCLocalContext *lc)
Definition cabac.c:1483
int ff_vvc_merge_gpm_partition_idx(VVCLocalContext *lc)
Definition cabac.c:1545
int ff_vvc_intra_bdpcm_luma_flag(VVCLocalContext *lc)
Definition cabac.c:1256
int ff_vvc_sao_offset_sign_decode(VVCLocalContext *lc)
Definition cabac.c:1046
int ff_vvc_alf_luma_prev_filter_idx(VVCLocalContext *lc)
Definition cabac.c:1076
int ff_vvc_sbt_pos_flag(VVCLocalContext *lc)
Definition cabac.c:2535
int ff_vvc_sao_type_idx_decode(VVCLocalContext *lc)
Definition cabac.c:1021
int ff_vvc_lfnst_idx(VVCLocalContext *lc, const int inc)
Definition cabac.c:2540
int ff_vvc_intra_subpartitions_mode_flag(VVCLocalContext *lc)
Definition cabac.c:1334
int ff_vvc_ciip_flag(VVCLocalContext *lc)
Definition cabac.c:1564
int ff_vvc_sym_mvd_flag(VVCLocalContext *lc)
Definition cabac.c:1595
int ff_vvc_alf_use_aps_flag(VVCLocalContext *lc)
Definition cabac.c:1071
int ff_vvc_intra_bdpcm_chroma_flag(VVCLocalContext *lc)
Definition cabac.c:1266
int ff_vvc_amvr_shift(VVCLocalContext *lc, const int inter_affine_flag, const PredMode pred_mode, const int has_amvr_flag)
Definition cabac.c:1656
int ff_vvc_pred_mode_flag(VVCLocalContext *lc, const int is_chroma)
Definition cabac.c:1240
int ff_vvc_intra_luma_mpm_flag(VVCLocalContext *lc)
Definition cabac.c:1346
int ff_vvc_cu_chroma_qp_offset_idx(VVCLocalContext *lc)
Definition cabac.c:1757
int ff_vvc_cu_chroma_qp_offset_flag(VVCLocalContext *lc)
Definition cabac.c:1752
int ff_vvc_mvp_lx_flag(VVCLocalContext *lc)
Definition cabac.c:1635
int ff_vvc_intra_mip_mode(VVCLocalContext *lc)
Definition cabac.c:1315
int ff_vvc_mvd_sign_flag(VVCLocalContext *lc)
Definition cabac.c:1630
int ff_vvc_pred_mode_plt_flag(VVCLocalContext *lc)
Definition cabac.c:1251
int ff_vvc_cu_act_enabled_flag(VVCLocalContext *lc)
Definition cabac.c:1714
int ff_vvc_intra_luma_mpm_idx(VVCLocalContext *lc)
Definition cabac.c:1356
int ff_vvc_sbt_horizontal_flag(VVCLocalContext *lc)
Definition cabac.c:2527
bool ff_vvc_palette_escape_val_present_flag(VVCLocalContext *lc)
Definition cabac.c:1403
int ff_vvc_intra_luma_ref_idx(VVCLocalContext *lc)
Definition cabac.c:1324
int ff_vvc_sao_eo_class_decode(VVCLocalContext *lc)
Definition cabac.c:1051
int ff_vvc_sao_merge_flag_decode(VVCLocalContext *lc)
Definition cabac.c:1016
int ff_vvc_merge_gpm_idx(VVCLocalContext *lc, const int idx)
Definition cabac.c:1550
void ff_vvc_mmvd_offset_coding(VVCLocalContext *lc, Mv *mmvd_offset, const int ph_mmvd_fullpel_only_flag)
Definition cabac.c:1503
int ff_vvc_cu_coded_flag(VVCLocalContext *lc)
Definition cabac.c:2509
int ff_vvc_cu_affine_type_flag(VVCLocalContext *lc)
Definition cabac.c:1590
int ff_vvc_sbt_flag(VVCLocalContext *lc)
Definition cabac.c:2514
int ff_vvc_regular_merge_flag(VVCLocalContext *lc, const int cu_skip_flag)
Definition cabac.c:1472
VVCSplitMode ff_vvc_split_mode(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height, const int cqt_depth, const int mtt_depth, const int ch_type, const VVCAllowedSplit *a)
Definition cabac.c:1196
int ff_vvc_intra_chroma_pred_mode(VVCLocalContext *lc)
Definition cabac.c:1381
int ff_vvc_alf_ctb_cc_idc(VVCLocalContext *lc, const int rx, const int ry, const int idx, const int cc_filters_signalled)
Definition cabac.c:1096
int ff_vvc_intra_mip_flag(VVCLocalContext *lc, const uint8_t *intra_mip_flag)
Definition cabac.c:1302
bool ff_vvc_copy_above_palette_indices_flag(VVCLocalContext *lc)
Definition cabac.c:1425
int ff_vvc_alf_ctb_filter_alt_idx(VVCLocalContext *lc, const int c_idx, const int num_chroma_filters)
Definition cabac.c:1086
int ff_vvc_mts_idx(VVCLocalContext *lc)
Definition cabac.c:2549
int ff_vvc_residual_coding(VVCLocalContext *lc, TransformBlock *tb)
Definition cabac.c:2501
int ff_vvc_tu_cr_coded_flag(VVCLocalContext *lc, int tu_cb_coded_flag)
Definition cabac.c:1695
int ff_vvc_split_cu_flag(VVCLocalContext *lc, const int x0, const int y0, const int cb_width, const int cb_height, const int is_chroma, const VVCAllowedSplit *a)
Definition cabac.c:1118
int ff_vvc_merge_subblock_idx(VVCLocalContext *lc, const int max_num_subblock_merge_cand)
Definition cabac.c:1462
int ff_vvc_tu_cb_coded_flag(VVCLocalContext *lc)
Definition cabac.c:1690
int ff_vvc_new_palette_entries(VVCLocalContext *lc, const int bit_depth)
Definition cabac.c:1398
int ff_vvc_merge_subblock_flag(VVCLocalContext *lc)
Definition cabac.c:1456
bool ff_vvc_palette_transpose_flag(VVCLocalContext *lc)
Definition cabac.c:1408
int ff_vvc_non_inter_flag(VVCLocalContext *lc, const int x0, const int y0, const int ch_type)
Definition cabac.c:1230
int ff_vvc_alf_ctb_flag(VVCLocalContext *lc, const int rx, const int ry, const int c_idx)
Definition cabac.c:1056
int ff_vvc_abs_mvd_greater1_flag(VVCLocalContext *lc)
Definition cabac.c:1620
bool ff_vvc_run_copy_flag(VVCLocalContext *lc, const int prev_run_type, const int prev_run_position, const int cur_pos)
Definition cabac.c:1413
int ff_vvc_sao_band_position_decode(VVCLocalContext *lc)
Definition cabac.c:1031
int ff_vvc_tu_y_coded_flag(VVCLocalContext *lc)
Definition cabac.c:1700
int ff_vvc_intra_mip_transposed_flag(VVCLocalContext *lc)
Definition cabac.c:1310
int ff_vvc_num_signalled_palette_entries(VVCLocalContext *lc, const int max)
Definition cabac.c:1393
int ff_vvc_bcw_idx(VVCLocalContext *lc, const int no_backward_pred_flag)
Definition cabac.c:1679
int ff_vvc_intra_luma_mpm_remainder(VVCLocalContext *lc)
Definition cabac.c:1364
int ff_vvc_transform_skip_flag(VVCLocalContext *lc, const int inc)
Definition cabac.c:1816
int ff_vvc_tu_joint_cbcr_residual_flag(VVCLocalContext *lc, const int tu_cb_coded_flag, const int tu_cr_coded_flag)
Definition cabac.c:1811
int ff_vvc_inter_affine_flag(VVCLocalContext *lc)
Definition cabac.c:1584
int ff_vvc_general_merge_flag(VVCLocalContext *lc)
Definition cabac.c:1440
int ff_vvc_cu_qp_delta_abs(VVCLocalContext *lc)
Definition cabac.c:1719
PredFlag ff_vvc_pred_flag(VVCLocalContext *lc, const int is_b)
Definition cabac.c:1569
int ff_vvc_cu_qp_delta_sign_flag(VVCLocalContext *lc)
Definition cabac.c:1747
int ff_vvc_ref_idx_lx(VVCLocalContext *lc, const uint8_t nb_refs)
Definition cabac.c:1600
enum IspType ff_vvc_isp_split_type(VVCLocalContext *lc, const int intra_subpartitions_mode_flag)
Definition cabac.c:1339
int ff_vvc_merge_idx(VVCLocalContext *lc)
Definition cabac.c:1530
int ff_vvc_palette_idx_idc(VVCLocalContext *lc, const int max_palette_index, const bool adjust)
Definition cabac.c:1430
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:1744
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:1941
MvField * ff_vvc_get_mvf(const VVCFrameContext *fc, const int x0, const int y0)
Definition mvs.c:1960
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_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:1735
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:1873
@ 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