]> git.sesse.net Git - ffmpeg/commitdiff
avfilter/vf_shuffleframes: allow also dropping frames
authorPaul B Mahol <onemda@gmail.com>
Fri, 6 Jan 2017 11:27:46 +0000 (12:27 +0100)
committerPaul B Mahol <onemda@gmail.com>
Fri, 6 Jan 2017 11:27:46 +0000 (12:27 +0100)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
doc/filters.texi
libavfilter/vf_shuffleframes.c

index 42cdd2ea71319c00d224c335f59c15b6d28737c4..94548b1a1acd38f3b1dda590913b9bfe0e88903f 100644 (file)
@@ -12285,7 +12285,7 @@ Set the size of the box used to represent one palette color entry. Default is
 
 @section shuffleframes
 
-Reorder and/or duplicate video frames.
+Reorder and/or duplicate and/or drop video frames.
 
 It accepts the following parameters:
 
@@ -12294,6 +12294,7 @@ It accepts the following parameters:
 Set the destination indexes of input frames.
 This is space or '|' separated list of indexes that maps input frames to output
 frames. Number of indexes also sets maximal value that each index may have.
+'-1' index have special meaning and that is to drop frame.
 @end table
 
 The first frame has the index 0. The default is to keep the input unchanged.
index bfbf4bd2688c0d01a321154d303c057b0eeda3e1..8e595111b80d8332cfdebbbe2714a36a09dd058f 100644 (file)
@@ -68,7 +68,7 @@ static av_cold int init(AVFilterContext *ctx)
             return AVERROR(EINVAL);
         }
 
-        if (s->map[n] < 0 || s->map[n] >= nb_items) {
+        if (s->map[n] < -1 || s->map[n] >= nb_items) {
             av_log(ctx, AV_LOG_ERROR, "Index out of range.\n");
             av_free(mapping);
             return AVERROR(EINVAL);
@@ -99,11 +99,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
             AVFrame *out;
 
             x = s->map[n];
-            out = av_frame_clone(s->frames[x]);
-            if (!out)
-                return AVERROR(ENOMEM);
-            out->pts = s->pts[n];
-            ret = ff_filter_frame(ctx->outputs[0], out);
+            if (x >= 0) {
+                out = av_frame_clone(s->frames[x]);
+                if (!out)
+                    return AVERROR(ENOMEM);
+                out->pts = s->pts[n];
+                ret = ff_filter_frame(ctx->outputs[0], out);
+            }
             s->in_frames--;
         }