FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vvc/intra.c
Date: 2025-01-20 09:27:23
Exec Total Coverage
Lines: 428 431 99.3%
Functions: 26 26 100.0%
Branches: 271 286 94.8%

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 394722 static int is_cclm(enum IntraPredMode mode)
31 {
32
6/6
✓ Branch 0 taken 334763 times.
✓ Branch 1 taken 59959 times.
✓ Branch 2 taken 311860 times.
✓ Branch 3 taken 22903 times.
✓ Branch 4 taken 24994 times.
✓ Branch 5 taken 286866 times.
394722 return mode == INTRA_LT_CCLM || mode == INTRA_L_CCLM || mode == INTRA_T_CCLM;
33 }
34
35 171035 static int derive_ilfnst_pred_mode_intra(const VVCLocalContext *lc, const TransformBlock *tb)
36 {
37 171035 const VVCFrameContext *fc = lc->fc;
38 171035 const VVCSPS *sps = fc->ps.sps;
39 171035 const CodingUnit *cu = lc->cu;
40 171035 const int x_tb = tb->x0 >> fc->ps.sps->min_cb_log2_size_y;
41 171035 const int y_tb = tb->y0 >> fc->ps.sps->min_cb_log2_size_y;
42 171035 const int x_c = (tb->x0 + (tb->tb_width << sps->hshift[1] >> 1) ) >> fc->ps.sps->min_cb_log2_size_y;
43 171035 const int y_c = (tb->y0 + (tb->tb_height << sps->vshift[1] >> 1)) >> fc->ps.sps->min_cb_log2_size_y;
44 171035 const int min_cb_width = fc->ps.pps->min_cb_width;
45 171035 const int intra_mip_flag = SAMPLE_CTB(fc->tab.imf, x_tb, y_tb);
46
2/2
✓ Branch 0 taken 120383 times.
✓ Branch 1 taken 50652 times.
171035 int pred_mode_intra = tb->c_idx == 0 ? cu->intra_pred_mode_y : cu->intra_pred_mode_c;
47
4/4
✓ Branch 0 taken 19883 times.
✓ Branch 1 taken 151152 times.
✓ Branch 2 taken 5088 times.
✓ Branch 3 taken 14795 times.
171035 if (intra_mip_flag && !tb->c_idx) {
48 5088 pred_mode_intra = INTRA_PLANAR;
49
2/2
✓ Branch 1 taken 15814 times.
✓ Branch 2 taken 150133 times.
165947 } else if (is_cclm(pred_mode_intra)) {
50 15814 int intra_mip_flag_c = SAMPLE_CTB(fc->tab.imf, x_c, y_c);
51 15814 int cu_pred_mode = SAMPLE_CTB(fc->tab.cpm[0], x_c, y_c);
52
2/2
✓ Branch 0 taken 4442 times.
✓ Branch 1 taken 11372 times.
15814 if (intra_mip_flag_c) {
53 4442 pred_mode_intra = INTRA_PLANAR;
54
3/4
✓ Branch 0 taken 10400 times.
✓ Branch 1 taken 972 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10400 times.
11372 } else if (cu_pred_mode == MODE_IBC || cu_pred_mode == MODE_PLT) {
55 972 pred_mode_intra = INTRA_DC;
56 } else {
57 10400 pred_mode_intra = SAMPLE_CTB(fc->tab.ipm, x_c, y_c);
58 }
59 }
60 171035 pred_mode_intra = ff_vvc_wide_angle_mode_mapping(cu, tb->tb_width, tb->tb_height, tb->c_idx, pred_mode_intra);
61
62 171035 return pred_mode_intra;
63 }
64
65 //8.7.4 Transformation process for scaled transform coefficients
66 171035 static void ilfnst_transform(const VVCLocalContext *lc, TransformBlock *tb)
67 {
68 171035 const VVCSPS *sps = lc->fc->ps.sps;
69 171035 const CodingUnit *cu = lc->cu;
70 171035 const int w = tb->tb_width;
71 171035 const int h = tb->tb_height;
72
4/4
✓ Branch 0 taken 99473 times.
✓ Branch 1 taken 71562 times.
✓ Branch 2 taken 68302 times.
✓ Branch 3 taken 31171 times.
171035 const int n_lfnst_out_size = (w >= 8 && h >= 8) ? 48 : 16; ///< nLfnstOutSize
73
4/4
✓ Branch 0 taken 99473 times.
✓ Branch 1 taken 71562 times.
✓ Branch 2 taken 68302 times.
✓ Branch 3 taken 31171 times.
171035 const int log2_lfnst_size = (w >= 8 && h >= 8) ? 3 : 2; ///< log2LfnstSize
74 171035 const int n_lfnst_size = 1 << log2_lfnst_size; ///< nLfnstSize
75
8/8
✓ Branch 0 taken 39616 times.
✓ Branch 1 taken 131419 times.
✓ Branch 2 taken 27196 times.
✓ Branch 3 taken 12420 times.
✓ Branch 4 taken 71562 times.
✓ Branch 5 taken 87053 times.
✓ Branch 6 taken 49275 times.
✓ Branch 7 taken 22287 times.
171035 const int non_zero_size = ((w == 8 && h == 8) || (w == 4 && h == 4)) ? 8 : 16; ///< nonZeroSize
76 171035 const int pred_mode_intra = derive_ilfnst_pred_mode_intra(lc, tb);
77 171035 const int transpose = pred_mode_intra > 34;
78 int u[16], v[48];
79
80
2/2
✓ Branch 0 taken 2243000 times.
✓ Branch 1 taken 171035 times.
2414035 for (int x = 0; x < non_zero_size; x++) {
81 2243000 int xc = ff_vvc_diag_scan_x[2][2][x];
82 2243000 int yc = ff_vvc_diag_scan_y[2][2][x];
83 2243000 u[x] = tb->coeffs[w * yc + xc];
84 }
85 171035 ff_vvc_inv_lfnst_1d(v, u, non_zero_size, n_lfnst_out_size, pred_mode_intra,
86 171035 cu->lfnst_idx, sps->log2_transform_range);
87
2/2
✓ Branch 0 taken 49668 times.
✓ Branch 1 taken 121367 times.
171035 if (transpose) {
88 49668 int *dst = tb->coeffs;
89 49668 const int *src = v;
90
2/2
✓ Branch 0 taken 34546 times.
✓ Branch 1 taken 15122 times.
49668 if (n_lfnst_size == 4) {
91
2/2
✓ Branch 0 taken 138184 times.
✓ Branch 1 taken 34546 times.
172730 for (int y = 0; y < 4; y++) {
92 138184 dst[0] = src[0];
93 138184 dst[1] = src[4];
94 138184 dst[2] = src[8];
95 138184 dst[3] = src[12];
96 138184 src++;
97 138184 dst += w;
98 }
99 } else {
100
2/2
✓ Branch 0 taken 120976 times.
✓ Branch 1 taken 15122 times.
136098 for (int y = 0; y < 8; y++) {
101 120976 dst[0] = src[0];
102 120976 dst[1] = src[8];
103 120976 dst[2] = src[16];
104 120976 dst[3] = src[24];
105
2/2
✓ Branch 0 taken 60488 times.
✓ Branch 1 taken 60488 times.
120976 if (y < 4) {
106 60488 dst[4] = src[32];
107 60488 dst[5] = src[36];
108 60488 dst[6] = src[40];
109 60488 dst[7] = src[44];
110 }
111 120976 src++;
112 120976 dst += w;
113 }
114 }
115
116 } else {
117 121367 int *dst = tb->coeffs;
118 121367 const int *src = v;
119
2/2
✓ Branch 0 taken 698188 times.
✓ Branch 1 taken 121367 times.
819555 for (int y = 0; y < n_lfnst_size; y++) {
120
2/2
✓ Branch 0 taken 485468 times.
✓ Branch 1 taken 212720 times.
698188 int size = (y < 4) ? n_lfnst_size : 4;
121 698188 memcpy(dst, src, size * sizeof(int));
122 698188 src += size;
123 698188 dst += w;
124 }
125 }
126 171035 tb->max_scan_x = n_lfnst_size - 1;
127 171035 tb->max_scan_y = n_lfnst_size - 1;
128 171035 }
129
130 //part of 8.7.4 Transformation process for scaled transform coefficients
131 922823 static void derive_transform_type(const VVCFrameContext *fc, const VVCLocalContext *lc, const TransformBlock *tb, enum VVCTxType *trh, enum VVCTxType *trv)
132 {
133 922823 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 922823 const VVCSPS *sps = fc->ps.sps;
137 922823 int implicit_mts_enabled = 0;
138
6/6
✓ Branch 0 taken 671778 times.
✓ Branch 1 taken 251045 times.
✓ Branch 2 taken 137890 times.
✓ Branch 3 taken 533888 times.
✓ Branch 4 taken 32201 times.
✓ Branch 5 taken 105689 times.
922823 if (tb->c_idx || (cu->isp_split_type != ISP_NO_SPLIT && cu->lfnst_idx)) {
139 283246 *trh = *trv = VVC_DCT2;
140 283246 return;
141 }
142
143
2/2
✓ Branch 0 taken 635683 times.
✓ Branch 1 taken 3894 times.
639577 if (sps->r->sps_mts_enabled_flag) {
144
2/2
✓ Branch 0 taken 529994 times.
✓ Branch 1 taken 105689 times.
635683 if (cu->isp_split_type != ISP_NO_SPLIT ||
145
4/4
✓ Branch 0 taken 34142 times.
✓ Branch 1 taken 495852 times.
✓ Branch 2 taken 465 times.
✓ Branch 3 taken 33677 times.
529994 (cu->sbt_flag && FFMAX(tb->tb_width, tb->tb_height) <= 32) ||
146
4/4
✓ Branch 0 taken 45019 times.
✓ Branch 1 taken 451298 times.
✓ Branch 2 taken 28412 times.
✓ Branch 3 taken 16607 times.
496317 (!sps->r->sps_explicit_mts_intra_enabled_flag && cu->pred_mode == MODE_INTRA &&
147
4/4
✓ Branch 0 taken 18449 times.
✓ Branch 1 taken 9963 times.
✓ Branch 2 taken 14592 times.
✓ Branch 3 taken 3857 times.
28412 !cu->lfnst_idx && !cu->intra_mip_flag)) {
148 153958 implicit_mts_enabled = 1;
149 }
150 }
151
2/2
✓ Branch 0 taken 153958 times.
✓ Branch 1 taken 485619 times.
639577 if (implicit_mts_enabled) {
152 153958 const int w = tb->tb_width;
153 153958 const int h = tb->tb_height;
154
2/2
✓ Branch 0 taken 33677 times.
✓ Branch 1 taken 120281 times.
153958 if (cu->sbt_flag) {
155
4/4
✓ Branch 0 taken 17823 times.
✓ Branch 1 taken 15854 times.
✓ Branch 2 taken 8393 times.
✓ Branch 3 taken 9430 times.
33677 *trh = (cu->sbt_horizontal_flag || cu->sbt_pos_flag) ? VVC_DST7 : VVC_DCT8;
156
4/4
✓ Branch 0 taken 15854 times.
✓ Branch 1 taken 17823 times.
✓ Branch 2 taken 7657 times.
✓ Branch 3 taken 8197 times.
33677 *trv = (!cu->sbt_horizontal_flag || cu->sbt_pos_flag) ? VVC_DST7 : VVC_DCT8;
157 } else {
158
4/4
✓ Branch 0 taken 101929 times.
✓ Branch 1 taken 18352 times.
✓ Branch 2 taken 81943 times.
✓ Branch 3 taken 19986 times.
120281 *trh = (w >= 4 && w <= 16) ? VVC_DST7 : VVC_DCT2;
159
4/4
✓ Branch 0 taken 77125 times.
✓ Branch 1 taken 43156 times.
✓ Branch 2 taken 74230 times.
✓ Branch 3 taken 2895 times.
120281 *trv = (h >= 4 && h <= 16) ? VVC_DST7 : VVC_DCT2;
160 }
161 153958 return;
162 }
163 485619 *trh = mts_to_trh[cu->mts_idx];
164 485619 *trv = mts_to_trv[cu->mts_idx];
165 }
166
167 52232 static void add_residual_for_joint_coding_chroma(VVCLocalContext *lc,
168 const TransformUnit *tu, TransformBlock *tb, const int chroma_scale)
169 {
170 52232 const VVCFrameContext *fc = lc->fc;
171 52232 const CodingUnit *cu = lc->cu;
172 52232 const int c_sign = 1 - 2 * fc->ps.ph.r->ph_joint_cbcr_sign_flag;
173 52232 const int shift = tu->coded_flag[1] ^ tu->coded_flag[2];
174 52232 const int c_idx = 1 + tu->coded_flag[1];
175 52232 const ptrdiff_t stride = fc->frame->linesize[c_idx];
176 52232 const int hs = fc->ps.sps->hshift[c_idx];
177 52232 const int vs = fc->ps.sps->vshift[c_idx];
178 52232 uint8_t *dst = &fc->frame->data[c_idx][(tb->y0 >> vs) * stride +
179 52232 ((tb->x0 >> hs) << fc->ps.sps->pixel_shift)];
180
2/2
✓ Branch 0 taken 25281 times.
✓ Branch 1 taken 26951 times.
52232 if (chroma_scale) {
181 25281 fc->vvcdsp.itx.pred_residual_joint(tb->coeffs, tb->tb_width, tb->tb_height, c_sign, shift);
182 25281 fc->vvcdsp.intra.lmcs_scale_chroma(lc, tb->coeffs, tb->coeffs, tb->tb_width, tb->tb_height, cu->x0, cu->y0);
183 25281 fc->vvcdsp.itx.add_residual(dst, tb->coeffs, tb->tb_width, tb->tb_height, stride);
184 } else {
185 26951 fc->vvcdsp.itx.add_residual_joint(dst, tb->coeffs, tb->tb_width, tb->tb_height, stride, c_sign, shift);
186 }
187 52232 }
188
189 1917490 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 1917490 const VVCSPS *sps = lc->fc->ps.sps;
192 1917490 const int hs = sps->hshift[ch_type];
193 1917490 const int vs = sps->vshift[ch_type];
194 ReconstructedArea *a;
195
196
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1917490 times.
1917490 if (lc->num_ras[ch_type] >= FF_ARRAY_ELEMS(lc->ras[ch_type]))
197 return AVERROR_INVALIDDATA;
198
199 1917490 a = &lc->ras[ch_type][lc->num_ras[ch_type]];
200 1917490 a->x = x0 >> hs;
201 1917490 a->y = y0 >> vs;
202 1917490 a->w = w >> hs;
203 1917490 a->h = h >> vs;
204 1917490 lc->num_ras[ch_type]++;
205
206 1917490 return 0;
207 }
208
209 962876 static void add_tu_area(const TransformUnit *tu, int *x0, int *y0, int *w, int *h)
210 {
211 962876 *x0 = tu->x0;
212 962876 *y0 = tu->y0;
213 962876 *w = tu->width;
214 962876 *h = tu->height;
215 962876 }
216
217 #define MIN_ISP_PRED_WIDTH 4
218 739292 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 739292 int has_luma = 1;
221 739292 add_tu_area(tu, x0, y0, w, h);
222
4/4
✓ Branch 0 taken 74104 times.
✓ Branch 1 taken 665188 times.
✓ Branch 2 taken 26242 times.
✓ Branch 3 taken 47862 times.
739292 if (cu->isp_split_type == ISP_VER_SPLIT && tu->width < MIN_ISP_PRED_WIDTH) {
223 26242 *w = MIN_ISP_PRED_WIDTH;
224 26242 has_luma = !(idx % (MIN_ISP_PRED_WIDTH / tu->width));
225 }
226 739292 return has_luma;
227 }
228
229 244294 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 223584 times.
✓ Branch 1 taken 20710 times.
244294 if (cu->isp_split_type == ISP_NO_SPLIT) {
232 223584 add_tu_area(tu, x0, y0, w, h);
233 223584 return 1;
234 }
235
2/2
✓ Branch 0 taken 5191 times.
✓ Branch 1 taken 15519 times.
20710 if (idx == cu->num_intra_subpartitions - 1) {
236 5191 *x0 = cu->x0;
237 5191 *y0 = cu->y0;
238 5191 *w = cu->cb_width;
239 5191 *h = cu->cb_height;
240 5191 return 1;
241 }
242 15519 return 0;
243 }
244
245 //8.4.5.1 General decoding process for intra blocks
246 1399701 static void predict_intra(VVCLocalContext *lc, const TransformUnit *tu, const int idx, const int target_ch_type)
247 {
248 1399701 const VVCFrameContext *fc = lc->fc;
249 1399701 const CodingUnit *cu = lc->cu;
250 1399701 const VVCTreeType tree_type = cu->tree_type;
251 int x0, y0, w, h;
252
2/2
✓ Branch 0 taken 416115 times.
✓ Branch 1 taken 983586 times.
1399701 if (cu->pred_mode != MODE_INTRA) {
253 416115 add_reconstructed_area(lc, target_ch_type, tu->x0, tu->y0, tu->width, tu->height);
254 416115 return;
255 }
256
3/4
✓ Branch 0 taken 739292 times.
✓ Branch 1 taken 244294 times.
✓ Branch 2 taken 739292 times.
✗ Branch 3 not taken.
983586 if (!target_ch_type && tree_type != DUAL_TREE_CHROMA) {
257
2/2
✓ Branch 1 taken 725137 times.
✓ Branch 2 taken 14155 times.
739292 if (get_luma_predict_unit(cu, tu, idx, &x0, &y0, &w, &h)) {
258 725137 ff_vvc_set_neighbour_available(lc, x0, y0, w, h);
259 725137 fc->vvcdsp.intra.intra_pred(lc, x0, y0, w, h, 0);
260 725137 add_reconstructed_area(lc, 0, x0, y0, w, h);
261 }
262 }
263
3/4
✓ Branch 0 taken 244294 times.
✓ Branch 1 taken 739292 times.
✓ Branch 2 taken 244294 times.
✗ Branch 3 not taken.
983586 if (target_ch_type && tree_type != DUAL_TREE_LUMA) {
264
2/2
✓ Branch 1 taken 228775 times.
✓ Branch 2 taken 15519 times.
244294 if (get_chroma_predict_unit(cu, tu, idx, &x0, &y0, &w, &h)){
265 228775 ff_vvc_set_neighbour_available(lc, x0, y0, w, h);
266
2/2
✓ Branch 1 taken 92042 times.
✓ Branch 2 taken 136733 times.
228775 if (is_cclm(cu->intra_pred_mode_c)) {
267 92042 fc->vvcdsp.intra.intra_cclm_pred(lc, x0, y0, w, h);
268 } else {
269 136733 fc->vvcdsp.intra.intra_pred(lc, x0, y0, w, h, 1);
270 136733 fc->vvcdsp.intra.intra_pred(lc, x0, y0, w, h, 2);
271 }
272 228775 add_reconstructed_area(lc, 1, x0, y0, w, h);
273 }
274 }
275 }
276
277 862983 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 862983 const int add = 1 << (shift - 1);
281
2/2
✓ Branch 0 taken 8930488 times.
✓ Branch 1 taken 862983 times.
9793471 for (int y = 0; y < h; y++) {
282 8930488 int *p = coeff + y * w;
283
2/2
✓ Branch 0 taken 48287404 times.
✓ Branch 1 taken 8930488 times.
57217892 for (int x = 0; x < nzw; x++) {
284 48287404 *p = av_clip_intp2((*p + add) >> shift, log2_transform_range);
285 48287404 p++;
286 }
287 8930488 memset(p, 0, sizeof(*p) * (w - nzw));
288 }
289 862983 }
290
291 875798 static void scale(int *out, const int *in, const int w, const int h, const int shift)
292 {
293 875798 const int add = 1 << (shift - 1);
294
2/2
✓ Branch 0 taken 8985026 times.
✓ Branch 1 taken 875798 times.
9860824 for (int y = 0; y < h; y++) {
295
2/2
✓ Branch 0 taken 150662668 times.
✓ Branch 1 taken 8985026 times.
159647694 for (int x = 0; x < w; x++) {
296 150662668 int *o = out + y * w + x;
297 150662668 const int *i = in + y * w + x;
298 150662668 *o = (*i + add) >> shift;
299 }
300 }
301 875798 }
302
303 // part of 8.7.3 Scaling process for transform coefficients
304 951428 static void derive_qp(const VVCLocalContext *lc, const TransformUnit *tu, TransformBlock *tb)
305 {
306 951428 const VVCSPS *sps = lc->fc->ps.sps;
307 951428 const H266RawSliceHeader *rsh = lc->sc->sh.r;
308 951428 const CodingUnit *cu = lc->cu;
309 int qp, qp_act_offset;
310
311
2/2
✓ Branch 0 taken 697037 times.
✓ Branch 1 taken 254391 times.
951428 if (tb->c_idx == 0) {
312 //fix me
313 697037 qp = cu->qp[LUMA] + sps->qp_bd_offset;
314
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 697037 times.
697037 qp_act_offset = cu->act_enabled_flag ? -5 : 0;
315 } else {
316
6/6
✓ Branch 0 taken 52232 times.
✓ Branch 1 taken 202159 times.
✓ Branch 2 taken 44532 times.
✓ Branch 3 taken 7700 times.
✓ Branch 4 taken 29763 times.
✓ Branch 5 taken 14769 times.
254391 const int is_jcbcr = tu->joint_cbcr_residual_flag && tu->coded_flag[CB] && tu->coded_flag[CR];
317
2/2
✓ Branch 0 taken 224628 times.
✓ Branch 1 taken 29763 times.
254391 const int idx = is_jcbcr ? JCBCR : tb->c_idx;
318 254391 qp = cu->qp[idx];
319 254391 qp_act_offset = cu->act_enabled_flag ? 1 : 0;
320 }
321
2/2
✓ Branch 0 taken 28605 times.
✓ Branch 1 taken 922823 times.
951428 if (tb->ts) {
322 28605 const int qp_prime_ts_min = 4 + 6 * sps->r->sps_min_qp_prime_ts;
323
324 28605 tb->qp = av_clip(qp + qp_act_offset, qp_prime_ts_min, 63 + sps->qp_bd_offset);
325 28605 tb->rect_non_ts_flag = 0;
326 28605 tb->bd_shift = 10;
327 } else {
328 922823 const int log_sum = tb->log2_tb_width + tb->log2_tb_height;
329 922823 const int rect_non_ts_flag = log_sum & 1;
330
331 922823 tb->qp = av_clip(qp + qp_act_offset, 0, 63 + sps->qp_bd_offset);
332 922823 tb->rect_non_ts_flag = rect_non_ts_flag;
333 922823 tb->bd_shift = sps->bit_depth + rect_non_ts_flag + (log_sum / 2)
334 922823 + 10 - sps->log2_transform_range + rsh->sh_dep_quant_used_flag;
335 }
336 951428 tb->bd_offset = (1 << tb->bd_shift) >> 1;
337 951428 }
338
339 //8.7.3 Scaling process for transform coefficients
340 951428 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 884114 times.
✓ Branch 1 taken 67314 times.
✓ Branch 2 taken 855509 times.
✓ Branch 3 taken 28605 times.
951428 const int addin = sh_dep_quant_used_flag && !tb->ts;
363 951428 const int qp = tb->qp + addin;
364
365 951428 return level_scale[tb->rect_non_ts_flag][rem6[qp]] << div6[qp];
366 }
367
368 //8.7.3 Scaling process for transform coefficients
369 951428 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 951428 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 951428 const VVCFrameParamSets *ps = &lc->fc->ps;
385 951428 const VVCSPS *sps = ps->sps;
386 951428 const H266RawSliceHeader *rsh = lc->sc->sh.r;
387 951428 const CodingUnit *cu = lc->cu;
388 951428 const VVCScalingList *sl = ps->sl;
389 951428 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 948577 times.
✓ Branch 1 taken 2851 times.
✓ Branch 2 taken 166576 times.
✓ Branch 3 taken 782001 times.
951428 const int log2_matrix_size = (id < 2) ? 1 : (id < 8) ? 2 : 3;
391 951428 uint8_t *p = scale_m;
392
393
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 951428 times.
951428 av_assert0(!sps->r->sps_scaling_matrix_for_alternative_colour_space_disabled_flag);
394
395
4/4
✓ Branch 0 taken 99612 times.
✓ Branch 1 taken 851816 times.
✓ Branch 2 taken 97122 times.
✓ Branch 3 taken 2490 times.
951428 if (!rsh->sh_explicit_scaling_list_used_flag || tb->ts ||
396
3/4
✓ Branch 0 taken 97122 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 31396 times.
✓ Branch 3 taken 65726 times.
97122 sps->r->sps_scaling_matrix_for_lfnst_disabled_flag && cu->apply_lfnst_flag[tb->c_idx])
397 885702 return ff_vvc_default_scale_m;
398
399
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 65726 times.
65726 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 326806 times.
✓ Branch 1 taken 65726 times.
392532 for (int y = tb->min_scan_y; y <= tb->max_scan_y; y++) {
405 326806 const int off = y << log2_matrix_size >> tb->log2_tb_height << log2_matrix_size;
406 326806 const uint8_t *m = &sl->scaling_matrix_rec[id][off];
407
408
2/2
✓ Branch 0 taken 1859082 times.
✓ Branch 1 taken 326806 times.
2185888 for (int x = tb->min_scan_x; x <= tb->max_scan_x; x++)
409 1859082 *p++ = m[x << log2_matrix_size >> tb->log2_tb_width];
410 }
411
4/6
✓ Branch 0 taken 27312 times.
✓ Branch 1 taken 38414 times.
✓ Branch 2 taken 27312 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27312 times.
✗ Branch 5 not taken.
65726 if (id >= SL_START_16x16 && !tb->min_scan_x && !tb->min_scan_y)
412 27312 *scale_m = sl->scaling_matrix_dc_rec[id - SL_START_16x16];
413
414 65726 return scale_m;
415 }
416
417 //8.7.3 Scaling process for transform coefficients
418 11467793 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 11467793 coeff = ((int64_t) coeff * scale * scale_m + tb->bd_offset) >> tb->bd_shift;
422 11467793 coeff = av_clip_intp2(coeff, log2_transform_range);
423 11467793 return coeff;
424 }
425
426 951428 static void dequant(const VVCLocalContext *lc, const TransformUnit *tu, TransformBlock *tb)
427 {
428 uint8_t tmp[MAX_TB_SIZE * MAX_TB_SIZE];
429 951428 const H266RawSliceHeader *rsh = lc->sc->sh.r;
430 951428 const VVCSPS *sps = lc->fc->ps.sps;
431 951428 const uint8_t *scale_m = derive_scale_m(lc, tb, tmp);
432 int scale;
433
434 951428 derive_qp(lc, tu, tb);
435 951428 scale = derive_scale(tb, rsh->sh_dep_quant_used_flag);
436
437
2/2
✓ Branch 0 taken 3736117 times.
✓ Branch 1 taken 951428 times.
4687545 for (int y = tb->min_scan_y; y <= tb->max_scan_y; y++) {
438
2/2
✓ Branch 0 taken 22641447 times.
✓ Branch 1 taken 3736117 times.
26377564 for (int x = tb->min_scan_x; x <= tb->max_scan_x; x++) {
439 22641447 int *coeff = tb->coeffs + y * tb->tb_width + x;
440
441
2/2
✓ Branch 0 taken 11467793 times.
✓ Branch 1 taken 11173654 times.
22641447 if (*coeff)
442 11467793 *coeff = scale_coeff(tb, *coeff, scale, *scale_m, sps->log2_transform_range);
443 22641447 scale_m++;
444 }
445 }
446 951428 }
447
448 //transmatrix[0][0]
449 #define DCT_A 64
450 906982 static void itx_2d(const VVCFrameContext *fc, TransformBlock *tb, const enum VVCTxType trh, const enum VVCTxType trv)
451 {
452 906982 const VVCSPS *sps = fc->ps.sps;
453 906982 const int w = tb->tb_width;
454 906982 const int h = tb->tb_height;
455 906982 const size_t nzw = tb->max_scan_x + 1;
456 906982 const size_t nzh = tb->max_scan_y + 1;
457 906982 const int shift[] = { 7, 5 + sps->log2_transform_range - sps->bit_depth };
458
459
9/10
✓ Branch 0 taken 338363 times.
✓ Branch 1 taken 568619 times.
✓ Branch 2 taken 73081 times.
✓ Branch 3 taken 265282 times.
✓ Branch 4 taken 50457 times.
✓ Branch 5 taken 22624 times.
✓ Branch 6 taken 43999 times.
✓ Branch 7 taken 6458 times.
✓ Branch 8 taken 43999 times.
✗ Branch 9 not taken.
906982 if (w == h && nzw == 1 && nzh == 1 && trh == VVC_DCT2 && trv == VVC_DCT2) {
460 43999 const int add[] = { 1 << (shift[0] - 1), 1 << (shift[1] - 1) };
461 43999 const int t = (tb->coeffs[0] * DCT_A + add[0]) >> shift[0];
462 43999 const int dc = (t * DCT_A + add[1]) >> shift[1];
463
464
2/2
✓ Branch 0 taken 15432592 times.
✓ Branch 1 taken 43999 times.
15476591 for (int i = 0; i < w * h; i++)
465 15432592 tb->coeffs[i] = dc;
466
467 43999 return;
468 }
469
470
2/2
✓ Branch 0 taken 4131708 times.
✓ Branch 1 taken 862983 times.
4994691 for (int x = 0; x < nzw; x++)
471 4131708 fc->vvcdsp.itx.itx[trv][tb->log2_tb_height - 1](tb->coeffs + x, w, nzh);
472 862983 scale_clip(tb->coeffs, nzw, w, h, shift[0], sps->log2_transform_range);
473
474
2/2
✓ Branch 0 taken 8930488 times.
✓ Branch 1 taken 862983 times.
9793471 for (int y = 0; y < h; y++)
475 8930488 fc->vvcdsp.itx.itx[trh][tb->log2_tb_width - 1](tb->coeffs + y * w, 1, nzw);
476 862983 scale(tb->coeffs, tb->coeffs, w, h, shift[1]);
477 }
478
479 15841 static void itx_1d(const VVCFrameContext *fc, TransformBlock *tb, const enum VVCTxType trh, const enum VVCTxType trv)
480 {
481 15841 const VVCSPS *sps = fc->ps.sps;
482 15841 const int w = tb->tb_width;
483 15841 const int h = tb->tb_height;
484 15841 const size_t nzw = tb->max_scan_x + 1;
485 15841 const size_t nzh = tb->max_scan_y + 1;
486
487
12/12
✓ Branch 0 taken 13087 times.
✓ Branch 1 taken 2754 times.
✓ Branch 2 taken 4804 times.
✓ Branch 3 taken 8283 times.
✓ Branch 4 taken 1935 times.
✓ Branch 5 taken 2869 times.
✓ Branch 6 taken 2754 times.
✓ Branch 7 taken 10218 times.
✓ Branch 8 taken 738 times.
✓ Branch 9 taken 2016 times.
✓ Branch 10 taken 157 times.
✓ Branch 11 taken 581 times.
15841 if ((w > 1 && nzw == 1 && trh == VVC_DCT2) || (h > 1 && nzh == 1 && trv == VVC_DCT2)) {
488 3026 const int shift = 6 + sps->log2_transform_range - sps->bit_depth;
489 3026 const int add = 1 << (shift - 1);
490 3026 const int dc = (tb->coeffs[0] * DCT_A + add) >> shift;
491
492
2/2
✓ Branch 0 taken 97184 times.
✓ Branch 1 taken 3026 times.
100210 for (int i = 0; i < w * h; i++)
493 97184 tb->coeffs[i] = dc;
494
495 3026 return;
496 }
497
498
2/2
✓ Branch 0 taken 10218 times.
✓ Branch 1 taken 2597 times.
12815 if (w > 1)
499 10218 fc->vvcdsp.itx.itx[trh][tb->log2_tb_width - 1](tb->coeffs, 1, nzw);
500 else
501 2597 fc->vvcdsp.itx.itx[trv][tb->log2_tb_height - 1](tb->coeffs, 1, nzh);
502 12815 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 1399701 static void itransform(VVCLocalContext *lc, TransformUnit *tu, const int tu_idx, const int target_ch_type)
519 {
520 1399701 const VVCFrameContext *fc = lc->fc;
521 1399701 const VVCSPS *sps = fc->ps.sps;
522 1399701 const VVCSH *sh = &lc->sc->sh;
523 1399701 const CodingUnit *cu = lc->cu;
524 1399701 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 2580566 times.
✓ Branch 1 taken 1399701 times.
3980267 for (int i = 0; i < tu->nb_tbs; i++) {
528 2580566 TransformBlock *tb = &tu->tbs[i];
529 2580566 const int c_idx = tb->c_idx;
530 2580566 const int ch_type = c_idx > 0;
531
532
4/4
✓ Branch 0 taken 1815611 times.
✓ Branch 1 taken 764955 times.
✓ Branch 2 taken 951428 times.
✓ Branch 3 taken 864183 times.
2580566 if (ch_type == target_ch_type && tb->has_coeffs) {
533 951428 const int w = tb->tb_width;
534 951428 const int h = tb->tb_height;
535
7/8
✓ Branch 0 taken 254391 times.
✓ Branch 1 taken 697037 times.
✓ Branch 2 taken 119814 times.
✓ Branch 3 taken 134577 times.
✓ Branch 4 taken 119814 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 117741 times.
✓ Branch 7 taken 2073 times.
951428 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 951428 const ptrdiff_t stride = fc->frame->linesize[c_idx];
537 951428 const int hs = sps->hshift[c_idx];
538 951428 const int vs = sps->vshift[c_idx];
539 951428 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 951418 times.
951428 if (cu->bdpcm_flag[tb->c_idx])
542 10 transform_bdpcm(tb, lc, cu);
543 951428 dequant(lc, tu, tb);
544
2/2
✓ Branch 0 taken 922823 times.
✓ Branch 1 taken 28605 times.
951428 if (!tb->ts) {
545 enum VVCTxType trh, trv;
546
547
2/2
✓ Branch 0 taken 171035 times.
✓ Branch 1 taken 751788 times.
922823 if (cu->apply_lfnst_flag[c_idx])
548 171035 ilfnst_transform(lc, tb);
549 922823 derive_transform_type(fc, lc, tb, &trh, &trv);
550
4/4
✓ Branch 0 taken 920069 times.
✓ Branch 1 taken 2754 times.
✓ Branch 2 taken 906982 times.
✓ Branch 3 taken 13087 times.
922823 if (w > 1 && h > 1)
551 906982 itx_2d(fc, tb, trh, trv);
552 else
553 15841 itx_1d(fc, tb, trh, trv);
554 }
555
556
2/2
✓ Branch 0 taken 117741 times.
✓ Branch 1 taken 833687 times.
951428 if (chroma_scale)
557 117741 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 117741 times.
✓ Branch 1 taken 833687 times.
951428 fc->vvcdsp.itx.add_residual(dst, chroma_scale ? temp : tb->coeffs, w, h, stride);
561
562
4/4
✓ Branch 0 taken 64897 times.
✓ Branch 1 taken 886531 times.
✓ Branch 2 taken 52232 times.
✓ Branch 3 taken 12665 times.
951428 if (tu->joint_cbcr_residual_flag && tb->c_idx)
563 52232 add_residual_for_joint_coding_chroma(lc, tu, tb, chroma_scale);
564 }
565 }
566 1399701 }
567
568 937235 static int reconstruct(VVCLocalContext *lc)
569 {
570 937235 VVCFrameContext *fc = lc->fc;
571 937235 CodingUnit *cu = lc->cu;
572 937235 const int start = cu->tree_type == DUAL_TREE_CHROMA;
573
4/4
✓ Branch 0 taken 918107 times.
✓ Branch 1 taken 19128 times.
✓ Branch 2 taken 377952 times.
✓ Branch 3 taken 540155 times.
937235 const int end = fc->ps.sps->r->sps_chroma_format_idc && (cu->tree_type != DUAL_TREE_LUMA);
574
575
2/2
✓ Branch 0 taken 1134426 times.
✓ Branch 1 taken 937235 times.
2071661 for (int ch_type = start; ch_type <= end; ch_type++) {
576 1134426 TransformUnit *tu = cu->tus.head;
577
2/2
✓ Branch 0 taken 1399701 times.
✓ Branch 1 taken 1134426 times.
2534127 for (int i = 0; tu; i++) {
578 1399701 predict_intra(lc, tu, i, ch_type);
579 1399701 itransform(lc, tu, i, ch_type);
580 1399701 tu = tu->next;
581 }
582 }
583 937235 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 31272 static void intra_block_copy(const VVCLocalContext *lc, const int c_idx)
597 {
598 31272 const CodingUnit *cu = lc->cu;
599 31272 const PredictionUnit *pu = &cu->pu;
600 31272 const VVCFrameContext *fc = lc->fc;
601 31272 const VVCSPS *sps = fc->ps.sps;
602 31272 const Mv *bv = &pu->mi.mv[L0][0];
603 31272 const int hs = sps->hshift[c_idx];
604 31272 const int vs = sps->vshift[c_idx];
605 31272 const int ps = sps->pixel_shift;
606 31272 const int ref_x = IBC_X((cu->x0 >> hs) + (bv->x >> (4 + hs)));
607 31272 const int ref_y = IBC_Y((cu->y0 >> vs) + (bv->y >> (4 + vs)));
608 31272 const int w = cu->cb_width >> hs;
609 31272 const int h = cu->cb_height >> vs;
610 31272 const int ibc_buf_width = fc->tab.sz.ibc_buffer_width >> hs; ///< IbcBufWidthY and IbcBufWidthC
611 31272 const int rw = FFMIN(w, ibc_buf_width - ref_x);
612 31272 const int ibc_stride = ibc_buf_width << ps;
613 31272 const int dst_stride = fc->frame->linesize[c_idx];
614 31272 const uint8_t *ibc_buf = IBC_POS(c_idx, ref_x, ref_y);
615 31272 uint8_t *dst = POS(c_idx, cu->x0, cu->y0);
616
617 31272 av_image_copy_plane(dst, dst_stride, ibc_buf, ibc_stride, rw << ps, h);
618
619
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 31241 times.
31272 if (w > rw) {
620 //wrap around, left part
621 31 ibc_buf = IBC_POS(c_idx, 0, ref_y);
622 31 dst += rw << ps;
623 31 av_image_copy_plane(dst, dst_stride, ibc_buf, ibc_stride, (w - rw) << ps, h);
624 }
625 31272 }
626
627 31182 static void vvc_predict_ibc(const VVCLocalContext *lc)
628 {
629 31182 const H266RawSPS *rsps = lc->fc->ps.sps->r;
630
631 31182 intra_block_copy(lc, LUMA);
632
3/4
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 31137 times.
✓ Branch 2 taken 45 times.
✗ Branch 3 not taken.
31182 if (lc->cu->tree_type == SINGLE_TREE && rsps->sps_chroma_format_idc) {
633 45 intra_block_copy(lc, CB);
634 45 intra_block_copy(lc, CR);
635 }
636 31182 }
637
638 127411 static void ibc_fill_vir_buf(const VVCLocalContext *lc, const CodingUnit *cu)
639 {
640 127411 const VVCFrameContext *fc = lc->fc;
641 127411 const VVCSPS *sps = fc->ps.sps;
642
3/4
✓ Branch 0 taken 127411 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 44943 times.
✓ Branch 3 taken 82468 times.
127411 const int has_chroma = sps->r->sps_chroma_format_idc && cu->tree_type != DUAL_TREE_LUMA;
643 127411 const int start = cu->tree_type == DUAL_TREE_CHROMA;
644
2/2
✓ Branch 0 taken 44943 times.
✓ Branch 1 taken 82468 times.
127411 const int end = has_chroma ? CR : LUMA;
645
646
2/2
✓ Branch 0 taken 195820 times.
✓ Branch 1 taken 127411 times.
323231 for (int c_idx = start; c_idx <= end; c_idx++) {
647 195820 const int hs = sps->hshift[c_idx];
648 195820 const int vs = sps->vshift[c_idx];
649 195820 const int ps = sps->pixel_shift;
650 195820 const int x = IBC_X(cu->x0 >> hs);
651 195820 const int y = IBC_Y(cu->y0 >> vs);
652 195820 const int src_stride = fc->frame->linesize[c_idx];
653 195820 const int ibc_stride = fc->tab.sz.ibc_buffer_width >> hs << ps;
654 195820 const uint8_t *src = POS(c_idx, cu->x0, cu->y0);
655 195820 uint8_t *ibc_buf = IBC_POS(c_idx, x, y);
656
657 195820 av_image_copy_plane(ibc_buf, ibc_stride, src, src_stride, cu->cb_width >> hs << ps , cu->cb_height >> vs);
658 }
659 127411 }
660
661 46705 int ff_vvc_reconstruct(VVCLocalContext *lc, const int rs, const int rx, const int ry)
662 {
663 46705 const VVCFrameContext *fc = lc->fc;
664 46705 const VVCSPS *sps = fc->ps.sps;
665 46705 const int x_ctb = rx << sps->ctb_log2_size_y;
666 46705 const int y_ctb = ry << sps->ctb_log2_size_y;
667 46705 CodingUnit *cu = fc->tab.cus[rs];
668 46705 int ret = 0;
669
670 46705 lc->num_ras[0] = lc->num_ras[1] = 0;
671 46705 lc->lmcs.x_vpdu = -1;
672 46705 lc->lmcs.y_vpdu = -1;
673 46705 ff_vvc_decode_neighbour(lc, x_ctb, y_ctb, rx, ry, rs);
674
2/2
✓ Branch 0 taken 1232069 times.
✓ Branch 1 taken 46705 times.
1278774 while (cu) {
675 1232069 lc->cu = cu;
676
677
2/2
✓ Branch 0 taken 15686 times.
✓ Branch 1 taken 1216383 times.
1232069 if (cu->ciip_flag)
678 15686 ff_vvc_predict_ciip(lc);
679
2/2
✓ Branch 0 taken 31182 times.
✓ Branch 1 taken 1185201 times.
1216383 else if (cu->pred_mode == MODE_IBC)
680 31182 vvc_predict_ibc(lc);
681
2/2
✓ Branch 0 taken 937235 times.
✓ Branch 1 taken 294834 times.
1232069 if (cu->coded_flag) {
682 937235 ret = reconstruct(lc);
683 } else {
684
1/2
✓ Branch 0 taken 294834 times.
✗ Branch 1 not taken.
294834 if (cu->tree_type != DUAL_TREE_CHROMA)
685 294834 add_reconstructed_area(lc, LUMA, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
686
4/4
✓ Branch 0 taken 278323 times.
✓ Branch 1 taken 16511 times.
✓ Branch 2 taken 252629 times.
✓ Branch 3 taken 25694 times.
294834 if (sps->r->sps_chroma_format_idc && cu->tree_type != DUAL_TREE_LUMA)
687 252629 add_reconstructed_area(lc, CHROMA, cu->x0, cu->y0, cu->cb_width, cu->cb_height);
688 }
689
2/2
✓ Branch 0 taken 127411 times.
✓ Branch 1 taken 1104658 times.
1232069 if (sps->r->sps_ibc_enabled_flag)
690 127411 ibc_fill_vir_buf(lc, cu);
691 1232069 cu = cu->next;
692 }
693 46705 ff_vvc_ctu_free_cus(fc->tab.cus + rs);
694 46705 return ret;
695 }
696
697