safe_ptr<core::frame_producer> do_create_producer(const safe_ptr<frame_factory>& my_frame_factory, const core::parameters& params, const std::vector<const producer_factory_t>& factories, bool throw_on_fail = false) { if(params.empty()) BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("params") << arg_value_info("")); auto producer = frame_producer::empty(); std::any_of(factories.begin(), factories.end(), [&](const producer_factory_t& factory) -> bool { try { producer = factory(my_frame_factory, params); } catch(...) { if (throw_on_fail) throw; else CASPAR_LOG_CURRENT_EXCEPTION(); } return producer != frame_producer::empty(); }); if(producer == frame_producer::empty()) producer = create_color_producer(my_frame_factory, params); return producer; }
safe_ptr<core::frame_consumer> create_consumer(const core::parameters& params) { if(params.empty()) BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("params") << arg_value_info("")); auto consumer = frame_consumer::empty(); std::any_of(g_factories.begin(), g_factories.end(), [&](const consumer_factory_t& factory) -> bool { try { consumer = factory(params); } catch(...) { CASPAR_LOG_CURRENT_EXCEPTION(); } return consumer != frame_consumer::empty(); }); if(consumer == frame_consumer::empty()) BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No match found for supplied commands. Check syntax.")); return consumer; }