From: ronag Date: Mon, 20 Jun 2011 16:23:46 +0000 (+0000) Subject: 2.0. ffmpeg_producer: Further optimized filter looping. X-Git-Tag: 2.0.1~389 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=7c274d6997d2e201ac1123e6f6d47b75197af72d;p=casparcg 2.0. ffmpeg_producer: Further optimized filter looping. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@927 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- diff --git a/modules/ffmpeg/producer/filter/filter.cpp b/modules/ffmpeg/producer/filter/filter.cpp index 9debb1d69..39303c514 100644 --- a/modules/ffmpeg/producer/filter/filter.cpp +++ b/modules/ffmpeg/producer/filter/filter.cpp @@ -175,6 +175,6 @@ struct filter::implementation filter::filter(const std::string& filters) : impl_(new implementation(filters)){} void filter::push(const safe_ptr& frame) {impl_->push(frame);} std::vector> filter::poll() {return impl_->poll();} -void filter::skip() {impl_->skip();} +bool filter::is_ready() const{return impl_->graph_ != nullptr;} } \ No newline at end of file diff --git a/modules/ffmpeg/producer/filter/filter.h b/modules/ffmpeg/producer/filter/filter.h index a520561e7..d2084fcf4 100644 --- a/modules/ffmpeg/producer/filter/filter.h +++ b/modules/ffmpeg/producer/filter/filter.h @@ -15,7 +15,7 @@ public: void push(const safe_ptr& frame); std::vector> poll(); - void skip(); + bool is_ready() const; private: struct implementation; diff --git a/modules/ffmpeg/producer/video/video_decoder.cpp b/modules/ffmpeg/producer/video/video_decoder.cpp index 702a4690a..b47ea52b9 100644 --- a/modules/ffmpeg/producer/video/video_decoder.cpp +++ b/modules/ffmpeg/producer/video/video_decoder.cpp @@ -66,10 +66,8 @@ struct video_decoder::implementation : boost::noncopyable std::shared_ptr filter_; size_t filter_delay_; - size_t filter_skip_; + int eof_count_; - std::shared_ptr last_frame_; - std::shared_ptr decoded_frame_; std::string filter_str_; public: @@ -79,10 +77,9 @@ public: , codec_context_(*input_.get_video_codec_context()) , frame_number_(0) , filter_(filter_str.empty() ? nullptr : new filter(filter_str)) - , filter_delay_(0) - , filter_skip_(0) - , last_frame_(avcodec_alloc_frame(), av_free) + , filter_delay_(1) , filter_str_(filter_str) + , eof_count_(std::numeric_limits::max()) { } @@ -99,16 +96,15 @@ public: std::deque>> decode(const std::shared_ptr& video_packet) { - std::deque>> result; - if(!video_packet) // eof return flush(); - + + std::deque>> result; + + frame_number_ = frame_number_ % eof_count_; + if(filter_) - { - if(decoded_frame_) - push_filter_frames(make_safe(decoded_frame_)); - + { std::shared_ptr frame; tbb::parallel_invoke( @@ -118,13 +114,10 @@ public: }, [&] { - if(decoded_frame_) - result = poll_filter_frames(); + result = poll_filter_frames(); }); - decoded_frame_ = frame; - if(frame) - last_frame_ = frame; + push_filter_frames(make_safe(frame)); } else { @@ -141,27 +134,11 @@ public: { std::deque>> result; - if(filter_) - { - // Get all buffered frames - if(decoded_frame_) - { - push_filter_frames(make_safe(decoded_frame_)); - boost::range::push_back(result, poll_filter_frames()); - } - - for(size_t n = 0; n < filter_delay_; ++n) - { - push_filter_frames(make_safe(last_frame_)); - boost::range::push_back(result, poll_filter_frames()); - } + eof_count_ = frame_number_; - // FIXME: Unnecessary reinitialization - filter_skip_ = filter_delay_; - decoded_frame_ = nullptr; - } + if(filter_) + eof_count_ += filter_delay_; - frame_number_ = 0; avcodec_flush_buffers(&codec_context_); return result; @@ -175,14 +152,10 @@ public: std::deque>> poll_filter_frames() { std::deque>> result; - - if(filter_skip_ > 0) - { - --filter_skip_; - filter_->skip(); + + if(!filter_->is_ready()) return result; - } - + auto frames = filter_->poll(); boost::range::transform(frames, std::back_inserter(result), [&](const safe_ptr& frame) diff --git a/shell/casparcg.config b/shell/casparcg.config index c160edc92..8438d3a96 100644 --- a/shell/casparcg.config +++ b/shell/casparcg.config @@ -16,7 +16,6 @@ - diff --git a/shell/main.cpp b/shell/main.cpp index 2d9897f5f..b2129b0ab 100644 --- a/shell/main.cpp +++ b/shell/main.cpp @@ -214,7 +214,7 @@ int main(int argc, wchar_t* argv[]) else if(wcmd.substr(0, 1) == L"3") wcmd = L"CG 1-2 ADD 1 BBTELEFONARE 1"; else if(wcmd.substr(0, 1) == L"4") - wcmd = L"PLAY 1-1 DV SEEK 350 FILTER yadif=1:-1 LOOP"; + wcmd = L"PLAY 1-1 DV FILTER yadif=1:-1 LOOP"; else if(wcmd.substr(0, 1) == L"X") { int num = 0;