From d2b78fe6b71f3637ea61c71c0dde1fe3e2544177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernd=20Ble=C3=9Fmann?= Date: Tue, 21 Jul 2015 12:48:33 +0200 Subject: [PATCH] libavfilter/vf_crop: implement process_command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bernd Bleßmann Signed-off-by: Michael Niedermayer --- doc/filters.texi | 20 ++++++++++++++-- libavfilter/vf_crop.c | 53 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 28aaef3e7e..348e8d7e90 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -3481,12 +3481,12 @@ It accepts the following parameters: @item w, out_w The width of the output video. It defaults to @code{iw}. This expression is evaluated only once during the filter -configuration. +configuration, or when the @samp{w} or @samp{out_w} command is sent. @item h, out_h The height of the output video. It defaults to @code{ih}. This expression is evaluated only once during the filter -configuration. +configuration, or when the @samp{h} or @samp{out_h} command is sent. @item x The horizontal position, in the input video, of the left edge of the output @@ -3646,6 +3646,22 @@ crop=in_w/2:in_h/2:y:10+10*sin(n/10) @end example @end itemize +@subsection Commands + +This filter supports the following commands: +@table @option +@item w, out_w +@item h, out_h +@item x +@item y +Set width/height of the output video and the horizontal/vertical position +in the input video. +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. +@end table + @section cropdetect Auto-detect the crop size. diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c index f58a7ae80f..5679a44436 100644 --- a/libavfilter/vf_crop.c +++ b/libavfilter/vf_crop.c @@ -296,6 +296,42 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) return ff_filter_frame(link->dst->outputs[0], frame); } +static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, + char *res, int res_len, int flags) +{ + CropContext *s = ctx->priv; + int ret; + + if ( !strcmp(cmd, "out_w") || !strcmp(cmd, "w") + || !strcmp(cmd, "out_h") || !strcmp(cmd, "h") + || !strcmp(cmd, "x") || !strcmp(cmd, "y")) { + + int old_x = s->x; + int old_y = s->y; + int old_w = s->w; + int old_h = s->h; + + AVFilterLink *outlink = ctx->outputs[0]; + AVFilterLink *inlink = ctx->inputs[0]; + + av_opt_set(s, cmd, args, 0); + + if ((ret = config_input(inlink)) < 0) { + s->x = old_x; + s->y = old_y; + s->w = old_w; + s->h = old_h; + return ret; + } + + ret = config_output(outlink); + + } else + ret = AVERROR(ENOSYS); + + return ret; +} + #define OFFSET(x) offsetof(CropContext, x) #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM @@ -332,12 +368,13 @@ static const AVFilterPad avfilter_vf_crop_outputs[] = { }; AVFilter ff_vf_crop = { - .name = "crop", - .description = NULL_IF_CONFIG_SMALL("Crop the input video."), - .priv_size = sizeof(CropContext), - .priv_class = &crop_class, - .query_formats = query_formats, - .uninit = uninit, - .inputs = avfilter_vf_crop_inputs, - .outputs = avfilter_vf_crop_outputs, + .name = "crop", + .description = NULL_IF_CONFIG_SMALL("Crop the input video."), + .priv_size = sizeof(CropContext), + .priv_class = &crop_class, + .query_formats = query_formats, + .uninit = uninit, + .inputs = avfilter_vf_crop_inputs, + .outputs = avfilter_vf_crop_outputs, + .process_command = process_command, };