X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=core%2Fvideo_channel.cpp;h=267a821dbd50723cbc53edddbb2e18bdb2a5c2ae;hb=a486c25d5e6ce0ebe08e9a2d793a447ff3cb797a;hp=d9df666ff94d9f598c64d06a02b4f7157f72e544;hpb=860bb47e6bb1c08150b54909a722066306ba78e2;p=casparcg diff --git a/core/video_channel.cpp b/core/video_channel.cpp index d9df666ff..267a821db 100644 --- a/core/video_channel.cpp +++ b/core/video_channel.cpp @@ -21,18 +21,19 @@ #include "StdAfx.h" #include "video_channel.h" + #include "video_channel_context.h" #include "video_format.h" #include "consumer/output.h" #include "mixer/mixer.h" #include "producer/stage.h" -#include "producer/layer.h" #include #include -#include +#include "mixer/gpu/ogl_device.h" + #include #ifdef _MSC_VER @@ -45,13 +46,14 @@ struct video_channel::implementation : boost::noncopyable { video_channel_context context_; - safe_ptr output_; - safe_ptr mixer_; - safe_ptr stage_; + safe_ptr output_; + std::shared_ptr mixer_; + safe_ptr stage_; safe_ptr diag_; boost::timer frame_timer_; boost::timer tick_timer_; + boost::timer output_timer_; public: implementation(int index, const video_format_desc& format_desc, ogl_device& ogl) @@ -62,10 +64,10 @@ public: , stage_(new caspar::core::stage(context_)) { diag_->add_guide("produce-time", 0.5f); - diag_->set_color("produce-time", diagnostics::color(1.0f, 0.0f, 0.0f)); - diag_->add_guide("mix-time", 0.5f); - diag_->set_color("mix-time", diagnostics::color(1.0f, 0.0f, 1.0f)); - diag_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f)); + diag_->set_color("produce-time", diagnostics::color(0.0f, 1.0f, 0.0f)); + diag_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f)); + diag_->set_color("output-time", diagnostics::color(1.0f, 0.5f, 0.0f)); + diag_->set_color("mix-time", diagnostics::color(1.0f, 1.0f, 0.9f)); CASPAR_LOG(info) << print() << " Successfully Initialized."; context_.execution().begin_invoke([this]{tick();}); @@ -82,28 +84,47 @@ public: void tick() { - // Produce + try + { + // Produce - frame_timer_.restart(); + frame_timer_.restart(); - auto simple_frames = stage_->execute(); + auto simple_frames = stage_->execute(); - diag_->update_value("produce-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5); + diag_->update_value("produce-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5); - // Mix + // Mix - frame_timer_.restart(); + frame_timer_.restart(); - auto finished_frame = mixer_->execute(simple_frames); + auto finished_frame = mixer_->execute(simple_frames); - diag_->update_value("mix-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5); + diag_->update_value("mix-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5); - // Consume + // Consume + + output_timer_.restart(); - output_->execute(finished_frame); + output_->execute(finished_frame); - diag_->update_value("tick-time", tick_timer_.elapsed()*context_.get_format_desc().fps*0.5); - tick_timer_.restart(); + diag_->update_value("output-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5); + + + diag_->update_value("tick-time", tick_timer_.elapsed()*context_.get_format_desc().fps*0.5); + tick_timer_.restart(); + } + catch(...) + { + CASPAR_LOG_CURRENT_EXCEPTION(); + CASPAR_LOG(error) << context_.print() << L" Unexpected exception. Clearing stage and freeing memory"; + + stage_->clear(); + context_.ogl().gc().wait(); + + mixer_ = nullptr; + mixer_.reset(new caspar::core::mixer(context_)); + } context_.execution().begin_invoke([this]{tick();}); } @@ -117,6 +138,8 @@ public: { context_.execution().begin_invoke([=] { + stage_->clear(); + context_.ogl().gc().wait(); context_.set_format_desc(format_desc); }); } @@ -125,10 +148,11 @@ public: video_channel::video_channel(int index, const video_format_desc& format_desc, ogl_device& ogl) : impl_(new implementation(index, format_desc, ogl)){} video_channel::video_channel(video_channel&& other) : impl_(std::move(other.impl_)){} safe_ptr video_channel::stage() { return impl_->stage_;} -safe_ptr video_channel::mixer() { return impl_->mixer_;} +safe_ptr video_channel::mixer() { return make_safe(impl_->mixer_);} safe_ptr video_channel::output() { return impl_->output_;} video_format_desc video_channel::get_video_format_desc() const{return impl_->context_.get_format_desc();} void video_channel::set_video_format_desc(const video_format_desc& format_desc){impl_->set_video_format_desc(format_desc);} std::wstring video_channel::print() const { return impl_->print();} +video_channel_context& video_channel::context(){return impl_->context_;} }} \ No newline at end of file