]> git.sesse.net Git - casparcg/blobdiff - core/consumer/output.cpp
2.0. Optimized key-only.
[casparcg] / core / consumer / output.cpp
index fce751112bad59671f656f4563f77b262b5df331..dde9c009aa9ab6189efe5129198ecf610fac2b2d 100644 (file)
 \r
 namespace caspar { namespace core {\r
 \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
-       \r
 struct output::implementation\r
 {      \r
        typedef std::pair<safe_ptr<read_frame>, safe_ptr<read_frame>> fill_and_key;\r
@@ -128,10 +96,7 @@ public:
                        timer_.tick(1.0/channel_.get_format_desc().fps);\r
                        return;\r
                }\r
-\r
-               auto fill = frame;\r
-               auto key = make_safe<deferred_key_read_Frame>(channel_.ogl(), frame);\r
-\r
+               \r
                auto it = consumers_.begin();\r
                while(it != consumers_.end())\r
                {\r
@@ -140,7 +105,7 @@ public:
                        if(consumer->get_video_format_desc() != channel_.get_format_desc())\r
                                consumer->initialize(channel_.get_format_desc());\r
 \r
-                       if(consumer->send(consumer->key_only() ? key : fill))\r
+                       if(consumer->send(frame))\r
                                ++it;\r
                        else\r
                                consumers_.erase(it++);\r