]> git.sesse.net Git - casparcg/blobdiff - core/video_channel.cpp
2.0. - blend_modes are re-enabled.
[casparcg] / core / video_channel.cpp
index 3aac12736360384cf6a904a3ded913af5849f4d3..23c1f16e4b0a471e54b7688b371dd26bb9089c0e 100644 (file)
@@ -63,9 +63,9 @@ public:
        {\r
                diag_->add_guide("produce-time", 0.5f); \r
                diag_->set_color("produce-time", diagnostics::color(1.0f, 0.0f, 0.0f));\r
-               diag_->set_color("mix-time", diagnostics::color(1.0f, 0.0f, 1.0f));\r
-               diag_->set_color("output-time", diagnostics::color(1.0f, 1.0f, 0.0f));\r
                diag_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f));    \r
+               diag_->set_color("output-time", diagnostics::color(1.0f, 0.5f, 0.0f));\r
+               diag_->set_color("mix-time", diagnostics::color(0.0f, 1.0f, 0.0f));\r
 \r
                CASPAR_LOG(info) << print() << " Successfully Initialized.";\r
                context_.execution().begin_invoke([this]{tick();});\r
@@ -82,33 +82,44 @@ public:
 \r
        void tick()\r
        {\r
-               // Produce\r
+               try\r
+               {\r
+                       // Produce\r
 \r
-               frame_timer_.restart();\r
+                       frame_timer_.restart();\r
 \r
-               auto simple_frames = stage_->execute();\r
+                       auto simple_frames = stage_->execute();\r
 \r
-               diag_->update_value("produce-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
+                       diag_->update_value("produce-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
                \r
-               // Mix\r
+                       // Mix\r
 \r
-               frame_timer_.restart();\r
+                       frame_timer_.restart();\r
 \r
-               auto finished_frame = mixer_->execute(simple_frames);\r
+                       auto finished_frame = mixer_->execute(simple_frames);\r
                \r
-               diag_->update_value("mix-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
+                       diag_->update_value("mix-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
                \r
-               // Consume\r
+                       // Consume\r
                \r
-               output_timer_.restart();\r
+                       output_timer_.restart();\r
 \r
-               output_->execute(finished_frame);\r
+                       output_->execute(finished_frame);\r
                \r
-               diag_->update_value("output-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
+                       diag_->update_value("output-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
 \r
                \r
-               diag_->update_value("tick-time", tick_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
-               tick_timer_.restart();\r
+                       diag_->update_value("tick-time", tick_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
+                       tick_timer_.restart();\r
+               }\r
+               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
+                       mixer_ = make_safe<caspar::core::mixer>(context_);\r
+               }\r
 \r
                context_.execution().begin_invoke([this]{tick();});\r
        }\r
@@ -122,6 +133,7 @@ public:
        {\r
                context_.execution().begin_invoke([=]\r
                {\r
+                       stage_->clear();\r
                        context_.set_format_desc(format_desc);\r
                });\r
        }\r