From: Helge Norberg Date: Mon, 23 Jan 2017 17:26:44 +0000 (+0100) Subject: [ffmpeg_producer] #518 Fixed bug where decoders sometimes requires more than one... X-Git-Tag: 2.1.0_Beta2~124 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=874dce1caa4e30d54ac5b4cce0da0910dc8c0632;p=casparcg [ffmpeg_producer] #518 Fixed bug where decoders sometimes requires more than one video packet to decode the first frame --- diff --git a/CHANGELOG b/CHANGELOG index fc3e1a53b..6aae7c50f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -37,6 +37,8 @@ Producers o FFmpeg producer: + Increased the max number of frames that audio/video can be badly interleaved with (Dimitry Ishenko). + + Fixed bug where decoders sometimes requires more than one video packet to + decode the first frame. o Framerate producer: + Fixed bug when INFO was used on a not yet playing framerate producer. diff --git a/modules/ffmpeg/producer/ffmpeg_producer.cpp b/modules/ffmpeg/producer/ffmpeg_producer.cpp index ac4ae09e0..5279f4a47 100644 --- a/modules/ffmpeg/producer/ffmpeg_producer.cpp +++ b/modules/ffmpeg/producer/ffmpeg_producer.cpp @@ -551,8 +551,17 @@ public: tbb::parallel_invoke( [&] { - if (!muxer_->video_ready() && video_decoder_) - video = video_decoder_->poll(); + do + { + if (!muxer_->video_ready() && video_decoder_) + { + video = video_decoder_->poll(); + if (video) + break; + } + else + break; + } while (!video_decoder_->empty()); }, [&] { @@ -591,7 +600,8 @@ public: file_frame_number = std::max(file_frame_number, video_decoder_ ? video_decoder_->file_frame_number() : 0); for (auto frame = muxer_->poll(); frame != core::draw_frame::empty(); frame = muxer_->poll()) - frame_buffer_.push(std::make_pair(frame, file_frame_number)); + if (frame != core::draw_frame::empty()) + frame_buffer_.push(std::make_pair(frame, file_frame_number)); } bool audio_only() const diff --git a/modules/ffmpeg/producer/video/video_decoder.cpp b/modules/ffmpeg/producer/video/video_decoder.cpp index 9322baad4..8f8e60abf 100644 --- a/modules/ffmpeg/producer/video/video_decoder.cpp +++ b/modules/ffmpeg/producer/video/video_decoder.cpp @@ -148,6 +148,11 @@ public: return packets_.size() >= 8; } + bool empty() const + { + return packets_.empty(); + } + uint32_t nb_frames() const { return std::max(nb_frames_, static_cast(file_frame_number_)); @@ -163,6 +168,7 @@ video_decoder::video_decoder(const spl::shared_ptr& context) : void video_decoder::push(const std::shared_ptr& packet){impl_->push(packet);} std::shared_ptr video_decoder::poll(){return impl_->poll();} bool video_decoder::ready() const{return impl_->ready();} +bool video_decoder::empty() const { return impl_->empty(); } int video_decoder::width() const{return impl_->width_;} int video_decoder::height() const{return impl_->height_;} uint32_t video_decoder::nb_frames() const{return impl_->nb_frames();} diff --git a/modules/ffmpeg/producer/video/video_decoder.h b/modules/ffmpeg/producer/video/video_decoder.h index d954dc05b..5947b8ea4 100644 --- a/modules/ffmpeg/producer/video/video_decoder.h +++ b/modules/ffmpeg/producer/video/video_decoder.h @@ -42,11 +42,12 @@ class video_decoder : boost::noncopyable { public: explicit video_decoder(const spl::shared_ptr& context); - + bool ready() const; + bool empty() const; void push(const std::shared_ptr& packet); std::shared_ptr poll(); - + int width() const; int height() const; @@ -61,4 +62,4 @@ private: spl::shared_ptr impl_; }; -}} \ No newline at end of file +}}