Signed-off-by: Bernd Bleßmann <b...@it-entwicklung.de> --- doc/filters.texi | 13 +++++++++++++ libavfilter/vf_scale.c | 43 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 47 insertions(+), 9 deletions(-)
diff --git a/doc/filters.texi b/doc/filters.texi index 2b0359d..28aaef3 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -8906,6 +8906,19 @@ scale=w='min(500\, iw*3/2):h=-1' @end example @end itemize +@subsection Commands + +This filter supports the following commands: +@table @option +@item width, w +@item height, h +Set the output video dimension expression. +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 separatefields The @code{separatefields} takes a frame-based video input and splits diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 2a3d008..d4c0be2 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -544,6 +544,30 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) return ff_filter_frame(outlink, out); } +static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, + char *res, int res_len, int flags) +{ + ScaleContext *scale = ctx->priv; + int ret; + + if ( !strcmp(cmd, "width") || !strcmp(cmd, "w") + || !strcmp(cmd, "height") || !strcmp(cmd, "h")) { + + int old_w = scale->w; + int old_h = scale->h; + AVFilterLink *outlink = ctx->outputs[0]; + + av_opt_set(scale, cmd, args, 0); + if ((ret = config_props(outlink)) < 0) { + scale->w = old_w; + scale->h = old_h; + } + } else + ret = AVERROR(ENOSYS); + + return ret; +} + static const AVClass *child_class_next(const AVClass *prev) { return prev ? NULL : sws_get_class(); @@ -610,13 +634,14 @@ static const AVFilterPad avfilter_vf_scale_outputs[] = { }; AVFilter ff_vf_scale = { - .name = "scale", - .description = NULL_IF_CONFIG_SMALL("Scale the input video size and/or convert the image format."), - .init_dict = init_dict, - .uninit = uninit, - .query_formats = query_formats, - .priv_size = sizeof(ScaleContext), - .priv_class = &scale_class, - .inputs = avfilter_vf_scale_inputs, - .outputs = avfilter_vf_scale_outputs, + .name = "scale", + .description = NULL_IF_CONFIG_SMALL("Scale the input video size and/or convert the image format."), + .init_dict = init_dict, + .uninit = uninit, + .query_formats = query_formats, + .priv_size = sizeof(ScaleContext), + .priv_class = &scale_class, + .inputs = avfilter_vf_scale_inputs, + .outputs = avfilter_vf_scale_outputs, + .process_command = process_command, }; -- 2.1.4 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel