X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=core%2Fvideo_channel.cpp;h=476a73eb32190af8e0f2ba8954ebe2eb1a49829e;hb=3b48b20b7b77beab3ae36e973e3390dafa4e3e86;hp=96812ad929e334cc1393e581bcf4fef8c98a3893;hpb=566f0b30cb2b94d33e833eb2d4656c65f3790529;p=casparcg diff --git a/core/video_channel.cpp b/core/video_channel.cpp index 96812ad92..476a73eb3 100644 --- a/core/video_channel.cpp +++ b/core/video_channel.cpp @@ -23,14 +23,17 @@ #include "video_channel.h" #include "video_channel_context.h" - #include "video_format.h" -#include "producer/layer.h" + +#include "consumer/output.h" +#include "mixer/mixer.h" +#include "producer/stage.h" #include #include -#include +#include "mixer/gpu/ogl_device.h" + #include #ifdef _MSC_VER @@ -43,27 +46,28 @@ struct video_channel::implementation : boost::noncopyable { video_channel_context context_; - safe_ptr consumer_; - safe_ptr mixer_; - safe_ptr producer_; + 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) : context_(index, ogl, format_desc) , diag_(diagnostics::create_graph(narrow(print()))) - , consumer_(new frame_consumer_device(context_)) - , mixer_(new frame_mixer_device(context_)) - , producer_(new frame_producer_device(context_)) + , output_(new caspar::core::output(context_, [this]{restart();})) + , mixer_(new caspar::core::mixer(context_)) + , 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();}); @@ -80,31 +84,54 @@ public: void tick() { - // Produce + try + { + // Produce - frame_timer_.restart(); + frame_timer_.restart(); - auto simple_frames = producer_->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); + + // Consume - diag_->update_value("mix-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5); + output_timer_.restart(); + + output_->execute(finished_frame); - // Consume + diag_->update_value("output-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5); - consumer_->execute(finished_frame); - diag_->update_value("tick-time", tick_timer_.elapsed()*context_.get_format_desc().fps*0.5); - tick_timer_.restart(); + 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"; + restart(); + } context_.execution().begin_invoke([this]{tick();}); } + + void restart() + { + stage_->clear(); + context_.ogl().gc().wait(); + + mixer_ = nullptr; + mixer_.reset(new caspar::core::mixer(context_)); + } std::wstring print() const { @@ -115,6 +142,8 @@ public: { context_.execution().begin_invoke([=] { + stage_->clear(); + context_.ogl().gc().wait(); context_.set_format_desc(format_desc); }); } @@ -122,11 +151,12 @@ 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::producer() { return impl_->producer_;} -safe_ptr video_channel::mixer() { return impl_->mixer_;} -safe_ptr video_channel::consumer() { return impl_->consumer_;} +safe_ptr video_channel::stage() { return impl_->stage_;} +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