FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vvc/filter_template.c
Date: 2026-04-24 19:58:39
Exec Total Coverage
Lines: 523 523 100.0%
Functions: 51 72 70.8%
Branches: 322 336 95.8%

Line Branch Exec Source
1 /*
2 * VVC filters DSP
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 "libavcodec/h26x/h2656_sao_template.c"
24
25 420540 static void FUNC(lmcs_filter_luma)(uint8_t *_dst, ptrdiff_t dst_stride, const int width, const int height, const void *_lut)
26 {
27 420540 const pixel *lut = _lut;
28 420540 pixel *dst = (pixel*)_dst;
29 420540 dst_stride /= sizeof(pixel);
30
31
2/2
✓ Branch 0 taken 7388292 times.
✓ Branch 1 taken 210270 times.
15197124 for (int y = 0; y < height; y++) {
32
2/2
✓ Branch 0 taken 576276832 times.
✓ Branch 1 taken 7388292 times.
1167330248 for (int x = 0; x < width; x++)
33 1152553664 dst[x] = lut[dst[x]];
34 14776584 dst += dst_stride;
35 }
36 420540 }
37
38 10300620288 static av_always_inline int16_t FUNC(alf_clip)(pixel curr, pixel v0, pixel v1, int16_t clip)
39 {
40 10300620288 return av_clip(v0 - curr, -clip, clip) + av_clip(v1 - curr, -clip, clip);
41 }
42
43 46698 static void FUNC(alf_filter_luma)(uint8_t *_dst, ptrdiff_t dst_stride, const uint8_t *_src, ptrdiff_t src_stride,
44 const int width, const int height, const int16_t *filter, const int16_t *clip, const int vb_pos)
45 {
46 46698 const pixel *src = (pixel *)_src;
47 46698 const int shift = 7;
48 46698 const int offset = 1 << ( shift - 1 );
49 46698 const int vb_above = vb_pos - 4;
50 46698 const int vb_below = vb_pos + 3;
51
52 46698 dst_stride /= sizeof(pixel);
53 46698 src_stride /= sizeof(pixel);
54
55
2/2
✓ Branch 0 taken 667578 times.
✓ Branch 1 taken 23349 times.
1381854 for (int y = 0; y < height; y += ALF_BLOCK_SIZE) {
56
2/2
✓ Branch 0 taken 20149496 times.
✓ Branch 1 taken 667578 times.
41634148 for (int x = 0; x < width; x += ALF_BLOCK_SIZE) {
57 40298992 const pixel *s0 = src + y * src_stride + x;
58 40298992 const pixel *s1 = s0 + src_stride;
59 40298992 const pixel *s2 = s0 - src_stride;
60 40298992 const pixel *s3 = s1 + src_stride;
61 40298992 const pixel *s4 = s2 - src_stride;
62 40298992 const pixel *s5 = s3 + src_stride;
63 40298992 const pixel *s6 = s4 - src_stride;
64
65
2/2
✓ Branch 0 taken 80597984 times.
✓ Branch 1 taken 20149496 times.
201494960 for (int i = 0; i < ALF_BLOCK_SIZE; i++) {
66 161195968 pixel *dst = (pixel *)_dst + (y + i) * dst_stride + x;
67
68 161195968 const pixel *p0 = s0 + i * src_stride;
69 161195968 const pixel *p1 = s1 + i * src_stride;
70 161195968 const pixel *p2 = s2 + i * src_stride;
71 161195968 const pixel *p3 = s3 + i * src_stride;
72 161195968 const pixel *p4 = s4 + i * src_stride;
73 161195968 const pixel *p5 = s5 + i * src_stride;
74 161195968 const pixel *p6 = s6 + i * src_stride;
75
76
4/4
✓ Branch 0 taken 78390376 times.
✓ Branch 1 taken 2207608 times.
✓ Branch 2 taken 551902 times.
✓ Branch 3 taken 77838474 times.
161195968 const int is_near_vb_above = (y + i < vb_pos) && (y + i >= vb_pos - 1);
77
4/4
✓ Branch 0 taken 2207608 times.
✓ Branch 1 taken 78390376 times.
✓ Branch 2 taken 551902 times.
✓ Branch 3 taken 1655706 times.
161195968 const int is_near_vb_below = (y + i >= vb_pos) && (y + i <= vb_pos);
78
4/4
✓ Branch 0 taken 80046082 times.
✓ Branch 1 taken 551902 times.
✓ Branch 2 taken 551902 times.
✓ Branch 3 taken 79494180 times.
161195968 const int is_near_vb = is_near_vb_above || is_near_vb_below;
79
80
4/4
✓ Branch 0 taken 78390376 times.
✓ Branch 1 taken 2207608 times.
✓ Branch 2 taken 1655706 times.
✓ Branch 3 taken 76734670 times.
161195968 if ((y + i < vb_pos) && ((y + i) > vb_above)) {
81
2/2
✓ Branch 0 taken 551902 times.
✓ Branch 1 taken 1103804 times.
3311412 p1 = (y + i == vb_pos - 1) ? p0 : p1;
82
2/2
✓ Branch 0 taken 1103804 times.
✓ Branch 1 taken 551902 times.
3311412 p3 = (y + i >= vb_pos - 2) ? p1 : p3;
83
1/2
✓ Branch 0 taken 1655706 times.
✗ Branch 1 not taken.
3311412 p5 = (y + i >= vb_pos - 3) ? p3 : p5;
84
85
2/2
✓ Branch 0 taken 551902 times.
✓ Branch 1 taken 1103804 times.
3311412 p2 = (y + i == vb_pos - 1) ? p0 : p2;
86
2/2
✓ Branch 0 taken 1103804 times.
✓ Branch 1 taken 551902 times.
3311412 p4 = (y + i >= vb_pos - 2) ? p2 : p4;
87
1/2
✓ Branch 0 taken 1655706 times.
✗ Branch 1 not taken.
3311412 p6 = (y + i >= vb_pos - 3) ? p4 : p6;
88
4/4
✓ Branch 0 taken 2207608 times.
✓ Branch 1 taken 76734670 times.
✓ Branch 2 taken 1655706 times.
✓ Branch 3 taken 551902 times.
157884556 } else if ((y + i >= vb_pos) && ((y + i) < vb_below)) {
89
2/2
✓ Branch 0 taken 551902 times.
✓ Branch 1 taken 1103804 times.
3311412 p2 = (y + i == vb_pos ) ? p0 : p2;
90
2/2
✓ Branch 0 taken 1103804 times.
✓ Branch 1 taken 551902 times.
3311412 p4 = (y + i <= vb_pos + 1) ? p2 : p4;
91
1/2
✓ Branch 0 taken 1655706 times.
✗ Branch 1 not taken.
3311412 p6 = (y + i <= vb_pos + 2) ? p4 : p6;
92
93
2/2
✓ Branch 0 taken 551902 times.
✓ Branch 1 taken 1103804 times.
3311412 p1 = (y + i == vb_pos ) ? p0 : p1;
94
2/2
✓ Branch 0 taken 1103804 times.
✓ Branch 1 taken 551902 times.
3311412 p3 = (y + i <= vb_pos + 1) ? p1 : p3;
95
1/2
✓ Branch 0 taken 1655706 times.
✗ Branch 1 not taken.
3311412 p5 = (y + i <= vb_pos + 2) ? p3 : p5;
96 }
97
98
2/2
✓ Branch 0 taken 322391936 times.
✓ Branch 1 taken 80597984 times.
805979840 for (int j = 0; j < ALF_BLOCK_SIZE; j++) {
99 644783872 int sum = 0;
100 644783872 const pixel curr = *p0;
101
102 644783872 sum += filter[0] * FUNC(alf_clip)(curr, p5[+0], p6[+0], clip[0]);
103 644783872 sum += filter[1] * FUNC(alf_clip)(curr, p3[+1], p4[-1], clip[1]);
104 644783872 sum += filter[2] * FUNC(alf_clip)(curr, p3[+0], p4[+0], clip[2]);
105 644783872 sum += filter[3] * FUNC(alf_clip)(curr, p3[-1], p4[+1], clip[3]);
106 644783872 sum += filter[4] * FUNC(alf_clip)(curr, p1[+2], p2[-2], clip[4]);
107 644783872 sum += filter[5] * FUNC(alf_clip)(curr, p1[+1], p2[-1], clip[5]);
108 644783872 sum += filter[6] * FUNC(alf_clip)(curr, p1[+0], p2[+0], clip[6]);
109 644783872 sum += filter[7] * FUNC(alf_clip)(curr, p1[-1], p2[+1], clip[7]);
110 644783872 sum += filter[8] * FUNC(alf_clip)(curr, p1[-2], p2[+2], clip[8]);
111 644783872 sum += filter[9] * FUNC(alf_clip)(curr, p0[+3], p0[-3], clip[9]);
112 644783872 sum += filter[10] * FUNC(alf_clip)(curr, p0[+2], p0[-2], clip[10]);
113 644783872 sum += filter[11] * FUNC(alf_clip)(curr, p0[+1], p0[-1], clip[11]);
114
115
2/2
✓ Branch 0 taken 317976720 times.
✓ Branch 1 taken 4415216 times.
644783872 if (!is_near_vb)
116 635953440 sum = (sum + offset) >> shift;
117 else
118 8830432 sum = (sum + (1 << ((shift + 3) - 1))) >> (shift + 3);
119 644783872 sum += curr;
120 644783872 dst[j] = CLIP(sum);
121
122 644783872 p0++;
123 644783872 p1++;
124 644783872 p2++;
125 644783872 p3++;
126 644783872 p4++;
127 644783872 p5++;
128 644783872 p6++;
129 }
130 }
131 40298992 filter += ALF_NUM_COEFF_LUMA;
132 40298992 clip += ALF_NUM_COEFF_LUMA;
133 }
134 }
135 46698 }
136
137 63810 static void FUNC(alf_filter_chroma)(uint8_t* _dst, ptrdiff_t dst_stride, const uint8_t* _src, ptrdiff_t src_stride,
138 const int width, const int height, const int16_t* filter, const int16_t* clip, const int vb_pos)
139 {
140 63810 const pixel *src = (pixel *)_src;
141 63810 const int shift = 7;
142 63810 const int offset = 1 << ( shift - 1 );
143 63810 const int vb_above = vb_pos - 2;
144 63810 const int vb_below = vb_pos + 1;
145
146 63810 dst_stride /= sizeof(pixel);
147 63810 src_stride /= sizeof(pixel);
148
149
2/2
✓ Branch 0 taken 610901 times.
✓ Branch 1 taken 31905 times.
1285612 for (int y = 0; y < height; y += ALF_BLOCK_SIZE) {
150
2/2
✓ Branch 0 taken 13350072 times.
✓ Branch 1 taken 610901 times.
27921946 for (int x = 0; x < width; x += ALF_BLOCK_SIZE) {
151 26700144 const pixel *s0 = src + y * src_stride + x;
152 26700144 const pixel *s1 = s0 + src_stride;
153 26700144 const pixel *s2 = s0 - src_stride;
154 26700144 const pixel *s3 = s1 + src_stride;
155 26700144 const pixel *s4 = s2 - src_stride;
156
157
2/2
✓ Branch 0 taken 53400288 times.
✓ Branch 1 taken 13350072 times.
133500720 for (int i = 0; i < ALF_BLOCK_SIZE; i++) {
158 106800576 pixel *dst = (pixel *)_dst + (y + i) * dst_stride + x;
159
160 106800576 const pixel *p0 = s0 + i * src_stride;
161 106800576 const pixel *p1 = s1 + i * src_stride;
162 106800576 const pixel *p2 = s2 + i * src_stride;
163 106800576 const pixel *p3 = s3 + i * src_stride;
164 106800576 const pixel *p4 = s4 + i * src_stride;
165
166
4/4
✓ Branch 0 taken 52406304 times.
✓ Branch 1 taken 993984 times.
✓ Branch 2 taken 496992 times.
✓ Branch 3 taken 51909312 times.
106800576 const int is_near_vb_above = (y + i < vb_pos) && (y + i >= vb_pos - 1);
167
4/4
✓ Branch 0 taken 993984 times.
✓ Branch 1 taken 52406304 times.
✓ Branch 2 taken 496992 times.
✓ Branch 3 taken 496992 times.
106800576 const int is_near_vb_below = (y + i >= vb_pos) && (y + i <= vb_pos);
168
4/4
✓ Branch 0 taken 52903296 times.
✓ Branch 1 taken 496992 times.
✓ Branch 2 taken 496992 times.
✓ Branch 3 taken 52406304 times.
106800576 const int is_near_vb = is_near_vb_above || is_near_vb_below;
169
170
4/4
✓ Branch 0 taken 52406304 times.
✓ Branch 1 taken 993984 times.
✓ Branch 2 taken 993984 times.
✓ Branch 3 taken 51412320 times.
106800576 if ((y + i < vb_pos) && ((y + i) >= vb_above)) {
171
2/2
✓ Branch 0 taken 496992 times.
✓ Branch 1 taken 496992 times.
1987968 p1 = (y + i == vb_pos - 1) ? p0 : p1;
172
1/2
✓ Branch 0 taken 993984 times.
✗ Branch 1 not taken.
1987968 p3 = (y + i >= vb_pos - 2) ? p1 : p3;
173
174
2/2
✓ Branch 0 taken 496992 times.
✓ Branch 1 taken 496992 times.
1987968 p2 = (y + i == vb_pos - 1) ? p0 : p2;
175
1/2
✓ Branch 0 taken 993984 times.
✗ Branch 1 not taken.
1987968 p4 = (y + i >= vb_pos - 2) ? p2 : p4;
176
3/4
✓ Branch 0 taken 993984 times.
✓ Branch 1 taken 51412320 times.
✓ Branch 2 taken 993984 times.
✗ Branch 3 not taken.
104812608 } else if ((y + i >= vb_pos) && ((y + i) <= vb_below)) {
177
2/2
✓ Branch 0 taken 496992 times.
✓ Branch 1 taken 496992 times.
1987968 p2 = (y + i == vb_pos ) ? p0 : p2;
178
1/2
✓ Branch 0 taken 993984 times.
✗ Branch 1 not taken.
1987968 p4 = (y + i <= vb_pos + 1) ? p2 : p4;
179
180
2/2
✓ Branch 0 taken 496992 times.
✓ Branch 1 taken 496992 times.
1987968 p1 = (y + i == vb_pos ) ? p0 : p1;
181
1/2
✓ Branch 0 taken 993984 times.
✗ Branch 1 not taken.
1987968 p3 = (y + i <= vb_pos + 1) ? p1 : p3;
182 }
183
184
2/2
✓ Branch 0 taken 213601152 times.
✓ Branch 1 taken 53400288 times.
534002880 for (int j = 0; j < ALF_BLOCK_SIZE; j++) {
185 427202304 int sum = 0;
186 427202304 const pixel curr = *p0;
187
188 427202304 sum += filter[0] * FUNC(alf_clip)(curr, p3[+0], p4[+0], clip[0]);
189 427202304 sum += filter[1] * FUNC(alf_clip)(curr, p1[+1], p2[-1], clip[1]);
190 427202304 sum += filter[2] * FUNC(alf_clip)(curr, p1[+0], p2[+0], clip[2]);
191 427202304 sum += filter[3] * FUNC(alf_clip)(curr, p1[-1], p2[+1], clip[3]);
192 427202304 sum += filter[4] * FUNC(alf_clip)(curr, p0[+2], p0[-2], clip[4]);
193 427202304 sum += filter[5] * FUNC(alf_clip)(curr, p0[+1], p0[-1], clip[5]);
194
195
2/2
✓ Branch 0 taken 209625216 times.
✓ Branch 1 taken 3975936 times.
427202304 if (!is_near_vb)
196 419250432 sum = (sum + offset) >> shift;
197 else
198 7951872 sum = (sum + (1 << ((shift + 3) - 1))) >> (shift + 3);
199 427202304 sum += curr;
200 427202304 dst[j] = CLIP(sum);
201
202 427202304 p0++;
203 427202304 p1++;
204 427202304 p2++;
205 427202304 p3++;
206 427202304 p4++;
207 }
208 }
209 }
210 }
211 63810 }
212
213 21054 static void FUNC(alf_filter_cc)(uint8_t *_dst, ptrdiff_t dst_stride, const uint8_t *_luma, const ptrdiff_t luma_stride,
214 const int width, const int height, const int hs, const int vs, const int16_t *filter, const int vb_pos)
215 {
216 21054 const ptrdiff_t stride = luma_stride / sizeof(pixel);
217
218 21054 dst_stride /= sizeof(pixel);
219
220
2/2
✓ Branch 0 taken 797668 times.
✓ Branch 1 taken 10527 times.
1616390 for (int y = 0; y < height; y++) {
221
2/2
✓ Branch 0 taken 71027584 times.
✓ Branch 1 taken 797668 times.
143650504 for (int x = 0; x < width; x++) {
222 142055168 int sum = 0;
223 142055168 pixel *dst = (pixel *)_dst + y * dst_stride + x;
224 142055168 const pixel *src = (pixel *)_luma + (y << vs) * stride + (x << hs);
225
226 142055168 const pixel *s0 = src - stride;
227 142055168 const pixel *s1 = src;
228 142055168 const pixel *s2 = src + stride;
229 142055168 const pixel *s3 = src + 2 * stride;
230
231 142055168 const int pos = y << vs;
232
6/6
✓ Branch 0 taken 41829376 times.
✓ Branch 1 taken 29198208 times.
✓ Branch 2 taken 41522688 times.
✓ Branch 3 taken 306688 times.
✓ Branch 4 taken 306688 times.
✓ Branch 5 taken 41216000 times.
142055168 if (!vs && (pos == vb_pos || pos == vb_pos + 1))
233 1226752 continue;
234
235
3/4
✓ Branch 0 taken 69689712 times.
✓ Branch 1 taken 724496 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 69689712 times.
140828416 if (pos == (vb_pos - 2) || pos == (vb_pos + 1))
236 1448992 s3 = s2;
237
4/4
✓ Branch 0 taken 69383024 times.
✓ Branch 1 taken 306688 times.
✓ Branch 2 taken 417808 times.
✓ Branch 3 taken 68965216 times.
139379424 else if (pos == (vb_pos - 1) || pos == vb_pos)
238 1448992 s3 = s2 = s0 = s1;
239
240
241 140828416 sum += filter[0] * (*s0 - *src);
242 140828416 sum += filter[1] * (*(s1 - 1) - *src);
243 140828416 sum += filter[2] * (*(s1 + 1) - *src);
244 140828416 sum += filter[3] * (*(s2 - 1) - *src);
245 140828416 sum += filter[4] * (*s2 - *src);
246 140828416 sum += filter[5] * (*(s2 + 1) - *src);
247 140828416 sum += filter[6] * (*s3 - *src);
248 140828416 sum = av_clip((sum + 64) >> 7, -(1 << (BIT_DEPTH - 1)), (1 << (BIT_DEPTH - 1)) - 1);
249 140828416 sum += *dst;
250 140828416 *dst = av_clip_pixel(sum);
251 }
252 }
253 21054 }
254
255 #define ALF_DIR_VERT 0
256 #define ALF_DIR_HORZ 1
257 #define ALF_DIR_DIGA0 2
258 #define ALF_DIR_DIGA1 3
259
260 40298992 static void FUNC(alf_get_idx)(int *class_idx, int *transpose_idx, const int *sum, const int ac)
261 {
262 static const int arg_var[] = {0, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4 };
263
264 int hv0, hv1, dir_hv, d0, d1, dir_d, hvd1, hvd0, sum_hv, dir1;
265
266 40298992 dir_hv = sum[ALF_DIR_VERT] <= sum[ALF_DIR_HORZ];
267 40298992 hv1 = FFMAX(sum[ALF_DIR_VERT], sum[ALF_DIR_HORZ]);
268 40298992 hv0 = FFMIN(sum[ALF_DIR_VERT], sum[ALF_DIR_HORZ]);
269
270 40298992 dir_d = sum[ALF_DIR_DIGA0] <= sum[ALF_DIR_DIGA1];
271 40298992 d1 = FFMAX(sum[ALF_DIR_DIGA0], sum[ALF_DIR_DIGA1]);
272 40298992 d0 = FFMIN(sum[ALF_DIR_DIGA0], sum[ALF_DIR_DIGA1]);
273
274 //promote to avoid overflow
275 40298992 dir1 = (uint64_t)d1 * hv0 <= (uint64_t)hv1 * d0;
276
2/2
✓ Branch 0 taken 15043922 times.
✓ Branch 1 taken 5105574 times.
40298992 hvd1 = dir1 ? hv1 : d1;
277
2/2
✓ Branch 0 taken 15043922 times.
✓ Branch 1 taken 5105574 times.
40298992 hvd0 = dir1 ? hv0 : d0;
278
279 40298992 sum_hv = sum[ALF_DIR_HORZ] + sum[ALF_DIR_VERT];
280 40298992 *class_idx = arg_var[av_clip_uintp2(sum_hv * ac >> (BIT_DEPTH - 1), 4)];
281
2/2
✓ Branch 0 taken 4230730 times.
✓ Branch 1 taken 15918766 times.
40298992 if (hvd1 * 2 > 9 * hvd0)
282 8461460 *class_idx += ((dir1 << 1) + 2) * 5;
283
2/2
✓ Branch 0 taken 4959473 times.
✓ Branch 1 taken 10959293 times.
31837532 else if (hvd1 > 2 * hvd0)
284 9918946 *class_idx += ((dir1 << 1) + 1) * 5;
285
286 40298992 *transpose_idx = dir_d * 2 + dir_hv;
287 40298992 }
288
289 46698 static void FUNC(alf_classify)(int *class_idx, int *transpose_idx,
290 const uint8_t *_src, const ptrdiff_t _src_stride, const int width, const int height,
291 const int vb_pos, int *gradient_tmp)
292 {
293 int *grad;
294
295 46698 const int h = height + ALF_GRADIENT_BORDER * 2;
296 46698 const int w = width + ALF_GRADIENT_BORDER * 2;
297 46698 const int size = (ALF_BLOCK_SIZE + ALF_GRADIENT_BORDER * 2) / ALF_GRADIENT_STEP;
298 46698 const int gstride = (w / ALF_GRADIENT_STEP) * ALF_NUM_DIR;
299
300 46698 const pixel *src = (const pixel *)_src;
301 46698 const ptrdiff_t src_stride = _src_stride / sizeof(pixel);
302 46698 src -= (ALF_GRADIENT_BORDER + 1) * src_stride + ALF_GRADIENT_BORDER;
303
304 46698 grad = gradient_tmp;
305
2/2
✓ Branch 0 taken 1381854 times.
✓ Branch 1 taken 23349 times.
2810406 for (int y = 0; y < h; y += ALF_GRADIENT_STEP) {
306 2763708 const pixel *s0 = src + y * src_stride;
307 2763708 const pixel *s1 = s0 + src_stride;
308 2763708 const pixel *s2 = s1 + src_stride;
309 2763708 const pixel *s3 = s2 + src_stride;
310
311
2/2
✓ Branch 0 taken 18176 times.
✓ Branch 1 taken 1363678 times.
2763708 if (y == vb_pos) //above
312 36352 s3 = s2;
313
2/2
✓ Branch 0 taken 18176 times.
✓ Branch 1 taken 1345502 times.
2727356 else if (y == vb_pos + ALF_GRADIENT_BORDER)
314 36352 s0 = s1;
315
316
2/2
✓ Branch 0 taken 86128716 times.
✓ Branch 1 taken 1381854 times.
175021140 for (int x = 0; x < w; x += ALF_GRADIENT_STEP) {
317 //two points a time
318 172257432 const pixel *a0 = s0 + x;
319 172257432 const pixel *p0 = s1 + x;
320 172257432 const pixel *b0 = s2 + x;
321 172257432 const int val0 = (*p0) << 1;
322
323 172257432 const pixel *a1 = s1 + x + 1;
324 172257432 const pixel *p1 = s2 + x + 1;
325 172257432 const pixel *b1 = s3 + x + 1;
326 172257432 const int val1 = (*p1) << 1;
327
328 172257432 grad[ALF_DIR_VERT] = FFABS(val0 - *a0 - *b0) + FFABS(val1 - *a1 - *b1);
329 172257432 grad[ALF_DIR_HORZ] = FFABS(val0 - *(p0 - 1) - *(p0 + 1)) + FFABS(val1 - *(p1 - 1) - *(p1 + 1));
330 172257432 grad[ALF_DIR_DIGA0] = FFABS(val0 - *(a0 - 1) - *(b0 + 1)) + FFABS(val1 - *(a1 - 1) - *(b1 + 1));
331 172257432 grad[ALF_DIR_DIGA1] = FFABS(val0 - *(a0 + 1) - *(b0 - 1)) + FFABS(val1 - *(a1 + 1) - *(b1 - 1));
332 172257432 grad += ALF_NUM_DIR;
333 }
334 }
335
336
2/2
✓ Branch 0 taken 667578 times.
✓ Branch 1 taken 23349 times.
1381854 for (int y = 0; y < height ; y += ALF_BLOCK_SIZE ) {
337 1335156 int start = 0;
338 1335156 int end = (ALF_BLOCK_SIZE + ALF_GRADIENT_BORDER * 2) / ALF_GRADIENT_STEP;
339 1335156 int ac = 2;
340
2/2
✓ Branch 0 taken 18176 times.
✓ Branch 1 taken 649402 times.
1335156 if (y + ALF_BLOCK_SIZE == vb_pos) {
341 36352 end -= ALF_GRADIENT_BORDER / ALF_GRADIENT_STEP;
342 36352 ac = 3;
343
2/2
✓ Branch 0 taken 18176 times.
✓ Branch 1 taken 631226 times.
1298804 } else if (y == vb_pos) {
344 36352 start += ALF_GRADIENT_BORDER / ALF_GRADIENT_STEP;
345 36352 ac = 3;
346 }
347
2/2
✓ Branch 0 taken 20149496 times.
✓ Branch 1 taken 667578 times.
41634148 for (int x = 0; x < width; x += ALF_BLOCK_SIZE) {
348 40298992 const int xg = x / ALF_GRADIENT_STEP;
349 40298992 const int yg = y / ALF_GRADIENT_STEP;
350 40298992 int sum[ALF_NUM_DIR] = { 0 };
351
352 40298992 grad = gradient_tmp + (yg + start) * gstride + xg * ALF_NUM_DIR;
353 //todo: optimize this loop
354
2/2
✓ Branch 0 taken 79494564 times.
✓ Branch 1 taken 20149496 times.
199288120 for (int i = start; i < end; i++) {
355
2/2
✓ Branch 0 taken 317978256 times.
✓ Branch 1 taken 79494564 times.
794945640 for (int j = 0; j < size; j++) {
356 635956512 sum[ALF_DIR_VERT] += grad[ALF_DIR_VERT];
357 635956512 sum[ALF_DIR_HORZ] += grad[ALF_DIR_HORZ];
358 635956512 sum[ALF_DIR_DIGA0] += grad[ALF_DIR_DIGA0];
359 635956512 sum[ALF_DIR_DIGA1] += grad[ALF_DIR_DIGA1];
360 635956512 grad += ALF_NUM_DIR;
361 }
362 158989128 grad += gstride - size * ALF_NUM_DIR;
363 }
364 40298992 FUNC(alf_get_idx)(class_idx, transpose_idx, sum, ac);
365
366 40298992 class_idx++;
367 40298992 transpose_idx++;
368 }
369 }
370
371 46698 }
372
373 42090 static void FUNC(alf_recon_coeff_and_clip)(int16_t *coeff, int16_t *clip,
374 const int *class_idx, const int *transpose_idx, const int size,
375 const int16_t *coeff_set, const uint8_t *clip_idx_set, const uint8_t *class_to_filt)
376 {
377 const static int index[][ALF_NUM_COEFF_LUMA] = {
378 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 },
379 { 9, 4, 10, 8, 1, 5, 11, 7, 3, 0, 2, 6 },
380 { 0, 3, 2, 1, 8, 7, 6, 5, 4, 9, 10, 11 },
381 { 9, 8, 10, 4, 3, 7, 11, 5, 1, 0, 2, 6 },
382 };
383
384 42090 const int16_t clip_set[] = {
385 1 << BIT_DEPTH, 1 << (BIT_DEPTH - 3), 1 << (BIT_DEPTH - 5), 1 << (BIT_DEPTH - 7)
386 };
387
388
2/2
✓ Branch 0 taken 19483640 times.
✓ Branch 1 taken 21045 times.
39009370 for (int i = 0; i < size; i++) {
389 38967280 const int16_t *src_coeff = coeff_set + class_to_filt[class_idx[i]] * ALF_NUM_COEFF_LUMA;
390 38967280 const uint8_t *clip_idx = clip_idx_set + class_idx[i] * ALF_NUM_COEFF_LUMA;
391
392
2/2
✓ Branch 0 taken 233803680 times.
✓ Branch 1 taken 19483640 times.
506574640 for (int j = 0; j < ALF_NUM_COEFF_LUMA; j++) {
393 467607360 const int idx = index[transpose_idx[i]][j];
394 467607360 *coeff++ = src_coeff[idx];
395 467607360 *clip++ = clip_set[clip_idx[idx]];
396 }
397 }
398 42090 }
399
400 #undef ALF_DIR_HORZ
401 #undef ALF_DIR_VERT
402 #undef ALF_DIR_DIGA0
403 #undef ALF_DIR_DIGA1
404
405 // line zero
406 #define P7 pix[-8 * xstride]
407 #define P6 pix[-7 * xstride]
408 #define P5 pix[-6 * xstride]
409 #define P4 pix[-5 * xstride]
410 #define P3 pix[-4 * xstride]
411 #define P2 pix[-3 * xstride]
412 #define P1 pix[-2 * xstride]
413 #define P0 pix[-1 * xstride]
414 #define Q0 pix[0 * xstride]
415 #define Q1 pix[1 * xstride]
416 #define Q2 pix[2 * xstride]
417 #define Q3 pix[3 * xstride]
418 #define Q4 pix[4 * xstride]
419 #define Q5 pix[5 * xstride]
420 #define Q6 pix[6 * xstride]
421 #define Q7 pix[7 * xstride]
422 #define P(x) pix[(-(x)-1) * xstride]
423 #define Q(x) pix[(x) * xstride]
424
425 // line three. used only for deblocking decision
426 #define TP7 pix[-8 * xstride + 3 * ystride]
427 #define TP6 pix[-7 * xstride + 3 * ystride]
428 #define TP5 pix[-6 * xstride + 3 * ystride]
429 #define TP4 pix[-5 * xstride + 3 * ystride]
430 #define TP3 pix[-4 * xstride + 3 * ystride]
431 #define TP2 pix[-3 * xstride + 3 * ystride]
432 #define TP1 pix[-2 * xstride + 3 * ystride]
433 #define TP0 pix[-1 * xstride + 3 * ystride]
434 #define TQ0 pix[0 * xstride + 3 * ystride]
435 #define TQ1 pix[1 * xstride + 3 * ystride]
436 #define TQ2 pix[2 * xstride + 3 * ystride]
437 #define TQ3 pix[3 * xstride + 3 * ystride]
438 #define TQ4 pix[4 * xstride + 3 * ystride]
439 #define TQ5 pix[5 * xstride + 3 * ystride]
440 #define TQ6 pix[6 * xstride + 3 * ystride]
441 #define TQ7 pix[7 * xstride + 3 * ystride]
442 #define TP(x) pix[(-(x)-1) * xstride + 3 * ystride]
443 #define TQ(x) pix[(x) * xstride + 3 * ystride]
444
445 #define FP3 pix[-4 * xstride + 1 * ystride]
446 #define FP2 pix[-3 * xstride + 1 * ystride]
447 #define FP1 pix[-2 * xstride + 1 * ystride]
448 #define FP0 pix[-1 * xstride + 1 * ystride]
449 #define FQ0 pix[0 * xstride + 1 * ystride]
450 #define FQ1 pix[1 * xstride + 1 * ystride]
451 #define FQ2 pix[2 * xstride + 1 * ystride]
452 #define FQ3 pix[3 * xstride + 1 * ystride]
453
454 #include "libavcodec/h26x/h2656_deblock_template.c"
455
456 1772020 static void FUNC(loop_filter_luma_large)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride, const int32_t tc,
457 const uint8_t no_p, const uint8_t no_q, const uint8_t max_len_p, const uint8_t max_len_q)
458 {
459
2/2
✓ Branch 0 taken 3544040 times.
✓ Branch 1 taken 886010 times.
8860100 for (int d = 0; d < 4; d++) {
460 7088080 const int p6 = P6;
461 7088080 const int p5 = P5;
462 7088080 const int p4 = P4;
463 7088080 const int p3 = P3;
464 7088080 const int p2 = P2;
465 7088080 const int p1 = P1;
466 7088080 const int p0 = P0;
467 7088080 const int q0 = Q0;
468 7088080 const int q1 = Q1;
469 7088080 const int q2 = Q2;
470 7088080 const int q3 = Q3;
471 7088080 const int q4 = Q4;
472 7088080 const int q5 = Q5;
473 7088080 const int q6 = Q6;
474 int m;
475
4/4
✓ Branch 0 taken 540184 times.
✓ Branch 1 taken 3003856 times.
✓ Branch 2 taken 323984 times.
✓ Branch 3 taken 216200 times.
7088080 if (max_len_p == 5 && max_len_q == 5)
476 647968 m = (p4 + p3 + 2 * (p2 + p1 + p0 + q0 + q1 + q2) + q3 + q4 + 8) >> 4;
477
2/2
✓ Branch 0 taken 1514700 times.
✓ Branch 1 taken 1705356 times.
6440112 else if (max_len_p == max_len_q)
478 3029400 m = (p6 + p5 + p4 + p3 + p2 + p1 + 2 * (p0 + q0) + q1 + q2 + q3 + q4 + q5 + q6 + 8) >> 4;
479
2/2
✓ Branch 0 taken 314888 times.
✓ Branch 1 taken 1390468 times.
3410712 else if (max_len_p + max_len_q == 12)
480 629776 m = (p5 + p4 + p3 + p2 + 2 * (p1 + p0 + q0 + q1) + q2 + q3 + q4 + q5 + 8) >> 4;
481
2/2
✓ Branch 0 taken 305916 times.
✓ Branch 1 taken 1084552 times.
2780936 else if (max_len_p + max_len_q == 8)
482 611832 m = (p3 + p2 + p1 + p0 + q0 + q1 + q2 + q3 + 4) >> 3;
483
2/2
✓ Branch 0 taken 771984 times.
✓ Branch 1 taken 312568 times.
2169104 else if (max_len_q == 7)
484 1543968 m = (2 * (p2 + p1 + p0 + q0) + p0 + p1 + q1 + q2 + q3 + q4 + q5 + q6 + 8) >> 4;
485 else
486 625136 m = (p6 + p5 + p4 + p3 + p2 + p1 + 2 * (q2 + q1 + q0 + p0) + q0 + q1 + 8) >> 4;
487
2/2
✓ Branch 0 taken 3531184 times.
✓ Branch 1 taken 12856 times.
7088080 if (!no_p) {
488 7062368 const int refp = (P(max_len_p) + P(max_len_p - 1) + 1) >> 1;
489
2/2
✓ Branch 0 taken 1011040 times.
✓ Branch 1 taken 2520144 times.
7062368 if (max_len_p == 3) {
490 2022080 P0 = p0 + av_clip(((m * 53 + refp * 11 + 32) >> 6) - p0, -(tc * 6 >> 1), (tc * 6 >> 1));
491 2022080 P1 = p1 + av_clip(((m * 32 + refp * 32 + 32) >> 6) - p1, -(tc * 4 >> 1), (tc * 4 >> 1));
492 2022080 P2 = p2 + av_clip(((m * 11 + refp * 53 + 32) >> 6) - p2, -(tc * 2 >> 1), (tc * 2 >> 1));
493
2/2
✓ Branch 0 taken 540184 times.
✓ Branch 1 taken 1979960 times.
5040288 } else if (max_len_p == 5) {
494 1080368 P0 = p0 + av_clip(((m * 58 + refp * 6 + 32) >> 6) - p0, -(tc * 6 >> 1), (tc * 6 >> 1));
495 1080368 P1 = p1 + av_clip(((m * 45 + refp * 19 + 32) >> 6) - p1, -(tc * 5 >> 1), (tc * 5 >> 1));
496 1080368 P2 = p2 + av_clip(((m * 32 + refp * 32 + 32) >> 6) - p2, -(tc * 4 >> 1), (tc * 4 >> 1));
497 1080368 P3 = p3 + av_clip(((m * 19 + refp * 45 + 32) >> 6) - p3, -(tc * 3 >> 1), (tc * 3 >> 1));
498 1080368 P4 = p4 + av_clip(((m * 6 + refp * 58 + 32) >> 6) - p4, -(tc * 2 >> 1), (tc * 2 >> 1));
499 } else {
500 3959920 P0 = p0 + av_clip(((m * 59 + refp * 5 + 32) >> 6) - p0, -(tc * 6 >> 1), (tc * 6 >> 1));
501 3959920 P1 = p1 + av_clip(((m * 50 + refp * 14 + 32) >> 6) - p1, -(tc * 5 >> 1), (tc * 5 >> 1));
502 3959920 P2 = p2 + av_clip(((m * 41 + refp * 23 + 32) >> 6) - p2, -(tc * 4 >> 1), (tc * 4 >> 1));
503 3959920 P3 = p3 + av_clip(((m * 32 + refp * 32 + 32) >> 6) - p3, -(tc * 3 >> 1), (tc * 3 >> 1));
504 3959920 P4 = p4 + av_clip(((m * 23 + refp * 41 + 32) >> 6) - p4, -(tc * 2 >> 1), (tc * 2 >> 1));
505 3959920 P5 = p5 + av_clip(((m * 14 + refp * 50 + 32) >> 6) - p5, -(tc * 1 >> 1), (tc * 1 >> 1));
506 3959920 P6 = p6 + av_clip(((m * 5 + refp * 59 + 32) >> 6) - p6, -(tc * 1 >> 1), (tc * 1 >> 1));
507 }
508 }
509
2/2
✓ Branch 0 taken 3534808 times.
✓ Branch 1 taken 9232 times.
7088080 if (!no_q) {
510 7069616 const int refq = (Q(max_len_q) + Q(max_len_q - 1) + 1) >> 1;
511
2/2
✓ Branch 0 taken 375228 times.
✓ Branch 1 taken 3159580 times.
7069616 if (max_len_q == 3) {
512 750456 Q0 = q0 + av_clip(((m * 53 + refq * 11 + 32) >> 6) - q0, -(tc * 6 >> 1), (tc * 6 >> 1));
513 750456 Q1 = q1 + av_clip(((m * 32 + refq * 32 + 32) >> 6) - q1, -(tc * 4 >> 1), (tc * 4 >> 1));
514 750456 Q2 = q2 + av_clip(((m * 11 + refq * 53 + 32) >> 6) - q2, -(tc * 2 >> 1), (tc * 2 >> 1));
515
2/2
✓ Branch 0 taken 728588 times.
✓ Branch 1 taken 2430992 times.
6319160 } else if (max_len_q == 5) {
516 1457176 Q0 = q0 + av_clip(((m * 58 + refq * 6 + 32) >> 6) - q0, -(tc * 6 >> 1), (tc * 6 >> 1));
517 1457176 Q1 = q1 + av_clip(((m * 45 + refq * 19 + 32) >> 6) - q1, -(tc * 5 >> 1), (tc * 5 >> 1));
518 1457176 Q2 = q2 + av_clip(((m * 32 + refq * 32 + 32) >> 6) - q2, -(tc * 4 >> 1), (tc * 4 >> 1));
519 1457176 Q3 = q3 + av_clip(((m * 19 + refq * 45 + 32) >> 6) - q3, -(tc * 3 >> 1), (tc * 3 >> 1));
520 1457176 Q4 = q4 + av_clip(((m * 6 + refq * 58 + 32) >> 6) - q4, -(tc * 2 >> 1), (tc * 2 >> 1));
521 } else {
522 4861984 Q0 = q0 + av_clip(((m * 59 + refq * 5 + 32) >> 6) - q0, -(tc * 6 >> 1), (tc * 6 >> 1));
523 4861984 Q1 = q1 + av_clip(((m * 50 + refq * 14 + 32) >> 6) - q1, -(tc * 5 >> 1), (tc * 5 >> 1));
524 4861984 Q2 = q2 + av_clip(((m * 41 + refq * 23 + 32) >> 6) - q2, -(tc * 4 >> 1), (tc * 4 >> 1));
525 4861984 Q3 = q3 + av_clip(((m * 32 + refq * 32 + 32) >> 6) - q3, -(tc * 3 >> 1), (tc * 3 >> 1));
526 4861984 Q4 = q4 + av_clip(((m * 23 + refq * 41 + 32) >> 6) - q4, -(tc * 2 >> 1), (tc * 2 >> 1));
527 4861984 Q5 = q5 + av_clip(((m * 14 + refq * 50 + 32) >> 6) - q5, -(tc * 1 >> 1), (tc * 1 >> 1));
528 4861984 Q6 = q6 + av_clip(((m * 5 + refq * 59 + 32) >> 6) - q6, -(tc * 1 >> 1), (tc * 1 >> 1));
529 }
530
531 }
532 7088080 pix += ystride;
533 }
534 1772020 }
535
536 8313464 static void FUNC(vvc_loop_filter_luma)(uint8_t* _pix, ptrdiff_t _xstride, ptrdiff_t _ystride,
537 const int32_t *_beta, const int32_t *_tc, const uint8_t *_no_p, const uint8_t *_no_q,
538 const uint8_t *_max_len_p, const uint8_t *_max_len_q, const int hor_ctu_edge)
539 {
540 8313464 const ptrdiff_t xstride = _xstride / sizeof(pixel);
541 8313464 const ptrdiff_t ystride = _ystride / sizeof(pixel);
542
543
2/2
✓ Branch 0 taken 8313464 times.
✓ Branch 1 taken 4156732 times.
24940392 for (int i = 0; i < 2; i++) {
544 #if BIT_DEPTH < 10
545 211404 const int tc = (_tc[i] + (1 << (9 - BIT_DEPTH))) >> (10 - BIT_DEPTH);
546 #else
547 16415524 const int tc = _tc[i] << (BIT_DEPTH - 10);
548 #endif
549
2/2
✓ Branch 0 taken 8067617 times.
✓ Branch 1 taken 245847 times.
16626928 if (tc) {
550 16135234 pixel* pix = (pixel*)_pix + i * 4 * ystride;
551 16135234 const int dp0 = abs(P2 - 2 * P1 + P0);
552 16135234 const int dq0 = abs(Q2 - 2 * Q1 + Q0);
553 16135234 const int dp3 = abs(TP2 - 2 * TP1 + TP0);
554 16135234 const int dq3 = abs(TQ2 - 2 * TQ1 + TQ0);
555 16135234 const int d0 = dp0 + dq0;
556 16135234 const int d3 = dp3 + dq3;
557 16135234 const int tc25 = ((tc * 5 + 1) >> 1);
558
559 16135234 const int no_p = _no_p[i];
560 16135234 const int no_q = _no_q[i];
561
562 16135234 int max_len_p = _max_len_p[i];
563 16135234 int max_len_q = _max_len_q[i];
564
565
4/4
✓ Branch 0 taken 2281527 times.
✓ Branch 1 taken 5786090 times.
✓ Branch 2 taken 1829427 times.
✓ Branch 3 taken 452100 times.
16135234 const int large_p = (max_len_p > 3 && !hor_ctu_edge);
566 16135234 const int large_q = max_len_q > 3;
567
568 16135234 const int beta = _beta[i] << BIT_DEPTH - 8;
569 16135234 const int beta_3 = beta >> 3;
570 16135234 const int beta_2 = beta >> 2;
571
572
4/4
✓ Branch 0 taken 6238190 times.
✓ Branch 1 taken 1829427 times.
✓ Branch 2 taken 879731 times.
✓ Branch 3 taken 5358459 times.
16135234 if (large_p || large_q) {
573
2/2
✓ Branch 0 taken 1829427 times.
✓ Branch 1 taken 879731 times.
5418316 const int dp0l = large_p ? ((dp0 + abs(P5 - 2 * P4 + P3) + 1) >> 1) : dp0;
574
2/2
✓ Branch 0 taken 2259729 times.
✓ Branch 1 taken 449429 times.
5418316 const int dq0l = large_q ? ((dq0 + abs(Q5 - 2 * Q4 + Q3) + 1) >> 1) : dq0;
575
2/2
✓ Branch 0 taken 1829427 times.
✓ Branch 1 taken 879731 times.
5418316 const int dp3l = large_p ? ((dp3 + abs(TP5 - 2 * TP4 + TP3) + 1) >> 1) : dp3;
576
2/2
✓ Branch 0 taken 2259729 times.
✓ Branch 1 taken 449429 times.
5418316 const int dq3l = large_q ? ((dq3 + abs(TQ5 - 2 * TQ4 + TQ3) + 1) >> 1) : dq3;
577 5418316 const int d0l = dp0l + dq0l;
578 5418316 const int d3l = dp3l + dq3l;
579 5418316 const int beta53 = beta * 3 >> 5;
580 5418316 const int beta_4 = beta >> 4;
581
2/2
✓ Branch 0 taken 1829427 times.
✓ Branch 1 taken 879731 times.
5418316 max_len_p = large_p ? max_len_p : 3;
582
2/2
✓ Branch 0 taken 2259729 times.
✓ Branch 1 taken 449429 times.
5418316 max_len_q = large_q ? max_len_q : 3;
583
584
2/2
✓ Branch 0 taken 2474010 times.
✓ Branch 1 taken 235148 times.
5418316 if (d0l + d3l < beta) {
585
2/2
✓ Branch 0 taken 1367932 times.
✓ Branch 1 taken 1106078 times.
4948020 const int sp0l = abs(P3 - P0) + (max_len_p == 7 ? abs(P7 - P6 - P5 + P4) : 0);
586
2/2
✓ Branch 0 taken 1674576 times.
✓ Branch 1 taken 799434 times.
4948020 const int sq0l = abs(Q0 - Q3) + (max_len_q == 7 ? abs(Q4 - Q5 - Q6 + Q7) : 0);
587
2/2
✓ Branch 0 taken 1367932 times.
✓ Branch 1 taken 1106078 times.
4948020 const int sp3l = abs(TP3 - TP0) + (max_len_p == 7 ? abs(TP7 - TP6 - TP5 + TP4) : 0);
588
2/2
✓ Branch 0 taken 1674576 times.
✓ Branch 1 taken 799434 times.
4948020 const int sq3l = abs(TQ0 - TQ3) + (max_len_q == 7 ? abs(TQ4 - TQ5 - TQ6 + TQ7) : 0);
589
2/2
✓ Branch 0 taken 1681546 times.
✓ Branch 1 taken 792464 times.
4948020 const int sp0 = large_p ? ((sp0l + abs(P3 - P(max_len_p)) + 1) >> 1) : sp0l;
590
2/2
✓ Branch 0 taken 1681546 times.
✓ Branch 1 taken 792464 times.
4948020 const int sp3 = large_p ? ((sp3l + abs(TP3 - TP(max_len_p)) + 1) >> 1) : sp3l;
591
2/2
✓ Branch 0 taken 2081051 times.
✓ Branch 1 taken 392959 times.
4948020 const int sq0 = large_q ? ((sq0l + abs(Q3 - Q(max_len_q)) + 1) >> 1) : sq0l;
592
2/2
✓ Branch 0 taken 2081051 times.
✓ Branch 1 taken 392959 times.
4948020 const int sq3 = large_q ? ((sq3l + abs(TQ3 - TQ(max_len_q)) + 1) >> 1) : sq3l;
593
4/4
✓ Branch 0 taken 1083409 times.
✓ Branch 1 taken 1390601 times.
✓ Branch 2 taken 1080543 times.
✓ Branch 3 taken 2866 times.
4948020 if (sp0 + sq0 < beta53 && abs(P0 - Q0) < tc25 &&
594
4/4
✓ Branch 0 taken 966086 times.
✓ Branch 1 taken 114457 times.
✓ Branch 2 taken 965148 times.
✓ Branch 3 taken 938 times.
2161086 sp3 + sq3 < beta53 && abs(TP0 - TQ0) < tc25 &&
595
4/4
✓ Branch 0 taken 912083 times.
✓ Branch 1 taken 53065 times.
✓ Branch 2 taken 886010 times.
✓ Branch 3 taken 26073 times.
1930296 (d0l << 1) < beta_4 && (d3l << 1) < beta_4) {
596 1772020 FUNC(loop_filter_luma_large)(pix, xstride, ystride, tc, no_p, no_q, max_len_p, max_len_q);
597 1772020 continue;
598 }
599 }
600 }
601
2/2
✓ Branch 0 taken 5033580 times.
✓ Branch 1 taken 2148027 times.
14363214 if (d0 + d3 < beta) {
602
3/4
✓ Branch 0 taken 3526271 times.
✓ Branch 1 taken 1507309 times.
✓ Branch 2 taken 3526271 times.
✗ Branch 3 not taken.
10067160 if (max_len_p > 2 && max_len_q > 2 &&
603
4/4
✓ Branch 0 taken 1235111 times.
✓ Branch 1 taken 2291160 times.
✓ Branch 2 taken 1220712 times.
✓ Branch 3 taken 14399 times.
7052542 abs(P3 - P0) + abs(Q3 - Q0) < beta_3 && abs(P0 - Q0) < tc25 &&
604
4/4
✓ Branch 0 taken 944140 times.
✓ Branch 1 taken 276572 times.
✓ Branch 2 taken 940622 times.
✓ Branch 3 taken 3518 times.
2441424 abs(TP3 - TP0) + abs(TQ3 - TQ0) < beta_3 && abs(TP0 - TQ0) < tc25 &&
605
4/4
✓ Branch 0 taken 923378 times.
✓ Branch 1 taken 17244 times.
✓ Branch 2 taken 916136 times.
✓ Branch 3 taken 7242 times.
1881244 (d0 << 1) < beta_2 && (d3 << 1) < beta_2) {
606 1832272 FUNC(loop_filter_luma_strong)(pix, xstride, ystride, tc, tc << 1, tc * 3, no_p, no_q);
607 } else {
608 8234888 int nd_p = 1;
609 8234888 int nd_q = 1;
610
3/4
✓ Branch 0 taken 2777641 times.
✓ Branch 1 taken 1339803 times.
✓ Branch 2 taken 2777641 times.
✗ Branch 3 not taken.
8234888 if (max_len_p > 1 && max_len_q > 1) {
611
2/2
✓ Branch 0 taken 2230858 times.
✓ Branch 1 taken 546783 times.
5555282 if (dp0 + dp3 < ((beta + (beta >> 1)) >> 3))
612 4461716 nd_p = 2;
613
2/2
✓ Branch 0 taken 2139839 times.
✓ Branch 1 taken 637802 times.
5555282 if (dq0 + dq3 < ((beta + (beta >> 1)) >> 3))
614 4279678 nd_q = 2;
615 }
616 8234888 FUNC(loop_filter_luma_weak)(pix, xstride, ystride, tc, beta, no_p, no_q, nd_p, nd_q);
617 }
618 }
619 }
620 }
621 8313464 }
622
623 3518054 static void FUNC(loop_filter_chroma_strong)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride,
624 const int size, const int32_t tc, const uint8_t no_p, const uint8_t no_q)
625 {
626
2/2
✓ Branch 0 taken 4074104 times.
✓ Branch 1 taken 1759027 times.
11666262 for (int d = 0; d < size; d++) {
627 8148208 const int p3 = P3;
628 8148208 const int p2 = P2;
629 8148208 const int p1 = P1;
630 8148208 const int p0 = P0;
631 8148208 const int q0 = Q0;
632 8148208 const int q1 = Q1;
633 8148208 const int q2 = Q2;
634 8148208 const int q3 = Q3;
635
2/2
✓ Branch 0 taken 4050872 times.
✓ Branch 1 taken 23232 times.
8148208 if (!no_p) {
636 8101744 P0 = av_clip((p3 + p2 + p1 + 2 * p0 + q0 + q1 + q2 + 4) >> 3, p0 - tc, p0 + tc);
637 8101744 P1 = av_clip((2 * p3 + p2 + 2 * p1 + p0 + q0 + q1 + 4) >> 3, p1 - tc, p1 + tc);
638 8101744 P2 = av_clip((3 * p3 + 2 * p2 + p1 + p0 + q0 + 4) >> 3, p2 - tc, p2 + tc );
639 }
640
2/2
✓ Branch 0 taken 4059068 times.
✓ Branch 1 taken 15036 times.
8148208 if (!no_q) {
641 8118136 Q0 = av_clip((p2 + p1 + p0 + 2 * q0 + q1 + q2 + q3 + 4) >> 3, q0 - tc, q0 + tc);
642 8118136 Q1 = av_clip((p1 + p0 + q0 + 2 * q1 + q2 + 2 * q3 + 4) >> 3, q1 - tc, q1 + tc);
643 8118136 Q2 = av_clip((p0 + q0 + q1 + 2 * q2 + 3 * q3 + 4) >> 3, q2 - tc, q2 + tc);
644 }
645 8148208 pix += ystride;
646 }
647 3518054 }
648
649 611104 static void FUNC(loop_filter_chroma_strong_one_side)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride,
650 const int size, const int32_t tc, const uint8_t no_p, const uint8_t no_q)
651 {
652
2/2
✓ Branch 0 taken 676504 times.
✓ Branch 1 taken 305552 times.
1964112 for (int d = 0; d < size; d++) {
653 1353008 const int p1 = P1;
654 1353008 const int p0 = P0;
655 1353008 const int q0 = Q0;
656 1353008 const int q1 = Q1;
657 1353008 const int q2 = Q2;
658 1353008 const int q3 = Q3;
659
2/2
✓ Branch 0 taken 675240 times.
✓ Branch 1 taken 1264 times.
1353008 if (!no_p) {
660 1350480 P0 = av_clip((3 * p1 + 2 * p0 + q0 + q1 + q2 + 4) >> 3, p0 - tc, p0 + tc);
661 }
662
2/2
✓ Branch 0 taken 674220 times.
✓ Branch 1 taken 2284 times.
1353008 if (!no_q) {
663 1348440 Q0 = av_clip((2 * p1 + p0 + 2 * q0 + q1 + q2 + q3 + 4) >> 3, q0 - tc, q0 + tc);
664 1348440 Q1 = av_clip((p1 + p0 + q0 + 2 * q1 + q2 + 2 * q3 + 4) >> 3, q1 - tc, q1 + tc);
665 1348440 Q2 = av_clip((p0 + q0 + q1 + 2 * q2 + 3 * q3 + 4) >> 3, q2 - tc, q2 + tc);
666 }
667 1353008 pix += ystride;
668 }
669 611104 }
670
671 2975432 static void FUNC(vvc_loop_filter_chroma)(uint8_t *_pix, const ptrdiff_t _xstride, const ptrdiff_t _ystride,
672 const int32_t *_beta, const int32_t *_tc, const uint8_t *_no_p, const uint8_t *_no_q,
673 const uint8_t *_max_len_p, const uint8_t *_max_len_q, const int shift)
674 {
675 2975432 const ptrdiff_t xstride = _xstride / sizeof(pixel);
676 2975432 const ptrdiff_t ystride = _ystride / sizeof(pixel);
677
2/2
✓ Branch 0 taken 1037667 times.
✓ Branch 1 taken 450049 times.
2975432 const int size = shift ? 2 : 4;
678 2975432 const int end = 8 / size; // 8 samples a loop
679
680
2/2
✓ Branch 0 taken 5050766 times.
✓ Branch 1 taken 1487716 times.
13076964 for (int i = 0; i < end; i++) {
681 #if BIT_DEPTH < 10
682 158280 const int tc = (_tc[i] + (1 << (9 - BIT_DEPTH))) >> (10 - BIT_DEPTH);
683 #else
684 9943252 const int tc = _tc[i] << (BIT_DEPTH - 10);
685 #endif
686
2/2
✓ Branch 0 taken 4710548 times.
✓ Branch 1 taken 340218 times.
10101532 if (tc) {
687 9421096 pixel *pix = (pixel *)_pix + i * size * ystride;
688 9421096 const uint8_t no_p = _no_p[i];
689 9421096 const uint8_t no_q = _no_q[i];
690
691 9421096 const int beta = _beta[i] << (BIT_DEPTH - 8);
692 9421096 const int beta_3 = beta >> 3;
693 9421096 const int beta_2 = beta >> 2;
694
695 9421096 const int tc25 = ((tc * 5 + 1) >> 1);
696
697 9421096 uint8_t max_len_p = _max_len_p[i];
698 9421096 uint8_t max_len_q = _max_len_q[i];
699
700
3/4
✓ Branch 0 taken 4577150 times.
✓ Branch 1 taken 133398 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4577150 times.
9421096 if (!max_len_p || !max_len_q)
701 266796 continue;
702
703
2/2
✓ Branch 0 taken 3264026 times.
✓ Branch 1 taken 1313124 times.
9154300 if (max_len_q == 3){
704
2/2
✓ Branch 0 taken 2617961 times.
✓ Branch 1 taken 646065 times.
6528052 const int p1n = shift ? FP1 : TP1;
705
4/4
✓ Branch 0 taken 2872722 times.
✓ Branch 1 taken 391304 times.
✓ Branch 2 taken 2280105 times.
✓ Branch 3 taken 592617 times.
6528052 const int p2n = max_len_p == 1 ? p1n : (shift ? FP2 : TP2);
706
2/2
✓ Branch 0 taken 2617961 times.
✓ Branch 1 taken 646065 times.
6528052 const int p0n = shift ? FP0 : TP0;
707
2/2
✓ Branch 0 taken 2617961 times.
✓ Branch 1 taken 646065 times.
6528052 const int q0n = shift ? FQ0 : TQ0;
708
2/2
✓ Branch 0 taken 2617961 times.
✓ Branch 1 taken 646065 times.
6528052 const int q1n = shift ? FQ1 : TQ1;
709
2/2
✓ Branch 0 taken 2617961 times.
✓ Branch 1 taken 646065 times.
6528052 const int q2n = shift ? FQ2 : TQ2;
710
2/2
✓ Branch 0 taken 391304 times.
✓ Branch 1 taken 2872722 times.
6528052 const int p3 = max_len_p == 1 ? P1 : P3;
711
2/2
✓ Branch 0 taken 391304 times.
✓ Branch 1 taken 2872722 times.
6528052 const int p2 = max_len_p == 1 ? P1 : P2;
712 6528052 const int p1 = P1;
713 6528052 const int p0 = P0;
714 6528052 const int dp0 = abs(p2 - 2 * p1 + p0);
715 6528052 const int dq0 = abs(Q2 - 2 * Q1 + Q0);
716
717 6528052 const int dp1 = abs(p2n - 2 * p1n + p0n);
718 6528052 const int dq1 = abs(q2n - 2 * q1n + q0n);
719 6528052 const int d0 = dp0 + dq0;
720 6528052 const int d1 = dp1 + dq1;
721
722
2/2
✓ Branch 0 taken 2943437 times.
✓ Branch 1 taken 320589 times.
6528052 if (d0 + d1 < beta) {
723
4/4
✓ Branch 0 taken 2574309 times.
✓ Branch 1 taken 369128 times.
✓ Branch 2 taken 2118225 times.
✓ Branch 3 taken 456084 times.
5886874 const int p3n = max_len_p == 1 ? p1n : (shift ? FP3 : TP3);
724
2/2
✓ Branch 0 taken 2440091 times.
✓ Branch 1 taken 503346 times.
5886874 const int q3n = shift ? FQ3 : TQ3;
725
4/4
✓ Branch 0 taken 2609190 times.
✓ Branch 1 taken 334247 times.
✓ Branch 2 taken 2180685 times.
✓ Branch 3 taken 428505 times.
10248244 const int dsam0 = (d0 << 1) < beta_2 && (abs(p3 - p0) + abs(Q0 - Q3) < beta_3) &&
726
2/2
✓ Branch 0 taken 2150981 times.
✓ Branch 1 taken 29704 times.
4361370 abs(p0 - Q0) < tc25;
727
4/4
✓ Branch 0 taken 2613595 times.
✓ Branch 1 taken 329842 times.
✓ Branch 2 taken 2185068 times.
✓ Branch 3 taken 428527 times.
10257010 const int dsam1 = (d1 << 1) < beta_2 && (abs(p3n - p0n) + abs(q0n - q3n) < beta_3) &&
728
2/2
✓ Branch 0 taken 2154859 times.
✓ Branch 1 taken 30209 times.
4370136 abs(p0n - q0n) < tc25;
729
4/4
✓ Branch 0 taken 2150981 times.
✓ Branch 1 taken 792456 times.
✓ Branch 2 taken 86402 times.
✓ Branch 3 taken 2064579 times.
5886874 if (!dsam0 || !dsam1)
730 1757716 max_len_p = max_len_q = 1;
731 } else {
732 641178 max_len_p = max_len_q = 1;
733 }
734 }
735
736
3/4
✓ Branch 0 taken 1759027 times.
✓ Branch 1 taken 2818123 times.
✓ Branch 2 taken 1759027 times.
✗ Branch 3 not taken.
9154300 if (max_len_p == 3 && max_len_q == 3)
737 3518054 FUNC(loop_filter_chroma_strong)(pix, xstride, ystride, size, tc, no_p, no_q);
738
2/2
✓ Branch 0 taken 305552 times.
✓ Branch 1 taken 2512571 times.
5636246 else if (max_len_q == 3)
739 611104 FUNC(loop_filter_chroma_strong_one_side)(pix, xstride, ystride, size, tc, no_p, no_q);
740 else
741 5025142 FUNC(loop_filter_chroma_weak)(pix, xstride, ystride, size, tc, no_p, no_q);
742 }
743 }
744 2975432 }
745
746 1506482 static void FUNC(vvc_h_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride,
747 const int32_t *beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q,
748 const uint8_t *max_len_p, const uint8_t *max_len_q, int shift)
749 {
750 1506482 FUNC(vvc_loop_filter_chroma)(pix, stride, sizeof(pixel), beta, tc,
751 no_p, no_q, max_len_p, max_len_q, shift);
752 1506482 }
753
754 1468950 static void FUNC(vvc_v_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride,
755 const int32_t *beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q,
756 const uint8_t *max_len_p, const uint8_t *max_len_q, int shift)
757 {
758 1468950 FUNC(vvc_loop_filter_chroma)(pix, sizeof(pixel), stride, beta, tc,
759 no_p, no_q, max_len_p, max_len_q, shift);
760 1468950 }
761
762 4307262 static void FUNC(vvc_h_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride,
763 const int32_t *beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q,
764 const uint8_t *max_len_p, const uint8_t *max_len_q, const int hor_ctu_edge)
765 {
766 4307262 FUNC(vvc_loop_filter_luma)(pix, stride, sizeof(pixel), beta, tc,
767 no_p, no_q, max_len_p, max_len_q, hor_ctu_edge);
768 4307262 }
769
770 4006202 static void FUNC(vvc_v_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride,
771 const int32_t *beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q,
772 const uint8_t *max_len_p, const uint8_t *max_len_q, const int hor_ctu_edge)
773 {
774 4006202 FUNC(vvc_loop_filter_luma)(pix, sizeof(pixel), stride, beta, tc,
775 no_p, no_q, max_len_p, max_len_q, hor_ctu_edge);
776 4006202 }
777
778 943758 static int FUNC(vvc_loop_ladf_level)(const uint8_t *_pix, const ptrdiff_t _xstride, const ptrdiff_t _ystride)
779 {
780 943758 const pixel *pix = (pixel *)_pix;
781 943758 const ptrdiff_t xstride = _xstride / sizeof(pixel);
782 943758 const ptrdiff_t ystride = _ystride / sizeof(pixel);
783 943758 return (P0 + TP0 + Q0 + TQ0) >> 2;
784 }
785
786 477242 static int FUNC(vvc_h_loop_ladf_level)(const uint8_t *pix, ptrdiff_t stride)
787 {
788 477242 return FUNC(vvc_loop_ladf_level)(pix, stride, sizeof(pixel));
789 }
790
791 466516 static int FUNC(vvc_v_loop_ladf_level)(const uint8_t *pix, ptrdiff_t stride)
792 {
793 466516 return FUNC(vvc_loop_ladf_level)(pix, sizeof(pixel), stride);
794 }
795
796 #undef P7
797 #undef P6
798 #undef P5
799 #undef P4
800 #undef P3
801 #undef P2
802 #undef P1
803 #undef P0
804 #undef Q0
805 #undef Q1
806 #undef Q2
807 #undef Q3
808 #undef Q4
809 #undef Q5
810 #undef Q6
811 #undef Q7
812
813 #undef TP7
814 #undef TP6
815 #undef TP5
816 #undef TP4
817 #undef TP3
818 #undef TP2
819 #undef TP1
820 #undef TP0
821 #undef TQ0
822 #undef TQ1
823 #undef TQ2
824 #undef TQ3
825 #undef TQ4
826 #undef TQ5
827 #undef TQ6
828 #undef TQ7
829
830 3156 static void FUNC(ff_vvc_lmcs_dsp_init)(VVCLMCSDSPContext *const lmcs)
831 {
832 3156 lmcs->filter = FUNC(lmcs_filter_luma);
833 3156 }
834
835 3156 static void FUNC(ff_vvc_lf_dsp_init)(VVCLFDSPContext *const lf)
836 {
837 3156 lf->ladf_level[0] = FUNC(vvc_h_loop_ladf_level);
838 3156 lf->ladf_level[1] = FUNC(vvc_v_loop_ladf_level);
839 3156 lf->filter_luma[0] = FUNC(vvc_h_loop_filter_luma);
840 3156 lf->filter_luma[1] = FUNC(vvc_v_loop_filter_luma);
841 3156 lf->filter_chroma[0] = FUNC(vvc_h_loop_filter_chroma);
842 3156 lf->filter_chroma[1] = FUNC(vvc_v_loop_filter_chroma);
843 3156 }
844
845 3156 static void FUNC(ff_vvc_sao_dsp_init)(VVCSAODSPContext *const sao)
846 {
847
2/2
✓ Branch 0 taken 14202 times.
✓ Branch 1 taken 1578 times.
31560 for (int i = 0; i < FF_ARRAY_ELEMS(sao->band_filter); i++)
848 28404 sao->band_filter[i] = FUNC(sao_band_filter);
849
2/2
✓ Branch 0 taken 14202 times.
✓ Branch 1 taken 1578 times.
31560 for (int i = 0; i < FF_ARRAY_ELEMS(sao->edge_filter); i++)
850 28404 sao->edge_filter[i] = FUNC(sao_edge_filter);
851 3156 sao->edge_restore[0] = FUNC(sao_edge_restore_0);
852 3156 sao->edge_restore[1] = FUNC(sao_edge_restore_1);
853 3156 }
854
855 3156 static void FUNC(ff_vvc_alf_dsp_init)(VVCALFDSPContext *const alf)
856 {
857 3156 alf->filter[LUMA] = FUNC(alf_filter_luma);
858 3156 alf->filter[CHROMA] = FUNC(alf_filter_chroma);
859 3156 alf->filter_cc = FUNC(alf_filter_cc);
860 3156 alf->classify = FUNC(alf_classify);
861 3156 alf->recon_coeff_and_clip = FUNC(alf_recon_coeff_and_clip);
862 3156 }
863