[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