[FFmpeg-cvslog] avfilter/f_loop: free video frames once not needed

Paul B Mahol git at videolan.org
Sun May 14 22:01:05 EEST 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sun May 14 14:41:38 2023 +0200| [932ccf9e7d159887766fa9a1f3ef171b8a89a3dd] | committer: Paul B Mahol

avfilter/f_loop: free video frames once not needed

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=932ccf9e7d159887766fa9a1f3ef171b8a89a3dd
---

 libavfilter/f_loop.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/libavfilter/f_loop.c b/libavfilter/f_loop.c
index 7974d266f0..33b66fa534 100644
--- a/libavfilter/f_loop.c
+++ b/libavfilter/f_loop.c
@@ -336,14 +336,19 @@ static av_cold int init(AVFilterContext *ctx)
     return 0;
 }
 
-static av_cold void uninit(AVFilterContext *ctx)
+static void free_frames(AVFilterContext *ctx)
 {
     LoopContext *s = ctx->priv;
-    int i;
 
-    for (i = 0; i < s->nb_frames; i++)
+    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;
+
+    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;
     }
 



More information about the ffmpeg-cvslog mailing list