]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 12 Aug 2011 22:50:13 +0000 (22:50 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 12 Aug 2011 22:50:13 +0000 (22:50 +0000)
core/consumer/output.cpp
core/mixer/gpu/ogl_device.cpp
core/mixer/image/image_mixer.cpp
core/mixer/mixer.cpp
core/producer/frame_producer.cpp
core/producer/layer.cpp
core/producer/stage.cpp

index 4a2941c575d287f262bbca26c7df1bb8d55e94f1..3962adb4f8cc60a84afc38a9ff363051991634cc 100644 (file)
 \r
 namespace caspar { namespace core {\r
 \r
-class key_read_frame_muxer : 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_muxer(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
@@ -120,7 +120,7 @@ public:
                                timer_.tick(1.0/channel_.get_format_desc().fps);\r
                                                \r
                        auto fill = frame;\r
-                       auto key = make_safe<key_read_frame_muxer>(channel_.ogl(), 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
index 6a7335d4ea4272a6e84713ee2c3ee187c5329207..95beaa70e680092b762e13224a94216c5fefe42b 100644 (file)
@@ -81,11 +81,7 @@ safe_ptr<device_buffer> ogl_device::create_device_buffer(size_t width, size_t he
                                try\r
                                {\r
                                        yield();\r
-                                       BOOST_FOREACH(auto& pools, device_pools_)\r
-                                       {\r
-                                               BOOST_FOREACH(auto& pool, pools)\r
-                                                       pool.second->clear();\r
-                                       }\r
+                                       gc().wait();\r
                                        \r
                                        // Try again\r
                                        buffer.reset(new device_buffer(width, height, stride));\r
@@ -129,11 +125,7 @@ safe_ptr<host_buffer> ogl_device::create_host_buffer(size_t size, host_buffer::u
                                try\r
                                {\r
                                        yield();\r
-                                       BOOST_FOREACH(auto& pools, host_pools_)\r
-                                       {\r
-                                               BOOST_FOREACH(auto& pool, pools)\r
-                                                       pool.second->clear();\r
-                                       }\r
+                                       gc().wait();\r
 \r
                                        // Try again\r
                                        buffer.reset(new host_buffer(size, usage));\r
index 1feead5e3bcc77ac36c648f5df059e55a3b59b70..326128672bfa664cc876f580c6b4f5f001a48b45 100644 (file)
@@ -88,9 +88,9 @@ public:
                write_buffer_                   = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);\r
                layer_key_buffer_               = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
                draw_buffer_[0]                 = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);\r
-               draw_buffer_[1]                 = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);\r
+               //draw_buffer_[1]                       = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);\r
                local_key_buffer_[0]    = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
-               local_key_buffer_[1]    = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
+               //local_key_buffer_[1]  = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
                channel_.ogl().gc();\r
        }\r
 \r
@@ -145,9 +145,9 @@ public:
                \r
                layer_key_buffer_->clear();\r
                draw_buffer_[0]->clear();\r
-               draw_buffer_[1]->clear();\r
+               //draw_buffer_[1]->clear();\r
                local_key_buffer_[0]->clear();\r
-               local_key_buffer_[1]->clear();\r
+               //local_key_buffer_[1]->clear();\r
 \r
                bool layer_key = false;\r
 \r
index 863f25884ec701e81564e6bc1917e5fd19bf7540..ea730c7f78f150cd0d6ad494cf674e7616295bf2 100644 (file)
@@ -120,9 +120,11 @@ public:
                        decltype(mix_image(frames)) image;\r
                        decltype(mix_audio(frames)) audio;\r
 \r
-                       tbb::parallel_invoke(\r
-                                       [&]{image = mix_image(frames);}, \r
-                                       [&]{audio = mix_audio(frames);});\r
+                       tbb::parallel_invoke\r
+                       (\r
+                               [&]{image = mix_image(frames);}, \r
+                               [&]{audio = mix_audio(frames);}\r
+                       );\r
                        \r
                        buffer_.push(std::make_pair(std::move(image), audio));\r
 \r
index 7b86eb795015aecea9712072e9ee38c28dda6847..08f3b17093f575cad5f2bee7648bbd994e5d90f0 100644 (file)
@@ -53,22 +53,7 @@ safe_ptr<basic_frame> receive_and_follow(safe_ptr<frame_producer>& producer, int
        if(producer == frame_producer::empty())\r
                return basic_frame::eof();\r
 \r
-       auto frame = basic_frame::eof();\r
-       try\r
-       {\r
-               frame = producer->receive(hints);\r
-       }\r
-       catch(...)\r
-       {\r
-               try\r
-               {\r
-                       // Producer will be removed since frame == basic_frame::eof.\r
-                       CASPAR_LOG_CURRENT_EXCEPTION();\r
-                       CASPAR_LOG(warning) << producer->print() << " Failed to receive frame. Removing producer.";\r
-               }\r
-               catch(...){}\r
-       }\r
-\r
+       auto frame = producer->receive(hints);\r
        if(frame == basic_frame::eof())\r
        {\r
                CASPAR_LOG(info) << producer->print() << " End Of File.";\r
index 4611bb701f3ef2b37586f6b6d7f42e501de5aa0e..9ba6acaa5360094278f057d4cb138de55702c89f 100644 (file)
@@ -86,29 +86,38 @@ public:
                \r
        safe_ptr<basic_frame> receive()\r
        {               \r
-               if(is_paused_)\r
-                       return foreground_->last_frame();\r
+               try\r
+               {\r
+                       if(is_paused_)\r
+                               return foreground_->last_frame();\r
                \r
-               const auto frames_left = foreground_->nb_frames() - (++frame_number_) - auto_play_delta_;\r
+                       const auto frames_left = foreground_->nb_frames() - (++frame_number_) - auto_play_delta_;\r
 \r
-               auto frame = receive_and_follow(foreground_, frame_producer::NO_HINT);\r
-               if(frame == core::basic_frame::late())\r
-                       return foreground_->last_frame();\r
+                       auto frame = receive_and_follow(foreground_, frame_producer::NO_HINT);\r
+                       if(frame == core::basic_frame::late())\r
+                               return foreground_->last_frame();\r
                \r
-               if(auto_play_delta_ >= 0)\r
-               {\r
-                       if(frames_left <= 0 || frame == core::basic_frame::eof())\r
+                       if(auto_play_delta_ >= 0)\r
                        {\r
-                               //CASPAR_ASSERT(frame != core::basic_frame::eof() && "Received early EOF. Media duration metadata incorrect.");\r
+                               if(frames_left <= 0 || frame == core::basic_frame::eof())\r
+                               {\r
+                                       //CASPAR_ASSERT(frame != core::basic_frame::eof() && "Received early EOF. Media duration metadata incorrect.");\r
 \r
-                               CASPAR_LOG(info) << L"Automatically playing next clip with " << auto_play_delta_ << " frames offset. Frames left: " << frames_left;\r
+                                       CASPAR_LOG(info) << L"Automatically playing next clip with " << auto_play_delta_ << " frames offset. Frames left: " << frames_left;\r
                                \r
-                               play();\r
-                               frame = receive();\r
+                                       play();\r
+                                       frame = receive();\r
+                               }\r
                        }\r
-               }\r
                                \r
-               return frame;\r
+                       return frame;\r
+               }\r
+               catch(...)\r
+               {\r
+                       CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       stop();\r
+                       return core::basic_frame::empty();\r
+               }\r
        }\r
 \r
        bool empty() const\r
index 13c547aa4790ec65d635a4c88d898d594403fff4..1c5d99014f39b65db4bbc0ede4d7e982109307ef 100644 (file)
@@ -87,21 +87,14 @@ public:
        std::map<int, safe_ptr<basic_frame>> execute()\r
        {                       \r
                std::map<int, safe_ptr<basic_frame>> frames;\r
+               \r
+               BOOST_FOREACH(auto& layer, layers_)                     \r
+                       frames[layer.first] = basic_frame::empty();     \r
 \r
-               try\r
-               {                       \r
-                       BOOST_FOREACH(auto& layer, layers_)                     \r
-                               frames[layer.first] = basic_frame::empty();     \r
-\r
-                       tbb::parallel_for_each(layers_.begin(), layers_.end(), [&](std::map<int, layer>::value_type& layer) \r
-                       {\r
-                               frames[layer.first] = layer.second.receive();   \r
-                       });\r
-               }\r
-               catch(...)\r
+               tbb::parallel_for_each(layers_.begin(), layers_.end(), [&](std::map<int, layer>::value_type& layer) \r
                {\r
-                       CASPAR_LOG_CURRENT_EXCEPTION();\r
-               }\r
+                       frames[layer.first] = layer.second.receive();   \r
+               });\r
                \r
                return frames;\r
        }\r