]> git.sesse.net Git - casparcg/blob - core/mixer/frame/write_frame.cpp
2.0.0.2: clip-rect and fix-rect works now properly with transitions.
[casparcg] / core / mixer / frame / write_frame.cpp
1 #include "../../StdAfx.h"\r
2 \r
3 #include "write_frame.h"\r
4 \r
5 #include "draw_frame.h"\r
6 #include "pixel_format.h"\r
7 \r
8 #include "../image/image_mixer.h"\r
9 #include "../audio/audio_mixer.h"\r
10 \r
11 #include "../gpu/host_buffer.h"\r
12 \r
13 #include <common/gl/gl_check.h>\r
14 \r
15 #include <boost/range/algorithm.hpp>\r
16 \r
17 namespace caspar { namespace core {\r
18                                                                                                                                                                                                                                                                                                                         \r
19 struct write_frame::implementation : boost::noncopyable\r
20 {                               \r
21         write_frame& self_;\r
22         std::vector<safe_ptr<host_buffer>> buffers_;\r
23         std::vector<short> audio_data_;\r
24         const pixel_format_desc desc_;\r
25 \r
26 public:\r
27         implementation(write_frame& self, const pixel_format_desc& desc, std::vector<safe_ptr<host_buffer>> buffers) \r
28                 : self_(self)\r
29                 , desc_(desc)\r
30                 , buffers_(buffers){}\r
31         \r
32         void process_image(image_mixer& mixer)\r
33         {\r
34                 mixer.begin(self_.get_image_transform());\r
35                 mixer.process(desc_, buffers_);\r
36                 mixer.end();\r
37         }\r
38 \r
39         void process_audio(audio_mixer& mixer)\r
40         {\r
41                 mixer.begin(self_.get_audio_transform());\r
42                 mixer.process(audio_data_);\r
43                 mixer.end();\r
44         }\r
45 \r
46         boost::iterator_range<unsigned char*> image_data(size_t index)\r
47         {\r
48                 if(index >= buffers_.size() || !buffers_[index]->data())\r
49                         return boost::iterator_range<const unsigned char*>();\r
50                 auto ptr = static_cast<unsigned char*>(buffers_[index]->data());\r
51                 return boost::iterator_range<unsigned char*>(ptr, ptr+buffers_[index]->size());\r
52         }\r
53         const boost::iterator_range<const unsigned char*> image_data(size_t index) const\r
54         {\r
55                 if(index >= buffers_.size() || !buffers_[index]->data())\r
56                         return boost::iterator_range<const unsigned char*>();\r
57                 auto ptr = static_cast<const unsigned char*>(buffers_[index]->data());\r
58                 return boost::iterator_range<const unsigned char*>(ptr, ptr+buffers_[index]->size());\r
59         }\r
60 };\r
61 \r
62 #ifdef _MSC_VER\r
63 #pragma warning(disable : 4355) // 'this' : used in base member initializer list\r
64 #endif\r
65         \r
66 write_frame::write_frame(const pixel_format_desc& desc, std::vector<safe_ptr<host_buffer>> buffers) : impl_(new implementation(*this, desc, buffers)){}\r
67 write_frame::write_frame(write_frame&& other) : impl_(std::move(other.impl_)){}\r
68 void write_frame::swap(write_frame& other){impl_.swap(other.impl_);}\r
69 write_frame& write_frame::operator=(write_frame&& other)\r
70 {\r
71         write_frame temp(std::move(other));\r
72         temp.swap(*this);\r
73         return *this;\r
74 }\r
75 void write_frame::process_image(image_mixer& mixer){impl_->process_image(mixer);}\r
76 void write_frame::process_audio(audio_mixer& mixer){impl_->process_audio(mixer);}\r
77 boost::iterator_range<unsigned char*> write_frame::image_data(size_t index){return impl_->image_data(index);}\r
78 std::vector<short>& write_frame::audio_data() { return impl_->audio_data_; }\r
79 }}