size_t square_width_;\r
size_t square_height_;\r
\r
- boost::circular_buffer<safe_ptr<core::read_frame>> frame_buffer_;\r
+ boost::circular_buffer<safe_ptr<core::read_frame>> input_buffer_;\r
+ tbb::concurrent_bounded_queue<safe_ptr<core::read_frame>> frame_buffer_;\r
\r
executor executor_;\r
public:\r
, screen_index_(screen_index)\r
, format_desc_(format_desc_)\r
, graph_(diagnostics::create_graph(narrow(print())))\r
- , frame_buffer_(core::consumer_buffer_depth())\r
+ , input_buffer_(core::consumer_buffer_depth()-1)\r
, executor_(print())\r
{ \r
+ frame_buffer_.set_capacity(2);\r
+\r
graph_->add_guide("frame-time", 0.5);\r
graph_->set_color("frame-time", diagnostics::color(1.0f, 0.0f, 0.0f));\r
+ graph_->set_color("dropped-frame", diagnostics::color(0.3f, 0.6f, 0.3f));\r
\r
format_desc_ = format_desc;\r
\r
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);\r
});\r
CASPAR_LOG(info) << print() << " Sucessfully Initialized.";\r
+\r
+ executor_.begin_invoke([this]{tick();});\r
+ }\r
+\r
+ ~ogl_consumer()\r
+ {\r
+ executor_.stop();\r
+ frame_buffer_.push(make_safe<core::read_frame>());\r
}\r
\r
const core::video_format_desc& get_video_format_desc() const\r
\r
void send(const safe_ptr<core::read_frame>& frame)\r
{\r
- frame_buffer_.push_back(frame);\r
+ input_buffer_.push_back(frame);\r
\r
- if(frame_buffer_.full())\r
- do_send(frame_buffer_.front());\r
+ if(input_buffer_.full())\r
+ {\r
+ if(!frame_buffer_.try_push(input_buffer_.front()))\r
+ graph_->add_tag("dropped-frame");\r
+ }\r
}\r
\r
- void do_send(const safe_ptr<core::read_frame>& frame)\r
- { \r
- executor_.try_begin_invoke([=]\r
+ std::wstring print() const\r
+ { \r
+ return L"ogl[" + boost::lexical_cast<std::wstring>(screen_index_) + L"|" + format_desc_.name + L"]";\r
+ }\r
+\r
+ void tick()\r
+ {\r
+ try\r
{\r
perf_timer_.restart();\r
sf::Event e;\r
+ \r
+ safe_ptr<core::read_frame> frame;\r
+\r
while(window_.GetEvent(e))\r
{\r
if(e.Type == sf::Event::Resized)\r
- calculate_aspect();\r
+ calculate_aspect();\r
}\r
- render(frame);\r
- window_.Display();\r
- graph_->update_value("frame-time", static_cast<float>(perf_timer_.elapsed()*format_desc_.fps*0.5));\r
- });\r
- }\r
\r
- std::wstring print() const\r
- { \r
- return L"ogl[" + boost::lexical_cast<std::wstring>(screen_index_) + L"|" + format_desc_.name + L"]";\r
- }\r
+ frame_buffer_.pop(frame);\r
+\r
+ if(!frame->image_data().empty())\r
+ render(frame);\r
\r
- size_t buffer_depth() const{return 2;}\r
+ window_.Display();\r
+ graph_->update_value("frame-time", static_cast<float>(perf_timer_.elapsed()*format_desc_.fps*0.5)); \r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ }\r
+ executor_.begin_invoke([=]{tick();});\r
+ }\r
};\r
\r
\r