[FFmpeg-devel] [PATCH V2] avfilter/zoompan: add in_time variable

Paul B Mahol onemda at gmail.com
Fri Jun 19 12:03:19 EEST 2020


LGTM

On 6/18/20, exwm <thighsman at protonmail.com> wrote:
> Currently, the zoompan filter exposes a time variable for use in
> the zoom, x, and y expressions. This variable is perhaps better named
> out_time as it represents the timestamp in seconds of each output frame
> produced by zoompan. This patch does not rename the time variable
> to out_time as this may be a breaking change.
>
> This patch adds instead
> an in_time variable that provides access to the timestamp in seconds
> of each input frame to the zoompan filter. This helps to design zoompan
> filters that depend on the input video timestamps. For example, it makes
> it easy to zoom in instantly for only some portion of a video.
> Both the time and in_time variables have been added in the documentation
> for zoompan.
>
> Example usage of in_time in the zoompan filter to zoom in 2x for the
> first second of the input video and 1x for the rest:
>     zoompan=z='if(between(in_time,0,1),2,1):d=1'
>
> V2: Fix zoompan filter documentation stating that the time variable
> would be NAN if the input timestamp is unknown.
>
> Signed-off-by: exwm <thighsman at protonmail.com>
> ---
>  doc/filters.texi         | 13 +++++++++++++
>  libavfilter/vf_zoompan.c |  5 +++++
>  2 files changed, 18 insertions(+)
>
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 84567dec16..aa6a73514e 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -20733,6 +20733,12 @@ Input frame count.
>  @item on
>  Output frame count.
>
> + at item in_time
> +The input timestamp expressed in seconds. It's NAN if the input timestamp
> is unknown.
> +
> + at item time
> +The output timestamp expressed in seconds.
> +
>  @item x
>  @item y
>  Last calculated 'x' and 'y' position from 'x' and 'y' expression
> @@ -20787,6 +20793,13 @@ Same as above but without pausing:
>  @example
> zoompan=z='min(max(zoom,pzoom)+0.0015,1.5)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'
>  @end example
> +
> + at item
> +Zoom-in 2x into center of picture only for the first second of the input
> video:
> + at example
> +zoompan=z='if(between(in_time,0,1),2,1)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'
> + at end example
> +
>  @end itemize
>
>  @anchor{zscale}
> diff --git a/libavfilter/vf_zoompan.c b/libavfilter/vf_zoompan.c
> index 59c9b19ec8..5fe9e68b3a 100644
> --- a/libavfilter/vf_zoompan.c
> +++ b/libavfilter/vf_zoompan.c
> @@ -38,6 +38,7 @@ static const char *const var_names[] = {
>      "on",
>      "duration",
>      "pduration",
> +    "in_time",
>      "time",
>      "frame",
>      "zoom",
> @@ -62,6 +63,7 @@ enum var_name {
>      VAR_DURATION,
>      VAR_PDURATION,
>      VAR_TIME,
> +    VAR_IN_TIME,
>      VAR_FRAME,
>      VAR_ZOOM,
>      VAR_PZOOM,
> @@ -155,6 +157,7 @@ static int output_single_frame(AVFilterContext *ctx,
> AVFrame *in, double *var_va
>  {
>      ZPContext *s = ctx->priv;
>      AVFilterLink *outlink = ctx->outputs[0];
> +    AVFilterLink *inlink = ctx->inputs[0];
>      int64_t pts = s->frame_count;
>      int k, x, y, w, h, ret = 0;
>      uint8_t *input[4];
> @@ -165,6 +168,8 @@ static int output_single_frame(AVFilterContext *ctx,
> AVFrame *in, double *var_va
>      var_values[VAR_PY]    = s->y;
>      var_values[VAR_PZOOM] = s->prev_zoom;
>      var_values[VAR_PDURATION] = s->prev_nb_frames;
> +    var_values[VAR_IN_TIME] = in->pts == AV_NOPTS_VALUE ?
> +        NAN : in->pts * av_q2d(inlink->time_base);
>      var_values[VAR_TIME] = pts * av_q2d(outlink->time_base);
>      var_values[VAR_FRAME] = i;
>      var_values[VAR_ON] = outlink->frame_count_in;
> --
> 2.26.0
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list