46 unsigned s0,
unsigned s1,
unsigned s2,
unsigned s3);
48 unsigned d0,
unsigned d1,
unsigned d2,
unsigned d3);
50 int *s0,
int *s1,
int *s2,
int *s3);
55 if (x >= 0 && x < w && y >= 0 && y <
h)
61 unsigned s0,
unsigned s1,
unsigned s2,
unsigned s3)
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];
68 if (s0 == c0 && s1 ==
c1 && s2 ==
c2 && s3 == c3)
74 unsigned s0,
unsigned s1,
unsigned s2,
unsigned s3)
81 if (s0 == c0 && s1 ==
c1 && s2 ==
c2 && s3 == c3)
87 unsigned s0,
unsigned s1,
unsigned s2,
unsigned s3)
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];
93 if (s0 == c0 && s1 ==
c1 && s2 ==
c2)
99 unsigned s0,
unsigned s1,
unsigned s2,
unsigned s3)
105 if (s0 == c0 && s1 ==
c1 && s2 ==
c2)
111 unsigned s0,
unsigned s1,
unsigned s2,
unsigned s3)
113 unsigned c0 =
frame->data[0][y *
frame->linesize[0] + x];
121 unsigned s0,
unsigned s1,
unsigned s2,
unsigned s3)
131 unsigned d0,
unsigned d1,
unsigned d2,
unsigned d3)
133 frame->data[0][y *
frame->linesize[0] + x] = d0;
137 unsigned d0,
unsigned d1,
unsigned d2,
unsigned d3)
143 unsigned d0,
unsigned d1,
unsigned d2,
unsigned d3)
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;
151 unsigned d0,
unsigned d1,
unsigned d2,
unsigned d3)
159 unsigned d0,
unsigned d1,
unsigned d2,
unsigned d3)
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;
168 unsigned d0,
unsigned d1,
unsigned d2,
unsigned d3)
177 int *s0,
int *s1,
int *s2,
int *s3)
180 *s0 =
frame->data[0][y *
frame->linesize[0] + x];
184 int *s0,
int *s1,
int *s2,
int *s3)
191 int *s0,
int *s1,
int *s2,
int *s3)
194 *s0 =
frame->data[0][y *
frame->linesize[0] + x];
196 *s1 =
frame->data[1][y *
frame->linesize[1] + x];
198 *s2 =
frame->data[2][y *
frame->linesize[2] + x];
202 int *s0,
int *s1,
int *s2,
int *s3)
213 int *s0,
int *s1,
int *s2,
int *s3)
216 *s0 =
frame->data[0][y *
frame->linesize[0] + x];
218 *s1 =
frame->data[1][y *
frame->linesize[1] + x];
220 *s2 =
frame->data[2][y *
frame->linesize[2] + x];
222 *s3 =
frame->data[3][y *
frame->linesize[3] + x];
226 int *s0,
int *s1,
int *s2,
int *s3)
246 depth =
desc->comp[0].depth;
248 switch (
s->nb_planes) {
260 switch (
s->nb_planes) {
280 const unsigned d0 =
s->d[0];
281 const unsigned d1 =
s->d[1];
282 const unsigned d2 =
s->d[2];
283 const unsigned d3 =
s->d[3];
288 const int w =
frame->width;
289 const int h =
frame->height;
290 size_t nb_points, points_size;
294 if (
w > UINT16_MAX + 1 ||
h > UINT16_MAX + 1 ||
296 av_size_mult(nb_points, 4 *
sizeof(*
s->points), &points_size) < 0) {
308 s->pick_pixel(
frame,
s->x,
s->y, &s0, &s1, &s2, &s3);
314 for (
i = 0;
i <
s->nb_planes;
i++) {
315 if (
s->S[
i] !=
s->d[
i])
319 if (
i ==
s->nb_planes)
322 if (
s->is_same(
frame,
s->x,
s->y, s0, s1, s2, s3)) {
323 s->points[front].x =
s->x;
324 s->points[front].y =
s->y;
337 x =
s->points[front].x;
338 y =
s->points[front].y;
340 if (
s->is_same(
frame, x, y, s0, s1, s2, s3)) {
341 s->set_pixel(
frame, x, y, d0, d1, d2, d3);
344 s->points[front] .x = x + 1;
345 s->points[front++].y = y;
349 s->points[front] .x = x - 1;
350 s->points[front++].y = y;
354 s->points[front] .x = x;
355 s->points[front++].y = y + 1;
359 s->points[front] .x = x;
360 s->points[front++].y = y - 1;
397#define OFFSET(x) offsetof(FloodfillContext, x)
398#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
417 .p.name =
"floodfill",
419 .p.priv_class = &floodfill_class,
static int config_input(AVFilterLink *inlink)
const FFFilter ff_vf_floodfill
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
Make sure a frame is writable.
Main libavfilter public API header.
#define i(width, name, range_min, range_max)
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
@ AV_OPT_TYPE_INT
Underlying C type is int.
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
int av_size_mult(size_t a, size_t b, size_t *r)
Multiply two size_t values checking for overflow.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
#define FILTER_PIXFMTS_ARRAY(array)
#define AVFILTER_DEFINE_CLASS(fname)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Memory handling functions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP12
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
#define AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY14
#define AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P10
Describe the class of an AVClass context structure.
A link between two filters.
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
void(* set_pixel)(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
void(* pick_pixel)(const AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
int(* is_same)(const AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
static AVFormatContext * ctx
static enum AVPixelFormat pixel_fmts[]
static const AVOption floodfill_options[]
static void set_pixel3_16(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
static void set_pixel3(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
static int is_same1(const AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
static int is_same4_16(const AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
static void pick_pixel4_16(const AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
static void pick_pixel1(const AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
static int is_same3(const AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
static int is_inside(int x, int y, int w, int h)
static int config_input(AVFilterLink *inlink)
static int is_same1_16(const AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
static void pick_pixel3(const AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
static void pick_pixel3_16(const AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
static int is_same3_16(const AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
static void pick_pixel4(const AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
static int filter_frame(AVFilterLink *link, AVFrame *frame)
static void set_pixel1(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
static av_cold void uninit(AVFilterContext *ctx)
static void pick_pixel1_16(const AVFrame *frame, int x, int y, int *s0, int *s1, int *s2, int *s3)
static int is_same4(const AVFrame *frame, int x, int y, unsigned s0, unsigned s1, unsigned s2, unsigned s3)
static const AVFilterPad floodfill_inputs[]
static void set_pixel4_16(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
static void set_pixel4(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
static void set_pixel1_16(AVFrame *frame, int x, int y, unsigned d0, unsigned d1, unsigned d2, unsigned d3)
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.