{\r
}\r
\r
- safe_ptr<host_buffer> render()\r
+ boost::unique_future<safe_ptr<host_buffer>> render()\r
{ \r
auto render_queue = std::move(render_queue_);\r
\r
- return channel_.ogl().invoke([=]() mutable -> safe_ptr<host_buffer>\r
+ return channel_.ogl().begin_invoke([=]() mutable -> safe_ptr<host_buffer>\r
{ \r
if(channel_.get_format_desc().width != write_buffer_->width() || channel_.get_format_desc().height != write_buffer_->height())\r
initialize_buffers();\r
void image_mixer::begin(core::basic_frame& frame){impl_->begin(frame);}\r
void image_mixer::visit(core::write_frame& frame){impl_->visit(frame);}\r
void image_mixer::end(){impl_->end();}\r
-safe_ptr<host_buffer> image_mixer::render(){return impl_->render();}\r
+boost::unique_future<safe_ptr<host_buffer>> image_mixer::render(){return impl_->render();}\r
safe_ptr<write_frame> image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc){return impl_->create_frame(tag, desc);}\r
void image_mixer::begin_layer(){impl_->begin_layer();}\r
void image_mixer::end_layer(){impl_->end_layer();}\r
\r
#include <boost/noncopyable.hpp>\r
\r
+#include <boost/thread/future.hpp>\r
+\r
namespace caspar { namespace core {\r
\r
class write_frame;\r
\r
image_mixer& operator=(image_mixer&& other);\r
\r
- safe_ptr<host_buffer> render();\r
+ boost::unique_future<safe_ptr<host_buffer>> render();\r
\r
safe_ptr<write_frame> create_frame(const void* tag, const core::pixel_format_desc& format);\r
\r
auto image = mix_image(frames);\r
auto audio = mix_audio(frames);\r
\r
- return make_safe<read_frame>(channel_.ogl(), std::move(image), std::move(audio));\r
+ return make_safe<read_frame>(channel_.ogl(), std::move(image.get()), std::move(audio));\r
}\r
catch(...)\r
{\r
\r
private:\r
\r
- safe_ptr<host_buffer> mix_image(std::map<int, safe_ptr<core::basic_frame>> frames)\r
+ boost::unique_future<safe_ptr<host_buffer>> mix_image(std::map<int, safe_ptr<core::basic_frame>> frames)\r
{ \r
auto& image_transforms = boost::fusion::at_key<core::image_transform>(transforms_);\r
\r