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