FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavfilter/vf_xbr.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 128 130 98.5%
Functions: 8 8 100.0%
Branches: 601 604 99.5%

Line Branch Exec Source
1 /*
2 * This file is part of FFmpeg.
3 *
4 * Copyright (c) 2011, 2012 Hyllian/Jararaca <sergiogdb@gmail.com>
5 * Copyright (c) 2014 Arwa Arif <arwaarif1994@gmail.com>
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * XBR Filter is used for depixelization of image.
25 * This is based on Hyllian's xBR shader.
26 *
27 * @see https://forums.libretro.com/t/xbr-algorithm-tutorial/123
28 * @see https://github.com/yoyofr/iFBA/blob/master/fba_src/src/intf/video/scalers/xbr.cpp
29 */
30
31 #include "libavutil/opt.h"
32 #include "libavutil/pixdesc.h"
33
34 #include "filters.h"
35 #include "video.h"
36
37 #define LB_MASK 0x00FEFEFE
38 #define RED_BLUE_MASK 0x00FF00FF
39 #define GREEN_MASK 0x0000FF00
40
41 #ifdef PI
42 #undef PI
43 #endif
44
45 typedef int (*xbrfunc_t)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
46
47 typedef struct XBRContext {
48 const AVClass *class;
49 int n;
50 xbrfunc_t func;
51 uint32_t rgbtoyuv[1<<24];
52 } XBRContext;
53
54 typedef struct ThreadData {
55 AVFrame *in, *out;
56 const uint32_t *rgbtoyuv;
57 } ThreadData;
58
59 #define OFFSET(x) offsetof(XBRContext, x)
60 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
61 static const AVOption xbr_options[] = {
62 { "n", "set scale factor", OFFSET(n), AV_OPT_TYPE_INT, {.i64 = 3}, 2, 4, .flags = FLAGS },
63 { NULL }
64 };
65
66 AVFILTER_DEFINE_CLASS(xbr);
67
68 2704426 static uint32_t pixel_diff(uint32_t x, uint32_t y, const uint32_t *r2y)
69 {
70 #define YMASK 0xff0000
71 #define UMASK 0x00ff00
72 #define VMASK 0x0000ff
73 #define ABSDIFF(a,b) (abs((int)(a)-(int)(b)))
74
75 2704426 uint32_t yuv1 = r2y[x & 0xffffff];
76 2704426 uint32_t yuv2 = r2y[y & 0xffffff];
77
78 2704426 return (ABSDIFF(yuv1 & YMASK, yuv2 & YMASK) >> 16) +
79 5408852 (ABSDIFF(yuv1 & UMASK, yuv2 & UMASK) >> 8) +
80 2704426 ABSDIFF(yuv1 & VMASK, yuv2 & VMASK);
81 }
82
83 #define ALPHA_BLEND_128_W(a, b) ((((a) & LB_MASK) >> 1) + (((b) & LB_MASK) >> 1))
84 #define ALPHA_BLEND_BASE(a, b, m, s) ( (RED_BLUE_MASK & (((a) & RED_BLUE_MASK) + (((((b) & RED_BLUE_MASK) - ((a) & RED_BLUE_MASK)) * (m)) >> (s)))) \
85 | (GREEN_MASK & (((a) & GREEN_MASK) + (((((b) & GREEN_MASK) - ((a) & GREEN_MASK)) * (m)) >> (s)))))
86 #define ALPHA_BLEND_32_W(a, b) ALPHA_BLEND_BASE(a, b, 1, 3)
87 #define ALPHA_BLEND_64_W(a, b) ALPHA_BLEND_BASE(a, b, 1, 2)
88 #define ALPHA_BLEND_192_W(a, b) ALPHA_BLEND_BASE(a, b, 3, 2)
89 #define ALPHA_BLEND_224_W(a, b) ALPHA_BLEND_BASE(a, b, 7, 3)
90
91 #define df(A, B) pixel_diff(A, B, r2y)
92 #define eq(A, B) (df(A, B) < 155)
93
94 #define FILT2(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \
95 N0, N1, N2, N3) do { \
96 if (PE != PH && PE != PF) { \
97 const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \
98 const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \
99 if (e <= i) { \
100 const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \
101 if (e < i && (!eq(PF,PB) && !eq(PH,PD) || eq(PE,PI) \
102 && (!eq(PF,I4) && !eq(PH,I5)) \
103 || eq(PE,PG) || eq(PE,PC))) { \
104 const unsigned ke = df(PF,PG); \
105 const unsigned ki = df(PH,PC); \
106 const int left = ke<<1 <= ki && PE != PG && PD != PG; \
107 const int up = ke >= ki<<1 && PE != PC && PB != PC; \
108 if (left && up) { \
109 E[N3] = ALPHA_BLEND_224_W(E[N3], px); \
110 E[N2] = ALPHA_BLEND_64_W( E[N2], px); \
111 E[N1] = E[N2]; \
112 } else if (left) { \
113 E[N3] = ALPHA_BLEND_192_W(E[N3], px); \
114 E[N2] = ALPHA_BLEND_64_W( E[N2], px); \
115 } else if (up) { \
116 E[N3] = ALPHA_BLEND_192_W(E[N3], px); \
117 E[N1] = ALPHA_BLEND_64_W( E[N1], px); \
118 } else { /* diagonal */ \
119 E[N3] = ALPHA_BLEND_128_W(E[N3], px); \
120 } \
121 } else { \
122 E[N3] = ALPHA_BLEND_128_W(E[N3], px); \
123 } \
124 } \
125 } \
126 } while (0)
127
128 #define FILT3(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \
129 N0, N1, N2, N3, N4, N5, N6, N7, N8) do { \
130 if (PE != PH && PE != PF) { \
131 const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \
132 const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \
133 if (e <= i) { \
134 const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \
135 if (e < i && (!eq(PF,PB) && !eq(PF,PC) || !eq(PH,PD) && !eq(PH,PG) || eq(PE,PI) \
136 && (!eq(PF,F4) && !eq(PF,I4) || !eq(PH,H5) && !eq(PH,I5)) \
137 || eq(PE,PG) || eq(PE,PC))) { \
138 const unsigned ke = df(PF,PG); \
139 const unsigned ki = df(PH,PC); \
140 const int left = ke<<1 <= ki && PE != PG && PD != PG; \
141 const int up = ke >= ki<<1 && PE != PC && PB != PC; \
142 if (left && up) { \
143 E[N7] = ALPHA_BLEND_192_W(E[N7], px); \
144 E[N6] = ALPHA_BLEND_64_W( E[N6], px); \
145 E[N5] = E[N7]; \
146 E[N2] = E[N6]; \
147 E[N8] = px; \
148 } else if (left) { \
149 E[N7] = ALPHA_BLEND_192_W(E[N7], px); \
150 E[N5] = ALPHA_BLEND_64_W( E[N5], px); \
151 E[N6] = ALPHA_BLEND_64_W( E[N6], px); \
152 E[N8] = px; \
153 } else if (up) { \
154 E[N5] = ALPHA_BLEND_192_W(E[N5], px); \
155 E[N7] = ALPHA_BLEND_64_W( E[N7], px); \
156 E[N2] = ALPHA_BLEND_64_W( E[N2], px); \
157 E[N8] = px; \
158 } else { /* diagonal */ \
159 E[N8] = ALPHA_BLEND_224_W(E[N8], px); \
160 E[N5] = ALPHA_BLEND_32_W( E[N5], px); \
161 E[N7] = ALPHA_BLEND_32_W( E[N7], px); \
162 } \
163 } else { \
164 E[N8] = ALPHA_BLEND_128_W(E[N8], px); \
165 } \
166 } \
167 } \
168 } while (0)
169
170 #define FILT4(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \
171 N15, N14, N11, N3, N7, N10, N13, N12, N9, N6, N2, N1, N5, N8, N4, N0) do { \
172 if (PE != PH && PE != PF) { \
173 const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \
174 const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \
175 if (e <= i) { \
176 const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \
177 if (e < i && (!eq(PF,PB) && !eq(PH,PD) || eq(PE,PI) \
178 && (!eq(PF,I4) && !eq(PH,I5)) \
179 || eq(PE,PG) || eq(PE,PC))) { \
180 const unsigned ke = df(PF,PG); \
181 const unsigned ki = df(PH,PC); \
182 const int left = ke<<1 <= ki && PE != PG && PD != PG; \
183 const int up = ke >= ki<<1 && PE != PC && PB != PC; \
184 if (left && up) { \
185 E[N13] = ALPHA_BLEND_192_W(E[N13], px); \
186 E[N12] = ALPHA_BLEND_64_W( E[N12], px); \
187 E[N15] = E[N14] = E[N11] = px; \
188 E[N10] = E[N3] = E[N12]; \
189 E[N7] = E[N13]; \
190 } else if (left) { \
191 E[N11] = ALPHA_BLEND_192_W(E[N11], px); \
192 E[N13] = ALPHA_BLEND_192_W(E[N13], px); \
193 E[N10] = ALPHA_BLEND_64_W( E[N10], px); \
194 E[N12] = ALPHA_BLEND_64_W( E[N12], px); \
195 E[N14] = px; \
196 E[N15] = px; \
197 } else if (up) { \
198 E[N14] = ALPHA_BLEND_192_W(E[N14], px); \
199 E[N7 ] = ALPHA_BLEND_192_W(E[N7 ], px); \
200 E[N10] = ALPHA_BLEND_64_W( E[N10], px); \
201 E[N3 ] = ALPHA_BLEND_64_W( E[N3 ], px); \
202 E[N11] = px; \
203 E[N15] = px; \
204 } else { /* diagonal */ \
205 E[N11] = ALPHA_BLEND_128_W(E[N11], px); \
206 E[N14] = ALPHA_BLEND_128_W(E[N14], px); \
207 E[N15] = px; \
208 } \
209 } else { \
210 E[N15] = ALPHA_BLEND_128_W(E[N15], px); \
211 } \
212 } \
213 } \
214 } while (0)
215
216 54 static av_always_inline void xbr_filter(const ThreadData *td, int jobnr, int nb_jobs, int n)
217 {
218 int x, y;
219 54 const AVFrame *input = td->in;
220 54 AVFrame *output = td->out;
221 54 const uint32_t *r2y = td->rgbtoyuv;
222 54 const int slice_start = (input->height * jobnr ) / nb_jobs;
223 54 const int slice_end = (input->height * (jobnr+1)) / nb_jobs;
224 54 const int nl = output->linesize[0] >> 2;
225 54 const int nl1 = nl + nl;
226 54 const int nl2 = nl1 + nl;
227
228
2/2
✓ Branch 0 taken 1554 times.
✓ Branch 1 taken 54 times.
1608 for (y = slice_start; y < slice_end; y++) {
229
230 1554 uint32_t *E = (uint32_t *)(output->data[0] + y * output->linesize[0] * n);
231 1554 const uint32_t *sa2 = (uint32_t *)(input->data[0] + y * input->linesize[0] - 8); /* center */
232 1554 const uint32_t *sa1 = sa2 - (input->linesize[0]>>2); /* up x1 */
233 1554 const uint32_t *sa0 = sa1 - (input->linesize[0]>>2); /* up x2 */
234 1554 const uint32_t *sa3 = sa2 + (input->linesize[0]>>2); /* down x1 */
235 1554 const uint32_t *sa4 = sa3 + (input->linesize[0]>>2); /* down x2 */
236
237
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1542 times.
1554 if (y <= 1) {
238 12 sa0 = sa1;
239
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 if (y == 0) {
240 6 sa0 = sa1 = sa2;
241 }
242 }
243
244
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1542 times.
1554 if (y >= input->height - 2) {
245 12 sa4 = sa3;
246
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 if (y == input->height - 1) {
247 6 sa4 = sa3 = sa2;
248 }
249 }
250
251
2/2
✓ Branch 0 taken 296814 times.
✓ Branch 1 taken 1554 times.
298368 for (x = 0; x < input->width; x++) {
252 296814 const uint32_t B1 = sa0[2];
253 296814 const uint32_t PB = sa1[2];
254 296814 const uint32_t PE = sa2[2];
255 296814 const uint32_t PH = sa3[2];
256 296814 const uint32_t H5 = sa4[2];
257
258
2/2
✓ Branch 0 taken 295260 times.
✓ Branch 1 taken 1554 times.
296814 const int pprev = 2 - (x > 0);
259 296814 const uint32_t A1 = sa0[pprev];
260 296814 const uint32_t PA = sa1[pprev];
261 296814 const uint32_t PD = sa2[pprev];
262 296814 const uint32_t PG = sa3[pprev];
263 296814 const uint32_t G5 = sa4[pprev];
264
265 296814 const int pprev2 = pprev - (x > 1);
266 296814 const uint32_t A0 = sa1[pprev2];
267 296814 const uint32_t D0 = sa2[pprev2];
268 296814 const uint32_t G0 = sa3[pprev2];
269
270
2/2
✓ Branch 0 taken 1554 times.
✓ Branch 1 taken 295260 times.
296814 const int pnext = 3 - (x == input->width - 1);
271 296814 const uint32_t C1 = sa0[pnext];
272 296814 const uint32_t PC = sa1[pnext];
273 296814 const uint32_t PF = sa2[pnext];
274 296814 const uint32_t PI = sa3[pnext];
275 296814 const uint32_t I5 = sa4[pnext];
276
277 296814 const int pnext2 = pnext + 1 - (x >= input->width - 2);
278 296814 const uint32_t C4 = sa1[pnext2];
279 296814 const uint32_t F4 = sa2[pnext2];
280 296814 const uint32_t I4 = sa3[pnext2];
281
282
2/2
✓ Branch 0 taken 98938 times.
✓ Branch 1 taken 197876 times.
296814 if (n == 2) {
283 98938 E[0] = E[1] = // 0, 1
284 98938 E[nl] = E[nl + 1] = PE; // 2, 3
285
286
44/44
✓ Branch 0 taken 30618 times.
✓ Branch 1 taken 68320 times.
✓ Branch 2 taken 15513 times.
✓ Branch 3 taken 15105 times.
✓ Branch 14 taken 9976 times.
✓ Branch 15 taken 5537 times.
✓ Branch 18 taken 8416 times.
✓ Branch 19 taken 1560 times.
✓ Branch 20 taken 9718 times.
✓ Branch 21 taken 258 times.
✓ Branch 23 taken 4254 times.
✓ Branch 24 taken 5464 times.
✓ Branch 26 taken 1315 times.
✓ Branch 27 taken 2939 times.
✓ Branch 29 taken 3921 times.
✓ Branch 30 taken 2858 times.
✓ Branch 32 taken 724 times.
✓ Branch 33 taken 3197 times.
✓ Branch 35 taken 310 times.
✓ Branch 36 taken 414 times.
✓ Branch 38 taken 1380 times.
✓ Branch 39 taken 4985 times.
✓ Branch 41 taken 826 times.
✓ Branch 42 taken 554 times.
✓ Branch 45 taken 2622 times.
✓ Branch 46 taken 6542 times.
✓ Branch 47 taken 2383 times.
✓ Branch 48 taken 239 times.
✓ Branch 49 taken 1954 times.
✓ Branch 50 taken 429 times.
✓ Branch 51 taken 2875 times.
✓ Branch 52 taken 6289 times.
✓ Branch 53 taken 2645 times.
✓ Branch 54 taken 230 times.
✓ Branch 55 taken 2224 times.
✓ Branch 56 taken 421 times.
✓ Branch 57 taken 1954 times.
✓ Branch 58 taken 7210 times.
✓ Branch 59 taken 427 times.
✓ Branch 60 taken 1527 times.
✓ Branch 61 taken 1527 times.
✓ Branch 62 taken 7210 times.
✓ Branch 63 taken 1797 times.
✓ Branch 64 taken 5413 times.
98938 FILT2(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, 0, 1, nl, nl+1);
287
44/44
✓ Branch 0 taken 31128 times.
✓ Branch 1 taken 67810 times.
✓ Branch 2 taken 15271 times.
✓ Branch 3 taken 15857 times.
✓ Branch 14 taken 8857 times.
✓ Branch 15 taken 6414 times.
✓ Branch 18 taken 7535 times.
✓ Branch 19 taken 1322 times.
✓ Branch 20 taken 8601 times.
✓ Branch 21 taken 256 times.
✓ Branch 23 taken 3557 times.
✓ Branch 24 taken 5044 times.
✓ Branch 26 taken 1221 times.
✓ Branch 27 taken 2336 times.
✓ Branch 29 taken 3484 times.
✓ Branch 30 taken 2781 times.
✓ Branch 32 taken 625 times.
✓ Branch 33 taken 2859 times.
✓ Branch 35 taken 275 times.
✓ Branch 36 taken 350 times.
✓ Branch 38 taken 1404 times.
✓ Branch 39 taken 4511 times.
✓ Branch 41 taken 831 times.
✓ Branch 42 taken 573 times.
✓ Branch 45 taken 2553 times.
✓ Branch 46 taken 5475 times.
✓ Branch 47 taken 2330 times.
✓ Branch 48 taken 223 times.
✓ Branch 49 taken 1943 times.
✓ Branch 50 taken 387 times.
✓ Branch 51 taken 2358 times.
✓ Branch 52 taken 5670 times.
✓ Branch 53 taken 2130 times.
✓ Branch 54 taken 228 times.
✓ Branch 55 taken 1732 times.
✓ Branch 56 taken 398 times.
✓ Branch 57 taken 1943 times.
✓ Branch 58 taken 6085 times.
✓ Branch 59 taken 350 times.
✓ Branch 60 taken 1593 times.
✓ Branch 61 taken 1593 times.
✓ Branch 62 taken 6085 times.
✓ Branch 63 taken 1382 times.
✓ Branch 64 taken 4703 times.
98938 FILT2(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, nl, 0, nl+1, 1);
288
44/44
✓ Branch 0 taken 30618 times.
✓ Branch 1 taken 68320 times.
✓ Branch 2 taken 15560 times.
✓ Branch 3 taken 15058 times.
✓ Branch 14 taken 9908 times.
✓ Branch 15 taken 5652 times.
✓ Branch 18 taken 8384 times.
✓ Branch 19 taken 1524 times.
✓ Branch 20 taken 9653 times.
✓ Branch 21 taken 255 times.
✓ Branch 23 taken 4272 times.
✓ Branch 24 taken 5381 times.
✓ Branch 26 taken 1305 times.
✓ Branch 27 taken 2967 times.
✓ Branch 29 taken 3845 times.
✓ Branch 30 taken 2841 times.
✓ Branch 32 taken 648 times.
✓ Branch 33 taken 3197 times.
✓ Branch 35 taken 297 times.
✓ Branch 36 taken 351 times.
✓ Branch 38 taken 1413 times.
✓ Branch 39 taken 4922 times.
✓ Branch 41 taken 849 times.
✓ Branch 42 taken 564 times.
✓ Branch 45 taken 2445 times.
✓ Branch 46 taken 6644 times.
✓ Branch 47 taken 2237 times.
✓ Branch 48 taken 208 times.
✓ Branch 49 taken 1851 times.
✓ Branch 50 taken 386 times.
✓ Branch 51 taken 2919 times.
✓ Branch 52 taken 6170 times.
✓ Branch 53 taken 2691 times.
✓ Branch 54 taken 228 times.
✓ Branch 55 taken 2322 times.
✓ Branch 56 taken 369 times.
✓ Branch 57 taken 1851 times.
✓ Branch 58 taken 7238 times.
✓ Branch 59 taken 407 times.
✓ Branch 60 taken 1444 times.
✓ Branch 61 taken 1444 times.
✓ Branch 62 taken 7238 times.
✓ Branch 63 taken 1915 times.
✓ Branch 64 taken 5323 times.
98938 FILT2(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, nl+1, nl, 1, 0);
289
44/44
✓ Branch 0 taken 31128 times.
✓ Branch 1 taken 67810 times.
✓ Branch 2 taken 15307 times.
✓ Branch 3 taken 15821 times.
✓ Branch 14 taken 8941 times.
✓ Branch 15 taken 6366 times.
✓ Branch 18 taken 7587 times.
✓ Branch 19 taken 1354 times.
✓ Branch 20 taken 8684 times.
✓ Branch 21 taken 257 times.
✓ Branch 23 taken 3581 times.
✓ Branch 24 taken 5103 times.
✓ Branch 26 taken 1124 times.
✓ Branch 27 taken 2457 times.
✓ Branch 29 taken 3440 times.
✓ Branch 30 taken 2787 times.
✓ Branch 32 taken 631 times.
✓ Branch 33 taken 2809 times.
✓ Branch 35 taken 294 times.
✓ Branch 36 taken 337 times.
✓ Branch 38 taken 1469 times.
✓ Branch 39 taken 4421 times.
✓ Branch 41 taken 847 times.
✓ Branch 42 taken 622 times.
✓ Branch 45 taken 2568 times.
✓ Branch 46 taken 5494 times.
✓ Branch 47 taken 2382 times.
✓ Branch 48 taken 186 times.
✓ Branch 49 taken 1998 times.
✓ Branch 50 taken 384 times.
✓ Branch 51 taken 2353 times.
✓ Branch 52 taken 5709 times.
✓ Branch 53 taken 2168 times.
✓ Branch 54 taken 185 times.
✓ Branch 55 taken 1839 times.
✓ Branch 56 taken 329 times.
✓ Branch 57 taken 1998 times.
✓ Branch 58 taken 6064 times.
✓ Branch 59 taken 427 times.
✓ Branch 60 taken 1571 times.
✓ Branch 61 taken 1571 times.
✓ Branch 62 taken 6064 times.
✓ Branch 63 taken 1412 times.
✓ Branch 64 taken 4652 times.
98938 FILT2(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, 1, nl+1, 0, nl);
290
2/2
✓ Branch 0 taken 98938 times.
✓ Branch 1 taken 98938 times.
197876 } else if (n == 3) {
291 98938 E[0] = E[1] = E[2] = // 0, 1, 2
292 98938 E[nl] = E[nl+1] = E[nl+2] = // 3, 4, 5
293 98938 E[nl1] = E[nl1+1] = E[nl1+2] = PE; // 6, 7, 8
294
295
52/52
✓ Branch 0 taken 30618 times.
✓ Branch 1 taken 68320 times.
✓ Branch 2 taken 15513 times.
✓ Branch 3 taken 15105 times.
✓ Branch 14 taken 9976 times.
✓ Branch 15 taken 5537 times.
✓ Branch 18 taken 8416 times.
✓ Branch 19 taken 1560 times.
✓ Branch 20 taken 9718 times.
✓ Branch 21 taken 258 times.
✓ Branch 23 taken 4254 times.
✓ Branch 24 taken 5464 times.
✓ Branch 26 taken 2181 times.
✓ Branch 27 taken 2073 times.
✓ Branch 29 taken 2640 times.
✓ Branch 30 taken 5005 times.
✓ Branch 32 taken 1326 times.
✓ Branch 33 taken 1314 times.
✓ Branch 35 taken 3698 times.
✓ Branch 36 taken 2633 times.
✓ Branch 38 taken 502 times.
✓ Branch 39 taken 3196 times.
✓ Branch 41 taken 137 times.
✓ Branch 42 taken 365 times.
✓ Branch 44 taken 333 times.
✓ Branch 45 taken 3000 times.
✓ Branch 47 taken 91 times.
✓ Branch 48 taken 242 times.
✓ Branch 50 taken 1366 times.
✓ Branch 51 taken 4358 times.
✓ Branch 53 taken 595 times.
✓ Branch 54 taken 771 times.
✓ Branch 57 taken 2424 times.
✓ Branch 58 taken 6523 times.
✓ Branch 59 taken 2185 times.
✓ Branch 60 taken 239 times.
✓ Branch 61 taken 1745 times.
✓ Branch 62 taken 440 times.
✓ Branch 63 taken 2675 times.
✓ Branch 64 taken 6272 times.
✓ Branch 65 taken 2445 times.
✓ Branch 66 taken 230 times.
✓ Branch 67 taken 2018 times.
✓ Branch 68 taken 427 times.
✓ Branch 69 taken 1745 times.
✓ Branch 70 taken 7202 times.
✓ Branch 71 taken 225 times.
✓ Branch 72 taken 1520 times.
✓ Branch 73 taken 1520 times.
✓ Branch 74 taken 7202 times.
✓ Branch 75 taken 1793 times.
✓ Branch 76 taken 5409 times.
98938 FILT3(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, 0, 1, 2, nl, nl+1, nl+2, nl1, nl1+1, nl1+2);
296
52/52
✓ Branch 0 taken 31128 times.
✓ Branch 1 taken 67810 times.
✓ Branch 2 taken 15271 times.
✓ Branch 3 taken 15857 times.
✓ Branch 14 taken 8857 times.
✓ Branch 15 taken 6414 times.
✓ Branch 18 taken 7535 times.
✓ Branch 19 taken 1322 times.
✓ Branch 20 taken 8601 times.
✓ Branch 21 taken 256 times.
✓ Branch 23 taken 3557 times.
✓ Branch 24 taken 5044 times.
✓ Branch 26 taken 1737 times.
✓ Branch 27 taken 1820 times.
✓ Branch 29 taken 2284 times.
✓ Branch 30 taken 4497 times.
✓ Branch 32 taken 1315 times.
✓ Branch 33 taken 969 times.
✓ Branch 35 taken 3275 times.
✓ Branch 36 taken 2537 times.
✓ Branch 38 taken 407 times.
✓ Branch 39 taken 2868 times.
✓ Branch 41 taken 90 times.
✓ Branch 42 taken 317 times.
✓ Branch 44 taken 307 times.
✓ Branch 45 taken 2651 times.
✓ Branch 47 taken 60 times.
✓ Branch 48 taken 247 times.
✓ Branch 50 taken 1403 times.
✓ Branch 51 taken 3845 times.
✓ Branch 53 taken 656 times.
✓ Branch 54 taken 747 times.
✓ Branch 57 taken 2395 times.
✓ Branch 58 taken 5459 times.
✓ Branch 59 taken 2172 times.
✓ Branch 60 taken 223 times.
✓ Branch 61 taken 1774 times.
✓ Branch 62 taken 398 times.
✓ Branch 63 taken 2209 times.
✓ Branch 64 taken 5645 times.
✓ Branch 65 taken 1981 times.
✓ Branch 66 taken 228 times.
✓ Branch 67 taken 1578 times.
✓ Branch 68 taken 403 times.
✓ Branch 69 taken 1774 times.
✓ Branch 70 taken 6080 times.
✓ Branch 71 taken 191 times.
✓ Branch 72 taken 1583 times.
✓ Branch 73 taken 1583 times.
✓ Branch 74 taken 6080 times.
✓ Branch 75 taken 1387 times.
✓ Branch 76 taken 4693 times.
98938 FILT3(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, nl1, nl, 0, nl1+1, nl+1, 1, nl1+2, nl+2, 2);
297
52/52
✓ Branch 0 taken 30618 times.
✓ Branch 1 taken 68320 times.
✓ Branch 2 taken 15560 times.
✓ Branch 3 taken 15058 times.
✓ Branch 14 taken 9908 times.
✓ Branch 15 taken 5652 times.
✓ Branch 18 taken 8384 times.
✓ Branch 19 taken 1524 times.
✓ Branch 20 taken 9653 times.
✓ Branch 21 taken 255 times.
✓ Branch 23 taken 4272 times.
✓ Branch 24 taken 5381 times.
✓ Branch 26 taken 2235 times.
✓ Branch 27 taken 2037 times.
✓ Branch 29 taken 2612 times.
✓ Branch 30 taken 5004 times.
✓ Branch 32 taken 1307 times.
✓ Branch 33 taken 1305 times.
✓ Branch 35 taken 3663 times.
✓ Branch 36 taken 2648 times.
✓ Branch 38 taken 407 times.
✓ Branch 39 taken 3256 times.
✓ Branch 41 taken 97 times.
✓ Branch 42 taken 310 times.
✓ Branch 44 taken 304 times.
✓ Branch 45 taken 3049 times.
✓ Branch 47 taken 90 times.
✓ Branch 48 taken 214 times.
✓ Branch 50 taken 1433 times.
✓ Branch 51 taken 4354 times.
✓ Branch 53 taken 670 times.
✓ Branch 54 taken 763 times.
✓ Branch 57 taken 2246 times.
✓ Branch 58 taken 6644 times.
✓ Branch 59 taken 2038 times.
✓ Branch 60 taken 208 times.
✓ Branch 61 taken 1639 times.
✓ Branch 62 taken 399 times.
✓ Branch 63 taken 2726 times.
✓ Branch 64 taken 6164 times.
✓ Branch 65 taken 2498 times.
✓ Branch 66 taken 228 times.
✓ Branch 67 taken 2116 times.
✓ Branch 68 taken 382 times.
✓ Branch 69 taken 1639 times.
✓ Branch 70 taken 7251 times.
✓ Branch 71 taken 203 times.
✓ Branch 72 taken 1436 times.
✓ Branch 73 taken 1436 times.
✓ Branch 74 taken 7251 times.
✓ Branch 75 taken 1913 times.
✓ Branch 76 taken 5338 times.
98938 FILT3(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, nl1+2, nl1+1, nl1, nl+2, nl+1, nl, 2, 1, 0);
298
52/52
✓ Branch 0 taken 31128 times.
✓ Branch 1 taken 67810 times.
✓ Branch 2 taken 15307 times.
✓ Branch 3 taken 15821 times.
✓ Branch 14 taken 8941 times.
✓ Branch 15 taken 6366 times.
✓ Branch 18 taken 7587 times.
✓ Branch 19 taken 1354 times.
✓ Branch 20 taken 8684 times.
✓ Branch 21 taken 257 times.
✓ Branch 23 taken 3581 times.
✓ Branch 24 taken 5103 times.
✓ Branch 26 taken 1762 times.
✓ Branch 27 taken 1819 times.
✓ Branch 29 taken 2373 times.
✓ Branch 30 taken 4492 times.
✓ Branch 32 taken 1436 times.
✓ Branch 33 taken 937 times.
✓ Branch 35 taken 3253 times.
✓ Branch 36 taken 2675 times.
✓ Branch 38 taken 457 times.
✓ Branch 39 taken 2796 times.
✓ Branch 41 taken 108 times.
✓ Branch 42 taken 349 times.
✓ Branch 44 taken 298 times.
✓ Branch 45 taken 2606 times.
✓ Branch 47 taken 68 times.
✓ Branch 48 taken 230 times.
✓ Branch 50 taken 1508 times.
✓ Branch 51 taken 3841 times.
✓ Branch 53 taken 689 times.
✓ Branch 54 taken 819 times.
✓ Branch 57 taken 2384 times.
✓ Branch 58 taken 5481 times.
✓ Branch 59 taken 2198 times.
✓ Branch 60 taken 186 times.
✓ Branch 61 taken 1799 times.
✓ Branch 62 taken 399 times.
✓ Branch 63 taken 2157 times.
✓ Branch 64 taken 5708 times.
✓ Branch 65 taken 1972 times.
✓ Branch 66 taken 185 times.
✓ Branch 67 taken 1630 times.
✓ Branch 68 taken 342 times.
✓ Branch 69 taken 1799 times.
✓ Branch 70 taken 6066 times.
✓ Branch 71 taken 224 times.
✓ Branch 72 taken 1575 times.
✓ Branch 73 taken 1575 times.
✓ Branch 74 taken 6066 times.
✓ Branch 75 taken 1406 times.
✓ Branch 76 taken 4660 times.
98938 FILT3(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, 2, nl+2, nl1+2, 1, nl+1, nl1+1, 0, nl, nl1);
299
1/2
✓ Branch 0 taken 98938 times.
✗ Branch 1 not taken.
98938 } else if (n == 4) {
300 98938 E[0] = E[1] = E[2] = E[3] = // 0, 1, 2, 3
301 98938 E[nl] = E[nl+1] = E[nl+2] = E[nl+3] = // 4, 5, 6, 7
302 98938 E[nl1] = E[nl1+1] = E[nl1+2] = E[nl1+3] = // 8, 9, 10, 11
303 98938 E[nl2] = E[nl2+1] = E[nl2+2] = E[nl2+3] = PE; // 12, 13, 14, 15
304
305
44/44
✓ Branch 0 taken 30618 times.
✓ Branch 1 taken 68320 times.
✓ Branch 2 taken 15513 times.
✓ Branch 3 taken 15105 times.
✓ Branch 14 taken 9976 times.
✓ Branch 15 taken 5537 times.
✓ Branch 18 taken 8416 times.
✓ Branch 19 taken 1560 times.
✓ Branch 20 taken 9718 times.
✓ Branch 21 taken 258 times.
✓ Branch 23 taken 4254 times.
✓ Branch 24 taken 5464 times.
✓ Branch 26 taken 1315 times.
✓ Branch 27 taken 2939 times.
✓ Branch 29 taken 3921 times.
✓ Branch 30 taken 2858 times.
✓ Branch 32 taken 724 times.
✓ Branch 33 taken 3197 times.
✓ Branch 35 taken 310 times.
✓ Branch 36 taken 414 times.
✓ Branch 38 taken 1380 times.
✓ Branch 39 taken 4985 times.
✓ Branch 41 taken 826 times.
✓ Branch 42 taken 554 times.
✓ Branch 45 taken 2622 times.
✓ Branch 46 taken 6542 times.
✓ Branch 47 taken 2383 times.
✓ Branch 48 taken 239 times.
✓ Branch 49 taken 1954 times.
✓ Branch 50 taken 429 times.
✓ Branch 51 taken 2875 times.
✓ Branch 52 taken 6289 times.
✓ Branch 53 taken 2645 times.
✓ Branch 54 taken 230 times.
✓ Branch 55 taken 2224 times.
✓ Branch 56 taken 421 times.
✓ Branch 57 taken 1954 times.
✓ Branch 58 taken 7210 times.
✓ Branch 59 taken 427 times.
✓ Branch 60 taken 1527 times.
✓ Branch 61 taken 1527 times.
✓ Branch 62 taken 7210 times.
✓ Branch 63 taken 1797 times.
✓ Branch 64 taken 5413 times.
98938 FILT4(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, nl2+3, nl2+2, nl1+3, 3, nl+3, nl1+2, nl2+1, nl2, nl1+1, nl+2, 2, 1, nl+1, nl1, nl, 0);
306
44/44
✓ Branch 0 taken 31128 times.
✓ Branch 1 taken 67810 times.
✓ Branch 2 taken 15271 times.
✓ Branch 3 taken 15857 times.
✓ Branch 14 taken 8857 times.
✓ Branch 15 taken 6414 times.
✓ Branch 18 taken 7535 times.
✓ Branch 19 taken 1322 times.
✓ Branch 20 taken 8601 times.
✓ Branch 21 taken 256 times.
✓ Branch 23 taken 3557 times.
✓ Branch 24 taken 5044 times.
✓ Branch 26 taken 1221 times.
✓ Branch 27 taken 2336 times.
✓ Branch 29 taken 3484 times.
✓ Branch 30 taken 2781 times.
✓ Branch 32 taken 625 times.
✓ Branch 33 taken 2859 times.
✓ Branch 35 taken 275 times.
✓ Branch 36 taken 350 times.
✓ Branch 38 taken 1404 times.
✓ Branch 39 taken 4511 times.
✓ Branch 41 taken 831 times.
✓ Branch 42 taken 573 times.
✓ Branch 45 taken 2553 times.
✓ Branch 46 taken 5475 times.
✓ Branch 47 taken 2330 times.
✓ Branch 48 taken 223 times.
✓ Branch 49 taken 1943 times.
✓ Branch 50 taken 387 times.
✓ Branch 51 taken 2358 times.
✓ Branch 52 taken 5670 times.
✓ Branch 53 taken 2130 times.
✓ Branch 54 taken 228 times.
✓ Branch 55 taken 1732 times.
✓ Branch 56 taken 398 times.
✓ Branch 57 taken 1943 times.
✓ Branch 58 taken 6085 times.
✓ Branch 59 taken 350 times.
✓ Branch 60 taken 1593 times.
✓ Branch 61 taken 1593 times.
✓ Branch 62 taken 6085 times.
✓ Branch 63 taken 1382 times.
✓ Branch 64 taken 4703 times.
98938 FILT4(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, 3, nl+3, 2, 0, 1, nl+2, nl1+3, nl2+3, nl1+2, nl+1, nl, nl1, nl1+1, nl2+2, nl2+1, nl2);
307
44/44
✓ Branch 0 taken 30618 times.
✓ Branch 1 taken 68320 times.
✓ Branch 2 taken 15560 times.
✓ Branch 3 taken 15058 times.
✓ Branch 14 taken 9908 times.
✓ Branch 15 taken 5652 times.
✓ Branch 18 taken 8384 times.
✓ Branch 19 taken 1524 times.
✓ Branch 20 taken 9653 times.
✓ Branch 21 taken 255 times.
✓ Branch 23 taken 4272 times.
✓ Branch 24 taken 5381 times.
✓ Branch 26 taken 1305 times.
✓ Branch 27 taken 2967 times.
✓ Branch 29 taken 3845 times.
✓ Branch 30 taken 2841 times.
✓ Branch 32 taken 648 times.
✓ Branch 33 taken 3197 times.
✓ Branch 35 taken 297 times.
✓ Branch 36 taken 351 times.
✓ Branch 38 taken 1413 times.
✓ Branch 39 taken 4922 times.
✓ Branch 41 taken 849 times.
✓ Branch 42 taken 564 times.
✓ Branch 45 taken 2445 times.
✓ Branch 46 taken 6644 times.
✓ Branch 47 taken 2237 times.
✓ Branch 48 taken 208 times.
✓ Branch 49 taken 1851 times.
✓ Branch 50 taken 386 times.
✓ Branch 51 taken 2919 times.
✓ Branch 52 taken 6170 times.
✓ Branch 53 taken 2691 times.
✓ Branch 54 taken 228 times.
✓ Branch 55 taken 2322 times.
✓ Branch 56 taken 369 times.
✓ Branch 57 taken 1851 times.
✓ Branch 58 taken 7238 times.
✓ Branch 59 taken 407 times.
✓ Branch 60 taken 1444 times.
✓ Branch 61 taken 1444 times.
✓ Branch 62 taken 7238 times.
✓ Branch 63 taken 1915 times.
✓ Branch 64 taken 5323 times.
98938 FILT4(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, 0, 1, nl, nl2, nl1, nl+1, 2, 3, nl+2, nl1+1, nl2+1, nl2+2, nl1+2, nl+3, nl1+3, nl2+3);
308
44/44
✓ Branch 0 taken 31128 times.
✓ Branch 1 taken 67810 times.
✓ Branch 2 taken 15307 times.
✓ Branch 3 taken 15821 times.
✓ Branch 14 taken 8941 times.
✓ Branch 15 taken 6366 times.
✓ Branch 18 taken 7587 times.
✓ Branch 19 taken 1354 times.
✓ Branch 20 taken 8684 times.
✓ Branch 21 taken 257 times.
✓ Branch 23 taken 3581 times.
✓ Branch 24 taken 5103 times.
✓ Branch 26 taken 1124 times.
✓ Branch 27 taken 2457 times.
✓ Branch 29 taken 3440 times.
✓ Branch 30 taken 2787 times.
✓ Branch 32 taken 631 times.
✓ Branch 33 taken 2809 times.
✓ Branch 35 taken 294 times.
✓ Branch 36 taken 337 times.
✓ Branch 38 taken 1469 times.
✓ Branch 39 taken 4421 times.
✓ Branch 41 taken 847 times.
✓ Branch 42 taken 622 times.
✓ Branch 45 taken 2568 times.
✓ Branch 46 taken 5494 times.
✓ Branch 47 taken 2382 times.
✓ Branch 48 taken 186 times.
✓ Branch 49 taken 1998 times.
✓ Branch 50 taken 384 times.
✓ Branch 51 taken 2353 times.
✓ Branch 52 taken 5709 times.
✓ Branch 53 taken 2168 times.
✓ Branch 54 taken 185 times.
✓ Branch 55 taken 1839 times.
✓ Branch 56 taken 329 times.
✓ Branch 57 taken 1998 times.
✓ Branch 58 taken 6064 times.
✓ Branch 59 taken 427 times.
✓ Branch 60 taken 1571 times.
✓ Branch 61 taken 1571 times.
✓ Branch 62 taken 6064 times.
✓ Branch 63 taken 1412 times.
✓ Branch 64 taken 4652 times.
98938 FILT4(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, nl2, nl1, nl2+1, nl2+3, nl2+2, nl1+1, nl, 0, nl+1, nl1+2, nl1+3, nl+3, nl+2, 1, 2, 3);
309 }
310
311 296814 sa0 += 1;
312 296814 sa1 += 1;
313 296814 sa2 += 1;
314 296814 sa3 += 1;
315 296814 sa4 += 1;
316
317 296814 E += n;
318 }
319 }
320 54 }
321
322 #define XBR_FUNC(size) \
323 static int xbr##size##x(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \
324 { \
325 xbr_filter(arg, jobnr, nb_jobs, size); \
326 return 0; \
327 }
328
329 18 XBR_FUNC(2)
330 18 XBR_FUNC(3)
331 18 XBR_FUNC(4)
332
333
334 6 static int config_output(AVFilterLink *outlink)
335 {
336 6 AVFilterContext *ctx = outlink->src;
337 6 XBRContext *s = ctx->priv;
338 6 AVFilterLink *inlink = ctx->inputs[0];
339
340 6 outlink->w = inlink->w * s->n;
341 6 outlink->h = inlink->h * s->n;
342 6 return 0;
343 }
344
345 6 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
346 {
347 6 AVFilterContext *ctx = inlink->dst;
348 6 AVFilterLink *outlink = ctx->outputs[0];
349 6 XBRContext *s = ctx->priv;
350 ThreadData td;
351
352 6 AVFrame *out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
353
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (!out) {
354 av_frame_free(&in);
355 return AVERROR(ENOMEM);
356 }
357
358 6 av_frame_copy_props(out, in);
359
360 6 td.in = in;
361 6 td.out = out;
362 6 td.rgbtoyuv = s->rgbtoyuv;
363 6 ff_filter_execute(ctx, s->func, &td, NULL,
364
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 FFMIN(inlink->h, ff_filter_get_nb_threads(ctx)));
365
366 6 out->width = outlink->w;
367 6 out->height = outlink->h;
368
369 6 av_frame_free(&in);
370 6 return ff_filter_frame(outlink, out);
371 }
372
373 9 static av_cold int init(AVFilterContext *ctx)
374 {
375 9 XBRContext *s = ctx->priv;
376 static const xbrfunc_t xbrfuncs[] = {xbr2x, xbr3x, xbr4x};
377
378 uint32_t c;
379 int bg, rg, g;
380
381
2/2
✓ Branch 0 taken 4599 times.
✓ Branch 1 taken 9 times.
4608 for (bg = -255; bg < 256; bg++) {
382
2/2
✓ Branch 0 taken 2350089 times.
✓ Branch 1 taken 4599 times.
2354688 for (rg = -255; rg < 256; rg++) {
383 2350089 const uint32_t u = (uint32_t)((-169*rg + 500*bg)/1000) + 128;
384 2350089 const uint32_t v = (uint32_t)(( 500*rg - 81*bg)/1000) + 128;
385
6/6
✓ Branch 0 taken 1172745 times.
✓ Branch 1 taken 1177344 times.
✓ Branch 2 taken 1760265 times.
✓ Branch 3 taken 589824 times.
✓ Branch 4 taken 878985 times.
✓ Branch 5 taken 881280 times.
2350089 int startg = FFMAX3(-bg, -rg, 0);
386
6/6
✓ Branch 0 taken 1172745 times.
✓ Branch 1 taken 1177344 times.
✓ Branch 2 taken 585225 times.
✓ Branch 3 taken 1764864 times.
✓ Branch 4 taken 881280 times.
✓ Branch 5 taken 883584 times.
2350089 int endg = FFMIN3(255-bg, 255-rg, 255);
387 2350089 uint32_t y = (uint32_t)(( 299*rg + 1000*startg + 114*bg)/1000);
388 2350089 c = bg + rg * (1 << 16) + 0x010101 * startg;
389
2/2
✓ Branch 0 taken 150994944 times.
✓ Branch 1 taken 2350089 times.
153345033 for (g = startg; g <= endg; g++) {
390 150994944 s->rgbtoyuv[c] = ((y++) << 16) + (u << 8) + v;
391 150994944 c+= 0x010101;
392 }
393 }
394 }
395
396 9 s->func = xbrfuncs[s->n - 2];
397 9 return 0;
398 }
399
400 static const AVFilterPad xbr_inputs[] = {
401 {
402 .name = "default",
403 .type = AVMEDIA_TYPE_VIDEO,
404 .filter_frame = filter_frame,
405 },
406 };
407
408 static const AVFilterPad xbr_outputs[] = {
409 {
410 .name = "default",
411 .type = AVMEDIA_TYPE_VIDEO,
412 .config_props = config_output,
413 },
414 };
415
416 const AVFilter ff_vf_xbr = {
417 .name = "xbr",
418 .description = NULL_IF_CONFIG_SMALL("Scale the input using xBR algorithm."),
419 FILTER_INPUTS(xbr_inputs),
420 FILTER_OUTPUTS(xbr_outputs),
421 FILTER_SINGLE_PIXFMT(AV_PIX_FMT_0RGB32),
422 .priv_size = sizeof(XBRContext),
423 .priv_class = &xbr_class,
424 .init = init,
425 .flags = AVFILTER_FLAG_SLICE_THREADS,
426 };
427