]> git.sesse.net Git - casparcg/commitdiff
2.0. mixer: Propagate exception into video_channel to allow recovery.
authorRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 14 Aug 2011 00:39:53 +0000 (00:39 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 14 Aug 2011 00:39:53 +0000 (00:39 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1164 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

common/gl/gl_check.cpp
core/mixer/mixer.cpp
core/video_channel.cpp

index b11619b1b65270244def68575ba01662febe27cb..859a7eaaca4ba896c5cd93e6aa3b218318d7b15d 100644 (file)
@@ -83,7 +83,7 @@ void SMFL_GLCheckError(const std::string& expr, const std::string& file, unsigne
                                        << source_info(file));\r
 \r
                        case GL_OUT_OF_MEMORY :\r
-                               BOOST_THROW_EXCEPTION(ogl_stack_underflow()\r
+                               BOOST_THROW_EXCEPTION(ogl_out_of_memory()\r
                                        << msg_info("there is not enough memory left to execute the command")\r
                                        << errorstr("GL_OUT_OF_MEMORY")\r
                                        << line_info(line)\r
index ea730c7f78f150cd0d6ad494cf674e7616295bf2..f866c0b0e3b27e8378134a3178899e19fd635814 100644 (file)
@@ -33,6 +33,7 @@
 #include <common/concurrency/executor.h>\r
 #include <common/utility/tweener.h>\r
 #include <common/env.h>\r
+#include <common/gl/gl_check.h>\r
 \r
 #include <core/mixer/read_frame.h>\r
 #include <core/mixer/write_frame.h>\r
@@ -115,40 +116,26 @@ public:
                        \r
        safe_ptr<read_frame> execute(const std::map<int, safe_ptr<core::basic_frame>>& frames)\r
        {                       \r
-               try\r
-               {\r
-                       decltype(mix_image(frames)) image;\r
-                       decltype(mix_audio(frames)) audio;\r
-\r
-                       tbb::parallel_invoke\r
-                       (\r
-                               [&]{image = mix_image(frames);}, \r
-                               [&]{audio = mix_audio(frames);}\r
-                       );\r
+               decltype(mix_image(frames)) image;\r
+               decltype(mix_audio(frames)) audio;\r
+\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
+               buffer_.push(std::make_pair(std::move(image), audio));\r
 \r
-                       if(buffer_.size() > buffer_size_)\r
-                       {\r
-                               auto res = std::move(buffer_.front());\r
-                               buffer_.pop();\r
-                       \r
-                               return make_safe<read_frame>(channel_.ogl(), channel_.get_format_desc().size, std::move(res.first.get()), std::move(res.second));\r
-                       }\r
-               }\r
-               catch(...)\r
-               {\r
-                       channel_.ogl().gc().wait();\r
-                       image_mixer_ = image_mixer(channel_);\r
-                       audio_mixer_ = audio_mixer(channel_.get_format_desc());\r
-                       channel_.ogl().gc().wait();\r
-\r
-                       CASPAR_LOG_CURRENT_EXCEPTION();\r
-               }\r
+               if(buffer_.size()-1 < buffer_size_)                     \r
+                       return make_safe<read_frame>();\r
                \r
-               return make_safe<read_frame>();\r
-       }\r
+               auto res = std::move(buffer_.front());\r
+               buffer_.pop();\r
                        \r
+               return make_safe<read_frame>(channel_.ogl(), channel_.get_format_desc().size, std::move(res.first.get()), std::move(res.second));               \r
+       }\r
+                                       \r
        safe_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r
        {               \r
                return image_mixer_.create_frame(tag, desc);\r
index 873a9569f4ed0f870d8bacb2cb06015c0ee1c638..45d3b9158ac364ccea7ce41f347fdac65d73545c 100644 (file)
@@ -115,6 +115,7 @@ public:
                catch(...)\r
                {\r
                        CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       CASPAR_LOG(error) << context_.print() << L" Unexpected exception. Clearing stage and freeing memory";\r
                        stage_->clear();\r
                        context_.ogl().gc().wait();\r
                }\r