}\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<deferred_key_read_Frame>(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
+ if(frame->image_size() != channel_.get_format_desc().size)\r
+ {\r
+ timer_.tick(1.0/channel_.get_format_desc().fps);\r
+ return;\r
+ }\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
+ try\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(frame->image_size() == consumer->get_video_format_desc().size)\r
- { \r
- if(!consumer->send(frame))\r
- consumers_.erase(it++);\r
- else\r
- ++it;\r
- }\r
- }\r
- catch(...)\r
- {\r
- CASPAR_LOG_CURRENT_EXCEPTION();\r
- CASPAR_LOG(error) << print() << L" " << it->second->print() << L" Removed.";\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
- catch(...)\r
- {\r
- CASPAR_LOG_CURRENT_EXCEPTION();\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
}\r
\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
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
CASPAR_LOG(error) << context_.print() << L" Unexpected exception. Clearing stage and freeing memory";\r
+\r
stage_->clear();\r
context_.ogl().gc().wait();\r
- mixer_ = make_safe<caspar::core::mixer>(context_);\r
+\r
+ mixer_ = nullptr;\r
+ mixer_.reset(new caspar::core::mixer(context_));\r
}\r
\r
context_.execution().begin_invoke([this]{tick();});\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