1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-01-08 13:22:53 +02:00

avfilter/f_loop: make sure duration of frame is never zero

This commit is contained in:
Paul B Mahol 2018-11-02 11:20:30 +01:00
parent 97e9e3504d
commit 4620e4c7ad

View File

@ -267,7 +267,7 @@ static int push_frame(AVFilterContext *ctx)
{ {
AVFilterLink *outlink = ctx->outputs[0]; AVFilterLink *outlink = ctx->outputs[0];
LoopContext *s = ctx->priv; LoopContext *s = ctx->priv;
int64_t pts; int64_t pts, duration;
int ret; int ret;
AVFrame *out = av_frame_clone(s->frames[s->current_frame]); AVFrame *out = av_frame_clone(s->frames[s->current_frame]);
@ -275,7 +275,11 @@ static int push_frame(AVFilterContext *ctx)
if (!out) if (!out)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
out->pts += s->duration - s->start_pts; 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); ret = ff_filter_frame(outlink, out);
s->current_frame++; s->current_frame++;
@ -295,6 +299,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
AVFilterContext *ctx = inlink->dst; AVFilterContext *ctx = inlink->dst;
AVFilterLink *outlink = ctx->outputs[0]; AVFilterLink *outlink = ctx->outputs[0];
LoopContext *s = ctx->priv; LoopContext *s = ctx->priv;
int64_t duration;
int ret = 0; int ret = 0;
if (inlink->frame_count_out >= s->start && s->size > 0 && s->loop != 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); return AVERROR(ENOMEM);
} }
s->nb_frames++; 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); ret = ff_filter_frame(outlink, frame);
} else { } else {
av_frame_free(&frame); av_frame_free(&frame);