From 3799376dd3373ee255651ed542c75b15665801a8 Mon Sep 17 00:00:00 2001
From: Anton Khirnov <anton@khirnov.net>
Date: Sun, 4 Aug 2013 12:10:23 +0200
Subject: [PATCH] lavfi/fifo: fix flushing when using request_samples

If any samples are still buffered when request_frame returns EOF, they
won't be returned currently.
---
 libavfilter/fifo.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c
index 8d981cef965..a58ce9f7ab0 100644
--- a/libavfilter/fifo.c
+++ b/libavfilter/fifo.c
@@ -147,10 +147,14 @@ static int return_audio_frame(AVFilterContext *ctx)
 {
     AVFilterLink *link = ctx->outputs[0];
     FifoContext *s = ctx->priv;
-    AVFrame *head = s->root.next->frame;
+    AVFrame *head = s->root.next ? s->root.next->frame : NULL;
     AVFrame *out;
     int ret;
 
+    /* if head is NULL then we're flushing the remaining samples in out */
+    if (!head && !s->out)
+        return AVERROR_EOF;
+
     if (!s->out &&
         head->nb_samples >= link->request_samples &&
         calc_ptr_alignment(head) >= 32) {
@@ -227,8 +231,11 @@ static int request_frame(AVFilterLink *outlink)
     int ret = 0;
 
     if (!fifo->root.next) {
-        if ((ret = ff_request_frame(outlink->src->inputs[0])) < 0)
+        if ((ret = ff_request_frame(outlink->src->inputs[0])) < 0) {
+            if (ret == AVERROR_EOF && outlink->request_samples)
+                return return_audio_frame(outlink->src);
             return ret;
+        }
     }
 
     if (outlink->request_samples) {
-- 
GitLab