FFmpeg  4.4
vf_dblur.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Paul B Mahol
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavutil/imgutils.h"
22 #include "libavutil/opt.h"
23 #include "libavutil/pixdesc.h"
24 #include "avfilter.h"
25 #include "formats.h"
26 #include "internal.h"
27 #include "video.h"
28 
29 typedef struct DBlurContext {
30  const AVClass *class;
31 
32  float angle;
33  float radius;
34  int planes;
35 
36  float b0, b1, q, c, R3;
37 
38  int depth;
39  int planewidth[4];
40  int planeheight[4];
41  float *buffer;
42  int nb_planes;
43 } DBlurContext;
44 
45 #define OFFSET(x) offsetof(DBlurContext, x)
46 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
47 
48 static const AVOption dblur_options[] = {
49  { "angle", "set angle", OFFSET(angle), AV_OPT_TYPE_FLOAT, {.dbl=45}, 0.0, 360, FLAGS },
50  { "radius", "set radius", OFFSET(radius), AV_OPT_TYPE_FLOAT, {.dbl=5}, 1, 8192, FLAGS },
51  { "planes", "set planes to filter", OFFSET(planes), AV_OPT_TYPE_INT, {.i64=0xF}, 0, 0xF, FLAGS },
52  { NULL }
53 };
54 
56 
57 #define f(n, m) (dst[(n) * width + (m)])
58 
60 {
61  DBlurContext *s = ctx->priv;
62  const float b0 = s->b0;
63  const float b1 = s->b1;
64  const float q = s->q;
65  const float c = s->c;
66  float *dst = s->buffer;
67  float g;
68 
69  if (s->R3 > 0) {
70  for (int y = 1; y < height - 1; y++) {
71  g = q * f(0, 0) + c * f(0, 0);
72  for (int x = 0; x < width; x++) {
73  f(y, x) = b0 * f(y, x) + b1 * f(y - 1, x) + g;
74  g = q * f(y, x) + c * f(y - 1, x);
75  }
76  }
77 
78  for (int y = height - 2; y >= 0; y--) {
79  g = q * f(y, width - 1) + c * f(y, width - 1);
80  for (int x = width - 1; x >= 0; x--) {
81  f(y, x) = b0 * f(y, x) + b1 * f(y + 1, x) + g;
82  g = q * f(y, x) + c * f(y + 1, x);
83  }
84  }
85  } else {
86  for (int y = 1; y < height - 1; y++) {
87  g = q * f(0, width - 1) + c * f(0, width - 1);
88  for (int x = width - 1; x >= 0; x--) {
89  f(y, x) = b0 * f(y, x) + b1 * f(y - 1, x) + g;
90  g = q * f(y, x) + c * f(y - 1, x);
91  }
92  }
93 
94  for (int y = height - 2; y >= 0; y--) {
95  g = q * f(y, 0) + c * f(y, 0);
96  for (int x = 0; x < width; x++) {
97  f(y, x) = b0 * f(y, x) + b1 * f(y + 1, x) + g;
98  g = q * f(y, x) + c * f(y + 1, x);
99  }
100  }
101  }
102 
103  return 0;
104 }
105 
106 static void diriir2d(AVFilterContext *ctx, int plane)
107 {
108  DBlurContext *s = ctx->priv;
109  const int width = s->planewidth[plane];
110  const int height = s->planeheight[plane];
111 
113 }
114 
116 {
117  static const enum AVPixelFormat pix_fmts[] = {
137  };
138 
140 }
141 
142 static int config_input(AVFilterLink *inlink)
143 {
145  DBlurContext *s = inlink->dst->priv;
146 
147  s->depth = desc->comp[0].depth;
148  s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
149  s->planewidth[0] = s->planewidth[3] = inlink->w;
150  s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
151  s->planeheight[0] = s->planeheight[3] = inlink->h;
152 
153  s->nb_planes = av_pix_fmt_count_planes(inlink->format);
154 
155  s->buffer = av_malloc_array(FFALIGN(inlink->w, 16), FFALIGN(inlink->h, 16) * sizeof(*s->buffer));
156  if (!s->buffer)
157  return AVERROR(ENOMEM);
158 
159  return 0;
160 }
161 
162 static void set_params(DBlurContext *s, float angle, float r)
163 {
164  float mu, nu, R1, R2, w1, w2;
165  float a0, a1, a2, a3;
166 
167  angle = angle * M_PI / 180.f;
168 
169  mu = cosf(angle);
170  nu = sinf(angle);
171  R1 = (mu * r) * (mu * r);
172  R2 = (nu * r) * (nu * r);
173  s->R3 = mu * nu * r * r;
174  w1 = sqrtf(0.25f + R1);
175  w2 = sqrtf(0.25f + R2);
176  a0 = (w1 + 0.5f) * (w2 + 0.5f) - fabsf(s->R3);
177  a1 = 0.5f + w2 - a0;
178  a2 = 0.5f + w1 - a0;
179  a3 = a0 - w1 - w2;
180  s->b0 = 1.f / a0;
181  s->b1 = -a2 / a0;
182  s->q = -a1 / a0;
183  s->c = -a3 / a0;
184 }
185 
186 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
187 {
188  AVFilterContext *ctx = inlink->dst;
189  DBlurContext *s = ctx->priv;
190  AVFilterLink *outlink = ctx->outputs[0];
191  AVFrame *out;
192  int plane;
193 
194  set_params(s, s->angle, s->radius);
195 
196  if (av_frame_is_writable(in)) {
197  out = in;
198  } else {
199  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
200  if (!out) {
201  av_frame_free(&in);
202  return AVERROR(ENOMEM);
203  }
205  }
206 
207  for (plane = 0; plane < s->nb_planes; plane++) {
208  const int height = s->planeheight[plane];
209  const int width = s->planewidth[plane];
210  float *bptr = s->buffer;
211  const uint8_t *src = in->data[plane];
212  const uint16_t *src16 = (const uint16_t *)in->data[plane];
213  uint8_t *dst = out->data[plane];
214  uint16_t *dst16 = (uint16_t *)out->data[plane];
215  int y, x;
216 
217  if (!(s->planes & (1 << plane))) {
218  if (out != in)
219  av_image_copy_plane(out->data[plane], out->linesize[plane],
220  in->data[plane], in->linesize[plane],
221  width * ((s->depth + 7) / 8), height);
222  continue;
223  }
224 
225  if (s->depth == 8) {
226  for (y = 0; y < height; y++) {
227  for (x = 0; x < width; x++) {
228  bptr[x] = src[x];
229  }
230  bptr += width;
231  src += in->linesize[plane];
232  }
233  } else {
234  for (y = 0; y < height; y++) {
235  for (x = 0; x < width; x++) {
236  bptr[x] = src16[x];
237  }
238  bptr += width;
239  src16 += in->linesize[plane] / 2;
240  }
241  }
242 
243  diriir2d(ctx, plane);
244 
245  bptr = s->buffer;
246  if (s->depth == 8) {
247  for (y = 0; y < height; y++) {
248  for (x = 0; x < width; x++) {
249  dst[x] = bptr[x];
250  }
251  bptr += width;
252  dst += out->linesize[plane];
253  }
254  } else {
255  for (y = 0; y < height; y++) {
256  for (x = 0; x < width; x++) {
257  dst16[x] = bptr[x];
258  }
259  bptr += width;
260  dst16 += out->linesize[plane] / 2;
261  }
262  }
263  }
264 
265  if (out != in)
266  av_frame_free(&in);
267  return ff_filter_frame(outlink, out);
268 }
269 
271 {
272  DBlurContext *s = ctx->priv;
273 
274  av_freep(&s->buffer);
275 }
276 
277 static const AVFilterPad dblur_inputs[] = {
278  {
279  .name = "default",
280  .type = AVMEDIA_TYPE_VIDEO,
281  .config_props = config_input,
282  .filter_frame = filter_frame,
283  },
284  { NULL }
285 };
286 
287 static const AVFilterPad dblur_outputs[] = {
288  {
289  .name = "default",
290  .type = AVMEDIA_TYPE_VIDEO,
291  },
292  { NULL }
293 };
294 
296  .name = "dblur",
297  .description = NULL_IF_CONFIG_SMALL("Apply Directional Blur filter."),
298  .priv_size = sizeof(DBlurContext),
299  .priv_class = &dblur_class,
300  .uninit = uninit,
302  .inputs = dblur_inputs,
306 };
static const AVFilterPad inputs[]
Definition: af_acontrast.c:193
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
Definition: af_acrusher.c:336
#define av_cold
Definition: attributes.h:88
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
uint8_t
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1094
int ff_filter_process_command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Generic processing of user supplied commands that are set in the same way as the filter options.
Definition: avfilter.c:882
Main libavfilter public API header.
#define flags(name, subs,...)
Definition: cbs_av1.c:561
#define s(width, name)
Definition: cbs_vp9.c:257
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:58
#define NULL
Definition: coverity.c:32
static __device__ float fabsf(float a)
Definition: cuda_runtime.h:181
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:587
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:286
@ AV_OPT_TYPE_INT
Definition: opt.h:225
@ AV_OPT_TYPE_FLOAT
Definition: opt.h:228
#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:126
#define AVERROR(e)
Definition: error.h:43
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
Definition: frame.c:594
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:203
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:658
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
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:373
misc image utilities
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:303
#define sinf(x)
Definition: libm.h:419
#define cosf(x)
Definition: libm.h:78
const char * desc
Definition: libsvtav1.c:79
static const struct @322 planes[]
#define FFALIGN(x, a)
Definition: macros.h:48
#define M_PI
Definition: mathematics.h:52
AVOptions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2613
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2573
#define AV_PIX_FMT_GBRAP12
Definition: pixfmt.h:420
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:410
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:406
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:398
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:399
#define AV_PIX_FMT_YUV440P12
Definition: pixfmt.h:405
#define AV_PIX_FMT_GRAY9
Definition: pixfmt.h:379
#define AV_PIX_FMT_GBRAP16
Definition: pixfmt.h:421
#define AV_PIX_FMT_GBRP9
Definition: pixfmt.h:414
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:397
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:438
#define AV_PIX_FMT_YUVA420P16
Definition: pixfmt.h:441
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:403
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:436
#define AV_PIX_FMT_YUVA422P9
Definition: pixfmt.h:434
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:404
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:415
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:400
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:381
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:416
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:396
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:433
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:437
#define AV_PIX_FMT_YUV420P14
Definition: pixfmt.h:407
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:99
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:74
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:101
@ 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:100
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:72
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:73
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:71
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:177
@ 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:258
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:215
@ 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:79
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition: pixfmt.h:176
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:168
@ 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:80
@ 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:78
#define AV_PIX_FMT_YUVA422P12
Definition: pixfmt.h:439
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:408
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:380
#define AV_PIX_FMT_GRAY14
Definition: pixfmt.h:382
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:411
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:383
#define AV_PIX_FMT_GBRAP10
Definition: pixfmt.h:419
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:443
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:442
#define AV_PIX_FMT_GBRP16
Definition: pixfmt.h:418
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:409
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:435
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:417
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:440
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:412
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:402
#define a3
Definition: regdef.h:49
#define a2
Definition: regdef.h:48
#define a0
Definition: regdef.h:46
#define a1
Definition: regdef.h:47
#define R2
Definition: simple_idct.c:173
#define R1
Definition: simple_idct.c:172
Describe the class of an AVClass context structure.
Definition: log.h:67
An instance of a filter.
Definition: avfilter.h:341
void * priv
private data for use by the filter
Definition: avfilter.h:356
A filter pad used for either input or output.
Definition: internal.h:54
const char * name
Pad name.
Definition: internal.h:60
Filter definition.
Definition: avfilter.h:145
const char * name
Filter name.
Definition: avfilter.h:149
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
AVOption.
Definition: opt.h:248
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:81
int planewidth[4]
Definition: vf_dblur.c:39
float radius
Definition: vf_dblur.c:33
float b1
Definition: vf_dblur.c:36
float R3
Definition: vf_dblur.c:36
int planes
Definition: vf_dblur.c:34
int planeheight[4]
Definition: vf_dblur.c:40
float * buffer
Definition: vf_dblur.c:41
float q
Definition: vf_dblur.c:36
float c
Definition: vf_dblur.c:36
int nb_planes
Definition: vf_dblur.c:42
float b0
Definition: vf_dblur.c:36
float angle
Definition: vf_dblur.c:32
#define av_malloc_array(a, b)
#define av_freep(p)
#define src
Definition: vp8dsp.c:255
FILE * out
Definition: movenc.c:54
AVFormatContext * ctx
Definition: movenc.c:48
#define height
#define width
const char * g
Definition: vf_curves.c:117
const char * r
Definition: vf_curves.c:116
AVFilter ff_vf_dblur
Definition: vf_dblur.c:295
static const AVFilterPad dblur_outputs[]
Definition: vf_dblur.c:287
static int query_formats(AVFilterContext *ctx)
Definition: vf_dblur.c:115
static int config_input(AVFilterLink *inlink)
Definition: vf_dblur.c:142
#define f(n, m)
Definition: vf_dblur.c:57
#define FLAGS
Definition: vf_dblur.c:46
static void set_params(DBlurContext *s, float angle, float r)
Definition: vf_dblur.c:162
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
Definition: vf_dblur.c:186
static int filter_horizontally(AVFilterContext *ctx, int width, int height)
Definition: vf_dblur.c:59
static av_cold void uninit(AVFilterContext *ctx)
Definition: vf_dblur.c:270
static const AVOption dblur_options[]
Definition: vf_dblur.c:48
static const AVFilterPad dblur_inputs[]
Definition: vf_dblur.c:277
#define OFFSET(x)
Definition: vf_dblur.c:45
AVFILTER_DEFINE_CLASS(dblur)
static void diriir2d(AVFilterContext *ctx, int plane)
Definition: vf_dblur.c:106
static double b1(void *priv, double x, double y)
Definition: vf_xfade.c:1665
static double b0(void *priv, double x, double y)
Definition: vf_xfade.c:1664
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:99
static double c[64]