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:
parent
97e9e3504d
commit
4620e4c7ad
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user