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/opt.h"
25 #include "libavutil/pixdesc.h"
26 #include "avfilter.h"
27 #include "formats.h"
28 #include "internal.h"
29 #include "video.h"
30 
31 typedef struct DebandContext {
32  const AVClass *class;
33 
34  int coupling;
35  float threshold[4];
36  int range;
37  int blur;
38  float direction;
39 
41  int planewidth[4];
42  int planeheight[4];
43  int shift[2];
44  int thr[4];
45 
46  int *x_pos;
47  int *y_pos;
48 
49  int (*deband)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
51 
52 #define OFFSET(x) offsetof(DebandContext, x)
53 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
54 
55 static const AVOption deband_options[] = {
56  { "1thr", "set 1st plane threshold", OFFSET(threshold[0]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0.00003, 0.5, FLAGS },
57  { "2thr", "set 2nd plane threshold", OFFSET(threshold[1]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0.00003, 0.5, FLAGS },
58  { "3thr", "set 3rd plane threshold", OFFSET(threshold[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0.00003, 0.5, FLAGS },
59  { "4thr", "set 4th plane threshold", OFFSET(threshold[3]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0.00003, 0.5, FLAGS },
60  { "range", "set range", OFFSET(range), AV_OPT_TYPE_INT, {.i64=16}, INT_MIN, INT_MAX, FLAGS },
61  { "r", "set range", OFFSET(range), AV_OPT_TYPE_INT, {.i64=16}, INT_MIN, INT_MAX, FLAGS },
62  { "direction", "set direction", OFFSET(direction), AV_OPT_TYPE_FLOAT, {.dbl=2*M_PI},-2*M_PI, 2*M_PI, FLAGS },
63  { "d", "set direction", OFFSET(direction), AV_OPT_TYPE_FLOAT, {.dbl=2*M_PI},-2*M_PI, 2*M_PI, FLAGS },
64  { "blur", "set blur", OFFSET(blur), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
65  { "b", "set blur", OFFSET(blur), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
66  { "coupling", "set plane coupling", OFFSET(coupling), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
67  { "c", "set plane coupling", OFFSET(coupling), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
68  { NULL }
69 };
70 
71 AVFILTER_DEFINE_CLASS(deband);
72 
74 {
75  DebandContext *s = ctx->priv;
76 
77  static const enum AVPixelFormat pix_fmts[] = {
97  };
98 
99  static const enum AVPixelFormat cpix_fmts[] = {
110  };
111 
112  return ff_set_common_formats_from_list(ctx, s->coupling ? cpix_fmts : pix_fmts);
113 }
114 
115 static float frand(int x, int y)
116 {
117  const float r = sinf(x * 12.9898f + y * 78.233f) * 43758.545f;
118 
119  return r - floorf(r);
120 }
121 
122 static int inline get_avg(int ref0, int ref1, int ref2, int ref3)
123 {
124  return (ref0 + ref1 + ref2 + ref3) / 4;
125 }
126 
127 typedef struct ThreadData {
128  AVFrame *in, *out;
129 } ThreadData;
130 
131 static int deband_8_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
132 {
133  DebandContext *s = ctx->priv;
134  ThreadData *td = arg;
135  AVFrame *in = td->in;
136  AVFrame *out = td->out;
137  int x, y, p;
138 
139  for (p = 0; p < s->nb_components; p++) {
140  const uint8_t *src_ptr = (const uint8_t *)in->data[p];
141  uint8_t *dst_ptr = (uint8_t *)out->data[p];
142  const int dst_linesize = out->linesize[p];
143  const int src_linesize = in->linesize[p];
144  const int thr = s->thr[p];
145  const int start = (s->planeheight[p] * jobnr ) / nb_jobs;
146  const int end = (s->planeheight[p] * (jobnr+1)) / nb_jobs;
147  const int w = s->planewidth[p] - 1;
148  const int h = s->planeheight[p] - 1;
149 
150  for (y = start; y < end; y++) {
151  const int pos = y * s->planewidth[0];
152 
153  for (x = 0; x < s->planewidth[p]; x++) {
154  const int x_pos = s->x_pos[pos + x];
155  const int y_pos = s->y_pos[pos + x];
156  const int ref0 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
157  const int ref1 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
158  const int ref2 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
159  const int ref3 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
160  const int src0 = src_ptr[y * src_linesize + x];
161 
162  if (s->blur) {
163  const int avg = get_avg(ref0, ref1, ref2, ref3);
164  const int diff = FFABS(src0 - avg);
165 
166  dst_ptr[y * dst_linesize + x] = diff < thr ? avg : src0;
167  } else {
168  dst_ptr[y * dst_linesize + x] = (FFABS(src0 - ref0) < thr) &&
169  (FFABS(src0 - ref1) < thr) &&
170  (FFABS(src0 - ref2) < thr) &&
171  (FFABS(src0 - ref3) < thr) ? get_avg(ref0, ref1, ref2, ref3) : src0;
172  }
173  }
174  }
175  }
176 
177  return 0;
178 }
179 
180 static int deband_8_coupling_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
181 {
182  DebandContext *s = ctx->priv;
183  ThreadData *td = arg;
184  AVFrame *in = td->in;
185  AVFrame *out = td->out;
186  const int start = (s->planeheight[0] * jobnr ) / nb_jobs;
187  const int end = (s->planeheight[0] * (jobnr+1)) / nb_jobs;
188  int x, y, p;
189 
190  for (y = start; y < end; y++) {
191  const int pos = y * s->planewidth[0];
192 
193  for (x = 0; x < s->planewidth[0]; x++) {
194  const int x_pos = s->x_pos[pos + x];
195  const int y_pos = s->y_pos[pos + x];
196  int avg[4], cmp[4] = { 0 }, src[4];
197 
198  for (p = 0; p < s->nb_components; p++) {
199  const uint8_t *src_ptr = (const uint8_t *)in->data[p];
200  const int src_linesize = in->linesize[p];
201  const int thr = s->thr[p];
202  const int w = s->planewidth[p] - 1;
203  const int h = s->planeheight[p] - 1;
204  const int ref0 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
205  const int ref1 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
206  const int ref2 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
207  const int ref3 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
208  const int src0 = src_ptr[y * src_linesize + x];
209 
210  src[p] = src0;
211  avg[p] = get_avg(ref0, ref1, ref2, ref3);
212 
213  if (s->blur) {
214  cmp[p] = FFABS(src0 - avg[p]) < thr;
215  } else {
216  cmp[p] = (FFABS(src0 - ref0) < thr) &&
217  (FFABS(src0 - ref1) < thr) &&
218  (FFABS(src0 - ref2) < thr) &&
219  (FFABS(src0 - ref3) < thr);
220  }
221  }
222 
223  for (p = 0; p < s->nb_components; p++)
224  if (!cmp[p])
225  break;
226  if (p == s->nb_components) {
227  for (p = 0; p < s->nb_components; p++) {
228  const int dst_linesize = out->linesize[p];
229 
230  out->data[p][y * dst_linesize + x] = avg[p];
231  }
232  } else {
233  for (p = 0; p < s->nb_components; p++) {
234  const int dst_linesize = out->linesize[p];
235 
236  out->data[p][y * dst_linesize + x] = src[p];
237  }
238  }
239  }
240  }
241 
242  return 0;
243 }
244 
245 static int deband_16_coupling_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
246 {
247  DebandContext *s = ctx->priv;
248  ThreadData *td = arg;
249  AVFrame *in = td->in;
250  AVFrame *out = td->out;
251  const int start = (s->planeheight[0] * jobnr ) / nb_jobs;
252  const int end = (s->planeheight[0] * (jobnr+1)) / nb_jobs;
253  int x, y, p, z;
254 
255  for (y = start; y < end; y++) {
256  const int pos = y * s->planewidth[0];
257 
258  for (x = 0; x < s->planewidth[0]; x++) {
259  const int x_pos = s->x_pos[pos + x];
260  const int y_pos = s->y_pos[pos + x];
261  int avg[4], cmp[4] = { 0 }, src[4];
262 
263  for (p = 0; p < s->nb_components; p++) {
264  const uint16_t *src_ptr = (const uint16_t *)in->data[p];
265  const int src_linesize = in->linesize[p] / 2;
266  const int thr = s->thr[p];
267  const int w = s->planewidth[p] - 1;
268  const int h = s->planeheight[p] - 1;
269  const int ref0 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
270  const int ref1 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
271  const int ref2 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
272  const int ref3 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
273  const int src0 = src_ptr[y * src_linesize + x];
274 
275  src[p] = src0;
276  avg[p] = get_avg(ref0, ref1, ref2, ref3);
277 
278  if (s->blur) {
279  cmp[p] = FFABS(src0 - avg[p]) < thr;
280  } else {
281  cmp[p] = (FFABS(src0 - ref0) < thr) &&
282  (FFABS(src0 - ref1) < thr) &&
283  (FFABS(src0 - ref2) < thr) &&
284  (FFABS(src0 - ref3) < thr);
285  }
286  }
287 
288  for (z = 0; z < s->nb_components; z++)
289  if (!cmp[z])
290  break;
291  if (z == s->nb_components) {
292  for (p = 0; p < s->nb_components; p++) {
293  const int dst_linesize = out->linesize[p] / 2;
294  uint16_t *dst = (uint16_t *)out->data[p] + y * dst_linesize + x;
295 
296  dst[0] = avg[p];
297  }
298  } else {
299  for (p = 0; p < s->nb_components; p++) {
300  const int dst_linesize = out->linesize[p] / 2;
301  uint16_t *dst = (uint16_t *)out->data[p] + y * dst_linesize + x;
302 
303  dst[0] = src[p];
304  }
305  }
306  }
307  }
308 
309  return 0;
310 }
311 
312 static int deband_16_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
313 {
314  DebandContext *s = ctx->priv;
315  ThreadData *td = arg;
316  AVFrame *in = td->in;
317  AVFrame *out = td->out;
318  int x, y, p;
319 
320  for (p = 0; p < s->nb_components; p++) {
321  const uint16_t *src_ptr = (const uint16_t *)in->data[p];
322  uint16_t *dst_ptr = (uint16_t *)out->data[p];
323  const int dst_linesize = out->linesize[p] / 2;
324  const int src_linesize = in->linesize[p] / 2;
325  const int thr = s->thr[p];
326  const int start = (s->planeheight[p] * jobnr ) / nb_jobs;
327  const int end = (s->planeheight[p] * (jobnr+1)) / nb_jobs;
328  const int w = s->planewidth[p] - 1;
329  const int h = s->planeheight[p] - 1;
330 
331  for (y = start; y < end; y++) {
332  const int pos = y * s->planewidth[0];
333 
334  for (x = 0; x < s->planewidth[p]; x++) {
335  const int x_pos = s->x_pos[pos + x];
336  const int y_pos = s->y_pos[pos + x];
337  const int ref0 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
338  const int ref1 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + x_pos, 0, w)];
339  const int ref2 = src_ptr[av_clip(y + -y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
340  const int ref3 = src_ptr[av_clip(y + y_pos, 0, h) * src_linesize + av_clip(x + -x_pos, 0, w)];
341  const int src0 = src_ptr[y * src_linesize + x];
342 
343  if (s->blur) {
344  const int avg = get_avg(ref0, ref1, ref2, ref3);
345  const int diff = FFABS(src0 - avg);
346 
347  dst_ptr[y * dst_linesize + x] = diff < thr ? avg : src0;
348  } else {
349  dst_ptr[y * dst_linesize + x] = (FFABS(src0 - ref0) < thr) &&
350  (FFABS(src0 - ref1) < thr) &&
351  (FFABS(src0 - ref2) < thr) &&
352  (FFABS(src0 - ref3) < thr) ? get_avg(ref0, ref1, ref2, ref3) : src0;
353  }
354  }
355  }
356  }
357 
358  return 0;
359 }
360 
362 {
364  AVFilterContext *ctx = inlink->dst;
365  DebandContext *s = ctx->priv;
366  const float direction = s->direction;
367  const int range = s->range;
368  int x, y;
369 
370  s->nb_components = desc->nb_components;
371 
372  s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
373  s->planeheight[0] = s->planeheight[3] = inlink->h;
374  s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
375  s->planewidth[0] = s->planewidth[3] = inlink->w;
376  s->shift[0] = desc->log2_chroma_w;
377  s->shift[1] = desc->log2_chroma_h;
378 
379  if (s->coupling)
380  s->deband = desc->comp[0].depth > 8 ? deband_16_coupling_c : deband_8_coupling_c;
381  else
382  s->deband = desc->comp[0].depth > 8 ? deband_16_c : deband_8_c;
383 
384  s->thr[0] = ((1 << desc->comp[0].depth) - 1) * s->threshold[0];
385  s->thr[1] = ((1 << desc->comp[1].depth) - 1) * s->threshold[1];
386  s->thr[2] = ((1 << desc->comp[2].depth) - 1) * s->threshold[2];
387  s->thr[3] = ((1 << desc->comp[3].depth) - 1) * s->threshold[3];
388 
389  if (!s->x_pos)
390  s->x_pos = av_malloc(s->planewidth[0] * s->planeheight[0] * sizeof(*s->x_pos));
391  if (!s->y_pos)
392  s->y_pos = av_malloc(s->planewidth[0] * s->planeheight[0] * sizeof(*s->y_pos));
393  if (!s->x_pos || !s->y_pos)
394  return AVERROR(ENOMEM);
395 
396  for (y = 0; y < s->planeheight[0]; y++) {
397  for (x = 0; x < s->planewidth[0]; x++) {
398  const float r = frand(x, y);
399  const float dir = direction < 0 ? -direction : r * direction;
400  const int dist = range < 0 ? -range : r * range;
401 
402  s->x_pos[y * s->planewidth[0] + x] = cosf(dir) * dist;
403  s->y_pos[y * s->planewidth[0] + x] = sinf(dir) * dist;
404  }
405  }
406 
407  return 0;
408 }
409 
411 {
412  AVFilterContext *ctx = inlink->dst;
413  AVFilterLink *outlink = ctx->outputs[0];
414  DebandContext *s = ctx->priv;
415  AVFrame *out;
416  ThreadData td;
417 
418  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
419  if (!out) {
420  av_frame_free(&in);
421  return AVERROR(ENOMEM);
422  }
424 
425  td.in = in; td.out = out;
426  ff_filter_execute(ctx, s->deband, &td, NULL,
427  FFMIN3(s->planeheight[1], s->planeheight[2],
429 
430  av_frame_free(&in);
431  return ff_filter_frame(outlink, out);
432 }
433 
434 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
435  char *res, int res_len, int flags)
436 {
437  int ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
438 
439  if (ret < 0)
440  return ret;
441 
442  return config_input(ctx->inputs[0]);
443 }
444 
446 {
447  DebandContext *s = ctx->priv;
448 
449  av_freep(&s->x_pos);
450  av_freep(&s->y_pos);
451 }
452 
454  {
455  .name = "default",
456  .type = AVMEDIA_TYPE_VIDEO,
457  .config_props = config_input,
458  .filter_frame = filter_frame,
459  },
460 };
461 
463  .name = "deband",
464  .description = NULL_IF_CONFIG_SMALL("Debands video."),
465  .priv_size = sizeof(DebandContext),
466  .priv_class = &deband_class,
467  .uninit = uninit,
472  .process_command = process_command,
473 };
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:526
AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_GBRAP16
Definition: pixfmt.h:505
td
#define td
Definition: regdef.h:70
deband_16_coupling_c
static int deband_16_coupling_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:245
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
av_clip
#define av_clip
Definition: common.h:98
r
const char * r
Definition: vf_curves.c:126
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:35
opt.h
DebandContext::range
int range
Definition: vf_deband.c:36
out
FILE * out
Definition: movenc.c:54
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1007
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2968
deband_8_coupling_c
static int deband_8_coupling_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:180
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:100
AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUVA422P9
Definition: pixfmt.h:518
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:340
pixdesc.h
AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUVA420P16
Definition: pixfmt.h:525
w
uint8_t w
Definition: llviddspenc.c:38
frand
static float frand(int x, int y)
Definition: vf_deband.c:115
AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:520
AVOption
AVOption.
Definition: opt.h:251
FILTER_QUERY_FUNC
#define FILTER_QUERY_FUNC(func)
Definition: internal.h:159
config_input
static int config_input(AVFilterLink *inlink)
Definition: vf_deband.c:361
filter_frame
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
Definition: vf_deband.c:410
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:526
video.h
ThreadData::in
AVFrame * in
Definition: af_adecorrelate.c:153
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:521
AV_PIX_FMT_GRAY9
#define AV_PIX_FMT_GRAY9
Definition: pixfmt.h:462
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:361
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
formats.h
DebandContext::y_pos
int * y_pos
Definition: vf_deband.c:47
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:517
deband_16_c
static int deband_16_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:312
AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:500
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:498
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:527
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:480
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:466
DebandContext::deband
int(* deband)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:49
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:462
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:43
av_cold
#define av_cold
Definition: attributes.h:90
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:494
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:495
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:58
FLAGS
#define FLAGS
Definition: vf_deband.c:53
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:873
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:304
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:479
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:493
ctx
AVFormatContext * ctx
Definition: movenc.c:48
AV_PIX_FMT_GRAY14
#define AV_PIX_FMT_GRAY14
Definition: pixfmt.h:465
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:72
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:463
AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GBRP16
Definition: pixfmt.h:501
DebandContext::planeheight
int planeheight[4]
Definition: vf_deband.c:42
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:736
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:34
DebandContext::planewidth
int planewidth[4]
Definition: vf_deband.c:41
DebandContext
Definition: vf_deband.c:31
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:497
DebandContext::nb_components
int nb_components
Definition: vf_deband.c:40
get_avg
static int get_avg(int ref0, int ref1, int ref2, int ref3)
Definition: vf_deband.c:122
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:106
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:487
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:489
avg
#define avg(a, b, c, d)
Definition: colorspacedsp_template.c:28
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2646
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:879
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:164
avfilter_vf_deband_inputs
static const AVFilterPad avfilter_vf_deband_inputs[]
Definition: vf_deband.c:453
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:522
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:228
DebandContext::thr
int thr[4]
Definition: vf_deband.c:44
FFMIN3
#define FFMIN3(a, b, c)
Definition: macros.h:50
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:499
ff_filter_get_nb_threads
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition: avfilter.c:814
ThreadData
Used for passing data between threads.
Definition: dsddec.c:69
DebandContext::x_pos
int * x_pos
Definition: vf_deband.c:46
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:55
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:39
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:481
DebandContext::blur
int blur
Definition: vf_deband.c:37
AVFilter
Filter definition.
Definition: avfilter.h:166
OFFSET
#define OFFSET(x)
Definition: vf_deband.c:52
ret
ret
Definition: filter_design.txt:187
query_formats
static int query_formats(AVFilterContext *ctx)
Definition: vf_deband.c:73
DebandContext::direction
float direction
Definition: vf_deband.c:38
AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:519
pos
unsigned int pos
Definition: spdifenc.c:413
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:486
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:491
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
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:409
deband_8_c
static int deband_8_c(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_deband.c:131
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:83
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
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:244
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:385
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:492
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:464
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:434
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:445
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:490