[FFmpeg-devel] [PATCH] lavfi/overlay: add enable option

Paul B Mahol onemda at gmail.com
Wed Feb 20 15:53:29 CET 2013


On 2/19/13, Stefano Sabatini <stefasab at gmail.com> wrote:
> TODO: bump micro
> ---
>  doc/filters.texi         |   10 ++++++++--
>  libavfilter/vf_overlay.c |   20 +++++++++++++++-----
>  2 files changed, 23 insertions(+), 7 deletions(-)
>
> diff --git a/doc/filters.texi b/doc/filters.texi
> index da03a69..8ddbac4 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -3862,6 +3862,12 @@ frame. Default value is "0" for both expressions. In
> case the
>  expression is invalid, it is set to a huge value (meaning that the
>  overlay will not be displayed within the output visible area).
>
> + at item enable
> +Set the expression which enables the overlay. The expression is
> +evaluated for each new output frame, if the evaluation is different
> +from 0, the overlay is displayed on top of the input frame. By default
> +it is "1".
> +
>  @item format
>  Set the format for the output video.
>
> @@ -3889,8 +3895,8 @@ If set to 1, force the output to terminate when the
> shortest input
>  terminates. Default value is 0.
>  @end table
>
> -The @var{x} and @var{y} expressions can contain the following
> -parameters:
> +The @option{x}, @option{y}, and @option{enable} expressions can
> +contain the following parameters:
>  @table @option
>  @item main_w, W
>  @item main_h, H
> diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c
> index 0bfb5f4..c9dedb5 100644
> --- a/libavfilter/vf_overlay.c
> +++ b/libavfilter/vf_overlay.c
> @@ -108,8 +108,8 @@ typedef struct {
>      int shortest;               ///< terminate stream when the shortest
> input terminates
>      enum OverlayFormat { OVERLAY_FORMAT_YUV420, OVERLAY_FORMAT_YUV444,
> OVERLAY_FORMAT_RGB, OVERLAY_FORMAT_NB} format;
>      double var_values[VAR_VARS_NB];
> -    char *x_expr, *y_expr;
> -    AVExpr *x_pexpr, *y_pexpr;
> +    char *x_expr, *y_expr, *enable_expr;
> +    AVExpr *x_pexpr, *y_pexpr, *enable_pexpr;
>  } OverlayContext;
>
>  #define OFFSET(x) offsetof(OverlayContext, x)
> @@ -118,6 +118,7 @@ typedef struct {
>  static const AVOption overlay_options[] = {
>      { "x", "set the x expression", OFFSET(x_expr), AV_OPT_TYPE_STRING,
> {.str = "0"}, CHAR_MIN, CHAR_MAX, FLAGS },
>      { "y", "set the y expression", OFFSET(y_expr), AV_OPT_TYPE_STRING,
> {.str = "0"}, CHAR_MIN, CHAR_MAX, FLAGS },
> +    { "enable", "set expression which enables overlay",
> OFFSET(enable_expr), AV_OPT_TYPE_STRING, {.str = "1"}, .flags = FLAGS },
>      { "rgb", "force packed RGB in input and output (deprecated)",
> OFFSET(allow_packed_rgb), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS },
>
>      { "format", "set output format", OFFSET(format), AV_OPT_TYPE_INT,
> {.i64=OVERLAY_FORMAT_YUV420}, 0, OVERLAY_FORMAT_NB-1, FLAGS, "format" },
> @@ -160,6 +161,7 @@ static av_cold void uninit(AVFilterContext *ctx)
>
>      av_expr_free(over->x_pexpr); over->x_pexpr = NULL;
>      av_expr_free(over->y_pexpr); over->y_pexpr = NULL;
> +    av_expr_free(over->enable_pexpr); over->enable_pexpr = NULL;
>
>      avfilter_unref_bufferp(&over->overpicref);
>      ff_bufqueue_discard_all(&over->queue_main);
> @@ -276,6 +278,10 @@ static int config_input_overlay(AVFilterLink *inlink)
>      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;
>
>      over->overlay_is_packed_rgb =
>          ff_fill_rgba_map(over->overlay_rgba_map, inlink->format) >= 0;
> @@ -526,12 +532,14 @@ static int try_filter_frame(AVFilterContext *ctx,
> AVFilterBufferRef *mainpic)
>      av_dlog(ctx, "\n");
>
>      if (over->overpicref) {
> +        double enable;
>          over->var_values[VAR_T] = mainpic->pts == AV_NOPTS_VALUE ?
>              NAN : mainpic->pts * av_q2d(inlink->time_base);
>          over->var_values[VAR_POS] = mainpic->pos == -1 ? NAN :
> mainpic->pos;
>          over->var_values[VAR_X] = av_expr_eval(over->x_pexpr,
> over->var_values, NULL);
>          over->var_values[VAR_Y] = av_expr_eval(over->y_pexpr,
> over->var_values, NULL);
>          over->var_values[VAR_X] = av_expr_eval(over->x_pexpr,
> over->var_values, NULL);
> +        enable = av_expr_eval(over->enable_pexpr, over->var_values, NULL);
>
>          if (isnan(over->var_values[VAR_X])) {
>              over->x = INT_MAX;
> @@ -545,12 +553,14 @@ static int try_filter_frame(AVFilterContext *ctx,
> AVFilterBufferRef *mainpic)
>              over->y = over->var_values[VAR_Y];
>              over->y &= ~((1 << over->vsub) - 1);
>          }
> -        av_log(ctx, AV_LOG_DEBUG, "n:%f t:%f pos:%f x:%f xi:%d y:%f
> yi:%d\n",
> +        av_log(ctx, AV_LOG_DEBUG, "n:%f t:%f pos:%f x:%f xi:%d y:%f yi:%d
> enable:%f\n",
>                 over->var_values[VAR_N], over->var_values[VAR_T],
> over->var_values[VAR_POS],
>                 over->var_values[VAR_X], over->x,
> -               over->var_values[VAR_Y], over->y);
> +               over->var_values[VAR_Y], over->y,
> +               enable);
>
> -        blend_image(ctx, mainpic, over->overpicref, over->x, over->y);
> +        if (enable)
> +            blend_image(ctx, mainpic, over->overpicref, over->x, over->y);
>          over->var_values[VAR_N] += 1.0;
>      }
>      ret = ff_filter_frame(ctx->outputs[0], mainpic);
> --
> 1.7.9.5
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

lgtm


More information about the ffmpeg-devel mailing list