This fixes downconverting framerates to multiples.

For example, prior to this patch, converting 900 frames at 60 fps
to 30 fps would output 451 frames instead of the correct 450.

Signed-off-by: Derek Buitenhuis <derek.buitenh...@gmail.com>
---
DISCLAIMER: I don't know libavfilter very well, and I am not
sure this is the correct fix to the problem. Comments definitely
welcome.

Also, I would be happy if any replies could be CC'd to me.

Thanks,
  Derek
---
 libavfilter/vf_fps.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c
index 20ccd79..b6df968 100644
--- a/libavfilter/vf_fps.c
+++ b/libavfilter/vf_fps.c
@@ -135,15 +135,21 @@ static int request_frame(AVFilterLink *outlink)
         int i;
         for (i = 0; av_fifo_size(s->fifo); i++) {
             AVFrame *buf;
+            int64_t delta;
 
             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 ((ret = ff_filter_frame(outlink, buf)) < 0)
-                return ret;
+            /* number of output frames */
+            delta = av_rescale_q_rnd(buf->pts - s->first_pts, 
ctx->inputs[0]->time_base,
+                                     outlink->time_base, s->rounding) - 
s->frames_out ;
+            if (delta >= 0) {
+                if ((ret = ff_filter_frame(outlink, buf)) < 0)
+                    return ret;
 
-            s->frames_out++;
+                s->frames_out++;
+            }
         }
         return 0;
     }
-- 
1.8.3.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to