mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-24 00:02:52 +00:00
avfilter/f_loop: make sure duration of frame is never zero
This commit is contained in:
parent
97e9e3504d
commit
4620e4c7ad
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user