safe_ptr<core::frame_factory> frame_factory_;\r
\r
tbb::concurrent_bounded_queue<safe_ptr<core::basic_frame>> frame_buffer_;\r
- safe_ptr<core::basic_frame> tail_;\r
\r
std::exception_ptr exception_;\r
filter filter_;\r
, format_desc_(format_desc)\r
, device_index_(device_index)\r
, frame_factory_(frame_factory)\r
- , tail_(core::basic_frame::empty())\r
, filter_(filter)\r
, muxer_(double_rate(filter) ? format_desc.fps * 2.0 : format_desc.fps, frame_factory->get_video_format_desc(), frame_factory)\r
{\r
if(exception_ != nullptr)\r
std::rethrow_exception(exception_);\r
\r
- if(!frame_buffer_.try_pop(tail_))\r
+ safe_ptr<core::basic_frame> frame = core::basic_frame::late();\r
+ if(!frame_buffer_.try_pop(frame))\r
graph_->add_tag("late-frame");\r
graph_->set_value("output-buffer", static_cast<float>(frame_buffer_.size())/static_cast<float>(frame_buffer_.capacity())); \r
- return tail_;\r
+ return frame;\r
}\r
\r
std::wstring print() const\r
\r
virtual safe_ptr<core::basic_frame> receive()\r
{\r
- return last_frame_ = context_->get_frame();\r
+ auto frame = context_->get_frame();\r
+ if(frame != core::basic_frame::late())\r
+ last_frame_ = frame;\r
+ return frame;\r
}\r
\r
virtual safe_ptr<core::basic_frame> last_frame() const\r
graph_->set_value("output-buffer", static_cast<float>(frame_buffer_.size())/static_cast<float>(frame_buffer_.capacity()));\r
\r
auto frame = core::basic_frame::late();\r
- frame_buffer_.try_pop(frame); \r
- return last_frame_ = frame;\r
+ if(frame_buffer_.try_pop(frame))\r
+ last_frame_ = frame;\r
+\r
+ return frame;\r
}\r
\r
virtual safe_ptr<core::basic_frame> last_frame() const\r