FFmpeg  4.3.9
vf_floodfill.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 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/opt.h"
22 #include "libavutil/imgutils.h"
23 #include "libavutil/intreadwrite.h"
24 #include "avfilter.h"
25 #include "formats.h"
26 #include "internal.h"
27 #include "video.h"
28 
29 typedef struct Points {
30  uint16_t x, y;
31 } Points;
32 
33 typedef struct FloodfillContext {
34  const AVClass *class;
35 
36  int x, y;
37  int s[4];
38  int S[4];
39  int d[4];
40 
41  int nb_planes;
42  int back, front;
44 
45  int (*is_same)(AVFrame *frame, int x, int y,
46  unsigned s0, unsigned s1, unsigned s2, unsigned s3);
47  void (*set_pixel)(AVFrame *frame, int x, int y,
48  unsigned d0, unsigned d1, unsigned d2, unsigned d3);
49  void (*pick_pixel)(AVFrame *frame, int x, int y,
50  int *s0, int *s1, int *s2, int *s3);
52 
53 static int is_inside(int x, int y, int w, int h)
54 {
55  if (x >= 0 && x < w && y >= 0 && y < h)
56  return 1;
57  return 0;
58 }
59 
60 static int is_same4(AVFrame *frame, int x, int y,
61  unsigned s0, unsigned s1, unsigned s2, unsigned s3)
62 {
63  unsigned c0 = frame->data[0][y * frame->linesize[0] + x];
64  unsigned c1 = frame->data[1][y * frame->linesize[1] + x];
65  unsigned c2 = frame->data[2][y * frame->linesize[2] + x];
66  unsigned c3 = frame->data[3][y * frame->linesize[3] + x];
67 
68  if (s0 == c0 && s1 == c1 && s2 == c2 && s3 == c3)
69  return 1;
70  return 0;
71 }
72 
73 static int is_same4_16(AVFrame *frame, int x, int y,
74  unsigned s0, unsigned s1, unsigned s2, unsigned s3)
75 {
76  unsigned c0 = AV_RN16(frame->data[0] + y * frame->linesize[0] + 2 * x);
77  unsigned c1 = AV_RN16(frame->data[1] + y * frame->linesize[1] + 2 * x);
78  unsigned c2 = AV_RN16(frame->data[2] + y * frame->linesize[2] + 2 * x);
79  unsigned c3 = AV_RN16(frame->data[3] + y * frame->linesize[3] + 2 * x);
80 
81  if (s0 == c0 && s1 == c1 && s2 == c2 && s3 == c3)
82  return 1;
83  return 0;
84 }
85 
86 static int is_same3(AVFrame *frame, int x, int y,
87  unsigned s0, unsigned s1, unsigned s2, unsigned s3)
88 {
89  unsigned c0 = frame->data[0][y * frame->linesize[0] + x];
90  unsigned c1 = frame->data[1][y * frame->linesize[1] + x];
91  unsigned c2 = frame->data[2][y * frame->linesize[2] + x];
92 
93  if (s0 == c0 && s1 == c1 && s2 == c2)
94  return 1;
95  return 0;
96 }
97 
98 static int is_same3_16(AVFrame *frame, int x, int y,
99  unsigned s0, unsigned s1, unsigned s2, unsigned s3)
100 {
101  unsigned c0 = AV_RN16(frame->data[0] + y * frame->linesize[0] + 2 * x);
102  unsigned c1 = AV_RN16(frame->data[1] + y * frame->linesize[1] + 2 * x);
103  unsigned c2 = AV_RN16(frame->data[2] + y * frame->linesize[2] + 2 * x);
104 
105  if (s0 == c0 && s1 == c1 && s2 == c2)
106  return 1;
107  return 0;
108 }
109 
110 static int is_same1(AVFrame *frame, int x, int y,
111  unsigned s0, unsigned s1, unsigned s2, unsigned s3)
112 {
113  unsigned c0 = frame->data[0][y * frame->linesize[0] + x];
114 
115  if (s0 == c0)
116  return 1;
117  return 0;
118 }
119 
120 static int is_same1_16(AVFrame *frame, int x, int y,
121  unsigned s0, unsigned s1, unsigned s2, unsigned s3)
122 {
123  unsigned c0 = AV_RN16(frame->data[0] + y * frame->linesize[0] + 2 * x);
124 
125  if (s0 == c0)
126  return 1;
127  return 0;
128 }
129 
130 static void set_pixel1(AVFrame *frame, int x, int y,
131  unsigned d0, unsigned d1, unsigned d2, unsigned d3)
132 {
133  frame->data[0][y * frame->linesize[0] + x] = d0;
134 }
135 
136 static void set_pixel1_16(AVFrame *frame, int x, int y,
137  unsigned d0, unsigned d1, unsigned d2, unsigned d3)
138 {
139  AV_WN16(frame->data[0] + y * frame->linesize[0] + 2 * x, d0);
140 }
141 
142 static void set_pixel3(AVFrame *frame, int x, int y,
143  unsigned d0, unsigned d1, unsigned d2, unsigned d3)
144 {
145  frame->data[0][y * frame->linesize[0] + x] = d0;
146  frame->data[1][y * frame->linesize[1] + x] = d1;
147  frame->data[2][y * frame->linesize[2] + x] = d2;
148 }
149 
150 static void set_pixel3_16(AVFrame *frame, int x, int y,
151  unsigned d0, unsigned d1, unsigned d2, unsigned d3)
152 {
153  AV_WN16(frame->data[0] + y * frame->linesize[0] + 2 * x, d0);
154  AV_WN16(frame->data[1] + y * frame->linesize[1] + 2 * x, d1);
155  AV_WN16(frame->data[2] + y * frame->linesize[2] + 2 * x, d2);
156 }
157 
158 static void set_pixel4(AVFrame *frame, int x, int y,
159  unsigned d0, unsigned d1, unsigned d2, unsigned d3)
160 {
161  frame->data[0][y * frame->linesize[0] + x] = d0;
162  frame->data[1][y * frame->linesize[1] + x] = d1;
163  frame->data[2][y * frame->linesize[2] + x] = d2;
164  frame->data[3][y * frame->linesize[3] + x] = d3;
165 }
166 
167 static void set_pixel4_16(AVFrame *frame, int x, int y,
168  unsigned d0, unsigned d1, unsigned d2, unsigned d3)
169 {
170  AV_WN16(frame->data[0] + y * frame->linesize[0] + 2 * x, d0);
171  AV_WN16(frame->data[1] + y * frame->linesize[1] + 2 * x, d1);
172  AV_WN16(frame->data[2] + y * frame->linesize[2] + 2 * x, d2);
173  AV_WN16(frame->data[3] + y * frame->linesize[3] + 2 * x, d3);
174 }
175 
176 static void pick_pixel1(AVFrame *frame, int x, int y,
177  int *s0, int *s1, int *s2, int *s3)
178 {
179  if (*s0 < 0)
180  *s0 = frame->data[0][y * frame->linesize[0] + x];
181 }
182 
183 static void pick_pixel1_16(AVFrame *frame, int x, int y,
184  int *s0, int *s1, int *s2, int *s3)
185 {
186  if (*s0 < 0)
187  *s0 = AV_RN16(frame->data[0] + y * frame->linesize[0] + 2 * x);
188 }
189 
190 static void pick_pixel3(AVFrame *frame, int x, int y,
191  int *s0, int *s1, int *s2, int *s3)
192 {
193  if (*s0 < 0)
194  *s0 = frame->data[0][y * frame->linesize[0] + x];
195  if (*s1 < 0)
196  *s1 = frame->data[1][y * frame->linesize[1] + x];
197  if (*s2 < 0)
198  *s2 = frame->data[2][y * frame->linesize[2] + x];
199 }
200 
201 static void pick_pixel3_16(AVFrame *frame, int x, int y,
202  int *s0, int *s1, int *s2, int *s3)
203 {
204  if (*s0 < 0)
205  *s0 = AV_RN16(frame->data[0] + y * frame->linesize[0] + 2 * x);
206  if (*s1 < 0)
207  *s1 = AV_RN16(frame->data[1] + y * frame->linesize[1] + 2 * x);
208  if (*s2 < 0)
209  *s2 = AV_RN16(frame->data[2] + y * frame->linesize[2] + 2 * x);
210 }
211 
212 static void pick_pixel4(AVFrame *frame, int x, int y,
213  int *s0, int *s1, int *s2, int *s3)
214 {
215  if (*s0 < 0)
216  *s0 = frame->data[0][y * frame->linesize[0] + x];
217  if (*s1 < 0)
218  *s1 = frame->data[1][y * frame->linesize[1] + x];
219  if (*s2 < 0)
220  *s2 = frame->data[2][y * frame->linesize[2] + x];
221  if (*s3 < 0)
222  *s3 = frame->data[3][y * frame->linesize[3] + x];
223 }
224 
225 static void pick_pixel4_16(AVFrame *frame, int x, int y,
226  int *s0, int *s1, int *s2, int *s3)
227 {
228  if (*s0 < 0)
229  *s0 = AV_RN16(frame->data[0] + y * frame->linesize[0] + 2 * x);
230  if (*s1 < 0)
231  *s1 = AV_RN16(frame->data[1] + y * frame->linesize[1] + 2 * x);
232  if (*s2 < 0)
233  *s2 = AV_RN16(frame->data[2] + y * frame->linesize[2] + 2 * x);
234  if (*s3 < 0)
235  *s3 = AV_RN16(frame->data[3] + y * frame->linesize[3] + 2 * x);
236 }
237 
238 static int config_input(AVFilterLink *inlink)
239 {
241  AVFilterContext *ctx = inlink->dst;
242  FloodfillContext *s = ctx->priv;
243  int depth;
244 
246  depth = desc->comp[0].depth;
247  if (depth == 8) {
248  switch (s->nb_planes) {
249  case 1: s->set_pixel = set_pixel1;
250  s->is_same = is_same1;
251  s->pick_pixel = pick_pixel1; break;
252  case 3: s->set_pixel = set_pixel3;
253  s->is_same = is_same3;
254  s->pick_pixel = pick_pixel3; break;
255  case 4: s->set_pixel = set_pixel4;
256  s->is_same = is_same4;
257  s->pick_pixel = pick_pixel4; break;
258  }
259  } else {
260  switch (s->nb_planes) {
261  case 1: s->set_pixel = set_pixel1_16;
262  s->is_same = is_same1_16;
263  s->pick_pixel = pick_pixel1_16; break;
264  case 3: s->set_pixel = set_pixel3_16;
265  s->is_same = is_same3_16;
266  s->pick_pixel = pick_pixel3_16; break;
267  case 4: s->set_pixel = set_pixel4_16;
268  s->is_same = is_same4_16;
269  s->pick_pixel = pick_pixel4_16; break;
270  }
271  }
272 
273  s->front = s->back = 0;
274  s->points = av_calloc(inlink->w * inlink->h, 4 * sizeof(Points));
275  if (!s->points)
276  return AVERROR(ENOMEM);
277 
278  return 0;
279 }
280 
282 {
283  AVFilterContext *ctx = link->dst;
284  FloodfillContext *s = ctx->priv;
285  const unsigned d0 = s->d[0];
286  const unsigned d1 = s->d[1];
287  const unsigned d2 = s->d[2];
288  const unsigned d3 = s->d[3];
289  int s0 = s->s[0];
290  int s1 = s->s[1];
291  int s2 = s->s[2];
292  int s3 = s->s[3];
293  const int w = frame->width;
294  const int h = frame->height;
295  int i, ret;
296 
297  if (is_inside(s->x, s->y, w, h)) {
298  s->pick_pixel(frame, s->x, s->y, &s0, &s1, &s2, &s3);
299 
300  s->S[0] = s0;
301  s->S[1] = s1;
302  s->S[2] = s2;
303  s->S[3] = s3;
304  for (i = 0; i < s->nb_planes; i++) {
305  if (s->S[i] != s->d[i])
306  break;
307  }
308 
309  if (i == s->nb_planes)
310  goto end;
311 
312  if (s->is_same(frame, s->x, s->y, s0, s1, s2, s3)) {
313  s->points[s->front].x = s->x;
314  s->points[s->front].y = s->y;
315  s->front++;
316  }
317 
318  if (ret = av_frame_make_writable(frame))
319  return ret;
320 
321  while (s->front > s->back) {
322  int x, y;
323 
324  s->front--;
325  x = s->points[s->front].x;
326  y = s->points[s->front].y;
327 
328  if (s->is_same(frame, x, y, s0, s1, s2, s3)) {
329  s->set_pixel(frame, x, y, d0, d1, d2, d3);
330 
331  if (is_inside(x + 1, y, w, h)) {
332  s->points[s->front] .x = x + 1;
333  s->points[s->front++].y = y;
334  }
335 
336  if (is_inside(x - 1, y, w, h)) {
337  s->points[s->front] .x = x - 1;
338  s->points[s->front++].y = y;
339  }
340 
341  if (is_inside(x, y + 1, w, h)) {
342  s->points[s->front] .x = x;
343  s->points[s->front++].y = y + 1;
344  }
345 
346  if (is_inside(x, y - 1, w, h)) {
347  s->points[s->front] .x = x;
348  s->points[s->front++].y = y - 1;
349  }
350  }
351  }
352  }
353 
354 end:
355  return ff_filter_frame(ctx->outputs[0], frame);
356 }
357 
359 {
360  static const enum AVPixelFormat pixel_fmts[] = {
369  };
371 
372  formats = ff_make_format_list(pixel_fmts);
373  if (!formats)
374  return AVERROR(ENOMEM);
375 
376  return ff_set_common_formats(ctx, formats);
377 }
378 
380 {
381  FloodfillContext *s = ctx->priv;
382 
383  av_freep(&s->points);
384 }
385 
386 static const AVFilterPad floodfill_inputs[] = {
387  {
388  .name = "default",
389  .type = AVMEDIA_TYPE_VIDEO,
390  .filter_frame = filter_frame,
391  .config_props = config_input,
392  },
393  { NULL }
394 };
395 
396 static const AVFilterPad floodfill_outputs[] = {
397  {
398  .name = "default",
399  .type = AVMEDIA_TYPE_VIDEO,
400  },
401  { NULL }
402 };
403 
404 #define OFFSET(x) offsetof(FloodfillContext, x)
405 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
406 
407 static const AVOption floodfill_options[] = {
408  { "x", "set pixel x coordinate", OFFSET(x), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
409  { "y", "set pixel y coordinate", OFFSET(y), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
410  { "s0", "set source #0 component value", OFFSET(s[0]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
411  { "s1", "set source #1 component value", OFFSET(s[1]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
412  { "s2", "set source #2 component value", OFFSET(s[2]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
413  { "s3", "set source #3 component value", OFFSET(s[3]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
414  { "d0", "set destination #0 component value", OFFSET(d[0]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
415  { "d1", "set destination #1 component value", OFFSET(d[1]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
416  { "d2", "set destination #2 component value", OFFSET(d[2]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
417  { "d3", "set destination #3 component value", OFFSET(d[3]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
418  { NULL }
419 };
420 
421 AVFILTER_DEFINE_CLASS(floodfill);
422 
424  .name = "floodfill",
425  .description = NULL_IF_CONFIG_SMALL("Fill area with same color with another color."),
426  .priv_size = sizeof(FloodfillContext),
427  .priv_class = &floodfill_class,
429  .uninit = uninit,
430  .inputs = floodfill_inputs,
431  .outputs = floodfill_outputs,
433 };
void(* pick_pixel)(AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
Definition: vf_floodfill.c:49
#define NULL
Definition: coverity.c:32
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2549
This structure describes decoded (raw) audio or video data.
Definition: frame.h:300
AVOption.
Definition: opt.h:246
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:407
#define AV_PIX_FMT_GBRAP10
Definition: pixfmt.h:417
AVFilter ff_vf_floodfill
Definition: vf_floodfill.c:423
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:71
misc image utilities
static const AVFilterPad floodfill_outputs[]
Definition: vf_floodfill.c:396
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2589
Main libavfilter public API header.
const char * desc
Definition: nvenc.c:79
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:168
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:413
#define AV_PIX_FMT_GRAY9
Definition: pixfmt.h:377
static int is_inside(int x, int y, int w, int h)
Definition: vf_floodfill.c:53
static void pick_pixel4_16(AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
Definition: vf_floodfill.c:225
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
Definition: mem.c:245
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:300
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:378
#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:125
const char * name
Pad name.
Definition: internal.h:60
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1075
static int is_same1_16(AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
Definition: vf_floodfill.c:120
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:117
#define av_cold
Definition: attributes.h:88
static int config_input(AVFilterLink *inlink)
Definition: vf_floodfill.c:238
AVOptions.
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:92
#define AV_PIX_FMT_GBRP9
Definition: pixfmt.h:412
static AVFrame * frame
static const uint64_t c1
Definition: murmur3.c:49
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:410
static void pick_pixel3_16(AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
Definition: vf_floodfill.c:201
static int is_same4(AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
Definition: vf_floodfill.c:60
A filter pad used for either input or output.
Definition: internal.h:54
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
int width
Definition: frame.h:358
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:605
#define s2
Definition: regdef.h:39
#define S(s, c, i)
#define AVERROR(e)
Definition: error.h:43
static void set_pixel4_16(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
Definition: vf_floodfill.c:167
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:188
void * priv
private data for use by the filter
Definition: avfilter.h:353
#define s0
Definition: regdef.h:37
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:441
#define AV_PIX_FMT_GBRAP12
Definition: pixfmt.h:418
void(* set_pixel)(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
Definition: vf_floodfill.c:47
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:400
static void set_pixel4(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
Definition: vf_floodfill.c:158
static void pick_pixel1(AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
Definition: vf_floodfill.c:176
#define AV_PIX_FMT_GBRAP16
Definition: pixfmt.h:419
#define AV_PIX_FMT_GBRP16
Definition: pixfmt.h:416
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:381
#define FLAGS
Definition: vf_floodfill.c:405
static int is_same3_16(AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
Definition: vf_floodfill.c:98
uint8_t w
Definition: llviddspenc.c:38
AVFormatContext * ctx
Definition: movenc.c:48
#define s(width, name)
Definition: cbs_vp9.c:257
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:436
static const AVFilterPad inputs[]
Definition: af_acontrast.c:193
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:396
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:415
AVFILTER_DEFINE_CLASS(floodfill)
#define s3
Definition: regdef.h:40
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
static int filter_frame(AVFilterLink *link, AVFrame *frame)
Definition: vf_floodfill.c:281
typedef void(RENAME(mix_any_func_type))
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:331
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:177
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:81
#define AV_PIX_FMT_GRAY14
Definition: pixfmt.h:380
#define AV_RN16(p)
Definition: intreadwrite.h:360
static void set_pixel1(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
Definition: vf_floodfill.c:130
Describe the class of an AVClass context structure.
Definition: log.h:67
Filter definition.
Definition: avfilter.h:144
uint16_t x
Definition: vf_floodfill.c:30
static int is_same3(AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
Definition: vf_floodfill.c:86
const char * name
Filter name.
Definition: avfilter.h:148
#define s1
Definition: regdef.h:38
#define OFFSET(x)
Definition: vf_floodfill.c:404
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:350
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:414
int av_frame_make_writable(AVFrame *frame)
Ensure that the frame data is writable, avoiding data copy if possible.
Definition: frame.c:612
#define flags(name, subs,...)
Definition: cbs_av1.c:576
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:404
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:314
static int is_same4_16(AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
Definition: vf_floodfill.c:73
static void set_pixel3(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
Definition: vf_floodfill.c:142
int
static void pick_pixel1_16(AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
Definition: vf_floodfill.c:183
Y , 8bpp.
Definition: pixfmt.h:74
static void pick_pixel4(AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
Definition: vf_floodfill.c:212
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:215
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:433
static const uint64_t c2
Definition: murmur3.c:50
static void pick_pixel3(AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
Definition: vf_floodfill.c:190
A list of supported formats for one end of a filter link.
Definition: formats.h:64
An instance of a filter.
Definition: avfilter.h:338
int height
Definition: frame.h:358
#define av_freep(p)
#define AV_WN16(p, v)
Definition: intreadwrite.h:372
static const AVOption floodfill_options[]
Definition: vf_floodfill.c:407
uint16_t y
Definition: vf_floodfill.c:30
int(* is_same)(AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
Definition: vf_floodfill.c:45
static int is_same1(AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
Definition: vf_floodfill.c:110
formats
Definition: signature.h:48
static const AVFilterPad floodfill_inputs[]
Definition: vf_floodfill.c:386
internal API functions
static void set_pixel1_16(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
Definition: vf_floodfill.c:136
static void set_pixel3_16(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
Definition: vf_floodfill.c:150
int depth
Number of bits in the component.
Definition: pixdesc.h:58
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
static av_cold int query_formats(AVFilterContext *ctx)
Definition: vf_floodfill.c:358
static av_cold void uninit(AVFilterContext *ctx)
Definition: vf_floodfill.c:379