FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vvc/intra.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 424 431 98.4%
Functions: 26 26 100.0%
Branches: 267 286 93.4%

Line Branch Exec Source
1 /*
2 * VVC intra prediction
3 *
4 * Copyright (C) 2021 Nuo Mi
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22 #include "libavutil/frame.h"
23 #include "libavutil/imgutils.h"
24
25 #include "data.h"
26 #include "inter.h"
27 #include "intra.h"
28 #include "itx_1d.h"
29
30 349414 static int is_cclm(enum IntraPredMode mode)
31 {
32
6/6
✓ Branch 0 taken 293497 times.
✓ Branch 1 taken 55917 times.
✓ Branch 2 taken 274693 times.
✓ Branch 3 taken 18804 times.
✓ Branch 4 taken 21005 times.
✓ Branch 5 taken 253688 times.
349414 return mode == INTRA_LT_CCLM || mode == INTRA_L_CCLM || mode == INTRA_T_CCLM;
33 }
34
35 150795 static int derive_ilfnst_pred_mode_intra(const VVCLocalContext *lc, const TransformBlock *tb)
36 {
37 150795 const VVCFrameContext *fc = lc->fc;
38 150795 const VVCSPS *sps = fc->ps.sps;
39 150795 const CodingUnit *cu = lc->cu;
40 150795 const int x_tb = tb->x0 >> fc->ps.sps->min_cb_log2_size_y;
41 150795 const int y_tb = tb->y0 >> fc->ps.sps->min_cb_log2_size_y;
42 150795 const int x_c = (tb->x0 + (tb->tb_width << sps->hshift[1] >> 1) ) >> fc->ps.sps->min_cb_log2_size_y;
43 150795 const int y_c = (tb->y0 + (tb->tb_height << sps->vshift[1] >> 1)) >> fc->ps.sps->min_cb_log2_size_y;
44 150795 const int min_cb_width = fc->ps.pps->min_cb_width;
45 150795 const int intra_mip_flag = SAMPLE_CTB(fc->tab.imf, x_tb, y_tb);
46
2/2
✓ Branch 0 taken 109318 times.
✓ Branch 1 taken 41477 times.
150795 int pred_mode_intra = tb->c_idx == 0 ? cu->intra_pred_mode_y : cu->intra_pred_mode_c;
47
4/4
✓ Branch 0 taken 17884 times.
✓ Branch 1 taken 132911 times.
✓ Branch 2 taken 4962 times.
✓ Branch 3 taken 12922 times.
150795 if (intra_mip_flag && !tb->c_idx) {
48 4962 pred_mode_intra = INTRA_PLANAR;
49
2/2
✓ Branch 1 taken 12950 times.
✓ Branch 2 taken 132883 times.
145833 } else if (is_cclm(pred_mode_intra)) {
50 12950 int intra_mip_flag_c = SAMPLE_CTB(fc->tab.imf, x_c, y_c);
51 12950 int cu_pred_mode = SAMPLE_CTB(fc->tab.cpm[0], x_c, y_c);
52
2/2
✓ Branch 0 taken 4034 times.
✓ Branch 1 taken 8916 times.
12950 if (intra_mip_flag_c) {
53 4034 pred_mode_intra = INTRA_PLANAR;
54
2/4
✓ Branch 0 taken 8916 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8916 times.
8916 } else if (cu_pred_mode == MODE_IBC || cu_pred_mode == MODE_PLT) {
55 pred_mode_intra = INTRA_DC;
56 } else {
57 8916 pred_mode_intra = SAMPLE_CTB(fc->tab.ipm, x_c, y_c);
58 }
59 }
60 150795 pred_mode_intra = ff_vvc_wide_angle_mode_mapping(cu, tb->tb_width, tb->tb_height, tb->c_idx, pred_mode_intra);
61
62 150795 return pred_mode_intra;
63 }
64
65 //8.7.4 Transformation process for scaled transform coefficients
66 150795 static void ilfnst_transform(const VVCLocalContext *lc, TransformBlock *tb)
67 {
68 150795 const VVCSPS *sps = lc->fc->ps.sps;
69 150795 const CodingUnit *cu = lc->cu;
70 150795 const int w = tb->tb_width;
71 150795 const int h = tb->tb_height;
72
4/4
✓ Branch 0 taken 95022 times.
✓ Branch 1 taken 55773 times.
✓ Branch 2 taken 65763 times.
✓ Branch 3 taken 29259 times.
150795 const int n_lfnst_out_size = (w >= 8 && h >= 8) ? 48 : 16; ///< nLfnstOutSize
73
4/4
✓ Branch 0 taken 95022 times.
✓ Branch 1 taken 55773 times.
✓ Branch 2 taken 65763 times.
✓ Branch 3 taken 29259 times.
150795 const int log2_lfnst_size = (w >= 8 && h >= 8) ? 3 : 2; ///< log2LfnstSize
74 150795 const int n_lfnst_size = 1 << log2_lfnst_size; ///< nLfnstSize
75
8/8
✓ Branch 0 taken 35865 times.
✓ Branch 1 taken 114930 times.
✓ Branch 2 taken 25129 times.
✓ Branch 3 taken 10736 times.
✓ Branch 4 taken 55773 times.
✓ Branch 5 taken 84286 times.
✓ Branch 6 taken 35608 times.
✓ Branch 7 taken 20165 times.
150795 const int non_zero_size = ((w == 8 && h == 8) || (w == 4 && h == 4)) ? 8 : 16; ///< nonZeroSize
76 150795 const int pred_mode_intra = derive_ilfnst_pred_mode_intra(lc, tb);
77 150795 const int transpose = pred_mode_intra > 34;
78 int u[16], v[48];
79
80
2/2
✓ Branch 0 taken 2041968 times.
✓ Branch 1 taken 150795 times.
2192763 for (int x = 0; x < non_zero_size; x++) {
81 2041968 int xc = ff_vvc_diag_scan_x[2][2][x];
82 2041968 int yc = ff_vvc_diag_scan_y[2][2][x];
83 2041968 u[x] = tb->coeffs[w * yc + xc];
84 }
85 150795 ff_vvc_inv_lfnst_1d(v, u, non_zero_size, n_lfnst_out_size, pred_mode_intra,
86 150795 cu->lfnst_idx, sps->log2_transform_range);
87
2/2
✓ Branch 0 taken 41371 times.
✓ Branch 1 taken 109424 times.
150795 if (transpose) {
88 41371 int *dst = tb->coeffs;
89 41371 const int *src = v;
90
2/2
✓ Branch 0 taken 27189 times.
✓ Branch 1 taken 14182 times.
41371 if (n_lfnst_size == 4) {
91
2/2
✓ Branch 0 taken 108756 times.
✓ Branch 1 taken 27189 times.
135945 for (int y = 0; y < 4; y++) {
92 108756 dst[0] = src[0];
93 108756 dst[1] = src[4];
94 108756 dst[2] = src[8];
95 108756 dst[3] = src[12];
96 108756 src++;
97 108756 dst += w;
98 }
99 } else {
100
2/2
✓ Branch 0 taken 113456 times.
✓ Branch 1 taken 14182 times.
127638 for (int y = 0; y < 8; y++) {
101 113456 dst[0] = src[0];
102 113456 dst[1] = src[8];
103 113456 dst[2] = src[16];
104 113456 dst[3] = src[24];
105
2/2
✓ Branch 0 taken 56728 times.
✓ Branch 1 taken 56728 times.
113456 if (y < 4) {
106 56728 dst[4] = src[32];
107 56728 dst[5] = src[36];
108 56728 dst[6] = src[40];
109 56728 dst[7] = src[44];
110 }
111 113456 src++;
112 113456 dst += w;
113 }
114 }
115
116 } else {
117 109424 int *dst = tb->coeffs;
118 109424 const int *src = v;
119
2/2
✓ Branch 0 taken 644020 times.
✓ Branch 1 taken 109424 times.
753444 for (int y = 0; y < n_lfnst_size; y++) {
120
2/2
✓ Branch 0 taken 437696 times.
✓ Branch 1 taken 206324 times.
644020 int size = (y < 4) ? n_lfnst_size : 4;
121 644020 memcpy(dst, src, size * sizeof(int));
122 644020 src += size;
123 644020 dst += w;
124 }
125 }
126 150795 tb->max_scan_x = n_lfnst_size - 1;
127 150795 tb->max_scan_y = n_lfnst_size - 1;
128 150795 }
129
130 //part of 8.7.4 Transformation process for scaled transform coefficients
131 834622 static void derive_transform_type(const VVCFrameContext *fc, const VVCLocalContext *lc, const TransformBlock *tb, enum VVCTxType *trh, enum VVCTxType *trv)
132 {
133 834622 const CodingUnit *cu = lc->cu;
134 static const enum VVCTxType mts_to_trh[] = { VVC_DCT2, VVC_DST7, VVC_DCT8, VVC_DST7, VVC_DCT8 };
135 static const enum VVCTxType mts_to_trv[] = { VVC_DCT2, VVC_DST7, VVC_DST7, VVC_DCT8, VVC_DCT8 };
136 834622 const VVCSPS *sps = fc->ps.sps;
137 834622 int implicit_mts_enabled = 0;
138
6/6
✓ Branch 0 taken 636575 times.
✓ Branch 1 taken 198047 times.
✓ Branch 2 taken 136298 times.
✓ Branch 3 taken 500277 times.
✓ Branch 4 taken 31097 times.
✓ Branch 5 taken 105201 times.
834622 if (tb->c_idx || (cu->isp_split_type != ISP_NO_SPLIT && cu->lfnst_idx)) {
139 229144 *trh = *trv = VVC_DCT2;
140 229144 return;
141 }
142
143
2/2
✓ Branch 0 taken 601584 times.
✓ Branch 1 taken 3894 times.
605478 if (sps->r->sps_mts_enabled_flag) {
144
2/2
✓ Branch 0 taken 496383 times.
✓ Branch 1 taken 105201 times.
601584 if (cu->isp_split_type != ISP_NO_SPLIT ||
145
4/4
✓ Branch 0 taken 30793 times.
✓ Branch 1 taken 465590 times.
✓ Branch 2 taken 465 times.
✓ Branch 3 taken 30328 times.
496383 (cu->sbt_flag && FFMAX(tb->tb_width, tb->tb_height) <= 32) ||
146
4/4
✓ Branch 0 taken 15127 times.
✓ Branch 1 taken 450928 times.
✓ Branch 2 taken 12118 times.
✓ Branch 3 taken 3009 times.
466055 (!sps->r->sps_explicit_mts_intra_enabled_flag && cu->pred_mode == MODE_INTRA &&
147
2/4
✓ Branch 0 taken 12118 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12118 times.
✗ Branch 3 not taken.
12118 !cu->lfnst_idx && !cu->intra_mip_flag)) {
148 147647 implicit_mts_enabled = 1;
149 }
150 }
151
2/2
✓ Branch 0 taken 147647 times.
✓ Branch 1 taken 457831 times.
605478 if (implicit_mts_enabled) {
152 147647 const int w = tb->tb_width;
153 147647 const int h = tb->tb_height;
154
2/2
✓ Branch 0 taken 30328 times.
✓ Branch 1 taken 117319 times.
147647 if (cu->sbt_flag) {
155
4/4
✓ Branch 0 taken 15857 times.
✓ Branch 1 taken 14471 times.
✓ Branch 2 taken 7400 times.
✓ Branch 3 taken 8457 times.
30328 *trh = (cu->sbt_horizontal_flag || cu->sbt_pos_flag) ? VVC_DST7 : VVC_DCT8;
156
4/4
✓ Branch 0 taken 14471 times.
✓ Branch 1 taken 15857 times.
✓ Branch 2 taken 6965 times.
✓ Branch 3 taken 7506 times.
30328 *trv = (!cu->sbt_horizontal_flag || cu->sbt_pos_flag) ? VVC_DST7 : VVC_DCT8;
157 } else {
158
4/4
✓ Branch 0 taken 99047 times.
✓ Branch 1 taken 18272 times.
✓ Branch 2 taken 79561 times.
✓ Branch 3 taken 19486 times.
117319 *trh = (w >= 4 && w <= 16) ? VVC_DST7 : VVC_DCT2;
159
4/4
✓ Branch 0 taken 74229 times.
✓ Branch 1 taken 43090 times.
✓ Branch 2 taken 71879 times.
✓ Branch 3 taken 2350 times.
117319 *trv = (h >= 4 && h <= 16) ? VVC_DST7 : VVC_DCT2;
160 }
161 147647 return;
162 }
163 457831 *trh = mts_to_trh[cu->mts_idx];
164 457831 *trv = mts_to_trv[cu->mts_idx];
165 }
166
167 33327 static void add_residual_for_joint_coding_chroma(VVCLocalContext *lc,
168 const TransformUnit *tu, TransformBlock *tb, const int chroma_scale)
169 {
170 33327 const VVCFrameContext *fc = lc->fc;
171 33327 const CodingUnit *cu = lc->cu;
172 33327 const int c_sign = 1 - 2 * fc->ps.ph.r->ph_joint_cbcr_sign_flag;
173 33327 const int shift = tu->coded_flag[1] ^ tu->coded_flag[2];
174 33327 const int c_idx = 1 + tu->coded_flag[1];
175 33327 const ptrdiff_t stride = fc->frame->linesize[c_idx];
176 33327 const int hs = fc->ps.sps->hshift[c_idx];
177 33327 const int vs = fc->ps.sps->vshift[c_idx];
178 33327 uint8_t *dst = &fc->frame->data[c_idx][(tb->y0 >> vs) * stride +
179 33327 ((tb->x0 >> hs) << fc->ps.sps->pixel_shift)];
180
2/2
✓ Branch 0 taken 14657 times.
✓ Branch 1 taken 18670 times.
33327 if (chroma_scale) {
181 14657 fc->vvcdsp.itx.pred_residual_joint(tb->coeffs, tb->tb_width, tb->tb_height, c_sign, shift);
182 14657 fc->vvcdsp.intra.lmcs_scale_chroma(lc, tb->coeffs, tb->coeffs, tb->tb_width, tb->tb_height, cu->x0, cu->y0);
183 14657 fc->vvcdsp.itx.add_residual(dst, tb->coeffs, tb->tb_width, tb->tb_height, stride);
184 } else {
185 18670 fc->vvcdsp.itx.add_residual_joint(dst, tb->coeffs, tb->tb_width, tb->tb_height, stride, c_sign, shift);
186 }
187 33327 }
188
189 1738786 static int add_reconstructed_area(VVCLocalContext *lc, const int ch_type, const int x0, const int y0, const int w, const int h)
190 {
191 1738786 const VVCSPS *sps = lc->fc->ps.sps;
192 1738786 const int hs = sps->hshift[ch_type];
193 1738786 const int vs = sps->vshift[ch_type];
194 ReconstructedArea *a;
195
196
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1738786 times.
1738786 if (lc->num_ras[ch_type] >= FF_ARRAY_ELEMS(lc->ras[ch_type]))
197 return AVERROR_INVALIDDATA;
198
199 1738786 a = &lc->ras[ch_type][lc->num_ras[ch_type]];
200 1738786 a->x = x0 >> hs;
201 1738786 a->y = y0 >> vs;
202 1738786 a->w = w >> hs;
203 1738786 a->h = h >> vs;
204 1738786 lc->num_ras[ch_type]++;
205
206 1738786 return 0;
207 }
208
209 881803 static void add_tu_area(const TransformUnit *tu, int *x0, int *y0, int *w, int *h)
210 {
211 881803 *x0 = tu->x0;
212 881803 *y0 = tu->y0;
213 881803 *w = tu->width;
214 881803 *h = tu->height;
215 881803 }
216
217 #define MIN_ISP_PRED_WIDTH 4
218 683375 static int get_luma_predict_unit(const CodingUnit *cu, const TransformUnit *tu, const int idx, int *x0, int *y0, int *w, int *h)
219 {
220 683375 int has_luma = 1;
221 683375 add_tu_area(tu, x0, y0, w, h);
222
4/4
✓ Branch 0 taken 73170 times.
✓ Branch 1 taken 610205 times.
✓ Branch 2 taken 26122 times.
✓ Branch 3 taken 47048 times.
683375 if (cu->isp_split_type == ISP_VER_SPLIT && tu->width < MIN_ISP_PRED_WIDTH) {
223 26122 *w = MIN_ISP_PRED_WIDTH;
224 26122 has_luma = !(idx % (MIN_ISP_PRED_WIDTH / tu->width));
225 }
226 683375 return has_luma;
227 }
228
229 218986 static int get_chroma_predict_unit(const CodingUnit *cu, const TransformUnit *tu, const int idx, int *x0, int *y0, int *w, int *h)
230 {
231
2/2
✓ Branch 0 taken 198428 times.
✓ Branch 1 taken 20558 times.
218986 if (cu->isp_split_type == ISP_NO_SPLIT) {
232 198428 add_tu_area(tu, x0, y0, w, h);
233 198428 return 1;
234 }
235
2/2
✓ Branch 0 taken 5153 times.
✓ Branch 1 taken 15405 times.
20558 if (idx == cu->num_intra_subpartitions - 1) {
236 5153 *x0 = cu->x0;
237 5153 *y0 = cu->y0;
238 5153 *w = cu->cb_width;
239 5153 *h = cu->cb_height;
240 5153 return 1;
241 }
242 15405 return 0;
243 }
244
245 //8.4.5.1 General decoding process for intra blocks
246 1253426 static void predict_intra(VVCLocalContext *lc, const TransformUnit *tu, const int idx, const int target_ch_type)
247 {
248 1253426 const VVCFrameContext *fc = lc->fc;
249 1253426 const CodingUnit *cu = lc->cu;
250 1253426 const VVCTreeType tree_type = cu->tree_type;
251 int x0, y0, w, h;
252
2/2
✓ Branch 0 taken 351065 times.
✓ Branch 1 taken 902361 times.
1253426 if (cu->pred_mode != MODE_INTRA) {
253 351065 add_reconstructed_area(lc, target_ch_type, tu->x0, tu->y0, tu->width, tu->height);
254 351065 return;
255 }
256
3/4
✓ Branch 0 taken 683375 times.
✓ Branch 1 taken 218986 times.
✓ Branch 2 taken 683375 times.
✗ Branch 3 not taken.
902361 if (!target_ch_type && tree_type != DUAL_TREE_CHROMA) {
257
2/2
✓ Branch 1 taken 669283 times.
✓ Branch 2 taken 14092 times.
683375 if (get_luma_predict_unit(cu, tu, idx, &x0, &y0, &w, &h)) {
258 669283 ff_vvc_set_neighbour_available(lc, x0, y0, w, h);
259 669283 fc->vvcdsp.intra.intra_pred(lc, x0, y0, w, h, 0);
260 669283 add_reconstructed_area(lc, 0, x0, y0, w, h);
261 }
262 }
263
3/4
✓ Branch 0 taken 218986 times.
✓ Branch 1 taken 683375 times.
✓ Branch 2 taken 218986 times.
✗ Branch 3 not taken.
902361 if (target_ch_type && tree_type != DUAL_TREE_LUMA) {
264
2/2
✓ Branch 1 taken 203581 times.
✓ Branch 2 taken 15405 times.
218986 if (get_chroma_predict_unit(cu, tu, idx, &x0, &y0, &w, &h)){
265 203581 ff_vvc_set_neighbour_available(lc, x0, y0, w, h);
266
2/2
✓ Branch 1 taken 82776 times.
✓ Branch 2 taken 120805 times.
203581 if (is_cclm(cu->intra_pred_mode_c)) {
267 82776 fc->vvcdsp.intra.intra_cclm_pred(lc, x0, y0, w, h);
268 } else {
269 120805 fc->vvcdsp.intra.intra_pred(lc, x0, y0, w, h, 1);
270 120805 fc->vvcdsp.intra.intra_pred(lc, x0, y0, w, h, 2);
271 }
272 203581 add_reconstructed_area(lc, 1, x0, y0, w, h);
273 }
274 }
275 }
276
277 783618 static void scale_clip(int *coeff, const int nzw, const int w, const int h,
278 const int shift, const int log2_transform_range)
279 {
280 783618 const int add = 1 << (shift - 1);
281
2/2
✓ Branch 0 taken 8289522 times.
✓ Branch 1 taken 783618 times.
9073140 for (int y = 0; y < h; y++) {
282 8289522 int *p = coeff + y * w;
283
2/2
✓ Branch 0 taken 44854172 times.
✓ Branch 1 taken 8289522 times.
53143694 for (int x = 0; x < nzw; x++) {
284 44854172 *p = av_clip_intp2((*p + add) >> shift, log2_transform_range);
285 44854172 p++;
286 }
287 8289522 memset(p, 0, sizeof(*p) * (w - nzw));
288 }
289 783618 }
290
291 796422 static void scale(int *out, const int *in, const int w, const int h, const int shift)
292 {
293 796422 const int add = 1 << (shift - 1);
294
2/2
✓ Branch 0 taken 8343989 times.
✓ Branch 1 taken 796422 times.
9140411 for (int y = 0; y < h; y++) {
295
2/2
✓ Branch 0 taken 141139568 times.
✓ Branch 1 taken 8343989 times.
149483557 for (int x = 0; x < w; x++) {
296 141139568 int *o = out + y * w + x;
297 141139568 const int *i = in + y * w + x;
298 141139568 *o = (*i + add) >> shift;
299 }
300 }
301 796422 }
302
303 // part of 8.7.3 Scaling process for transform coefficients
304 863219 static void derive_qp(const VVCLocalContext *lc, const TransformUnit *tu, TransformBlock *tb)
305 {
306 863219 const VVCSPS *sps = lc->fc->ps.sps;
307 863219 const H266RawSliceHeader *rsh = lc->sc->sh.r;
308 863219 const CodingUnit *cu = lc->cu;
309 int qp, qp_act_offset;
310
311
2/2
✓ Branch 0 taken 661826 times.
✓ Branch 1 taken 201393 times.
863219 if (tb->c_idx == 0) {
312 //fix me
313 661826 qp = cu->qp[LUMA] + sps->qp_bd_offset;
314
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 661826 times.
661826 qp_act_offset = cu->act_enabled_flag ? -5 : 0;
315 } else {
316
6/6
✓ Branch 0 taken 33327 times.
✓ Branch 1 taken 168066 times.
✓ Branch 2 taken 26460 times.
✓ Branch 3 taken 6867 times.
✓ Branch 4 taken 12290 times.
✓ Branch 5 taken 14170 times.
201393 const int is_jcbcr = tu->joint_cbcr_residual_flag && tu->coded_flag[CB] && tu->coded_flag[CR];
317
2/2
✓ Branch 0 taken 189103 times.
✓ Branch 1 taken 12290 times.
201393 const int idx = is_jcbcr ? JCBCR : tb->c_idx;
318 201393 qp = cu->qp[idx];
319 201393 qp_act_offset = cu->act_enabled_flag ? 1 : 0;
320 }
321
2/2
✓ Branch 0 taken 28597 times.
✓ Branch 1 taken 834622 times.
863219 if (tb->ts) {
322 28597 const int qp_prime_ts_min = 4 + 6 * sps->r->sps_min_qp_prime_ts;
323
324 28597 tb->qp = av_clip(qp + qp_act_offset, qp_prime_ts_min, 63 + sps->qp_bd_offset);
325 28597 tb->rect_non_ts_flag = 0;
326 28597 tb->bd_shift = 10;
327 } else {
328 834622 const int log_sum = tb->log2_tb_width + tb->log2_tb_height;
329 834622 const int rect_non_ts_flag = log_sum & 1;
330
331 834622 tb->qp = av_clip(qp + qp_act_offset, 0, 63 + sps->qp_bd_offset);
332 834622 tb->rect_non_ts_flag = rect_non_ts_flag;
333 834622 tb->bd_shift = sps->bit_depth + rect_non_ts_flag + (log_sum / 2)
334 834622 + 10 - sps->log2_transform_range + rsh->sh_dep_quant_used_flag;
335 }
336 863219 tb->bd_offset = (1 << tb->bd_shift) >> 1;
337 863219 }
338
339 //8.7.3 Scaling process for transform coefficients
340 863219 static av_always_inline int derive_scale(const TransformBlock *tb, const int sh_dep_quant_used_flag)
341 {
342 static const uint8_t rem6[63 + 8 * 6 + 1] = {
343 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
344 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
345 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
346 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
347 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
348 };
349
350 static const uint8_t div6[63 + 8 * 6 + 1] = {
351 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
352 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7,
353 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11,
354 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15,
355 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18,
356 };
357
358 const static int level_scale[2][6] = {
359 { 40, 45, 51, 57, 64, 72 },
360 { 57, 64, 72, 80, 90, 102 }
361 };
362
4/4
✓ Branch 0 taken 837304 times.
✓ Branch 1 taken 25915 times.
✓ Branch 2 taken 808707 times.
✓ Branch 3 taken 28597 times.
863219 const int addin = sh_dep_quant_used_flag && !tb->ts;
363 863219 const int qp = tb->qp + addin;
364
365 863219 return level_scale[tb->rect_non_ts_flag][rem6[qp]] << div6[qp];
366 }
367
368 //8.7.3 Scaling process for transform coefficients
369 863219 static const uint8_t* derive_scale_m(const VVCLocalContext *lc, const TransformBlock *tb, uint8_t *scale_m)
370 {
371 //Table 38 – Specification of the scaling matrix identifier variable id according to predMode, cIdx, nTbW, and nTbH
372 863219 const int ids[2][3][6] = {
373 {
374 { 0, 2, 8, 14, 20, 26 },
375 { 0, 3, 9, 15, 21, 21 },
376 { 0, 4, 10, 16, 22, 22 }
377 },
378 {
379 { 0, 5, 11, 17, 23, 27 },
380 { 0, 6, 12, 18, 24, 24 },
381 { 1, 7, 13, 19, 25, 25 },
382 }
383 };
384 863219 const VVCFrameParamSets *ps = &lc->fc->ps;
385 863219 const VVCSPS *sps = ps->sps;
386 863219 const H266RawSliceHeader *rsh = lc->sc->sh.r;
387 863219 const CodingUnit *cu = lc->cu;
388 863219 const VVCScalingList *sl = ps->sl;
389 863219 const int id = ids[cu->pred_mode != MODE_INTRA][tb->c_idx][FFMAX(tb->log2_tb_height, tb->log2_tb_width) - 1];
390
4/4
✓ Branch 0 taken 862957 times.
✓ Branch 1 taken 262 times.
✓ Branch 2 taken 133947 times.
✓ Branch 3 taken 729010 times.
863219 const int log2_matrix_size = (id < 2) ? 1 : (id < 8) ? 2 : 3;
391 863219 uint8_t *p = scale_m;
392
393
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 863219 times.
863219 av_assert0(!sps->r->sps_scaling_matrix_for_alternative_colour_space_disabled_flag);
394
395
4/4
✓ Branch 0 taken 32503 times.
✓ Branch 1 taken 830716 times.
✓ Branch 2 taken 30013 times.
✓ Branch 3 taken 2490 times.
863219 if (!rsh->sh_explicit_scaling_list_used_flag || tb->ts ||
396
3/4
✓ Branch 0 taken 30013 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15175 times.
✓ Branch 3 taken 14838 times.
30013 sps->r->sps_scaling_matrix_for_lfnst_disabled_flag && cu->apply_lfnst_flag[tb->c_idx])
397 848381 return ff_vvc_default_scale_m;
398
399
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14838 times.
14838 if (!sl) {
400 av_log(lc->fc->log_ctx, AV_LOG_WARNING, "bug: no scaling list aps, id = %d", ps->ph.r->ph_scaling_list_aps_id);
401 return ff_vvc_default_scale_m;
402 }
403
404
2/2
✓ Branch 0 taken 43774 times.
✓ Branch 1 taken 14838 times.
58612 for (int y = tb->min_scan_y; y <= tb->max_scan_y; y++) {
405 43774 const int off = y << log2_matrix_size >> tb->log2_tb_height << log2_matrix_size;
406 43774 const uint8_t *m = &sl->scaling_matrix_rec[id][off];
407
408
2/2
✓ Branch 0 taken 166879 times.
✓ Branch 1 taken 43774 times.
210653 for (int x = tb->min_scan_x; x <= tb->max_scan_x; x++)
409 166879 *p++ = m[x << log2_matrix_size >> tb->log2_tb_width];
410 }
411
4/6
✓ Branch 0 taken 5759 times.
✓ Branch 1 taken 9079 times.
✓ Branch 2 taken 5759 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5759 times.
✗ Branch 5 not taken.
14838 if (id >= SL_START_16x16 && !tb->min_scan_x && !tb->min_scan_y)
412 5759 *scale_m = sl->scaling_matrix_dc_rec[id - SL_START_16x16];
413
414 14838 return scale_m;
415 }
416
417 //8.7.3 Scaling process for transform coefficients
418 10381655 static av_always_inline int scale_coeff(const TransformBlock *tb, int coeff,
419 const int scale, const int scale_m, const int log2_transform_range)
420 {
421 10381655 coeff = ((int64_t) coeff * scale * scale_m + tb->bd_offset) >> tb->bd_shift;
422 10381655 coeff = av_clip_intp2(coeff, log2_transform_range);
423 10381655 return coeff;
424 }
425
426 863219 static void dequant(const VVCLocalContext *lc, const TransformUnit *tu, TransformBlock *tb)
427 {
428 uint8_t tmp[MAX_TB_SIZE * MAX_TB_SIZE];
429 863219 const H266RawSliceHeader *rsh = lc->sc->sh.r;
430 863219 const VVCSPS *sps = lc->fc->ps.sps;
431 863219 const uint8_t *scale_m = derive_scale_m(lc, tb, tmp);
432 int scale;
433
434 863219 derive_qp(lc, tu, tb);
435 863219 scale = derive_scale(tb, rsh->sh_dep_quant_used_flag);
436
437
2/2
✓ Branch 0 taken 3278916 times.
✓ Branch 1 taken 863219 times.
4142135 for (int y = tb->min_scan_y; y <= tb->max_scan_y; y++) {
438
2/2
✓ Branch 0 taken 20093905 times.
✓ Branch 1 taken 3278916 times.
23372821 for (int x = tb->min_scan_x; x <= tb->max_scan_x; x++) {
439 20093905 int *coeff = tb->coeffs + y * tb->tb_width + x;
440
441
2/2
✓ Branch 0 taken 10381655 times.
✓ Branch 1 taken 9712250 times.
20093905 if (*coeff)
442 10381655 *coeff = scale_coeff(tb, *coeff, scale, *scale_m, sps->log2_transform_range);
443 20093905 scale_m++;
444 }
445 }
446 863219 }
447
448 //transmatrix[0][0]
449 #define DCT_A 64
450 818799 static void itx_2d(const VVCFrameContext *fc, TransformBlock *tb, const enum VVCTxType trh, const enum VVCTxType trv)
451 {
452 818799 const VVCSPS *sps = fc->ps.sps;
453 818799 const int w = tb->tb_width;
454 818799 const int h = tb->tb_height;
455 818799 const size_t nzw = tb->max_scan_x + 1;
456 818799 const size_t nzh = tb->max_scan_y + 1;
457 818799 const int shift[] = { 7, 5 + sps->log2_transform_range - sps->bit_depth };
458
459
9/10
✓ Branch 0 taken 286745 times.
✓ Branch 1 taken 532054 times.
✓ Branch 2 taken 58621 times.
✓ Branch 3 taken 228124 times.
✓ Branch 4 taken 41403 times.
✓ Branch 5 taken 17218 times.
✓ Branch 6 taken 35181 times.
✓ Branch 7 taken 6222 times.
✓ Branch 8 taken 35181 times.
✗ Branch 9 not taken.
818799 if (w == h && nzw == 1 && nzh == 1 && trh == VVC_DCT2 && trv == VVC_DCT2) {
460 35181 const int add[] = { 1 << (shift[0] - 1), 1 << (shift[1] - 1) };
461 35181 const int t = (tb->coeffs[0] * DCT_A + add[0]) >> shift[0];
462 35181 const int dc = (t * DCT_A + add[1]) >> shift[1];
463
464
2/2
✓ Branch 0 taken 13332864 times.
✓ Branch 1 taken 35181 times.
13368045 for (int i = 0; i < w * h; i++)
465 13332864 tb->coeffs[i] = dc;
466
467 35181 return;
468 }
469
470
2/2
✓ Branch 0 taken 3810939 times.
✓ Branch 1 taken 783618 times.
4594557 for (int x = 0; x < nzw; x++)
471 3810939 fc->vvcdsp.itx.itx[trv][tb->log2_tb_height - 1](tb->coeffs + x, w, nzh);
472 783618 scale_clip(tb->coeffs, nzw, w, h, shift[0], sps->log2_transform_range);
473
474
2/2
✓ Branch 0 taken 8289522 times.
✓ Branch 1 taken 783618 times.
9073140 for (int y = 0; y < h; y++)
475 8289522 fc->vvcdsp.itx.itx[trh][tb->log2_tb_width - 1](tb->coeffs + y * w, 1, nzw);
476 783618 scale(tb->coeffs, tb->coeffs, w, h, shift[1]);
477 }
478
479 15823 static void itx_1d(const VVCFrameContext *fc, TransformBlock *tb, const enum VVCTxType trh, const enum VVCTxType trv)
480 {
481 15823 const VVCSPS *sps = fc->ps.sps;
482 15823 const int w = tb->tb_width;
483 15823 const int h = tb->tb_height;
484 15823 const size_t nzw = tb->max_scan_x + 1;
485 15823 const size_t nzh = tb->max_scan_y + 1;
486
487
12/12
✓ Branch 0 taken 13080 times.
✓ Branch 1 taken 2743 times.
✓ Branch 2 taken 4803 times.
✓ Branch 3 taken 8277 times.
✓ Branch 4 taken 1934 times.
✓ Branch 5 taken 2869 times.
✓ Branch 6 taken 2743 times.
✓ Branch 7 taken 10211 times.
✓ Branch 8 taken 731 times.
✓ Branch 9 taken 2012 times.
✓ Branch 10 taken 150 times.
✓ Branch 11 taken 581 times.
15823 if ((w > 1 && nzw == 1 && trh == VVC_DCT2) || (h > 1 && nzh == 1 && trv == VVC_DCT2)) {
488 3019 const int shift = 6 + sps->log2_transform_range - sps->bit_depth;
489 3019 const int add = 1 << (shift - 1);
490 3019 const int dc = (tb->coeffs[0] * DCT_A + add) >> shift;
491
492
2/2
✓ Branch 0 taken 96960 times.
✓ Branch 1 taken 3019 times.
99979 for (int i = 0; i < w * h; i++)
493 96960 tb->coeffs[i] = dc;
494
495 3019 return;
496 }
497
498
2/2
✓ Branch 0 taken 10211 times.
✓ Branch 1 taken 2593 times.
12804 if (w > 1)
499 10211 fc->vvcdsp.itx.itx[trh][tb->log2_tb_width - 1](tb->coeffs, 1, nzw);
500 else
501 2593 fc->vvcdsp.itx.itx[trv][tb->log2_tb_height - 1](tb->coeffs, 1, nzh);
502 12804 scale(tb->coeffs, tb->coeffs, w, h, 6 + sps->log2_transform_range - sps->bit_depth);
503 }
504
505 10 static void transform_bdpcm(TransformBlock *tb, const VVCLocalContext *lc, const CodingUnit *cu)
506 {
507 10 const VVCSPS *sps = lc->fc->ps.sps;
508
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 6 times.
10 const IntraPredMode mode = tb->c_idx ? cu->intra_pred_mode_c : cu->intra_pred_mode_y;
509 10 const int vertical = mode == INTRA_VERT;
510 10 lc->fc->vvcdsp.itx.transform_bdpcm(tb->coeffs, tb->tb_width, tb->tb_height,
511 10 vertical, sps->log2_transform_range);
512
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 6 times.
10 if (vertical)
513 4 tb->max_scan_y = tb->tb_height - 1;
514 else
515 6 tb->max_scan_x = tb->tb_width - 1;
516 10 }
517
518 1253426 static void itransform(VVCLocalContext *lc, TransformUnit *tu, const int tu_idx, const int target_ch_type)
519 {
520 1253426 const VVCFrameContext *fc = lc->fc;
521 1253426 const VVCSPS *sps = fc->ps.sps;
522 1253426 const VVCSH *sh = &lc->sc->sh;
523 1253426 const CodingUnit *cu = lc->cu;
524 1253426 const int ps = fc->ps.sps->pixel_shift;
525 DECLARE_ALIGNED(32, int, temp)[MAX_TB_SIZE * MAX_TB_SIZE];
526
527
2/2
✓ Branch 0 taken 2279947 times.
✓ Branch 1 taken 1253426 times.
3533373 for (int i = 0; i < tu->nb_tbs; i++) {
528 2279947 TransformBlock *tb = &tu->tbs[i];
529 2279947 const int c_idx = tb->c_idx;
530 2279947 const int ch_type = c_idx > 0;
531
532
4/4
✓ Branch 0 taken 1614112 times.
✓ Branch 1 taken 665835 times.
✓ Branch 2 taken 863219 times.
✓ Branch 3 taken 750893 times.
2279947 if (ch_type == target_ch_type && tb->has_coeffs) {
533 863219 const int w = tb->tb_width;
534 863219 const int h = tb->tb_height;
535
7/8
✓ Branch 0 taken 201393 times.
✓ Branch 1 taken 661826 times.
✓ Branch 2 taken 91523 times.
✓ Branch 3 taken 109870 times.
✓ Branch 4 taken 91523 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 91352 times.
✓ Branch 7 taken 171 times.
863219 const int chroma_scale = ch_type && sh->r->sh_lmcs_used_flag && fc->ps.ph.r->ph_chroma_residual_scale_flag && (w * h > 4);
536 863219 const ptrdiff_t stride = fc->frame->linesize[c_idx];
537 863219 const int hs = sps->hshift[c_idx];
538 863219 const int vs = sps->vshift[c_idx];
539 863219 uint8_t *dst = &fc->frame->data[c_idx][(tb->y0 >> vs) * stride + ((tb->x0 >> hs) << ps)];
540
541
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 863209 times.
863219 if (cu->bdpcm_flag[tb->c_idx])
542 10 transform_bdpcm(tb, lc, cu);
543 863219 dequant(lc, tu, tb);
544
2/2
✓ Branch 0 taken 834622 times.
✓ Branch 1 taken 28597 times.
863219 if (!tb->ts) {
545 enum VVCTxType trh, trv;
546
547
2/2
✓ Branch 0 taken 150795 times.
✓ Branch 1 taken 683827 times.
834622 if (cu->apply_lfnst_flag[c_idx])
548 150795 ilfnst_transform(lc, tb);
549 834622 derive_transform_type(fc, lc, tb, &trh, &trv);
550
4/4
✓ Branch 0 taken 831879 times.
✓ Branch 1 taken 2743 times.
✓ Branch 2 taken 818799 times.
✓ Branch 3 taken 13080 times.
834622 if (w > 1 && h > 1)
551 818799 itx_2d(fc, tb, trh, trv);
552 else
553 15823 itx_1d(fc, tb, trh, trv);
554 }
555
556
2/2
✓ Branch 0 taken 91352 times.
✓ Branch 1 taken 771867 times.
863219 if (chroma_scale)
557 91352 fc->vvcdsp.intra.lmcs_scale_chroma(lc, temp, tb->coeffs, w, h, cu->x0, cu->y0);
558 // TODO: Address performance issue here by combining transform, lmcs_scale_chroma, and add_residual into one function.
559 // Complete this task before implementing ASM code.
560
2/2
✓ Branch 0 taken 91352 times.
✓ Branch 1 taken 771867 times.
863219 fc->vvcdsp.itx.add_residual(dst, chroma_scale ? temp : tb->coeffs, w, h, stride);
561
562
4/4
✓ Branch 0 taken 37566 times.
✓ Branch 1 taken 825653 times.
✓ Branch 2 taken 33327 times.
✓ Branch 3 taken 4239 times.
863219 if (tu->joint_cbcr_residual_flag && tb->c_idx)
563 33327 add_residual_for_joint_coding_chroma(lc, tu, tb, chroma_scale);
564 }
565 }
566 1253426 }
567
568 841795 static int reconstruct(VVCLocalContext *lc)
569 {
570 841795 VVCFrameContext *fc = lc->fc;
571 841795 CodingUnit *cu = lc->cu;
572 841795 const int start = cu->tree_type == DUAL_TREE_CHROMA;
573
4/4
✓ Branch 0 taken 822667 times.
✓ Branch 1 taken 19128 times.
✓ Branch 2 taken 338304 times.
✓ Branch 3 taken 484363 times.
841795 const int end = fc->ps.sps->r->sps_chroma_format_idc && (cu->tree_type != DUAL_TREE_LUMA);
574
575
2/2
✓ Branch 0 taken 1020818 times.
✓ Branch 1 taken 841795 times.
1862613 for (int ch_type = start; ch_type <= end; ch_type++) {
576 1020818 TransformUnit *tu = cu->tus.head;
577
2/2
✓ Branch 0 taken 1253426 times.
✓ Branch 1 taken 1020818 times.
2274244 for (int i = 0; tu; i++) {
578 1253426 predict_intra(lc, tu, i, ch_type);
579 1253426 itransform(lc, tu, i, ch_type);
580 1253426 tu = tu->next;
581 }
582 }
583 841795 return 0;
584 }
585
586 #define POS(c_idx, x, y) \
587 &fc->frame->data[c_idx][((y) >> fc->ps.sps->vshift[c_idx]) * fc->frame->linesize[c_idx] + \
588 (((x) >> fc->ps.sps->hshift[c_idx]) << fc->ps.sps->pixel_shift)]
589
590 #define IBC_POS(c_idx, x, y) \
591 (fc->tab.ibc_vir_buf[c_idx] + \
592 (x << ps) + (y + ((cu->y0 & ~(sps->ctb_size_y - 1)) >> vs)) * ibc_stride)
593 #define IBC_X(x) ((x) & ((fc->tab.sz.ibc_buffer_width >> hs) - 1))
594 #define IBC_Y(y) ((y) & ((1 << sps->ctb_log2_size_y >> vs) - 1))
595
596 1660 static void intra_block_copy(const VVCLocalContext *lc, const int c_idx)
597 {
598 1660 const CodingUnit *cu = lc->cu;
599 1660 const PredictionUnit *pu = &cu->pu;
600 1660 const VVCFrameContext *fc = lc->fc;
601 1660 const VVCSPS *sps = fc->ps.sps;
602 1660 const Mv *bv = &pu->mi.mv[L0][0];
603 1660 const int hs = sps->hshift[c_idx];
604 1660 const int vs = sps->vshift[c_idx];
605 1660 const int ps = sps->pixel_shift;
606 1660 const int ref_x = IBC_X((cu->x0 >> hs) + (bv->x >> (4 + hs)));
607 1660 const int ref_y = IBC_Y((cu->y0 >> vs) + (bv->y >> (4 + vs)));
608 1660 const int w = cu->cb_width >> hs;
609 1660 const int h = cu->cb_height >> vs;
610 1660 const int ibc_buf_width = fc->tab.sz.ibc_buffer_width >> hs; ///< IbcBufWidthY and IbcBufWidthC
611 1660 const int rw = FFMIN(w, ibc_buf_width - ref_x);
612 1660 const int ibc_stride = ibc_buf_width << ps;
613 1660 const int dst_stride = fc->frame->linesize[c_idx];
614 1660 const uint8_t *ibc_buf = IBC_POS(c_idx, ref_x, ref_y);
615 1660 uint8_t *dst = POS(c_idx, cu->x0, cu->y0);
616
617 1660 av_image_copy_plane(dst, dst_stride, ibc_buf, ibc_stride, rw << ps, h);
618
619
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1660 times.
1660 if (w > rw) {
620 //wrap around, left part
621 ibc_buf = IBC_POS(c_idx, 0, ref_y);
622 dst += rw << ps;
623 av_image_copy_plane(dst, dst_stride, ibc_buf, ibc_stride, (w - rw) << ps, h);
624 }
625 1660 }
626
627 1582 static void vvc_predict_ibc(const VVCLocalContext *lc)
628 {
629 1582 const H266RawSPS *rsps = lc->fc->ps.sps->r;
630
631 1582 intra_block_copy(lc, LUMA);
632
3/4
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 1543 times.
✓ Branch 2 taken 39 times.
✗ Branch 3 not taken.
1582 if (lc->cu->tree_type == SINGLE_TREE && rsps->sps_chroma_format_idc) {
633 39 intra_block_copy(lc, CB);
634 39 intra_block_copy(lc, CR);
635 }
636 1582 }
637
638 3578 static void ibc_fill_vir_buf(const VVCLocalContext *lc, const CodingUnit *cu)
639 {
640 3578 const VVCFrameContext *fc = lc->fc;
641 3578 const VVCSPS *sps = fc->ps.sps;
642
3/4
✓ Branch 0 taken 3578 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1190 times.
✓ Branch 3 taken 2388 times.
3578 const int has_chroma = sps->r->sps_chroma_format_idc && cu->tree_type != DUAL_TREE_LUMA;
643 3578 const int start = cu->tree_type == DUAL_TREE_CHROMA;
644
2/2
✓ Branch 0 taken 1190 times.
✓ Branch 1 taken 2388 times.
3578 const int end = has_chroma ? CR : LUMA;
645
646
2/2
✓ Branch 0 taken 5751 times.
✓ Branch 1 taken 3578 times.
9329 for (int c_idx = start; c_idx <= end; c_idx++) {
647 5751 const int hs = sps->hshift[c_idx];
648 5751 const int vs = sps->vshift[c_idx];
649 5751 const int ps = sps->pixel_shift;
650 5751 const int x = IBC_X(cu->x0 >> hs);
651 5751 const int y = IBC_Y(cu->y0 >> vs);
652 5751 const int src_stride = fc->frame->linesize[c_idx];
653 5751 const int ibc_stride = fc->tab.sz.ibc_buffer_width >> hs << ps;
654 5751 const uint8_t *src = POS(c_idx, cu->x0, cu->y0);
655 5751 uint8_t *ibc_buf = IBC_POS(c_idx, x, y);
656
657 5751 av_image_copy_plane(ibc_buf, ibc_stride, src, src_stride, cu->cb_width >> hs << ps , cu->cb_height >> vs);
658 }
659 3578 }
660
661 45792 int ff_vvc_reconstruct(VVCLocalContext *lc, const int rs, const int rx, const int ry)
662 {
663 45792 const VVCFrameContext *fc = lc->fc;
664 45792 const VVCSPS *sps = fc->ps.sps;
665 45792 const int x_ctb = rx << sps->ctb_log2_size_y;
666 45792 const int y_ctb = ry << sps->ctb_log2_size_y;
667 45792 CodingUnit *cu = fc->tab.cus[rs];
668 45792 int ret = 0;
669
670 45792 lc->num_ras[0] = lc->num_ras[1] = 0;
671 45792 lc->lmcs.x_vpdu = -1;
672 45792 lc->lmcs.y_vpdu = -1;
673 45792 ff_vvc_decode_neighbour(lc, x_ctb, y_ctb, rx, ry, rs);
674
2/2
✓ Branch 0 taken 1107877 times.
✓ Branch 1 taken 45792 times.
1153669 while (cu) {
675 1107877 lc->cu = cu;
676
677
2/2
✓ Branch 0 taken 15517 times.
✓ Branch 1 taken 1092360 times.
1107877 if (cu->ciip_flag)
678 15517 ff_vvc_predict_ciip(lc);
679
2/2
✓ Branch 0 taken 1582 times.
✓ Branch 1 taken 1090778 times.
1092360 else if (cu->pred_mode == MODE_IBC)
680 1582 vvc_predict_ibc(lc);
681
2/2
✓ Branch 0 taken 841795 times.
✓ Branch 1 taken 266082 times.
1107877 if (cu->coded_flag) {
682 841795 ret = reconstruct(lc);
683 } else {
684
1/2
✓ Branch 0 taken 266082 times.
✗ Branch 1 not taken.
266082 if (cu->tree_type != DUAL_TREE_CHROMA)
685 266082 add_reconstructed_area(lc, LUMA, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
686
4/4
✓ Branch 0 taken 249571 times.
✓ Branch 1 taken 16511 times.
✓ Branch 2 taken 248775 times.
✓ Branch 3 taken 796 times.
266082 if (sps->r->sps_chroma_format_idc && cu->tree_type != DUAL_TREE_LUMA)
687 248775 add_reconstructed_area(lc, CHROMA, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
688 }
689
2/2
✓ Branch 0 taken 3578 times.
✓ Branch 1 taken 1104299 times.
1107877 if (sps->r->sps_ibc_enabled_flag)
690 3578 ibc_fill_vir_buf(lc, cu);
691 1107877 cu = cu->next;
692 }
693 45792 ff_vvc_ctu_free_cus(fc->tab.cus + rs);
694 45792 return ret;
695 }
696
697