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