1 #include "../StdAfx.h"
\r
3 #include "frame_producer.h"
\r
4 #include "color/color_producer.h"
\r
6 #include <common/memory/safe_ptr.h>
\r
8 #include <tbb/spin_rw_mutex.h>
\r
10 namespace caspar { namespace core {
\r
12 std::vector<const producer_factory_t> p_factories;
\r
13 tbb::spin_rw_mutex p_factories_mutex;
\r
15 safe_ptr<basic_frame> receive_and_follow(safe_ptr<frame_producer>& producer)
\r
17 if(producer == frame_producer::empty())
\r
18 return basic_frame::eof();
\r
20 auto frame = basic_frame::eof();
\r
23 frame = producer->receive();
\r
29 // Producer will be removed since frame == basic_frame::eof.
\r
30 CASPAR_LOG_CURRENT_EXCEPTION();
\r
31 CASPAR_LOG(warning) << producer->print() << " Failed to receive frame. Removing producer.";
\r
36 if(frame == basic_frame::eof())
\r
38 auto following = producer->get_following_producer();
\r
39 following->set_leading_producer(producer);
\r
40 producer = std::move(following);
\r
42 return receive_and_follow(producer);
\r
47 std::wostream& operator<<(std::wostream& out, const frame_producer& producer)
\r
49 out << producer.print().c_str();
\r
53 std::wostream& operator<<(std::wostream& out, const safe_ptr<const frame_producer>& producer)
\r
55 out << producer->print().c_str();
\r
59 void register_producer_factory(const producer_factory_t& factory)
\r
61 tbb::spin_rw_mutex::scoped_lock(p_factories_mutex, true);
\r
62 p_factories.push_back(factory);
\r
65 safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>& my_frame_factory, const std::vector<std::wstring>& params)
\r
68 BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("params") << arg_value_info(""));
\r
70 tbb::spin_rw_mutex::scoped_lock(p_factories_mutex, false);
\r
71 auto producer = frame_producer::empty();
\r
72 std::any_of(p_factories.begin(), p_factories.end(), [&](const producer_factory_t& factory) -> bool
\r
76 producer = factory(my_frame_factory, params);
\r
80 CASPAR_LOG_CURRENT_EXCEPTION();
\r
82 return producer != frame_producer::empty();
\r
85 if(producer == frame_producer::empty())
\r
86 producer = create_color_producer(my_frame_factory, params);
\r
88 if(producer == frame_producer::empty())
\r
89 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No match found for supplied commands. Check syntax."));
\r