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
\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
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
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