FFmpeg
Loading...
Searching...
No Matches
vf_unsharp.c
Go to the documentation of this file.
1/*
2 * Original copyright (c) 2002 Remi Guyomarch <rguyom@pobox.com>
3 * Port copyright (c) 2010 Daniel G. Taylor <dan@programmer-art.org>
4 * Relicensed to the LGPL with permission from Remi Guyomarch.
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/**
24 * @file
25 * blur / sharpen filter, ported to FFmpeg from MPlayer
26 * libmpcodecs/unsharp.c.
27 *
28 * This code is based on:
29 *
30 * An Efficient algorithm for Gaussian blur using finite-state machines
31 * Frederick M. Waltz and John W. V. Miller
32 *
33 * SPIE Conf. on Machine Vision Systems for Inspection and Metrology VII
34 * Originally published Boston, Nov 98
35 *
36 * http://www.engin.umd.umich.edu/~jwvm/ece581/21_GBlur.pdf
37 */
38
39#include "avfilter.h"
40#include "filters.h"
41#include "video.h"
42#include "libavutil/common.h"
43#include "libavutil/imgutils.h"
44#include "libavutil/mem.h"
45#include "libavutil/opt.h"
46#include "libavutil/pixdesc.h"
47
48#define MIN_MATRIX_SIZE 3
49#define MAX_MATRIX_SIZE 63
50
51typedef struct UnsharpFilterParam {
52 int msize_x; ///< matrix width
53 int msize_y; ///< matrix height
54 int amount; ///< effect amount
55 int steps_x; ///< horizontal step count
56 int steps_y; ///< vertical step count
57 int scalebits; ///< bits to shift pixel
58 int32_t halfscale; ///< amount to add to pixel
59 uint32_t *sr; ///< finite state machine storage within a row
60 uint32_t **sc; ///< finite state machine storage across rows
62
63typedef struct UnsharpContext {
64 const AVClass *class;
68 float aamount;
69 UnsharpFilterParam luma; ///< luma parameters (width, height, amount)
70 UnsharpFilterParam chroma; ///< chroma parameters (width, height, amount)
71 UnsharpFilterParam alpha; ///< alpha parameters (width, height, amount)
72 int hsub, vsub;
75 int bps;
77 int (* unsharp_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
79
80typedef struct TheadData {
82 uint8_t *dst;
83 const uint8_t *src;
86 int width;
87 int height;
89
90#define DEF_UNSHARP_SLICE_FUNC(name, nbits) \
91static int name##_##nbits(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \
92{ \
93 ThreadData *td = arg; \
94 UnsharpFilterParam *fp = td->fp; \
95 UnsharpContext *s = ctx->priv; \
96 uint32_t **sc = fp->sc; \
97 uint32_t *sr = fp->sr; \
98 const uint##nbits##_t *src2 = NULL; \
99 const int amount = fp->amount; \
100 const int steps_x = fp->steps_x; \
101 const int steps_y = fp->steps_y; \
102 const int scalebits = fp->scalebits; \
103 const int32_t halfscale = fp->halfscale; \
104 \
105 uint##nbits##_t *dst = (uint##nbits##_t*)td->dst; \
106 const uint##nbits##_t *src = (const uint##nbits##_t *)td->src; \
107 int dst_stride = td->dst_stride; \
108 int src_stride = td->src_stride; \
109 const int width = td->width; \
110 const int height = td->height; \
111 const int sc_offset = jobnr * 2 * steps_y; \
112 const int sr_offset = jobnr * (MAX_MATRIX_SIZE - 1); \
113 const int slice_start = ff_slice_pos(height, jobnr, nb_jobs); \
114 const int slice_end = ff_slice_pos(height, jobnr + 1, nb_jobs); \
115 \
116 int32_t res; \
117 int x, y, z; \
118 uint32_t tmp1, tmp2; \
119 \
120 if (!amount) { \
121 av_image_copy_plane(td->dst + slice_start * dst_stride, dst_stride, \
122 td->src + slice_start * src_stride, src_stride, \
123 width * s->bps, slice_end - slice_start); \
124 return 0; \
125 } \
126 \
127 for (y = 0; y < 2 * steps_y; y++) \
128 memset(sc[sc_offset + y], 0, sizeof(sc[y][0]) * (width + 2 * steps_x)); \
129 \
130 dst_stride = dst_stride / s->bps; \
131 src_stride = src_stride / s->bps; \
132 /* if this is not the first tile, we start from (slice_start - steps_y) */ \
133 /* so we can get smooth result at slice boundary */ \
134 if (slice_start > steps_y) { \
135 src += (slice_start - steps_y) * src_stride; \
136 dst += (slice_start - steps_y) * dst_stride; \
137 } \
138 \
139 for (y = -steps_y + slice_start; y < steps_y + slice_end; y++) { \
140 if (y < height) \
141 src2 = src; \
142 \
143 memset(sr + sr_offset, 0, sizeof(sr[0]) * (2 * steps_x - 1)); \
144 for (x = -steps_x; x < width + steps_x; x++) { \
145 tmp1 = x <= 0 ? src2[0] : x >= width ? src2[width-1] : src2[x]; \
146 for (z = 0; z < steps_x * 2; z += 2) { \
147 tmp2 = sr[sr_offset + z + 0] + tmp1; sr[sr_offset + z + 0] = tmp1; \
148 tmp1 = sr[sr_offset + z + 1] + tmp2; sr[sr_offset + z + 1] = tmp2; \
149 } \
150 for (z = 0; z < steps_y * 2; z += 2) { \
151 tmp2 = sc[sc_offset + z + 0][x + steps_x] + tmp1; \
152 sc[sc_offset + z + 0][x + steps_x] = tmp1; \
153 tmp1 = sc[sc_offset + z + 1][x + steps_x] + tmp2; \
154 sc[sc_offset + z + 1][x + steps_x] = tmp2; \
155 } \
156 if (x >= steps_x && y >= (steps_y + slice_start)) { \
157 const uint##nbits##_t *srx = src - steps_y * src_stride + x - steps_x; \
158 uint##nbits##_t *dsx = dst - steps_y * dst_stride + x - steps_x; \
159 \
160 res = (int32_t)*srx + (int32_t)(((int64_t)((int32_t)*srx - \
161 (int32_t)((tmp1 + halfscale) >> scalebits)) * amount) >> 16); \
162 *dsx = av_clip_uintp2(res, s->bitdepth); \
163 } \
164 } \
165 if (y >= 0) { \
166 dst += dst_stride; \
167 src += src_stride; \
168 } \
169 } \
170 return 0; \
171}
172DEF_UNSHARP_SLICE_FUNC(unsharp_slice, 16)
173DEF_UNSHARP_SLICE_FUNC(unsharp_slice, 8)
174
176{
177 AVFilterLink *inlink = ctx->inputs[0];
178 UnsharpContext *s = ctx->priv;
179 int i, plane_w[4], plane_h[4];
180 UnsharpFilterParam *fp[4];
181 ThreadData td;
182
183 plane_w[0] = plane_w[3] = inlink->w;
184 plane_w[1] = plane_w[2] = AV_CEIL_RSHIFT(inlink->w, s->hsub);
185 plane_h[0] = plane_h[3] = inlink->h;
186 plane_h[1] = plane_h[2] = AV_CEIL_RSHIFT(inlink->h, s->vsub);
187 fp[0] = &s->luma;
188 fp[1] = fp[2] = &s->chroma;
189 fp[3] = &s->alpha;
190 for (i = 0; i < s->nb_planes; i++) {
191 td.fp = fp[i];
192 td.dst = out->data[i];
193 td.src = in->data[i];
194 td.width = plane_w[i];
195 td.height = plane_h[i];
196 td.dst_stride = out->linesize[i];
197 td.src_stride = in->linesize[i];
198 ff_filter_execute(ctx, s->unsharp_slice, &td, NULL,
199 FFMIN(plane_h[i], s->nb_threads));
200 }
201 return 0;
202}
203
204#define MAX_SCALEBITS 25
205
206static int set_filter_param(AVFilterContext *ctx, const char *name, const char *short_name,
207 UnsharpFilterParam *fp, int msize_x, int msize_y, float amount)
208{
209 fp->msize_x = msize_x;
210 fp->msize_y = msize_y;
211 fp->amount = amount * 65536.0;
212
213 fp->steps_x = msize_x / 2;
214 fp->steps_y = msize_y / 2;
215 fp->scalebits = (fp->steps_x + fp->steps_y) * 2;
216 fp->halfscale = 1 << (fp->scalebits - 1);
217
218 if (fp->scalebits > MAX_SCALEBITS) {
219 av_log(ctx, AV_LOG_ERROR, "%s matrix size (%sx/2+%sy/2)*2=%d greater than maximum value %d\n",
220 name, short_name, short_name, fp->scalebits, MAX_SCALEBITS);
221 return AVERROR(EINVAL);
222 }
223
224 return 0;
225}
226
228{
229 UnsharpContext *s = ctx->priv;
230 int ret;
231
232#define SET_FILTER_PARAM(name_, short_) \
233 ret = set_filter_param(ctx, #name_, #short_, &s->name_, \
234 s->short_##msize_x, s->short_##msize_y, s->short_##amount); \
235 if (ret < 0) \
236 return ret; \
237
238 SET_FILTER_PARAM(luma, l);
241
242 return 0;
243}
244
258
259static int init_filter_param(AVFilterContext *ctx, UnsharpFilterParam *fp, const char *effect_type, int width)
260{
261 int z;
262 UnsharpContext *s = ctx->priv;
263 const char *effect = fp->amount == 0 ? "none" : fp->amount < 0 ? "blur" : "sharpen";
264
265 if (!(fp->msize_x & fp->msize_y & 1)) {
267 "Invalid even size for %s matrix size %dx%d\n",
268 effect_type, fp->msize_x, fp->msize_y);
269 return AVERROR(EINVAL);
270 }
271
272 av_log(ctx, AV_LOG_VERBOSE, "effect:%s type:%s msize_x:%d msize_y:%d amount:%0.2f\n",
273 effect, effect_type, fp->msize_x, fp->msize_y, fp->amount / 65535.0);
274
275 fp->sr = av_malloc_array((MAX_MATRIX_SIZE - 1) * s->nb_threads, sizeof(uint32_t));
276 fp->sc = av_calloc(fp->steps_y * s->nb_threads, 2 * sizeof(*fp->sc));
277 if (!fp->sr || !fp->sc)
278 return AVERROR(ENOMEM);
279
280 for (z = 0; z < 2 * fp->steps_y * s->nb_threads; z++)
281 if (!(fp->sc[z] = av_malloc_array(width + 2 * fp->steps_x,
282 sizeof(*(fp->sc[z])))))
283 return AVERROR(ENOMEM);
284
285 return 0;
286}
287
288static int config_input(AVFilterLink *inlink)
289{
290 UnsharpContext *s = inlink->dst->priv;
292 int ret;
293
294 s->nb_planes = desc->nb_components;
295 s->hsub = desc->log2_chroma_w;
296 s->vsub = desc->log2_chroma_h;
297 s->bitdepth = desc->comp[0].depth;
298 s->bps = s->bitdepth > 8 ? 2 : 1;
299 s->unsharp_slice = s->bitdepth > 8 ? unsharp_slice_16 : unsharp_slice_8;
300
301 // ensure (height / nb_threads) > 4 * steps_y,
302 // so that we don't have too much overlap between two threads
303 s->nb_threads = FFMIN(ff_filter_get_nb_threads(inlink->dst),
304 inlink->h / (4 * s->luma.steps_y));
305
306 ret = init_filter_param(inlink->dst, &s->luma, "luma", inlink->w);
307 if (ret < 0)
308 return ret;
309 ret = init_filter_param(inlink->dst, &s->chroma, "chroma", AV_CEIL_RSHIFT(inlink->w, s->hsub));
310 if (ret < 0)
311 return ret;
312
313 return 0;
314}
315
316static void free_filter_param(UnsharpFilterParam *fp, int nb_threads)
317{
318 int z;
319
320 if (fp->sc) {
321 for (z = 0; z < 2 * fp->steps_y * nb_threads; z++)
322 av_freep(&fp->sc[z]);
323 av_freep(&fp->sc);
324 }
325 av_freep(&fp->sr);
326}
327
329{
330 UnsharpContext *s = ctx->priv;
331
332 free_filter_param(&s->luma, s->nb_threads);
333 free_filter_param(&s->chroma, s->nb_threads);
334}
335
336static int filter_frame(AVFilterLink *link, AVFrame *in)
337{
338 AVFilterLink *outlink = link->dst->outputs[0];
339 AVFrame *out;
340 int ret = 0;
341
342 out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
343 if (!out) {
344 av_frame_free(&in);
345 return AVERROR(ENOMEM);
346 }
348
349 ret = apply_unsharp(link->dst, in, out);
350
351 av_frame_free(&in);
352
353 if (ret < 0) {
355 return ret;
356 }
357 return ff_filter_frame(outlink, out);
358}
359
360#define OFFSET(x) offsetof(UnsharpContext, x)
361#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
362#define MIN_SIZE 3
363#define MAX_SIZE 23
364static const AVOption unsharp_options[] = {
365 { "luma_msize_x", "set luma matrix horizontal size", OFFSET(lmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
366 { "lx", "set luma matrix horizontal size", OFFSET(lmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
367 { "luma_msize_y", "set luma matrix vertical size", OFFSET(lmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
368 { "ly", "set luma matrix vertical size", OFFSET(lmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
369 { "luma_amount", "set luma effect strength", OFFSET(lamount), AV_OPT_TYPE_FLOAT, { .dbl = 1 }, -2, 5, FLAGS },
370 { "la", "set luma effect strength", OFFSET(lamount), AV_OPT_TYPE_FLOAT, { .dbl = 1 }, -2, 5, FLAGS },
371 { "chroma_msize_x", "set chroma matrix horizontal size", OFFSET(cmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
372 { "cx", "set chroma matrix horizontal size", OFFSET(cmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
373 { "chroma_msize_y", "set chroma matrix vertical size", OFFSET(cmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
374 { "cy", "set chroma matrix vertical size", OFFSET(cmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
375 { "chroma_amount", "set chroma effect strength", OFFSET(camount), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, -2, 5, FLAGS },
376 { "ca", "set chroma effect strength", OFFSET(camount), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, -2, 5, FLAGS },
377 { "alpha_msize_x", "set alpha matrix horizontal size", OFFSET(amsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
378 { "ax", "set alpha matrix horizontal size", OFFSET(amsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
379 { "alpha_msize_y", "set alpha matrix vertical size", OFFSET(amsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
380 { "ay", "set alpha matrix vertical size", OFFSET(amsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
381 { "alpha_amount", "set alpha effect strength", OFFSET(aamount), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, -2, 5, FLAGS },
382 { "aa", "set alpha effect strength", OFFSET(aamount), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, -2, 5, FLAGS },
383 { NULL }
384};
385
387
389 {
390 .name = "default",
391 .type = AVMEDIA_TYPE_VIDEO,
392 .filter_frame = filter_frame,
393 .config_props = config_input,
394 },
395};
396
398 .p.name = "unsharp",
399 .p.description = NULL_IF_CONFIG_SMALL("Sharpen or blur the input video."),
400 .p.priv_class = &unsharp_class,
402 .priv_size = sizeof(UnsharpContext),
403 .init = init,
404 .uninit = uninit,
408};
static int config_input(AVFilterLink *inlink)
const FFFilter ff_vf_unsharp
Definition vf_unsharp.c:397
int32_t
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.
#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
common internal and external API header
#define AV_CEIL_RSHIFT(a, b)
Definition common.h:60
#define NULL
Definition coverity.c:32
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
Definition dolby_e.c:1067
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
Definition opt.h:270
#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
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
int a
static const int16_t alpha[]
Definition ilbcdata.h:55
misc image utilities
static av_cold void uninit(AVBitStreamFilterContext *ctx)
const char * arg
Definition jacosubdec.c:65
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define FILTER_PIXFMTS_ARRAY(array)
Definition filters.h:244
#define AVFILTER_DEFINE_CLASS(fname)
Definition filters.h:478
#define av_cold
Definition attributes.h:117
#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
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:264
Memory handling functions.
AVOptions.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_YUV420P16
Definition pixfmt.h:556
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:552
#define AV_PIX_FMT_YUV444P9
Definition pixfmt.h:544
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
#define AV_PIX_FMT_YUV440P12
Definition pixfmt.h:551
#define AV_PIX_FMT_YUV422P9
Definition pixfmt.h:543
#define AV_PIX_FMT_YUVA444P10
Definition pixfmt.h:598
#define AV_PIX_FMT_YUVA420P16
Definition pixfmt.h:601
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:549
#define AV_PIX_FMT_YUVA420P10
Definition pixfmt.h:596
#define AV_PIX_FMT_YUVA422P9
Definition pixfmt.h:594
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:550
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
#define AV_PIX_FMT_YUV420P9
Definition pixfmt.h:542
#define AV_PIX_FMT_YUVA420P9
Definition pixfmt.h:593
#define AV_PIX_FMT_YUVA422P10
Definition pixfmt.h:597
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_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_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_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_PIX_FMT_YUVA422P12
Definition pixfmt.h:599
#define AV_PIX_FMT_YUV422P16
Definition pixfmt.h:557
#define AV_PIX_FMT_YUV440P10
Definition pixfmt.h:547
#define AV_PIX_FMT_YUVA444P16
Definition pixfmt.h:603
#define AV_PIX_FMT_YUVA422P16
Definition pixfmt.h:602
#define AV_PIX_FMT_YUVA444P9
Definition pixfmt.h:595
#define AV_PIX_FMT_YUVA444P12
Definition pixfmt.h:600
#define AV_PIX_FMT_YUV444P16
Definition pixfmt.h:558
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
const char * name
Definition qsvenc.c:142
Describe the class of an AVClass context structure.
Definition log.h:76
An instance of a filter.
Definition avfilter.h:273
void * priv
private data for use by the filter
Definition avfilter.h:288
AVFilterLink ** outputs
array of pointers to output links
Definition avfilter.h:285
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
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
int src_stride
Definition vf_unsharp.c:85
UnsharpFilterParam * fp
Definition vf_unsharp.c:81
const uint8_t * src
Definition vf_bm3d.c:54
int dst_stride
Definition vf_unsharp.c:84
AVFrame * dst
Definition vf_blend.c:59
UnsharpFilterParam luma
luma parameters (width, height, amount)
Definition vf_unsharp.c:69
UnsharpFilterParam chroma
chroma parameters (width, height, amount)
Definition vf_unsharp.c:70
int(* unsharp_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_unsharp.c:77
UnsharpFilterParam alpha
alpha parameters (width, height, amount)
Definition vf_unsharp.c:71
int amount
effect amount
Definition vf_unsharp.c:54
int32_t halfscale
amount to add to pixel
Definition vf_unsharp.c:58
int steps_y
vertical step count
Definition vf_unsharp.c:56
uint32_t * sr
finite state machine storage within a row
Definition vf_unsharp.c:59
uint32_t ** sc
finite state machine storage across rows
Definition vf_unsharp.c:60
int msize_y
matrix height
Definition vf_unsharp.c:53
int msize_x
matrix width
Definition vf_unsharp.c:52
int steps_x
horizontal step count
Definition vf_unsharp.c:55
int scalebits
bits to shift pixel
Definition vf_unsharp.c:57
#define av_malloc_array(a, b)
#define av_freep(p)
#define av_log(a,...)
static FILE * out
Definition movenc.c:55
static AVFormatContext * ctx
Definition movenc.c:49
#define width
Definition dsp.h:89
#define MAX_SIZE
Definition vf_colormap.c:35
static int apply_unsharp(AVFilterContext *ctx, AVFrame *in, AVFrame *out)
Definition vf_unsharp.c:175
#define MIN_SIZE
Definition vf_unsharp.c:362
static void free_filter_param(UnsharpFilterParam *fp, int nb_threads)
Definition vf_unsharp.c:316
static int filter_frame(AVFilterLink *link, AVFrame *in)
Definition vf_unsharp.c:336
static const AVFilterPad avfilter_vf_unsharp_inputs[]
Definition vf_unsharp.c:388
static int config_input(AVFilterLink *inlink)
Definition vf_unsharp.c:288
static int init_filter_param(AVFilterContext *ctx, UnsharpFilterParam *fp, const char *effect_type, int width)
Definition vf_unsharp.c:259
static int set_filter_param(AVFilterContext *ctx, const char *name, const char *short_name, UnsharpFilterParam *fp, int msize_x, int msize_y, float amount)
Definition vf_unsharp.c:206
#define MAX_MATRIX_SIZE
Definition vf_unsharp.c:49
static av_cold void uninit(AVFilterContext *ctx)
Definition vf_unsharp.c:328
#define DEF_UNSHARP_SLICE_FUNC(name, nbits)
Definition vf_unsharp.c:90
#define MAX_SCALEBITS
Definition vf_unsharp.c:204
#define SET_FILTER_PARAM(name_, short_)
#define OFFSET(x)
Definition vf_unsharp.c:360
static const AVOption unsharp_options[]
Definition vf_unsharp.c:364
static av_always_inline void chroma(WaveformContext *s, AVFrame *in, AVFrame *out, int component, int intensity, int offset_y, int offset_x, int column, int mirror, int jobnr, int nb_jobs)
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]