]> git.sesse.net Git - casparcg/blob - core/channel.cpp
289f06a64b850fce73a1ff3b63a1d6e8db6f1f97
[casparcg] / core / channel.cpp
1 #include "StdAfx.h"\r
2 \r
3 #include "channel.h"\r
4 \r
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
9 \r
10 #include <common/concurrency/executor.h>\r
11 \r
12 #include <boost/range/algorithm_ext/erase.hpp>\r
13 \r
14 #include <tbb/parallel_for.h>\r
15 \r
16 #include <memory>\r
17 \r
18 #ifdef _MSC_VER\r
19 #pragma warning(disable : 4355)\r
20 #endif\r
21 \r
22 namespace caspar { namespace core {\r
23 \r
24 struct channel::implementation : boost::noncopyable\r
25 {                                       \r
26         const int index_;\r
27         video_format_desc format_desc_;\r
28         \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
32 \r
33         boost::signals2::scoped_connection mixer_connection_;\r
34         boost::signals2::scoped_connection producer_connection_;\r
35 \r
36 public:\r
37         implementation(int index, const video_format_desc& format_desc)  \r
38                 : index_(index)\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
45         {}\r
46                 \r
47         std::wstring print() const\r
48         {\r
49                 return L"channel[" + boost::lexical_cast<std::wstring>(index_+1) + L"-" +  format_desc_.name + L"]";\r
50         }\r
51 \r
52         void set_video_format_desc(const video_format_desc& format_desc)\r
53         {\r
54                 format_desc_ = format_desc;\r
55                 producer_connection_.disconnect();\r
56                 mixer_connection_.disconnect();\r
57 \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
61 \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
64         }\r
65 };\r
66 \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
75 \r
76 }}