From 2442b31ba001e48f5d5b0598004e7d861782eb13 Mon Sep 17 00:00:00 2001 From: ronag Date: Mon, 28 Nov 2011 06:21:49 +0000 Subject: [PATCH] 2.0.2: ffmpeg_producer: Improved file_frame_number accuracy. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.2@1692 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- modules/ffmpeg/producer/ffmpeg_producer.cpp | 58 ++++++++++----------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/modules/ffmpeg/producer/ffmpeg_producer.cpp b/modules/ffmpeg/producer/ffmpeg_producer.cpp index bc8963fe8..77f9db12f 100644 --- a/modules/ffmpeg/producer/ffmpeg_producer.cpp +++ b/modules/ffmpeg/producer/ffmpeg_producer.cpp @@ -58,31 +58,31 @@ namespace caspar { namespace ffmpeg { struct ffmpeg_producer : public core::frame_producer { - const std::wstring filename_; + const std::wstring filename_; - const safe_ptr graph_; - boost::timer frame_timer_; - boost::timer video_timer_; - boost::timer audio_timer_; + const safe_ptr graph_; + boost::timer frame_timer_; + boost::timer video_timer_; + boost::timer audio_timer_; - const safe_ptr frame_factory_; - const core::video_format_desc format_desc_; + const safe_ptr frame_factory_; + const core::video_format_desc format_desc_; - input input_; - std::unique_ptr video_decoder_; - std::unique_ptr audio_decoder_; - std::unique_ptr muxer_; + input input_; + std::unique_ptr video_decoder_; + std::unique_ptr audio_decoder_; + std::unique_ptr muxer_; - const int start_; - const bool loop_; - const size_t length_; + const int start_; + const bool loop_; + const size_t length_; - safe_ptr last_frame_; + safe_ptr last_frame_; - std::queue> frame_buffer_; + std::queue, size_t>> frame_buffer_; - int64_t frame_number_; - int64_t file_frame_number_;; + int64_t frame_number_; + int64_t file_frame_number_;; public: explicit ffmpeg_producer(const safe_ptr& frame_factory, const std::wstring& filename, const std::wstring& filter, bool loop, int start, size_t length) @@ -155,13 +155,15 @@ public: return core::basic_frame::late(); } - last_frame_ = frame_buffer_.front(); + auto frame = frame_buffer_.front(); frame_buffer_.pop(); + + ++frame_number_; + file_frame_number_ = frame.second; graph_->set_text(print()); - ++frame_number_; - return last_frame_; + return last_frame_ = frame.first; } virtual safe_ptr last_frame() const override @@ -204,7 +206,7 @@ public: virtual int64_t file_frame_number() const override { - return std::max(0, file_frame_number_-frame_buffer_.size()+1); + return file_frame_number_; } virtual boost::unique_future call(const std::wstring& param) override @@ -272,18 +274,12 @@ public: [&] { if(!muxer_->video_ready() && video_decoder_) - { video = video_decoder_->poll(); - file_frame_number_ = video_decoder_->file_frame_number(); - } }, [&] { if(!muxer_->audio_ready() && audio_decoder_) - { audio = audio_decoder_->poll(); - file_frame_number_ = video_decoder_->file_frame_number(); - } }); muxer_->push(video, hints); @@ -305,8 +301,12 @@ public: muxer_->push(empty_video(), 0); } + size_t file_frame_number = 0; + file_frame_number = std::max(file_frame_number, video_decoder_ ? video_decoder_->file_frame_number() : 0); + file_frame_number = std::max(file_frame_number, audio_decoder_ ? audio_decoder_->file_frame_number() : 0); + for(auto frame = muxer_->poll(); frame; frame = muxer_->poll()) - frame_buffer_.push(make_safe_ptr(frame)); + frame_buffer_.push(std::make_pair(make_safe_ptr(frame), file_frame_number)); } }; -- 2.39.2