[FFmpeg-devel] [PATCH] vf_fps: when reading EOF, using current_pts to duplicate the last frame if needed.
Thierry Foucu
tfoucu at gmail.com
Fri Sep 8 20:03:20 EEST 2017
---
libavfilter/vf_fps.c | 42 +++++++++++++++++++++++++++++++++++++-----
tests/ref/fate/filter-fps | 6 ++++++
tests/ref/fate/filter-fps-r | 4 ++++
3 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c
index 20ccd797d1..e450723173 100644
--- a/libavfilter/vf_fps.c
+++ b/libavfilter/vf_fps.c
@@ -34,6 +34,8 @@
#include "libavutil/opt.h"
#include "libavutil/parseutils.h"
+#define FF_INTERNAL_FIELDS 1
+#include "framequeue.h"
#include "avfilter.h"
#include "internal.h"
#include "video.h"
@@ -137,13 +139,43 @@ static int request_frame(AVFilterLink *outlink)
AVFrame *buf;
av_fifo_generic_read(s->fifo, &buf, sizeof(buf), NULL);
- buf->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base,
- outlink->time_base) + s->frames_out;
+ if (av_fifo_size(s->fifo)) {
+ buf->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base,
+ outlink->time_base) + s->frames_out;
- if ((ret = ff_filter_frame(outlink, buf)) < 0)
- return ret;
+ if ((ret = ff_filter_frame(outlink, buf)) < 0)
+ return ret;
- s->frames_out++;
+ s->frames_out++;
+ } else {
+ /* This is the last frame, we may have to duplicate it to match
+ * the last frame duration */
+ int j;
+ int delta = av_rescale_q_rnd(ctx->inputs[0]->current_pts - s->first_pts,
+ ctx->inputs[0]->time_base,
+ outlink->time_base, s->rounding) - s->frames_out ;
+ if (delta > 0 ) {
+ for (j = 0; j < delta; j++) {
+ AVFrame *dup = av_frame_clone(buf);
+
+ av_log(ctx, AV_LOG_DEBUG, "Duplicating frame.\n");
+ dup->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base,
+ outlink->time_base) + s->frames_out;
+
+ if ((ret = ff_filter_frame(outlink, dup)) < 0)
+ return ret;
+
+ s->frames_out++;
+ }
+ } else {
+ buf->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base,
+ outlink->time_base) + s->frames_out;
+
+ if ((ret = ff_filter_frame(outlink, buf)) < 0)
+ return ret;
+ s->frames_out++;
+ }
+ }
}
return 0;
}
diff --git a/tests/ref/fate/filter-fps b/tests/ref/fate/filter-fps
index 55712cfb1c..242fb04e85 100644
--- a/tests/ref/fate/filter-fps
+++ b/tests/ref/fate/filter-fps
@@ -85,3 +85,9 @@
0, 79, 79, 1, 30576, 0xa2fcd06f
0, 80, 80, 1, 30576, 0xa2fcd06f
0, 81, 81, 1, 30576, 0xd4150aad
+0, 82, 82, 1, 30576, 0xd4150aad
+0, 83, 83, 1, 30576, 0xd4150aad
+0, 84, 84, 1, 30576, 0xd4150aad
+0, 85, 85, 1, 30576, 0xd4150aad
+0, 86, 86, 1, 30576, 0xd4150aad
+0, 87, 87, 1, 30576, 0xd4150aad
diff --git a/tests/ref/fate/filter-fps-r b/tests/ref/fate/filter-fps-r
index 826b1ed6c6..c1bc7d1547 100644
--- a/tests/ref/fate/filter-fps-r
+++ b/tests/ref/fate/filter-fps-r
@@ -72,3 +72,7 @@
0, 79, 79, 1, 30576, 0xa2fcd06f
0, 80, 80, 1, 30576, 0xa2fcd06f
0, 82, 82, 1, 30576, 0xd4150aad
+0, 83, 83, 1, 30576, 0xd4150aad
+0, 84, 84, 1, 30576, 0xd4150aad
+0, 85, 85, 1, 30576, 0xd4150aad
+0, 86, 86, 1, 30576, 0xd4150aad
--
2.14.1.581.gf28d330327-goog
More information about the ffmpeg-devel
mailing list