aboutsummaryrefslogtreecommitdiffstats
path: root/libavfilter
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2018-11-02 11:20:30 +0100
committerPaul B Mahol <onemda@gmail.com>2018-11-02 11:20:30 +0100
commit4620e4c7ad2fd19d0bbe17c25c3466c40cc97279 (patch)
tree5dcadc9ceab1305d0f38fffb96d57c9a6fb593fb /libavfilter
parent97e9e3504d36ef11efac60e300259689aaeb29fc (diff)
downloadffmpeg-4620e4c7ad2fd19d0bbe17c25c3466c40cc97279.tar.gz
avfilter/f_loop: make sure duration of frame is never zero
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/f_loop.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/libavfilter/f_loop.c b/libavfilter/f_loop.c
index 255fe643da..1f857abf8d 100644
--- a/libavfilter/f_loop.c
+++ b/libavfilter/f_loop.c
@@ -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);