avfilter/f_loop: make sure duration of frame is never zero
authorPaul B Mahol <onemda@gmail.com>
Fri, 2 Nov 2018 10:20:30 +0000 (11:20 +0100)
committerPaul B Mahol <onemda@gmail.com>
Fri, 2 Nov 2018 10:20:30 +0000 (11:20 +0100)
libavfilter/f_loop.c

index 255fe64..1f857ab 100644 (file)
@@ -267,7 +267,7 @@ static int push_frame(AVFilterContext *ctx)
 {
     AVFilterLink *outlink = ctx->outputs[0];
     LoopContext *s = ctx->priv;
-    int64_t pts;
+    int64_t pts, duration;
     int ret;
 
     AVFrame *out = av_frame_clone(s->frames[s->current_frame]);
@@ -275,7 +275,11 @@ static int push_frame(AVFilterContext *ctx)
     if (!out)
         return AVERROR(ENOMEM);
     out->pts += s->duration - s->start_pts;
-    pts = out->pts + out->pkt_duration;
+    if (out->pkt_duration)
+        duration = out->pkt_duration;
+    else
+        duration = av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
+    pts = out->pts + duration;
     ret = ff_filter_frame(outlink, out);
     s->current_frame++;
 
@@ -295,6 +299,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
     LoopContext *s = ctx->priv;
+    int64_t duration;
     int ret = 0;
 
     if (inlink->frame_count_out >= s->start && s->size > 0 && s->loop != 0) {
@@ -307,7 +312,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
                 return AVERROR(ENOMEM);
             }
             s->nb_frames++;
-            s->duration = frame->pts + frame->pkt_duration;
+            if (frame->pkt_duration)
+                duration = frame->pkt_duration;
+            else
+                duration = av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
+            s->duration = frame->pts + duration;
             ret = ff_filter_frame(outlink, frame);
         } else {
             av_frame_free(&frame);