49 #define OFFSET(x) offsetof(ExtractPlanesContext, x)
50 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
65 #define EIGHTBIT_FORMATS \
69 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, \
70 AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA422P, \
71 AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, \
72 AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P, \
73 AV_PIX_FMT_YUVJ411P, \
74 AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA444P, \
75 AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY8A, \
76 AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24, \
77 AV_PIX_FMT_RGBA, AV_PIX_FMT_BGRA, \
78 AV_PIX_FMT_ARGB, AV_PIX_FMT_ABGR, \
79 AV_PIX_FMT_RGB0, AV_PIX_FMT_BGR0, \
80 AV_PIX_FMT_0RGB, AV_PIX_FMT_0BGR, \
81 AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP
83 #define HIGHDEPTH_FORMATS(suf) \
84 AV_PIX_FMT_YA16##suf, AV_PIX_FMT_GRAY16##suf, \
85 AV_PIX_FMT_YUV420P16##suf, AV_PIX_FMT_YUVA420P16##suf, \
86 AV_PIX_FMT_YUV422P16##suf, AV_PIX_FMT_YUVA422P16##suf, \
87 AV_PIX_FMT_YUV444P16##suf, AV_PIX_FMT_YUVA444P16##suf, \
88 AV_PIX_FMT_RGB48##suf, AV_PIX_FMT_BGR48##suf, \
89 AV_PIX_FMT_RGBA64##suf, AV_PIX_FMT_BGRA64##suf, \
90 AV_PIX_FMT_GBRP16##suf, AV_PIX_FMT_GBRAP16##suf, \
91 AV_PIX_FMT_YUV420P10##suf, \
92 AV_PIX_FMT_YUV422P10##suf, \
93 AV_PIX_FMT_YUV444P10##suf, \
94 AV_PIX_FMT_YUV440P10##suf, \
95 AV_PIX_FMT_YUVA420P10##suf, \
96 AV_PIX_FMT_YUVA422P10##suf, \
97 AV_PIX_FMT_YUVA444P10##suf, \
98 AV_PIX_FMT_YUV420P12##suf, \
99 AV_PIX_FMT_YUV422P12##suf, \
100 AV_PIX_FMT_YUV444P12##suf, \
101 AV_PIX_FMT_YUV440P12##suf, \
102 AV_PIX_FMT_YUVA422P12##suf, \
103 AV_PIX_FMT_YUVA444P12##suf, \
104 AV_PIX_FMT_GBRP10##suf, AV_PIX_FMT_GBRAP10##suf, \
105 AV_PIX_FMT_GBRP12##suf, AV_PIX_FMT_GBRAP12##suf, \
106 AV_PIX_FMT_YUV420P9##suf, \
107 AV_PIX_FMT_YUV422P9##suf, \
108 AV_PIX_FMT_YUV444P9##suf, \
109 AV_PIX_FMT_YUVA420P9##suf, \
110 AV_PIX_FMT_YUVA422P9##suf, \
111 AV_PIX_FMT_YUVA444P9##suf, \
112 AV_PIX_FMT_GBRP9##suf, \
113 AV_PIX_FMT_GBRP14##suf, \
114 AV_PIX_FMT_YUV420P14##suf, \
115 AV_PIX_FMT_YUV422P14##suf, \
116 AV_PIX_FMT_YUV444P14##suf
118 #define FLOAT_FORMATS(suf) \
119 AV_PIX_FMT_GRAYF32##suf, \
120 AV_PIX_FMT_GBRPF32##suf, AV_PIX_FMT_GBRAPF32##suf \
152 int i, ret, depth = 0, be = 0;
154 if (!
ctx->inputs[0]->incfg.formats ||
155 !
ctx->inputs[0]->incfg.formats->nb_formats) {
159 avff =
ctx->inputs[0]->incfg.formats;
161 depth =
desc->comp[0].depth;
164 in_pixfmts = in_pixfmts_be;
166 in_pixfmts = in_pixfmts_le;
168 if (!
ctx->inputs[0]->outcfg.formats)
174 if (depth !=
desc->comp[0].depth ||
181 out_pixfmts = out8_pixfmts;
182 else if (!be && depth == 9)
183 out_pixfmts = out9le_pixfmts;
184 else if (be && depth == 9)
185 out_pixfmts = out9be_pixfmts;
186 else if (!be && depth == 10)
187 out_pixfmts = out10le_pixfmts;
188 else if (be && depth == 10)
189 out_pixfmts = out10be_pixfmts;
190 else if (!be && depth == 12)
191 out_pixfmts = out12le_pixfmts;
192 else if (be && depth == 12)
193 out_pixfmts = out12be_pixfmts;
194 else if (!be && depth == 14)
195 out_pixfmts = out14le_pixfmts;
196 else if (be && depth == 14)
197 out_pixfmts = out14be_pixfmts;
198 else if (be && depth == 16)
199 out_pixfmts = out16be_pixfmts;
200 else if (!be && depth == 16)
201 out_pixfmts = out16le_pixfmts;
202 else if (be && depth == 32)
203 out_pixfmts = out32be_pixfmts;
205 out_pixfmts = out32le_pixfmts;
207 for (
i = 0;
i <
ctx->nb_outputs;
i++)
218 int plane_avail, ret,
i;
225 if (
s->requested_planes & ~plane_avail) {
232 s->depth =
desc->comp[0].depth >> 3;
235 (
desc->nb_components > 1);
238 for (
i = 0;
i < 4;
i++)
239 s->map[
i] = rgba_map[
s->map[
i]];
251 const int output = outlink->
srcpad -
ctx->output_pads;
253 if (
s->map[output] == 1 ||
s->map[output] == 2) {
264 int depth,
int step,
int comp)
268 for (y = 0; y <
height; y++) {
271 for (x = 0; x <
width; x++)
275 for (x = 0; x <
width; x++) {
276 dst[x * 2 ] =
src[x * step +
comp * 2 ];
277 dst[x * 2 + 1] =
src[x * step +
comp * 2 + 1];
290 int i, eof = 0, ret = 0;
292 for (
i = 0;
i <
ctx->nb_outputs;
i++) {
294 const int idx =
s->map[
i];
310 outlink->
w, outlink->
h,
316 s->linesize[idx], outlink->
h);
327 if (eof ==
ctx->nb_outputs)
337 int planes = (
s->requested_planes & 0xf) | (
s->requested_planes >> 4);
340 for (
i = 0;
i < 4;
i++) {
350 s->map[
ctx->nb_outputs] =
i;
368 for (
i = 0;
i <
ctx->nb_outputs;
i++)
383 .
name =
"extractplanes",
386 .priv_class = &extractplanes_class,
395 #if CONFIG_ALPHAEXTRACT_FILTER
407 .
name =
"alphaextract",
409 "grayscale image component."),
411 .
init = init_alphaextract,
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
AVFilter ff_vf_alphaextract
int ff_outlink_get_status(AVFilterLink *link)
Get the status on an output link.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
char * av_asprintf(const char *fmt,...)
#define flags(name, subs,...)
#define AV_CEIL_RSHIFT(a, b)
int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt)
static void comp(unsigned char *dst, ptrdiff_t dst_stride, unsigned char *src, ptrdiff_t src_stride, int add)
#define AVFILTER_FLAG_DYNAMIC_OUTPUTS
The number of the filter outputs is not determined just by AVFilter.outputs.
#define AVERROR_EOF
End of file.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
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.
int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width)
Fill plane linesizes for an image with pixel format pix_fmt and width width.
static int ff_insert_outpad(AVFilterContext *f, unsigned index, AVFilterPad *p)
Insert a new output pad for the filter.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static const struct @322 planes[]
int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel for the pixel format described by pixdesc, including any padding ...
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
#define AV_PIX_FMT_FLAG_BE
Pixel format is big-endian.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_GRAY16BE
Y , 16bpp, big-endian.
@ AV_PIX_FMT_GRAY10LE
Y , 10bpp, little-endian.
@ AV_PIX_FMT_GRAYF32LE
IEEE-754 single precision Y, 32bpp, little-endian.
@ AV_PIX_FMT_GRAY12LE
Y , 12bpp, little-endian.
@ AV_PIX_FMT_GRAY12BE
Y , 12bpp, big-endian.
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_GRAY14LE
Y , 14bpp, little-endian.
@ AV_PIX_FMT_GRAY9BE
Y , 9bpp, big-endian.
@ AV_PIX_FMT_GRAYF32BE
IEEE-754 single precision Y, 32bpp, big-endian.
@ AV_PIX_FMT_GRAY16LE
Y , 16bpp, little-endian.
@ AV_PIX_FMT_GRAY9LE
Y , 9bpp, little-endian.
@ AV_PIX_FMT_GRAY10BE
Y , 10bpp, big-endian.
@ AV_PIX_FMT_GRAY14BE
Y , 14bpp, big-endian.
Describe the class of an AVClass context structure.
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * src
source filter
AVFilterPad * srcpad
output pad on the source filter
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
int(* config_props)(AVFilterLink *link)
Link configuration callback.
enum AVMediaType type
AVFilterPad type.
const char * name
Pad name.
const char * name
Filter name.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.