| @@ -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); | ||||