[FFmpeg-devel] [PATCH 3/5] avfilter/scale: separate exprs parse and eval

Michael Niedermayer michael at niedermayer.cc
Mon Dec 16 22:14:44 EET 2019


On Sun, Dec 15, 2019 at 10:36:58PM +0530, Gyan wrote:
> 3rd of 5 factorized patches; supersedes
> https://patchwork.ffmpeg.org/patch/16272/

>  scale_eval.c |   69 --------------
>  vf_scale.c   |  286 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
>  2 files changed, 271 insertions(+), 84 deletions(-)
> 2a3ae4ce4e91893fddb020485e6936c82894eb81  0003-avfilter-scale-separate-exprs-parse-and-eval.patch
> From 00b54948b88ae60aa3ab7c158b98e55cb8b967d3 Mon Sep 17 00:00:00 2001
> From: Gyan Doshi <ffmpeg at gyani.pro>
> Date: Thu, 12 Dec 2019 22:54:31 +0530
> Subject: [PATCH 3/5] avfilter/scale: separate exprs parse and eval
> 
> Will allow adding animation support.

[...]
> @@ -566,19 +746,87 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar
>                             char *res, int res_len, int flags)
>  {
>      ScaleContext *scale = ctx->priv;
> -    int ret;
> +    AVFilterLink *outlink = ctx->outputs[0];
> +    char *old_w_str, *old_h_str;
> +    AVExpr *old_w_pexpr, *old_h_pexpr;
> +    int ret, w = 0, h = 0;
> +    const char scale2ref = ctx->filter == &ff_vf_scale2ref;
> +    const char *const *names = scale2ref ? var_names_scale2ref : var_names;
> +
> +    w = !strcmp(cmd, "width")  || !strcmp(cmd, "w");
> +    h = !strcmp(cmd, "height")  || !strcmp(cmd, "h");
> +
> +    if (w || h) {
>  
> -    if (   !strcmp(cmd, "width")  || !strcmp(cmd, "w")
> -        || !strcmp(cmd, "height") || !strcmp(cmd, "h")) {
> +        if (w) {
> +            old_w_str = av_strdup(scale->w_expr);
> +            if (!old_w_str)
> +                return AVERROR(ENOMEM);
> +            old_w_pexpr = scale->w_pexpr;
> +            scale->w_pexpr = NULL;
> +        }
>  
> -        int old_w = scale->w;
> -        int old_h = scale->h;
> -        AVFilterLink *outlink = ctx->outputs[0];
> +        if (h) {
> +            old_h_str = av_strdup(scale->h_expr);
> +            if (!old_h_str)
> +                return AVERROR(ENOMEM);
> +            old_h_pexpr = scale->h_pexpr;
> +            scale->h_pexpr = NULL;
> +        }
>  
>          av_opt_set(scale, cmd, args, 0);
> +

> +        if (w) {
> +            ret = av_expr_parse(&scale->w_pexpr, scale->w_expr,
> +                            names,
> +                            NULL, NULL, NULL, NULL, 0, ctx);
> +            if (ret < 0) {
> +                av_log(ctx, AV_LOG_ERROR, "Cannot parse width expression: '%s'\n", scale->w_expr);
> +                av_opt_set(scale, "w", old_w_str, 0);
> +                av_free(old_w_str);
> +                scale->w_pexpr = old_w_pexpr;
> +                return ret;
> +            }
> +        }
> +
> +        if (h) {
> +            ret = av_expr_parse(&scale->h_pexpr, scale->h_expr,
> +                            names,
> +                            NULL, NULL, NULL, NULL, 0, ctx);
> +            if (ret < 0) {
> +                av_log(ctx, AV_LOG_ERROR, "Cannot parse height expression: '%s'\n", scale->h_expr);
> +                av_opt_set(scale, "h", old_h_str, 0);
> +                av_free(old_h_str);
> +                scale->h_pexpr = old_h_pexpr;
> +                return ret;
> +            }
> +        }
> +
>          if ((ret = config_props(outlink)) < 0) {
> -            scale->w = old_w;
> -            scale->h = old_h;
> +
> +            if (w) {
> +                av_opt_set(scale, "w", old_w_str, 0);
> +                av_free(old_w_str);
> +                av_expr_free(scale->w_pexpr);
> +                scale->w_pexpr = old_w_pexpr;
> +            }
> +            if (h) {
> +                av_opt_set(scale, "h", old_h_str, 0);
> +                av_free(old_h_str);
> +                av_expr_free(scale->h_pexpr);
> +                scale->h_pexpr = old_h_pexpr;
> +            }
> +            av_log(ctx, AV_LOG_ERROR, "Command failed. Continuing with existing parameters.\n");
> +            return ret;
> +        }

the cleanup code is duplicated

also if you can make the overall change this patch is making 
cleaner/clearer that would be welcome too. Its just a feeling
but this seems more messy than what i would expect from spliting
parse out

Thanks


[....]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The greatest way to live with honor in this world is to be what we pretend
to be. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20191216/d9eae1c5/attachment.sig>


More information about the ffmpeg-devel mailing list