diff options
author | Paul B Mahol <onemda@gmail.com> | 2018-11-02 11:20:30 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2018-11-02 11:20:30 +0100 |
commit | 4620e4c7ad2fd19d0bbe17c25c3466c40cc97279 (patch) | |
tree | 5dcadc9ceab1305d0f38fffb96d57c9a6fb593fb | |
parent | 97e9e3504d36ef11efac60e300259689aaeb29fc (diff) | |
download | ffmpeg-4620e4c7ad2fd19d0bbe17c25c3466c40cc97279.tar.gz |
avfilter/f_loop: make sure duration of frame is never zero
-rw-r--r-- | libavfilter/f_loop.c | 15 |
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); |