Commit 710c97d5 authored by Paul B Mahol's avatar Paul B Mahol

avfilter/vf_premultiply: add planes option

Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent 9d1f9ba5
...@@ -11077,6 +11077,14 @@ of second stream as alpha. ...@@ -11077,6 +11077,14 @@ of second stream as alpha.
Both streams must have same dimensions and same pixel format. Both streams must have same dimensions and same pixel format.
The filter accepts the following option:
@table @option
@item planes
Set which planes will be processed, unprocessed planes will be copied.
By default value 0xf, all planes will be processed.
@end table
@section prewitt @section prewitt
Apply prewitt operator to input video stream. Apply prewitt operator to input video stream.
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
typedef struct PreMultiplyContext { typedef struct PreMultiplyContext {
const AVClass *class; const AVClass *class;
int width[4], height[4]; int width[4], height[4];
int linesize[4];
int nb_planes; int nb_planes;
int planes; int planes;
int half, depth, offset; int half, depth, offset;
...@@ -47,6 +48,7 @@ typedef struct PreMultiplyContext { ...@@ -47,6 +48,7 @@ typedef struct PreMultiplyContext {
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
static const AVOption premultiply_options[] = { static const AVOption premultiply_options[] = {
{ "planes", "set planes", OFFSET(planes), AV_OPT_TYPE_INT, {.i64=0xF}, 0, 0xF, FLAGS },
{ NULL } { NULL }
}; };
...@@ -269,6 +271,12 @@ static int process_frame(FFFrameSync *fs) ...@@ -269,6 +271,12 @@ static int process_frame(FFFrameSync *fs)
} }
for (p = 0; p < s->nb_planes; p++) { for (p = 0; p < s->nb_planes; p++) {
if (!((1 << p) & s->planes)) {
av_image_copy_plane(out->data[p], out->linesize[p], base->data[p], base->linesize[p],
s->linesize[p], s->height[p]);
continue;
}
s->premultiply[p](base->data[p], alpha->data[0], s->premultiply[p](base->data[p], alpha->data[0],
out->data[p], out->data[p],
base->linesize[p], alpha->linesize[0], base->linesize[p], alpha->linesize[0],
...@@ -287,10 +295,13 @@ static int config_input(AVFilterLink *inlink) ...@@ -287,10 +295,13 @@ static int config_input(AVFilterLink *inlink)
AVFilterContext *ctx = inlink->dst; AVFilterContext *ctx = inlink->dst;
PreMultiplyContext *s = ctx->priv; PreMultiplyContext *s = ctx->priv;
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
int vsub, hsub; int vsub, hsub, ret;
s->nb_planes = av_pix_fmt_count_planes(inlink->format); s->nb_planes = av_pix_fmt_count_planes(inlink->format);
if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
return ret;
hsub = desc->log2_chroma_w; hsub = desc->log2_chroma_w;
vsub = desc->log2_chroma_h; vsub = desc->log2_chroma_h;
s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, vsub); s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, vsub);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment