X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=core%2Fvideo_channel.cpp;h=a0ac2c2012fd249ac76d0fcd85a8483826ee7e86;hb=9e4b08cde6c6de9e83a3fff42d90affc3cd8e5bc;hp=8ee1992dae68186dcb434863fdb6f9dd36deb2a3;hpb=b59ec2b89fbc8a2fbccaaa42d623db97a241a54b;p=casparcg diff --git a/core/video_channel.cpp b/core/video_channel.cpp index 8ee1992da..a0ac2c201 100644 --- a/core/video_channel.cpp +++ b/core/video_channel.cpp @@ -49,6 +49,7 @@ #include #include +#include namespace caspar { namespace core { @@ -76,6 +77,10 @@ struct video_channel::impl final caspar::core::mixer mixer_; caspar::core::stage stage_; + mutable tbb::spin_mutex tick_listeners_mutex_; + int64_t last_tick_listener_id = 0; + std::unordered_map> tick_listeners_; + executor executor_ { L"video_channel " + boost::lexical_cast(index_) }; public: impl( @@ -145,10 +150,28 @@ public: }); } + void invoke_tick_listeners() + { + auto listeners = lock(tick_listeners_mutex_, [=] { return tick_listeners_; }); + + for (auto listener : listeners) + { + try + { + listener.second(); + } + catch (...) + { + CASPAR_LOG_CURRENT_EXCEPTION(); + } + } + } + void tick() { try { + invoke_tick_listeners(); auto format_desc = video_format_desc(); auto channel_layout = audio_channel_layout(); @@ -171,7 +194,7 @@ public: auto frame_time = frame_timer.elapsed()*format_desc.fps*0.5; graph_->set_value("tick-time", frame_time); - *monitor_subject_ << monitor::message("/profiler/time") % frame_timer.elapsed() % (1.0/format_desc_.fps) + *monitor_subject_ << monitor::message("/profiler/time") % frame_timer.elapsed() % (1.0/ video_format_desc().fps) << monitor::message("/format") % format_desc.name; } catch(...) @@ -225,6 +248,23 @@ public: return info; } + + std::shared_ptr add_tick_listener(std::function listener) + { + return lock(tick_listeners_mutex_, [&] + { + auto tick_listener_id = last_tick_listener_id++; + tick_listeners_.insert(std::make_pair(tick_listener_id, listener)); + + return std::shared_ptr(nullptr, [=](void*) + { + lock(tick_listeners_mutex_, [&] + { + tick_listeners_.erase(tick_listener_id); + }); + }); + }); + } }; video_channel::video_channel( @@ -248,5 +288,6 @@ boost::property_tree::wptree video_channel::info() const{return impl_->info();} boost::property_tree::wptree video_channel::delay_info() const { return impl_->delay_info(); } int video_channel::index() const { return impl_->index(); } monitor::subject& video_channel::monitor_output(){ return *impl_->monitor_subject_; } +std::shared_ptr video_channel::add_tick_listener(std::function listener) { return impl_->add_tick_listener(std::move(listener)); } }}