[FFmpeg-devel] [PATCH] lavfi/overlay: add process_command callback

Paul B Mahol onemda at gmail.com
Wed Feb 20 15:49:11 CET 2013


On 2/19/13, Stefano Sabatini <stefasab at gmail.com> wrote:
> ---
>  doc/filters.texi         |   14 ++++++++++++
>  libavfilter/vf_overlay.c |   53
> ++++++++++++++++++++++++++++++----------------
>  2 files changed, 49 insertions(+), 18 deletions(-)
>
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 8ddbac4..f8279bd 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -3936,6 +3936,20 @@ the @var{movie} filter.
>  You can chain together more overlays but you should test the
>  efficiency of such approach.
>
> + at subsection Commands
> +
> +This filter supports the following command:
> + at table @option
> + at item x
> +Set the @option{x} option expression.
> +
> + at item y
> +Set the @option{y} option expression.
> +
> + at item enable
> +Set the @option{enable} option expression.
> + at end table
> +
>  @subsection Examples
>
>  @itemize
> diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c
> index c9dedb5..b2d68ba 100644
> --- a/libavfilter/vf_overlay.c
> +++ b/libavfilter/vf_overlay.c
> @@ -168,6 +168,36 @@ static av_cold void uninit(AVFilterContext *ctx)
>      ff_bufqueue_discard_all(&over->queue_over);
>  }
>
> +static int configure_expr(AVExpr **pexpr, const char *expr, void *log_ctx)
> +{
> +    int ret;
> +
> +    if (*pexpr)
> +        av_expr_free(*pexpr);
> +    *pexpr = NULL;
> +    ret = av_expr_parse(pexpr, expr, var_names,
> +                        NULL, NULL, NULL, NULL, 0, log_ctx);
> +    if (ret < 0)
> +        av_log(NULL, AV_LOG_ERROR,

Why NULL? When there is log_ctx.


> +               "Error when evaluating the expression '%s'\n", expr);
> +    return ret;
> +}
> +
> +static int process_command(AVFilterContext *ctx, const char *cmd, const
> char *args,
> +                           char *res, int res_len, int flags)
> +{
> +    OverlayContext *over = ctx->priv;
> +
> +    if      (!strcmp(cmd, "x"))
> +        return configure_expr(&over->x_pexpr, args, ctx);
> +    else if (!strcmp(cmd, "y"))
> +        return configure_expr(&over->y_pexpr, args, ctx);
> +    else if (!strcmp(cmd, "enable"))
> +        return configure_expr(&over->enable_pexpr, args, ctx);
> +    else
> +        return AVERROR(ENOSYS);

Why ENOSYS? Isn't EINVAL better?

> +}
> +
>  static int query_formats(AVFilterContext *ctx)
>  {
>      OverlayContext *over = ctx->priv;
> @@ -250,7 +280,6 @@ static int config_input_overlay(AVFilterLink *inlink)
>  {
>      AVFilterContext *ctx  = inlink->dst;
>      OverlayContext  *over = inlink->dst->priv;
> -    char *expr;
>      int ret;
>      const AVPixFmtDescriptor *pix_desc =
> av_pix_fmt_desc_get(inlink->format);
>
> @@ -270,18 +299,10 @@ static int config_input_overlay(AVFilterLink *inlink)
>      over->var_values[VAR_T]     = NAN;
>      over->var_values[VAR_POS]   = NAN;
>
> -    expr = over->x_expr;
> -    if ((ret = av_expr_parse(&over->x_pexpr, expr, var_names,
> -                             NULL, NULL, NULL, NULL, 0, ctx)) < 0)
> -        goto fail;
> -    expr = over->y_expr;
> -    if ((ret = av_expr_parse(&over->y_pexpr, expr, var_names,
> -                             NULL, NULL, NULL, NULL, 0, ctx)) < 0)
> -        goto fail;
> -    expr = over->enable_expr;
> -    if ((ret = av_expr_parse(&over->enable_pexpr, expr, var_names,
> -                             NULL, NULL, NULL, NULL, 0, ctx)) < 0)
> -        goto fail;
> +    if ((ret = configure_expr(&over->x_pexpr, over->x_expr, ctx) < 0) ||
> +        (ret = configure_expr(&over->y_pexpr, over->y_expr, ctx) < 0) ||
> +        (ret = configure_expr(&over->enable_pexpr, over->enable_expr, ctx)
> < 0))
> +        return ret;
>
>      over->overlay_is_packed_rgb =
>          ff_fill_rgba_map(over->overlay_rgba_map, inlink->format) >= 0;
> @@ -294,11 +315,6 @@ static int config_input_overlay(AVFilterLink *inlink)
>             ctx->inputs[OVERLAY]->w, ctx->inputs[OVERLAY]->h,
>             av_get_pix_fmt_name(ctx->inputs[OVERLAY]->format));
>      return 0;
> -
> -fail:
> -    av_log(NULL, AV_LOG_ERROR,
> -           "Error when evaluating the expression '%s'\n", expr);
> -    return ret;
>  }
>
>  static int config_output(AVFilterLink *outlink)
> @@ -695,6 +711,7 @@ AVFilter avfilter_vf_overlay = {
>      .priv_size = sizeof(OverlayContext),
>
>      .query_formats = query_formats,
> +    .process_command = process_command,
>
>      .inputs    = avfilter_vf_overlay_inputs,
>      .outputs   = avfilter_vf_overlay_outputs,
> --
> 1.7.9.5

LGTM otherwise


More information about the ffmpeg-devel mailing list