X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=core%2Fproducer%2Fframe_producer.cpp;h=46ca3e4162f7a8cc682e4f568ff3eaa2e263dbda;hb=726897adbf881d3b75f171fff24f2b917ba5f05a;hp=2b78c61778998ba10c57bf77552893eb2a830224;hpb=cd1a44a41dd64c05de067ba728c285f001b66bf3;p=casparcg diff --git a/core/producer/frame_producer.cpp b/core/producer/frame_producer.cpp index 2b78c6177..46ca3e416 100644 --- a/core/producer/frame_producer.cpp +++ b/core/producer/frame_producer.cpp @@ -39,7 +39,6 @@ #include namespace caspar { namespace core { - struct frame_producer_registry::impl { std::vector producer_factories; @@ -103,7 +102,7 @@ struct frame_producer_base::impl frame_number_ = 0; paused_ = false; } - + draw_frame receive() { if(paused_) @@ -148,7 +147,7 @@ draw_frame frame_producer_base::last_frame() return impl_->last_frame(); } -std::future frame_producer_base::call(const std::vector&) +std::future frame_producer_base::call(const std::vector&) { CASPAR_THROW_EXCEPTION(not_supported()); } @@ -176,7 +175,7 @@ const std::vector& frame_producer_base::get_variables() const return empty; } -const spl::shared_ptr& frame_producer::empty() +const spl::shared_ptr& frame_producer::empty() { class empty_frame_producer : public frame_producer { @@ -186,7 +185,7 @@ const spl::shared_ptr& frame_producer::empty() void paused(bool value) override{} uint32_t nb_frames() const override {return 0;} std::wstring print() const override { return L"empty";} - monitor::subject& monitor_output() override {static monitor::subject monitor_subject(""); return monitor_subject;} + monitor::subject& monitor_output() override {static monitor::subject monitor_subject(""); return monitor_subject;} std::wstring name() const override {return L"empty";} uint32_t frame_number() const override {return 0;} std::future call(const std::vector& params) override{CASPAR_THROW_EXCEPTION(not_implemented());} @@ -194,7 +193,7 @@ const spl::shared_ptr& frame_producer::empty() const std::vector& get_variables() const override { static std::vector empty; return empty; } draw_frame last_frame() {return draw_frame::empty();} constraints& pixel_constraints() override { static constraints c; return c; } - + boost::property_tree::wptree info() const override { boost::property_tree::wptree info; @@ -220,10 +219,10 @@ void destroy_producers_synchronously() } class destroy_producer_proxy : public frame_producer -{ +{ std::shared_ptr producer_; public: - destroy_producer_proxy(spl::shared_ptr&& producer) + destroy_producer_proxy(spl::shared_ptr&& producer) : producer_(std::move(producer)) { destroy_producers_in_separate_thread() = true; @@ -234,13 +233,13 @@ public: static tbb::atomic counter; static std::once_flag counter_init_once; std::call_once(counter_init_once, []{ counter = 0; }); - + if(producer_ == core::frame_producer::empty() || !destroy_producers_in_separate_thread()) return; ++counter; CASPAR_VERIFY(counter < 8); - + auto producer = new spl::shared_ptr(std::move(producer_)); boost::thread([=] { @@ -256,7 +255,7 @@ public: CASPAR_LOG(debug) << str << L" Destroying on asynchronous destruction thread."; } catch(...){} - + try { pointer_guard.reset(); @@ -268,9 +267,9 @@ public: } --counter; - }).detach(); + }).detach(); } - + draw_frame receive() override {return producer_->receive();} std::wstring print() const override {return producer_->print();} void paused(bool value) override {producer_->paused(value);} @@ -283,7 +282,7 @@ public: void leading_producer(const spl::shared_ptr& producer) override {return producer_->leading_producer(producer);} uint32_t nb_frames() const override {return producer_->nb_frames();} draw_frame last_frame() {return producer_->last_frame();} - monitor::subject& monitor_output() override {return producer_->monitor_output();} + monitor::subject& monitor_output() override {return producer_->monitor_output();} bool collides(double x, double y) const override {return producer_->collides(x, y);} void on_interaction(const interaction_event::ptr& event) override {return producer_->on_interaction(event);} constraints& pixel_constraints() override {return producer_->pixel_constraints();} @@ -298,7 +297,7 @@ spl::shared_ptr do_create_producer(const frame_producer_de { if(params.empty()) CASPAR_THROW_EXCEPTION(invalid_argument() << msg_info("params cannot be empty")); - + auto producer = frame_producer::empty(); std::any_of(factories.begin(), factories.end(), [&](const producer_factory_t& factory) -> bool { @@ -325,7 +324,7 @@ spl::shared_ptr do_create_producer(const frame_producer_de if(producer == frame_producer::empty()) return producer; - + return producer; } @@ -356,38 +355,41 @@ draw_frame frame_producer_registry::create_thumbnail(const frame_producer_depend if (key_frame == draw_frame::empty()) key_frame = do_create_thumbnail_frame(dependencies, media_file + L"_ALPHA", thumbnail_producers); - + if (fill_frame != draw_frame::empty() && key_frame != draw_frame::empty()) return draw_frame::mask(fill_frame, key_frame); - + return fill_frame; } spl::shared_ptr frame_producer_registry::create_producer(const frame_producer_dependencies& dependencies, const std::vector& params) const -{ +{ auto& producer_factories = impl_->producer_factories; auto producer = do_create_producer(dependencies, params, producer_factories); auto key_producer = frame_producer::empty(); - - try // to find a key file. + + if (!params.empty() && !boost::contains(params.at(0), L"://")) { - auto params_copy = params; - if(params_copy.size() > 0) + try // to find a key file. { - params_copy[0] += L"_A"; - key_producer = do_create_producer(dependencies, params_copy, producer_factories); - if(key_producer == frame_producer::empty()) + auto params_copy = params; + if (params_copy.size() > 0) { - params_copy[0] += L"LPHA"; + params_copy[0] += L"_A"; key_producer = do_create_producer(dependencies, params_copy, producer_factories); + if (key_producer == frame_producer::empty()) + { + params_copy[0] += L"LPHA"; + key_producer = do_create_producer(dependencies, params_copy, producer_factories); + } } } + catch (...) {} } - catch(...){} if(producer != frame_producer::empty() && key_producer != frame_producer::empty()) return create_separated_producer(producer, key_producer); - + if(producer == frame_producer::empty()) { std::wstring str; @@ -408,5 +410,4 @@ spl::shared_ptr frame_producer_registry::create_producer(c std::copy(iterator(iss), iterator(), std::back_inserter(tokens)); return create_producer(dependencies, tokens); } - }}