]> git.sesse.net Git - casparcg/commitdiff
[ffmpeg_producer] #518 Fixed bug where decoders sometimes requires more than one...
authorHelge Norberg <helge.norberg@svt.se>
Mon, 23 Jan 2017 17:26:44 +0000 (18:26 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Mon, 23 Jan 2017 17:26:44 +0000 (18:26 +0100)
CHANGELOG
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/video/video_decoder.cpp
modules/ffmpeg/producer/video/video_decoder.h

index fc3e1a53b961d6317d5278ee18b69040153862d8..6aae7c50fce1c85703856f0b83b354df03e40cfa 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -37,6 +37,8 @@ Producers
   o FFmpeg producer:\r
     + Increased the max number of frames that audio/video can be badly\r
       interleaved with (Dimitry Ishenko).\r
+    + Fixed bug where decoders sometimes requires more than one video packet to\r
+      decode the first frame.\r
   o Framerate producer:\r
     + Fixed bug when INFO was used on a not yet playing framerate producer.\r
 \r
index ac4ae09e0233eef8e42e455f959c3efb07c3bee9..5279f4a47b9856fa165cade7ff5fa1215ec6dbb1 100644 (file)
@@ -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
index 9322baad4ba1db6a67669e8df3c184ace5eaef85..8f8e60abfa86c46b701542c7dad8c6f3a9db6f47 100644 (file)
@@ -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<uint32_t>(file_frame_number_));
@@ -163,6 +168,7 @@ video_decoder::video_decoder(const spl::shared_ptr<AVFormatContext>& context) :
 void video_decoder::push(const std::shared_ptr<AVPacket>& packet){impl_->push(packet);}
 std::shared_ptr<AVFrame> 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();}
index d954dc05b05610a1d8b24d26b8cd03b7a75e573a..5947b8ea4b1ef88ea4fc67758d207bb3512a3aad 100644 (file)
@@ -42,11 +42,12 @@ class video_decoder : boost::noncopyable
 {
 public:
        explicit video_decoder(const spl::shared_ptr<AVFormatContext>& context);
-       
+
        bool                                            ready() const;
+       bool                                            empty() const;
        void                                            push(const std::shared_ptr<AVPacket>& packet);
        std::shared_ptr<AVFrame>        poll();
-       
+
        int                                                     width() const;
        int                                                     height() const;
 
@@ -61,4 +62,4 @@ private:
        spl::shared_ptr<implementation> impl_;
 };
 
-}}
\ No newline at end of file
+}}