]> git.sesse.net Git - casparcg/blobdiff - core/consumer/output.cpp
2.0. ogl_consumer: Refactored
[casparcg] / core / consumer / output.cpp
index 44774d42a3cc3776f22e671a93ffced955576129..fce751112bad59671f656f4563f77b262b5df331 100644 (file)
@@ -17,6 +17,7 @@
 *    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
 *\r
 */\r
+// TODO: Try to recover consumer from bad_alloc...\r
 #include "../StdAfx.h"\r
 \r
 #ifdef _MSC_VER\r
 \r
 namespace caspar { namespace core {\r
 \r
-class key_read_frame_adapter : public core::read_frame\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
-       key_read_frame_adapter(ogl_device& ogl, const safe_ptr<read_frame>& fill)\r
+       deferred_key_read_Frame(ogl_device& ogl, const safe_ptr<read_frame>& fill)\r
                : ogl_(ogl)\r
                , fill_(fill)\r
        {\r
@@ -89,10 +90,15 @@ public:
        \r
        void add(int index, safe_ptr<frame_consumer>&& consumer)\r
        {               \r
-               consumer->initialize(channel_.get_format_desc());\r
                channel_.execution().invoke([&]\r
                {\r
                        consumers_.erase(index);\r
+               });\r
+\r
+               consumer->initialize(channel_.get_format_desc());\r
+\r
+               channel_.execution().invoke([&]\r
+               {\r
                        consumers_.insert(std::make_pair(index, consumer));\r
 \r
                        CASPAR_LOG(info) << print() << L" " << consumer->print() << L" Added.";\r
@@ -113,43 +119,31 @@ public:
        }\r
                                                \r
        void execute(const safe_ptr<read_frame>& frame)\r
-       {               \r
-               try\r
-               {               \r
-                       if(!has_synchronization_clock())\r
-                               timer_.tick(1.0/channel_.get_format_desc().fps);\r
-                                               \r
-                       auto fill = frame;\r
-                       auto key = make_safe<key_read_frame_adapter>(channel_.ogl(), frame);\r
+       {                       \r
+               if(!has_synchronization_clock())\r
+                       timer_.tick(1.0/channel_.get_format_desc().fps);\r
 \r
-                       auto it = consumers_.begin();\r
-                       while(it != consumers_.end())\r
-                       {\r
-                               try\r
-                               {\r
-                                       auto consumer = it->second;\r
-\r
-                                       if(consumer->get_video_format_desc() != channel_.get_format_desc())\r
-                                               consumer->initialize(channel_.get_format_desc());\r
-\r
-                                       auto frame = consumer->key_only() ? key : fill;\r
-\r
-                                       if(static_cast<size_t>(frame->image_data().size()) == consumer->get_video_format_desc().size)\r
-                                               consumer->send(frame);\r
-\r
-                                       ++it;\r
-                               }\r
-                               catch(...)\r
-                               {\r
-                                       CASPAR_LOG_CURRENT_EXCEPTION();\r
-                                       CASPAR_LOG(error) << print() << L" " << it->second->print() << L" Removed.";\r
-                                       consumers_.erase(it++);\r
-                               }\r
-                       }\r
+               if(frame->image_size() != channel_.get_format_desc().size)\r
+               {\r
+                       timer_.tick(1.0/channel_.get_format_desc().fps);\r
+                       return;\r
                }\r
-               catch(...)\r
+\r
+               auto fill = frame;\r
+               auto key = make_safe<deferred_key_read_Frame>(channel_.ogl(), frame);\r
+\r
+               auto it = consumers_.begin();\r
+               while(it != consumers_.end())\r
                {\r
-                       CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       auto consumer = it->second;\r
+\r
+                       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
+                               ++it;\r
+                       else\r
+                               consumers_.erase(it++);\r
                }\r
        }\r
 \r