#include <common/concurrency/executor.h>\r
#include <common/diagnostics/graph.h>\r
\r
+#include "mixer/gpu/ogl_device.h"\r
+\r
#include <boost/timer.hpp>\r
\r
#ifdef _MSC_VER\r
{\r
video_channel_context context_;\r
\r
- safe_ptr<caspar::core::output> output_;\r
- safe_ptr<caspar::core::mixer> mixer_;\r
- safe_ptr<caspar::core::stage> stage_;\r
+ safe_ptr<caspar::core::output> output_;\r
+ std::shared_ptr<caspar::core::mixer> mixer_;\r
+ safe_ptr<caspar::core::stage> stage_;\r
\r
safe_ptr<diagnostics::graph> diag_;\r
boost::timer frame_timer_;\r
implementation(int index, const video_format_desc& format_desc, ogl_device& ogl) \r
: context_(index, ogl, format_desc)\r
, diag_(diagnostics::create_graph(narrow(print())))\r
- , output_(new caspar::core::output(context_))\r
+ , output_(new caspar::core::output(context_, [this]{restart();}))\r
, mixer_(new caspar::core::mixer(context_))\r
, stage_(new caspar::core::stage(context_)) \r
{\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("produce-time", diagnostics::color(0.0f, 1.0f, 0.0f));\r
+ diag_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f)); \r
+ diag_->set_color("output-time", diagnostics::color(1.0f, 0.5f, 0.0f));\r
+ diag_->set_color("mix-time", diagnostics::color(1.0f, 1.0f, 0.9f));\r
\r
CASPAR_LOG(info) << print() << " Successfully Initialized.";\r
context_.execution().begin_invoke([this]{tick();});\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
+ restart();\r
}\r
\r
context_.execution().begin_invoke([this]{tick();});\r
}\r
+\r
+ void restart()\r
+ {\r
+ stage_->clear();\r
+ context_.ogl().gc().wait();\r
+\r
+ mixer_ = nullptr;\r
+ mixer_.reset(new caspar::core::mixer(context_));\r
+ }\r
\r
std::wstring print() const\r
{\r
context_.execution().begin_invoke([=]\r
{\r
stage_->clear();\r
+ context_.ogl().gc().wait();\r
context_.set_format_desc(format_desc);\r
});\r
}\r
video_channel::video_channel(int index, const video_format_desc& format_desc, ogl_device& ogl) : impl_(new implementation(index, format_desc, ogl)){}\r
video_channel::video_channel(video_channel&& other) : impl_(std::move(other.impl_)){}\r
safe_ptr<stage> video_channel::stage() { return impl_->stage_;} \r
-safe_ptr<mixer> video_channel::mixer() { return impl_->mixer_;} \r
+safe_ptr<mixer> video_channel::mixer() { return make_safe(impl_->mixer_);} \r
safe_ptr<output> video_channel::output() { return impl_->output_;} \r
video_format_desc video_channel::get_video_format_desc() const{return impl_->context_.get_format_desc();}\r
void video_channel::set_video_format_desc(const video_format_desc& format_desc){impl_->set_video_format_desc(format_desc);}\r
std::wstring video_channel::print() const { return impl_->print();}\r
+video_channel_context& video_channel::context(){return impl_->context_;}\r
\r
}}
\ No newline at end of file