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

exwm thighsman at protonmail.com
Fri Jun 19 00:54:54 EEST 2020


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




More information about the ffmpeg-devel mailing list