From 1b2ed0c392f12ae836ea3b8ae87a8e29ad6e967c Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Tue, 1 Oct 2019 20:17:50 +0200 Subject: [PATCH] avfilter/vf_drawbox: implement process_command --- doc/filters.texi | 14 ++++++++++++++ libavfilter/vf_drawbox.c | 42 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/doc/filters.texi b/doc/filters.texi index b00787d2e8..e46839bfec 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -8847,6 +8847,13 @@ drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t*2:h=iw/2.4+t*2:t=2:c=red @end example @end itemize +@subsection Commands +This filter supports same commands as options. +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. + @section drawgrid Draw a grid on the input image. @@ -8932,6 +8939,13 @@ drawgrid=w=iw/3:h=ih/3:t=2:c=white@@0.5 @end example @end itemize +@subsection Commands +This filter supports same commands as options. +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. + @anchor{drawtext} @section drawtext diff --git a/libavfilter/vf_drawbox.c b/libavfilter/vf_drawbox.c index 91bfeb2414..e5f5351b9d 100644 --- a/libavfilter/vf_drawbox.c +++ b/libavfilter/vf_drawbox.c @@ -273,6 +273,46 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) return ff_filter_frame(inlink->dst->outputs[0], frame); } +static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags) +{ + DrawBoxContext *s = ctx->priv; + int ret; + + if ( !strcmp(cmd, "w") || !strcmp(cmd, "width") + || !strcmp(cmd, "h") || !strcmp(cmd, "height") + || !strcmp(cmd, "x") || !strcmp(cmd, "y") + || !strcmp(cmd, "t") || !strcmp(cmd, "thickness") + || !strcmp(cmd, "c") || !strcmp(cmd, "color") + || !strcmp(cmd, "replace")) { + + int old_x = s->x; + int old_y = s->y; + int old_w = s->w; + int old_h = s->h; + int old_t = s->thickness; + int old_r = s->replace; + + AVFilterLink *inlink = ctx->inputs[0]; + + av_opt_set(s, cmd, args, 0); + init(ctx); + + if ((ret = config_input(inlink)) < 0) { + s->x = old_x; + s->y = old_y; + s->w = old_w; + s->h = old_h; + s->thickness = old_t; + s->replace = old_r; + return ret; + } + } else { + ret = AVERROR(ENOSYS); + } + + return ret; +} + #define OFFSET(x) offsetof(DrawBoxContext, x) #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM @@ -323,6 +363,7 @@ AVFilter ff_vf_drawbox = { .query_formats = query_formats, .inputs = drawbox_inputs, .outputs = drawbox_outputs, + .process_command = process_command, .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, }; #endif /* CONFIG_DRAWBOX_FILTER */ @@ -457,6 +498,7 @@ AVFilter ff_vf_drawgrid = { .inputs = drawgrid_inputs, .outputs = drawgrid_outputs, .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, + .process_command = process_command, }; #endif /* CONFIG_DRAWGRID_FILTER */