FFmpeg
vf_deband.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Niklas Haas
3  * Copyright (c) 2015 Paul B Mahol
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23 
24 #include "libavutil/mem.h"
25 #include "libavutil/opt.h"
26 #include "libavutil/pixdesc.h"
27 #include "avfilter.h"
28 #include "formats.h"
29 #include "internal.h"
30 #include "video.h"
31 
32 typedef struct DebandContext {
33  const AVClass *class;
34 
35  int coupling;
36  float threshold[4];
37  int range;
38  int blur;
39  float direction;
40 
42  int planewidth[4];
43  int planeheight[4];
44  int shift[2];
45  int thr[4];
46 
47  int *x_pos;
48  int *y_pos;
49 
50  int (*deband)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
52 
53 #define OFFSET(x) offsetof(DebandContext, x)
54 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
55 
56 static const AVOption deband_options[] = {
57  { "1thr", "set 1st plane threshold", OFFSET(threshold[0]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0.00003, 0.5, FLAGS },
58  { "2thr", "set 2nd plane threshold", OFFSET(threshold[1]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0.00003, 0.5, FLAGS },
59  { "3thr", "set 3rd plane threshold", OFFSET(threshold[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0.00003, 0.5, FLAGS },
60  { "4thr", "set 4th plane threshold", OFFSET(threshold[3]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0.00003, 0.5, FLAGS },
61  { "range", "set range", OFFSET(range), AV_OPT_TYPE_INT, {.i64=16}, INT_MIN, INT_MAX, FLAGS },
62  { "r", "set range", OFFSET(range), AV_OPT_TYPE_INT, {.i64=16}, INT_MIN, INT_MAX, FLAGS },
63  { "direction", "set direction", OFFSET(direction), AV_OPT_TYPE_FLOAT, {.dbl=2*M_PI},-2*M_PI, 2*M_PI, FLAGS },
64  { "d", "set direction", OFFSET(direction), AV_OPT_TYPE_FLOAT, {.dbl=2*M_PI},-2*M_PI, 2*M_PI, FLAGS },
65  { "blur", "set blur", OFFSET(blur), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
66  { "b", "set blur", OFFSET(blur), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
67  { "coupling", "set plane coupling", OFFSET(coupling), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
68  { "c", "set plane coupling", OFFSET(coupling), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
69  { NULL }
70 };
71 
72 AVFILTER_DEFINE_CLASS(deband);
73 
75 {
76  DebandContext *s = ctx->priv;
77 
78  static const enum AVPixelFormat pix_fmts[] = {
98  };
99 
100  static const enum AVPixelFormat cpix_fmts[] = {
111  };
112 
113  return ff_set_common_formats_from_list(ctx, s->coupling ? cpix_fmts : pix_fmts);
114 }
115 
116 static float frand(int x, int y)
117 {
118  const float r = sinf(x * 12.9898f + y * 78.233f) * 43758.545f;
119 
120  return r - floorf(r);
121 }
122 
123 static int inline get_avg(int ref0, int ref1, int ref2, int ref3)
124 {
125  return (ref0 + ref1 + ref2 + ref3) / 4;
126 }
127 
128 typedef struct ThreadData {
129  AVFrame *in, *out;
130 } ThreadData;
131 
132 static int deband_8_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
133 {
134  DebandContext *s = ctx->priv;
135  ThreadData *td = arg;
136  AVFrame *in = td->in;
137  AVFrame *out = td->out;
138  int x, y, p;
139 
140  for (p = 0; p < s->nb_components; p++) {
141  const uint8_t *src_ptr = (const uint8_t *)in->data[p];
142  uint8_t *dst_ptr = (uint8_t *)out->data[p];
143  const int dst_linesize = out->linesize[p];
144  const int src_linesize = in->linesize[p];
145  const int thr = s->thr[p];
146  const int start = (s->planeheight[p] * jobnr ) / nb_jobs;
147  const int end = (s->planeheight[p] * (jobnr+1)) / nb_jobs;
148  const int w = s->planewidth[p] - 1;
149  const int h = s->planeheight[p] - 1;
150 
151  for (y = start; y < end; y++) {
152  const int pos = y * s->planewidth[0];
153 
154  for (x = 0; x < s->planewidth[p]; x++) {
155  const int x_pos = s->x_pos[pos + x];
156  const int y_pos = s->y_pos[pos + x];
157  const int ref0 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
158  const int ref1 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
159  const int ref2 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
160  const int ref3 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
161  const int src0 = src_ptr[y * src_linesize + x];
162 
163  if (s->blur) {
164  const int avg = get_avg(ref0, ref1, ref2, ref3);
165  const int diff = FFABS(src0 - avg);
166 
167  dst_ptr[y * dst_linesize + x] = diff < thr ? avg : src0;
168  } else {
169  dst_ptr[y * dst_linesize + x] = (FFABS(src0 - ref0) < thr) &&
170  (FFABS(src0 - ref1) < thr) &&
171  (FFABS(src0 - ref2) < thr) &&
172  (FFABS(src0 - ref3) < thr) ? get_avg(ref0, ref1, ref2, ref3) : src0;
173  }
174  }
175  }
176  }
177 
178  return 0;
179 }
180 
181 static int deband_8_coupling_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
182 {
183  DebandContext *s = ctx->priv;
184  ThreadData *td = arg;
185  AVFrame *in = td->in;
186  AVFrame *out = td->out;
187  const int start = (s->planeheight[0] * jobnr ) / nb_jobs;
188  const int end = (s->planeheight[0] * (jobnr+1)) / nb_jobs;
189  int x, y, p;
190 
191  for (y = start; y < end; y++) {
192  const int pos = y * s->planewidth[0];
193 
194  for (x = 0; x < s->planewidth[0]; x++) {
195  const int x_pos = s->x_pos[pos + x];
196  const int y_pos = s->y_pos[pos + x];
197  int avg[4], cmp[4] = { 0 }, src[4];
198 
199  for (p = 0; p < s->nb_components; p++) {
200  const uint8_t *src_ptr = (const uint8_t *)in->data[p];
201  const int src_linesize = in->linesize[p];
202  const int thr = s->thr[p];
203  const int w = s->planewidth[p] - 1;
204  const int h = s->planeheight[p] - 1;
205  const int ref0 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
206  const int ref1 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
207  const int ref2 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
208  const int ref3 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
209  const int src0 = src_ptr[y * src_linesize + x];
210 
211  src[p] = src0;
212  avg[p] = get_avg(ref0, ref1, ref2, ref3);
213 
214  if (s->blur) {
215  cmp[p] = FFABS(src0 - avg[p]) < thr;
216  } else {
217  cmp[p] = (FFABS(src0 - ref0) < thr) &&
218  (FFABS(src0 - ref1) < thr) &&
219  (FFABS(src0 - ref2) < thr) &&
220  (FFABS(src0 - ref3) < thr);
221  }
222  }
223 
224  for (p = 0; p < s->nb_components; p++)
225  if (!cmp[p])
226  break;
227  if (p == s->nb_components) {
228  for (p = 0; p < s->nb_components; p++) {
229  const int dst_linesize = out->linesize[p];
230 
231  out->data[p][y * dst_linesize + x] = avg[p];
232  }
233  } else {
234  for (p = 0; p < s->nb_components; p++) {
235  const int dst_linesize = out->linesize[p];
236 
237  out->data[p][y * dst_linesize + x] = src[p];
238  }
239  }
240  }
241  }
242 
243  return 0;
244 }
245 
246 static int deband_16_coupling_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
247 {
248  DebandContext *s = ctx->priv;
249  ThreadData *td = arg;
250  AVFrame *in = td->in;
251  AVFrame *out = td->out;
252  const int start = (s->planeheight[0] * jobnr ) / nb_jobs;
253  const int end = (s->planeheight[0] * (jobnr+1)) / nb_jobs;
254  int x, y, p, z;
255 
256  for (y = start; y < end; y++) {
257  const int pos = y * s->planewidth[0];
258 
259  for (x = 0; x < s->planewidth[0]; x++) {
260  const int x_pos = s->x_pos[pos + x];
261  const int y_pos = s->y_pos[pos + x];
262  int avg[4], cmp[4] = { 0 }, src[4];
263 
264  for (p = 0; p < s->nb_components; p++) {
265  const uint16_t *src_ptr = (const uint16_t *)in->data[p];
266  const int src_linesize = in->linesize[p] / 2;
267  const int thr = s->thr[p];
268  const int w = s->planewidth[p] - 1;
269  const int h = s->planeheight[p] - 1;
270  const int ref0 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
271  const int ref1 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
272  const int ref2 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
273  const int ref3 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
274  const int src0 = src_ptr[y * src_linesize + x];
275 
276  src[p] = src0;
277  avg[p] = get_avg(ref0, ref1, ref2, ref3);
278 
279  if (s->blur) {
280  cmp[p] = FFABS(src0 - avg[p]) < thr;
281  } else {
282  cmp[p] = (FFABS(src0 - ref0) < thr) &&
283  (FFABS(src0 - ref1) < thr) &&
284  (FFABS(src0 - ref2) < thr) &&
285  (FFABS(src0 - ref3) < thr);
286  }
287  }
288 
289  for (z = 0; z < s->nb_components; z++)
290  if (!cmp[z])
291  break;
292  if (z == s->nb_components) {
293  for (p = 0; p < s->nb_components; p++) {
294  const int dst_linesize = out->linesize[p] / 2;
295  uint16_t *dst = (uint16_t *)out->data[p] + y * dst_linesize + x;
296 
297  dst[0] = avg[p];
298  }
299  } else {
300  for (p = 0; p < s->nb_components; p++) {
301  const int dst_linesize = out->linesize[p] / 2;
302  uint16_t *dst = (uint16_t *)out->data[p] + y * dst_linesize + x;
303 
304  dst[0] = src[p];
305  }
306  }
307  }
308  }
309 
310  return 0;
311 }
312 
313 static int deband_16_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
314 {
315  DebandContext *s = ctx->priv;
316  ThreadData *td = arg;
317  AVFrame *in = td->in;
318  AVFrame *out = td->out;
319  int x, y, p;
320 
321  for (p = 0; p < s->nb_components; p++) {
322  const uint16_t *src_ptr = (const uint16_t *)in->data[p];
323  uint16_t *dst_ptr = (uint16_t *)out->data[p];
324  const int dst_linesize = out->linesize[p] / 2;
325  const int src_linesize = in->linesize[p] / 2;
326  const int thr = s->thr[p];
327  const int start = (s->planeheight[p] * jobnr ) / nb_jobs;
328  const int end = (s->planeheight[p] * (jobnr+1)) / nb_jobs;
329  const int w = s->planewidth[p] - 1;
330  const int h = s->planeheight[p] - 1;
331 
332  for (y = start; y < end; y++) {
333  const int pos = y * s->planewidth[0];
334 
335  for (x = 0; x < s->planewidth[p]; x++) {
336  const int x_pos = s->x_pos[pos + x];
337  const int y_pos = s->y_pos[pos + x];
338  const int ref0 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
339  const int ref1 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
340  const int ref2 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
341  const int ref3 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
342  const int src0 = src_ptr[y * src_linesize + x];
343 
344  if (s->blur) {
345  const int avg = get_avg(ref0, ref1, ref2, ref3);
346  const int diff = FFABS(src0 - avg);
347 
348  dst_ptr[y * dst_linesize + x] = diff < thr ? avg : src0;
349  } else {
350  dst_ptr[y * dst_linesize + x] = (FFABS(src0 - ref0) < thr) &&
351  (FFABS(src0 - ref1) < thr) &&
352  (FFABS(src0 - ref2) < thr) &&
353  (FFABS(src0 - ref3) < thr) ? get_avg(ref0, ref1, ref2, ref3) : src0;
354  }
355  }
356  }
357  }
358 
359  return 0;
360 }
361 
363 {
365  AVFilterContext *ctx = inlink->dst;
366  DebandContext *s = ctx->priv;
367  const float direction = s->direction;
368  const int range = s->range;
369  int x, y;
370 
371  s->nb_components = desc->nb_components;
372 
373  s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
374  s->planeheight[0] = s->planeheight[3] = inlink->h;
375  s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
376  s->planewidth[0] = s->planewidth[3] = inlink->w;
377  s->shift[0] = desc->log2_chroma_w;
378  s->shift[1] = desc->log2_chroma_h;
379 
380  if (s->coupling)
381  s->deband = desc->comp[0].depth > 8 ? deband_16_coupling_c : deband_8_coupling_c;
382  else
383  s->deband = desc->comp[0].depth > 8 ? deband_16_c : deband_8_c;
384 
385  s->thr[0] = ((1 << desc->comp[0].depth) - 1) * s->threshold[0];
386  s->thr[1] = ((1 << desc->comp[1].depth) - 1) * s->threshold[1];
387  s->thr[2] = ((1 << desc->comp[2].depth) - 1) * s->threshold[2];
388  s->thr[3] = ((1 << desc->comp[3].depth) - 1) * s->threshold[3];
389 
390  if (!s->x_pos)
391  s->x_pos = av_malloc(s->planewidth[0] * s->planeheight[0] * sizeof(*s->x_pos));
392  if (!s->y_pos)
393  s->y_pos = av_malloc(s->planewidth[0] * s->planeheight[0] * sizeof(*s->y_pos));
394  if (!s->x_pos || !s->y_pos)
395  return AVERROR(ENOMEM);
396 
397  for (y = 0; y < s->planeheight[0]; y++) {
398  for (x = 0; x < s->planewidth[0]; x++) {
399  const float r = frand(x, y);
400  const float dir = direction < 0 ? -direction : r * direction;
401  const int dist = range < 0 ? -range : r * range;
402 
403  s->x_pos[y * s->planewidth[0] + x] = cosf(dir) * dist;
404  s->y_pos[y * s->planewidth[0] + x] = sinf(dir) * dist;
405  }
406  }
407 
408  return 0;
409 }
410 
412 {
413  AVFilterContext *ctx = inlink->dst;
414  AVFilterLink *outlink = ctx->outputs[0];
415  DebandContext *s = ctx->priv;
416  AVFrame *out;
417  ThreadData td;
418 
419  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
420  if (!out) {
421  av_frame_free(&in);
422  return AVERROR(ENOMEM);
423  }
425 
426  td.in = in; td.out = out;
427  ff_filter_execute(ctx, s->deband, &td, NULL,
428  FFMIN3(s->planeheight[1], s->planeheight[2],
430 
431  av_frame_free(&in);
432  return ff_filter_frame(outlink, out);
433 }
434 
435 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
436  char *res, int res_len, int flags)
437 {
438  int ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
439 
440  if (ret < 0)
441  return ret;
442 
443  return config_input(ctx->inputs[0]);
444 }
445 
447 {
448  DebandContext *s = ctx->priv;
449 
450  av_freep(&s->x_pos);
451  av_freep(&s->y_pos);
452 }
453 
455  {
456  .name = "default",
457  .type = AVMEDIA_TYPE_VIDEO,
458  .config_props = config_input,
459  .filter_frame = filter_frame,
460  },
461 };
462 
464  .name = "deband",
465  .description = NULL_IF_CONFIG_SMALL("Debands video."),
466  .priv_size = sizeof(DebandContext),
467  .priv_class = &deband_class,
468  .uninit = uninit,
473  .process_command = process_command,
474 };
ff_get_video_buffer
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:112
AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:522
AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_GBRAP16
Definition: pixfmt.h:501
deband_16_coupling_c
static int deband_16_coupling_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:246
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
av_clip
#define av_clip
Definition: common.h:100
r
const char * r
Definition: vf_curves.c:127
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
DebandContext::threshold
float threshold[4]
Definition: vf_deband.c:36
opt.h
DebandContext::range
int range
Definition: vf_deband.c:37
out
FILE * out
Definition: movenc.c:55
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1015
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2965
deband_8_coupling_c
static int deband_8_coupling_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:181
floorf
static __device__ float floorf(float a)
Definition: cuda_runtime.h:172
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:160
AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUVA422P9
Definition: pixfmt.h:514
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:374
pixdesc.h
AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUVA420P16
Definition: pixfmt.h:521
w
uint8_t w
Definition: llviddspenc.c:38
frand
static float frand(int x, int y)
Definition: vf_deband.c:116
AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:516
AVOption
AVOption.
Definition: opt.h:357
FILTER_QUERY_FUNC
#define FILTER_QUERY_FUNC(func)
Definition: internal.h:159
config_input
static int config_input(AVFilterLink *inlink)
Definition: vf_deband.c:362
filter_frame
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
Definition: vf_deband.c:411
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:106
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:170
ThreadData::out
AVFrame * out
Definition: af_adeclick.c:527
video.h
ThreadData::in
AVFrame * in
Definition: af_adecorrelate.c:154
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:517
AV_PIX_FMT_GRAY9
#define AV_PIX_FMT_GRAY9
Definition: pixfmt.h:458
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:395
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
formats.h
DebandContext::y_pos
int * y_pos
Definition: vf_deband.c:48
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:513
deband_16_c
static int deband_16_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:313
AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:496
AV_PIX_FMT_GBRAP
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:212
cosf
#define cosf(x)
Definition: libm.h:78
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:494
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:523
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:476
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:462
DebandContext::deband
int(* deband)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:50
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:33
ff_vf_deband
const AVFilter ff_vf_deband
Definition: vf_deband.c:463
AV_PIX_FMT_YUVJ411P
@ 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
DebandContext::shift
int shift[2]
Definition: vf_deband.c:44
av_cold
#define av_cold
Definition: attributes.h:90
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:490
ff_video_default_filterpad
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
AV_PIX_FMT_YUVJ422P
@ 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
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_PIX_FMT_YUVA420P
@ 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_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:491
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
FLAGS
#define FLAGS
Definition: vf_deband.c:54
ff_set_common_formats_from_list
int ff_set_common_formats_from_list(AVFilterContext *ctx, const int *fmts)
Equivalent to ff_set_common_formats(ctx, ff_make_format_list(fmts))
Definition: formats.c:874
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:304
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:475
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:489
ctx
AVFormatContext * ctx
Definition: movenc.c:49
AV_PIX_FMT_GRAY14
#define AV_PIX_FMT_GRAY14
Definition: pixfmt.h:461
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
cmp
static av_always_inline int cmp(MpegEncContext *s, const int x, const int y, const int subx, const int suby, const int size, const int h, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, const int flags)
compares a block (either a full macroblock or a partition thereof) against a proposed motion-compensa...
Definition: motion_est.c:262
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:182
AV_PIX_FMT_YUVJ444P
@ 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
arg
const char * arg
Definition: jacosubdec.c:67
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:459
AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GBRP16
Definition: pixfmt.h:497
DebandContext::planeheight
int planeheight[4]
Definition: vf_deband.c:43
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:709
AV_PIX_FMT_YUVJ420P
@ 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
DebandContext::coupling
int coupling
Definition: vf_deband.c:35
DebandContext::planewidth
int planewidth[4]
Definition: vf_deband.c:42
DebandContext
Definition: vf_deband.c:32
sinf
#define sinf(x)
Definition: libm.h:419
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
AV_PIX_FMT_GBRP9
#define AV_PIX_FMT_GBRP9
Definition: pixfmt.h:493
DebandContext::nb_components
int nb_components
Definition: vf_deband.c:41
get_avg
static int get_avg(int ref0, int ref1, int ref2, int ref3)
Definition: vf_deband.c:123
f
f
Definition: af_crystalizer.c:121
blur
static void blur(uint8_t *dst, int dst_step, const uint8_t *src, int src_step, int len, int radius, int pixsize)
Definition: vf_boxblur.c:160
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:483
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:485
avg
#define avg(a, b, c, d)
Definition: colorspacedsp_template.c:28
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2464
ff_filter_process_command
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:887
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:165
avfilter_vf_deband_inputs
static const AVFilterPad avfilter_vf_deband_inputs[]
Definition: vf_deband.c:454
AV_PIX_FMT_YUVA444P
@ 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_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:518
M_PI
#define M_PI
Definition: mathematics.h:67
internal.h
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
#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:147
AV_OPT_TYPE_FLOAT
@ AV_OPT_TYPE_FLOAT
Definition: opt.h:248
DebandContext::thr
int thr[4]
Definition: vf_deband.c:45
FFMIN3
#define FFMIN3(a, b, c)
Definition: macros.h:50
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:495
ff_filter_get_nb_threads
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition: avfilter.c:827
ThreadData
Used for passing data between threads.
Definition: dsddec.c:71
DebandContext::x_pos
int * x_pos
Definition: vf_deband.c:47
AV_PIX_FMT_YUVJ440P
@ 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
deband_options
static const AVOption deband_options[]
Definition: vf_deband.c:56
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:39
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:477
DebandContext::blur
int blur
Definition: vf_deband.c:38
AVFilter
Filter definition.
Definition: avfilter.h:166
OFFSET
#define OFFSET(x)
Definition: vf_deband.c:53
ret
ret
Definition: filter_design.txt:187
query_formats
static int query_formats(AVFilterContext *ctx)
Definition: vf_deband.c:74
DebandContext::direction
float direction
Definition: vf_deband.c:39
AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:515
pos
unsigned int pos
Definition: spdifenc.c:414
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:482
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:487
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:245
avfilter.h
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(deband)
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
src0
const pixel *const src0
Definition: h264pred_template.c:420
AVFilterContext
An instance of a filter.
Definition: avfilter.h:407
deband_8_c
static int deband_8_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:132
AV_PIX_FMT_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:165
AVFILTER_FLAG_SLICE_THREADS
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition: avfilter.h:117
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
mem.h
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:261
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: internal.h:183
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
AV_PIX_FMT_YUV411P
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:80
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:474
AVFrame::linesize
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:419
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
h
h
Definition: vp9dsp_template.c:2038
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:488
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:460
process_command
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
Definition: vf_deband.c:435
ff_filter_execute
static av_always_inline int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition: internal.h:134
int
int
Definition: ffmpeg_filter.c:424
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: vf_deband.c:446
AV_PIX_FMT_YUVA422P
@ 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_YUV420P14
#define AV_PIX_FMT_YUV420P14
Definition: pixfmt.h:486