[FFmpeg-devel] [PATCH] lavfi/buffersrc: push the frame deeper if requested.

Nicolas George george at nsup.org
Fri Dec 23 22:49:52 EET 2016


Reduce peak memory consumption with ffmpeg in certain cases.

Signed-off-by: Nicolas George <george at nsup.org>
---
 libavfilter/buffersrc.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
index 1314397a32..77fd174219 100644
--- a/libavfilter/buffersrc.c
+++ b/libavfilter/buffersrc.c
@@ -173,6 +173,20 @@ int attribute_align_arg av_buffersrc_add_frame_flags(AVFilterContext *ctx, AVFra
     return ret;
 }
 
+static int push_frame(AVFilterGraph *graph)
+{
+    int ret;
+
+    while (1) {
+        ret = ff_filter_graph_run_once(graph);
+        if (ret == AVERROR(EAGAIN))
+            break;
+        if (ret < 0)
+            return ret;
+    }
+    return 0;
+}
+
 static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
                                            AVFrame *frame, int flags)
 {
@@ -185,6 +199,11 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
     if (!frame) {
         s->eof = 1;
         ff_avfilter_link_set_in_status(ctx->outputs[0], AVERROR_EOF, AV_NOPTS_VALUE);
+        if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
+            ret = push_frame(ctx->graph);
+            if (ret < 0)
+                return ret;
+        }
         return 0;
     } else if (s->eof)
         return AVERROR(EINVAL);
@@ -239,6 +258,12 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
     if ((ret = ctx->output_pads[0].request_frame(ctx->outputs[0])) < 0)
         return ret;
 
+    if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
+        ret = push_frame(ctx->graph);
+        if (ret < 0)
+            return ret;
+    }
+
     return 0;
 }
 
-- 
2.11.0



More information about the ffmpeg-devel mailing list