FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vvc/ctu.c
Date: 2026-10-19 20:11:44
Exec Total Coverage
Lines: 1831 1878 97.5%
Functions: 89 89 100.0%
Branches: 1603 1752 91.5%

Line Branch Exec Source
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
37 typedef enum VVCModeType {
38 MODE_TYPE_ALL,
39 MODE_TYPE_INTER,
40 MODE_TYPE_INTRA,
41 } VVCModeType;
42
43 2436432 static void set_tb_size(const VVCFrameContext *fc, const TransformBlock *tb)
44 {
45 2436432 const int x_tb = tb->x0 >> MIN_TU_LOG2;
46 2436432 const int y_tb = tb->y0 >> MIN_TU_LOG2;
47 2436432 const int hs = fc->ps.sps->hshift[tb->c_idx];
48 2436432 const int vs = fc->ps.sps->vshift[tb->c_idx];
49 2436432 const int is_chroma = tb->c_idx != 0;
50 2436432 const int width = FFMAX(1, tb->tb_width >> (MIN_TU_LOG2 - hs));
51 2436432 const int end = y_tb + FFMAX(1, tb->tb_height >> (MIN_TU_LOG2 - vs));
52
53
2/2
✓ Branch 0 taken 11516530 times.
✓ Branch 1 taken 2436432 times.
13952962 for (int y = y_tb; y < end; y++) {
54 11516530 const int off = y * fc->ps.pps->min_tu_width + x_tb;
55 11516530 memset(fc->tab.tb_width [is_chroma] + off, tb->tb_width, width);
56 11516530 memset(fc->tab.tb_height[is_chroma] + off, tb->tb_height, width);
57 }
58 2436432 }
59
60 3358879 static void set_tb_tab(uint8_t *tab, uint8_t v, const VVCFrameContext *fc,
61 const TransformBlock *tb)
62 {
63 3358879 const int width = tb->tb_width << fc->ps.sps->hshift[tb->c_idx];
64 3358879 const int height = tb->tb_height << fc->ps.sps->vshift[tb->c_idx];
65
66
2/2
✓ Branch 0 taken 15528927 times.
✓ Branch 1 taken 3358879 times.
18887806 for (int h = 0; h < height; h += MIN_TU_SIZE) {
67 15528927 const int y = (tb->y0 + h) >> MIN_TU_LOG2;
68 15528927 const int off = y * fc->ps.pps->min_tu_width + (tb->x0 >> MIN_TU_LOG2);
69 15528927 const int w = FFMAX(1, width >> MIN_TU_LOG2);
70 15528927 memset(tab + off, v, w);
71 }
72 3358879 }
73
74 // 8.7.1 Derivation process for quantization parameters
75 6185 static int get_qp_y_pred(const VVCLocalContext *lc)
76 {
77 6185 const VVCFrameContext *fc = lc->fc;
78 6185 const VVCSPS *sps = fc->ps.sps;
79 6185 const VVCPPS *pps = fc->ps.pps;
80 6185 const CodingUnit *cu = lc->cu;
81 6185 const int ctb_log2_size = sps->ctb_log2_size_y;
82 6185 const int ctb_size_mask = (1 << ctb_log2_size) - 1;
83 6185 const int xQg = lc->parse.cu_qg_top_left_x;
84 6185 const int yQg = lc->parse.cu_qg_top_left_y;
85 6185 const int min_cb_width = fc->ps.pps->min_cb_width;
86 6185 const int x_cb = cu->x0 >> sps->min_cb_log2_size_y;
87 6185 const int y_cb = cu->y0 >> sps->min_cb_log2_size_y;
88 6185 const int rx = cu->x0 >> ctb_log2_size;
89 6185 const int ry = cu->y0 >> ctb_log2_size;
90
3/4
✓ Branch 0 taken 920 times.
✓ Branch 1 taken 5265 times.
✓ Branch 2 taken 920 times.
✗ Branch 3 not taken.
6185 const int in_same_ctb_a = ((xQg - 1) >> ctb_log2_size) == rx && (yQg >> ctb_log2_size) == ry;
91
3/4
✓ Branch 0 taken 6185 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 920 times.
✓ Branch 3 taken 5265 times.
6185 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
2/2
✓ Branch 0 taken 4682 times.
✓ Branch 1 taken 1503 times.
6185 if (lc->na.cand_up) {
95
4/4
✓ Branch 0 taken 3841 times.
✓ Branch 1 taken 841 times.
✓ Branch 2 taken 3381 times.
✓ Branch 3 taken 460 times.
4682 const int first_qg_in_ctu = !(xQg & ctb_size_mask) && !(yQg & ctb_size_mask);
96 4682 const int qPy_up = fc->tab.qp[LUMA][x_cb + (y_cb - 1) * min_cb_width];
97
4/4
✓ Branch 0 taken 3381 times.
✓ Branch 1 taken 1301 times.
✓ Branch 2 taken 778 times.
✓ Branch 3 taken 2603 times.
4682 if (first_qg_in_ctu && pps->ctb_to_col_bd[xQg >> ctb_log2_size] == xQg >> ctb_log2_size)
98 778 return qPy_up;
99 }
100
101 // qPy_pred
102
2/2
✓ Branch 0 taken 497 times.
✓ Branch 1 taken 4910 times.
5407 qPy_pred = lc->ep->is_first_qg ? lc->sc->sh.slice_qp_y : lc->ep->qp_y;
103
104 // qPy_b
105
4/4
✓ Branch 0 taken 3904 times.
✓ Branch 1 taken 1503 times.
✓ Branch 2 taken 2984 times.
✓ Branch 3 taken 920 times.
5407 if (!lc->na.cand_up || !in_same_ctb_b)
106 4487 qPy_b = qPy_pred;
107 else
108 920 qPy_b = fc->tab.qp[LUMA][x_cb + (y_cb - 1) * min_cb_width];
109
110 // qPy_a
111
4/4
✓ Branch 0 taken 4830 times.
✓ Branch 1 taken 577 times.
✓ Branch 2 taken 3910 times.
✓ Branch 3 taken 920 times.
5407 if (!lc->na.cand_left || !in_same_ctb_a)
112 4487 qPy_a = qPy_pred;
113 else
114 920 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 5407 return (qPy_a + qPy_b + 1) >> 1;
120 }
121
122 9997479 static void set_cb_tab(const VVCLocalContext *lc, uint8_t *tab, const uint8_t v)
123 {
124 9997479 const VVCFrameContext *fc = lc->fc;
125 9997479 const VVCPPS *pps = fc->ps.pps;
126 9997479 const CodingUnit *cu = lc->cu;
127 9997479 const int log2_min_cb_size = fc->ps.sps->min_cb_log2_size_y;
128 9997479 const int x_cb = cu->x0 >> log2_min_cb_size;
129 9997479 const int y_cb = cu->y0 >> log2_min_cb_size;
130 9997479 const int cb_width = cu->cb_width;
131 9997479 const int cb_height = cu->cb_height;
132 9997479 int x = y_cb * pps->min_cb_width + x_cb;
133
134
2/2
✓ Branch 0 taken 42359328 times.
✓ Branch 1 taken 9997479 times.
52356807 for (int y = 0; y < (cb_height >> log2_min_cb_size); y++) {
135 42359328 const int width = cb_width >> log2_min_cb_size;
136
137 42359328 memset(&tab[x], v, width);
138 42359328 x += pps->min_cb_width;
139 }
140 9997479 }
141
142 1398962 static int set_qp_y(VVCLocalContext *lc, const int x0, const int y0, const int has_qp_delta)
143 {
144 1398962 const VVCSPS *sps = lc->fc->ps.sps;
145 1398962 EntryPoint *ep = lc->ep;
146 1398962 CodingUnit *cu = lc->cu;
147 1398962 int cu_qp_delta = 0;
148
149
2/2
✓ Branch 0 taken 1228092 times.
✓ Branch 1 taken 170870 times.
1398962 if (!lc->fc->ps.pps->r->pps_cu_qp_delta_enabled_flag) {
150 1228092 ep->qp_y = lc->sc->sh.slice_qp_y;
151
6/6
✓ Branch 0 taken 170373 times.
✓ Branch 1 taken 497 times.
✓ Branch 2 taken 18798 times.
✓ Branch 3 taken 151575 times.
✓ Branch 4 taken 5688 times.
✓ Branch 5 taken 13110 times.
170870 } else if (ep->is_first_qg || (lc->parse.cu_qg_top_left_x == x0 && lc->parse.cu_qg_top_left_y == y0)) {
152 6185 ep->qp_y = get_qp_y_pred(lc);
153 6185 ep->is_first_qg = 0;
154 }
155
156
2/2
✓ Branch 0 taken 3618 times.
✓ Branch 1 taken 1395344 times.
1398962 if (has_qp_delta) {
157 3618 const int cu_qp_delta_abs = ff_vvc_cu_qp_delta_abs(lc);
158
159
2/2
✓ Branch 0 taken 1325 times.
✓ Branch 1 taken 2293 times.
3618 if (cu_qp_delta_abs)
160
2/2
✓ Branch 1 taken 746 times.
✓ Branch 2 taken 579 times.
1325 cu_qp_delta = ff_vvc_cu_qp_delta_sign_flag(lc) ? -cu_qp_delta_abs : cu_qp_delta_abs;
161
2/4
✓ Branch 0 taken 3618 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3618 times.
3618 if (cu_qp_delta > (31 + sps->qp_bd_offset / 2) || cu_qp_delta < -(32 + sps->qp_bd_offset / 2))
162 ✗ return AVERROR_INVALIDDATA;
163 3618 lc->parse.is_cu_qp_delta_coded = 1;
164
165
2/2
✓ Branch 0 taken 1325 times.
✓ Branch 1 taken 2293 times.
3618 if (cu_qp_delta) {
166 1325 int off = sps->qp_bd_offset;
167
1/2
✓ Branch 0 taken 1325 times.
✗ Branch 1 not taken.
1325 ep->qp_y = FFUMOD(ep->qp_y + cu_qp_delta + 64 + 2 * off, 64 + off) - off;
168 }
169 }
170
171 1398962 set_cb_tab(lc, lc->fc->tab.qp[LUMA], ep->qp_y);
172 1398962 cu->qp[LUMA] = ep->qp_y;
173
174 1398962 return 0;
175 }
176
177 1845332 static void set_qp_c_tab(const VVCLocalContext *lc, const TransformUnit *tu, const TransformBlock *tb)
178 {
179
6/6
✓ Branch 0 taken 109842 times.
✓ Branch 1 taken 1735490 times.
✓ Branch 2 taken 93482 times.
✓ Branch 3 taken 16360 times.
✓ Branch 4 taken 63304 times.
✓ Branch 5 taken 30178 times.
1845332 const int is_jcbcr = tu->joint_cbcr_residual_flag && tu->coded_flag[CB] && tu->coded_flag[CR];
180
2/2
✓ Branch 0 taken 1782028 times.
✓ Branch 1 taken 63304 times.
1845332 const int idx = is_jcbcr ? JCBCR : tb->c_idx;
181
182 1845332 set_tb_tab(lc->fc->tab.qp[tb->c_idx], lc->cu->qp[idx], lc->fc, tb);
183 1845332 }
184
185 1334230 static void set_qp_c(VVCLocalContext *lc)
186 {
187 1334230 const VVCFrameContext *fc = lc->fc;
188 1334230 const VVCSPS *sps = fc->ps.sps;
189 1334230 const VVCPPS *pps = fc->ps.pps;
190 1334230 const H266RawSliceHeader *rsh = lc->sc->sh.r;
191 1334230 CodingUnit *cu = lc->cu;
192 1334230 const int x_center = cu->x0 + cu->cb_width / 2;
193 1334230 const int y_center = cu->y0 + cu->cb_height / 2;
194 1334230 const int single_tree = cu->tree_type == SINGLE_TREE;
195
2/2
✓ Branch 0 taken 578051 times.
✓ Branch 1 taken 756179 times.
1334230 const int qp_luma = (single_tree ? lc->ep->qp_y : ff_vvc_get_qPy(fc, x_center, y_center)) + sps->qp_bd_offset;
196 1334230 const int qp_chroma = av_clip(qp_luma, 0, MAX_QP + sps->qp_bd_offset);
197 1334230 const int sh_chroma_qp_offset[] = {
198 1334230 rsh->sh_cb_qp_offset,
199 1334230 rsh->sh_cr_qp_offset,
200 1334230 rsh->sh_joint_cbcr_qp_offset,
201 };
202 int qp;
203
204
2/2
✓ Branch 0 taken 3955336 times.
✓ Branch 1 taken 1334230 times.
5289566 for (int i = CB - 1; i < CR + sps->r->sps_joint_cbcr_enabled_flag; i++) {
205 3955336 qp = sps->chroma_qp_table[i][qp_chroma];
206 3955336 qp = qp + pps->chroma_qp_offset[i] + sh_chroma_qp_offset[i] + lc->parse.chroma_qp_offset[i];
207 3955336 qp = av_clip(qp, -sps->qp_bd_offset, MAX_QP) + sps->qp_bd_offset;
208 3955336 cu->qp[i + 1] = qp;
209 }
210 1334230 }
211
212 1707344 static TransformUnit* alloc_tu(VVCFrameContext *fc, CodingUnit *cu)
213 {
214 1707344 TransformUnit *tu = av_refstruct_pool_get(fc->tu_pool);
215
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1707344 times.
1707344 if (!tu)
216 ✗ return NULL;
217
218 1707344 tu->next = NULL;
219
220
2/2
✓ Branch 0 taken 320414 times.
✓ Branch 1 taken 1386930 times.
1707344 if (cu->tus.tail)
221 320414 cu->tus.tail->next = tu;
222 else
223 1386930 cu->tus.head = tu;
224 1707344 cu->tus.tail = tu;
225
226 1707344 return tu;
227 }
228
229 1707344 static TransformUnit* add_tu(VVCFrameContext *fc, CodingUnit *cu, const int x0, const int y0, const int tu_width, const int tu_height)
230 {
231 1707344 TransformUnit *tu = alloc_tu(fc, cu);
232
233
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1707344 times.
1707344 if (!tu)
234 ✗ return NULL;
235
236 1707344 tu->x0 = x0;
237 1707344 tu->y0 = y0;
238 1707344 tu->width = tu_width;
239 1707344 tu->height = tu_height;
240 1707344 tu->joint_cbcr_residual_flag = 0;
241 1707344 memset(tu->coded_flag, 0, sizeof(tu->coded_flag));
242 1707344 tu->avail[LUMA] = tu->avail[CHROMA] = 0;
243 1707344 tu->nb_tbs = 0;
244
245 1707344 return tu;
246 }
247
248 3359098 static TransformBlock* add_tb(TransformUnit *tu, VVCLocalContext *lc,
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 3359098 tb = &tu->tbs[tu->nb_tbs++];
254 3359098 tb->has_coeffs = 0;
255 3359098 tb->x0 = x0;
256 3359098 tb->y0 = y0;
257 3359098 tb->tb_width = tb_width;
258 3359098 tb->tb_height = tb_height;
259 3359098 tb->log2_tb_width = av_log2(tb_width);
260 3359098 tb->log2_tb_height = av_log2(tb_height);
261
262 3359098 tb->max_scan_x = tb->max_scan_y = 0;
263 3359098 tb->min_scan_x = tb->min_scan_y = 0;
264
265 3359098 tb->c_idx = c_idx;
266 3359098 tb->ts = 0;
267 3359098 tb->coeffs = lc->coeffs;
268 3359098 lc->coeffs += tb_width * tb_height;
269 3359098 tu->avail[!!c_idx] = true;
270 3359098 return tb;
271 }
272
273 1027022 static 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 1027022 uint8_t tu_y_coded_flag = 0;
277 1027022 const VVCSPS *sps = lc->fc->ps.sps;
278 1027022 CodingUnit *cu = lc->cu;
279
280
2/2
✓ Branch 0 taken 981569 times.
✓ Branch 1 taken 45453 times.
1027022 if (!is_sbt_not_coded) {
281
4/4
✓ Branch 0 taken 834346 times.
✓ Branch 1 taken 147223 times.
✓ Branch 2 taken 52672 times.
✓ Branch 3 taken 781674 times.
981569 int has_y_coded_flag = sub_tu_index < cu->num_intra_subpartitions - 1 || !lc->parse.infer_tu_cbf_luma;
282
2/2
✓ Branch 0 taken 769139 times.
✓ Branch 1 taken 212430 times.
981569 if (!is_isp) {
283
4/4
✓ Branch 0 taken 754855 times.
✓ Branch 1 taken 14284 times.
✓ Branch 2 taken 2942 times.
✓ Branch 3 taken 751913 times.
769139 const int is_large = cu->cb_width > sps->max_tb_size_y || cu->cb_height > sps->max_tb_size_y;
284
8/8
✓ Branch 0 taken 573961 times.
✓ Branch 1 taken 195178 times.
✓ Branch 2 taken 6377 times.
✓ Branch 3 taken 567584 times.
✓ Branch 4 taken 131869 times.
✓ Branch 5 taken 69686 times.
✓ Branch 6 taken 4881 times.
✓ Branch 7 taken 126988 times.
769139 has_y_coded_flag = (cu->pred_mode == MODE_INTRA && !cu->act_enabled_flag) || is_chroma_coded || is_large;
285 }
286
2/2
✓ Branch 0 taken 842046 times.
✓ Branch 1 taken 139523 times.
981569 tu_y_coded_flag = has_y_coded_flag ? ff_vvc_tu_y_coded_flag(lc) : 1;
287 }
288
2/2
✓ Branch 0 taken 212430 times.
✓ Branch 1 taken 814592 times.
1027022 if (is_isp)
289
4/4
✓ Branch 0 taken 106220 times.
✓ Branch 1 taken 106210 times.
✓ Branch 2 taken 41013 times.
✓ Branch 3 taken 65207 times.
212430 lc->parse.infer_tu_cbf_luma = lc->parse.infer_tu_cbf_luma && !tu_y_coded_flag;
290 1027022 return tu_y_coded_flag;
291 }
292
293 529665 static void chroma_qp_offset_decode(VVCLocalContext *lc, const int is_128, const int is_chroma_coded)
294 {
295 529665 const VVCPPS *pps = lc->fc->ps.pps;
296 529665 const H266RawSliceHeader *rsh = lc->sc->sh.r;
297
298
4/4
✓ Branch 0 taken 520727 times.
✓ Branch 1 taken 8938 times.
✓ Branch 2 taken 202424 times.
✓ Branch 3 taken 318303 times.
529665 if ((is_128 || is_chroma_coded) &&
299
4/4
✓ Branch 0 taken 39307 times.
✓ Branch 1 taken 172055 times.
✓ Branch 2 taken 1029 times.
✓ Branch 3 taken 38278 times.
211362 rsh->sh_cu_chroma_qp_offset_enabled_flag && !lc->parse.is_cu_chroma_qp_offset_coded) {
300 1029 const int cu_chroma_qp_offset_flag = ff_vvc_cu_chroma_qp_offset_flag(lc);
301
1/2
✓ Branch 0 taken 1029 times.
✗ Branch 1 not taken.
1029 if (cu_chroma_qp_offset_flag) {
302 1029 int cu_chroma_qp_offset_idx = 0;
303
2/2
✓ Branch 0 taken 931 times.
✓ Branch 1 taken 98 times.
1029 if (pps->r->pps_chroma_qp_offset_list_len_minus1 > 0)
304 931 cu_chroma_qp_offset_idx = ff_vvc_cu_chroma_qp_offset_idx(lc);
305
2/2
✓ Branch 0 taken 3087 times.
✓ Branch 1 taken 1029 times.
4116 for (int i = CB - 1; i < JCBCR; i++)
306 3087 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 }
310 1029 lc->parse.is_cu_chroma_qp_offset_coded = 1;
311 }
312 529665 }
313
314 1220600 static 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 1220600 VVCFrameContext *fc = lc->fc;
317 1220600 const VVCSPS *sps = fc->ps.sps;
318 1220600 const VVCPPS *pps = fc->ps.pps;
319 1220600 CodingUnit *cu = lc->cu;
320 1220600 TransformUnit *tu = add_tu(fc, cu, x0, y0, tu_width, tu_height);
321 1220600 const int min_cb_width = pps->min_cb_width;
322 1220600 const VVCTreeType tree_type = cu->tree_type;
323
4/4
✓ Branch 0 taken 1213348 times.
✓ Branch 1 taken 7252 times.
✓ Branch 2 taken 1686 times.
✓ Branch 3 taken 1211662 times.
1220600 const int is_128 = cu->cb_width > 64 || cu->cb_height > 64;
324 1220600 const int is_isp = cu->isp_split_type != ISP_NO_SPLIT;
325
4/4
✓ Branch 0 taken 212430 times.
✓ Branch 1 taken 1008170 times.
✓ Branch 2 taken 65207 times.
✓ Branch 3 taken 147223 times.
1220600 const int is_isp_last_tu = is_isp && (sub_tu_index == cu->num_intra_subpartitions - 1);
326
4/4
✓ Branch 0 taken 90906 times.
✓ Branch 1 taken 1129694 times.
✓ Branch 2 taken 45453 times.
✓ Branch 3 taken 45453 times.
1311506 const int is_sbt_not_coded = cu->sbt_flag &&
327
6/6
✓ Branch 0 taken 23704 times.
✓ Branch 1 taken 21749 times.
✓ Branch 2 taken 45453 times.
✓ Branch 3 taken 23704 times.
✓ Branch 4 taken 23704 times.
✓ Branch 5 taken 21749 times.
90906 ((sub_tu_index == 0 && cu->sbt_pos_flag) || (sub_tu_index == 1 && !cu->sbt_pos_flag));
328
6/6
✓ Branch 0 taken 529665 times.
✓ Branch 1 taken 690935 times.
✓ Branch 2 taken 506193 times.
✓ Branch 3 taken 23472 times.
✓ Branch 4 taken 23318 times.
✓ Branch 5 taken 482875 times.
1243918 const int chroma_available = tree_type != DUAL_TREE_LUMA && sps->r->sps_chroma_format_idc &&
329
2/2
✓ Branch 0 taken 5917 times.
✓ Branch 1 taken 17401 times.
23318 (!is_isp || is_isp_last_tu);
330 int ret, xc, yc, wc, hc, is_chroma_coded;
331
332
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1220600 times.
1220600 if (!tu)
333 ✗ return AVERROR_INVALIDDATA;
334
335
4/4
✓ Branch 0 taken 336087 times.
✓ Branch 1 taken 884513 times.
✓ Branch 2 taken 7699 times.
✓ Branch 3 taken 328388 times.
1220600 if (tree_type == SINGLE_TREE && is_isp_last_tu) {
336 7699 const int x_cu = x0 >> fc->ps.sps->min_cb_log2_size_y;
337 7699 const int y_cu = y0 >> fc->ps.sps->min_cb_log2_size_y;
338 7699 xc = SAMPLE_CTB(fc->tab.cb_pos_x[ch_type], x_cu, y_cu);
339 7699 yc = SAMPLE_CTB(fc->tab.cb_pos_y[ch_type], x_cu, y_cu);
340 7699 wc = SAMPLE_CTB(fc->tab.cb_width[ch_type], x_cu, y_cu);
341 7699 hc = SAMPLE_CTB(fc->tab.cb_height[ch_type], x_cu, y_cu);
342 } else {
343 1212901 xc = x0, yc = y0, wc = tu_width, hc = tu_height;
344 }
345
346
4/4
✓ Branch 0 taken 488792 times.
✓ Branch 1 taken 731808 times.
✓ Branch 2 taken 444631 times.
✓ Branch 3 taken 44161 times.
1220600 if (chroma_available && !is_sbt_not_coded) {
347 444631 tu->coded_flag[CB] = ff_vvc_tu_cb_coded_flag(lc);
348 444631 tu->coded_flag[CR] = ff_vvc_tu_cr_coded_flag(lc, tu->coded_flag[CB]);
349 }
350
351
6/6
✓ Branch 0 taken 488792 times.
✓ Branch 1 taken 731808 times.
✓ Branch 2 taken 315088 times.
✓ Branch 3 taken 173704 times.
✓ Branch 4 taken 34651 times.
✓ Branch 5 taken 280437 times.
1220600 is_chroma_coded = chroma_available && (tu->coded_flag[CB] || tu->coded_flag[CR]);
352
353
2/2
✓ Branch 0 taken 1027022 times.
✓ Branch 1 taken 193578 times.
1220600 if (tree_type != DUAL_TREE_CHROMA) {
354 int has_qp_delta;
355 1027022 tu->coded_flag[LUMA] = tu_y_coded_flag_decode(lc, is_sbt_not_coded, sub_tu_index, is_isp, is_chroma_coded);
356
4/4
✓ Branch 0 taken 276928 times.
✓ Branch 1 taken 741156 times.
✓ Branch 2 taken 36866 times.
✓ Branch 3 taken 240062 times.
1018084 has_qp_delta = (is_128 || tu->coded_flag[LUMA] || is_chroma_coded) &&
357
6/6
✓ Branch 0 taken 1018084 times.
✓ Branch 1 taken 8938 times.
✓ Branch 2 taken 79631 times.
✓ Branch 3 taken 707329 times.
✓ Branch 4 taken 3618 times.
✓ Branch 5 taken 76013 times.
2045106 pps->r->pps_cu_qp_delta_enabled_flag && !lc->parse.is_cu_qp_delta_coded;
358 1027022 ret = set_qp_y(lc, x0, y0, has_qp_delta);
359
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1027022 times.
1027022 if (ret < 0)
360 ✗ return ret;
361 1027022 add_tb(tu, lc, x0, y0, tu_width, tu_height, LUMA);
362 }
363
2/2
✓ Branch 0 taken 529665 times.
✓ Branch 1 taken 690935 times.
1220600 if (tree_type != DUAL_TREE_LUMA) {
364 529665 chroma_qp_offset_decode(lc, is_128, is_chroma_coded);
365
2/2
✓ Branch 0 taken 488792 times.
✓ Branch 1 taken 40873 times.
529665 if (chroma_available) {
366 488792 const int hs = sps->hshift[CHROMA];
367 488792 const int vs = sps->vshift[CHROMA];
368 488792 add_tb(tu, lc, xc, yc, wc >> hs, hc >> vs, CB);
369 488792 add_tb(tu, lc, xc, yc, wc >> hs, hc >> vs, CR);
370 }
371 }
372
4/4
✓ Branch 0 taken 1174656 times.
✓ Branch 1 taken 45944 times.
✓ Branch 2 taken 942966 times.
✓ Branch 3 taken 231690 times.
1220600 if (sps->r->sps_joint_cbcr_enabled_flag && ((cu->pred_mode == MODE_INTRA &&
373
4/4
✓ Branch 0 taken 833822 times.
✓ Branch 1 taken 109144 times.
✓ Branch 2 taken 807691 times.
✓ Branch 3 taken 26131 times.
942966 (tu->coded_flag[CB] || tu->coded_flag[CR])) ||
374
5/6
✓ Branch 0 taken 58206 times.
✓ Branch 1 taken 981175 times.
✓ Branch 2 taken 25970 times.
✓ Branch 3 taken 32236 times.
✓ Branch 4 taken 161245 times.
✗ Branch 5 not taken.
1174656 (tu->coded_flag[CB] && tu->coded_flag[CR])) &&
375 chroma_available) {
376 161245 tu->joint_cbcr_residual_flag = ff_vvc_tu_joint_cbcr_residual_flag(lc, tu->coded_flag[1], tu->coded_flag[2]);
377 }
378
379
2/2
✓ Branch 0 taken 2004606 times.
✓ Branch 1 taken 1220600 times.
3225206 for (int i = 0; i < tu->nb_tbs; i++) {
380 2004606 TransformBlock *tb = &tu->tbs[i];
381 2004606 const int is_chroma = tb->c_idx != LUMA;
382 2004606 tb->has_coeffs = tu->coded_flag[tb->c_idx];
383
4/4
✓ Branch 0 taken 1056407 times.
✓ Branch 1 taken 948199 times.
✓ Branch 2 taken 308933 times.
✓ Branch 3 taken 747474 times.
2004606 if (tb->has_coeffs && is_chroma)
384
6/6
✓ Branch 0 taken 135229 times.
✓ Branch 1 taken 173704 times.
✓ Branch 2 taken 100578 times.
✓ Branch 3 taken 34651 times.
✓ Branch 4 taken 68926 times.
✓ Branch 5 taken 31652 times.
308933 tb->has_coeffs = tb->c_idx == CB ? 1 : !(tu->coded_flag[CB] && tu->joint_cbcr_residual_flag);
385
2/2
✓ Branch 0 taken 1024755 times.
✓ Branch 1 taken 979851 times.
2004606 if (tb->has_coeffs) {
386 1024755 tb->ts = cu->bdpcm_flag[tb->c_idx];
387
4/4
✓ Branch 0 taken 903613 times.
✓ Branch 1 taken 121142 times.
✓ Branch 2 taken 899930 times.
✓ Branch 3 taken 3683 times.
1024755 if (sps->r->sps_transform_skip_enabled_flag && !cu->bdpcm_flag[tb->c_idx] &&
388
4/4
✓ Branch 0 taken 883374 times.
✓ Branch 1 taken 16556 times.
✓ Branch 2 taken 876053 times.
✓ Branch 3 taken 7321 times.
899930 tb->tb_width <= sps->max_ts_size && tb->tb_height <= sps->max_ts_size &&
389
6/6
✓ Branch 0 taken 835542 times.
✓ Branch 1 taken 40511 times.
✓ Branch 2 taken 638843 times.
✓ Branch 3 taken 196699 times.
✓ Branch 4 taken 500263 times.
✓ Branch 5 taken 138580 times.
876053 !cu->sbt_flag && (is_chroma || !is_isp)) {
390 696962 tb->ts = ff_vvc_transform_skip_flag(lc, is_chroma);
391 }
392 1024755 ret = ff_vvc_residual_coding(lc, tb);
393
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1024755 times.
1024755 if (ret < 0)
394 ✗ return ret;
395 1024755 set_tb_tab(fc->tab.tu_coded_flag[tb->c_idx], tu->coded_flag[tb->c_idx], fc, tb);
396
2/2
✓ Branch 0 taken 24384 times.
✓ Branch 1 taken 955467 times.
979851 } else if (cu->act_enabled_flag) {
397 24384 memset(tb->coeffs, 0, tb->tb_width * tb->tb_height * sizeof(*tb->coeffs));
398 }
399
2/2
✓ Branch 0 taken 1515814 times.
✓ Branch 1 taken 488792 times.
2004606 if (tb->c_idx != CR)
400 1515814 set_tb_size(fc, tb);
401
2/2
✓ Branch 0 taken 488792 times.
✓ Branch 1 taken 1515814 times.
2004606 if (tb->c_idx == CB)
402 488792 set_tb_tab(fc->tab.tu_joint_cbcr_residual_flag, tu->joint_cbcr_residual_flag, fc, tb);
403 }
404
405 1220600 return 0;
406 }
407
408 1040858 static int hls_transform_tree(VVCLocalContext *lc, int x0, int y0,int tu_width, int tu_height, int ch_type)
409 {
410 1040858 const CodingUnit *cu = lc->cu;
411 1040858 const VVCSPS *sps = lc->fc->ps.sps;
412 int ret;
413
414 1040858 lc->parse.infer_tu_cbf_luma = 1;
415
4/4
✓ Branch 0 taken 975651 times.
✓ Branch 1 taken 65207 times.
✓ Branch 2 taken 930198 times.
✓ Branch 3 taken 45453 times.
1040858 if (cu->isp_split_type == ISP_NO_SPLIT && !cu->sbt_flag) {
416
4/4
✓ Branch 0 taken 919237 times.
✓ Branch 1 taken 10961 times.
✓ Branch 2 taken 1973 times.
✓ Branch 3 taken 917264 times.
943132 if (tu_width > sps->max_tb_size_y || tu_height > sps->max_tb_size_y) {
417
4/4
✓ Branch 0 taken 10961 times.
✓ Branch 1 taken 1973 times.
✓ Branch 2 taken 8066 times.
✓ Branch 3 taken 2895 times.
12934 const int ver_split_first = tu_width > sps->max_tb_size_y && tu_width > tu_height;
418
2/2
✓ Branch 0 taken 8066 times.
✓ Branch 1 taken 4868 times.
12934 const int trafo_width = ver_split_first ? (tu_width / 2) : tu_width;
419
2/2
✓ Branch 0 taken 4868 times.
✓ Branch 1 taken 8066 times.
12934 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
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 12934 times.
12934 TRANSFORM_TREE(x0, y0);
428
2/2
✓ Branch 0 taken 8066 times.
✓ Branch 1 taken 4868 times.
12934 if (ver_split_first)
429
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8066 times.
8066 TRANSFORM_TREE(x0 + trafo_width, y0);
430 else
431
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4868 times.
4868 TRANSFORM_TREE(x0, y0 + trafo_height);
432
433 } else {
434 917264 ret = hls_transform_unit(lc, x0, y0, tu_width, tu_height, 0, ch_type);
435
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 917264 times.
917264 if (ret < 0)
436 ✗ return ret;
437
438 }
439
2/2
✓ Branch 0 taken 45453 times.
✓ Branch 1 taken 65207 times.
110660 } else if (cu->sbt_flag) {
440
2/2
✓ Branch 0 taken 24022 times.
✓ Branch 1 taken 21431 times.
45453 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 24022 const int trafo_width = tu_width * lc->parse.sbt_num_fourths_tb0 / 4;
448
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 24022 times.
24022 TRANSFORM_UNIT(x0, trafo_width, 0);
449
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 24022 times.
24022 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 21431 const int trafo_height = tu_height * lc->parse.sbt_num_fourths_tb0 / 4;
460
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 21431 times.
21431 TRANSFORM_UNIT(y0, trafo_height, 0);
461
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 21431 times.
21431 TRANSFORM_UNIT(y0 + trafo_height, tu_height - trafo_height, 1);
462
463 #undef TRANSFORM_UNIT
464 }
465
2/2
✓ Branch 0 taken 40327 times.
✓ Branch 1 taken 24880 times.
65207 } else if (cu->isp_split_type == ISP_HOR_SPLIT) {
466 40327 const int trafo_height = tu_height / cu->num_intra_subpartitions;
467
2/2
✓ Branch 0 taken 135048 times.
✓ Branch 1 taken 40327 times.
175375 for (int i = 0; i < cu->num_intra_subpartitions; i++) {
468 135048 ret = hls_transform_unit(lc, x0, y0 + trafo_height * i, tu_width, trafo_height, i, 0);
469
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 135048 times.
135048 if (ret < 0)
470 ✗ return ret;
471 }
472
1/2
✓ Branch 0 taken 24880 times.
✗ Branch 1 not taken.
24880 } else if (cu->isp_split_type == ISP_VER_SPLIT) {
473 24880 const int trafo_width = tu_width / cu->num_intra_subpartitions;
474
2/2
✓ Branch 0 taken 77382 times.
✓ Branch 1 taken 24880 times.
102262 for (int i = 0; i < cu->num_intra_subpartitions; i++) {
475 77382 ret = hls_transform_unit(lc, x0 + trafo_width * i , y0, trafo_width, tu_height, i, 0);
476
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 77382 times.
77382 if (ret < 0)
477 ✗ return ret;
478 }
479 }
480
481 1040858 return 0;
482 }
483
484 594571 static int skipped_transform_tree(VVCLocalContext *lc, int x0, int y0,int tu_width, int tu_height)
485 {
486 594571 VVCFrameContext *fc = lc->fc;
487 594571 const CodingUnit *cu = lc->cu;
488 594571 const VVCSPS *sps = fc->ps.sps;
489
490
4/4
✓ Branch 0 taken 482590 times.
✓ Branch 1 taken 111981 times.
✓ Branch 2 taken 2823 times.
✓ Branch 3 taken 479767 times.
709375 if (tu_width > sps->max_tb_size_y || tu_height > sps->max_tb_size_y) {
491
4/4
✓ Branch 0 taken 111981 times.
✓ Branch 1 taken 2823 times.
✓ Branch 2 taken 76282 times.
✓ Branch 3 taken 35699 times.
114804 const int ver_split_first = tu_width > sps->max_tb_size_y && tu_width > tu_height;
492
2/2
✓ Branch 0 taken 76282 times.
✓ Branch 1 taken 38522 times.
114804 const int trafo_width = ver_split_first ? (tu_width / 2) : tu_width;
493
2/2
✓ Branch 0 taken 38522 times.
✓ Branch 1 taken 76282 times.
114804 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
501
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 114804 times.
114804 SKIPPED_TRANSFORM_TREE(x0, y0);
502
2/2
✓ Branch 0 taken 76282 times.
✓ Branch 1 taken 38522 times.
114804 if (ver_split_first)
503
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 76282 times.
76282 SKIPPED_TRANSFORM_TREE(x0 + trafo_width, y0);
504 else
505
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 38522 times.
38522 SKIPPED_TRANSFORM_TREE(x0, y0 + trafo_height);
506 } else {
507 479767 TransformUnit *tu = add_tu(fc, lc->cu, x0, y0, tu_width, tu_height);
508 int start, end;
509
510
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 479767 times.
479767 if (!tu)
511 ✗ return AVERROR_INVALIDDATA;
512 479767 ff_vvc_channel_range(&start, &end, cu->tree_type, sps->r->sps_chroma_format_idc);
513
2/2
✓ Branch 0 taken 1335369 times.
✓ Branch 1 taken 479767 times.
1815136 for (int i = start; i < end; i++) {
514 1335369 TransformBlock *tb = add_tb(tu, lc, x0, y0, tu_width >> sps->hshift[i], tu_height >> sps->vshift[i], i);
515
2/2
✓ Branch 0 taken 907568 times.
✓ Branch 1 taken 427801 times.
1335369 if (i != CR)
516 907568 set_tb_size(fc, tb);
517 }
518 }
519
520 594571 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
526 2277091 static 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 2277091 const VVCFrameContext *fc = lc->fc;
532 2277091 const VVCSH *sh = &lc->sc->sh;
533 2277091 const VVCSPS *sps = fc->ps.sps;
534 2277091 const VVCPPS *pps = fc->ps.pps;
535 2277091 const int chroma = tree_type == DUAL_TREE_CHROMA;
536 2277091 int min_cb_size_y = sps->min_cb_size_y;
537 2277091 int *qt = &split->qt;
538 2277091 int *btv = &split->btv;
539 2277091 int *bth = &split->bth;
540 2277091 int *ttv = &split->ttv;
541 2277091 int *tth = &split->tth;
542
543 2277091 *qt = *bth = *btv = *tth = *ttv = 1;
544
545
2/2
✓ Branch 0 taken 1741893 times.
✓ Branch 1 taken 535198 times.
2277091 if (mtt_depth)
546 1741893 *qt = 0;
547
548 2277091 min_qt_size = sh->min_qt_size[chroma];
549
2/2
✓ Branch 0 taken 966941 times.
✓ Branch 1 taken 1310150 times.
2277091 if (cb_width <= min_qt_size)
550 966941 *qt = 0;
551
552
2/2
✓ Branch 0 taken 296345 times.
✓ Branch 1 taken 1980746 times.
2277091 if (chroma) {
553 296345 int chroma_area = (cb_width >> sps->hshift[1]) * (cb_height >> sps->vshift[1]);
554 296345 int chroma_width = cb_width >> sps->hshift[1];
555
556
2/2
✓ Branch 0 taken 92792 times.
✓ Branch 1 taken 203553 times.
296345 if (chroma_width == 8)
557 92792 *ttv = 0;
558
2/2
✓ Branch 0 taken 75837 times.
✓ Branch 1 taken 127716 times.
203553 else if (chroma_width <= 4) {
559
1/2
✓ Branch 0 taken 75837 times.
✗ Branch 1 not taken.
75837 if (chroma_width == 4)
560 75837 *btv = 0;
561 75837 *qt = 0;
562 }
563
2/2
✓ Branch 0 taken 33558 times.
✓ Branch 1 taken 262787 times.
296345 if (mode_type == MODE_TYPE_INTRA)
564 33558 *qt = *btv = *bth = *ttv = *tth = 0;
565
2/2
✓ Branch 0 taken 108891 times.
✓ Branch 1 taken 187454 times.
296345 if (chroma_area <= 32) {
566 108891 *ttv = *tth = 0;
567
2/2
✓ Branch 0 taken 48796 times.
✓ Branch 1 taken 60095 times.
108891 if (chroma_area <= 16)
568 48796 *btv = *bth = 0;
569 }
570 }
571 2277091 max_bt_size = sh->max_bt_size[chroma];
572 2277091 max_tt_size = sh->max_tt_size[chroma];
573 2277091 max_mtt_depth = sh->max_mtt_depth[chroma] + depth_offset;
574
575
2/2
✓ Branch 0 taken 71682 times.
✓ Branch 1 taken 2205409 times.
2277091 if (mode_type == MODE_TYPE_INTER) {
576 71682 int area = cb_width * cb_height;
577
2/2
✓ Branch 0 taken 29760 times.
✓ Branch 1 taken 41922 times.
71682 if (area == 32)
578 29760 *btv = *bth = 0;
579
2/2
✓ Branch 0 taken 24870 times.
✓ Branch 1 taken 17052 times.
41922 else if (area == 64)
580 24870 *ttv = *tth = 0;
581 }
582
2/2
✓ Branch 0 taken 957378 times.
✓ Branch 1 taken 1319713 times.
2277091 if (cb_width <= 2 * min_cb_size_y) {
583 957378 *ttv = 0;
584
2/2
✓ Branch 0 taken 362872 times.
✓ Branch 1 taken 594506 times.
957378 if (cb_width <= min_cb_size_y)
585 362872 *btv = 0;
586 }
587
2/2
✓ Branch 0 taken 1043968 times.
✓ Branch 1 taken 1233123 times.
2277091 if (cb_height <= 2 * min_cb_size_y) {
588 1043968 *tth = 0;
589
2/2
✓ Branch 0 taken 418879 times.
✓ Branch 1 taken 625089 times.
1043968 if (cb_height <= min_cb_size_y)
590 418879 *bth = 0;
591 }
592
4/4
✓ Branch 0 taken 2211934 times.
✓ Branch 1 taken 65157 times.
✓ Branch 2 taken 705 times.
✓ Branch 3 taken 2211229 times.
2277091 if (cb_width > max_bt_size || cb_height > max_bt_size)
593 65862 *btv = *bth = 0;
594 2277091 max_tt_size = FFMIN(64, max_tt_size);
595
4/4
✓ Branch 0 taken 2135525 times.
✓ Branch 1 taken 141566 times.
✓ Branch 2 taken 8548 times.
✓ Branch 3 taken 2126977 times.
2277091 if (cb_width > max_tt_size || cb_height > max_tt_size)
596 150114 *ttv = *tth = 0;
597
2/2
✓ Branch 0 taken 468557 times.
✓ Branch 1 taken 1808534 times.
2277091 if (mtt_depth >= max_mtt_depth)
598 468557 *btv = *bth = *ttv = *tth = 0;
599
2/2
✓ Branch 0 taken 5029 times.
✓ Branch 1 taken 2272062 times.
2277091 if (x0 + cb_width > pps->width) {
600 5029 *ttv = *tth = 0;
601
2/2
✓ Branch 0 taken 1491 times.
✓ Branch 1 taken 3538 times.
5029 if (cb_height > 64)
602 1491 *btv = 0;
603
2/2
✓ Branch 0 taken 3735 times.
✓ Branch 1 taken 1294 times.
5029 if (y0 + cb_height <= pps->height)
604 3735 *bth = 0;
605
2/2
✓ Branch 0 taken 1240 times.
✓ Branch 1 taken 54 times.
1294 else if (cb_width > min_qt_size)
606 1240 *btv = *bth = 0;
607 }
608
2/2
✓ Branch 0 taken 56041 times.
✓ Branch 1 taken 2221050 times.
2277091 if (y0 + cb_height > pps->height) {
609 56041 *btv = *ttv = *tth = 0;
610
2/2
✓ Branch 0 taken 7378 times.
✓ Branch 1 taken 48663 times.
56041 if (cb_width > 64)
611 7378 *bth = 0;
612 }
613
4/4
✓ Branch 0 taken 1741893 times.
✓ Branch 1 taken 535198 times.
✓ Branch 2 taken 752854 times.
✓ Branch 3 taken 989039 times.
2277091 if (mtt_depth > 0 && part_idx == 1) {
614
2/2
✓ Branch 0 taken 89934 times.
✓ Branch 1 taken 662920 times.
752854 if (last_split_mode == SPLIT_TT_VER)
615 89934 *btv = 0;
616
2/2
✓ Branch 0 taken 95287 times.
✓ Branch 1 taken 567633 times.
662920 else if (last_split_mode == SPLIT_TT_HOR)
617 95287 *bth = 0;
618 }
619
4/4
✓ Branch 0 taken 2226844 times.
✓ Branch 1 taken 50247 times.
✓ Branch 2 taken 3356 times.
✓ Branch 3 taken 2223488 times.
2277091 if (cb_width <= 64 && cb_height > 64)
620 3356 *btv = 0;
621
4/4
✓ Branch 0 taken 50247 times.
✓ Branch 1 taken 2226844 times.
✓ Branch 2 taken 3466 times.
✓ Branch 3 taken 46781 times.
2277091 if (cb_width > 64 && cb_height <= 64)
622 3466 *bth = 0;
623 2277091 }
624
625 506892 static int get_num_intra_subpartitions(enum IspType isp_split_type, int cb_width, int cb_height)
626 {
627
2/2
✓ Branch 0 taken 441685 times.
✓ Branch 1 taken 65207 times.
506892 if (isp_split_type == ISP_NO_SPLIT)
628 441685 return 1;
629
8/8
✓ Branch 0 taken 15617 times.
✓ Branch 1 taken 49590 times.
✓ Branch 2 taken 4401 times.
✓ Branch 3 taken 11216 times.
✓ Branch 4 taken 23710 times.
✓ Branch 5 taken 30281 times.
✓ Branch 6 taken 12983 times.
✓ Branch 7 taken 10727 times.
65207 if ((cb_width == 4 && cb_height == 8) || (cb_width == 8 && cb_height == 4))
630 24199 return 2;
631 41008 return 4;
632 }
633
634 256635 static int get_cclm_enabled(const VVCLocalContext *lc, const int x0, const int y0)
635 {
636 256635 const VVCFrameContext *fc = lc->fc;
637 256635 const VVCSPS *sps = fc->ps.sps;
638 256635 int enabled = 0;
639
640
2/2
✓ Branch 0 taken 451 times.
✓ Branch 1 taken 256184 times.
256635 if (!sps->r->sps_cclm_enabled_flag)
641 451 return 0;
642
6/6
✓ Branch 0 taken 223533 times.
✓ Branch 1 taken 32651 times.
✓ Branch 2 taken 159161 times.
✓ Branch 3 taken 64372 times.
✓ Branch 4 taken 2153 times.
✓ Branch 5 taken 157008 times.
256184 if (!sps->r->sps_qtbtt_dual_tree_intra_flag || !IS_I(lc->sc->sh.r) || sps->ctb_log2_size_y < 6)
643 99176 return 1;
644 else {
645 157008 const int x64 = x0 >> 6 << 6;
646 157008 const int y64 = y0 >> 6 << 6;
647 157008 const int y32 = y0 >> 5 << 5;
648 157008 const int x64_cu = x64 >> fc->ps.sps->min_cb_log2_size_y;
649 157008 const int y64_cu = y64 >> fc->ps.sps->min_cb_log2_size_y;
650 157008 const int y32_cu = y32 >> fc->ps.sps->min_cb_log2_size_y;
651 157008 const int min_cb_width = fc->ps.pps->min_cb_width;
652 157008 const int depth = SAMPLE_CTB(fc->tab.cqt_depth[1], x64_cu, y64_cu);
653 157008 const int min_depth = fc->ps.sps->ctb_log2_size_y - 6;
654 157008 const VVCSplitMode msm64 = (VVCSplitMode)TAB_MSM(fc, 0, x64, y64);
655 157008 const VVCSplitMode msm32 = (VVCSplitMode)TAB_MSM(fc, 1, x64, y32);
656
657
2/2
✓ Branch 0 taken 19375 times.
✓ Branch 1 taken 137633 times.
176383 enabled = SAMPLE_CTB(fc->tab.cb_width[1], x64_cu, y64_cu) == 64 &&
658
2/2
✓ Branch 0 taken 6527 times.
✓ Branch 1 taken 12848 times.
19375 SAMPLE_CTB(fc->tab.cb_height[1], x64_cu, y64_cu) == 64;
659
2/2
✓ Branch 0 taken 21666 times.
✓ Branch 1 taken 16231 times.
37897 enabled |= depth == min_depth && msm64 == SPLIT_BT_HOR &&
660
4/4
✓ Branch 0 taken 37897 times.
✓ Branch 1 taken 119111 times.
✓ Branch 2 taken 12084 times.
✓ Branch 3 taken 9582 times.
206989 SAMPLE_CTB(fc->tab.cb_width[1], x64_cu, y32_cu) == 64 &&
661
2/2
✓ Branch 0 taken 4734 times.
✓ Branch 1 taken 7350 times.
12084 SAMPLE_CTB(fc->tab.cb_height[1], x64_cu, y32_cu) == 32;
662 157008 enabled |= depth > min_depth;
663
6/6
✓ Branch 0 taken 37897 times.
✓ Branch 1 taken 119111 times.
✓ Branch 2 taken 21666 times.
✓ Branch 3 taken 16231 times.
✓ Branch 4 taken 7990 times.
✓ Branch 5 taken 13676 times.
157008 enabled |= depth == min_depth && msm64 == SPLIT_BT_HOR && msm32 == SPLIT_BT_VER;
664
665
2/2
✓ Branch 0 taken 137905 times.
✓ Branch 1 taken 19103 times.
157008 if (enabled) {
666 137905 const int w = SAMPLE_CTB(fc->tab.cb_width[0], x64_cu, y64_cu);
667 137905 const int h = SAMPLE_CTB(fc->tab.cb_height[0], x64_cu, y64_cu);
668 137905 const int depth0 = SAMPLE_CTB(fc->tab.cqt_depth[0], x64_cu, y64_cu);
669
8/8
✓ Branch 0 taken 5746 times.
✓ Branch 1 taken 132159 times.
✓ Branch 2 taken 5556 times.
✓ Branch 3 taken 190 times.
✓ Branch 4 taken 4964 times.
✓ Branch 5 taken 592 times.
✓ Branch 6 taken 5154 times.
✓ Branch 7 taken 132159 times.
137905 if ((w == 64 && h == 64 && TAB_ISPMF(fc, x64, y64)) ||
670
4/4
✓ Branch 0 taken 190 times.
✓ Branch 1 taken 4964 times.
✓ Branch 2 taken 1286 times.
✓ Branch 3 taken 131063 times.
137313 ((w < 64 || h < 64) && depth0 == min_depth))
671 1878 return 0;
672 }
673
674 }
675
676 155130 return enabled;
677 }
678
679 900527 static int less(const void *a, const void *b)
680 {
681 900527 return *(const int*)a - *(const int*)b;
682 }
683
684 //8.4.2 Derivation process for luma intra prediction mode
685 506892 static enum IntraPredMode luma_intra_pred_mode(VVCLocalContext* lc, const int intra_subpartitions_mode_flag)
686 {
687 506892 VVCFrameContext *fc = lc->fc;
688 506892 CodingUnit *cu = lc->cu;
689 506892 const int x0 = cu->x0;
690 506892 const int y0 = cu->y0;
691 enum IntraPredMode pred;
692 506892 int intra_luma_not_planar_flag = 1;
693 506892 int intra_luma_mpm_remainder = 0;
694 506892 int intra_luma_mpm_flag = 1;
695 506892 int intra_luma_mpm_idx = 0;
696
697
2/2
✓ Branch 0 taken 461760 times.
✓ Branch 1 taken 45132 times.
506892 if (!cu->intra_luma_ref_idx)
698 461760 intra_luma_mpm_flag = ff_vvc_intra_luma_mpm_flag(lc);
699
2/2
✓ Branch 0 taken 378546 times.
✓ Branch 1 taken 128346 times.
506892 if (intra_luma_mpm_flag) {
700
2/2
✓ Branch 0 taken 333414 times.
✓ Branch 1 taken 45132 times.
378546 if (!cu->intra_luma_ref_idx)
701 333414 intra_luma_not_planar_flag = ff_vvc_intra_luma_not_planar_flag(lc, intra_subpartitions_mode_flag);
702
2/2
✓ Branch 0 taken 203369 times.
✓ Branch 1 taken 175177 times.
378546 if (intra_luma_not_planar_flag)
703 203369 intra_luma_mpm_idx = ff_vvc_intra_luma_mpm_idx(lc);
704 } else {
705 128346 intra_luma_mpm_remainder = ff_vvc_intra_luma_mpm_remainder(lc);
706 }
707
708
2/2
✓ Branch 0 taken 175177 times.
✓ Branch 1 taken 331715 times.
506892 if (!intra_luma_not_planar_flag) {
709 175177 pred = INTRA_PLANAR;
710 } else {
711 331715 const VVCSPS *sps = fc->ps.sps;
712 331715 const int x_a = (x0 - 1) >> sps->min_cb_log2_size_y;
713 331715 const int y_a = (y0 + cu->cb_height - 1) >> sps->min_cb_log2_size_y;
714 331715 const int x_b = (x0 + cu->cb_width - 1) >> sps->min_cb_log2_size_y;
715 331715 const int y_b = (y0 - 1) >> sps->min_cb_log2_size_y;
716 331715 int min_cb_width = fc->ps.pps->min_cb_width;
717 331715 int x0b = av_zero_extend(x0, sps->ctb_log2_size_y);
718 331715 int y0b = av_zero_extend(y0, sps->ctb_log2_size_y);
719
4/4
✓ Branch 0 taken 74486 times.
✓ Branch 1 taken 257229 times.
✓ Branch 2 taken 68418 times.
✓ Branch 3 taken 6068 times.
331715 const int available_l = lc->ctb_left_flag || x0b;
720
4/4
✓ Branch 0 taken 118819 times.
✓ Branch 1 taken 212896 times.
✓ Branch 2 taken 112174 times.
✓ Branch 3 taken 6645 times.
331715 const int available_u = lc->ctb_up_flag || y0b;
721
722 int a, b, cand[5];
723
724
4/4
✓ Branch 0 taken 325647 times.
✓ Branch 1 taken 6068 times.
✓ Branch 2 taken 291923 times.
✓ Branch 3 taken 33724 times.
331715 if (!available_l || (SAMPLE_CTB(fc->tab.cpm[0], x_a, y_a) != MODE_INTRA) ||
725
2/2
✓ Branch 0 taken 40146 times.
✓ Branch 1 taken 251777 times.
291923 SAMPLE_CTB(fc->tab.imf, x_a, y_a)) {
726 79938 a = INTRA_PLANAR;
727 } else {
728 251777 a = SAMPLE_CTB(fc->tab.ipm, x_a, y_a);
729 }
730
731
4/4
✓ Branch 0 taken 325070 times.
✓ Branch 1 taken 6645 times.
✓ Branch 2 taken 289471 times.
✓ Branch 3 taken 35599 times.
331715 if (!available_u || (SAMPLE_CTB(fc->tab.cpm[0], x_b, y_b) != MODE_INTRA) ||
732
4/4
✓ Branch 0 taken 249117 times.
✓ Branch 1 taken 40354 times.
✓ Branch 2 taken 14778 times.
✓ Branch 3 taken 234339 times.
289471 SAMPLE_CTB(fc->tab.imf, x_b, y_b) || !y0b) {
733 97376 b = INTRA_PLANAR;
734 } else {
735 234339 b = SAMPLE_CTB(fc->tab.ipm, x_b, y_b);
736 }
737
738
4/4
✓ Branch 0 taken 103346 times.
✓ Branch 1 taken 228369 times.
✓ Branch 2 taken 20235 times.
✓ Branch 3 taken 83111 times.
331715 if (a == b && a > INTRA_DC) {
739 20235 cand[0] = a;
740 20235 cand[1] = 2 + ((a + 61) % 64);
741 20235 cand[2] = 2 + ((a - 1) % 64);
742 20235 cand[3] = 2 + ((a + 60) % 64);
743 20235 cand[4] = 2 + (a % 64);
744 } else {
745 311480 const int minab = FFMIN(a, b);
746 311480 const int maxab = FFMAX(a, b);
747
4/4
✓ Branch 0 taken 150381 times.
✓ Branch 1 taken 161099 times.
✓ Branch 2 taken 74141 times.
✓ Branch 3 taken 76240 times.
385621 if (a > INTRA_DC && b > INTRA_DC) {
748 74141 const int diff = maxab - minab;
749 74141 cand[0] = a;
750 74141 cand[1] = b;
751
2/2
✓ Branch 0 taken 14592 times.
✓ Branch 1 taken 59549 times.
74141 if (diff == 1) {
752 14592 cand[2] = 2 + ((minab + 61) % 64);
753 14592 cand[3] = 2 + ((maxab - 1) % 64);
754 14592 cand[4] = 2 + ((minab + 60) % 64);
755
2/2
✓ Branch 0 taken 587 times.
✓ Branch 1 taken 58962 times.
59549 } else if (diff >= 62) {
756 587 cand[2] = 2 + ((minab - 1) % 64);
757 587 cand[3] = 2 + ((maxab + 61) % 64);
758 587 cand[4] = 2 + (minab % 64);
759
2/2
✓ Branch 0 taken 6930 times.
✓ Branch 1 taken 52032 times.
58962 } else if (diff == 2) {
760 6930 cand[2] = 2 + ((minab - 1) % 64);
761 6930 cand[3] = 2 + ((minab + 61) % 64);
762 6930 cand[4] = 2 + ((maxab - 1) % 64);
763 } else {
764 52032 cand[2] = 2 + ((minab + 61) % 64);
765 52032 cand[3] = 2 + ((minab - 1) % 64);
766 52032 cand[4] = 2 + ((maxab + 61) % 64);
767 }
768
4/4
✓ Branch 0 taken 161099 times.
✓ Branch 1 taken 76240 times.
✓ Branch 2 taken 62838 times.
✓ Branch 3 taken 98261 times.
237339 } else if (a > INTRA_DC || b > INTRA_DC) {
769 139078 cand[0] = maxab;
770 139078 cand[1] = 2 + ((maxab + 61 ) % 64);
771 139078 cand[2] = 2 + ((maxab - 1) % 64);
772 139078 cand[3] = 2 + ((maxab + 60 ) % 64);
773 139078 cand[4] = 2 + (maxab % 64);
774 } else {
775 98261 cand[0] = INTRA_DC;
776 98261 cand[1] = INTRA_VERT;
777 98261 cand[2] = INTRA_HORZ;
778 98261 cand[3] = INTRA_VERT - 4;
779 98261 cand[4] = INTRA_VERT + 4;
780 }
781 }
782
2/2
✓ Branch 0 taken 203369 times.
✓ Branch 1 taken 128346 times.
331715 if (intra_luma_mpm_flag) {
783 203369 pred = cand[intra_luma_mpm_idx];
784 } else {
785 128346 qsort(cand, FF_ARRAY_ELEMS(cand), sizeof(cand[0]), less);
786 128346 pred = intra_luma_mpm_remainder + 1;
787
2/2
✓ Branch 0 taken 641730 times.
✓ Branch 1 taken 128346 times.
770076 for (int i = 0; i < FF_ARRAY_ELEMS(cand); i++) {
788
2/2
✓ Branch 0 taken 315381 times.
✓ Branch 1 taken 326349 times.
641730 if (pred >= cand[i])
789 315381 pred++;
790 }
791 }
792 }
793 506892 return pred;
794 }
795
796 1014990 static int lfnst_idx_decode(VVCLocalContext *lc)
797 {
798 1014990 CodingUnit *cu = lc->cu;
799 1014990 const VVCTreeType tree_type = cu->tree_type;
800 1014990 const VVCSPS *sps = lc->fc->ps.sps;
801 1014990 const int cb_width = cu->cb_width;
802 1014990 const int cb_height = cu->cb_height;
803 1014990 const TransformUnit *tu = cu->tus.head;
804 int lfnst_width, lfnst_height, min_lfnst;
805 1014990 int lfnst_idx = 0;
806
807 1014990 memset(cu->apply_lfnst_flag, 0, sizeof(cu->apply_lfnst_flag));
808
809
6/6
✓ Branch 0 taken 788683 times.
✓ Branch 1 taken 226307 times.
✓ Branch 2 taken 648614 times.
✓ Branch 3 taken 140069 times.
✓ Branch 4 taken 1990 times.
✓ Branch 5 taken 646624 times.
1014990 if (!sps->r->sps_lfnst_enabled_flag || cu->pred_mode != MODE_INTRA || FFMAX(cb_width, cb_height) > sps->max_tb_size_y)
810 368366 return 0;
811
812
2/2
✓ Branch 0 taken 759966 times.
✓ Branch 1 taken 623845 times.
1383811 while (tu) {
813
2/2
✓ Branch 0 taken 1017030 times.
✓ Branch 1 taken 737187 times.
1754217 for (int j = 0; j < tu->nb_tbs; j++) {
814 1017030 const TransformBlock *tb = tu->tbs + j;
815
4/4
✓ Branch 0 taken 631345 times.
✓ Branch 1 taken 385685 times.
✓ Branch 2 taken 22779 times.
✓ Branch 3 taken 608566 times.
1017030 if (tu->coded_flag[tb->c_idx] && tb->ts)
816 22779 return 0;
817 }
818 737187 tu = tu->next;
819 }
820
821
2/2
✓ Branch 0 taken 152087 times.
✓ Branch 1 taken 471758 times.
623845 if (tree_type == DUAL_TREE_CHROMA) {
822 152087 lfnst_width = cb_width >> sps->hshift[1];
823 152087 lfnst_height = cb_height >> sps->vshift[1];
824 } else {
825 471758 const int vs = cu->isp_split_type == ISP_VER_SPLIT;
826 471758 const int hs = cu->isp_split_type == ISP_HOR_SPLIT;
827
2/2
✓ Branch 0 taken 18415 times.
✓ Branch 1 taken 453343 times.
471758 lfnst_width = vs ? cb_width / cu->num_intra_subpartitions : cb_width;
828
2/2
✓ Branch 0 taken 32047 times.
✓ Branch 1 taken 439711 times.
471758 lfnst_height = hs ? cb_height / cu->num_intra_subpartitions : cb_height;
829 }
830 623845 min_lfnst = FFMIN(lfnst_width, lfnst_height);
831
6/6
✓ Branch 0 taken 471758 times.
✓ Branch 1 taken 152087 times.
✓ Branch 2 taken 106776 times.
✓ Branch 3 taken 364982 times.
✓ Branch 4 taken 86667 times.
✓ Branch 5 taken 20109 times.
623845 if (tree_type != DUAL_TREE_CHROMA && cu->intra_mip_flag && min_lfnst < 16)
832 86667 return 0;
833
834
2/2
✓ Branch 0 taken 497583 times.
✓ Branch 1 taken 39595 times.
537178 if (min_lfnst >= 4) {
835
6/6
✓ Branch 0 taken 469108 times.
✓ Branch 1 taken 28475 times.
✓ Branch 2 taken 196087 times.
✓ Branch 3 taken 273021 times.
✓ Branch 4 taken 190512 times.
✓ Branch 5 taken 34050 times.
497583 if ((cu->isp_split_type != ISP_NO_SPLIT || !lc->parse.lfnst_dc_only) && lc->parse.lfnst_zero_out_sig_coeff_flag)
836 190512 lfnst_idx = ff_vvc_lfnst_idx(lc, tree_type != SINGLE_TREE);
837 }
838
839
2/2
✓ Branch 0 taken 141772 times.
✓ Branch 1 taken 395406 times.
537178 if (lfnst_idx) {
840 141772 cu->apply_lfnst_flag[LUMA] = tree_type != DUAL_TREE_CHROMA;
841 141772 cu->apply_lfnst_flag[CB] = cu->apply_lfnst_flag[CR] = tree_type == DUAL_TREE_CHROMA;
842 }
843
844 537178 return lfnst_idx;
845 }
846
847 1014990 static MtsIdx mts_idx_decode(VVCLocalContext *lc)
848 {
849 1014990 const CodingUnit *cu = lc->cu;
850 1014990 const VVCSPS *sps = lc->fc->ps.sps;
851 1014990 const int cb_width = cu->cb_width;
852 1014990 const int cb_height = cu->cb_height;
853 1014990 const uint8_t transform_skip_flag = cu->tus.head->tbs[0].ts; //fix me
854 1014990 int mts_idx = MTS_DCT2_DCT2;
855
6/6
✓ Branch 0 taken 822268 times.
✓ Branch 1 taken 192722 times.
✓ Branch 2 taken 715064 times.
✓ Branch 3 taken 107204 times.
✓ Branch 4 taken 664134 times.
✓ Branch 5 taken 50930 times.
1014990 if (cu->tree_type != DUAL_TREE_CHROMA && !cu->lfnst_idx &&
856
2/2
✓ Branch 0 taken 641068 times.
✓ Branch 1 taken 23066 times.
664134 !transform_skip_flag && FFMAX(cb_width, cb_height) <= 32 &&
857
4/4
✓ Branch 0 taken 593179 times.
✓ Branch 1 taken 47889 times.
✓ Branch 2 taken 549325 times.
✓ Branch 3 taken 43854 times.
641068 cu->isp_split_type == ISP_NO_SPLIT && !cu->sbt_flag &&
858
4/4
✓ Branch 0 taken 540372 times.
✓ Branch 1 taken 8953 times.
✓ Branch 2 taken 334713 times.
✓ Branch 3 taken 205659 times.
549325 lc->parse.mts_zero_out_sig_coeff_flag && !lc->parse.mts_dc_only) {
859
4/4
✓ Branch 0 taken 59428 times.
✓ Branch 1 taken 275285 times.
✓ Branch 2 taken 56962 times.
✓ Branch 3 taken 2466 times.
334713 if ((cu->pred_mode == MODE_INTER && sps->r->sps_explicit_mts_inter_enabled_flag) ||
860
4/4
✓ Branch 0 taken 270725 times.
✓ Branch 1 taken 61522 times.
✓ Branch 2 taken 250644 times.
✓ Branch 3 taken 20081 times.
332247 (cu->pred_mode == MODE_INTRA && sps->r->sps_explicit_mts_intra_enabled_flag)) {
861 253110 mts_idx = ff_vvc_mts_idx(lc);
862 }
863 }
864
865 1014990 return mts_idx;
866 }
867
868 261988 static enum IntraPredMode derive_center_luma_intra_pred_mode(const VVCFrameContext *fc, const VVCSPS *sps, const VVCPPS *pps, const CodingUnit *cu)
869 {
870 261988 const int x_center = (cu->x0 + cu->cb_width / 2) >> sps->min_cb_log2_size_y;
871 261988 const int y_center = (cu->y0 + cu->cb_height / 2) >> sps->min_cb_log2_size_y;
872 261988 const int min_cb_width = pps->min_cb_width;
873 261988 const int intra_mip_flag = SAMPLE_CTB(fc->tab.imf, x_center, y_center);
874 261988 const int cu_pred_mode = SAMPLE_CTB(fc->tab.cpm[0], x_center, y_center);
875 261988 const int intra_pred_mode_y = SAMPLE_CTB(fc->tab.ipm, x_center, y_center);
876
877
2/2
✓ Branch 0 taken 47430 times.
✓ Branch 1 taken 214558 times.
261988 if (intra_mip_flag) {
878
4/4
✓ Branch 0 taken 9600 times.
✓ Branch 1 taken 37830 times.
✓ Branch 2 taken 251 times.
✓ Branch 3 taken 9349 times.
47430 if (cu->tree_type == SINGLE_TREE && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444)
879 251 return INTRA_INVALID;
880 47179 return INTRA_PLANAR;
881 }
882
4/4
✓ Branch 0 taken 201025 times.
✓ Branch 1 taken 13533 times.
✓ Branch 2 taken 412 times.
✓ Branch 3 taken 200613 times.
214558 if (cu_pred_mode == MODE_IBC || cu_pred_mode == MODE_PLT)
883 13945 return INTRA_DC;
884 200613 return intra_pred_mode_y;
885 }
886
887 262775 static void derive_chroma_intra_pred_mode(VVCLocalContext *lc,
888 const int cclm_mode_flag, const int cclm_mode_idx, const int intra_chroma_pred_mode)
889 {
890 262775 const VVCFrameContext *fc = lc->fc;
891 262775 CodingUnit *cu = lc->cu;
892 262775 const VVCSPS *sps = fc->ps.sps;
893 262775 const VVCPPS *pps = fc->ps.pps;
894 262775 const int x_cb = cu->x0 >> sps->min_cb_log2_size_y;
895 262775 const int y_cb = cu->y0 >> sps->min_cb_log2_size_y;
896 262775 const int min_cb_width = pps->min_cb_width;
897 262775 const int intra_mip_flag = SAMPLE_CTB(fc->tab.imf, x_cb, y_cb);
898 262775 enum IntraPredMode luma_intra_pred_mode = SAMPLE_CTB(fc->tab.ipm, x_cb, y_cb);
899
900
6/6
✓ Branch 0 taken 70140 times.
✓ Branch 1 taken 192635 times.
✓ Branch 2 taken 10433 times.
✓ Branch 3 taken 59707 times.
✓ Branch 4 taken 7648 times.
✓ Branch 5 taken 2785 times.
262775 if (cu->tree_type == SINGLE_TREE && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444 &&
901
4/4
✓ Branch 0 taken 6140 times.
✓ Branch 1 taken 1508 times.
✓ Branch 2 taken 787 times.
✓ Branch 3 taken 8138 times.
10433 (intra_chroma_pred_mode == 4 || cu->act_enabled_flag) && intra_mip_flag) {
902 787 cu->mip_chroma_direct_flag = 1;
903 787 cu->intra_pred_mode_c = luma_intra_pred_mode;
904 787 return;
905 }
906 261988 luma_intra_pred_mode = derive_center_luma_intra_pred_mode(fc, sps, pps, cu);
907
908
2/2
✓ Branch 0 taken 5583 times.
✓ Branch 1 taken 256405 times.
261988 if (cu->act_enabled_flag) {
909 5583 cu->intra_pred_mode_c = luma_intra_pred_mode;
910 5583 return;
911 }
912
2/2
✓ Branch 0 taken 101430 times.
✓ Branch 1 taken 154975 times.
256405 if (cclm_mode_flag) {
913 101430 cu->intra_pred_mode_c = INTRA_LT_CCLM + cclm_mode_idx;
914
2/2
✓ Branch 0 taken 110522 times.
✓ Branch 1 taken 44453 times.
154975 } else if (intra_chroma_pred_mode == 4){
915 110522 cu->intra_pred_mode_c = luma_intra_pred_mode;
916 } else {
917 const static IntraPredMode pred_mode_c[][4 + 1] = {
918 {INTRA_VDIAG, INTRA_PLANAR, INTRA_PLANAR, INTRA_PLANAR, INTRA_PLANAR},
919 {INTRA_VERT, INTRA_VDIAG, INTRA_VERT, INTRA_VERT, INTRA_VERT},
920 {INTRA_HORZ, INTRA_HORZ, INTRA_VDIAG, INTRA_HORZ, INTRA_HORZ},
921 {INTRA_DC, INTRA_DC, INTRA_DC, INTRA_VDIAG, INTRA_DC},
922 };
923 44453 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
6/6
✓ Branch 0 taken 3416 times.
✓ Branch 1 taken 41037 times.
✓ Branch 2 taken 246 times.
✓ Branch 3 taken 3170 times.
✓ Branch 4 taken 43 times.
✓ Branch 5 taken 203 times.
44453 if (cu->tree_type == SINGLE_TREE && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444 && intra_mip_flag) {
930 43 idx = 4;
931 } else {
932
2/2
✓ Branch 0 taken 113053 times.
✓ Branch 1 taken 15333 times.
128386 for (idx = 0; idx < FF_ARRAY_ELEMS(modes); idx++) {
933
2/2
✓ Branch 0 taken 29077 times.
✓ Branch 1 taken 83976 times.
113053 if (modes[idx] == luma_intra_pred_mode)
934 29077 break;
935 }
936 }
937
938 44453 cu->intra_pred_mode_c = pred_mode_c[intra_chroma_pred_mode][idx];
939 }
940
4/4
✓ Branch 0 taken 23834 times.
✓ Branch 1 taken 232571 times.
✓ Branch 2 taken 15903 times.
✓ Branch 3 taken 7931 times.
256405 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 15903 cu->intra_pred_mode_c = mode_map_422[cu->intra_pred_mode_c];
949 }
950 }
951
952 294433 static av_always_inline uint8_t pack_mip_info(int intra_mip_flag,
953 int intra_mip_transposed_flag, int intra_mip_mode)
954 {
955 294433 return (intra_mip_mode << 2) | (intra_mip_transposed_flag << 1) | intra_mip_flag;
956 }
957
958 637176 static void intra_luma_pred_modes(VVCLocalContext *lc)
959 {
960 637176 VVCFrameContext *fc = lc->fc;
961 637176 const VVCSPS *sps = fc->ps.sps;
962 637176 const VVCPPS *pps = fc->ps.pps;
963 637176 CodingUnit *cu = lc->cu;
964 637176 const int log2_min_cb_size = sps->min_cb_log2_size_y;
965 637176 const int x0 = cu->x0;
966 637176 const int y0 = cu->y0;
967 637176 const int x_cb = x0 >> log2_min_cb_size;
968 637176 const int y_cb = y0 >> log2_min_cb_size;
969 637176 const int cb_width = cu->cb_width;
970 637176 const int cb_height = cu->cb_height;
971
972 637176 cu->intra_luma_ref_idx = 0;
973
6/6
✓ Branch 0 taken 59129 times.
✓ Branch 1 taken 578047 times.
✓ Branch 2 taken 58016 times.
✓ Branch 3 taken 1113 times.
✓ Branch 4 taken 57938 times.
✓ Branch 5 taken 78 times.
637176 if (sps->r->sps_bdpcm_enabled_flag && cb_width <= sps->max_ts_size && cb_height <= sps->max_ts_size)
974 57938 cu->bdpcm_flag[LUMA] = ff_vvc_intra_bdpcm_luma_flag(lc);
975
2/2
✓ Branch 0 taken 18949 times.
✓ Branch 1 taken 618227 times.
637176 if (cu->bdpcm_flag[LUMA]) {
976
2/2
✓ Branch 1 taken 9847 times.
✓ Branch 2 taken 9102 times.
18949 cu->intra_pred_mode_y = ff_vvc_intra_bdpcm_luma_dir_flag(lc) ? INTRA_VERT : INTRA_HORZ;
977 } else {
978
2/2
✓ Branch 0 taken 474655 times.
✓ Branch 1 taken 143572 times.
618227 if (sps->r->sps_mip_enabled_flag)
979 474655 cu->intra_mip_flag = ff_vvc_intra_mip_flag(lc, fc->tab.imf);
980
2/2
✓ Branch 0 taken 111335 times.
✓ Branch 1 taken 506892 times.
618227 if (cu->intra_mip_flag) {
981 111335 int intra_mip_transposed_flag = ff_vvc_intra_mip_transposed_flag(lc);
982 111335 int intra_mip_mode = ff_vvc_intra_mip_mode(lc);
983 111335 int x = y_cb * pps->min_cb_width + x_cb;
984
2/2
✓ Branch 0 taken 294433 times.
✓ Branch 1 taken 111335 times.
405768 for (int y = 0; y < (cb_height>>log2_min_cb_size); y++) {
985 294433 int width = cb_width>>log2_min_cb_size;
986 294433 const uint8_t mip_info = pack_mip_info(cu->intra_mip_flag,
987 intra_mip_transposed_flag, intra_mip_mode);
988 294433 memset(&fc->tab.imf[x], mip_info, width);
989 294433 x += pps->min_cb_width;
990 }
991 111335 cu->intra_pred_mode_y = intra_mip_mode;
992 } else {
993 506892 int intra_subpartitions_mode_flag = 0;
994
4/4
✓ Branch 0 taken 486838 times.
✓ Branch 1 taken 20054 times.
✓ Branch 2 taken 445971 times.
✓ Branch 3 taken 40867 times.
506892 if (sps->r->sps_mrl_enabled_flag && ((y0 % sps->ctb_size_y) > 0))
995 445971 cu->intra_luma_ref_idx = ff_vvc_intra_luma_ref_idx(lc);
996
4/4
✓ Branch 0 taken 486838 times.
✓ Branch 1 taken 20054 times.
✓ Branch 2 taken 441706 times.
✓ Branch 3 taken 45132 times.
506892 if (sps->r->sps_isp_enabled_flag && !cu->intra_luma_ref_idx &&
997
4/4
✓ Branch 0 taken 441266 times.
✓ Branch 1 taken 440 times.
✓ Branch 2 taken 440938 times.
✓ Branch 3 taken 328 times.
441706 (cb_width <= sps->max_tb_size_y && cb_height <= sps->max_tb_size_y) &&
998
2/2
✓ Branch 0 taken 374623 times.
✓ Branch 1 taken 66315 times.
440938 (cb_width * cb_height > MIN_TU_SIZE * MIN_TU_SIZE) &&
999
2/2
✓ Branch 0 taken 371225 times.
✓ Branch 1 taken 3398 times.
374623 !cu->act_enabled_flag)
1000 371225 intra_subpartitions_mode_flag = ff_vvc_intra_subpartitions_mode_flag(lc);
1001
4/4
✓ Branch 0 taken 98286 times.
✓ Branch 1 taken 408606 times.
✓ Branch 2 taken 21410 times.
✓ Branch 3 taken 76876 times.
506892 if (!(x0 & 63) && !(y0 & 63))
1002 21410 TAB_ISPMF(fc, x0, y0) = intra_subpartitions_mode_flag;
1003 506892 cu->isp_split_type = ff_vvc_isp_split_type(lc, intra_subpartitions_mode_flag);
1004 506892 cu->num_intra_subpartitions = get_num_intra_subpartitions(cu->isp_split_type, cb_width, cb_height);
1005 506892 cu->intra_pred_mode_y = luma_intra_pred_mode(lc, intra_subpartitions_mode_flag);
1006 }
1007 }
1008 637176 set_cb_tab(lc, fc->tab.ipm, cu->intra_pred_mode_y);
1009 637176 }
1010
1011 263033 static void intra_chroma_pred_modes(VVCLocalContext *lc)
1012 {
1013 263033 const VVCSPS *sps = lc->fc->ps.sps;
1014 263033 CodingUnit *cu = lc->cu;
1015 263033 const int hs = sps->hshift[CHROMA];
1016 263033 const int vs = sps->vshift[CHROMA];
1017 263033 int cclm_mode_flag = 0;
1018 263033 int cclm_mode_idx = 0;
1019 263033 int intra_chroma_pred_mode = 0;
1020
1021
2/2
✓ Branch 0 taken 256893 times.
✓ Branch 1 taken 6140 times.
263033 if (!cu->act_enabled_flag) {
1022 256893 cu->mip_chroma_direct_flag = 0;
1023
2/2
✓ Branch 0 taken 52194 times.
✓ Branch 1 taken 204699 times.
256893 if (sps->r->sps_bdpcm_enabled_flag &&
1024
2/2
✓ Branch 0 taken 50794 times.
✓ Branch 1 taken 1400 times.
52194 (cu->cb_width >> hs) <= sps->max_ts_size &&
1025
2/2
✓ Branch 0 taken 50258 times.
✓ Branch 1 taken 536 times.
50794 (cu->cb_height >> vs) <= sps->max_ts_size) {
1026 50258 cu->bdpcm_flag[CB] = cu->bdpcm_flag[CR] = ff_vvc_intra_bdpcm_chroma_flag(lc);
1027 }
1028
2/2
✓ Branch 0 taken 258 times.
✓ Branch 1 taken 256635 times.
256893 if (cu->bdpcm_flag[CHROMA]) {
1029
2/2
✓ Branch 1 taken 239 times.
✓ Branch 2 taken 19 times.
258 cu->intra_pred_mode_c = ff_vvc_intra_bdpcm_chroma_dir_flag(lc) ? INTRA_VERT : INTRA_HORZ;
1030 } else {
1031 256635 const int cclm_enabled = get_cclm_enabled(lc, cu->x0, cu->y0);
1032
1033
2/2
✓ Branch 0 taken 235203 times.
✓ Branch 1 taken 21432 times.
256635 if (cclm_enabled)
1034 235203 cclm_mode_flag = ff_vvc_cclm_mode_flag(lc);
1035
1036
2/2
✓ Branch 0 taken 101430 times.
✓ Branch 1 taken 155205 times.
256635 if (cclm_mode_flag)
1037 101430 cclm_mode_idx = ff_vvc_cclm_mode_idx(lc);
1038 else
1039 155205 intra_chroma_pred_mode = ff_vvc_intra_chroma_pred_mode(lc);
1040 }
1041 }
1042
1043
2/2
✓ Branch 0 taken 262775 times.
✓ Branch 1 taken 258 times.
263033 if (!cu->bdpcm_flag[CHROMA])
1044 262775 derive_chroma_intra_pred_mode(lc, cclm_mode_flag, cclm_mode_idx, intra_chroma_pred_mode);
1045 263033 }
1046
1047 1386930 static PredMode pred_mode_decode(VVCLocalContext *lc,
1048 const VVCTreeType tree_type,
1049 const VVCModeType mode_type)
1050 {
1051 1386930 const VVCFrameContext *fc = lc->fc;
1052 1386930 CodingUnit *cu = lc->cu;
1053 1386930 const VVCSPS *sps = fc->ps.sps;
1054 1386930 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1055 1386930 const int ch_type = tree_type == DUAL_TREE_CHROMA ? 1 : 0;
1056
4/4
✓ Branch 0 taken 310963 times.
✓ Branch 1 taken 1075967 times.
✓ Branch 2 taken 130308 times.
✓ Branch 3 taken 180655 times.
1386930 const int is_4x4 = cu->cb_width == 4 && cu->cb_height == 4;
1057
4/4
✓ Branch 0 taken 1360527 times.
✓ Branch 1 taken 26403 times.
✓ Branch 2 taken 2342 times.
✓ Branch 3 taken 1358185 times.
1386930 const int is_128 = cu->cb_width == 128 || cu->cb_height == 128;
1058 1386930 const int hs = sps->hshift[CHROMA];
1059 1386930 const int vs = sps->vshift[CHROMA];
1060 int pred_mode_flag;
1061 int pred_mode_ibc_flag;
1062 PredMode pred_mode;
1063
1064 1386930 cu->skip_flag = 0;
1065
4/4
✓ Branch 0 taken 757326 times.
✓ Branch 1 taken 629604 times.
✓ Branch 2 taken 123657 times.
✓ Branch 3 taken 633669 times.
1386930 if (!IS_I(rsh) || sps->r->sps_ibc_enabled_flag) {
1066
4/4
✓ Branch 0 taken 714283 times.
✓ Branch 1 taken 38978 times.
✓ Branch 2 taken 649005 times.
✓ Branch 3 taken 65278 times.
753261 if (tree_type != DUAL_TREE_CHROMA &&
1067
2/2
✓ Branch 0 taken 62602 times.
✓ Branch 1 taken 586403 times.
649005 ((!is_4x4 && mode_type != MODE_TYPE_INTRA) ||
1068
3/4
✓ Branch 0 taken 99796 times.
✓ Branch 1 taken 28084 times.
✓ Branch 2 taken 99796 times.
✗ Branch 3 not taken.
127880 (sps->r->sps_ibc_enabled_flag && !is_128))) {
1069 686199 cu->skip_flag = ff_vvc_cu_skip_flag(lc, fc->tab.skip);
1070 }
1071
1072
6/6
✓ Branch 0 taken 687983 times.
✓ Branch 1 taken 65278 times.
✓ Branch 2 taken 593985 times.
✓ Branch 3 taken 93998 times.
✓ Branch 4 taken 78195 times.
✓ Branch 5 taken 515790 times.
753261 if (is_4x4 || mode_type == MODE_TYPE_INTRA || IS_I(rsh)) {
1073 237471 pred_mode_flag = 1;
1074
4/4
✓ Branch 0 taken 450067 times.
✓ Branch 1 taken 65723 times.
✓ Branch 2 taken 238136 times.
✓ Branch 3 taken 211931 times.
515790 } else if (mode_type == MODE_TYPE_INTER || cu->skip_flag) {
1075 303859 pred_mode_flag = 0;
1076 } else {
1077 211931 pred_mode_flag = ff_vvc_pred_mode_flag(lc, ch_type);
1078 }
1079 753261 pred_mode = pred_mode_flag ? MODE_INTRA : MODE_INTER;
1080
1081
4/4
✓ Branch 0 taken 123657 times.
✓ Branch 1 taken 629604 times.
✓ Branch 2 taken 11715 times.
✓ Branch 3 taken 111942 times.
753261 if (((IS_I(rsh) && !cu->skip_flag) ||
1082
6/6
✓ Branch 0 taken 629604 times.
✓ Branch 1 taken 11715 times.
✓ Branch 2 taken 162795 times.
✓ Branch 3 taken 466809 times.
✓ Branch 4 taken 115931 times.
✓ Branch 5 taken 46864 times.
641319 (!IS_I(rsh) && (pred_mode != MODE_INTRA ||
1083
6/6
✓ Branch 0 taken 66950 times.
✓ Branch 1 taken 48981 times.
✓ Branch 2 taken 104210 times.
✓ Branch 3 taken 9604 times.
✓ Branch 4 taken 654275 times.
✓ Branch 5 taken 28686 times.
741546 ((is_4x4 || mode_type == MODE_TYPE_INTRA) && !cu->skip_flag)))) &&
1084
6/6
✓ Branch 0 taken 588552 times.
✓ Branch 1 taken 65723 times.
✓ Branch 2 taken 219406 times.
✓ Branch 3 taken 369146 times.
✓ Branch 4 taken 189023 times.
✓ Branch 5 taken 30383 times.
654275 !is_128 && mode_type != MODE_TYPE_INTER && sps->r->sps_ibc_enabled_flag &&
1085 tree_type != DUAL_TREE_CHROMA) {
1086 189023 pred_mode_ibc_flag = ff_vvc_pred_mode_ibc_flag(lc, ch_type);
1087
6/6
✓ Branch 0 taken 265470 times.
✓ Branch 1 taken 298768 times.
✓ Branch 2 taken 258223 times.
✓ Branch 3 taken 7247 times.
✓ Branch 4 taken 4687 times.
✓ Branch 5 taken 253536 times.
564238 } else if (cu->skip_flag && (is_4x4 || mode_type == MODE_TYPE_INTRA)) {
1088 11934 pred_mode_ibc_flag = 1;
1089
6/6
✓ Branch 0 taken 523559 times.
✓ Branch 1 taken 28745 times.
✓ Branch 2 taken 457836 times.
✓ Branch 3 taken 65723 times.
✓ Branch 4 taken 38978 times.
✓ Branch 5 taken 418858 times.
552304 } else if (is_128 || mode_type == MODE_TYPE_INTER || tree_type == DUAL_TREE_CHROMA) {
1090 133446 pred_mode_ibc_flag = 0;
1091 } else {
1092
2/2
✓ Branch 0 taken 9385 times.
✓ Branch 1 taken 409473 times.
418858 pred_mode_ibc_flag = (IS_I(rsh)) ? sps->r->sps_ibc_enabled_flag : 0;
1093 }
1094
2/2
✓ Branch 0 taken 87174 times.
✓ Branch 1 taken 666087 times.
753261 if (pred_mode_ibc_flag)
1095 87174 pred_mode = MODE_IBC;
1096 } else {
1097 633669 pred_mode = MODE_INTRA;
1098 }
1099
1100
7/10
✓ Branch 0 taken 836875 times.
✓ Branch 1 taken 550055 times.
✓ Branch 2 taken 46324 times.
✓ Branch 3 taken 790551 times.
✓ Branch 4 taken 46324 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 46324 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 46324 times.
✗ Branch 9 not taken.
1386930 if (pred_mode == MODE_INTRA && sps->r->sps_palette_enabled_flag && !is_128 && !cu->skip_flag &&
1101
2/2
✓ Branch 0 taken 41331 times.
✓ Branch 1 taken 4993 times.
46324 mode_type != MODE_TYPE_INTER && ((cu->cb_width * cu->cb_height) >
1102
4/4
✓ Branch 0 taken 8906 times.
✓ Branch 1 taken 37418 times.
✓ Branch 2 taken 13392 times.
✓ Branch 3 taken 27939 times.
87655 (tree_type != DUAL_TREE_CHROMA ? 16 : (16 << hs << vs))) &&
1103
2/2
✓ Branch 0 taken 5582 times.
✓ Branch 1 taken 7810 times.
13392 (mode_type != MODE_TYPE_INTRA || tree_type != DUAL_TREE_CHROMA)) {
1104
2/2
✓ Branch 1 taken 6977 times.
✓ Branch 2 taken 26544 times.
33521 if (ff_vvc_pred_mode_plt_flag(lc))
1105 6977 pred_mode = MODE_PLT;
1106 }
1107
1108 1386930 set_cb_tab(lc, fc->tab.cpm[cu->ch_type], pred_mode);
1109
2/2
✓ Branch 0 taken 594562 times.
✓ Branch 1 taken 792368 times.
1386930 if (tree_type == SINGLE_TREE)
1110 594562 set_cb_tab(lc, fc->tab.cpm[CHROMA], pred_mode);
1111
1112 1386930 return pred_mode;
1113 }
1114
1115 1014990 static void sbt_info(VVCLocalContext *lc, const VVCSPS *sps)
1116 {
1117 1014990 CodingUnit *cu = lc->cu;
1118 1014990 const int cb_width = cu->cb_width;
1119 1014990 const int cb_height = cu->cb_height;
1120
1121
6/6
✓ Branch 0 taken 161688 times.
✓ Branch 1 taken 853302 times.
✓ Branch 2 taken 155340 times.
✓ Branch 3 taken 6348 times.
✓ Branch 4 taken 139437 times.
✓ Branch 5 taken 15903 times.
1014990 if (cu->pred_mode == MODE_INTER && sps->r->sps_sbt_enabled_flag && !cu->ciip_flag
1122
4/4
✓ Branch 0 taken 136583 times.
✓ Branch 1 taken 2854 times.
✓ Branch 2 taken 135700 times.
✓ Branch 3 taken 883 times.
139437 && cb_width <= sps->max_tb_size_y && cb_height <= sps->max_tb_size_y) {
1123 135700 const int sbt_ver_h = cb_width >= 8;
1124 135700 const int sbt_hor_h = cb_height >= 8;
1125 135700 cu->sbt_flag = 0;
1126
3/4
✓ Branch 0 taken 20760 times.
✓ Branch 1 taken 114940 times.
✓ Branch 2 taken 20760 times.
✗ Branch 3 not taken.
135700 if (sbt_ver_h || sbt_hor_h)
1127 135700 cu->sbt_flag = ff_vvc_sbt_flag(lc);
1128
2/2
✓ Branch 0 taken 45453 times.
✓ Branch 1 taken 90247 times.
135700 if (cu->sbt_flag) {
1129 45453 const int sbt_ver_q = cb_width >= 16;
1130 45453 const int sbt_hor_q = cb_height >= 16;
1131 45453 int cu_sbt_quad_flag = 0;
1132
1133
7/8
✓ Branch 0 taken 7617 times.
✓ Branch 1 taken 37836 times.
✓ Branch 2 taken 7617 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 25167 times.
✓ Branch 5 taken 20286 times.
✓ Branch 6 taken 12099 times.
✓ Branch 7 taken 13068 times.
45453 if ((sbt_ver_h || sbt_hor_h) && (sbt_ver_q || sbt_hor_q))
1134 32385 cu_sbt_quad_flag = ff_vvc_sbt_quad_flag(lc);
1135
2/2
✓ Branch 0 taken 11769 times.
✓ Branch 1 taken 33684 times.
45453 if (cu_sbt_quad_flag) {
1136 11769 cu->sbt_horizontal_flag = sbt_hor_q;
1137
4/4
✓ Branch 0 taken 7788 times.
✓ Branch 1 taken 3981 times.
✓ Branch 2 taken 3587 times.
✓ Branch 3 taken 4201 times.
11769 if (sbt_ver_q && sbt_hor_q)
1138 3587 cu->sbt_horizontal_flag = ff_vvc_sbt_horizontal_flag(lc);
1139 } else {
1140 33684 cu->sbt_horizontal_flag = sbt_hor_h;
1141
4/4
✓ Branch 0 taken 27602 times.
✓ Branch 1 taken 6082 times.
✓ Branch 2 taken 21950 times.
✓ Branch 3 taken 5652 times.
33684 if (sbt_ver_h && sbt_hor_h)
1142 21950 cu->sbt_horizontal_flag = ff_vvc_sbt_horizontal_flag(lc);
1143 }
1144 45453 cu->sbt_pos_flag = ff_vvc_sbt_pos_flag(lc);
1145
1146 {
1147
2/2
✓ Branch 0 taken 11769 times.
✓ Branch 1 taken 33684 times.
45453 const int sbt_min = cu_sbt_quad_flag ? 1 : 2;
1148
2/2
✓ Branch 0 taken 21749 times.
✓ Branch 1 taken 23704 times.
45453 lc->parse.sbt_num_fourths_tb0 = cu->sbt_pos_flag ? (4 - sbt_min) : sbt_min;
1149 }
1150 }
1151 }
1152 1014990 }
1153
1154 364963 static int skipped_transform_tree_unit(VVCLocalContext *lc)
1155 {
1156 364963 const H266RawSPS *rsps = lc->fc->ps.sps->r;
1157 364963 const CodingUnit *cu = lc->cu;
1158 int ret;
1159
1160
1/2
✓ Branch 0 taken 364963 times.
✗ Branch 1 not taken.
364963 if (cu->tree_type != DUAL_TREE_CHROMA) {
1161 364963 ret = set_qp_y(lc, cu->x0, cu->y0, 0);
1162
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 364963 times.
364963 if (ret < 0)
1163 ✗ return ret;
1164 }
1165
4/4
✓ Branch 0 taken 348452 times.
✓ Branch 1 taken 16511 times.
✓ Branch 2 taken 313167 times.
✓ Branch 3 taken 35285 times.
364963 if (rsps->sps_chroma_format_idc && cu->tree_type != DUAL_TREE_LUMA)
1166 313167 set_qp_c(lc);
1167 364963 ret = skipped_transform_tree(lc, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
1168
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 364963 times.
364963 if (ret < 0)
1169 ✗ return ret;
1170 364963 return 0;
1171 }
1172
1173 1386930 static void set_cb_pos(const VVCFrameContext *fc, const CodingUnit *cu)
1174 {
1175 1386930 const VVCSPS *sps = fc->ps.sps;
1176 1386930 const VVCPPS *pps = fc->ps.pps;
1177 1386930 const int log2_min_cb_size = sps->min_cb_log2_size_y;
1178 1386930 const int x_cb = cu->x0 >> log2_min_cb_size;
1179 1386930 const int y_cb = cu->y0 >> log2_min_cb_size;
1180 1386930 const int ch_type = cu->ch_type;
1181 int x, y;
1182
1183 1386930 x = y_cb * pps->min_cb_width + x_cb;
1184
2/2
✓ Branch 0 taken 5692750 times.
✓ Branch 1 taken 1386930 times.
7079680 for (y = 0; y < (cu->cb_height >> log2_min_cb_size); y++) {
1185 5692750 const int width = cu->cb_width >> log2_min_cb_size;
1186
1187
2/2
✓ Branch 0 taken 54523876 times.
✓ Branch 1 taken 5692750 times.
60216626 for (int i = 0; i < width; i++) {
1188 54523876 fc->tab.cb_pos_x[ch_type][x + i] = cu->x0;
1189 54523876 fc->tab.cb_pos_y[ch_type][x + i] = cu->y0;
1190 }
1191 5692750 memset(&fc->tab.cb_width[ch_type][x], cu->cb_width, width);
1192 5692750 memset(&fc->tab.cb_height[ch_type][x], cu->cb_height, width);
1193 5692750 memset(&fc->tab.cqt_depth[ch_type][x], cu->cqt_depth, width);
1194
1195 5692750 x += pps->min_cb_width;
1196 }
1197 1386930 }
1198
1199 1386930 static CodingUnit* alloc_cu(VVCLocalContext *lc, const int x0, const int y0)
1200 {
1201 1386930 VVCFrameContext *fc = lc->fc;
1202 1386930 const VVCSPS *sps = fc->ps.sps;
1203 1386930 const VVCPPS *pps = fc->ps.pps;
1204 1386930 const int rx = x0 >> sps->ctb_log2_size_y;
1205 1386930 const int ry = y0 >> sps->ctb_log2_size_y;
1206 1386930 CodingUnit **cus = fc->tab.cus + ry * pps->ctb_width + rx;
1207 1386930 CodingUnit *cu = av_refstruct_pool_get(fc->cu_pool);
1208
1209
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1386930 times.
1386930 if (!cu)
1210 ✗ return NULL;
1211 1386930 cu->next = NULL;
1212
1213
2/2
✓ Branch 0 taken 1331096 times.
✓ Branch 1 taken 55834 times.
1386930 if (lc->cu)
1214 1331096 lc->cu->next = cu;
1215 else
1216 55834 *cus = cu;
1217 1386930 lc->cu = cu;
1218
1219 1386930 return cu;
1220 }
1221
1222 1386930 static 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 1386930 VVCFrameContext *fc = lc->fc;
1226 1386930 const int ch_type = tree_type == DUAL_TREE_CHROMA ? 1 : 0;
1227 1386930 CodingUnit *cu = alloc_cu(lc, x0, y0);
1228
1229
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1386930 times.
1386930 if (!cu)
1230 ✗ return NULL;
1231
1232 1386930 memset(&cu->pu, 0, sizeof(cu->pu));
1233
1234 1386930 lc->parse.prev_tu_cbf_y = 0;
1235
1236 1386930 cu->sbt_flag = 0;
1237 1386930 cu->act_enabled_flag = 0;
1238
1239 1386930 cu->tree_type = tree_type;
1240 1386930 cu->x0 = x0;
1241 1386930 cu->y0 = y0;
1242 1386930 cu->cb_width = cb_width;
1243 1386930 cu->cb_height = cb_height;
1244 1386930 cu->ch_type = ch_type;
1245 1386930 cu->cqt_depth = cqt_depth;
1246 1386930 cu->tus.head = cu->tus.tail = NULL;
1247 1386930 cu->bdpcm_flag[LUMA] = cu->bdpcm_flag[CB] = cu->bdpcm_flag[CR] = 0;
1248 1386930 cu->isp_split_type = ISP_NO_SPLIT;
1249 1386930 cu->intra_mip_flag = 0;
1250 1386930 cu->ciip_flag = 0;
1251 1386930 cu->coded_flag = 1;
1252 1386930 cu->num_intra_subpartitions = 1;
1253 1386930 cu->pu.dmvr_flag = 0;
1254
1255 1386930 set_cb_pos(fc, cu);
1256 1386930 return cu;
1257 }
1258
1259 1386930 static void set_cu_tabs(const VVCLocalContext *lc, const CodingUnit *cu)
1260 {
1261 1386930 const VVCFrameContext *fc = lc->fc;
1262 1386930 const PredictionUnit *pu = &cu->pu;
1263 1386930 const TransformUnit *tu = cu->tus.head;
1264
1265 1386930 set_cb_tab(lc, fc->tab.mmi, pu->mi.motion_model_idc);
1266 1386930 set_cb_tab(lc, fc->tab.msf, pu->merge_subblock_flag);
1267
2/2
✓ Branch 0 taken 1194208 times.
✓ Branch 1 taken 192722 times.
1386930 if (cu->tree_type != DUAL_TREE_CHROMA) {
1268 1194208 set_cb_tab(lc, fc->tab.skip, cu->skip_flag);
1269 1194208 set_cb_tab(lc, fc->tab.pcmf[LUMA], cu->bdpcm_flag[LUMA]);
1270 }
1271
2/2
✓ Branch 0 taken 787284 times.
✓ Branch 1 taken 599646 times.
1386930 if (cu->tree_type != DUAL_TREE_LUMA)
1272 787284 set_cb_tab(lc, fc->tab.pcmf[CHROMA], cu->bdpcm_flag[CHROMA]);
1273
1274
2/2
✓ Branch 0 taken 1707344 times.
✓ Branch 1 taken 1386930 times.
3094274 while (tu) {
1275
2/2
✓ Branch 0 taken 3359098 times.
✓ Branch 1 taken 1707344 times.
5066442 for (int j = 0; j < tu->nb_tbs; j++) {
1276 3359098 const TransformBlock *tb = tu->tbs + j;
1277
2/2
✓ Branch 0 taken 1845332 times.
✓ Branch 1 taken 1513766 times.
3359098 if (tb->c_idx != LUMA)
1278 1845332 set_qp_c_tab(lc, tu, tb);
1279 }
1280 1707344 tu = tu->next;
1281 }
1282 1386930 }
1283
1284 //8.5.2.7 Derivation process for merge motion vector difference
1285 58027 static void derive_mmvd(const VVCLocalContext *lc, MvField *mvf, const Mv *mmvd_offset)
1286 {
1287 58027 const SliceContext *sc = lc->sc;
1288 Mv mmvd[2];
1289
1290
2/2
✓ Branch 0 taken 24450 times.
✓ Branch 1 taken 33577 times.
58027 if (mvf->pred_flag == PF_BI) {
1291 24450 const RefPicList *rpl = sc->rpl;
1292 24450 const int poc = lc->fc->ps.ph.poc;
1293 24450 const int diff[] = {
1294 24450 poc - rpl[L0].refs[mvf->ref_idx[L0]].poc,
1295 24450 poc - rpl[L1].refs[mvf->ref_idx[L1]].poc
1296 };
1297
4/4
✓ Branch 0 taken 23103 times.
✓ Branch 1 taken 1347 times.
✓ Branch 2 taken 9320 times.
✓ Branch 3 taken 15130 times.
24450 const int sign = FFSIGN(diff[0]) != FFSIGN(diff[1]);
1298
1299
2/2
✓ Branch 0 taken 8287 times.
✓ Branch 1 taken 16163 times.
24450 if (diff[0] == diff[1]) {
1300 8287 mmvd[1] = mmvd[0] = *mmvd_offset;
1301 }
1302 else {
1303 16163 const int i = FFABS(diff[0]) < FFABS(diff[1]);
1304 16163 const int o = !i;
1305 16163 mmvd[i] = *mmvd_offset;
1306
4/4
✓ Branch 0 taken 15919 times.
✓ Branch 1 taken 244 times.
✓ Branch 2 taken 15842 times.
✓ Branch 3 taken 77 times.
16163 if (!rpl[L0].refs[mvf->ref_idx[L0]].is_lt && !rpl[L1].refs[mvf->ref_idx[L1]].is_lt) {
1307 15842 ff_vvc_mv_scale(&mmvd[o], mmvd_offset, diff[i], diff[o]);
1308 }
1309 else {
1310
2/2
✓ Branch 0 taken 199 times.
✓ Branch 1 taken 122 times.
321 mmvd[o].x = sign ? -mmvd[i].x : mmvd[i].x;
1311
2/2
✓ Branch 0 taken 199 times.
✓ Branch 1 taken 122 times.
321 mmvd[o].y = sign ? -mmvd[i].y : mmvd[i].y;
1312 }
1313 }
1314 24450 mvf->mv[0].x += mmvd[0].x;
1315 24450 mvf->mv[0].y += mmvd[0].y;
1316 24450 mvf->mv[1].x += mmvd[1].x;
1317 24450 mvf->mv[1].y += mmvd[1].y;
1318 24450 ff_vvc_clip_mv(&mvf->mv[0]);
1319 24450 ff_vvc_clip_mv(&mvf->mv[1]);
1320 } else {
1321 33577 const int idx = mvf->pred_flag - PF_L0;
1322 33577 mvf->mv[idx].x += mmvd_offset->x;
1323 33577 mvf->mv[idx].y += mmvd_offset->y;
1324 33577 ff_vvc_clip_mv(&mvf->mv[idx]);
1325 }
1326
1327 58027 }
1328
1329 299521 static void mvf_to_mi(const MvField *mvf, MotionInfo *mi)
1330 {
1331 299521 mi->pred_flag = mvf->pred_flag;
1332 299521 mi->bcw_idx = mvf->bcw_idx;
1333 299521 mi->hpel_if_idx = mvf->hpel_if_idx;
1334
2/2
✓ Branch 0 taken 599042 times.
✓ Branch 1 taken 299521 times.
898563 for (int i = 0; i < 2; i++) {
1335 599042 const PredFlag mask = i + 1;
1336
2/2
✓ Branch 0 taken 467222 times.
✓ Branch 1 taken 131820 times.
599042 if (mvf->pred_flag & mask) {
1337 467222 mi->mv[i][0] = mvf->mv[i];
1338 467222 mi->ref_idx[i] = mvf->ref_idx[i];
1339 }
1340 }
1341 299521 }
1342
1343 299521 static void mv_merge_refine_pred_flag(MvField *mvf, const int width, const int height)
1344 {
1345
4/4
✓ Branch 0 taken 172954 times.
✓ Branch 1 taken 126567 times.
✓ Branch 2 taken 5253 times.
✓ Branch 3 taken 167701 times.
299521 if (mvf->pred_flag == PF_BI && (width + height) == 12) {
1346 5253 mvf->pred_flag = PF_L0;
1347 5253 mvf->bcw_idx = 0;
1348 }
1349 299521 }
1350
1351 // subblock-based inter prediction data
1352 54720 static void merge_data_subblock(VVCLocalContext *lc)
1353 {
1354 54720 const VVCFrameContext *fc = lc->fc;
1355 54720 const VVCPH *ph = &fc->ps.ph;
1356 54720 CodingUnit* cu = lc->cu;
1357 54720 PredictionUnit *pu = &cu->pu;
1358 54720 int merge_subblock_idx = 0;
1359
1360
1/2
✓ Branch 0 taken 54720 times.
✗ Branch 1 not taken.
54720 if (ph->max_num_subblock_merge_cand > 1) {
1361 54720 merge_subblock_idx = ff_vvc_merge_subblock_idx(lc, ph->max_num_subblock_merge_cand);
1362 }
1363 54720 ff_vvc_sb_mv_merge_mode(lc, merge_subblock_idx, pu);
1364 54720 }
1365
1366 283194 static void merge_data_regular(VVCLocalContext *lc)
1367 {
1368 283194 const VVCFrameContext *fc = lc->fc;
1369 283194 const VVCSPS *sps = fc->ps.sps;
1370 283194 const VVCPH *ph = &fc->ps.ph;
1371 283194 const CodingUnit* cu = lc->cu;
1372 283194 PredictionUnit *pu = &lc->cu->pu;
1373 283194 int merge_idx = 0;
1374 Mv mmvd_offset;
1375 MvField mvf;
1376
1377
2/2
✓ Branch 0 taken 276130 times.
✓ Branch 1 taken 7064 times.
283194 if (sps->r->sps_mmvd_enabled_flag)
1378 276130 pu->mmvd_merge_flag = ff_vvc_mmvd_merge_flag(lc);
1379
2/2
✓ Branch 0 taken 58027 times.
✓ Branch 1 taken 225167 times.
283194 if (pu->mmvd_merge_flag) {
1380 58027 int mmvd_cand_flag = 0;
1381
1/2
✓ Branch 0 taken 58027 times.
✗ Branch 1 not taken.
58027 if (sps->max_num_merge_cand > 1)
1382 58027 mmvd_cand_flag = ff_vvc_mmvd_cand_flag(lc);
1383 58027 ff_vvc_mmvd_offset_coding(lc, &mmvd_offset, ph->r->ph_mmvd_fullpel_only_flag);
1384 58027 merge_idx = mmvd_cand_flag;
1385
1/2
✓ Branch 0 taken 225167 times.
✗ Branch 1 not taken.
225167 } else if (sps->max_num_merge_cand > 1) {
1386 225167 merge_idx = ff_vvc_merge_idx(lc);
1387 }
1388 283194 ff_vvc_luma_mv_merge_mode(lc, merge_idx, 0, &mvf);
1389
2/2
✓ Branch 0 taken 58027 times.
✓ Branch 1 taken 225167 times.
283194 if (pu->mmvd_merge_flag)
1390 58027 derive_mmvd(lc, &mvf, &mmvd_offset);
1391 283194 mv_merge_refine_pred_flag(&mvf, cu->cb_width, cu->cb_height);
1392 283194 ff_vvc_store_mvf(lc, &mvf);
1393 283194 mvf_to_mi(&mvf, &pu->mi);
1394 283194 }
1395
1396 43921 static int ciip_flag_decode(VVCLocalContext *lc, const int ciip_avaiable, const int gpm_avaiable, const int is_128)
1397 {
1398 43921 const VVCFrameContext *fc = lc->fc;
1399 43921 const VVCSPS *sps = fc->ps.sps;
1400 43921 const CodingUnit *cu = lc->cu;
1401
1402
4/4
✓ Branch 0 taken 27094 times.
✓ Branch 1 taken 16827 times.
✓ Branch 2 taken 20147 times.
✓ Branch 3 taken 6947 times.
43921 if (ciip_avaiable && gpm_avaiable)
1403 20147 return ff_vvc_ciip_flag(lc);
1404
3/4
✓ Branch 0 taken 6947 times.
✓ Branch 1 taken 16827 times.
✓ Branch 2 taken 6947 times.
✗ Branch 3 not taken.
23774 return sps->r->sps_ciip_enabled_flag && !cu->skip_flag &&
1405
2/4
✓ Branch 0 taken 23774 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6947 times.
✗ Branch 3 not taken.
47548 !is_128 && (cu->cb_width * cu->cb_height >= 64);
1406 }
1407
1408 27594 static void merge_data_gpm(VVCLocalContext *lc)
1409 {
1410 27594 const VVCFrameContext *fc = lc->fc;
1411 27594 const VVCSPS *sps = fc->ps.sps;
1412 27594 PredictionUnit *pu = &lc->cu->pu;
1413 int merge_gpm_idx[2];
1414
1415 27594 pu->merge_gpm_flag = 1;
1416 27594 pu->gpm_partition_idx = ff_vvc_merge_gpm_partition_idx(lc);
1417 27594 merge_gpm_idx[0] = ff_vvc_merge_gpm_idx(lc, 0);
1418 27594 merge_gpm_idx[1] = 0;
1419
1/2
✓ Branch 0 taken 27594 times.
✗ Branch 1 not taken.
27594 if (sps->max_num_gpm_merge_cand > 2)
1420 27594 merge_gpm_idx[1] = ff_vvc_merge_gpm_idx(lc, 1);
1421
1422 27594 ff_vvc_luma_mv_merge_gpm(lc, merge_gpm_idx, pu->gpm_mv);
1423 27594 ff_vvc_store_gpm_mvf(lc, pu);
1424 27594 }
1425
1426 16327 static void merge_data_ciip(VVCLocalContext *lc)
1427 {
1428 16327 const VVCFrameContext* fc = lc->fc;
1429 16327 const VVCSPS* sps = fc->ps.sps;
1430 16327 CodingUnit *cu = lc->cu;
1431 16327 MotionInfo *mi = &cu->pu.mi;
1432 16327 int merge_idx = 0;
1433 MvField mvf;
1434
1435
1/2
✓ Branch 0 taken 16327 times.
✗ Branch 1 not taken.
16327 if (sps->max_num_merge_cand > 1)
1436 16327 merge_idx = ff_vvc_merge_idx(lc);
1437 16327 ff_vvc_luma_mv_merge_mode(lc, merge_idx, 1, &mvf);
1438 16327 mv_merge_refine_pred_flag(&mvf, cu->cb_width, cu->cb_height);
1439 16327 ff_vvc_store_mvf(lc, &mvf);
1440 16327 mvf_to_mi(&mvf, mi);
1441 16327 cu->intra_pred_mode_y = cu->intra_pred_mode_c = INTRA_PLANAR;
1442 16327 cu->intra_luma_ref_idx = 0;
1443 16327 cu->intra_mip_flag = 0;
1444 16327 }
1445
1446 // block-based inter prediction data
1447 327115 static void merge_data_block(VVCLocalContext *lc)
1448 {
1449 327115 const VVCFrameContext* fc = lc->fc;
1450 327115 const VVCSPS *sps = fc->ps.sps;
1451 327115 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1452 327115 CodingUnit *cu = lc->cu;
1453 327115 const int cb_width = cu->cb_width;
1454 327115 const int cb_height = cu->cb_height;
1455
4/4
✓ Branch 0 taken 306762 times.
✓ Branch 1 taken 20353 times.
✓ Branch 2 taken 1377 times.
✓ Branch 3 taken 305385 times.
327115 const int is_128 = cb_width == 128 || cb_height == 128;
1456 974251 const int ciip_avaiable = sps->r->sps_ciip_enabled_flag &&
1457
6/6
✓ Branch 0 taken 320021 times.
✓ Branch 1 taken 7094 times.
✓ Branch 2 taken 103733 times.
✓ Branch 3 taken 216288 times.
✓ Branch 4 taken 92605 times.
✓ Branch 5 taken 11128 times.
327115 !cu->skip_flag && (cb_width * cb_height >= 64);
1458
4/4
✓ Branch 0 taken 304847 times.
✓ Branch 1 taken 906 times.
✓ Branch 2 taken 268592 times.
✓ Branch 3 taken 36255 times.
305753 const int gpm_avaiable = sps->r->sps_gpm_enabled_flag && IS_B(rsh) &&
1459
2/2
✓ Branch 0 taken 239093 times.
✓ Branch 1 taken 29499 times.
268592 (cb_width >= 8) && (cb_height >=8) &&
1460
6/6
✓ Branch 0 taken 305753 times.
✓ Branch 1 taken 21362 times.
✓ Branch 2 taken 232062 times.
✓ Branch 3 taken 7031 times.
✓ Branch 4 taken 230076 times.
✓ Branch 5 taken 1986 times.
632868 (cb_width < 8 * cb_height) && (cb_height < 8 *cb_width);
1461
1462 327115 int regular_merge_flag = 1;
1463
1464
6/6
✓ Branch 0 taken 305385 times.
✓ Branch 1 taken 21730 times.
✓ Branch 2 taken 213161 times.
✓ Branch 3 taken 92224 times.
✓ Branch 4 taken 144109 times.
✓ Branch 5 taken 69052 times.
327115 if (!is_128 && (ciip_avaiable || gpm_avaiable))
1465 236333 regular_merge_flag = ff_vvc_regular_merge_flag(lc, cu->skip_flag);
1466
2/2
✓ Branch 0 taken 283194 times.
✓ Branch 1 taken 43921 times.
327115 if (regular_merge_flag) {
1467 283194 merge_data_regular(lc);
1468 } else {
1469 43921 cu->ciip_flag = ciip_flag_decode(lc, ciip_avaiable, gpm_avaiable, is_128);
1470
2/2
✓ Branch 0 taken 16327 times.
✓ Branch 1 taken 27594 times.
43921 if (cu->ciip_flag)
1471 16327 merge_data_ciip(lc);
1472 else
1473 27594 merge_data_gpm(lc);
1474 }
1475 327115 }
1476
1477 31034 static int merge_data_ibc(VVCLocalContext *lc)
1478 {
1479 31034 const VVCFrameContext* fc = lc->fc;
1480 31034 const VVCSPS* sps = fc->ps.sps;
1481 31034 MotionInfo *mi = &lc->cu->pu.mi;
1482 31034 int merge_idx = 0;
1483 int ret;
1484
1485 31034 mi->pred_flag = PF_IBC;
1486
1487
2/2
✓ Branch 0 taken 30794 times.
✓ Branch 1 taken 240 times.
31034 if (sps->max_num_ibc_merge_cand > 1)
1488 30794 merge_idx = ff_vvc_merge_idx(lc);
1489
1490 31034 ret = ff_vvc_luma_mv_merge_ibc(lc, merge_idx, &mi->mv[L0][0]);
1491
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 31034 times.
31034 if (ret)
1492 ✗ return ret;
1493 31034 ff_vvc_store_mv(lc, mi);
1494
1495 31034 return 0;
1496 }
1497
1498 412869 static int hls_merge_data(VVCLocalContext *lc)
1499 {
1500 412869 const VVCFrameContext *fc = lc->fc;
1501 412869 const VVCPH *ph = &fc->ps.ph;
1502 412869 const CodingUnit *cu = lc->cu;
1503 412869 PredictionUnit *pu = &lc->cu->pu;
1504 int ret;
1505
1506 412869 pu->merge_gpm_flag = 0;
1507 412869 pu->mi.num_sb_x = pu->mi.num_sb_y = 1;
1508
2/2
✓ Branch 0 taken 31034 times.
✓ Branch 1 taken 381835 times.
412869 if (cu->pred_mode == MODE_IBC) {
1509 31034 ret = merge_data_ibc(lc);
1510
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 31034 times.
31034 if (ret)
1511 ✗ return ret;
1512 } else {
1513
6/6
✓ Branch 0 taken 379906 times.
✓ Branch 1 taken 1929 times.
✓ Branch 2 taken 341788 times.
✓ Branch 3 taken 38118 times.
✓ Branch 4 taken 310328 times.
✓ Branch 5 taken 31460 times.
381835 if (ph->max_num_subblock_merge_cand > 0 && cu->cb_width >= 8 && cu->cb_height >= 8)
1514 310328 pu->merge_subblock_flag = ff_vvc_merge_subblock_flag(lc);
1515
2/2
✓ Branch 0 taken 54720 times.
✓ Branch 1 taken 327115 times.
381835 if (pu->merge_subblock_flag)
1516 54720 merge_data_subblock(lc);
1517 else
1518 327115 merge_data_block(lc);
1519 }
1520 412869 return 0;
1521 }
1522
1523 164135 static void hls_mvd_coding(VVCLocalContext *lc, Mv* mvd)
1524 {
1525 int32_t mv[2];
1526
1527
2/2
✓ Branch 0 taken 328270 times.
✓ Branch 1 taken 164135 times.
492405 for (int i = 0; i < 2; i++) {
1528 328270 mv[i] = ff_vvc_abs_mvd_greater0_flag(lc);
1529 }
1530
1531
2/2
✓ Branch 0 taken 328270 times.
✓ Branch 1 taken 164135 times.
492405 for (int i = 0; i < 2; i++) {
1532
2/2
✓ Branch 0 taken 204652 times.
✓ Branch 1 taken 123618 times.
328270 if (mv[i])
1533 204652 mv[i] += ff_vvc_abs_mvd_greater1_flag(lc);
1534 }
1535
1536
2/2
✓ Branch 0 taken 328270 times.
✓ Branch 1 taken 164135 times.
492405 for (int i = 0; i < 2; i++) {
1537
2/2
✓ Branch 0 taken 204652 times.
✓ Branch 1 taken 123618 times.
328270 if (mv[i] > 0) {
1538
2/2
✓ Branch 0 taken 146131 times.
✓ Branch 1 taken 58521 times.
204652 if (mv[i] == 2)
1539 146131 mv[i] += ff_vvc_abs_mvd_minus2(lc);
1540 204652 mv[i] = (1 - 2 * ff_vvc_mvd_sign_flag(lc)) * mv[i];
1541 }
1542 }
1543 164135 mvd->x = mv[0];
1544 164135 mvd->y = mv[1];
1545 164135 }
1546
1547 81046 static int bcw_idx_decode(VVCLocalContext *lc, const MotionInfo *mi, const int cb_width, const int cb_height)
1548 {
1549 81046 const VVCFrameContext *fc = lc->fc;
1550 81046 const VVCSPS *sps = fc->ps.sps;
1551 81046 const VVCPPS *pps = fc->ps.pps;
1552 81046 const VVCPH *ph = &fc->ps.ph;
1553 81046 const VVCSH *sh = &lc->sc->sh;
1554
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 81046 times.
81046 const PredWeightTable *w = pps->r->pps_wp_info_in_ph_flag ? &ph->pwt : &sh->pwt;
1555 81046 int bcw_idx = 0;
1556
1557
4/4
✓ Branch 0 taken 76906 times.
✓ Branch 1 taken 4140 times.
✓ Branch 2 taken 20933 times.
✓ Branch 3 taken 55973 times.
81046 if (sps->r->sps_bcw_enabled_flag && mi->pred_flag == PF_BI &&
1558
2/2
✓ Branch 0 taken 19581 times.
✓ Branch 1 taken 1352 times.
20933 !w->weight_flag[L0][LUMA][mi->ref_idx[0]] &&
1559
2/2
✓ Branch 0 taken 18935 times.
✓ Branch 1 taken 646 times.
19581 !w->weight_flag[L1][LUMA][mi->ref_idx[1]] &&
1560
2/2
✓ Branch 0 taken 18511 times.
✓ Branch 1 taken 424 times.
18935 !w->weight_flag[L0][CHROMA][mi->ref_idx[0]] &&
1561
2/2
✓ Branch 0 taken 18349 times.
✓ Branch 1 taken 162 times.
18511 !w->weight_flag[L1][CHROMA][mi->ref_idx[1]] &&
1562
2/2
✓ Branch 0 taken 12147 times.
✓ Branch 1 taken 6202 times.
18349 cb_width * cb_height >= 256) {
1563 12147 bcw_idx = ff_vvc_bcw_idx(lc, ff_vvc_no_backward_pred_flag(lc));
1564 }
1565 81046 return bcw_idx;
1566 }
1567
1568 102830 static int8_t ref_idx_decode(VVCLocalContext *lc, const VVCSH *sh, const int sym_mvd_flag, const int lx)
1569 {
1570 102830 const H266RawSliceHeader *rsh = sh->r;
1571 102830 int ref_idx = 0;
1572
1573
4/4
✓ Branch 0 taken 84743 times.
✓ Branch 1 taken 18087 times.
✓ Branch 2 taken 71767 times.
✓ Branch 3 taken 12976 times.
102830 if (rsh->num_ref_idx_active[lx] > 1 && !sym_mvd_flag)
1574 71767 ref_idx = ff_vvc_ref_idx_lx(lc, rsh->num_ref_idx_active[lx]);
1575
2/2
✓ Branch 0 taken 12976 times.
✓ Branch 1 taken 18087 times.
31063 else if (sym_mvd_flag)
1576 12976 ref_idx = sh->ref_idx_sym[lx];
1577 102830 return ref_idx;
1578 }
1579
1580 102830 static int mvds_decode(VVCLocalContext *lc, Mv mvds[2][MAX_CONTROL_POINTS],
1581 const int num_cp_mv, const int lx)
1582 {
1583 102830 const VVCFrameContext *fc = lc->fc;
1584 102830 const VVCPH *ph = &fc->ps.ph;
1585 102830 const PredictionUnit *pu = &lc->cu->pu;
1586 102830 const MotionInfo *mi = &pu->mi;
1587 102830 int has_no_zero_mvd = 0;
1588
1589
6/6
✓ Branch 0 taken 35473 times.
✓ Branch 1 taken 67357 times.
✓ Branch 2 taken 5040 times.
✓ Branch 3 taken 30433 times.
✓ Branch 4 taken 5026 times.
✓ Branch 5 taken 14 times.
102830 if (lx == L1 && ph->r->ph_mvd_l1_zero_flag && mi->pred_flag == PF_BI) {
1590
2/2
✓ Branch 0 taken 6400 times.
✓ Branch 1 taken 5026 times.
11426 for (int j = 0; j < num_cp_mv; j++)
1591 6400 AV_ZERO64(&mvds[lx][j]);
1592 } else {
1593 97804 Mv *mvd0 = &mvds[lx][0];
1594
4/4
✓ Branch 0 taken 30447 times.
✓ Branch 1 taken 67357 times.
✓ Branch 2 taken 6488 times.
✓ Branch 3 taken 23959 times.
97804 if (lx == L1 && pu->sym_mvd_flag) {
1595 6488 mvd0->x = -mvds[L0][0].x;
1596 6488 mvd0->y = -mvds[L0][0].y;
1597 } else {
1598 91316 hls_mvd_coding(lc, mvd0);
1599 }
1600
4/4
✓ Branch 0 taken 24273 times.
✓ Branch 1 taken 73531 times.
✓ Branch 2 taken 15243 times.
✓ Branch 3 taken 9030 times.
97804 has_no_zero_mvd |= (mvd0->x || mvd0->y);
1601
2/2
✓ Branch 0 taken 16679 times.
✓ Branch 1 taken 97804 times.
114483 for (int j = 1; j < num_cp_mv; j++) {
1602 16679 Mv *mvd = &mvds[lx][j];
1603 16679 hls_mvd_coding(lc, mvd);
1604 16679 mvd->x += mvd0->x;
1605 16679 mvd->y += mvd0->y;
1606
4/4
✓ Branch 0 taken 3079 times.
✓ Branch 1 taken 13600 times.
✓ Branch 2 taken 2044 times.
✓ Branch 3 taken 1035 times.
16679 has_no_zero_mvd |= (mvd->x || mvd->y);
1607 }
1608 }
1609 102830 return has_no_zero_mvd;
1610 }
1611
1612 81046 static void mvp_add_difference(MotionInfo *mi, const int num_cp_mv,
1613 const Mv mvds[2][MAX_CONTROL_POINTS], const int amvr_shift)
1614 {
1615
2/2
✓ Branch 0 taken 162092 times.
✓ Branch 1 taken 81046 times.
243138 for (int i = 0; i < 2; i++) {
1616 162092 const PredFlag mask = i + PF_L0;
1617
2/2
✓ Branch 0 taken 102830 times.
✓ Branch 1 taken 59262 times.
162092 if (mi->pred_flag & mask) {
1618
2/2
✓ Branch 0 taken 120883 times.
✓ Branch 1 taken 102830 times.
223713 for (int j = 0; j < num_cp_mv; j++) {
1619 120883 const Mv *mvd = &mvds[i][j];
1620 120883 mi->mv[i][j].x += mvd->x * (1 << amvr_shift);
1621 120883 mi->mv[i][j].y += mvd->y * (1 << amvr_shift);
1622 120883 ff_vvc_wrap_mv(&mi->mv[i][j]);
1623 }
1624 }
1625 }
1626 81046 }
1627
1628 56140 static int mvp_data_ibc(VVCLocalContext *lc)
1629 {
1630 56140 const VVCFrameContext *fc = lc->fc;
1631 56140 const CodingUnit *cu = lc->cu;
1632 56140 const PredictionUnit *pu = &lc->cu->pu;
1633 56140 const VVCSPS *sps = fc->ps.sps;
1634 56140 MotionInfo *mi = &lc->cu->pu.mi;
1635 56140 int mvp_l0_flag = 0;
1636 56140 int amvr_shift = 4;
1637 56140 Mv *mv = &mi->mv[L0][0];
1638 int ret;
1639
1640 56140 mi->pred_flag = PF_IBC;
1641 56140 mi->num_sb_x = 1;
1642 56140 mi->num_sb_y = 1;
1643
1644 56140 hls_mvd_coding(lc, mv);
1645
2/2
✓ Branch 0 taken 54798 times.
✓ Branch 1 taken 1342 times.
56140 if (sps->max_num_ibc_merge_cand > 1)
1646 54798 mvp_l0_flag = ff_vvc_mvp_lx_flag(lc);
1647
5/6
✓ Branch 0 taken 56140 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27887 times.
✓ Branch 3 taken 28253 times.
✓ Branch 4 taken 5392 times.
✓ Branch 5 taken 22495 times.
56140 if (sps->r->sps_amvr_enabled_flag && (mv->x || mv->y))
1648 33645 amvr_shift = ff_vvc_amvr_shift(lc, pu->inter_affine_flag, cu->pred_mode, 1);
1649
1650 56140 ret = ff_vvc_mvp_ibc(lc, mvp_l0_flag, amvr_shift, mv);
1651
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 56140 times.
56140 if (ret)
1652 ✗ return ret;
1653 56140 ff_vvc_store_mv(lc, mi);
1654
1655 56140 return 0;
1656 }
1657
1658 81046 static int mvp_data(VVCLocalContext *lc)
1659 {
1660 81046 const VVCFrameContext *fc = lc->fc;
1661 81046 const CodingUnit *cu = lc->cu;
1662 81046 PredictionUnit *pu = &lc->cu->pu;
1663 81046 const VVCSPS *sps = fc->ps.sps;
1664 81046 const VVCPH *ph = &fc->ps.ph;
1665 81046 const VVCSH *sh = &lc->sc->sh;
1666 81046 const H266RawSliceHeader *rsh = sh->r;
1667 81046 MotionInfo *mi = &pu->mi;
1668 81046 const int cb_width = cu->cb_width;
1669 81046 const int cb_height = cu->cb_height;
1670
1671 81046 int mvp_lx_flag[2] = {0};
1672 81046 int cu_affine_type_flag = 0;
1673 int num_cp_mv;
1674 81046 int amvr_enabled, has_no_zero_mvd = 0, amvr_shift;
1675 Mv mvds[2][MAX_CONTROL_POINTS];
1676
1677 81046 mi->pred_flag = ff_vvc_pred_flag(lc, IS_B(rsh));
1678
6/6
✓ Branch 0 taken 80642 times.
✓ Branch 1 taken 404 times.
✓ Branch 2 taken 43851 times.
✓ Branch 3 taken 36791 times.
✓ Branch 4 taken 30289 times.
✓ Branch 5 taken 13562 times.
81046 if (sps->r->sps_affine_enabled_flag && cb_width >= 16 && cb_height >= 16) {
1679 30289 pu->inter_affine_flag = ff_vvc_inter_affine_flag(lc);
1680 30289 set_cb_tab(lc, fc->tab.iaf, pu->inter_affine_flag);
1681
4/4
✓ Branch 0 taken 27943 times.
✓ Branch 1 taken 2346 times.
✓ Branch 2 taken 9334 times.
✓ Branch 3 taken 18609 times.
30289 if (sps->r->sps_6param_affine_enabled_flag && pu->inter_affine_flag)
1682 9334 cu_affine_type_flag = ff_vvc_cu_affine_type_flag(lc);
1683 }
1684 81046 mi->motion_model_idc = pu->inter_affine_flag + cu_affine_type_flag;
1685 81046 num_cp_mv = mi->motion_model_idc + 1;
1686
1687
4/4
✓ Branch 0 taken 68668 times.
✓ Branch 1 taken 12378 times.
✓ Branch 2 taken 57514 times.
✓ Branch 3 taken 11154 times.
81046 if (sps->r->sps_smvd_enabled_flag && !ph->r->ph_mvd_l1_zero_flag &&
1688
4/4
✓ Branch 0 taken 16147 times.
✓ Branch 1 taken 41367 times.
✓ Branch 2 taken 14750 times.
✓ Branch 3 taken 1397 times.
57514 mi->pred_flag == PF_BI && !pu->inter_affine_flag &&
1689
4/4
✓ Branch 0 taken 13652 times.
✓ Branch 1 taken 1098 times.
✓ Branch 2 taken 12921 times.
✓ Branch 3 taken 731 times.
14750 sh->ref_idx_sym[0] > -1 && sh->ref_idx_sym[1] > -1)
1690 12921 pu->sym_mvd_flag = ff_vvc_sym_mvd_flag(lc);
1691
1692
2/2
✓ Branch 0 taken 162092 times.
✓ Branch 1 taken 81046 times.
243138 for (int i = L0; i <= L1; i++) {
1693
2/2
✓ Branch 0 taken 81046 times.
✓ Branch 1 taken 81046 times.
162092 const PredFlag pred_flag = PF_L0 + !i;
1694
2/2
✓ Branch 0 taken 102830 times.
✓ Branch 1 taken 59262 times.
162092 if (mi->pred_flag != pred_flag) {
1695 102830 mi->ref_idx[i] = ref_idx_decode(lc, sh, pu->sym_mvd_flag, i);
1696 102830 has_no_zero_mvd |= mvds_decode(lc, mvds, num_cp_mv, i);
1697 102830 mvp_lx_flag[i] = ff_vvc_mvp_lx_flag(lc);
1698 }
1699 }
1700
1701 162092 amvr_enabled = mi->motion_model_idc == MOTION_TRANSLATION ?
1702
2/2
✓ Branch 0 taken 70868 times.
✓ Branch 1 taken 10178 times.
81046 sps->r->sps_amvr_enabled_flag : sps->r->sps_affine_amvr_enabled_flag;
1703 81046 amvr_enabled &= has_no_zero_mvd;
1704
1705 81046 amvr_shift = ff_vvc_amvr_shift(lc, pu->inter_affine_flag, cu->pred_mode, amvr_enabled);
1706
1707 81046 mi->hpel_if_idx = amvr_shift == 3;
1708 81046 mi->bcw_idx = bcw_idx_decode(lc, mi, cb_width, cb_height);
1709
1710
2/2
✓ Branch 0 taken 10178 times.
✓ Branch 1 taken 70868 times.
81046 if (mi->motion_model_idc)
1711 10178 ff_vvc_affine_mvp(lc, mvp_lx_flag, amvr_shift, mi);
1712 else
1713 70868 ff_vvc_mvp(lc, mvp_lx_flag, amvr_shift, mi);
1714
1715 81046 mvp_add_difference(mi, num_cp_mv, mvds, amvr_shift);
1716
1717
2/2
✓ Branch 0 taken 10178 times.
✓ Branch 1 taken 70868 times.
81046 if (mi->motion_model_idc)
1718 10178 ff_vvc_store_sb_mvs(lc, pu);
1719 else
1720 70868 ff_vvc_store_mv(lc, &pu->mi);
1721
1722 81046 return 0;
1723 }
1724
1725 // derive bdofFlag from 8.5.6 Decoding process for inter blocks
1726 // derive dmvr from 8.5.1 General decoding process for coding units coded in inter prediction mode
1727 370389 static void derive_dmvr_bdof_flag(const VVCLocalContext *lc, PredictionUnit *pu)
1728 {
1729 370389 const VVCFrameContext *fc = lc->fc;
1730 370389 const VVCPPS *pps = fc->ps.pps;
1731 370389 const VVCPH *ph = &fc->ps.ph;
1732 370389 const VVCSH *sh = &lc->sc->sh;
1733 370389 const int poc = ph->poc;
1734 370389 const MotionInfo *mi = &pu->mi;
1735 370389 const int8_t *ref_idx = mi->ref_idx;
1736 370389 const VVCRefPic *rp0 = &lc->sc->rpl[L0].refs[ref_idx[L0]];
1737 370389 const VVCRefPic *rp1 = &lc->sc->rpl[L1].refs[ref_idx[L1]];
1738 370389 const CodingUnit *cu = lc->cu;
1739
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 370389 times.
370389 const PredWeightTable *w = pps->r->pps_wp_info_in_ph_flag ? &fc->ps.ph.pwt : &sh->pwt;
1740
1741 370389 pu->bdof_flag = 0;
1742
1743
2/2
✓ Branch 0 taken 187129 times.
✓ Branch 1 taken 183260 times.
370389 if (mi->pred_flag == PF_BI &&
1744
2/2
✓ Branch 0 taken 125469 times.
✓ Branch 1 taken 61660 times.
187129 (poc - rp0->poc == rp1->poc - poc) &&
1745
4/4
✓ Branch 0 taken 125411 times.
✓ Branch 1 taken 58 times.
✓ Branch 2 taken 125378 times.
✓ Branch 3 taken 33 times.
125469 !rp0->is_lt && !rp1->is_lt &&
1746
2/2
✓ Branch 0 taken 122546 times.
✓ Branch 1 taken 2832 times.
125378 !cu->ciip_flag &&
1747
2/2
✓ Branch 0 taken 108039 times.
✓ Branch 1 taken 14507 times.
122546 !mi->bcw_idx &&
1748
4/4
✓ Branch 0 taken 106925 times.
✓ Branch 1 taken 1114 times.
✓ Branch 2 taken 106924 times.
✓ Branch 3 taken 1 times.
108039 !w->weight_flag[L0][LUMA][ref_idx[L0]] && !w->weight_flag[L1][LUMA][ref_idx[L1]] &&
1749
4/4
✓ Branch 0 taken 106906 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 106891 times.
✓ Branch 3 taken 15 times.
106924 !w->weight_flag[L0][CHROMA][ref_idx[L0]] && !w->weight_flag[L1][CHROMA][ref_idx[L1]] &&
1750
4/4
✓ Branch 0 taken 100966 times.
✓ Branch 1 taken 5925 times.
✓ Branch 2 taken 97037 times.
✓ Branch 3 taken 3929 times.
106891 cu->cb_width >= 8 && cu->cb_height >= 8 &&
1751
2/2
✓ Branch 0 taken 91072 times.
✓ Branch 1 taken 5965 times.
97037 (cu->cb_width * cu->cb_height >= 128) &&
1752
2/4
✓ Branch 0 taken 91072 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 91072 times.
✗ Branch 3 not taken.
91072 !rp0->is_scaled && !rp1->is_scaled) {
1753
2/2
✓ Branch 0 taken 88518 times.
✓ Branch 1 taken 2554 times.
91072 if (!ph->r->ph_bdof_disabled_flag &&
1754
1/2
✓ Branch 0 taken 88518 times.
✗ Branch 1 not taken.
88518 mi->motion_model_idc == MOTION_TRANSLATION &&
1755
1/2
✓ Branch 0 taken 88518 times.
✗ Branch 1 not taken.
88518 !pu->merge_subblock_flag &&
1756
2/2
✓ Branch 0 taken 85573 times.
✓ Branch 1 taken 2945 times.
88518 !pu->sym_mvd_flag)
1757 85573 pu->bdof_flag = 1;
1758
2/2
✓ Branch 0 taken 86061 times.
✓ Branch 1 taken 5011 times.
91072 if (!ph->r->ph_dmvr_disabled_flag &&
1759
2/2
✓ Branch 0 taken 80493 times.
✓ Branch 1 taken 5568 times.
86061 pu->general_merge_flag &&
1760
2/2
✓ Branch 0 taken 73298 times.
✓ Branch 1 taken 7195 times.
80493 !pu->mmvd_merge_flag)
1761 73298 pu->dmvr_flag = 1;
1762 }
1763 370389 }
1764
1765 // part of 8.5.1 General decoding process for coding units coded in inter prediction mode
1766 370389 static void refine_regular_subblock(const VVCLocalContext *lc)
1767 {
1768 370389 const CodingUnit *cu = lc->cu;
1769 370389 PredictionUnit *pu = &lc->cu->pu;
1770
1771 370389 derive_dmvr_bdof_flag(lc, pu);
1772
4/4
✓ Branch 0 taken 297091 times.
✓ Branch 1 taken 73298 times.
✓ Branch 2 taken 12275 times.
✓ Branch 3 taken 284816 times.
370389 if (pu->dmvr_flag || pu->bdof_flag) {
1773
2/2
✓ Branch 0 taken 51939 times.
✓ Branch 1 taken 33634 times.
85573 pu->mi.num_sb_x = (cu->cb_width > 16) ? (cu->cb_width >> 4) : 1;
1774
2/2
✓ Branch 0 taken 48935 times.
✓ Branch 1 taken 36638 times.
85573 pu->mi.num_sb_y = (cu->cb_height > 16) ? (cu->cb_height >> 4) : 1;
1775 }
1776 370389 }
1777
1778 476757 static void fill_dmvr_info(const VVCLocalContext *lc)
1779 {
1780 476757 const VVCFrameContext *fc = lc->fc;
1781 476757 const CodingUnit *cu = lc->cu;
1782
1783
3/4
✓ Branch 0 taken 389583 times.
✓ Branch 1 taken 87174 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 389583 times.
476757 if (cu->pred_mode == MODE_IBC || cu->pred_mode == MODE_PLT) {
1784
1/2
✓ Branch 0 taken 87174 times.
✗ Branch 1 not taken.
87174 ff_vvc_set_intra_mvf(lc, true, cu->pred_mode == MODE_IBC ? PF_IBC : PF_PLT, false);
1785 } else {
1786 389583 const VVCPPS *pps = fc->ps.pps;
1787 389583 const int w = cu->cb_width >> MIN_PU_LOG2;
1788
1789
2/2
✓ Branch 0 taken 2235424 times.
✓ Branch 1 taken 389583 times.
2625007 for (int y = cu->y0 >> MIN_PU_LOG2; y < (cu->y0 + cu->cb_height) >> MIN_PU_LOG2; y++) {
1790 2235424 const int idx = pps->min_pu_width * y + (cu->x0 >> MIN_PU_LOG2);
1791 2235424 const MvField *mvf = fc->tab.mvf + idx;
1792 2235424 MvField *dmvr_mvf = fc->ref->tab_dmvr_mvf + idx;
1793
1794 2235424 memcpy(dmvr_mvf, mvf, sizeof(MvField) * w);
1795 }
1796 }
1797 476757 }
1798
1799 550055 static int inter_data(VVCLocalContext *lc)
1800 {
1801 550055 const CodingUnit *cu = lc->cu;
1802 550055 PredictionUnit *pu = &lc->cu->pu;
1803 550055 const MotionInfo *mi = &pu->mi;
1804 550055 int ret = 0;
1805
1806 550055 pu->general_merge_flag = 1;
1807
2/2
✓ Branch 0 taken 264030 times.
✓ Branch 1 taken 286025 times.
550055 if (!cu->skip_flag)
1808 264030 pu->general_merge_flag = ff_vvc_general_merge_flag(lc);
1809
1810
2/2
✓ Branch 0 taken 412869 times.
✓ Branch 1 taken 137186 times.
550055 if (pu->general_merge_flag) {
1811 412869 ret = hls_merge_data(lc);
1812
2/2
✓ Branch 0 taken 56140 times.
✓ Branch 1 taken 81046 times.
137186 } else if (cu->pred_mode == MODE_IBC) {
1813 56140 ret = mvp_data_ibc(lc);
1814 } else {
1815 81046 ret = mvp_data(lc);
1816 }
1817
1818
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 550055 times.
550055 if (ret)
1819 ✗ return ret;
1820
1821
2/2
✓ Branch 0 taken 87174 times.
✓ Branch 1 taken 462881 times.
550055 if (cu->pred_mode == MODE_IBC) {
1822 87174 ff_vvc_update_hmvp(lc, mi);
1823
6/6
✓ Branch 0 taken 435287 times.
✓ Branch 1 taken 27594 times.
✓ Branch 2 taken 399307 times.
✓ Branch 3 taken 35980 times.
✓ Branch 4 taken 370389 times.
✓ Branch 5 taken 28918 times.
462881 } else if (!pu->merge_gpm_flag && !pu->inter_affine_flag && !pu->merge_subblock_flag) {
1824 370389 refine_regular_subblock(lc);
1825 370389 ff_vvc_update_hmvp(lc, mi);
1826 }
1827
1828
2/2
✓ Branch 0 taken 476757 times.
✓ Branch 1 taken 73298 times.
550055 if (!pu->dmvr_flag)
1829 476757 fill_dmvr_info(lc);
1830 550055 return ret;
1831 }
1832
1833 6977 static TransformUnit* palette_add_tu(VVCLocalContext *lc, const int start, const int end, const VVCTreeType tree_type)
1834 {
1835 6977 CodingUnit *cu = lc->cu;
1836 6977 const VVCSPS *sps = lc->fc->ps.sps;
1837 6977 TransformUnit *tu = add_tu(lc->fc, cu, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
1838
1839
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6977 times.
6977 if (!tu)
1840 ✗ return NULL;
1841
1842
2/2
✓ Branch 0 taken 19123 times.
✓ Branch 1 taken 6977 times.
26100 for (int c = start; c < end; c++) {
1843 19123 const int w = tu->width >> sps->hshift[c];
1844 19123 const int h = tu->height >> sps->vshift[c];
1845 19123 TransformBlock *tb = add_tb(tu, lc, tu->x0, tu->y0, w, h, c);
1846
2/2
✓ Branch 0 taken 13050 times.
✓ Branch 1 taken 6073 times.
19123 if (c != CR)
1847 13050 set_tb_size(lc->fc, tb);
1848 }
1849
1850
2/2
✓ Branch 0 taken 20931 times.
✓ Branch 1 taken 6977 times.
27908 for (int i = 0; i < FF_ARRAY_ELEMS(cu->plt); i++)
1851 20931 cu->plt[i].size = 0;
1852
1853 6977 return tu;
1854 }
1855
1856 6977 static int palette_predicted(VVCLocalContext *lc, const bool local_dual_tree, int start, int end,
1857 bool *predictor_reused, const int predictor_size, const int max_entries)
1858 {
1859 6977 CodingUnit *cu = lc->cu;
1860 6977 int nb_predicted = 0;
1861
1862
2/2
✓ Branch 0 taken 904 times.
✓ Branch 1 taken 6073 times.
6977 if (local_dual_tree) {
1863 904 start = LUMA;
1864 904 end = VVC_MAX_SAMPLE_ARRAYS;
1865 }
1866
1867
3/4
✓ Branch 0 taken 43246 times.
✓ Branch 1 taken 131 times.
✓ Branch 2 taken 43246 times.
✗ Branch 3 not taken.
43377 for (int i = 0; i < predictor_size && nb_predicted < max_entries; i++) {
1868 43246 const int run = ff_vvc_palette_predictor_run(lc, predictor_size - i);
1869
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 43246 times.
43246 if (run < 0)
1870 ✗ return run;
1871
1872
2/2
✓ Branch 0 taken 6846 times.
✓ Branch 1 taken 36400 times.
43246 if (run == 1)
1873 6846 break;
1874
1875
2/2
✓ Branch 0 taken 16254 times.
✓ Branch 1 taken 20146 times.
36400 if (run > 1)
1876 16254 i += run - 1;
1877
1878 36400 predictor_reused[i] = true;
1879
2/2
✓ Branch 0 taken 109200 times.
✓ Branch 1 taken 36400 times.
145600 for (int c = start; c < end; c++)
1880 109200 cu->plt[c].entries[nb_predicted] = lc->ep->pp[c].entries[i];
1881 36400 nb_predicted++;
1882 }
1883
1884
2/2
✓ Branch 0 taken 20931 times.
✓ Branch 1 taken 6977 times.
27908 for (int c = start; c < end; c++)
1885 20931 cu->plt[c].size = nb_predicted;
1886
1887 6977 return 0;
1888 }
1889
1890 6977 static int palette_signaled(VVCLocalContext *lc, const bool local_dual_tree,
1891 const int start, const int end, const int max_entries)
1892 {
1893 6977 const VVCSPS *sps = lc->fc->ps.sps;
1894 6977 CodingUnit *cu = lc->cu;
1895 6977 const int nb_predicted = cu->plt[start].size;
1896
1/2
✓ Branch 0 taken 6977 times.
✗ Branch 1 not taken.
6977 const int nb_signaled = nb_predicted < max_entries ? ff_vvc_num_signalled_palette_entries(lc, max_entries - nb_predicted) : 0;
1897 6977 const int size = nb_predicted + nb_signaled;
1898
3/4
✓ Branch 0 taken 904 times.
✓ Branch 1 taken 6073 times.
✓ Branch 2 taken 904 times.
✗ Branch 3 not taken.
6977 const bool dual_tree_luma = local_dual_tree && cu->tree_type == DUAL_TREE_LUMA;
1899
1900
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6977 times.
6977 if (nb_signaled < 0)
1901 ✗ return AVERROR_INVALIDDATA;
1902
1903
2/2
✓ Branch 0 taken 19123 times.
✓ Branch 1 taken 6977 times.
26100 for (int c = start; c < end; c++) {
1904 19123 Palette *plt = cu->plt + c;
1905
2/2
✓ Branch 0 taken 4254 times.
✓ Branch 1 taken 19123 times.
23377 for (int i = nb_predicted; i < size; i++) {
1906 4254 plt->entries[i] = ff_vvc_new_palette_entries(lc, sps->bit_depth);
1907
2/2
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 4170 times.
4254 if (dual_tree_luma) {
1908 84 plt[CB].entries[i] = 1 << (sps->bit_depth - 1);
1909 84 plt[CR].entries[i] = 1 << (sps->bit_depth - 1);
1910 }
1911 }
1912 19123 plt->size = size;
1913 }
1914
1915 6977 return 0;
1916 }
1917
1918 6977 static void palette_update_predictor(VVCLocalContext *lc, const bool local_dual_tree, int start, int end,
1919 bool *predictor_reused, const int predictor_size)
1920 {
1921 6977 CodingUnit *cu = lc->cu;
1922
3/4
✓ Branch 0 taken 904 times.
✓ Branch 1 taken 6073 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 904 times.
6977 const int max_predictor = VVC_MAX_NUM_PALETTE_PREDICTOR_SIZE >> (cu->tree_type != SINGLE_TREE && !local_dual_tree);
1923
1924
2/2
✓ Branch 0 taken 904 times.
✓ Branch 1 taken 6073 times.
6977 if (local_dual_tree) {
1925 904 start = LUMA;
1926 904 end = VVC_MAX_SAMPLE_ARRAYS;
1927 }
1928
1929
2/2
✓ Branch 0 taken 20931 times.
✓ Branch 1 taken 6977 times.
27908 for (int c = start; c < end; c++) {
1930 20931 Palette *pp = lc->ep->pp + c;
1931 20931 Palette *plt = cu->plt + c;
1932 20931 int i = cu->plt[start].size;;
1933
1934 // copy unused predictors to the end of plt
1935
4/4
✓ Branch 0 taken 1126350 times.
✓ Branch 1 taken 19560 times.
✓ Branch 2 taken 1124979 times.
✓ Branch 3 taken 1371 times.
1145910 for (int j = 0; j < predictor_size && i < max_predictor; j++) {
1936
2/2
✓ Branch 0 taken 1016130 times.
✓ Branch 1 taken 108849 times.
1124979 if (!predictor_reused[j]) {
1937 1016130 plt->entries[i] = pp->entries[j];
1938 1016130 i++;
1939 }
1940 }
1941
1942 20931 memcpy(pp->entries, plt->entries, i * sizeof(pp->entries[0]));
1943 20931 pp->size = i;
1944 }
1945 6977 }
1946
1947 6977 static int palette_qp(VVCLocalContext *lc, VVCTreeType tree_type, const bool escape_present)
1948 {
1949 6977 const VVCFrameContext *fc = lc->fc;
1950 6977 const VVCPPS *pps = fc->ps.pps;
1951 6977 const H266RawSliceHeader *rsh = lc->sc->sh.r;
1952 6977 const CodingUnit *cu = lc->cu;
1953 int ret;
1954
1955
1/2
✓ Branch 0 taken 6977 times.
✗ Branch 1 not taken.
6977 if (tree_type != DUAL_TREE_CHROMA) {
1956 7024 const bool has_qp_delta = escape_present &&
1957
3/6
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 6930 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 47 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6977 pps->r->pps_cu_qp_delta_enabled_flag && !lc->parse.is_cu_qp_delta_coded;
1958 6977 ret = set_qp_y(lc, cu->x0, cu->y0, has_qp_delta);
1959
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6977 times.
6977 if (ret < 0)
1960 ✗ return ret;
1961 }
1962
1963
2/2
✓ Branch 0 taken 6073 times.
✓ Branch 1 taken 904 times.
6977 if (tree_type != DUAL_TREE_LUMA) {
1964
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6073 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6073 if (rsh->sh_cu_chroma_qp_offset_enabled_flag && !lc->parse.is_cu_chroma_qp_offset_coded)
1965 ✗ chroma_qp_offset_decode(lc, 0, 1);
1966 6073 set_qp_c(lc);
1967 }
1968
1969 6977 return 0;
1970 }
1971
1972 #define PALETTE_SET_PIXEL(xc, yc, pix) \
1973 do { \
1974 const int off = ((xc) >> hs) + ((yc) >> vs) * tb->tb_width; \
1975 if (sps->bit_depth == 8) \
1976 u8[off] = pix; \
1977 else \
1978 u16[off] = pix; \
1979 } while (0)
1980
1981 #define PALETTE_INDEX(x, y) index[(y) * width + (x)]
1982
1983 // 6.5.3 Horizontal and vertical traverse scan order array initialization process
1984 // The hTravScan and vTravScan tables require approximately 576 KB of memory.
1985 // To save space, we use a macro to achieve the same functionality.
1986 #define TRAV_COL(p, wlog, mask) ((p & mask) ^ (-((p >> wlog) & 1) & mask))
1987 #define TRAV_ROW(p, hlog) (p >> hlog)
1988 #define TRAV(trans, p, wlog, hlog, mask) (trans ? TRAV_ROW((p), hlog) : TRAV_COL((p), wlog, mask))
1989 #define TRAV_X(pos) TRAV(transpose, pos, wlog2, hlog2, wmask)
1990 #define TRAV_Y(pos) TRAV(!transpose, pos, hlog2, wlog2, hmask)
1991
1992 86464 static int palette_subblock_data(VVCLocalContext *lc,
1993 const int max_index, const int subset_id, const bool transpose,
1994 uint8_t *run_type, uint8_t *index, int *prev_run_pos, bool *adjust)
1995 {
1996 86464 const CodingUnit *cu = lc->cu;
1997 86464 TransformUnit *tu = cu->tus.head;
1998 86464 const VVCSPS *sps = lc->fc->ps.sps;
1999 86464 const int width = tu->tbs[0].tb_width;
2000 86464 const int height = tu->tbs[0].tb_height;
2001 86464 const int min_pos = subset_id << 4;
2002
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86464 times.
86464 const int max_pos = FFMIN(min_pos + 16, width * height);
2003 86464 const int wmask = width - 1;
2004 86464 const int hmask = height - 1;
2005 86464 const int wlog2 = av_log2(width);
2006 86464 const int hlog2 = av_log2(height);
2007 86464 const int start_idx = tu->tbs[0].c_idx;
2008 86464 const uint8_t esc = cu->plt[tu->tbs[0].c_idx].size;
2009 86464 uint8_t run_copy[16] = { 0 };
2010
2011
2/2
✓ Branch 0 taken 1383424 times.
✓ Branch 1 taken 86464 times.
1469888 for (int i = min_pos; i < max_pos; i++) {
2012
2/2
✓ Branch 0 taken 186304 times.
✓ Branch 1 taken 1197120 times.
1383424 const int xc = TRAV_X(i);
2013
2/2
✓ Branch 0 taken 1197120 times.
✓ Branch 1 taken 186304 times.
1383424 const int yc = TRAV_Y(i);
2014
2015
4/4
✓ Branch 0 taken 1376447 times.
✓ Branch 1 taken 6977 times.
✓ Branch 2 taken 1000866 times.
✓ Branch 3 taken 375581 times.
1383424 if (i > 0 && max_index > 0)
2016 1000866 run_copy[i - min_pos] = ff_vvc_run_copy_flag(lc, run_type[i - 1], *prev_run_pos, i);
2017
2018 1383424 run_type[i] = 0;
2019
4/4
✓ Branch 0 taken 1007328 times.
✓ Branch 1 taken 376096 times.
✓ Branch 2 taken 150412 times.
✓ Branch 3 taken 856916 times.
1383424 if (max_index > 0 && !run_copy[i - min_pos]) {
2020
8/8
✓ Branch 0 taken 119284 times.
✓ Branch 1 taken 31128 times.
✓ Branch 2 taken 19742 times.
✓ Branch 3 taken 99542 times.
✓ Branch 4 taken 31128 times.
✓ Branch 5 taken 19742 times.
✓ Branch 6 taken 24732 times.
✓ Branch 7 taken 6396 times.
150412 if (((!transpose && yc > 0) || (transpose && xc > 0))
2021
3/4
✓ Branch 0 taken 124274 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 105524 times.
✓ Branch 3 taken 18750 times.
124274 && i > 0 && !run_type[i - 1]) {
2022 105524 run_type[i] = ff_vvc_copy_above_palette_indices_flag(lc);
2023 }
2024 150412 *prev_run_pos = i;
2025
2/2
✓ Branch 0 taken 1232497 times.
✓ Branch 1 taken 515 times.
1233012 } else if (i > 0) {
2026 1232497 run_type[i] = run_type[i - 1];
2027 }
2028 }
2029
2030
2/2
✓ Branch 0 taken 1383424 times.
✓ Branch 1 taken 86464 times.
1469888 for (int i = min_pos; i < max_pos; i++) {
2031
2/2
✓ Branch 0 taken 186304 times.
✓ Branch 1 taken 1197120 times.
1383424 const int xc = TRAV_X(i);
2032
2/2
✓ Branch 0 taken 1197120 times.
✓ Branch 1 taken 186304 times.
1383424 const int yc = TRAV_Y(i);
2033
4/4
✓ Branch 0 taken 1376447 times.
✓ Branch 1 taken 6977 times.
✓ Branch 2 taken 184488 times.
✓ Branch 3 taken 1191959 times.
1383424 const int prev_xc = i > 0 ? TRAV_X(i - 1) : 0;
2034
4/4
✓ Branch 0 taken 1376447 times.
✓ Branch 1 taken 6977 times.
✓ Branch 2 taken 1191959 times.
✓ Branch 3 taken 184488 times.
1383424 const int prev_yc = i > 0 ? TRAV_Y(i - 1) : 0;
2035
2036 1383424 int idx = 0;
2037
6/6
✓ Branch 0 taken 1007328 times.
✓ Branch 1 taken 376096 times.
✓ Branch 2 taken 150412 times.
✓ Branch 3 taken 856916 times.
✓ Branch 4 taken 129241 times.
✓ Branch 5 taken 21171 times.
1383424 if (max_index > 0 && !run_copy[i - min_pos] && !run_type[i]) {
2038
2/2
✓ Branch 0 taken 111753 times.
✓ Branch 1 taken 17488 times.
129241 if (max_index - *adjust > 0)
2039 111753 idx = ff_vvc_palette_idx_idc(lc, max_index, *adjust);
2040
2/2
✓ Branch 0 taken 122779 times.
✓ Branch 1 taken 6462 times.
129241 if (i > 0) {
2041 245558 const int ref_idx = !run_type[i - 1] ?
2042
2/2
✓ Branch 0 taken 104029 times.
✓ Branch 1 taken 18750 times.
122779 PALETTE_INDEX(prev_xc, prev_yc) : PALETTE_INDEX(xc - transpose, yc - !transpose);
2043 122779 idx += (idx >= ref_idx);
2044 }
2045 129241 *adjust = true;
2046 } else {
2047 1254183 idx = PALETTE_INDEX(prev_xc, prev_yc);
2048 }
2049
2050
2/2
✓ Branch 0 taken 1002075 times.
✓ Branch 1 taken 381349 times.
1383424 if (!run_type[i])
2051 1002075 PALETTE_INDEX(xc, yc) = idx;
2052 else
2053 381349 PALETTE_INDEX(xc, yc) = PALETTE_INDEX(xc - transpose, yc - !transpose);
2054 }
2055
2056
2/2
✓ Branch 0 taken 252688 times.
✓ Branch 1 taken 86464 times.
339152 for (int c = 0; c < tu->nb_tbs; c++) {
2057 252688 TransformBlock *tb = &tu->tbs[c];
2058 252688 const int c_idx = tb->c_idx;
2059 252688 const Palette *plt = &cu->plt[c_idx];
2060 252688 const int scale = ff_vvc_palette_derive_scale(lc, tu, tb);
2061 252688 const int hs = sps->hshift[c_idx] - sps->hshift[start_idx];
2062 252688 const int vs = sps->vshift[c_idx] - sps->vshift[start_idx];
2063 252688 uint8_t *u8 = (uint8_t *)tb->coeffs;
2064 252688 uint16_t *u16 = (uint16_t *)tb->coeffs;
2065
2066
2/2
✓ Branch 0 taken 4043008 times.
✓ Branch 1 taken 252688 times.
4295696 for (int i = min_pos; i < max_pos; i++) {
2067
2/2
✓ Branch 0 taken 518464 times.
✓ Branch 1 taken 3524544 times.
4043008 const int xc = TRAV_X(i);
2068
2/2
✓ Branch 0 taken 3524544 times.
✓ Branch 1 taken 518464 times.
4043008 const int yc = TRAV_Y(i);
2069
3/4
✓ Branch 0 taken 3257344 times.
✓ Branch 1 taken 785664 times.
✓ Branch 2 taken 3257344 times.
✗ Branch 3 not taken.
4043008 if (!(xc & hs) && !(yc & vs)) {
2070 3257344 const int v = PALETTE_INDEX(xc, yc);
2071
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 3257195 times.
3257344 if (v == esc) {
2072 149 const int coeff = ff_vvc_palette_escape_val(lc, (1 << sps->bit_depth) - 1);
2073
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 149 times.
149 if (coeff < 0)
2074 ✗ return AVERROR_INVALIDDATA;
2075
2/2
✓ Branch 0 taken 120 times.
✓ Branch 1 taken 29 times.
149 const int pixel = av_clip_intp2(RSHIFT(coeff * scale, 6), sps->bit_depth);
2076
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 149 times.
149 PALETTE_SET_PIXEL(xc, yc, pixel);
2077 } else {
2078
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3257195 times.
3257195 PALETTE_SET_PIXEL(xc, yc, plt->entries[v]);
2079 }
2080 }
2081 }
2082 }
2083
2084 86464 return 0;
2085 }
2086
2087 6977 static int hls_palette_coding(VVCLocalContext *lc, const VVCTreeType tree_type)
2088 {
2089 6977 const VVCFrameContext *fc = lc->fc;
2090 6977 const VVCSPS *sps = fc->ps.sps;
2091 6977 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2092 6977 CodingUnit *cu = lc->cu;
2093 6977 Palette *pp = lc->ep->pp;
2094
2/2
✓ Branch 0 taken 6073 times.
✓ Branch 1 taken 904 times.
6977 const int max_entries = tree_type == SINGLE_TREE ? 31 : 15;
2095
2/2
✓ Branch 0 taken 904 times.
✓ Branch 1 taken 6073 times.
7881 const bool local_dual_tree = tree_type != SINGLE_TREE &&
2096
3/6
✓ Branch 0 taken 904 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 904 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 904 times.
✗ Branch 5 not taken.
904 (!IS_I(rsh) || (IS_I(rsh) && !sps->r->sps_qtbtt_dual_tree_intra_flag));
2097 6977 bool escape_present = false;
2098 6977 bool transpose = false;
2099 6977 bool adjust = false;
2100 6977 int max_index = 0;
2101 6977 int prev_run_pos = 0;
2102
2103 int predictor_size, start, end, ret;
2104 bool reused[VVC_MAX_NUM_PALETTE_PREDICTOR_SIZE];
2105 uint8_t run_type[MAX_PALETTE_CU_SIZE * MAX_PALETTE_CU_SIZE];
2106 uint8_t index[MAX_PALETTE_CU_SIZE * MAX_PALETTE_CU_SIZE];
2107
2108 TransformUnit *tu;
2109
2110 6977 ff_vvc_channel_range(&start, &end, tree_type, sps->r->sps_chroma_format_idc);
2111
2112 6977 tu = palette_add_tu(lc, start, end, tree_type);
2113
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6977 times.
6977 if (!tu)
2114 ✗ return AVERROR(ENOMEM);
2115
2116 6977 predictor_size = pp[start].size;
2117 6977 memset(reused, 0, sizeof(reused[0]) * predictor_size);
2118
2119 6977 ret = palette_predicted(lc, local_dual_tree, start, end, reused, predictor_size, max_entries);
2120
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6977 times.
6977 if (ret < 0)
2121 ✗ return ret;
2122
2123 6977 ret = palette_signaled(lc, local_dual_tree, start, end, max_entries);
2124
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6977 times.
6977 if (ret < 0)
2125 ✗ return ret;
2126
2127 6977 palette_update_predictor(lc, local_dual_tree, start, end, reused, predictor_size);
2128
2129
1/2
✓ Branch 0 taken 6977 times.
✗ Branch 1 not taken.
6977 if (cu->plt[start].size > 0)
2130 6977 escape_present = ff_vvc_palette_escape_val_present_flag(lc);
2131
2132 6977 max_index = cu->plt[start].size - 1 + escape_present;
2133
2/2
✓ Branch 0 taken 6462 times.
✓ Branch 1 taken 515 times.
6977 if (max_index > 0) {
2134 6462 adjust = false;
2135 6462 transpose = ff_vvc_palette_transpose_flag(lc);
2136 }
2137
2138 6977 ret = palette_qp(lc, tree_type, escape_present);
2139
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6977 times.
6977 if (ret < 0)
2140 ✗ return ret;
2141
2142 6977 index[0] = 0;
2143
2/2
✓ Branch 0 taken 86464 times.
✓ Branch 1 taken 6977 times.
93441 for (int i = 0; i <= (tu->tbs[0].tb_width * tu->tbs[0].tb_height - 1) >> 4; i++) {
2144 86464 ret = palette_subblock_data(lc, max_index, i, transpose,
2145 run_type, index, &prev_run_pos, &adjust);
2146
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86464 times.
86464 if (ret < 0)
2147 ✗ return ret;
2148 }
2149
2150 6977 return 0;
2151 }
2152
2153 836875 static int intra_data(VVCLocalContext *lc)
2154 {
2155 836875 const VVCSPS *sps = lc->fc->ps.sps;
2156 836875 const CodingUnit *cu = lc->cu;
2157 836875 const VVCTreeType tree_type = cu->tree_type;
2158 836875 const bool pred_mode_plt_flag = cu->pred_mode == MODE_PLT;
2159 836875 int ret = 0;
2160
2161
4/4
✓ Branch 0 taken 745369 times.
✓ Branch 1 taken 91506 times.
✓ Branch 2 taken 552647 times.
✓ Branch 3 taken 192722 times.
836875 if (tree_type == SINGLE_TREE || tree_type == DUAL_TREE_LUMA) {
2162
2/2
✓ Branch 0 taken 6977 times.
✓ Branch 1 taken 637176 times.
644153 if (pred_mode_plt_flag) {
2163
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6977 times.
6977 if ((ret = hls_palette_coding(lc, tree_type)) < 0)
2164 ✗ return ret;
2165 6977 ff_vvc_set_intra_mvf(lc, false, PF_PLT, false);
2166 } else {
2167 637176 intra_luma_pred_modes(lc);
2168 637176 ff_vvc_set_intra_mvf(lc, false, PF_INTRA, cu->ciip_flag);
2169 }
2170 }
2171
6/6
✓ Branch 0 taken 745369 times.
✓ Branch 1 taken 91506 times.
✓ Branch 2 taken 192722 times.
✓ Branch 3 taken 552647 times.
✓ Branch 4 taken 269106 times.
✓ Branch 5 taken 15122 times.
836875 if ((tree_type == SINGLE_TREE || tree_type == DUAL_TREE_CHROMA) && sps->r->sps_chroma_format_idc) {
2172
3/4
✓ Branch 0 taken 6073 times.
✓ Branch 1 taken 263033 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6073 times.
269106 if (pred_mode_plt_flag && tree_type == DUAL_TREE_CHROMA) {
2173 ✗ if ((ret = hls_palette_coding(lc, tree_type)) < 0)
2174 ✗ return ret;
2175
2/2
✓ Branch 0 taken 263033 times.
✓ Branch 1 taken 6073 times.
269106 } else if (!pred_mode_plt_flag) {
2176 263033 intra_chroma_pred_modes(lc);
2177 }
2178 }
2179
2180 836875 return ret;
2181 }
2182
2183 1386930 static int hls_coding_unit(VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height,
2184 int cqt_depth, const VVCTreeType tree_type, VVCModeType mode_type)
2185 {
2186 1386930 const VVCFrameContext *fc = lc->fc;
2187 1386930 const VVCSPS *sps = fc->ps.sps;
2188 1386930 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2189
4/4
✓ Branch 0 taken 1360527 times.
✓ Branch 1 taken 26403 times.
✓ Branch 2 taken 2342 times.
✓ Branch 3 taken 1358185 times.
1386930 const int is_128 = cb_width > 64 || cb_height > 64;
2190 1386930 int ret = 0;
2191
2192 1386930 CodingUnit *cu = add_cu(lc, x0, y0, cb_width, cb_height, cqt_depth, tree_type);
2193
2194
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1386930 times.
1386930 if (!cu)
2195 ✗ return AVERROR(ENOMEM);
2196
2197 1386930 ff_vvc_set_neighbour_available(lc, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
2198
2199
3/4
✓ Branch 0 taken 757326 times.
✓ Branch 1 taken 629604 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 757326 times.
1386930 if (IS_I(rsh) && is_128)
2200 ✗ mode_type = MODE_TYPE_INTRA;
2201 1386930 cu->pred_mode = pred_mode_decode(lc, tree_type, mode_type);
2202
2203
5/6
✓ Branch 0 taken 829898 times.
✓ Branch 1 taken 557032 times.
✓ Branch 2 taken 8309 times.
✓ Branch 3 taken 821589 times.
✓ Branch 4 taken 8309 times.
✗ Branch 5 not taken.
1386930 if (cu->pred_mode == MODE_INTRA && sps->r->sps_act_enabled_flag && tree_type == SINGLE_TREE)
2204 8309 cu->act_enabled_flag = ff_vvc_cu_act_enabled_flag(lc);
2205
2206
4/4
✓ Branch 0 taken 557032 times.
✓ Branch 1 taken 829898 times.
✓ Branch 2 taken 6977 times.
✓ Branch 3 taken 550055 times.
1386930 if (cu->pred_mode == MODE_INTRA || cu->pred_mode == MODE_PLT)
2207 836875 ret = intra_data(lc);
2208
1/2
✓ Branch 0 taken 550055 times.
✗ Branch 1 not taken.
550055 else if (tree_type != DUAL_TREE_CHROMA) /* MODE_INTER or MODE_IBC */
2209 550055 ret = inter_data(lc);
2210
2211
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1386930 times.
1386930 if (ret < 0)
2212 ✗ return ret;
2213
2214
6/6
✓ Branch 0 taken 557032 times.
✓ Branch 1 taken 829898 times.
✓ Branch 2 taken 550055 times.
✓ Branch 3 taken 6977 times.
✓ Branch 4 taken 137186 times.
✓ Branch 5 taken 412869 times.
1386930 if (cu->pred_mode != MODE_INTRA && cu->pred_mode != MODE_PLT && !lc->cu->pu.general_merge_flag)
2215 137186 cu->coded_flag = ff_vvc_cu_coded_flag(lc);
2216 else
2217
4/4
✓ Branch 0 taken 963719 times.
✓ Branch 1 taken 286025 times.
✓ Branch 2 taken 956742 times.
✓ Branch 3 taken 6977 times.
1249744 cu->coded_flag = !(cu->skip_flag || cu->pred_mode == MODE_PLT);
2218
2219
2/2
✓ Branch 0 taken 1014990 times.
✓ Branch 1 taken 371940 times.
1386930 if (cu->coded_flag) {
2220 1014990 sbt_info(lc, sps);
2221
5/6
✓ Branch 0 taken 15652 times.
✓ Branch 1 taken 999338 times.
✓ Branch 2 taken 7343 times.
✓ Branch 3 taken 8309 times.
✓ Branch 4 taken 7343 times.
✗ Branch 5 not taken.
1014990 if (sps->r->sps_act_enabled_flag && cu->pred_mode != MODE_INTRA && tree_type == SINGLE_TREE)
2222 7343 cu->act_enabled_flag = ff_vvc_cu_act_enabled_flag(lc);
2223 1014990 lc->parse.lfnst_dc_only = 1;
2224 1014990 lc->parse.lfnst_zero_out_sig_coeff_flag = 1;
2225 1014990 lc->parse.mts_dc_only = 1;
2226 1014990 lc->parse.mts_zero_out_sig_coeff_flag = 1;
2227 1014990 ret = hls_transform_tree(lc, x0, y0, cb_width, cb_height, cu->ch_type);
2228
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1014990 times.
1014990 if (ret < 0)
2229 ✗ return ret;
2230 1014990 cu->lfnst_idx = lfnst_idx_decode(lc);
2231 1014990 cu->mts_idx = mts_idx_decode(lc);
2232 1014990 set_qp_c(lc);
2233
2/2
✓ Branch 0 taken 364963 times.
✓ Branch 1 taken 6977 times.
371940 } else if (cu->pred_mode != MODE_PLT) {
2234 364963 ret = skipped_transform_tree_unit(lc);
2235
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 364963 times.
364963 if (ret < 0)
2236 ✗ return ret;
2237 }
2238 1386930 set_cu_tabs(lc, cu);
2239
2240 1386930 return 0;
2241 }
2242
2243 890161 static int derive_mode_type_condition(const VVCLocalContext *lc,
2244 const VVCSplitMode split, const int cb_width, const int cb_height, const VVCModeType mode_type_curr)
2245 {
2246 890161 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2247 890161 const VVCSPS *sps = lc->fc->ps.sps;
2248 890161 const int area = cb_width * cb_height;
2249
2250
6/6
✓ Branch 0 taken 500153 times.
✓ Branch 1 taken 390008 times.
✓ Branch 2 taken 68493 times.
✓ Branch 3 taken 431660 times.
✓ Branch 4 taken 421790 times.
✓ Branch 5 taken 36711 times.
890161 if ((IS_I(rsh) && sps->r->sps_qtbtt_dual_tree_intra_flag) ||
2251
2/2
✓ Branch 0 taken 397611 times.
✓ Branch 1 taken 24179 times.
421790 mode_type_curr != MODE_TYPE_ALL || !sps->r->sps_chroma_format_idc ||
2252
2/2
✓ Branch 0 taken 65766 times.
✓ Branch 1 taken 331845 times.
397611 sps->r->sps_chroma_format_idc == CHROMA_FORMAT_444)
2253 558316 return 0;
2254
9/10
✓ Branch 0 taken 27461 times.
✓ Branch 1 taken 304384 times.
✓ Branch 2 taken 25178 times.
✓ Branch 3 taken 2283 times.
✓ Branch 4 taken 25178 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 21655 times.
✓ Branch 7 taken 3523 times.
✓ Branch 8 taken 1096 times.
✓ Branch 9 taken 324943 times.
331845 if ((area == 64 && (split == SPLIT_QT || split == SPLIT_TT_HOR || split == SPLIT_TT_VER)) ||
2255
2/4
✓ Branch 0 taken 1096 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1096 times.
✗ Branch 3 not taken.
1096 (area == 32 && (split == SPLIT_BT_HOR || split == SPLIT_BT_VER)))
2256 6902 return 1;
2257
9/10
✓ Branch 0 taken 21655 times.
✓ Branch 1 taken 303288 times.
✓ Branch 2 taken 14135 times.
✓ Branch 3 taken 7520 times.
✓ Branch 4 taken 14135 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5747 times.
✓ Branch 7 taken 15908 times.
✓ Branch 8 taken 41274 times.
✓ Branch 9 taken 267761 times.
324943 if ((area == 64 && (split == SPLIT_BT_HOR || split == SPLIT_BT_VER) && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_420) ||
2258
8/8
✓ Branch 0 taken 36402 times.
✓ Branch 1 taken 4872 times.
✓ Branch 2 taken 7269 times.
✓ Branch 3 taken 29133 times.
✓ Branch 4 taken 3178 times.
✓ Branch 5 taken 8963 times.
✓ Branch 6 taken 32198 times.
✓ Branch 7 taken 267874 times.
309035 (area == 128 && (split == SPLIT_TT_HOR || split == SPLIT_TT_VER) && sps->r->sps_chroma_format_idc == CHROMA_FORMAT_420) ||
2259
6/6
✓ Branch 0 taken 20271 times.
✓ Branch 1 taken 11927 times.
✓ Branch 2 taken 90859 times.
✓ Branch 3 taken 197286 times.
✓ Branch 4 taken 12991 times.
✓ Branch 5 taken 77868 times.
300072 (cb_width == 8 && split == SPLIT_BT_VER) || (cb_width == 16 && split == SPLIT_TT_VER))
2260
2/2
✓ Branch 0 taken 42486 times.
✓ Branch 1 taken 7303 times.
49789 return 1 + !IS_I(rsh);
2261
2262 275154 return 0;
2263 }
2264
2265 890161 static VVCModeType mode_type_decode(VVCLocalContext *lc, const int x0, const int y0,
2266 const int cb_width, const int cb_height, const VVCSplitMode split, const int ch_type,
2267 const VVCModeType mode_type_curr)
2268 {
2269 VVCModeType mode_type;
2270 890161 const int mode_type_condition = derive_mode_type_condition(lc, split, cb_width, cb_height, mode_type_curr);
2271
2272
2/2
✓ Branch 0 taken 14205 times.
✓ Branch 1 taken 875956 times.
890161 if (mode_type_condition == 1)
2273 14205 mode_type = MODE_TYPE_INTRA;
2274
2/2
✓ Branch 0 taken 42486 times.
✓ Branch 1 taken 833470 times.
875956 else if (mode_type_condition == 2) {
2275
2/2
✓ Branch 1 taken 19353 times.
✓ Branch 2 taken 23133 times.
42486 mode_type = ff_vvc_non_inter_flag(lc, x0, y0, ch_type) ? MODE_TYPE_INTRA : MODE_TYPE_INTER;
2276 } else {
2277 833470 mode_type = mode_type_curr;
2278 }
2279
2280 890161 return mode_type;
2281 }
2282
2283 static int hls_coding_tree(VVCLocalContext *lc,
2284 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2285 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, int part_idx,
2286 VVCSplitMode last_split_mode, VVCTreeType tree_type_curr, VVCModeType mode_type_curr);
2287
2288 266781 static int coding_tree_btv(VVCLocalContext *lc,
2289 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2290 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2291 VVCTreeType tree_type, VVCModeType mode_type)
2292 {
2293 #define CODING_TREE(x, idx) do { \
2294 ret = hls_coding_tree(lc, x, y0, cb_width / 2, cb_height, \
2295 qg_on_y, qg_on_c, cb_sub_div + 1, cqt_depth, mtt_depth + 1, \
2296 depth_offset, idx, SPLIT_BT_VER, tree_type, mode_type); \
2297 if (ret < 0) \
2298 return ret; \
2299 } while (0);
2300
2301 266781 const VVCPPS *pps = lc->fc->ps.pps;
2302 266781 const int x1 = x0 + cb_width / 2;
2303 266781 int ret = 0;
2304
2305 266781 depth_offset += (x0 + cb_width > pps->width) ? 1 : 0;
2306
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 266781 times.
266781 CODING_TREE(x0, 0);
2307
2/2
✓ Branch 0 taken 265153 times.
✓ Branch 1 taken 1628 times.
266781 if (x1 < pps->width)
2308
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 265153 times.
265153 CODING_TREE(x1, 1);
2309
2310 266781 return 0;
2311
2312 #undef CODING_TREE
2313 }
2314
2315 323923 static int coding_tree_bth(VVCLocalContext *lc,
2316 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2317 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2318 VVCTreeType tree_type, VVCModeType mode_type)
2319 {
2320 #define CODING_TREE(y, idx) do { \
2321 ret = hls_coding_tree(lc, x0, y, cb_width , cb_height / 2, \
2322 qg_on_y, qg_on_c, cb_sub_div + 1, cqt_depth, mtt_depth + 1, \
2323 depth_offset, idx, SPLIT_BT_HOR, tree_type, mode_type); \
2324 if (ret < 0) \
2325 return ret; \
2326 } while (0);
2327
2328 323923 const VVCPPS *pps = lc->fc->ps.pps;
2329 323923 const int y1 = y0 + (cb_height / 2);
2330 323923 int ret = 0;
2331
2332 323923 depth_offset += (y0 + cb_height > pps->height) ? 1 : 0;
2333
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 323923 times.
323923 CODING_TREE(y0, 0);
2334
2/2
✓ Branch 0 taken 302480 times.
✓ Branch 1 taken 21443 times.
323923 if (y1 < pps->height)
2335
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 302480 times.
302480 CODING_TREE(y1, 1);
2336
2337 323923 return 0;
2338
2339 #undef CODING_TREE
2340 }
2341
2342 89934 static int coding_tree_ttv(VVCLocalContext *lc,
2343 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2344 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2345 VVCTreeType tree_type, VVCModeType mode_type)
2346 {
2347 #define CODING_TREE(x, w, sub_div, idx) do { \
2348 ret = hls_coding_tree(lc, x, y0, w, cb_height, \
2349 qg_on_y, qg_on_c, sub_div, cqt_depth, mtt_depth + 1, \
2350 depth_offset, idx, SPLIT_TT_VER, tree_type, mode_type); \
2351 if (ret < 0) \
2352 return ret; \
2353 } while (0);
2354
2355 89934 const VVCSH *sh = &lc->sc->sh;
2356 89934 const int x1 = x0 + cb_width / 4;
2357 89934 const int x2 = x0 + cb_width * 3 / 4;
2358 int ret;
2359
2360
3/4
✓ Branch 0 taken 53105 times.
✓ Branch 1 taken 36829 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 53105 times.
89934 qg_on_y = qg_on_y && (cb_sub_div + 2 <= sh->cu_qp_delta_subdiv);
2361
3/4
✓ Branch 0 taken 39432 times.
✓ Branch 1 taken 50502 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 39432 times.
89934 qg_on_c = qg_on_c && (cb_sub_div + 2 <= sh->cu_chroma_qp_offset_subdiv);
2362
2363
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 89934 times.
89934 CODING_TREE(x0, cb_width / 4, cb_sub_div + 2, 0);
2364
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 89934 times.
89934 CODING_TREE(x1, cb_width / 2, cb_sub_div + 1, 1);
2365
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 89934 times.
89934 CODING_TREE(x2, cb_width / 4, cb_sub_div + 2, 2);
2366
2367 89934 return 0;
2368
2369 #undef CODING_TREE
2370 }
2371
2372 95287 static int coding_tree_tth(VVCLocalContext *lc,
2373 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2374 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2375 VVCTreeType tree_type, VVCModeType mode_type)
2376 {
2377 #define CODING_TREE(y, h, sub_div, idx) do { \
2378 ret = hls_coding_tree(lc, x0, y, cb_width, h, \
2379 qg_on_y, qg_on_c, sub_div, cqt_depth, mtt_depth + 1, \
2380 depth_offset, idx, SPLIT_TT_HOR, tree_type, mode_type); \
2381 if (ret < 0) \
2382 return ret; \
2383 } while (0);
2384
2385 95287 const VVCSH *sh = &lc->sc->sh;
2386 95287 const int y1 = y0 + (cb_height / 4);
2387 95287 const int y2 = y0 + (3 * cb_height / 4);
2388 int ret;
2389
2390
3/4
✓ Branch 0 taken 55906 times.
✓ Branch 1 taken 39381 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 55906 times.
95287 qg_on_y = qg_on_y && (cb_sub_div + 2 <= sh->cu_qp_delta_subdiv);
2391
3/4
✓ Branch 0 taken 38083 times.
✓ Branch 1 taken 57204 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 38083 times.
95287 qg_on_c = qg_on_c && (cb_sub_div + 2 <= sh->cu_chroma_qp_offset_subdiv);
2392
2393
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 95287 times.
95287 CODING_TREE(y0, cb_height / 4, cb_sub_div + 2, 0);
2394
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 95287 times.
95287 CODING_TREE(y1, cb_height / 2, cb_sub_div + 1, 1);
2395
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 95287 times.
95287 CODING_TREE(y2, cb_height / 4, cb_sub_div + 2, 2);
2396
2397 95287 return 0;
2398
2399 #undef CODING_TREE
2400 }
2401
2402 114236 static int coding_tree_qt(VVCLocalContext *lc,
2403 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2404 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2405 VVCTreeType tree_type, VVCModeType mode_type)
2406 {
2407 #define CODING_TREE(x, y, idx) do { \
2408 ret = hls_coding_tree(lc, x, y, cb_width / 2, cb_height / 2, \
2409 qg_on_y, qg_on_c, cb_sub_div + 2, cqt_depth + 1, 0, 0, \
2410 idx, SPLIT_QT, tree_type, mode_type); \
2411 if (ret < 0) \
2412 return ret; \
2413 } while (0);
2414
2415 114236 const VVCPPS *pps = lc->fc->ps.pps;
2416 114236 const int x1 = x0 + cb_width / 2;
2417 114236 const int y1 = y0 + cb_height / 2;
2418 114236 int ret = 0;
2419
2420
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 114236 times.
114236 CODING_TREE(x0, y0, 0);
2421
2/2
✓ Branch 0 taken 110927 times.
✓ Branch 1 taken 3309 times.
114236 if (x1 < pps->width)
2422
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 110927 times.
110927 CODING_TREE(x1, y0, 1);
2423
2/2
✓ Branch 0 taken 108278 times.
✓ Branch 1 taken 5958 times.
114236 if (y1 < pps->height)
2424
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 108278 times.
108278 CODING_TREE(x0, y1, 2);
2425
2/2
✓ Branch 0 taken 110927 times.
✓ Branch 1 taken 3309 times.
114236 if (x1 < pps->width &&
2426
2/2
✓ Branch 0 taken 105000 times.
✓ Branch 1 taken 5927 times.
110927 y1 < pps->height)
2427
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 105000 times.
105000 CODING_TREE(x1, y1, 3);
2428
2429 114236 return 0;
2430
2431 #undef CODING_TREE
2432 }
2433
2434 typedef int (*coding_tree_fn)(VVCLocalContext *lc,
2435 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2436 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset,
2437 VVCTreeType tree_type, VVCModeType mode_type);
2438
2439 const static coding_tree_fn coding_tree[] = {
2440 coding_tree_tth,
2441 coding_tree_bth,
2442 coding_tree_ttv,
2443 coding_tree_btv,
2444 coding_tree_qt,
2445 };
2446
2447 2277091 static int hls_coding_tree(VVCLocalContext *lc,
2448 int x0, int y0, int cb_width, int cb_height, int qg_on_y, int qg_on_c,
2449 int cb_sub_div, int cqt_depth, int mtt_depth, int depth_offset, int part_idx,
2450 VVCSplitMode last_split_mode, VVCTreeType tree_type_curr, VVCModeType mode_type_curr)
2451 {
2452 2277091 VVCFrameContext *fc = lc->fc;
2453 2277091 const VVCPPS *pps = fc->ps.pps;
2454 2277091 const VVCSH *sh = &lc->sc->sh;
2455 2277091 const H266RawSliceHeader *rsh = sh->r;
2456 2277091 const int ch_type = tree_type_curr == DUAL_TREE_CHROMA;
2457 int ret;
2458 VVCAllowedSplit allowed;
2459
2460
6/6
✓ Branch 0 taken 285802 times.
✓ Branch 1 taken 1991289 times.
✓ Branch 2 taken 74093 times.
✓ Branch 3 taken 211709 times.
✓ Branch 4 taken 6515 times.
✓ Branch 5 taken 67578 times.
2277091 if (pps->r->pps_cu_qp_delta_enabled_flag && qg_on_y && cb_sub_div <= sh->cu_qp_delta_subdiv) {
2461 6515 lc->parse.is_cu_qp_delta_coded = 0;
2462 6515 lc->parse.cu_qg_top_left_x = x0;
2463 6515 lc->parse.cu_qg_top_left_y = y0;
2464 }
2465
4/4
✓ Branch 0 taken 206481 times.
✓ Branch 1 taken 2070610 times.
✓ Branch 2 taken 17504 times.
✓ Branch 3 taken 188977 times.
2277091 if (rsh->sh_cu_chroma_qp_offset_enabled_flag && qg_on_c &&
2466
2/2
✓ Branch 0 taken 931 times.
✓ Branch 1 taken 16573 times.
17504 cb_sub_div <= sh->cu_chroma_qp_offset_subdiv) {
2467 931 lc->parse.is_cu_chroma_qp_offset_coded = 0;
2468 931 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
2469 }
2470
2471 2277091 can_split(lc, x0, y0, cb_width, cb_height, mtt_depth, depth_offset, part_idx,
2472 last_split_mode, tree_type_curr, mode_type_curr, &allowed);
2473
2/2
✓ Branch 1 taken 890161 times.
✓ Branch 2 taken 1386930 times.
2277091 if (ff_vvc_split_cu_flag(lc, x0, y0, cb_width, cb_height, ch_type, &allowed)) {
2474 890161 VVCSplitMode split = ff_vvc_split_mode(lc, x0, y0, cb_width, cb_height, cqt_depth, mtt_depth, ch_type, &allowed);
2475 890161 VVCModeType mode_type = mode_type_decode(lc, x0, y0, cb_width, cb_height, split, ch_type, mode_type_curr);
2476
2477
2/2
✓ Branch 0 taken 825851 times.
✓ Branch 1 taken 64310 times.
890161 VVCTreeType tree_type = (mode_type == MODE_TYPE_INTRA) ? DUAL_TREE_LUMA : tree_type_curr;
2478
2479
2/2
✓ Branch 0 taken 775925 times.
✓ Branch 1 taken 114236 times.
890161 if (split != SPLIT_QT) {
2480
6/6
✓ Branch 0 taken 469829 times.
✓ Branch 1 taken 306096 times.
✓ Branch 2 taken 304326 times.
✓ Branch 3 taken 165503 times.
✓ Branch 4 taken 257602 times.
✓ Branch 5 taken 46724 times.
775925 if (!(x0 & 31) && !(y0 & 31) && mtt_depth <= 1)
2481 257602 TAB_MSM(fc, mtt_depth, x0, y0) = split;
2482 }
2483 890161 ret = coding_tree[split - 1](lc, x0, y0, cb_width, cb_height, qg_on_y, qg_on_c,
2484 cb_sub_div, cqt_depth, mtt_depth, depth_offset, tree_type, mode_type);
2485
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 890161 times.
890161 if (ret < 0)
2486 ✗ return ret;
2487
4/4
✓ Branch 0 taken 853450 times.
✓ Branch 1 taken 36711 times.
✓ Branch 2 taken 33558 times.
✓ Branch 3 taken 819892 times.
890161 if (mode_type_curr == MODE_TYPE_ALL && mode_type == MODE_TYPE_INTRA) {
2488 33558 ret = hls_coding_tree(lc, x0, y0, cb_width, cb_height, 0, qg_on_c, cb_sub_div,
2489 cqt_depth, mtt_depth, 0, 0, split, DUAL_TREE_CHROMA, mode_type);
2490
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 33558 times.
33558 if (ret < 0)
2491 ✗ return ret;
2492 }
2493 } else {
2494 1386930 ret = hls_coding_unit(lc, x0, y0, cb_width, cb_height, cqt_depth, tree_type_curr, mode_type_curr);
2495
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1386930 times.
1386930 if (ret < 0)
2496 ✗ return ret;
2497 }
2498
2499 2277091 return 0;
2500 }
2501
2502 25949 static int dual_tree_implicit_qt_split(VVCLocalContext *lc,
2503 const int x0, const int y0, const int cb_size, const int cqt_depth)
2504 {
2505 25949 const VVCSH *sh = &lc->sc->sh;
2506 25949 const H266RawSliceHeader *rsh = sh->r;
2507 25949 const VVCPPS *pps = lc->fc->ps.pps;
2508 25949 const int cb_subdiv = 2 * cqt_depth;
2509 int ret;
2510
2511
2/2
✓ Branch 0 taken 5308 times.
✓ Branch 1 taken 20641 times.
25949 if (cb_size > 64) {
2512 #define DUAL_TREE(x, y) do { \
2513 ret = dual_tree_implicit_qt_split(lc, x, y, cb_size / 2, cqt_depth + 1); \
2514 if (ret < 0) \
2515 return ret; \
2516 } while (0)
2517
2518 5308 const int x1 = x0 + (cb_size / 2);
2519 5308 const int y1 = y0 + (cb_size / 2);
2520
3/4
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 5178 times.
✓ Branch 2 taken 130 times.
✗ Branch 3 not taken.
5308 if (pps->r->pps_cu_qp_delta_enabled_flag && cb_subdiv <= sh->cu_qp_delta_subdiv) {
2521 130 lc->parse.is_cu_qp_delta_coded = 0;
2522 130 lc->parse.cu_qg_top_left_x = x0;
2523 130 lc->parse.cu_qg_top_left_y = y0;
2524 }
2525
3/4
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 5210 times.
✓ Branch 2 taken 98 times.
✗ Branch 3 not taken.
5308 if (rsh->sh_cu_chroma_qp_offset_enabled_flag && cb_subdiv <= sh->cu_chroma_qp_offset_subdiv) {
2526 98 lc->parse.is_cu_chroma_qp_offset_coded = 0;
2527 98 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
2528 }
2529
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5308 times.
5308 DUAL_TREE(x0, y0);
2530
2/2
✓ Branch 0 taken 5145 times.
✓ Branch 1 taken 163 times.
5308 if (x1 < pps->width)
2531
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5145 times.
5145 DUAL_TREE(x1, y0);
2532
2/2
✓ Branch 0 taken 4816 times.
✓ Branch 1 taken 492 times.
5308 if (y1 < pps->height)
2533
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4816 times.
4816 DUAL_TREE(x0, y1);
2534
4/4
✓ Branch 0 taken 5145 times.
✓ Branch 1 taken 163 times.
✓ Branch 2 taken 4656 times.
✓ Branch 3 taken 489 times.
5308 if (x1 < pps->width && y1 < pps->height)
2535
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4656 times.
4656 DUAL_TREE(x1, y1);
2536 #undef DUAL_TREE
2537 } else {
2538 #define CODING_TREE(tree_type) do { \
2539 const int qg_on_y = tree_type == DUAL_TREE_LUMA; \
2540 ret = hls_coding_tree(lc, x0, y0, cb_size, cb_size, qg_on_y, !qg_on_y, \
2541 cb_subdiv, cqt_depth, 0, 0, 0, SPLIT_NONE, tree_type, MODE_TYPE_ALL); \
2542 if (ret < 0) \
2543 return ret; \
2544 } while (0)
2545
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 20641 times.
20641 CODING_TREE(DUAL_TREE_LUMA);
2546
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 20641 times.
20641 CODING_TREE(DUAL_TREE_CHROMA);
2547 #undef CODING_TREE
2548 }
2549 25949 return 0;
2550 }
2551
2552 #define SET_SAO(elem, value) \
2553 do { \
2554 if (!sao_merge_up_flag && !sao_merge_left_flag) \
2555 sao->elem = value; \
2556 else if (sao_merge_left_flag) \
2557 sao->elem = CTB(fc->tab.sao, rx-1, ry).elem; \
2558 else if (sao_merge_up_flag) \
2559 sao->elem = CTB(fc->tab.sao, rx, ry-1).elem; \
2560 else \
2561 sao->elem = 0; \
2562 } while (0)
2563
2564 55834 static void hls_sao(VVCLocalContext *lc, const int rx, const int ry)
2565 {
2566 55834 VVCFrameContext *fc = lc->fc;
2567 55834 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2568 55834 int sao_merge_left_flag = 0;
2569 55834 int sao_merge_up_flag = 0;
2570 55834 SAOParams *sao = &CTB(fc->tab.sao, rx, ry);
2571 int c_idx, i;
2572
2573
4/4
✓ Branch 0 taken 36380 times.
✓ Branch 1 taken 19454 times.
✓ Branch 2 taken 164 times.
✓ Branch 3 taken 36216 times.
55834 if (rsh->sh_sao_luma_used_flag || rsh->sh_sao_chroma_used_flag) {
2574
2/2
✓ Branch 0 taken 17704 times.
✓ Branch 1 taken 1914 times.
19618 if (rx > 0) {
2575
2/2
✓ Branch 0 taken 16887 times.
✓ Branch 1 taken 817 times.
17704 if (lc->ctb_left_flag)
2576 16887 sao_merge_left_flag = ff_vvc_sao_merge_flag_decode(lc);
2577 }
2578
4/4
✓ Branch 0 taken 16295 times.
✓ Branch 1 taken 3323 times.
✓ Branch 2 taken 8957 times.
✓ Branch 3 taken 7338 times.
19618 if (ry > 0 && !sao_merge_left_flag) {
2579
2/2
✓ Branch 0 taken 8156 times.
✓ Branch 1 taken 801 times.
8957 if (lc->ctb_up_flag)
2580 8156 sao_merge_up_flag = ff_vvc_sao_merge_flag_decode(lc);
2581 }
2582 }
2583
2584
4/4
✓ Branch 0 taken 221224 times.
✓ Branch 1 taken 1056 times.
✓ Branch 2 taken 166446 times.
✓ Branch 3 taken 55834 times.
222280 for (c_idx = 0; c_idx < (fc->ps.sps->r->sps_chroma_format_idc ? 3 : 1); c_idx++) {
2585
2/2
✓ Branch 0 taken 55834 times.
✓ Branch 1 taken 110612 times.
166446 const int sao_used_flag = !c_idx ? rsh->sh_sao_luma_used_flag : rsh->sh_sao_chroma_used_flag;
2586
2/2
✓ Branch 0 taken 123174 times.
✓ Branch 1 taken 43272 times.
166446 if (!sao_used_flag) {
2587 123174 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
2588 123174 continue;
2589 }
2590
2591
2/2
✓ Branch 0 taken 11909 times.
✓ Branch 1 taken 31363 times.
43272 if (c_idx == 2) {
2592 11909 sao->type_idx[2] = sao->type_idx[1];
2593 11909 sao->eo_class[2] = sao->eo_class[1];
2594 } else {
2595
7/8
✓ Branch 0 taken 27643 times.
✓ Branch 1 taken 3720 times.
✓ Branch 2 taken 14344 times.
✓ Branch 3 taken 13299 times.
✓ Branch 5 taken 13299 times.
✓ Branch 6 taken 3720 times.
✓ Branch 7 taken 3720 times.
✗ Branch 8 not taken.
31363 SET_SAO(type_idx[c_idx], ff_vvc_sao_type_idx_decode(lc));
2596 }
2597
2598
2/2
✓ Branch 0 taken 26750 times.
✓ Branch 1 taken 16522 times.
43272 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
2599 26750 continue;
2600
2601
2/2
✓ Branch 0 taken 66088 times.
✓ Branch 1 taken 16522 times.
82610 for (i = 0; i < 4; i++)
2602
7/8
✓ Branch 0 taken 56192 times.
✓ Branch 1 taken 9896 times.
✓ Branch 2 taken 25700 times.
✓ Branch 3 taken 30492 times.
✓ Branch 5 taken 30492 times.
✓ Branch 6 taken 9896 times.
✓ Branch 7 taken 9896 times.
✗ Branch 8 not taken.
66088 SET_SAO(offset_abs[c_idx][i], ff_vvc_sao_offset_abs_decode(lc));
2603
2604
2/2
✓ Branch 0 taken 6152 times.
✓ Branch 1 taken 10370 times.
16522 if (sao->type_idx[c_idx] == SAO_BAND) {
2605
2/2
✓ Branch 0 taken 24608 times.
✓ Branch 1 taken 6152 times.
30760 for (i = 0; i < 4; i++) {
2606
2/2
✓ Branch 0 taken 8959 times.
✓ Branch 1 taken 15649 times.
24608 if (sao->offset_abs[c_idx][i]) {
2607
7/8
✓ Branch 0 taken 8071 times.
✓ Branch 1 taken 888 times.
✓ Branch 2 taken 3338 times.
✓ Branch 3 taken 4733 times.
✓ Branch 5 taken 4733 times.
✓ Branch 6 taken 888 times.
✓ Branch 7 taken 888 times.
✗ Branch 8 not taken.
8959 SET_SAO(offset_sign[c_idx][i],
2608 ff_vvc_sao_offset_sign_decode(lc));
2609 } else {
2610 15649 sao->offset_sign[c_idx][i] = 0;
2611 }
2612 }
2613
7/8
✓ Branch 0 taken 5462 times.
✓ Branch 1 taken 690 times.
✓ Branch 2 taken 1773 times.
✓ Branch 3 taken 3689 times.
✓ Branch 5 taken 3689 times.
✓ Branch 6 taken 690 times.
✓ Branch 7 taken 690 times.
✗ Branch 8 not taken.
6152 SET_SAO(band_position[c_idx], ff_vvc_sao_band_position_decode(lc));
2614
2/2
✓ Branch 0 taken 8102 times.
✓ Branch 1 taken 2268 times.
10370 } else if (c_idx != 2) {
2615
7/8
✓ Branch 0 taken 6667 times.
✓ Branch 1 taken 1435 times.
✓ Branch 2 taken 3430 times.
✓ Branch 3 taken 3237 times.
✓ Branch 5 taken 3237 times.
✓ Branch 6 taken 1435 times.
✓ Branch 7 taken 1435 times.
✗ Branch 8 not taken.
8102 SET_SAO(eo_class[c_idx], ff_vvc_sao_eo_class_decode(lc));
2616 }
2617
2618 // Inferred parameters
2619 16522 sao->offset_val[c_idx][0] = 0;
2620
2/2
✓ Branch 0 taken 66088 times.
✓ Branch 1 taken 16522 times.
82610 for (i = 0; i < 4; i++) {
2621 66088 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
2622
2/2
✓ Branch 0 taken 41480 times.
✓ Branch 1 taken 24608 times.
66088 if (sao->type_idx[c_idx] == SAO_EDGE) {
2623
2/2
✓ Branch 0 taken 20740 times.
✓ Branch 1 taken 20740 times.
41480 if (i > 1)
2624 20740 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
2625
2/2
✓ Branch 0 taken 6495 times.
✓ Branch 1 taken 18113 times.
24608 } else if (sao->offset_sign[c_idx][i]) {
2626 6495 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
2627 }
2628 66088 sao->offset_val[c_idx][i + 1] *= 1 << (fc->ps.sps->bit_depth - FFMIN(10, fc->ps.sps->bit_depth));
2629 }
2630 }
2631 55834 }
2632
2633 55834 static void alf_params(VVCLocalContext *lc, const int rx, const int ry)
2634 {
2635 55834 const VVCFrameContext *fc = lc->fc;
2636 55834 const H266RawSliceHeader *sh = lc->sc->sh.r;
2637 55834 ALFParams *alf = &CTB(fc->tab.alf, rx, ry);
2638
2639 55834 alf->ctb_flag[LUMA] = alf->ctb_flag[CB] = alf->ctb_flag[CR] = 0;
2640 55834 alf->ctb_cc_idc[0] = alf->ctb_cc_idc[1] = 0;
2641
2/2
✓ Branch 0 taken 29703 times.
✓ Branch 1 taken 26131 times.
55834 if (sh->sh_alf_enabled_flag) {
2642 29703 alf->ctb_flag[LUMA] = ff_vvc_alf_ctb_flag(lc, rx, ry, LUMA);
2643
2/2
✓ Branch 0 taken 21045 times.
✓ Branch 1 taken 8658 times.
29703 if (alf->ctb_flag[LUMA]) {
2644 21045 uint8_t alf_use_aps_flag = 0;
2645
2/2
✓ Branch 0 taken 20237 times.
✓ Branch 1 taken 808 times.
21045 if (sh->sh_num_alf_aps_ids_luma > 0)
2646 20237 alf_use_aps_flag = ff_vvc_alf_use_aps_flag(lc);
2647
2/2
✓ Branch 0 taken 18242 times.
✓ Branch 1 taken 2803 times.
21045 if (alf_use_aps_flag) {
2648 18242 alf->ctb_filt_set_idx_y = 16;
2649
2/2
✓ Branch 0 taken 5167 times.
✓ Branch 1 taken 13075 times.
18242 if (sh->sh_num_alf_aps_ids_luma > 1)
2650 5167 alf->ctb_filt_set_idx_y += ff_vvc_alf_luma_prev_filter_idx(lc);
2651 } else {
2652 2803 alf->ctb_filt_set_idx_y = ff_vvc_alf_luma_fixed_filter_idx(lc);
2653 }
2654 }
2655
2/2
✓ Branch 0 taken 59406 times.
✓ Branch 1 taken 29703 times.
89109 for (int c_idx = CB; c_idx <= CR; c_idx++) {
2656
2/2
✓ Branch 0 taken 29703 times.
✓ Branch 1 taken 29703 times.
59406 const uint8_t alf_enabled_flag =
2657 c_idx == CB ? sh->sh_alf_cb_enabled_flag : sh->sh_alf_cr_enabled_flag;
2658
2/2
✓ Branch 0 taken 36048 times.
✓ Branch 1 taken 23358 times.
59406 if (alf_enabled_flag) {
2659 36048 const VVCALF *aps = fc->ps.alf_list[sh->sh_alf_aps_id_chroma];
2660 36048 alf->ctb_flag[c_idx] = ff_vvc_alf_ctb_flag(lc, rx, ry, c_idx);
2661 36048 alf->alf_ctb_filter_alt_idx[c_idx - 1] = 0;
2662
4/4
✓ Branch 0 taken 26721 times.
✓ Branch 1 taken 9327 times.
✓ Branch 2 taken 18421 times.
✓ Branch 3 taken 8300 times.
36048 if (alf->ctb_flag[c_idx] && aps->num_chroma_filters > 1)
2663 18421 alf->alf_ctb_filter_alt_idx[c_idx - 1] = ff_vvc_alf_ctb_filter_alt_idx(lc, c_idx, aps->num_chroma_filters);
2664 }
2665 }
2666 }
2667
2/2
✓ Branch 0 taken 43179 times.
✓ Branch 1 taken 12655 times.
55834 if (fc->ps.sps->r->sps_ccalf_enabled_flag) {
2668 43179 const uint8_t cc_enabled[] = { sh->sh_alf_cc_cb_enabled_flag, sh->sh_alf_cc_cr_enabled_flag };
2669 43179 const uint8_t cc_aps_id[] = { sh->sh_alf_cc_cb_aps_id, sh->sh_alf_cc_cr_aps_id };
2670
2/2
✓ Branch 0 taken 86358 times.
✓ Branch 1 taken 43179 times.
129537 for (int i = 0; i < 2; i++) {
2671
2/2
✓ Branch 0 taken 22625 times.
✓ Branch 1 taken 63733 times.
86358 if (cc_enabled[i]) {
2672 22625 const VVCALF *aps = fc->ps.alf_list[cc_aps_id[i]];
2673 22625 alf->ctb_cc_idc[i] = ff_vvc_alf_ctb_cc_idc(lc, rx, ry, i, aps->num_cc_filters[i]);
2674 }
2675 }
2676 }
2677 55834 }
2678
2679 55834 static void deblock_params(VVCLocalContext *lc, const int rx, const int ry)
2680 {
2681 55834 VVCFrameContext *fc = lc->fc;
2682 55834 const VVCSH *sh = &lc->sc->sh;
2683 55834 CTB(fc->tab.deblock, rx, ry) = sh->deblock;
2684 55834 }
2685
2686 55834 static int hls_coding_tree_unit(VVCLocalContext *lc,
2687 const int x0, const int y0, const int ctu_idx, const int rx, const int ry)
2688 {
2689 55834 const VVCFrameContext *fc = lc->fc;
2690 55834 const VVCSPS *sps = fc->ps.sps;
2691 55834 const VVCPPS *pps = fc->ps.pps;
2692 55834 const VVCSH *sh = &lc->sc->sh;
2693 55834 const H266RawSliceHeader *rsh = sh->r;
2694 55834 const unsigned int ctb_size = sps->ctb_size_y;
2695 55834 int ret = 0;
2696
2697 55834 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
2698
2699 55834 hls_sao(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
2700 55834 alf_params(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
2701 55834 deblock_params(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
2702
2703
4/4
✓ Branch 0 taken 6954 times.
✓ Branch 1 taken 48880 times.
✓ Branch 2 taken 6024 times.
✓ Branch 3 taken 930 times.
55834 if (IS_I(rsh) && sps->r->sps_qtbtt_dual_tree_intra_flag)
2704 6024 ret = dual_tree_implicit_qt_split(lc, x0, y0, ctb_size, 0);
2705 else
2706 49810 ret = hls_coding_tree(lc, x0, y0, ctb_size, ctb_size,
2707 1, 1, 0, 0, 0, 0, 0, SPLIT_NONE, SINGLE_TREE, MODE_TYPE_ALL);
2708
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 55834 times.
55834 if (ret < 0)
2709 ✗ return ret;
2710
2711
2/2
✓ Branch 0 taken 6929 times.
✓ Branch 1 taken 48905 times.
55834 if (rx == pps->ctb_to_col_bd[rx + 1] - 1) {
2712
2/2
✓ Branch 0 taken 1901 times.
✓ Branch 1 taken 5028 times.
6929 if (ctu_idx == sh->num_ctus_in_curr_slice - 1) {
2713 1901 const int end_of_slice_one_bit = ff_vvc_end_of_slice_flag_decode(lc);
2714
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1901 times.
1901 if (!end_of_slice_one_bit)
2715 ✗ return AVERROR_INVALIDDATA;
2716 } else {
2717
2/2
✓ Branch 0 taken 527 times.
✓ Branch 1 taken 4501 times.
5028 if (ry == pps->ctb_to_row_bd[ry + 1] - 1) {
2718 527 const int end_of_tile_one_bit = ff_vvc_end_of_tile_one_bit(lc);
2719
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 527 times.
527 if (!end_of_tile_one_bit)
2720 ✗ return AVERROR_INVALIDDATA;
2721 } else {
2722
2/2
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 4348 times.
4501 if (fc->ps.sps->r->sps_entropy_coding_sync_enabled_flag) {
2723 153 const int end_of_subset_one_bit = ff_vvc_end_of_subset_one_bit(lc);
2724
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 153 times.
153 if (!end_of_subset_one_bit)
2725 ✗ return AVERROR_INVALIDDATA;
2726 }
2727 }
2728 }
2729 }
2730
2731 55834 return 0;
2732 }
2733
2734 629604 static int has_inter_luma(const CodingUnit *cu)
2735 {
2736
5/6
✓ Branch 0 taken 490727 times.
✓ Branch 1 taken 138877 times.
✓ Branch 2 taken 490511 times.
✓ Branch 3 taken 216 times.
✓ Branch 4 taken 490511 times.
✗ Branch 5 not taken.
629604 return cu->pred_mode != MODE_INTRA && cu->pred_mode != MODE_PLT && cu->tree_type != DUAL_TREE_CHROMA;
2737 }
2738
2739 9091357 static int pred_get_y(const VVCLocalContext *lc, const int y0, const Mv *mv, const int height)
2740 {
2741 9091357 const VVCPPS *pps = lc->fc->ps.pps;
2742 9091357 const int idx = lc->sc->sh.r->curr_subpic_idx;
2743 9091357 const int top = pps->subpic_y[idx];
2744 9091357 const int bottom = top + pps->subpic_height[idx];
2745
2746 9091357 return av_clip(y0 + (mv->y >> 4) + height, top, bottom);
2747 }
2748
2749 490511 static void cu_get_max_y(const CodingUnit *cu, int max_y[2][VVC_MAX_REF_ENTRIES], const VVCLocalContext *lc)
2750 {
2751 490511 const VVCFrameContext *fc = lc->fc;
2752 490511 const PredictionUnit *pu = &cu->pu;
2753
2754
2/2
✓ Branch 0 taken 27594 times.
✓ Branch 1 taken 462917 times.
490511 if (pu->merge_gpm_flag) {
2755
2/2
✓ Branch 0 taken 55188 times.
✓ Branch 1 taken 27594 times.
82782 for (int i = 0; i < FF_ARRAY_ELEMS(pu->gpm_mv); i++) {
2756 55188 const MvField *mvf = pu->gpm_mv + i;
2757 55188 const int lx = mvf->pred_flag - PF_L0;
2758 55188 const int idx = mvf->ref_idx[lx];
2759 55188 const int y = pred_get_y(lc, cu->y0, mvf->mv + lx, cu->cb_height);
2760
2761 55188 max_y[lx][idx] = FFMAX(max_y[lx][idx], y);
2762 }
2763 } else {
2764 462917 const MotionInfo *mi = &pu->mi;
2765
4/4
✓ Branch 0 taken 426937 times.
✓ Branch 1 taken 35980 times.
✓ Branch 2 taken 73298 times.
✓ Branch 3 taken 353639 times.
462917 const int max_dmvr_off = (!pu->inter_affine_flag && pu->dmvr_flag) ? 2 : 0;
2766 462917 const int sbw = cu->cb_width / mi->num_sb_x;
2767 462917 const int sbh = cu->cb_height / mi->num_sb_y;
2768
2/2
✓ Branch 0 taken 974537 times.
✓ Branch 1 taken 462917 times.
1437454 for (int sby = 0; sby < mi->num_sb_y; sby++) {
2769
2/2
✓ Branch 0 taken 6164733 times.
✓ Branch 1 taken 974537 times.
7139270 for (int sbx = 0; sbx < mi->num_sb_x; sbx++) {
2770 6164733 const int x0 = cu->x0 + sbx * sbw;
2771 6164733 const int y0 = cu->y0 + sby * sbh;
2772 6164733 const MvField *mvf = ff_vvc_get_mvf(fc, x0, y0);
2773
2/2
✓ Branch 0 taken 12329466 times.
✓ Branch 1 taken 6164733 times.
18494199 for (int lx = 0; lx < 2; lx++) {
2774 12329466 const PredFlag mask = 1 << lx;
2775
2/2
✓ Branch 0 taken 9036169 times.
✓ Branch 1 taken 3293297 times.
12329466 if (mvf->pred_flag & mask) {
2776 9036169 const int idx = mvf->ref_idx[lx];
2777 9036169 const int y = pred_get_y(lc, y0, mvf->mv + lx, sbh);
2778
2779 9036169 max_y[lx][idx] = FFMAX(max_y[lx][idx], y + max_dmvr_off);
2780 }
2781 }
2782 }
2783 }
2784 }
2785 490511 }
2786
2787 55834 static void ctu_get_pred(VVCLocalContext *lc, const int rs)
2788 {
2789 55834 const VVCFrameContext *fc = lc->fc;
2790 55834 const H266RawSliceHeader *rsh = lc->sc->sh.r;
2791 55834 CTU *ctu = fc->tab.ctus + rs;
2792 55834 const CodingUnit *cu = fc->tab.cus[rs];
2793
2794 55834 ctu->has_dmvr = 0;
2795
2796
2/2
✓ Branch 0 taken 6954 times.
✓ Branch 1 taken 48880 times.
55834 if (IS_I(rsh))
2797 6954 return;
2798
2799
2/2
✓ Branch 0 taken 97760 times.
✓ Branch 1 taken 48880 times.
146640 for (int lx = 0; lx < 2; lx++)
2800 97760 memset(ctu->max_y[lx], -1, sizeof(ctu->max_y[0][0]) * rsh->num_ref_idx_active[lx]);
2801
2802
2/2
✓ Branch 0 taken 629604 times.
✓ Branch 1 taken 48880 times.
678484 while (cu) {
2803
2/2
✓ Branch 1 taken 490511 times.
✓ Branch 2 taken 139093 times.
629604 if (has_inter_luma(cu)) {
2804 490511 cu_get_max_y(cu, ctu->max_y, lc);
2805 490511 ctu->has_dmvr |= cu->pu.dmvr_flag;
2806 }
2807 629604 cu = cu->next;
2808 }
2809 48880 ctu->max_y_idx[0] = ctu->max_y_idx[1] = 0;
2810 }
2811
2812 55834 int ff_vvc_coding_tree_unit(VVCLocalContext *lc,
2813 const int ctu_idx, const int rs, const int rx, const int ry)
2814 {
2815 55834 const VVCFrameContext *fc = lc->fc;
2816 55834 const VVCSPS *sps = fc->ps.sps;
2817 55834 const VVCPPS *pps = fc->ps.pps;
2818 55834 const int x_ctb = rx << sps->ctb_log2_size_y;
2819 55834 const int y_ctb = ry << sps->ctb_log2_size_y;
2820 55834 const int ctb_size = 1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y;
2821 55834 EntryPoint* ep = lc->ep;
2822 int ret;
2823
2824
2/2
✓ Branch 0 taken 6929 times.
✓ Branch 1 taken 48905 times.
55834 if (rx == pps->ctb_to_col_bd[rx]) {
2825 6929 ep->num_hmvp = 0;
2826 6929 ep->num_hmvp_ibc = 0;
2827
4/4
✓ Branch 0 taken 4613 times.
✓ Branch 1 taken 2316 times.
✓ Branch 2 taken 112 times.
✓ Branch 3 taken 4501 times.
6929 ep->is_first_qg = ry == pps->ctb_to_row_bd[ry] || !ctu_idx;
2828 }
2829
2830 55834 lc->coeffs = fc->tab.coeffs + rs * ctb_size * VVC_MAX_SAMPLE_ARRAYS;
2831 55834 lc->cu = NULL;
2832
2833 55834 ret = ff_vvc_cabac_init(lc, ctu_idx, rx, ry);
2834
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 55834 times.
55834 if (ret < 0)
2835 ✗ return ret;
2836 55834 ff_vvc_decode_neighbour(lc, x_ctb, y_ctb, rx, ry, rs);
2837 55834 ret = hls_coding_tree_unit(lc, x_ctb, y_ctb, ctu_idx, rx, ry);
2838
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 55834 times.
55834 if (ret < 0)
2839 ✗ return ret;
2840 55834 ctu_get_pred(lc, rs);
2841
2842 55834 return 0;
2843 }
2844
2845 373976 void ff_vvc_decode_neighbour(VVCLocalContext *lc, const int x_ctb, const int y_ctb,
2846 const int rx, const int ry, const int rs)
2847 {
2848 373976 VVCFrameContext *fc = lc->fc;
2849 373976 const int ctb_size = fc->ps.sps->ctb_size_y;
2850
2851 373976 lc->end_of_tiles_x = fc->ps.pps->width;
2852 373976 lc->end_of_tiles_y = fc->ps.pps->height;
2853
2/2
✓ Branch 0 taken 46359 times.
✓ Branch 1 taken 327617 times.
373976 if (fc->ps.pps->ctb_to_col_bd[rx] != fc->ps.pps->ctb_to_col_bd[rx + 1])
2854 46359 lc->end_of_tiles_x = FFMIN(x_ctb + ctb_size, lc->end_of_tiles_x);
2855
2/2
✓ Branch 0 taken 74159 times.
✓ Branch 1 taken 299817 times.
373976 if (fc->ps.pps->ctb_to_row_bd[ry] != fc->ps.pps->ctb_to_row_bd[ry + 1])
2856 74159 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, lc->end_of_tiles_y);
2857
2858 373976 lc->boundary_flags = 0;
2859
4/4
✓ Branch 0 taken 339600 times.
✓ Branch 1 taken 34376 times.
✓ Branch 2 taken 11983 times.
✓ Branch 3 taken 327617 times.
373976 if (rx > 0 && fc->ps.pps->ctb_to_col_bd[rx] != fc->ps.pps->ctb_to_col_bd[rx - 1])
2860 11983 lc->boundary_flags |= BOUNDARY_LEFT_TILE;
2861
4/4
✓ Branch 0 taken 339600 times.
✓ Branch 1 taken 34376 times.
✓ Branch 2 taken 5425 times.
✓ Branch 3 taken 334175 times.
373976 if (rx > 0 && fc->tab.slice_idx[rs] != fc->tab.slice_idx[rs - 1])
2862 5425 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2863
4/4
✓ Branch 0 taken 314356 times.
✓ Branch 1 taken 59620 times.
✓ Branch 2 taken 14539 times.
✓ Branch 3 taken 299817 times.
373976 if (ry > 0 && fc->ps.pps->ctb_to_row_bd[ry] != fc->ps.pps->ctb_to_row_bd[ry - 1])
2864 14539 lc->boundary_flags |= BOUNDARY_UPPER_TILE;
2865
4/4
✓ Branch 0 taken 314356 times.
✓ Branch 1 taken 59620 times.
✓ Branch 2 taken 12341 times.
✓ Branch 3 taken 302015 times.
373976 if (ry > 0 && fc->tab.slice_idx[rs] != fc->tab.slice_idx[rs - fc->ps.pps->ctb_width])
2866 12341 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2867
2/2
✓ Branch 0 taken 36539 times.
✓ Branch 1 taken 337437 times.
373976 if (fc->ps.sps->r->sps_subpic_ctu_top_left_x[lc->sc->sh.r->curr_subpic_idx] == rx)
2868 36539 lc->boundary_flags |= BOUNDARY_LEFT_SUBPIC;
2869
2/2
✓ Branch 0 taken 62203 times.
✓ Branch 1 taken 311773 times.
373976 if (fc->ps.sps->r->sps_subpic_ctu_top_left_y[lc->sc->sh.r->curr_subpic_idx] == ry)
2870 62203 lc->boundary_flags |= BOUNDARY_UPPER_SUBPIC;
2871
4/4
✓ Branch 0 taken 339600 times.
✓ Branch 1 taken 34376 times.
✓ Branch 2 taken 327617 times.
✓ Branch 3 taken 11983 times.
373976 lc->ctb_left_flag = rx > 0 && !(lc->boundary_flags & BOUNDARY_LEFT_TILE);
2872
6/6
✓ Branch 0 taken 314356 times.
✓ Branch 1 taken 59620 times.
✓ Branch 2 taken 299817 times.
✓ Branch 3 taken 14539 times.
✓ Branch 4 taken 297465 times.
✓ Branch 5 taken 2352 times.
373976 lc->ctb_up_flag = ry > 0 && !(lc->boundary_flags & BOUNDARY_UPPER_TILE) && !(lc->boundary_flags & BOUNDARY_UPPER_SLICE);
2873
4/4
✓ Branch 0 taken 297465 times.
✓ Branch 1 taken 76511 times.
✓ Branch 2 taken 267710 times.
✓ Branch 3 taken 29755 times.
641686 lc->ctb_up_right_flag = lc->ctb_up_flag && (fc->ps.pps->ctb_to_col_bd[rx] == fc->ps.pps->ctb_to_col_bd[rx + 1]) &&
2874
1/2
✓ Branch 0 taken 267710 times.
✗ Branch 1 not taken.
267710 (fc->ps.pps->ctb_to_row_bd[ry] == fc->ps.pps->ctb_to_row_bd[ry - 1]);
2875
4/4
✓ Branch 0 taken 327617 times.
✓ Branch 1 taken 46359 times.
✓ Branch 2 taken 267710 times.
✓ Branch 3 taken 59907 times.
373976 lc->ctb_up_left_flag = lc->ctb_left_flag && lc->ctb_up_flag;
2876 373976 }
2877
2878 2989711 void ff_vvc_set_neighbour_available(VVCLocalContext *lc,
2879 const int x0, const int y0, const int w, const int h)
2880 {
2881 2989711 const int log2_ctb_size = lc->fc->ps.sps->ctb_log2_size_y;
2882 2989711 const int x0b = av_zero_extend(x0, log2_ctb_size);
2883 2989711 const int y0b = av_zero_extend(y0, log2_ctb_size);
2884
2885
4/4
✓ Branch 0 taken 890134 times.
✓ Branch 1 taken 2099577 times.
✓ Branch 2 taken 797042 times.
✓ Branch 3 taken 93092 times.
2989711 lc->na.cand_up = (lc->ctb_up_flag || y0b);
2886
4/4
✓ Branch 0 taken 570215 times.
✓ Branch 1 taken 2419496 times.
✓ Branch 2 taken 496492 times.
✓ Branch 3 taken 73723 times.
2989711 lc->na.cand_left = (lc->ctb_left_flag || x0b);
2887
8/8
✓ Branch 0 taken 457128 times.
✓ Branch 1 taken 2532583 times.
✓ Branch 2 taken 330762 times.
✓ Branch 3 taken 126366 times.
✓ Branch 4 taken 2805994 times.
✓ Branch 5 taken 57351 times.
✓ Branch 6 taken 2739308 times.
✓ Branch 7 taken 66686 times.
2989711 lc->na.cand_up_left = (x0b || y0b) ? lc->na.cand_left && lc->na.cand_up : lc->ctb_up_left_flag;
2888 2989711 lc->na.cand_up_right_sap =
2889
6/6
✓ Branch 0 taken 425608 times.
✓ Branch 1 taken 2564103 times.
✓ Branch 2 taken 295015 times.
✓ Branch 3 taken 130593 times.
✓ Branch 4 taken 89490 times.
✓ Branch 5 taken 205525 times.
2989711 (x0b + w == 1 << log2_ctb_size) ? lc->ctb_up_right_flag && !y0b : lc->na.cand_up;
2890
4/4
✓ Branch 0 taken 2585158 times.
✓ Branch 1 taken 404553 times.
✓ Branch 2 taken 2562215 times.
✓ Branch 3 taken 22943 times.
2989711 lc->na.cand_up_right = lc->na.cand_up_right_sap && (x0 + w) < lc->end_of_tiles_x;
2891 2989711 }
2892
2893 111668 void ff_vvc_ctu_free_cus(CodingUnit **cus)
2894 {
2895
2/2
✓ Branch 0 taken 1386930 times.
✓ Branch 1 taken 111668 times.
1498598 while (*cus) {
2896 1386930 CodingUnit *cu = *cus;
2897 1386930 TransformUnit **head = &cu->tus.head;
2898
2899 1386930 *cus = cu->next;
2900
2901
2/2
✓ Branch 0 taken 1707344 times.
✓ Branch 1 taken 1386930 times.
3094274 while (*head) {
2902 1707344 TransformUnit *tu = *head;
2903 1707344 *head = tu->next;
2904 1707344 av_refstruct_unref(&tu);
2905 }
2906 1386930 cu->tus.tail = NULL;
2907
2908 1386930 av_refstruct_unref(&cu);
2909 }
2910 111668 }
2911
2912 16956859 int ff_vvc_get_qPy(const VVCFrameContext *fc, const int xc, const int yc)
2913 {
2914 16956859 const int min_cb_log2_size_y = fc->ps.sps->min_cb_log2_size_y;
2915 16956859 const int x = xc >> min_cb_log2_size_y;
2916 16956859 const int y = yc >> min_cb_log2_size_y;
2917 16956859 return fc->tab.qp[LUMA][x + y * fc->ps.pps->min_cb_width];
2918 }
2919
2920 2581 void ff_vvc_ep_init_stat_coeff(EntryPoint *ep,
2921 const int bit_depth, const int persistent_rice_adaptation_enabled_flag)
2922 {
2923
2/2
✓ Branch 0 taken 7743 times.
✓ Branch 1 taken 2581 times.
10324 for (size_t i = 0; i < FF_ARRAY_ELEMS(ep->stat_coeff); ++i) {
2924 7743 ep->stat_coeff[i] =
2925
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7743 times.
7743 persistent_rice_adaptation_enabled_flag ? 2 * (av_log2(bit_depth - 10)) : 0;
2926 }
2927 2581 }
2928
2929 744896 void ff_vvc_channel_range(int *start, int *end, const VVCTreeType tree_type, const uint8_t chroma_format_idc)
2930 {
2931
4/4
✓ Branch 0 taken 728385 times.
✓ Branch 1 taken 16511 times.
✓ Branch 2 taken 585842 times.
✓ Branch 3 taken 142543 times.
744896 const bool has_chroma = chroma_format_idc && tree_type != DUAL_TREE_LUMA;
2932 744896 const bool has_luma = tree_type != DUAL_TREE_CHROMA;
2933
2934 744896 *start = has_luma ? LUMA : CB;
2935
2/2
✓ Branch 0 taken 585842 times.
✓ Branch 1 taken 159054 times.
744896 *end = has_chroma ? VVC_MAX_SAMPLE_ARRAYS : CB;
2936 744896 }
2937