]> git.sesse.net Git - casparcg/blob - core/producer/frame_producer.cpp
2.0.0.2: frame_producer - Added color producer.
[casparcg] / core / producer / frame_producer.cpp
1 #include "../StdAfx.h"\r
2 \r
3 #include "frame_producer.h"\r
4 #include "color/color_producer.h"\r
5 \r
6 #include <common/memory/safe_ptr.h>\r
7 \r
8 #include <tbb/spin_rw_mutex.h>\r
9 \r
10 namespace caspar { namespace core {\r
11         \r
12 std::vector<const producer_factory_t> p_factories;\r
13 tbb::spin_rw_mutex p_factories_mutex;\r
14 \r
15 void register_producer_factory(const producer_factory_t& factory)\r
16 {\r
17         tbb::spin_rw_mutex::scoped_lock(p_factories_mutex, true);\r
18         p_factories.push_back(factory);\r
19 }\r
20 \r
21 safe_ptr<core::frame_producer> create_producer(const std::vector<std::wstring>& params)\r
22 {\r
23         if(params.empty())\r
24                 BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("params") << arg_value_info(""));\r
25         \r
26         tbb::spin_rw_mutex::scoped_lock(p_factories_mutex, false);\r
27         auto producer = frame_producer::empty();\r
28         std::any_of(p_factories.begin(), p_factories.end(), [&](const producer_factory_t& factory) -> bool\r
29                 {\r
30                         try\r
31                         {\r
32                                 producer = factory(params);\r
33                         }\r
34                         catch(...)\r
35                         {\r
36                                 CASPAR_LOG_CURRENT_EXCEPTION();\r
37                         }\r
38                         return producer != frame_producer::empty();\r
39                 });\r
40 \r
41         if(producer == frame_producer::empty())\r
42                 producer = create_color_producer(params);\r
43 \r
44         if(producer == frame_producer::empty())\r
45                 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No match found for supplied commands. Check syntax."));\r
46 \r
47         return producer;\r
48 }\r
49 \r
50 }}