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