]> git.sesse.net Git - casparcg/commitdiff
2.1.0: Use const_ types consistently when no modification is expected, instead of...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 18 Feb 2012 14:06:39 +0000 (14:06 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 18 Feb 2012 14:06:39 +0000 (14:06 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@2446 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

16 files changed:
accelerator/cpu/image/image_mixer.cpp
accelerator/cpu/image/image_mixer.h
accelerator/ogl/image/image_mixer.cpp
accelerator/ogl/image/image_mixer.h
accelerator/ogl/util/device.cpp
accelerator/ogl/util/device.h
common/memory/array.cpp
common/memory/array.h
core/frame/draw_frame.cpp
core/frame/draw_frame.h
core/frame/frame.cpp
core/frame/frame.h
core/frame/frame_visitor.h
core/mixer/audio/audio_mixer.cpp
core/mixer/audio/audio_mixer.h
core/mixer/image/image_mixer.h

index 71f24e5eba7653ed1619f066e32f35cf086ec657..34c5727d1a28589a876f4090b2884042cfd358e8 100644 (file)
@@ -315,7 +315,7 @@ public:
                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
@@ -367,7 +367,7 @@ public:
 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
index e62c6a9092519bd37ea2aeec8a049b9ac0da302c..f09cc3cef919091d8ed07fdd2678fbd30bb0b1eb 100644 (file)
@@ -39,7 +39,7 @@ public:
        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
index 01060f8cabfef06eddda70680885ab0a6129fe05..7084d0a0832ff72ddd091bab9a50f85c925e934a 100644 (file)
@@ -298,7 +298,7 @@ public:
                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
@@ -346,7 +346,7 @@ public:
 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
index 949a3f34b83f024f943f7085ad2e1f01253775be..d53a62668b78cf450e882633dd3dd037fbba1b43 100644 (file)
@@ -63,7 +63,7 @@ public:
        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
index dccde2e5785c9eacdbcf7169d55bfdee655bbfcd..d4e22a5c6d7592dc555e21bdc35ebc2568705465 100644 (file)
@@ -214,9 +214,9 @@ struct device::impl : public std::enable_shared_from_this<impl>
                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
@@ -261,7 +261,7 @@ device::device()
 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
index 3cacf6b0d9f13e2c8622d771eaf43a1794a6c638..f7e41d3be9c26f80c3fdc570f57898b7b207d58e 100644 (file)
@@ -50,7 +50,7 @@ public:
        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
index 9bdd20531775898353e9efa04100457e8666ba0b..5540098c880e525fc4dc9fa942eafd5f1290c387 100644 (file)
 \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
@@ -58,29 +90,4 @@ const std::uint8_t* const_array::end() const {return ptr_ + size_;}
 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
index a2067207413a0508a83de07db09c85bb2da72de6..22aeb3d18839dfd7dd88382631d8ad108725c224 100644 (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
index 562024911535fa871bf522eb997a212be31bf6ce..d18cdc0a0524c5c19f734b01c75e6b7b0a3a960d 100644 (file)
@@ -34,7 +34,7 @@ namespace caspar { namespace core {
 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
@@ -51,12 +51,18 @@ public:
        {\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
@@ -99,6 +105,7 @@ draw_frame::draw_frame() : impl_(new impl()){}
 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
index f0855e9c5b09028596239ac16028ff0fe3daab09..e4f62429c3e140a29e9083176061f121cdc8234e 100644 (file)
@@ -53,6 +53,7 @@ public:
        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
index 9c3f0384bf401c9777b871b6a9e9fc13da986039..3ab7b8c939b5441673e4543e62a1f86e46203128 100644 (file)
 \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
@@ -43,7 +88,7 @@ const const_frame& const_frame::empty()
 \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
@@ -60,8 +105,7 @@ struct const_frame::impl : boost::noncopyable
        }\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
@@ -70,11 +114,29 @@ struct const_frame::impl : boost::noncopyable
        {\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
@@ -101,6 +163,7 @@ struct const_frame::impl : boost::noncopyable
 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
@@ -117,7 +180,7 @@ const_frame& const_frame::operator=(const const_frame& other)
 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
@@ -126,48 +189,4 @@ std::size_t const_frame::height()const{return impl_->height();}
 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
index 0ec210934f915fea858556923ef84e6caf3d32f0..ef497f1237455d1521797550ac71e8e8ea3f0c73 100644 (file)
@@ -22,101 +22,103 @@ class mutable_array;
 \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
index ec0971f558067db120ee54de9d18428f9f64b37f..c952a23870cd70df263298e2e9f169bf599fdfbd 100644 (file)
@@ -38,7 +38,7 @@ public:
        // 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
index 66df1c444b95e0c3262a0a0ef5f0ccb4b6cf11e7..95c979fa8e9ae7c98f6f939c7bc9907436430487 100644 (file)
@@ -81,7 +81,7 @@ public:
                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
@@ -193,7 +193,7 @@ public:
 \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
index 2545965327eec6bb0a725a9999a1d991e81e4ff9..c90e77147ef07a685f7577a7cc76778733b5dbb8 100644 (file)
@@ -55,7 +55,7 @@ public:
        // 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
index 75eff17a40b84d6f5bf410fdcccef3273cbef4bd..9f4c3658af0b7cf3ec079bed33c630b1d5d57b93 100644 (file)
@@ -58,7 +58,7 @@ public:
        // 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