1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-02-09 14:14:39 +02:00

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

View File

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