boost::unique_future<safe_ptr<const host_buffer>> render()\r
{\r
auto result = ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only);\r
- \r
+\r
auto render_queue = std::move(render_queue_);\r
\r
ogl_device::begin_invoke([=]() mutable\r
\r
std::swap(draw_buffer_, write_buffer_);\r
});\r
+\r
+ // While transferring do additional work which was queued during rendering.\r
\r
return ogl_device::begin_invoke([=]() -> safe_ptr<const host_buffer>\r
{\r
\r
const boost::iterator_range<const unsigned char*> read_frame::image_data() const\r
{\r
- if(!impl_->image_data_.get()->data())\r
+ try\r
+ {\r
+ if(!impl_->image_data_.get()->data())\r
+ return boost::iterator_range<const unsigned char*>();\r
+ auto ptr = static_cast<const unsigned char*>(impl_->image_data_.get()->data());\r
+ return boost::iterator_range<const unsigned char*>(ptr, ptr + impl_->image_data_.get()->size());\r
+ }\r
+ catch(...) // image_data_ future might store exception.\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
return boost::iterator_range<const unsigned char*>();\r
- auto ptr = static_cast<const unsigned char*>(impl_->image_data_.get()->data());\r
- return boost::iterator_range<const unsigned char*>(ptr, ptr + impl_->image_data_.get()->size());\r
+ }\r
}\r
const boost::iterator_range<const short*> read_frame::audio_data() const\r
{\r
return;\r
\r
auto texture = textures_[plane_index];\r
- auto buffer = std::move(buffers_[plane_index]);\r
+ auto buffer = std::move(buffers_[plane_index]); // Release buffer once done.\r
\r
ogl_device::begin_invoke([=]\r
{\r