[FFmpeg-devel] [PATCH] libavfilter/scale: Populate ow/oh when using 0 as w/h
Kevin Mark
kmark937 at gmail.com
Mon Jun 12 08:56:27 EEST 2017
I screwed up my git-send-email. Please ignore this patch as I already
submitted what should be an identical one on June 7th. My apologies.
On Mon, Jun 12, 2017 at 1:51 AM, Kevin Mark <kmark937 at gmail.com> wrote:
> The input width and height is known at parse time so there's no
> reason ow/oh should not be usable when using 0 as the width or
> height expression.
>
> Previously in "scale=0:ow" ow would be set to "0" which works,
> conveniently, as "scale=0:0" is perfectly valid input but this breaks
> down when you do something like "scale=0:ow/4" which one could
> reasonably expect to work as well, but does not as ow is 0 not the
> real value.
>
> This change handles the 0 case for w/h immediately so the ow/oh
> variables work as expected. Consequently, the rest of the code does
> not need to handle 0 input. w/h will always be > 0 or < 0.
>
> Signed-off-by: Kevin Mark <kmark937 at gmail.com>
> ---
> libavfilter/scale.c | 13 +++++--------
> 1 file changed, 5 insertions(+), 8 deletions(-)
>
> diff --git a/libavfilter/scale.c b/libavfilter/scale.c
> index 03745ddcb8..a6c32e3978 100644
> --- a/libavfilter/scale.c
> +++ b/libavfilter/scale.c
> @@ -158,19 +158,19 @@ int ff_scale_eval_dimensions(void *log_ctx,
> av_expr_parse_and_eval(&res, (expr = w_expr),
> names, var_values,
> NULL, NULL, NULL, NULL, NULL, 0, log_ctx);
> - eval_w = var_values[VAR_OUT_W] = var_values[VAR_OW] = res;
> + eval_w = var_values[VAR_OUT_W] = var_values[VAR_OW] = (int) res == 0 ? inlink->w : res;
>
> if ((ret = av_expr_parse_and_eval(&res, (expr = h_expr),
> names, var_values,
> NULL, NULL, NULL, NULL, NULL, 0, log_ctx)) < 0)
> goto fail;
> - eval_h = var_values[VAR_OUT_H] = var_values[VAR_OH] = res;
> + eval_h = var_values[VAR_OUT_H] = var_values[VAR_OH] = (int) res == 0 ? inlink->h : res;
> /* evaluate again the width, as it may depend on the output height */
> if ((ret = av_expr_parse_and_eval(&res, (expr = w_expr),
> names, var_values,
> NULL, NULL, NULL, NULL, NULL, 0, log_ctx)) < 0)
> goto fail;
> - eval_w = res;
> + eval_w = (int) res == 0 ? inlink->w : res;
>
> w = eval_w;
> h = eval_h;
> @@ -186,13 +186,10 @@ int ff_scale_eval_dimensions(void *log_ctx,
> factor_h = -h;
> }
>
> - if (w < 0 && h < 0)
> - eval_w = eval_h = 0;
> -
> - if (!(w = eval_w))
> + if (w < 0 && h < 0) {
> w = inlink->w;
> - if (!(h = eval_h))
> h = inlink->h;
> + }
>
> /* Make sure that the result is divisible by the factor we determined
> * earlier. If no factor was set, it is nothing will happen as the default
> --
> 2.13.1
>
More information about the ffmpeg-devel
mailing list