+\r
+class deferred_key_read_Frame : public core::read_frame\r
+{\r
+ ogl_device& ogl_;\r
+ safe_ptr<read_frame> fill_;\r
+ std::shared_ptr<host_buffer> key_;\r
+ tbb::mutex mutex_;\r
+public:\r
+ deferred_key_read_Frame(ogl_device& ogl, const safe_ptr<read_frame>& fill)\r
+ : ogl_(ogl)\r
+ , fill_(fill)\r
+ {\r
+ }\r
+\r
+ virtual const boost::iterator_range<const uint8_t*> image_data()\r
+ {\r
+ tbb::mutex::scoped_lock lock(mutex_);\r
+ if(!key_)\r
+ {\r
+ key_ = ogl_.create_host_buffer(fill_->image_data().size(), host_buffer::write_only); \r
+ fast_memsfhl(key_->data(), fill_->image_data().begin(), fill_->image_data().size(), 0x0F0F0F0F, 0x0B0B0B0B, 0x07070707, 0x03030303);\r
+ }\r
+\r
+ auto ptr = static_cast<const uint8_t*>(key_->data());\r
+ return boost::iterator_range<const uint8_t*>(ptr, ptr + key_->size());\r
+ }\r
+\r
+ virtual const boost::iterator_range<const int16_t*> audio_data()\r
+ {\r
+ return fill_->audio_data();\r
+ } \r
+};\r