From e675beaa563f19a86c04d8e12df308ad5fbf332f Mon Sep 17 00:00:00 2001
From: philippegorley <philippe.gorley@savoirfairelinux.com>
Date: Wed, 5 Dec 2018 15:28:46 -0500
Subject: [PATCH] recorder: flush properly

Adds flushing capability to filters.

Change-Id: I015d7931318deb5d099fcaac1356f5fc17b890d6
---
 src/media/media_filter.cpp   | 10 ++++++++++
 src/media/media_filter.h     |  5 +++++
 src/media/media_recorder.cpp | 11 ++++++++---
 3 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/media/media_filter.cpp b/src/media/media_filter.cpp
index c00181e919..8bc730e65c 100644
--- a/src/media/media_filter.cpp
+++ b/src/media/media_filter.cpp
@@ -161,6 +161,9 @@ MediaFilter::feedInput(AVFrame* frame, const std::string& inputName)
     if (!initialized_)
         return fail("Filter not initialized", -1);
 
+    if (!frame)
+        return 0;
+
     for (size_t i = 0; i < inputs_.size(); ++i) {
         auto& ms = inputParams_[i];
         if (ms.name != inputName)
@@ -210,6 +213,13 @@ MediaFilter::readOutput()
     return nullptr;
 }
 
+void
+MediaFilter::flush()
+{
+    for (size_t i = 0; i < inputs_.size(); ++i)
+        av_buffersrc_add_frame_flags(inputs_[i], nullptr, 0);
+}
+
 int
 MediaFilter::initOutputFilter(AVFilterInOut* out)
 {
diff --git a/src/media/media_filter.h b/src/media/media_filter.h
index 3b05a13db2..0ca66dbdd4 100644
--- a/src/media/media_filter.h
+++ b/src/media/media_filter.h
@@ -99,6 +99,11 @@ class MediaFilter {
          */
         AVFrame* readOutput();
 
+        /**
+         * Flush filter to indicate EOF.
+         */
+        void flush();
+
     private:
         NON_COPYABLE(MediaFilter);
 
diff --git a/src/media/media_recorder.cpp b/src/media/media_recorder.cpp
index 1b8005fdd9..f57d0acb95 100644
--- a/src/media/media_recorder.cpp
+++ b/src/media/media_recorder.cpp
@@ -156,9 +156,10 @@ MediaRecorder::onFrame(const std::string& name, const std::shared_ptr<MediaFrame
 
     // copy frame to not mess with the original frame's pts (does not actually copy frame data)
     MediaFrame clone;
+    const auto& ms = streams_[name]->info;
     clone.copyFrom(*frame);
-    clone.pointer()->pts -= streams_[name]->info.firstTimestamp;
-    if (clone.pointer()->width > 0 && clone.pointer()->height > 0)
+    clone.pointer()->pts -= ms.firstTimestamp;
+    if (ms.isVideo)
         videoFilter_->feedInput(clone.pointer(), name);
     else
         audioFilter_->feedInput(clone.pointer(), name);
@@ -417,8 +418,12 @@ void
 MediaRecorder::flush()
 {
     std::lock_guard<std::mutex> lk(mutex_);
+    if (videoFilter_)
+        videoFilter_->flush();
+    if (audioFilter_)
+        audioFilter_->flush();
     filterAndEncode(videoFilter_.get(), videoIdx_);
-    filterAndEncode(audioFilter_.get(), videoIdx_);
+    filterAndEncode(audioFilter_.get(), audioIdx_);
     encoder_->flush();
 }
 
-- 
GitLab