input input_; \r
video_decoder video_decoder_;\r
audio_decoder audio_decoder_;\r
-\r
- std::queue<safe_ptr<core::basic_frame>> output_buffer_;\r
-\r
+ \r
frame_muxer muxer_;\r
\r
tbb::task_group tasks_;\r
for(int n = 0; n < 128 && muxer_.size() < 2; ++n)\r
decode_frame();\r
}\r
-\r
- ~ffmpeg_producer()\r
- {\r
- tasks_.cancel();\r
- tasks_.wait();\r
- }\r
-\r
+ \r
virtual safe_ptr<core::basic_frame> receive()\r
{\r
- if(output_buffer_.empty())\r
- { \r
- //tasks_.wait();\r
-\r
- while(muxer_.size() > 0)\r
- output_buffer_.push(muxer_.pop());\r
+ frame_timer_.restart();\r
\r
- //tasks_.run([=]\r
- //{\r
- frame_timer_.restart();\r
-\r
- for(int n = 0; n < 64 && muxer_.empty(); ++n)\r
- decode_frame();\r
+ for(int n = 0; n < 64 && muxer_.size() < 2; ++n)\r
+ decode_frame();\r
\r
- graph_->update_value("frame-time", static_cast<float>(frame_timer_.elapsed()*format_desc_.fps*0.5));\r
- //});\r
- }\r
+ graph_->update_value("frame-time", static_cast<float>(frame_timer_.elapsed()*format_desc_.fps*0.5));\r
\r
auto frame = core::basic_frame::late();\r
\r
- if(output_buffer_.empty())\r
+ if(muxer_.empty())\r
{\r
if(input_.eof())\r
frame = core::basic_frame::eof();\r
else\r
graph_->add_tag("underflow"); \r
}\r
- else\r
- {\r
- frame = output_buffer_.front();\r
- output_buffer_.pop();\r
- }\r
+ else \r
+ frame = muxer_.pop(); \r
\r
return frame;\r
}\r