FFmpeg
Loading...
Searching...
No Matches
vf_removegrain.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012 Laurent de Soras
3 * Copyright (c) 2013 Fredrik Mellbin
4 * Copyright (c) 2015 Paul B Mahol
5 * Copyright (c) 2015 James Darnley
6 *
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#include "libavutil/imgutils.h"
25#include "libavutil/opt.h"
26#include "libavutil/pixdesc.h"
27#include "libavutil/qsort.h"
28#include "avfilter.h"
29#include "filters.h"
30#include "removegrain.h"
31#include "video.h"
32
33#define OFFSET(x) offsetof(RemoveGrainContext, x)
34#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
35
36static const AVOption removegrain_options[] = {
37 { "m0", "set mode for 1st plane", OFFSET(mode[0]), AV_OPT_TYPE_INT, {.i64=0}, 0, 24, FLAGS },
38 { "m1", "set mode for 2nd plane", OFFSET(mode[1]), AV_OPT_TYPE_INT, {.i64=0}, 0, 24, FLAGS },
39 { "m2", "set mode for 3rd plane", OFFSET(mode[2]), AV_OPT_TYPE_INT, {.i64=0}, 0, 24, FLAGS },
40 { "m3", "set mode for 4th plane", OFFSET(mode[3]), AV_OPT_TYPE_INT, {.i64=0}, 0, 24, FLAGS },
41 {NULL}
42};
43
45
56
57#define REMOVE_GRAIN_SORT_AXIS \
58 const int ma1 = FFMAX(a1, a8); \
59 const int mi1 = FFMIN(a1, a8); \
60 const int ma2 = FFMAX(a2, a7); \
61 const int mi2 = FFMIN(a2, a7); \
62 const int ma3 = FFMAX(a3, a6); \
63 const int mi3 = FFMIN(a3, a6); \
64 const int ma4 = FFMAX(a4, a5); \
65 const int mi4 = FFMIN(a4, a5);
66
67static int mode01(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
68{
69 const int mi = FFMIN(FFMIN(FFMIN(a1, a2), FFMIN(a3, a4)), FFMIN(FFMIN(a5, a6), FFMIN(a7, a8)));
70 const int ma = FFMAX(FFMAX(FFMAX(a1, a2), FFMAX(a3, a4)), FFMAX(FFMAX(a5, a6), FFMAX(a7, a8)));
71
72 return av_clip(c, mi, ma);
73}
74
75static int cmp_int(const void *p1, const void *p2)
76{
77 int left = *(const int *)p1;
78 int right = *(const int *)p2;
79 return FFDIFFSIGN(left, right);
80}
81
82static int mode02(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
83{
84 int a[8] = { a1, a2, a3, a4, a5, a6, a7, a8 };
85
86 AV_QSORT(a, 8, int, cmp_int);
87
88 return av_clip(c, a[2 - 1 ], a[7 - 1]);
89}
90
91static int mode03(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
92{
93 int a[8] = { a1, a2, a3, a4, a5, a6, a7, a8 };
94
95 AV_QSORT(a, 8, int, cmp_int);
96
97 return av_clip(c, a[3 - 1 ], a[6 - 1]);
98}
99
100static int mode04(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
101{
102 int a[8] = { a1, a2, a3, a4, a5, a6, a7, a8 };
103
104 AV_QSORT(a, 8, int, cmp_int);
105
106 return av_clip(c, a[4 - 1 ], a[5 - 1]);
107}
108
109static int mode05(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
110{
112
113 const int c1 = FFABS(c - av_clip(c, mi1, ma1));
114 const int c2 = FFABS(c - av_clip(c, mi2, ma2));
115 const int c3 = FFABS(c - av_clip(c, mi3, ma3));
116 const int c4 = FFABS(c - av_clip(c, mi4, ma4));
117
118 const int mindiff = FFMIN(FFMIN(c1, c2), FFMIN(c3, c4));
119
120 /* When adding SIMD notice the return order here: 4, 2, 3, 1. */
121 if (mindiff == c4) {
122 return av_clip(c, mi4, ma4);
123 } else if (mindiff == c2) {
124 return av_clip(c, mi2, ma2);
125 } else if (mindiff == c3) {
126 return av_clip(c, mi3, ma3);
127 }
128
129 return av_clip(c, mi1, ma1);
130}
131
132static int mode06(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
133{
135
136 const int d1 = ma1 - mi1;
137 const int d2 = ma2 - mi2;
138 const int d3 = ma3 - mi3;
139 const int d4 = ma4 - mi4;
140
141 const int cli1 = av_clip(c, mi1, ma1);
142 const int cli2 = av_clip(c, mi2, ma2);
143 const int cli3 = av_clip(c, mi3, ma3);
144 const int cli4 = av_clip(c, mi4, ma4);
145
146 const int c1 = av_clip_uint16((FFABS(c - cli1) << 1) + d1);
147 const int c2 = av_clip_uint16((FFABS(c - cli2) << 1) + d2);
148 const int c3 = av_clip_uint16((FFABS(c - cli3) << 1) + d3);
149 const int c4 = av_clip_uint16((FFABS(c - cli4) << 1) + d4);
150
151 const int mindiff = FFMIN(FFMIN(c1, c2), FFMIN(c3, c4));
152
153 if (mindiff == c4) {
154 return cli4;
155 } else if (mindiff == c2) {
156 return cli2;
157 } else if (mindiff == c3) {
158 return cli3;
159 }
160
161 return cli1;
162}
163
164static int mode07(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
165{
167
168 const int d1 = ma1 - mi1;
169 const int d2 = ma2 - mi2;
170 const int d3 = ma3 - mi3;
171 const int d4 = ma4 - mi4;
172
173 const int cli1 = av_clip(c, mi1, ma1);
174 const int cli2 = av_clip(c, mi2, ma2);
175 const int cli3 = av_clip(c, mi3, ma3);
176 const int cli4 = av_clip(c, mi4, ma4);
177
178 const int c1 = FFABS(c - cli1) + d1;
179 const int c2 = FFABS(c - cli2) + d2;
180 const int c3 = FFABS(c - cli3) + d3;
181 const int c4 = FFABS(c - cli4) + d4;
182
183 const int mindiff = FFMIN(FFMIN(c1, c2), FFMIN(c3, c4));
184
185 if (mindiff == c4) {
186 return cli4;
187 } else if (mindiff == c2) {
188 return cli2;
189 } else if (mindiff == c3) {
190 return cli3;
191 }
192
193 return cli1;
194}
195
196static int mode08(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
197{
199
200 const int d1 = ma1 - mi1;
201 const int d2 = ma2 - mi2;
202 const int d3 = ma3 - mi3;
203 const int d4 = ma4 - mi4;
204
205 const int cli1 = av_clip(c, mi1, ma1);
206 const int cli2 = av_clip(c, mi2, ma2);
207 const int cli3 = av_clip(c, mi3, ma3);
208 const int cli4 = av_clip(c, mi4, ma4);
209
210 const int c1 = av_clip_uint16(FFABS(c - cli1) + (d1 << 1));
211 const int c2 = av_clip_uint16(FFABS(c - cli2) + (d2 << 1));
212 const int c3 = av_clip_uint16(FFABS(c - cli3) + (d3 << 1));
213 const int c4 = av_clip_uint16(FFABS(c - cli4) + (d4 << 1));
214
215 const int mindiff = FFMIN(FFMIN(c1, c2), FFMIN(c3, c4));
216
217 if (mindiff == c4) {
218 return cli4;
219 } else if (mindiff == c2) {
220 return cli2;
221 } else if (mindiff == c3) {
222 return cli3;
223 }
224
225 return cli1;
226}
227
228static int mode09(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
229{
231
232 const int d1 = ma1 - mi1;
233 const int d2 = ma2 - mi2;
234 const int d3 = ma3 - mi3;
235 const int d4 = ma4 - mi4;
236
237 const int mindiff = FFMIN(FFMIN(d1, d2), FFMIN(d3, d4));
238
239 if (mindiff == d4) {
240 return av_clip(c, mi4, ma4);
241 } else if (mindiff == d2) {
242 return av_clip(c, mi2, ma2);
243 } else if (mindiff == d3) {
244 return av_clip(c, mi3, ma3);
245 }
246
247 return av_clip(c, mi1, ma1);
248}
249
250static int mode10(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
251{
252 const int d1 = FFABS(c - a1);
253 const int d2 = FFABS(c - a2);
254 const int d3 = FFABS(c - a3);
255 const int d4 = FFABS(c - a4);
256 const int d5 = FFABS(c - a5);
257 const int d6 = FFABS(c - a6);
258 const int d7 = FFABS(c - a7);
259 const int d8 = FFABS(c - a8);
260
261 const int mindiff = FFMIN(FFMIN(FFMIN(d1, d2), FFMIN(d3, d4)),
262 FFMIN(FFMIN(d5, d6), FFMIN(d7, d8)));
263
264 if (mindiff == d7) return a7;
265 if (mindiff == d8) return a8;
266 if (mindiff == d6) return a6;
267 if (mindiff == d2) return a2;
268 if (mindiff == d3) return a3;
269 if (mindiff == d1) return a1;
270 if (mindiff == d5) return a5;
271
272 return a4;
273}
274
275static int mode1112(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
276{
277 const int sum = 4 * c + 2 * (a2 + a4 + a5 + a7) + a1 + a3 + a6 + a8;
278 const int val = (sum + 8) >> 4;
279
280 return val;
281}
282
283static int mode1314(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
284{
285 const int d1 = FFABS(a1 - a8);
286 const int d2 = FFABS(a2 - a7);
287 const int d3 = FFABS(a3 - a6);
288
289 const int mindiff = FFMIN(FFMIN(d1, d2), d3);
290
291 if (mindiff == d2) {
292 return (a2 + a7 + 1) >> 1;
293 }
294 if (mindiff == d3) {
295 return (a3 + a6 + 1) >> 1;
296 }
297
298 return (a1 + a8 + 1) >> 1;
299}
300
301static int mode1516(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
302{
303 const int d1 = FFABS(a1 - a8);
304 const int d2 = FFABS(a2 - a7);
305 const int d3 = FFABS(a3 - a6);
306
307 const int mindiff = FFMIN(FFMIN(d1, d2), d3);
308 const int average = (2 * (a2 + a7) + a1 + a3 + a6 + a8 + 4) >> 3;
309
310 if (mindiff == d2) {
311 return av_clip(average, FFMIN(a2, a7), FFMAX(a2, a7));
312 }
313 if (mindiff == d3) {
314 return av_clip(average, FFMIN(a3, a6), FFMAX(a3, a6));
315 }
316
317 return av_clip(average, FFMIN(a1, a8), FFMAX(a1, a8));
318}
319
320static int mode17(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
321{
323
324 const int l = FFMAX(FFMAX(mi1, mi2), FFMAX(mi3, mi4));
325 const int u = FFMIN(FFMIN(ma1, ma2), FFMIN(ma3, ma4));
326
327 return av_clip(c, FFMIN(l, u), FFMAX(l, u));
328}
329
330static int mode18(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
331{
332 const int d1 = FFMAX(FFABS(c - a1), FFABS(c - a8));
333 const int d2 = FFMAX(FFABS(c - a2), FFABS(c - a7));
334 const int d3 = FFMAX(FFABS(c - a3), FFABS(c - a6));
335 const int d4 = FFMAX(FFABS(c - a4), FFABS(c - a5));
336
337 const int mindiff = FFMIN(FFMIN(d1, d2), FFMIN(d3, d4));
338
339 if (mindiff == d4) {
340 return av_clip(c, FFMIN(a4, a5), FFMAX(a4, a5));
341 }
342 if (mindiff == d2) {
343 return av_clip(c, FFMIN(a2, a7), FFMAX(a2, a7));
344 }
345 if (mindiff == d3) {
346 return av_clip(c, FFMIN(a3, a6), FFMAX(a3, a6));
347 }
348
349 return av_clip(c, FFMIN(a1, a8), FFMAX(a1, a8));
350}
351
352static int mode19(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
353{
354 const int sum = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8;
355 const int val = (sum + 4) >> 3;
356
357 return val;
358}
359
360static int mode20(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
361{
362 const int sum = a1 + a2 + a3 + a4 + c + a5 + a6 + a7 + a8;
363 const int val = (sum + 4) / 9;
364
365 return val;
366}
367
368static int mode21(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
369{
370 const int l1l = (a1 + a8) >> 1;
371 const int l2l = (a2 + a7) >> 1;
372 const int l3l = (a3 + a6) >> 1;
373 const int l4l = (a4 + a5) >> 1;
374
375 const int l1h = (a1 + a8 + 1) >> 1;
376 const int l2h = (a2 + a7 + 1) >> 1;
377 const int l3h = (a3 + a6 + 1) >> 1;
378 const int l4h = (a4 + a5 + 1) >> 1;
379
380 const int mi = FFMIN(FFMIN(l1l, l2l), FFMIN(l3l, l4l));
381 const int ma = FFMAX(FFMAX(l1h, l2h), FFMAX(l3h, l4h));
382
383 return av_clip(c, mi, ma);
384}
385
386static int mode22(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
387{
388 const int l1 = (a1 + a8 + 1) >> 1;
389 const int l2 = (a2 + a7 + 1) >> 1;
390 const int l3 = (a3 + a6 + 1) >> 1;
391 const int l4 = (a4 + a5 + 1) >> 1;
392
393 const int mi = FFMIN(FFMIN(l1, l2), FFMIN(l3, l4));
394 const int ma = FFMAX(FFMAX(l1, l2), FFMAX(l3, l4));
395
396 return av_clip(c, mi, ma);
397}
398
399static int mode23(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
400{
402
403 const int linediff1 = ma1 - mi1;
404 const int linediff2 = ma2 - mi2;
405 const int linediff3 = ma3 - mi3;
406 const int linediff4 = ma4 - mi4;
407
408 const int u1 = FFMIN(c - ma1, linediff1);
409 const int u2 = FFMIN(c - ma2, linediff2);
410 const int u3 = FFMIN(c - ma3, linediff3);
411 const int u4 = FFMIN(c - ma4, linediff4);
412 const int u = FFMAX(FFMAX(FFMAX(u1, u2), FFMAX(u3, u4)), 0);
413
414 const int d1 = FFMIN(mi1 - c, linediff1);
415 const int d2 = FFMIN(mi2 - c, linediff2);
416 const int d3 = FFMIN(mi3 - c, linediff3);
417 const int d4 = FFMIN(mi4 - c, linediff4);
418 const int d = FFMAX(FFMAX(FFMAX(d1, d2), FFMAX(d3, d4)), 0);
419
420 return c - u + d; // This probably will never overflow.
421}
422
423static int mode24(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
424{
426
427 const int linediff1 = ma1 - mi1;
428 const int linediff2 = ma2 - mi2;
429 const int linediff3 = ma3 - mi3;
430 const int linediff4 = ma4 - mi4;
431
432 const int tu1 = c - ma1;
433 const int tu2 = c - ma2;
434 const int tu3 = c - ma3;
435 const int tu4 = c - ma4;
436
437 const int u1 = FFMIN(tu1, linediff1 - tu1);
438 const int u2 = FFMIN(tu2, linediff2 - tu2);
439 const int u3 = FFMIN(tu3, linediff3 - tu3);
440 const int u4 = FFMIN(tu4, linediff4 - tu4);
441 const int u = FFMAX(FFMAX(FFMAX(u1, u2), FFMAX(u3, u4)), 0);
442
443 const int td1 = mi1 - c;
444 const int td2 = mi2 - c;
445 const int td3 = mi3 - c;
446 const int td4 = mi4 - c;
447
448 const int d1 = FFMIN(td1, linediff1 - td1);
449 const int d2 = FFMIN(td2, linediff2 - td2);
450 const int d3 = FFMIN(td3, linediff3 - td3);
451 const int d4 = FFMIN(td4, linediff4 - td4);
452 const int d = FFMAX(FFMAX(FFMAX(d1, d2), FFMAX(d3, d4)), 0);
453
454 return c - u + d; // This probably will never overflow.
455}
456
457static int config_input(AVFilterLink *inlink)
458{
459 RemoveGrainContext *s = inlink->dst->priv;
461 int i;
462
463 s->nb_planes = av_pix_fmt_count_planes(inlink->format);
464
465 s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
466 s->planeheight[0] = s->planeheight[3] = inlink->h;
467 s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
468 s->planewidth[0] = s->planewidth[3] = inlink->w;
469
470 for (i = 0; i < s->nb_planes; i++) {
471 switch (s->mode[i]) {
472 case 1: s->rg[i] = mode01; break;
473 case 2: s->rg[i] = mode02; break;
474 case 3: s->rg[i] = mode03; break;
475 case 4: s->rg[i] = mode04; break;
476 case 5: s->rg[i] = mode05; break;
477 case 6: s->rg[i] = mode06; break;
478 case 7: s->rg[i] = mode07; break;
479 case 8: s->rg[i] = mode08; break;
480 case 9: s->rg[i] = mode09; break;
481 case 10: s->rg[i] = mode10; break;
482 case 11: s->rg[i] = mode1112; break;
483 case 12: s->rg[i] = mode1112; break;
484 case 13: s->skip_odd = 1;
485 s->rg[i] = mode1314; break;
486 case 14: s->skip_even = 1;
487 s->rg[i] = mode1314; break;
488 case 15: s->skip_odd = 1;
489 s->rg[i] = mode1516; break;
490 case 16: s->skip_even = 1;
491 s->rg[i] = mode1516; break;
492 case 17: s->rg[i] = mode17; break;
493 case 18: s->rg[i] = mode18; break;
494 case 19: s->rg[i] = mode19; break;
495 case 20: s->rg[i] = mode20; break;
496 case 21: s->rg[i] = mode21; break;
497 case 22: s->rg[i] = mode22; break;
498 case 23: s->rg[i] = mode23; break;
499 case 24: s->rg[i] = mode24; break;
500 }
501 }
502
503#if ARCH_X86 && HAVE_X86ASM && CONFIG_GPL
505#endif
506
507 return 0;
508}
509
510typedef struct ThreadData {
511 AVFrame *in, *out;
512 int plane;
513} ThreadData;
514
515static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
516{
517 RemoveGrainContext *s = ctx->priv;
518 ThreadData *td = arg;
519 AVFrame *in = td->in;
520 AVFrame *out = td->out;
521 const int i = td->plane;
522 const int height = s->planeheight[i];
523 const int om = in->linesize[i] - 1;
524 const int o0 = in->linesize[i] ;
525 const int op = in->linesize[i] + 1;
526 int start = ff_slice_pos(height, jobnr, nb_jobs);
527 int end = ff_slice_pos(height, jobnr + 1, nb_jobs);
528 int x, y;
529
530 start = FFMAX(1, start);
531 end = FFMIN(height-1, end);
532 for (y = start; y < end; y++) {
533 uint8_t *dst = out->data[i];
534 uint8_t *src = in->data[i];
535
536 src = in->data[i] + y * in->linesize[i];
537 dst = out->data[i] + y * out->linesize[i];
538
539 if (s->skip_even && !(y & 1)) {
540 memcpy(dst, src, s->planewidth[i]);
541 continue;
542 }
543 if (s->skip_odd && y & 1) {
544 memcpy(dst, src, s->planewidth[i]);
545 continue;
546 }
547
548 *dst++ = *src++;
549
550 if (s->fl[i]) {
551 int w_asm = (s->planewidth[i] - 2) & ~15;
552
553 s->fl[i](dst, src, in->linesize[i], w_asm);
554
555 x = 1 + w_asm;
556 dst += w_asm;
557 src += w_asm;
558 } else
559 x = 1;
560
561 for (; x < s->planewidth[i] - 1; x++) {
562 const int a1 = src[-op];
563 const int a2 = src[-o0];
564 const int a3 = src[-om];
565 const int a4 = src[-1 ];
566 const int c = src[ 0 ];
567 const int a5 = src[ 1 ];
568 const int a6 = src[ om];
569 const int a7 = src[ o0];
570 const int a8 = src[ op];
571
572 const int res = s->rg[i](c, a1, a2, a3, a4, a5, a6, a7, a8);
573
574 *dst = res;
575 dst++, src++;
576 }
577 dst[0] = src[0];
578 }
579
580 return 0;
581}
582
583static int filter_frame(AVFilterLink *inlink, AVFrame *in)
584{
585 AVFilterContext *ctx = inlink->dst;
586 AVFilterLink *outlink = ctx->outputs[0];
587 RemoveGrainContext *s = ctx->priv;
588 ThreadData td;
589 AVFrame *out;
590 int i;
591
592 out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
593 if (!out) {
594 av_frame_free(&in);
595 return AVERROR(ENOMEM);
596 }
598
599 for (i = 0; i < s->nb_planes; i++) {
600 uint8_t *dst = out->data[i];
601 uint8_t *src = in->data[i];
602
603 if (s->mode[i] == 0) {
604 av_image_copy_plane(dst, out->linesize[i],
605 src, in->linesize[i],
606 s->planewidth[i], s->planeheight[i]);
607 continue;
608 }
609
610 memcpy(dst, src, s->planewidth[i]);
611
612 td.in = in; td.out = out; td.plane = i;
614 FFMIN(s->planeheight[i], ff_filter_get_nb_threads(ctx)));
615
616 src = in->data[i] + (s->planeheight[i] - 1) * in->linesize[i];
617 dst = out->data[i] + (s->planeheight[i] - 1) * out->linesize[i];
618 memcpy(dst, src, s->planewidth[i]);
619 }
620
621 av_frame_free(&in);
622 return ff_filter_frame(outlink, out);
623}
624
626 {
627 .name = "default",
628 .type = AVMEDIA_TYPE_VIDEO,
629 .filter_frame = filter_frame,
630 .config_props = config_input,
631 },
632};
633
635 .p.name = "removegrain",
636 .p.description = NULL_IF_CONFIG_SMALL("Remove grain."),
637 .p.priv_class = &removegrain_class,
639 .priv_size = sizeof(RemoveGrainContext),
643};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
static double val(void *priv, double ch)
Definition aeval.c:77
static int config_input(AVFilterLink *inlink)
const FFFilter ff_vf_removegrain
static FILE * out
static AVFormatContext * ctx
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1068
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition avfilter.c:1696
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition avfilter.c:846
Main libavfilter public API header.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define FLAGS
Definition cmdutils.c:598
#define AV_CEIL_RSHIFT(a, b)
Definition common.h:60
#define av_clip
Definition common.h:100
#define av_clip_uint16
Definition common.h:112
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition common.h:74
#define NULL
Definition coverity.c:32
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
Definition dolby_e.c:1067
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
Definition avfilter.h:196
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition avfilter.h:166
#define AVERROR(e)
Definition error.h:45
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition frame.c:599
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
void av_image_copy_plane(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize, int bytewidth, int height)
Copy image plane from src to dst.
Definition imgutils.c:374
int a
misc image utilities
static int op(uint8_t **dst, const uint8_t *dst_end, GetByteContext *gb, int pixel, int count, int *x, int width, int linesize)
Perform decode operation.
Definition anm.c:76
#define u(width, name, range_min, range_max)
Definition cbs_apv.c:68
const char * arg
Definition jacosubdec.c:65
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
static int ff_slice_pos(int total, int jobnr, int nb_jobs)
Compute the boundary index for a slice when work of size total is split into nb_jobs slices.
Definition filters.h:763
#define FILTER_PIXFMTS_ARRAY(array)
Definition filters.h:244
#define AVFILTER_DEFINE_CLASS(fname)
Definition filters.h:478
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
static enum AVPixelFormat pix_fmts[]
Definition libkvazaar.c:296
const char * desc
Definition libsvtav1.c:83
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
#define FFDIFFSIGN(x, y)
Comparator.
Definition macros.h:45
static const uint64_t c2
Definition murmur3.c:53
static const uint64_t c1
Definition murmur3.c:52
AVOptions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3500
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition pixfmt.h:106
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition pixfmt.h:108
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
Definition pixfmt.h:107
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition pixfmt.h:79
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition pixfmt.h:80
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition pixfmt.h:174
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
Definition pixfmt.h:283
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition pixfmt.h:212
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
Definition pixfmt.h:86
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition pixfmt.h:173
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition pixfmt.h:165
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
Definition pixfmt.h:87
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition pixfmt.h:85
#define AV_QSORT(p, num, type, cmp)
Quicksort This sort is fast, and fully inplace but not stable and it is possible to construct input t...
Definition qsort.h:33
void ff_removegrain_init_x86(RemoveGrainContext *rg)
An instance of a filter.
Definition avfilter.h:273
void * priv
private data for use by the filter
Definition avfilter.h:288
A filter pad used for either input or output.
Definition filters.h:40
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition frame.h:493
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition frame.h:517
AVOption.
Definition opt.h:428
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
Used for passing data between threads.
Definition dsddec.c:71
AVFrame * out
int plane
Definition vf_blend.c:61
Definition swscale.c:71
#define cmp_int(a, b, len)
Definition utils.c:823
#define src
Definition vp8dsp.c:248
#define height
Definition dsp.h:89
static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
#define ma
#define mi
static int mode03(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode20(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode22(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode1314(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static int mode19(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode01(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode08(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode18(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode1112(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode24(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode1516(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static const AVFilterPad removegrain_inputs[]
static int config_input(AVFilterLink *inlink)
static int mode02(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode10(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode09(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode04(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static int mode05(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode06(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
#define REMOVE_GRAIN_SORT_AXIS
static int mode23(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static int mode07(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
#define OFFSET(x)
static int mode17(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static const AVOption removegrain_options[]
static int mode21(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
static double a3(void *priv, double x, double y)
Definition vf_xfade.c:2031
static double a2(void *priv, double x, double y)
Definition vf_xfade.c:2030
static double a1(void *priv, double x, double y)
Definition vf_xfade.c:2029
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
Definition video.c:37
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition video.c:89
static double c[64]