]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: ffmpeg_producer: Improved pre-rolling and file read load.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 23 May 2011 10:37:54 +0000 (10:37 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 23 May 2011 10:37:54 +0000 (10:37 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@803 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/input.cpp

index a078af740a13ba4665bdb3f0c4e0cb00ddd2f6d8..30f66590871d5a898a9ae5002853af8895c4e499 100644 (file)
@@ -111,9 +111,6 @@ public:
                                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
index 9869acb7052d880b4fc9dfacdce7b195dcf1c9e9..7b5e2d0cd988b793c7a5ef80c93ce027c50c8e61 100644 (file)
@@ -193,7 +193,10 @@ public:
 \r
                if(start_ != 0)                 \r
                        seek_frame(start_);\r
-                                       \r
+\r
+               for(size_t n = 0; n < 16; ++n) // Read some packets for pre-rolling.\r
+                       read_next_packet();\r
+                                                       \r
                executor_.start();\r
                executor_.begin_invoke([this]{read_file();});\r
                CASPAR_LOG(info) << print() << " Started.";\r
@@ -233,12 +236,19 @@ private:
                get_audio_packet();\r
                CASPAR_LOG(info) << print() << " Stopping.";\r
        }\r
-                       \r
+\r
        void read_file()\r
        {               \r
-               if(audio_stream_.size() > 4 && video_stream_.size() > 4)\r
+               if(video_stream_.size() > 4) // Don't check audio_stream since audio is always before video.\r
                        Sleep(5); // There are enough packets, no hurry.\r
 \r
+               read_next_packet();\r
+\r
+               executor_.begin_invoke([this]{read_file();});\r
+       }\r
+                       \r
+       void read_next_packet()\r
+       {               \r
                try\r
                {\r
                        std::shared_ptr<AVPacket> read_packet(new AVPacket(), [](AVPacket* p)\r
@@ -284,9 +294,7 @@ private:
                        stop();\r
                        CASPAR_LOG_CURRENT_EXCEPTION();\r
                        return;\r
-               }\r
-                                               \r
-               executor_.begin_invoke([this]{read_file();});           \r
+               }       \r
        }\r
 \r
        void seek_frame(int64_t frame, int flags = 0)\r