1 /*
2 * VVC filters DSP
3 *
4 * Copyright (C) 2024 Zhao Zhili
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
24
29 int is_near_vb);
30
35 int is_near_vb);
36
38 ptrdiff_t dst_stride,
40 ptrdiff_t src_stride,
44 const int vb_pos)
45 {
47
48 dst_stride /=
sizeof(
pixel);
49 src_stride /=
sizeof(
pixel);
50
52 int far = (y + 3 < vb_pos - 3) || (y > vb_pos + 2);
53
55 const pixel *s0 =
src + y * src_stride + x;
56 const pixel *s1 = s0 + src_stride;
57 const pixel *s2 = s0 - src_stride;
58 const pixel *s3 = s1 + src_stride;
59 const pixel *s4 = s2 - src_stride;
60 const pixel *s5 = s3 + src_stride;
61 const pixel *s6 = s4 - src_stride;
62
65
66 const pixel *p0 = s0 +
i * src_stride;
67 const pixel *p1 = s1 +
i * src_stride;
68 const pixel *p2 = s2 +
i * src_stride;
69 const pixel *p3 = s3 +
i * src_stride;
70 const pixel *p4 = s4 +
i * src_stride;
71 const pixel *p5 = s5 +
i * src_stride;
72 const pixel *p6 = s6 +
i * src_stride;
73 int is_near_vb = 0;
74
75 if (!far) {
76 is_near_vb = (y +
i == vb_pos - 1) || (y +
i == vb_pos);
77 if (is_near_vb) {
78 p1 = p0;
79 p2 = p0;
80 }
81 if (y +
i >= vb_pos - 2 && y +
i <= vb_pos + 1) {
82 p3 = p1;
83 p4 = p2;
84 }
85 if (y +
i >= vb_pos - 3 && y +
i <= vb_pos + 2) {
86 p5 = p3;
87 p6 = p4;
88 }
89 }
91 (
const pixel *[]) { p0, p1, p2, p3, p4, p5, p6},
94 is_near_vb);
95 }
98 }
99 }
100 }
101
103 ptrdiff_t dst_stride,
105 ptrdiff_t src_stride,
110 const int vb_pos)
111 {
113
114 dst_stride /=
sizeof(
pixel);
115 src_stride /=
sizeof(
pixel);
116
118 int far = (y + 3 < vb_pos - 2) || (y > vb_pos + 1);
119
121 const pixel *s0 =
src + y * src_stride + x;
122 const pixel *s1 = s0 + src_stride;
123 const pixel *s2 = s0 - src_stride;
124 const pixel *s3 = s1 + src_stride;
125 const pixel *s4 = s2 - src_stride;
126
129
130 const pixel *p0 = s0 +
i * src_stride;
131 const pixel *p1 = s1 +
i * src_stride;
132 const pixel *p2 = s2 +
i * src_stride;
133 const pixel *p3 = s3 +
i * src_stride;
134 const pixel *p4 = s4 +
i * src_stride;
135 int is_near_vb = 0;
136
137 if (!far) {
138 is_near_vb = (y +
i == vb_pos - 1) || (y +
i == vb_pos);
139 if (is_near_vb) {
140 p1 = p0;
141 p2 = p0;
142 }
143
144 if (y +
i >= vb_pos - 2 && y +
i <= vb_pos + 1) {
145 p3 = p1;
146 p4 = p2;
147 }
148 }
149
151 (
const pixel *[]){p0, p1, p2, p3, p4},
153 is_near_vb);
154 }
155 }
156 }
157 }
158
159 #define ALF_DIR_VERT 0
160 #define ALF_DIR_HORZ 1
161 #define ALF_DIR_DIGA0 2
162 #define ALF_DIR_DIGA1 3
163
164 static void FUNC(
alf_get_idx)(
int *class_idx,
int *transpose_idx,
const int *sum,
const int ac)
165 {
166 static const int arg_var[] = {0, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4 };
167
168 int hv0, hv1, dir_hv, d0, d1, dir_d, hvd1, hvd0, sum_hv, dir1;
169
173
177
178 //promote to avoid overflow
179 dir1 = (uint64_t)d1 * hv0 <= (uint64_t)hv1 * d0;
180 hvd1 = dir1 ? hv1 : d1;
181 hvd0 = dir1 ? hv0 : d0;
182
185 if (hvd1 * 2 > 9 * hvd0)
186 *class_idx += ((dir1 << 1) + 2) * 5;
187 else if (hvd1 > 2 * hvd0)
188 *class_idx += ((dir1 << 1) + 1) * 5;
189
190 *transpose_idx = dir_d * 2 + dir_hv;
191 }
192
194 const uint8_t *
_src,
const ptrdiff_t _src_stride,
const int width,
const int height,
195 const int vb_pos, int16_t *gradient_tmp)
196 {
198
203
205 int start = 0;
207 int ac = 2;
210 ac = 3;
211 } else if (y == vb_pos) {
213 ac = 3;
214 }
223 class_idx++;
224 transpose_idx++;
226 class_idx++;
227 transpose_idx++;
228 }
229 }
230
231 }
232
233 void FUNC2(ff_alf_classify_grad,
BIT_DEPTH, _neon)(
int *class_idx,
int *transpose_idx,
234 const uint8_t *
_src,
const ptrdiff_t _src_stride,
const int width,
const int height,
235 const int vb_pos, int16_t *gradient_tmp);
236
238 const uint8_t *
_src,
const ptrdiff_t _src_stride,
const int width,
const int height,
239 const int vb_pos, int *gradient_tmp)
240 {
243 }