avfilter/f_loop: free video frames once not needed

This commit is contained in:
Paul B Mahol 2023-05-14 14:41:38 +02:00
parent c27895bb98
commit 932ccf9e7d
1 changed files with 18 additions and 5 deletions

View File

@ -336,14 +336,19 @@ static av_cold int init(AVFilterContext *ctx)
return 0;
}
static void free_frames(AVFilterContext *ctx)
{
LoopContext *s = ctx->priv;
for (int i = 0; i < s->nb_frames; i++)
av_frame_free(&s->frames[i]);
}
static av_cold void uninit(AVFilterContext *ctx)
{
LoopContext *s = ctx->priv;
int i;
for (i = 0; i < s->nb_frames; i++)
av_frame_free(&s->frames[i]);
free_frames(ctx);
av_freep(&s->frames);
s->nb_frames = 0;
}
@ -368,6 +373,8 @@ static int push_frame(AVFilterContext *ctx)
s->pts_offset += s->duration;
if (s->loop > 0)
s->loop--;
if (s->loop == 0)
free_frames(ctx);
}
return ret;
@ -419,7 +426,12 @@ static int activate(AVFilterContext *ctx)
AVFrame *frame = NULL;
int ret, status;
FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
ret = ff_outlink_get_status(outlink);
if (ret) {
ff_inlink_set_status(inlink, ret);
free_frames(ctx);
return 0;
}
update_time(ctx, inlink->time_base);
@ -440,6 +452,7 @@ static int activate(AVFilterContext *ctx)
if (s->eof && (!s->loop || !s->size)) {
ff_outlink_set_status(outlink, AVERROR_EOF, s->eof_pts + s->pts_offset);
free_frames(ctx);
return 0;
}