transform_stack_.push_back(transform_stack_.back()*transform.image_transform);\r
}\r
\r
- void visit(const core::mutable_frame& frame)\r
+ void visit(const core::const_frame& frame)\r
{ \r
if(frame.pixel_format_desc().format == core::pixel_format::invalid)\r
return;\r
image_mixer::image_mixer() : impl_(new impl()){}\r
image_mixer::~image_mixer(){}\r
void image_mixer::push(const core::frame_transform& transform){impl_->push(transform);}\r
-void image_mixer::visit(const core::mutable_frame& frame){impl_->visit(frame);}\r
+void image_mixer::visit(const core::const_frame& frame){impl_->visit(frame);}\r
void image_mixer::pop(){impl_->pop();}\r
boost::unique_future<core::const_array> image_mixer::operator()(const core::video_format_desc& format_desc){return impl_->render(format_desc);}\r
void image_mixer::begin_layer(core::blend_mode blend_mode){impl_->begin_layer(blend_mode);}\r
virtual void end_layer();\r
\r
virtual void push(const core::frame_transform& frame);\r
- virtual void visit(const core::mutable_frame& frame);\r
+ virtual void visit(const core::const_frame& frame);\r
virtual void pop();\r
\r
virtual boost::unique_future<core::const_array> operator()(const core::video_format_desc& format_desc) override;\r
transform_stack_.push_back(transform_stack_.back()*transform.image_transform);\r
}\r
\r
- void visit(const core::mutable_frame& frame)\r
+ void visit(const core::const_frame& frame)\r
{ \r
if(frame.pixel_format_desc().format == core::pixel_format::invalid)\r
return;\r
image_mixer::image_mixer(const spl::shared_ptr<device>& ogl) : impl_(new impl(ogl)){}\r
image_mixer::~image_mixer(){}\r
void image_mixer::push(const core::frame_transform& transform){impl_->push(transform);}\r
-void image_mixer::visit(const core::mutable_frame& frame){impl_->visit(frame);}\r
+void image_mixer::visit(const core::const_frame& frame){impl_->visit(frame);}\r
void image_mixer::pop(){impl_->pop();}\r
boost::unique_future<core::const_array> image_mixer::operator()(const core::video_format_desc& format_desc){return impl_->render(format_desc);}\r
void image_mixer::begin_layer(core::blend_mode blend_mode){impl_->begin_layer(blend_mode);}\r
virtual void end_layer() override;\r
\r
virtual void push(const core::frame_transform& frame) override;\r
- virtual void visit(const core::mutable_frame& frame) override;\r
+ virtual void visit(const core::const_frame& frame) override;\r
virtual void pop() override;\r
\r
// Properties\r
return core::mutable_array(buf->data(), buf->size(), buf);\r
}\r
\r
- boost::unique_future<spl::shared_ptr<texture>> copy_async(const core::mutable_array& source, int width, int height, int stride)\r
+ boost::unique_future<spl::shared_ptr<texture>> copy_async(const core::const_array& source, int width, int height, int stride)\r
{\r
- auto buf = boost::any_cast<spl::shared_ptr<buffer>>(source.storage());\r
+ auto buf = source.storage<spl::shared_ptr<buffer>>();\r
\r
return render_executor_.begin_invoke([=]() -> spl::shared_ptr<texture>\r
{\r
device::~device(){} \r
spl::shared_ptr<texture> device::create_texture(int width, int height, int stride){return impl_->create_texture(width, height, stride);}\r
core::mutable_array device::create_array(int size){return impl_->create_array(size);}\r
-boost::unique_future<spl::shared_ptr<texture>> device::copy_async(const core::mutable_array& source, int width, int height, int stride){return impl_->copy_async(source, width, height, stride);}\r
+boost::unique_future<spl::shared_ptr<texture>> device::copy_async(const core::const_array& source, int width, int height, int stride){return impl_->copy_async(source, width, height, stride);}\r
boost::unique_future<core::const_array> device::copy_async(const spl::shared_ptr<texture>& source){return impl_->copy_async(source);}\r
std::wstring device::version(){return impl_->version();}\r
\r
spl::shared_ptr<texture> create_texture(int width, int height, int stride);\r
core::mutable_array create_array(int size);\r
\r
- boost::unique_future<spl::shared_ptr<texture>> copy_async(const core::mutable_array& source, int width, int height, int stride);\r
+ boost::unique_future<spl::shared_ptr<texture>> copy_async(const core::const_array& source, int width, int height, int stride);\r
boost::unique_future<core::const_array> copy_async(const spl::shared_ptr<texture>& source);\r
\r
template<typename Func>\r
\r
#include "array.h"\r
\r
+#include "../assert.h"\r
+\r
namespace caspar { namespace core {\r
\r
+mutable_array::mutable_array(mutable_array&& other)\r
+ : ptr_(other.ptr_)\r
+ , size_(other.size_)\r
+ , storage_(std::move(other.storage_))\r
+{\r
+ CASPAR_ASSERT(storage_);\r
+}\r
+ \r
+mutable_array& mutable_array::operator=(mutable_array&& other)\r
+{\r
+ ptr_ = other.ptr_;\r
+ size_ = other.size_;\r
+ storage_ = std::move(other.storage_);\r
+\r
+ CASPAR_ASSERT(storage_);\r
+\r
+ return *this;\r
+}\r
+ \r
+std::uint8_t* mutable_array::begin() {return ptr_;} \r
+std::uint8_t* mutable_array::data() {return ptr_;}\r
+std::uint8_t* mutable_array::end() {return ptr_ + size_;} \r
+const std::uint8_t* mutable_array::begin() const {return ptr_;} \r
+const std::uint8_t* mutable_array::data() const {return ptr_;}\r
+const std::uint8_t* mutable_array::end() const {return ptr_ + size_;}\r
+std::size_t mutable_array::size() const {return size_;}\r
+bool mutable_array::empty() const {return size() == 0;}\r
+\r
const_array::const_array(const const_array& other)\r
: ptr_(other.ptr_)\r
, size_(other.size_)\r
, storage_(other.storage_)\r
{\r
+ CASPAR_ASSERT(storage_);\r
}\r
\r
-const_array::const_array(const_array&& other)\r
+const_array::const_array(mutable_array&& other)\r
: ptr_(other.ptr_)\r
, size_(other.size_)\r
, storage_(std::move(other.storage_))\r
{\r
+ CASPAR_ASSERT(storage_);\r
}\r
\r
-const_array& const_array::operator=(const_array other)\r
+const_array& const_array::operator=(const const_array& other)\r
{\r
- other.swap(*this);\r
+ const_array(other).swap(*this);\r
return *this;\r
}\r
\r
std::size_t const_array::size() const {return size_;}\r
bool const_array::empty() const {return size() == 0;}\r
\r
-mutable_array::mutable_array(mutable_array&& other)\r
- : ptr_(other.ptr_)\r
- , size_(other.size_)\r
- , storage_(std::move(other.storage_))\r
-{\r
-}\r
- \r
-mutable_array& mutable_array::operator=(mutable_array&& other)\r
-{\r
- ptr_ = other.ptr_;\r
- size_ = other.size_;\r
- storage_ = std::move(other.storage_);\r
- return *this;\r
-}\r
- \r
-std::uint8_t* mutable_array::begin() {return ptr_;} \r
-std::uint8_t* mutable_array::data() {return ptr_;}\r
-std::uint8_t* mutable_array::end() {return ptr_ + size_;} \r
-const std::uint8_t* mutable_array::begin() const {return ptr_;} \r
-const std::uint8_t* mutable_array::data() const {return ptr_;}\r
-const std::uint8_t* mutable_array::end() const {return ptr_ + size_;}\r
-std::size_t mutable_array::size() const {return size_;}\r
-bool mutable_array::empty() const {return size() == 0;}\r
-const boost::any& mutable_array::storage() const {return *storage_;}\r
-\r
}}
\ No newline at end of file
FORWARD1(boost, template<typename> class shared_future);\r
\r
namespace caspar { namespace core {\r
-\r
-class const_array\r
+ \r
+class mutable_array\r
{\r
+ mutable_array(const mutable_array&);\r
+ mutable_array& operator=(const mutable_array&);\r
+\r
+ friend class const_array;\r
public:\r
\r
// Static Members\r
\r
// Constructors\r
-\r
+ \r
template<typename T>\r
- explicit const_array(const std::uint8_t* ptr, std::size_t size, T&& storage)\r
+ explicit mutable_array(std::uint8_t* ptr, std::size_t size, T&& storage)\r
: ptr_(ptr)\r
, size_(size)\r
, storage_(new boost::any(std::forward<T>(storage)))\r
{\r
}\r
- \r
- const_array(const const_array& other);\r
- const_array(const_array&& other);\r
+\r
+ mutable_array(mutable_array&& other);\r
\r
// Methods\r
\r
- const_array& operator=(const_array other);\r
- void swap(const_array& other);\r
+ mutable_array& operator=(mutable_array&& other);\r
\r
// Properties\r
- \r
+ \r
+ std::uint8_t* begin();\r
+ std::uint8_t* data();\r
+ std::uint8_t* end();\r
const std::uint8_t* begin() const;\r
const std::uint8_t* data() const;\r
const std::uint8_t* end() const;\r
std::size_t size() const;\r
bool empty() const;\r
- \r
+ \r
+ template<typename T>\r
+ T storage() const\r
+ {\r
+ return boost::any_cast<T>(*storage_);\r
+ }\r
private:\r
- const std::uint8_t* ptr_;\r
- std::size_t size_;\r
- spl::shared_ptr<boost::any> storage_;\r
+ std::uint8_t* ptr_;\r
+ std::size_t size_;\r
+ std::unique_ptr<boost::any> storage_;\r
};\r
\r
-class mutable_array\r
+class const_array\r
{\r
- mutable_array(const mutable_array&);\r
- mutable_array& operator=(const mutable_array&);\r
public:\r
\r
// Static Members\r
\r
// Constructors\r
- \r
+\r
template<typename T>\r
- explicit mutable_array(std::uint8_t* ptr, std::size_t size, T&& storage)\r
+ explicit const_array(const std::uint8_t* ptr, std::size_t size, T&& storage)\r
: ptr_(ptr)\r
, size_(size)\r
, storage_(new boost::any(std::forward<T>(storage)))\r
{\r
}\r
-\r
- mutable_array(mutable_array&& other);\r
+ \r
+ const_array(const const_array& other); \r
+ const_array(mutable_array&& other);\r
\r
// Methods\r
\r
- mutable_array& operator=(mutable_array&& other);\r
+ const_array& operator=(const const_array& other);\r
+ void swap(const_array& other);\r
\r
// Properties\r
- \r
- std::uint8_t* begin();\r
- std::uint8_t* data();\r
- std::uint8_t* end();\r
+ \r
const std::uint8_t* begin() const;\r
const std::uint8_t* data() const;\r
const std::uint8_t* end() const;\r
std::size_t size() const;\r
bool empty() const;\r
- const boost::any& storage() const;\r
+\r
+ template<typename T>\r
+ T storage() const\r
+ {\r
+ return boost::any_cast<T>(*storage_);\r
+ }\r
+\r
private:\r
- std::uint8_t* ptr_;\r
- std::size_t size_;\r
- spl::unique_ptr<boost::any> storage_;\r
+ const std::uint8_t* ptr_;\r
+ std::size_t size_;\r
+ std::shared_ptr<boost::any> storage_;\r
};\r
\r
}}
\ No newline at end of file
struct draw_frame::impl\r
{ \r
int tag_;\r
- std::shared_ptr<mutable_frame> frame_;\r
+ std::shared_ptr<const_frame> frame_;\r
std::vector<draw_frame> frames_;\r
core::frame_transform frame_transform_; \r
public: \r
{\r
}\r
\r
- impl(mutable_frame&& frame) \r
+ impl(const_frame&& frame) \r
: tag_(frame_tag)\r
- , frame_(new mutable_frame(std::move(frame)))\r
+ , frame_(new const_frame(std::move(frame)))\r
{\r
}\r
\r
+ impl(mutable_frame&& frame) \r
+ : tag_(frame_tag)\r
+ , frame_(new const_frame(std::move(frame)))\r
+ {\r
+ }\r
+\r
impl(std::vector<draw_frame> frames)\r
: tag_(frame_tag)\r
, frames_(std::move(frames))\r
draw_frame::draw_frame(int tag) : impl_(new impl(std::move(tag))){}\r
draw_frame::draw_frame(const draw_frame& other) : impl_(new impl(*other.impl_)){}\r
draw_frame::draw_frame(draw_frame&& other) : impl_(std::move(other.impl_)){}\r
+draw_frame::draw_frame(const_frame&& frame) : impl_(new impl(std::move(frame))){}\r
draw_frame::draw_frame(mutable_frame&& frame) : impl_(new impl(std::move(frame))){}\r
draw_frame::draw_frame(std::vector<draw_frame> frames) : impl_(new impl(frames)){}\r
draw_frame::~draw_frame(){}\r
draw_frame();\r
draw_frame(const draw_frame& other);\r
draw_frame(draw_frame&& other); \r
+ explicit draw_frame(class const_frame&& frame);\r
explicit draw_frame(class mutable_frame&& frame);\r
explicit draw_frame(std::vector<draw_frame> frames);\r
\r
\r
namespace caspar { namespace core {\r
\r
+struct mutable_frame::impl : boost::noncopyable\r
+{ \r
+ std::vector<mutable_array> buffers_;\r
+ core::audio_buffer audio_data_;\r
+ const core::pixel_format_desc desc_;\r
+ const void* tag_;\r
+ double frame_rate_;\r
+ core::field_mode field_mode_;\r
+ \r
+ impl(std::vector<mutable_array> buffers, audio_buffer audio_buffer, const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) \r
+ : buffers_(std::move(buffers))\r
+ , audio_data_(std::move(audio_buffer))\r
+ , desc_(desc)\r
+ , tag_(tag)\r
+ , frame_rate_(frame_rate)\r
+ , field_mode_(field_mode)\r
+ {\r
+ BOOST_FOREACH(auto& buffer, buffers_)\r
+ if(!buffer.data())\r
+ BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("mutable_frame: null argument"));\r
+ }\r
+};\r
+ \r
+mutable_frame::mutable_frame(std::vector<mutable_array> image_buffers, audio_buffer audio_buffer, const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) \r
+ : impl_(new impl(std::move(image_buffers), std::move(audio_buffer), tag, desc, frame_rate, field_mode)){}\r
+mutable_frame::~mutable_frame(){}\r
+mutable_frame::mutable_frame(mutable_frame&& other) : impl_(std::move(other.impl_)){}\r
+mutable_frame& mutable_frame::operator=(mutable_frame&& other)\r
+{\r
+ impl_ = std::move(other.impl_);\r
+ return *this;\r
+}\r
+void mutable_frame::swap(mutable_frame& other){impl_.swap(other.impl_);}\r
+const core::pixel_format_desc& mutable_frame::pixel_format_desc() const{return impl_->desc_;}\r
+const mutable_array& mutable_frame::image_data(std::size_t index) const{return impl_->buffers_.at(index);}\r
+const core::audio_buffer& mutable_frame::audio_data() const{return impl_->audio_data_;}\r
+mutable_array& mutable_frame::image_data(std::size_t index){return impl_->buffers_.at(index);}\r
+core::audio_buffer& mutable_frame::audio_data(){return impl_->audio_data_;}\r
+double mutable_frame::frame_rate() const{return impl_->frame_rate_;}\r
+core::field_mode mutable_frame::field_mode() const{return impl_->field_mode_;}\r
+std::size_t mutable_frame::width() const{return impl_->desc_.planes.at(0).width;}\r
+std::size_t mutable_frame::height() const{return impl_->desc_.planes.at(0).height;} \r
+const void* mutable_frame::tag() const{return impl_->tag_;} \r
+\r
+\r
const const_frame& const_frame::empty()\r
{\r
static int dummy;\r
\r
struct const_frame::impl : boost::noncopyable\r
{ \r
- mutable boost::shared_future<const_array> future_buffer_;\r
+ mutable std::vector<boost::shared_future<const_array>> future_buffers_;\r
int id_;\r
core::audio_buffer audio_data_;\r
const core::pixel_format_desc desc_;\r
}\r
\r
impl(boost::shared_future<const_array> image, audio_buffer audio_buffer, const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) \r
- : future_buffer_(std::move(image))\r
- , audio_data_(std::move(audio_buffer))\r
+ : audio_data_(std::move(audio_buffer))\r
, desc_(desc)\r
, tag_(tag)\r
, id_(reinterpret_cast<int>(this))\r
{\r
if(desc.format != core::pixel_format::bgra)\r
BOOST_THROW_EXCEPTION(not_implemented());\r
+ \r
+ future_buffers_.push_back(std::move(image));\r
}\r
\r
- const_array image_data() const\r
+ impl(mutable_frame&& other)\r
+ : audio_data_(other.audio_data())\r
+ , desc_(other.pixel_format_desc())\r
+ , tag_(other.tag())\r
+ , id_(reinterpret_cast<int>(this))\r
+ , frame_rate_(other.frame_rate())\r
+ , field_mode_(other.field_mode())\r
{\r
- return tag_ != empty().tag() ? future_buffer_.get() : const_array(nullptr, 0, 0);\r
+ for(std::size_t n = 0; n < desc_.planes.size(); ++n)\r
+ {\r
+ boost::promise<const_array> p;\r
+ p.set_value(std::move(other.image_data(n)));\r
+ future_buffers_.push_back(p.get_future());\r
+ }\r
+ }\r
+\r
+ const_array image_data(int index) const\r
+ {\r
+ return tag_ != empty().tag() ? future_buffers_.at(index).get() : const_array(nullptr, 0, 0);\r
}\r
\r
std::size_t width() const\r
const_frame::const_frame(const void* tag) : impl_(new impl(tag)){}\r
const_frame::const_frame(boost::shared_future<const_array> image, audio_buffer audio_buffer, const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) \r
: impl_(new impl(std::move(image), std::move(audio_buffer), tag, desc, frame_rate, field_mode)){}\r
+const_frame::const_frame(mutable_frame&& other) : impl_(new impl(std::move(other))){}\r
const_frame::~const_frame(){}\r
const_frame::const_frame(const_frame&& other) : impl_(std::move(other.impl_)){}\r
const_frame& const_frame::operator=(const_frame&& other)\r
bool const_frame::operator==(const const_frame& other){return *impl_ == *other.impl_;}\r
bool const_frame::operator!=(const const_frame& other){return !(*this == other);}\r
const core::pixel_format_desc& const_frame::pixel_format_desc()const{return impl_->desc_;}\r
-const_array const_frame::image_data()const{return impl_->image_data();}\r
+const_array const_frame::image_data(int index)const{return impl_->image_data(index);}\r
const core::audio_buffer& const_frame::audio_data()const{return impl_->audio_data_;}\r
double const_frame::frame_rate()const{return impl_->frame_rate_;}\r
core::field_mode const_frame::field_mode()const{return impl_->field_mode_;}\r
std::size_t const_frame::size()const{return impl_->size();} \r
const void* const_frame::tag()const{return impl_->tag_;} \r
\r
-struct mutable_frame::impl : boost::noncopyable\r
-{ \r
- std::vector<mutable_array> buffers_;\r
- core::audio_buffer audio_data_;\r
- const core::pixel_format_desc desc_;\r
- const void* tag_;\r
- double frame_rate_;\r
- core::field_mode field_mode_;\r
- \r
- impl(std::vector<mutable_array> buffers, audio_buffer audio_buffer, const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) \r
- : buffers_(std::move(buffers))\r
- , audio_data_(std::move(audio_buffer))\r
- , desc_(desc)\r
- , tag_(tag)\r
- , frame_rate_(frame_rate)\r
- , field_mode_(field_mode)\r
- {\r
- BOOST_FOREACH(auto& buffer, buffers_)\r
- if(!buffer.data())\r
- BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("mutable_frame: null argument"));\r
- }\r
-};\r
- \r
-mutable_frame::mutable_frame(std::vector<mutable_array> image_buffers, audio_buffer audio_buffer, const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) \r
- : impl_(new impl(std::move(image_buffers), std::move(audio_buffer), tag, desc, frame_rate, field_mode)){}\r
-mutable_frame::~mutable_frame(){}\r
-mutable_frame::mutable_frame(mutable_frame&& other) : impl_(std::move(other.impl_)){}\r
-mutable_frame& mutable_frame::operator=(mutable_frame&& other)\r
-{\r
- impl_ = std::move(other.impl_);\r
- return *this;\r
-}\r
-void mutable_frame::swap(mutable_frame& other){impl_.swap(other.impl_);}\r
-const core::pixel_format_desc& mutable_frame::pixel_format_desc() const{return impl_->desc_;}\r
-const mutable_array& mutable_frame::image_data(std::size_t index) const{return impl_->buffers_.at(index);}\r
-const core::audio_buffer& mutable_frame::audio_data() const{return impl_->audio_data_;}\r
-mutable_array& mutable_frame::image_data(std::size_t index){return impl_->buffers_.at(index);}\r
-core::audio_buffer& mutable_frame::audio_data(){return impl_->audio_data_;}\r
-double mutable_frame::frame_rate() const{return impl_->frame_rate_;}\r
-core::field_mode mutable_frame::field_mode() const{return impl_->field_mode_;}\r
-std::size_t mutable_frame::width() const{return impl_->desc_.planes.at(0).width;}\r
-std::size_t mutable_frame::height() const{return impl_->desc_.planes.at(0).height;} \r
-const void* mutable_frame::tag() const{return impl_->tag_;} \r
-\r
}}
\ No newline at end of file
\r
typedef std::vector<int32_t, tbb::cache_aligned_allocator<int32_t>> audio_buffer;\r
\r
-class const_frame sealed\r
+class mutable_frame sealed\r
{\r
+ mutable_frame(const mutable_frame&);\r
+ mutable_frame& operator=(const mutable_frame&);\r
public: \r
\r
// Static Members\r
\r
- static const const_frame& empty();\r
-\r
// Constructors\r
\r
- explicit const_frame(const void* tag = nullptr);\r
- explicit const_frame(boost::shared_future<const_array> image, \r
+ explicit mutable_frame(std::vector<mutable_array> image_buffers, \r
audio_buffer audio_buffer, \r
const void* tag, \r
const struct pixel_format_desc& desc, \r
double frame_rate, \r
core::field_mode field_mode);\r
- ~const_frame();\r
+ ~mutable_frame();\r
\r
// Methods\r
\r
- const_frame(const_frame&& other);\r
- const_frame& operator=(const_frame&& other);\r
- const_frame(const const_frame&);\r
- const_frame& operator=(const const_frame& other);\r
- \r
+ mutable_frame(mutable_frame&& other);\r
+ mutable_frame& operator=(mutable_frame&& other);\r
+\r
+ void swap(mutable_frame& other);\r
+ \r
// Properties\r
\r
const struct pixel_format_desc& pixel_format_desc() const;\r
\r
- const_array image_data() const;\r
+ const mutable_array& image_data(std::size_t index = 0) const;\r
const core::audio_buffer& audio_data() const;\r
- \r
+\r
+ mutable_array& image_data(std::size_t index = 0);\r
+ core::audio_buffer& audio_data();\r
+ \r
double frame_rate() const;\r
core::field_mode field_mode() const;\r
\r
std::size_t width() const;\r
std::size_t height() const;\r
- std::size_t size() const;\r
\r
const void* tag() const;\r
-\r
- bool operator==(const const_frame& other);\r
- bool operator!=(const const_frame& other);\r
\r
private:\r
struct impl;\r
- spl::shared_ptr<impl> impl_;\r
+ spl::unique_ptr<impl> impl_;\r
};\r
\r
-class mutable_frame sealed\r
+class const_frame sealed\r
{\r
- mutable_frame(const mutable_frame&);\r
- mutable_frame& operator=(const mutable_frame&);\r
public: \r
\r
// Static Members\r
\r
+ static const const_frame& empty();\r
+\r
// Constructors\r
\r
- explicit mutable_frame(std::vector<mutable_array> image_buffers, \r
+ explicit const_frame(const void* tag = nullptr);\r
+ explicit const_frame(boost::shared_future<const_array> image, \r
audio_buffer audio_buffer, \r
const void* tag, \r
const struct pixel_format_desc& desc, \r
double frame_rate, \r
core::field_mode field_mode);\r
- ~mutable_frame();\r
+ const_frame(mutable_frame&& other);\r
+ ~const_frame();\r
\r
// Methods\r
\r
- mutable_frame(mutable_frame&& other);\r
- mutable_frame& operator=(mutable_frame&& other);\r
-\r
- void swap(mutable_frame& other);\r
- \r
+ const_frame(const_frame&& other);\r
+ const_frame& operator=(const_frame&& other);\r
+ const_frame(const const_frame&);\r
+ const_frame& operator=(const const_frame& other);\r
+ \r
// Properties\r
\r
const struct pixel_format_desc& pixel_format_desc() const;\r
\r
- const mutable_array& image_data(std::size_t index = 0) const;\r
+ const_array image_data(int index = 0) const;\r
const core::audio_buffer& audio_data() const;\r
-\r
- mutable_array& image_data(std::size_t index = 0);\r
- core::audio_buffer& audio_data();\r
- \r
+ \r
double frame_rate() const;\r
core::field_mode field_mode() const;\r
\r
std::size_t width() const;\r
std::size_t height() const;\r
+ std::size_t size() const;\r
\r
const void* tag() const;\r
+\r
+ bool operator==(const const_frame& other);\r
+ bool operator!=(const const_frame& other);\r
\r
private:\r
struct impl;\r
- spl::unique_ptr<impl> impl_;\r
+ spl::shared_ptr<impl> impl_;\r
};\r
+\r
}}
\ No newline at end of file
// Methods\r
\r
virtual void push(const struct frame_transform& transform) = 0;\r
- virtual void visit(const class mutable_frame& frame) = 0;\r
+ virtual void visit(const class const_frame& frame) = 0;\r
virtual void pop() = 0;\r
\r
// Properties\r
transform_stack_.push(transform_stack_.top()*transform.audio_transform);\r
}\r
\r
- void visit(const mutable_frame& frame)\r
+ void visit(const const_frame& frame)\r
{\r
audio_item item;\r
item.tag = frame.tag();\r
\r
audio_mixer::audio_mixer() : impl_(new impl()){}\r
void audio_mixer::push(const frame_transform& transform){impl_->push(transform);}\r
-void audio_mixer::visit(const mutable_frame& frame){impl_->visit(frame);}\r
+void audio_mixer::visit(const const_frame& frame){impl_->visit(frame);}\r
void audio_mixer::pop(){impl_->pop();}\r
audio_buffer audio_mixer::operator()(const video_format_desc& format_desc){return impl_->mix(format_desc);}\r
\r
// frame_visitor\r
\r
virtual void push(const struct frame_transform& transform);\r
- virtual void visit(const class mutable_frame& frame);\r
+ virtual void visit(const class const_frame& frame);\r
virtual void pop();\r
\r
// Properties\r
// Methods\r
\r
virtual void push(const struct frame_transform& frame) = 0;\r
- virtual void visit(const class mutable_frame& frame) = 0;\r
+ virtual void visit(const class const_frame& frame) = 0;\r
virtual void pop() = 0;\r
\r
virtual void begin_layer(blend_mode blend_mode) = 0;\r