]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: ffmpeg_producer: Added pre-rolling to avoid lagging due to heavy first frames.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 22 May 2011 20:28:20 +0000 (20:28 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 22 May 2011 20:28:20 +0000 (20:28 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@801 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ffmpeg/producer/ffmpeg_producer.cpp

index 0cd3e9d19031575ae10f21941b5f1b66b66360b2..a078af740a13ba4665bdb3f0c4e0cb00ddd2f6d8 100644 (file)
@@ -110,6 +110,17 @@ public:
                                source_info(narrow(print())) << \r
                                msg_info("Failed to initialize any decoder"));\r
                }\r
+                       \r
+               // Take some time to read the first packets\r
+               Sleep(40);\r
+\r
+               // Pre-roll since first frames can be heavy.\r
+               while(video_frame_buffer_.size() < DECODED_PACKET_BUFFER_SIZE && \r
+                         audio_chunk_buffer_.size() < DECODED_PACKET_BUFFER_SIZE && \r
+                         input_.has_packet())\r
+               {\r
+                       try_decode_packet();\r
+               }\r
        }\r
 \r
        virtual safe_ptr<core::basic_frame> receive()\r
@@ -118,8 +129,8 @@ public:
 \r
                std::shared_ptr<core::basic_frame> frame;       \r
                for(size_t n = 0; !frame && input_.has_packet() && n < MAX_PACKET_OFFSET ; ++n) \r
-                       frame = try_decode_frame();\r
-               \r
+                       frame = try_get_frame();\r
+                               \r
                graph_->update_value("frame-time", static_cast<float>(frame_timer_.elapsed()*frame_factory_->get_video_format_desc().fps*0.5));\r
                                        \r
                if(frame)\r
@@ -140,7 +151,7 @@ public:
                return L"ffmpeg[" + boost::filesystem::wpath(filename_).filename() + L"]";\r
        }\r
        \r
-       std::shared_ptr<core::basic_frame> try_decode_frame()\r
+       void try_decode_packet()\r
        {\r
                tbb::parallel_invoke\r
                (\r
@@ -154,9 +165,7 @@ public:
                                if(audio_chunk_buffer_.size() < DECODED_PACKET_BUFFER_SIZE)\r
                                        try_decode_audio_packet(input_.get_audio_packet());\r
                        }\r
-               );                      \r
-\r
-               return try_merge_audio_and_video();     \r
+               );      \r
        }\r
 \r
        void try_decode_video_packet(std::shared_ptr<AVPacket>&& video_packet)\r
@@ -193,8 +202,10 @@ public:
                }\r
        }\r
 \r
-       std::shared_ptr<core::basic_frame> try_merge_audio_and_video()\r
+       std::shared_ptr<core::basic_frame> try_get_frame()\r
        {               \r
+               try_decode_packet();\r
+\r
                std::shared_ptr<core::write_frame> frame;       \r
 \r
                if(!video_frame_buffer_.empty() && !audio_chunk_buffer_.empty())\r