1 #include "../../StdAfx.h"
\r
3 #include "write_frame.h"
\r
5 #include "draw_frame.h"
\r
6 #include "pixel_format.h"
\r
8 #include "../image/image_mixer.h"
\r
9 #include "../audio/audio_mixer.h"
\r
11 #include "../gpu/host_buffer.h"
\r
13 #include <common/gl/gl_check.h>
\r
15 #include <boost/range/algorithm.hpp>
\r
17 namespace caspar { namespace core {
\r
19 struct write_frame::implementation : boost::noncopyable
\r
22 std::vector<safe_ptr<host_buffer>> buffers_;
\r
23 std::vector<short> audio_data_;
\r
24 const pixel_format_desc desc_;
\r
27 implementation(write_frame& self, const pixel_format_desc& desc, std::vector<safe_ptr<host_buffer>> buffers)
\r
30 , buffers_(buffers){}
\r
32 void process_image(image_mixer& mixer)
\r
34 mixer.begin(self_.get_image_transform());
\r
35 mixer.process(desc_, buffers_);
\r
39 void process_audio(audio_mixer& mixer)
\r
41 mixer.begin(self_.get_audio_transform());
\r
42 mixer.process(audio_data_);
\r
46 boost::iterator_range<unsigned char*> image_data(size_t index)
\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
53 const boost::iterator_range<const unsigned char*> image_data(size_t index) const
\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
63 #pragma warning(disable : 4355) // 'this' : used in base member initializer list
\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
71 write_frame temp(std::move(other));
\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