5 #include "consumer/frame_consumer_device.h"
\r
6 #include "mixer/frame_mixer_device.h"
\r
7 #include "producer/frame_producer_device.h"
\r
8 #include "producer/layer.h"
\r
10 #include <common/concurrency/executor.h>
\r
12 #include <boost/range/algorithm_ext/erase.hpp>
\r
14 #include <tbb/parallel_for.h>
\r
19 #pragma warning(disable : 4355)
\r
22 namespace caspar { namespace core {
\r
24 struct channel::implementation : boost::noncopyable
\r
27 video_format_desc format_desc_;
\r
29 std::shared_ptr<frame_mixer_device> mixer_;
\r
30 std::shared_ptr<frame_consumer_device> consumer_;
\r
31 std::shared_ptr<frame_producer_device> producer_;
\r
33 boost::signals2::scoped_connection mixer_connection_;
\r
34 boost::signals2::scoped_connection producer_connection_;
\r
37 implementation(int index, const video_format_desc& format_desc)
\r
39 , format_desc_(format_desc)
\r
40 , consumer_(new frame_consumer_device(format_desc))
\r
41 , mixer_(new frame_mixer_device(format_desc))
\r
42 , producer_(new frame_producer_device(safe_ptr<frame_factory>(mixer_)))
\r
43 , mixer_connection_(mixer_->connect([=](const safe_ptr<const read_frame>& frame){consumer_->send(frame);}))
\r
44 , producer_connection_(producer_->connect([=](const std::vector<safe_ptr<basic_frame>>& frames){mixer_->send(frames);}))
\r
47 std::wstring print() const
\r
49 return L"channel[" + boost::lexical_cast<std::wstring>(index_+1) + L"-" + format_desc_.name + L"]";
\r
52 void set_video_format_desc(const video_format_desc& format_desc)
\r
54 format_desc_ = format_desc;
\r
55 producer_connection_.disconnect();
\r
56 mixer_connection_.disconnect();
\r
58 consumer_->set_video_format_desc(format_desc_);
\r
59 mixer_.reset(new frame_mixer_device(format_desc_));
\r
60 producer_.reset(new frame_producer_device(safe_ptr<frame_factory>(mixer_)));
\r
62 mixer_connection_ = mixer_->connect([=](const safe_ptr<const read_frame>& frame){consumer_->send(frame);});
\r
63 producer_connection_ = producer_->connect([=](const std::vector<safe_ptr<basic_frame>>& frames){mixer_->send(frames);});
\r
67 channel::channel(int index, const video_format_desc& format_desc) : impl_(new implementation(index, format_desc)){}
\r
68 channel::channel(channel&& other) : impl_(std::move(other.impl_)){}
\r
69 frame_producer_device& channel::producer() { return *impl_->producer_;}
\r
70 frame_mixer_device& channel::mixer() { return *impl_->mixer_;}
\r
71 frame_consumer_device& channel::consumer() { return *impl_->consumer_;}
\r
72 const video_format_desc& channel::get_video_format_desc() const{return impl_->format_desc_;}
\r
73 void channel::set_video_format_desc(const video_format_desc& format_desc){impl_->set_video_format_desc(format_desc);}
\r
74 std::wstring channel::print() const { return impl_->print();}
\r