]> git.sesse.net Git - casparcg/commitdiff
2.1.0: -frame_transform: Split frame_transform into image and audio-transforms.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 13 Feb 2012 10:01:05 +0000 (10:01 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 13 Feb 2012 10:01:05 +0000 (10:01 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@2386 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

15 files changed:
accelerator/cpu/image/image_mixer.cpp
accelerator/cpu/util/write_frame.cpp
accelerator/ogl/image/image_kernel.h
accelerator/ogl/image/image_mixer.cpp
accelerator/ogl/util/write_frame.cpp
core/frame/draw_frame.cpp
core/frame/draw_frame.h
core/frame/frame_transform.cpp
core/frame/frame_transform.h
core/mixer/audio/audio_mixer.cpp
core/producer/stage.cpp
core/producer/transition/transition_producer.cpp
modules/ffmpeg/producer/util/util.cpp
modules/image/producer/image_scroll_producer.cpp
protocol/amcp/AMCPCommandsImpl.cpp

index a4080ffd358607e0e08972047ad16bc315d1a127..5142b0b89af424e976aabfa04df9919159bc2a9e 100644 (file)
@@ -75,7 +75,7 @@ struct item
 {\r
        core::pixel_format_desc                                         pix_desc;\r
        std::vector<spl::shared_ptr<host_buffer>>       buffers;\r
-       core::frame_transform                                           transform;\r
+       core::image_transform                                           transform;\r
 \r
        item()\r
                : pix_desc(core::pixel_format::invalid)\r
@@ -294,7 +294,7 @@ private:
 struct image_mixer::impl : boost::noncopyable\r
 {      \r
        image_renderer                                          renderer_;\r
-       std::vector<core::frame_transform>      transform_stack_;\r
+       std::vector<core::image_transform>      transform_stack_;\r
        std::vector<item>                                       items_; // layer/stream/items\r
 public:\r
        impl() \r
@@ -309,7 +309,7 @@ public:
                \r
        void push(const core::frame_transform& transform)\r
        {\r
-               transform_stack_.push_back(transform_stack_.back()*transform);\r
+               transform_stack_.push_back(transform_stack_.back()*transform.image_transform);\r
        }\r
                \r
        void visit(const core::data_frame& frame2)\r
@@ -331,7 +331,6 @@ public:
                item.pix_desc                   = frame->get_pixel_format_desc();\r
                item.buffers                    = frame->get_buffers();                         \r
                item.transform                  = transform_stack_.back();\r
-               item.transform.volume   = core::frame_transform().volume; // Set volume to default since we don't care about it here.\r
 \r
                items_.push_back(item);\r
        }\r
index 39456f26d57a673b7405436c9ac978eb9f1c6599..80f4b3b00dcb2e1d3c43acf458b21878679c5839 100644 (file)
@@ -56,7 +56,7 @@ struct write_frame::impl : boost::noncopyable
                        \r
        void accept(const write_frame& self, core::frame_visitor& visitor) const\r
        {\r
-               visitor.push(self.get_frame_transform());\r
+               visitor.push(self.frame_transform());\r
                visitor.visit(self);\r
                visitor.pop();\r
        }\r
index 771adebffd986f2cadc482b6bad73d741c6f8215..96387bebff5e7baad4e0835a43d965d224b27a90 100644 (file)
@@ -47,7 +47,7 @@ struct draw_params sealed
 {\r
        core::pixel_format_desc                                                         pix_desc;\r
        std::vector<spl::shared_ptr<class device_buffer>>       textures;\r
-       core::frame_transform                                                           transform;\r
+       core::image_transform                                                           transform;\r
        core::blend_mode                                                                        blend_mode;\r
        keyer                                                                                           keyer;\r
        std::shared_ptr<class device_buffer>                            background;\r
index 32dc99bfde1529d57f38ef42cc32a88710d1ebca..8bd340f28b4424cb7731f1f6b4e88851e6d6a746 100644 (file)
@@ -61,7 +61,7 @@ struct item
        core::pixel_format_desc                                         pix_desc;\r
        std::vector<spl::shared_ptr<host_buffer>>       buffers;\r
        std::vector<future_texture>                                     textures;\r
-       core::frame_transform                                           transform;\r
+       core::image_transform                                           transform;\r
 \r
 \r
        item()\r
@@ -148,7 +148,7 @@ private:
                           (kernel_.has_blend_modes() && layers.at(0).blend_mode != core::blend_mode::normal) == false &&\r
                            layers.at(0).items.at(0).pix_desc.format            == core::pixel_format::bgra &&\r
                            layers.at(0).items.at(0).buffers.at(0)->size() == format_desc.size &&\r
-                           layers.at(0).items.at(0).transform                          == core::frame_transform())\r
+                           layers.at(0).items.at(0).transform                          == core::image_transform())\r
                { // Bypass GPU using streaming loads to cachable memory.\r
                        auto uswc_buffer = layers.at(0).items.at(0).buffers.at(0);\r
                        auto buffer              = std::make_shared<std::vector<uint8_t, tbb::cache_aligned_allocator<uint8_t>>>(uswc_buffer->size());\r
@@ -349,7 +349,7 @@ private:
                draw_params.pix_desc.format             = core::pixel_format::bgra;\r
                draw_params.pix_desc.planes             = list_of(core::pixel_format_desc::plane(source_buffer->width(), source_buffer->height(), 4));\r
                draw_params.textures                    = list_of(source_buffer);\r
-               draw_params.transform                   = core::frame_transform();\r
+               draw_params.transform                   = core::image_transform();\r
                draw_params.blend_mode                  = blend_mode;\r
                draw_params.background                  = draw_buffer;\r
 \r
@@ -368,7 +368,7 @@ struct image_mixer::impl : boost::noncopyable
 {      \r
        spl::shared_ptr<context>                        ogl_;\r
        image_renderer                                          renderer_;\r
-       std::vector<core::frame_transform>      transform_stack_;\r
+       std::vector<core::image_transform>      transform_stack_;\r
        std::vector<layer>                                      layers_; // layer/stream/items\r
 public:\r
        impl(const spl::shared_ptr<context>& ogl) \r
@@ -386,7 +386,7 @@ public:
                \r
        void push(const core::frame_transform& transform)\r
        {\r
-               transform_stack_.push_back(transform_stack_.back()*transform);\r
+               transform_stack_.push_back(transform_stack_.back()*transform.image_transform);\r
        }\r
                \r
        void visit(const core::data_frame& frame2)\r
@@ -408,7 +408,6 @@ public:
                item.pix_desc                   = frame->get_pixel_format_desc();\r
                item.buffers                    = frame->get_buffers();                         \r
                item.transform                  = transform_stack_.back();\r
-               item.transform.volume   = core::frame_transform().volume; // Set volume to default since we don't care about it here.\r
 \r
                layers_.back().items.push_back(item);\r
        }\r
index a4ba0263ed65e0c3da5b9422f5a39c55641e0445..edd6c30a2ab838c5fa0485c7d05b6df9e7094512 100644 (file)
@@ -62,7 +62,7 @@ struct write_frame::impl : boost::noncopyable
                        \r
        void accept(const write_frame& self, core::frame_visitor& visitor) const\r
        {\r
-               visitor.push(self.get_frame_transform());\r
+               visitor.push(self.frame_transform());\r
                visitor.visit(self);\r
                visitor.pop();\r
        }\r
index 53a744a97ef81ddff6e957c489178e2db8e18ed8..e65054c4c5924dabe709a085baf43c1e520305d8 100644 (file)
@@ -33,7 +33,7 @@ struct draw_frame::impl
 {              \r
        std::vector<spl::shared_ptr<const draw_frame>> frames_;\r
 \r
-       frame_transform frame_transform_;               \r
+       core::frame_transform frame_transform_;         \r
 public:\r
        impl()\r
        {\r
@@ -60,24 +60,6 @@ public:
                        frame->accept(visitor);\r
                visitor.pop();\r
        }       \r
-               \r
-       core::field_mode field_mode() const\r
-       {\r
-               if(frame_transform_.field_mode == field_mode::upper || frame_transform_.field_mode == field_mode::lower)\r
-                       return frame_transform_.field_mode;\r
-\r
-               if(frames_.empty())\r
-                       return field_mode::progressive;\r
-               \r
-               BOOST_FOREACH(auto frame, frames_)\r
-               {\r
-                       auto mode = frame->field_mode();\r
-                       if(frame_transform_.field_mode == field_mode::upper || frame_transform_.field_mode == field_mode::lower)\r
-                               return mode;\r
-               }\r
-\r
-               return field_mode::progressive;\r
-       }\r
 };\r
        \r
 draw_frame::draw_frame() : impl_(new impl()){}\r
@@ -93,11 +75,9 @@ draw_frame& draw_frame::operator=(draw_frame other)
 }\r
 void draw_frame::swap(draw_frame& other){impl_.swap(other.impl_);}\r
 \r
-const frame_transform& draw_frame::get_frame_transform() const { return impl_->frame_transform_;}\r
-frame_transform& draw_frame::get_frame_transform() { return impl_->frame_transform_;}\r
+const core::frame_transform& draw_frame::frame_transform() const { return impl_->frame_transform_;}\r
+core::frame_transform& draw_frame::frame_transform() { return impl_->frame_transform_;}\r
 void draw_frame::accept(frame_visitor& visitor) const{impl_->accept(visitor);}\r
-field_mode draw_frame::field_mode() const{return impl_->field_mode();}\r
-\r
 spl::shared_ptr<draw_frame> draw_frame::interlace(const spl::shared_ptr<const draw_frame>& frame1, const spl::shared_ptr<const draw_frame>& frame2, core::field_mode mode)\r
 {                              \r
        if(frame1 == draw_frame::eof() || frame2 == draw_frame::eof())\r
@@ -114,13 +94,13 @@ spl::shared_ptr<draw_frame> draw_frame::interlace(const spl::shared_ptr<const dr
 \r
        if(mode == field_mode::upper)\r
        {\r
-               my_frame1->get_frame_transform().field_mode = field_mode::upper;        \r
-               my_frame2->get_frame_transform().field_mode = field_mode::lower;        \r
+               my_frame1->frame_transform().image_transform.field_mode = field_mode::upper;    \r
+               my_frame2->frame_transform().image_transform.field_mode = field_mode::lower;    \r
        }                                                                        \r
        else                                                             \r
        {                                                                        \r
-               my_frame1->get_frame_transform().field_mode = field_mode::lower;        \r
-               my_frame2->get_frame_transform().field_mode = field_mode::upper;        \r
+               my_frame1->frame_transform().image_transform.field_mode = field_mode::lower;    \r
+               my_frame2->frame_transform().image_transform.field_mode = field_mode::upper;    \r
        }\r
 \r
        std::vector<spl::shared_ptr<const draw_frame>> frames;\r
@@ -153,7 +133,7 @@ spl::shared_ptr<draw_frame> draw_frame::mask(const spl::shared_ptr<const draw_fr
 \r
        std::vector<spl::shared_ptr<const draw_frame>> frames;\r
        auto key2 = spl::make_shared<draw_frame>(key);\r
-       key2->get_frame_transform().is_key = true;\r
+       key2->frame_transform().image_transform.is_key = true;\r
        frames.push_back(key2);\r
        frames.push_back(fill);\r
        return spl::make_shared<draw_frame>(std::move(frames));\r
@@ -162,7 +142,8 @@ spl::shared_ptr<draw_frame> draw_frame::mask(const spl::shared_ptr<const draw_fr
 spl::shared_ptr<draw_frame> draw_frame::still(const spl::shared_ptr<const draw_frame>& frame)\r
 {\r
        auto frame2 = spl::make_shared<draw_frame>(frame);\r
-       frame2->get_frame_transform().is_still = true;          \r
+       frame2->frame_transform().image_transform.is_still      = true; \r
+       frame2->frame_transform().audio_transform.volume        = 0.0;          \r
        return frame2;\r
 }\r
 \r
index 046861024e68e3478cc64b86aa1900492b121f7b..4c6f1d3df42c6da8aa54d716096498b2830d5f71 100644 (file)
@@ -31,6 +31,8 @@
 \r
 namespace caspar { namespace core {\r
        \r
+struct frame_transform;\r
+\r
 class draw_frame\r
 {\r
 public:\r
@@ -45,11 +47,9 @@ public:
        draw_frame(std::vector<spl::shared_ptr<const draw_frame>> frames);\r
                \r
        void swap(draw_frame& other);\r
-\r
-       field_mode field_mode() const;\r
-\r
-       const struct frame_transform& get_frame_transform() const;\r
-       struct frame_transform& get_frame_transform();\r
+       \r
+       const core::frame_transform& frame_transform() const;\r
+       core::frame_transform& frame_transform();\r
                                \r
        static spl::shared_ptr<draw_frame> interlace(const spl::shared_ptr<const draw_frame>& frame1, const spl::shared_ptr<const draw_frame>& frame2, core::field_mode mode);\r
        static spl::shared_ptr<draw_frame> over(const spl::shared_ptr<const draw_frame>& frame1, const spl::shared_ptr<const draw_frame>& frame2);\r
index 37ce3891868614273a89bcfb11a01bf072df2514..c08521240528ef3614ea8a375f7d0a7929eebd0a 100644 (file)
 \r
 namespace caspar { namespace core {\r
                \r
-frame_transform::frame_transform() \r
-       : volume(1.0)\r
-       , opacity(1.0)\r
+// image_transform\r
+\r
+image_transform::image_transform() \r
+       : opacity(1.0)\r
        , brightness(1.0)\r
        , contrast(1.0)\r
        , saturation(1.0)\r
@@ -45,9 +46,8 @@ frame_transform::frame_transform()
        boost::range::fill(clip_scale, 1.0);\r
 }\r
 \r
-frame_transform& frame_transform::operator*=(const frame_transform &other)\r
+image_transform& image_transform::operator*=(const image_transform &other)\r
 {\r
-       volume                                  *= other.volume;\r
        opacity                                 *= other.opacity;       \r
        brightness                              *= other.brightness;\r
        contrast                                *= other.contrast;\r
@@ -72,20 +72,19 @@ frame_transform& frame_transform::operator*=(const frame_transform &other)
        return *this;\r
 }\r
 \r
-frame_transform frame_transform::operator*(const frame_transform &other) const\r
+image_transform image_transform::operator*(const image_transform &other) const\r
 {\r
-       return frame_transform(*this) *= other;\r
+       return image_transform(*this) *= other;\r
 }\r
 \r
-frame_transform frame_transform::tween(double time, const frame_transform& source, const frame_transform& dest, double duration, const tweener& tween)\r
+image_transform image_transform::tween(double time, const image_transform& source, const image_transform& dest, double duration, const tweener& tween)\r
 {      \r
        auto do_tween = [](double time, double source, double dest, double duration, const tweener& tween)\r
        {\r
                return tween(time, source, dest-source, duration);\r
        };\r
        \r
-       frame_transform result; \r
-       result.volume                           = do_tween(time, source.volume,                                 dest.volume,                            duration, tween);\r
+       image_transform result; \r
        result.brightness                       = do_tween(time, source.brightness,                             dest.brightness,                        duration, tween);\r
        result.contrast                         = do_tween(time, source.contrast,                               dest.contrast,                          duration, tween);\r
        result.saturation                       = do_tween(time, source.saturation,                             dest.saturation,                        duration, tween);\r
@@ -111,7 +110,7 @@ frame_transform frame_transform::tween(double time, const frame_transform& sourc
        return result;\r
 }\r
 \r
-bool operator==(const frame_transform& lhs, const frame_transform& rhs)\r
+bool operator==(const image_transform& lhs, const image_transform& rhs)\r
 {\r
        auto eq = [](double lhs, double rhs)\r
        {\r
@@ -119,7 +118,6 @@ bool operator==(const frame_transform& lhs, const frame_transform& rhs)
        };\r
 \r
        return \r
-               eq(lhs.volume, rhs.volume) &&\r
                eq(lhs.opacity, rhs.opacity) &&\r
                eq(lhs.contrast, rhs.contrast) &&\r
                eq(lhs.brightness, rhs.brightness) &&\r
@@ -130,7 +128,90 @@ bool operator==(const frame_transform& lhs, const frame_transform& rhs)
                boost::range::equal(lhs.clip_scale, rhs.clip_scale, eq) &&\r
                lhs.field_mode == rhs.field_mode &&\r
                lhs.is_key == rhs.is_key &&\r
-               lhs.is_mix == rhs.is_mix;\r
+               lhs.is_mix == rhs.is_mix &&\r
+               lhs.is_still == rhs.is_still;\r
+}\r
+\r
+bool operator!=(const image_transform& lhs, const image_transform& rhs)\r
+{\r
+       return !(lhs == rhs);\r
+}\r
+\r
+// audio_transform\r
+               \r
+audio_transform::audio_transform() \r
+       : volume(1.0)\r
+{\r
+}\r
+\r
+audio_transform& audio_transform::operator*=(const audio_transform &other)\r
+{\r
+       volume                                  *= other.volume;        \r
+       return *this;\r
+}\r
+\r
+audio_transform audio_transform::operator*(const audio_transform &other) const\r
+{\r
+       return audio_transform(*this) *= other;\r
+}\r
+\r
+audio_transform audio_transform::tween(double time, const audio_transform& source, const audio_transform& dest, double duration, const tweener& tween)\r
+{      \r
+       auto do_tween = [](double time, double source, double dest, double duration, const tweener& tween)\r
+       {\r
+               return tween(time, source, dest-source, duration);\r
+       };\r
+       \r
+       audio_transform result; \r
+       result.volume                   = do_tween(time, source.volume,                         dest.volume,                    duration, tween);\r
+       \r
+       return result;\r
+}\r
+\r
+bool operator==(const audio_transform& lhs, const audio_transform& rhs)\r
+{\r
+       auto eq = [](double lhs, double rhs)\r
+       {\r
+               return std::abs(lhs - rhs) < 5e-8;\r
+       };\r
+\r
+       return eq(lhs.volume, rhs.volume);\r
+}\r
+\r
+bool operator!=(const audio_transform& lhs, const audio_transform& rhs)\r
+{\r
+       return !(lhs == rhs);\r
+}\r
+\r
+// frame_transform\r
+frame_transform::frame_transform()\r
+{\r
+}\r
+\r
+frame_transform& frame_transform::operator*=(const frame_transform &other)\r
+{\r
+       image_transform *= other.image_transform;\r
+       audio_transform *= other.audio_transform;\r
+       return *this;\r
+}\r
+\r
+frame_transform frame_transform::operator*(const frame_transform &other) const\r
+{\r
+       return frame_transform(*this) *= other;\r
+}\r
+\r
+frame_transform frame_transform::tween(double time, const frame_transform& source, const frame_transform& dest, double duration, const tweener& tween)\r
+{\r
+       frame_transform result;\r
+       result.image_transform = image_transform::tween(time, source.image_transform, dest.image_transform, duration, tween);\r
+       result.audio_transform = audio_transform::tween(time, source.audio_transform, dest.audio_transform, duration, tween);\r
+       return result;\r
+}\r
+\r
+bool operator==(const frame_transform& lhs, const frame_transform& rhs)\r
+{\r
+       return  lhs.image_transform == rhs.image_transform && \r
+                       lhs.audio_transform == rhs.audio_transform;\r
 }\r
 \r
 bool operator!=(const frame_transform& lhs, const frame_transform& rhs)\r
index 488c9bf696eb9646e1971316fb7ea83b4970969f..56ae856f7e9c6192e3f05de23d618829f05bc64b 100644 (file)
@@ -45,13 +45,11 @@ struct levels sealed
        double max_output;\r
 };\r
 \r
-struct frame_transform sealed\r
+struct image_transform sealed\r
 {\r
 public:\r
+       image_transform();\r
 \r
-       frame_transform();\r
-\r
-       double                                  volume;\r
        double                                  opacity;\r
        double                                  contrast;\r
        double                                  brightness;\r
@@ -67,8 +65,42 @@ public:
        bool                                    is_mix;\r
        bool                                    is_still;\r
        \r
-       frame_transform& frame_transform::operator*=(const frame_transform &other);\r
-       frame_transform frame_transform::operator*(const frame_transform &other) const;\r
+       image_transform& operator*=(const image_transform &other);\r
+       image_transform operator*(const image_transform &other) const;\r
+\r
+       static image_transform tween(double time, const image_transform& source, const image_transform& dest, double duration, const tweener& tween);\r
+};\r
+\r
+bool operator==(const image_transform& lhs, const image_transform& rhs);\r
+bool operator!=(const image_transform& lhs, const image_transform& rhs);\r
+\r
+struct audio_transform sealed\r
+{\r
+public:\r
+       audio_transform();\r
+\r
+       double                                  volume;\r
+       \r
+       audio_transform& operator*=(const audio_transform &other);\r
+       audio_transform operator*(const audio_transform &other) const;\r
+\r
+       static audio_transform tween(double time, const audio_transform& source, const audio_transform& dest, double duration, const tweener& tween);\r
+};\r
+\r
+bool operator==(const audio_transform& lhs, const audio_transform& rhs);\r
+bool operator!=(const audio_transform& lhs, const audio_transform& rhs);\r
+\r
+struct frame_transform sealed\r
+{\r
+public:\r
+\r
+       frame_transform();\r
+       \r
+       image_transform image_transform;\r
+       audio_transform audio_transform;\r
+       \r
+       frame_transform& operator*=(const frame_transform &other);\r
+       frame_transform operator*(const frame_transform &other) const;\r
 \r
        static frame_transform tween(double time, const frame_transform& source, const frame_transform& dest, double duration, const tweener& tween);\r
 };\r
index ee888676080497dfa5f222b8d9025ba41074f0ac..52969e0dc46ce7c3658aff2a47b5375345f2210e 100644 (file)
@@ -39,7 +39,7 @@ namespace caspar { namespace core {
 struct audio_item\r
 {\r
        const void*                     tag;\r
-       frame_transform         transform;\r
+       audio_transform         transform;\r
        audio_buffer            audio_data;\r
 \r
        audio_item()\r
@@ -58,13 +58,13 @@ typedef std::vector<float, tbb::cache_aligned_allocator<float>> audio_buffer_ps;
        \r
 struct audio_stream\r
 {\r
-       frame_transform         prev_transform;\r
+       audio_transform         prev_transform;\r
        audio_buffer_ps         audio_data;\r
 };\r
 \r
 struct audio_mixer::impl : boost::noncopyable\r
 {\r
-       std::stack<core::frame_transform>       transform_stack_;\r
+       std::stack<core::audio_transform>       transform_stack_;\r
        std::map<const void*, audio_stream>     audio_streams_;\r
        std::vector<audio_item>                         items_;\r
        std::vector<int>                                        audio_cadence_;\r
@@ -73,12 +73,12 @@ struct audio_mixer::impl : boost::noncopyable
 public:\r
        impl()\r
        {\r
-               transform_stack_.push(core::frame_transform());\r
+               transform_stack_.push(core::audio_transform());\r
        }\r
        \r
        void push(const frame_transform& transform)\r
        {\r
-               transform_stack_.push(transform_stack_.top()*transform);\r
+               transform_stack_.push(transform_stack_.top()*transform.audio_transform);\r
        }\r
 \r
        void visit(const data_frame& frame)\r
@@ -87,14 +87,11 @@ public:
                item.tag                = frame.tag();\r
                item.transform  = transform_stack_.top();\r
                item.audio_data = frame.audio_data();\r
-\r
-               if(item.transform.is_still)\r
-                       item.transform.volume = 0.0;\r
                \r
                items_.push_back(std::move(item));              \r
        }\r
 \r
-       void begin(const core::frame_transform& transform)\r
+       void begin(const core::audio_transform& transform)\r
        {\r
                transform_stack_.push(transform_stack_.top()*transform);\r
        }\r
index b1c13614a3b64f43a9200b4e2d2640818611fa78..870c2ea8ca5c0e32ee144d0a469658f6442fe0c4 100644 (file)
@@ -105,22 +105,22 @@ public:
                frame_producer::flags flags = frame_producer::flags::none;\r
                if(format_desc.field_mode != field_mode::progressive)\r
                {\r
-                       flags |= std::abs(transform.fill_scale[1]  - 1.0) > 0.0001 ? frame_producer::flags::deinterlace : frame_producer::flags::none;\r
-                       flags |= std::abs(transform.fill_translation[1])  > 0.0001 ? frame_producer::flags::deinterlace : frame_producer::flags::none;\r
+                       flags |= std::abs(transform.image_transform.fill_scale[1]  - 1.0) > 0.0001 ? frame_producer::flags::deinterlace : frame_producer::flags::none;\r
+                       flags |= std::abs(transform.image_transform.fill_translation[1])  > 0.0001 ? frame_producer::flags::deinterlace : frame_producer::flags::none;\r
                }\r
 \r
-               if(transform.is_key)\r
+               if(transform.image_transform.is_key)\r
                        flags |= frame_producer::flags::alpha_only;\r
                \r
                auto frame = layer.receive(flags, format_desc); \r
                                \r
                auto frame1 = spl::make_shared<core::draw_frame>(frame);\r
-               frame1->get_frame_transform() = transform;\r
+               frame1->frame_transform() = transform;\r
 \r
                if(format_desc.field_mode != core::field_mode::progressive)\r
                {                               \r
                        auto frame2 = spl::make_shared<core::draw_frame>(frame);\r
-                       frame2->get_frame_transform() = tween.fetch_and_tick(1);\r
+                       frame2->frame_transform() = tween.fetch_and_tick(1);\r
                        frame1 = core::draw_frame::interlace(frame1, frame2, format_desc.field_mode);\r
                }\r
 \r
index 561a64fa2ef10319d5ef766b9845ee89657d911f..e3056c75f668e6d18106ded08c8628d7ac354eb7 100644 (file)
@@ -144,47 +144,47 @@ public:
                \r
                // For interlaced transitions. Seperate fields into seperate frames which are transitioned accordingly.\r
                \r
-               src_frame->get_frame_transform().volume = 1.0-delta2;\r
+               src_frame->frame_transform().audio_transform.volume = 1.0-delta2;\r
                auto s_frame1 = spl::make_shared<draw_frame>(src_frame);\r
                auto s_frame2 = spl::make_shared<draw_frame>(src_frame);\r
                \r
-               dest_frame->get_frame_transform().volume = delta2;\r
+               dest_frame->frame_transform().audio_transform.volume = delta2;\r
                auto d_frame1 = spl::make_shared<draw_frame>(dest_frame);\r
                auto d_frame2 = spl::make_shared<draw_frame>(dest_frame);\r
                \r
                if(info_.type == transition_type::mix)\r
                {\r
-                       d_frame1->get_frame_transform().opacity = delta1;       \r
-                       d_frame1->get_frame_transform().is_mix = true;\r
-                       d_frame2->get_frame_transform().opacity = delta2;\r
-                       d_frame2->get_frame_transform().is_mix = true;\r
-\r
-                       s_frame1->get_frame_transform().opacity = 1.0-delta1;   \r
-                       s_frame1->get_frame_transform().is_mix = true;\r
-                       s_frame2->get_frame_transform().opacity = 1.0-delta2;   \r
-                       s_frame2->get_frame_transform().is_mix = true;\r
+                       d_frame1->frame_transform().image_transform.opacity = delta1;   \r
+                       d_frame1->frame_transform().image_transform.is_mix = true;\r
+                       d_frame2->frame_transform().image_transform.opacity = delta2;\r
+                       d_frame2->frame_transform().image_transform.is_mix = true;\r
+\r
+                       s_frame1->frame_transform().image_transform.opacity = 1.0-delta1;       \r
+                       s_frame1->frame_transform().image_transform.is_mix = true;\r
+                       s_frame2->frame_transform().image_transform.opacity = 1.0-delta2;       \r
+                       s_frame2->frame_transform().image_transform.is_mix = true;\r
                }\r
                if(info_.type == transition_type::slide)\r
                {\r
-                       d_frame1->get_frame_transform().fill_translation[0] = (-1.0+delta1)*dir;        \r
-                       d_frame2->get_frame_transform().fill_translation[0] = (-1.0+delta2)*dir;                \r
+                       d_frame1->frame_transform().image_transform.fill_translation[0] = (-1.0+delta1)*dir;    \r
+                       d_frame2->frame_transform().image_transform.fill_translation[0] = (-1.0+delta2)*dir;            \r
                }\r
                else if(info_.type == transition_type::push)\r
                {\r
-                       d_frame1->get_frame_transform().fill_translation[0] = (-1.0+delta1)*dir;\r
-                       d_frame2->get_frame_transform().fill_translation[0] = (-1.0+delta2)*dir;\r
+                       d_frame1->frame_transform().image_transform.fill_translation[0] = (-1.0+delta1)*dir;\r
+                       d_frame2->frame_transform().image_transform.fill_translation[0] = (-1.0+delta2)*dir;\r
 \r
-                       s_frame1->get_frame_transform().fill_translation[0] = (0.0+delta1)*dir; \r
-                       s_frame2->get_frame_transform().fill_translation[0] = (0.0+delta2)*dir;         \r
+                       s_frame1->frame_transform().image_transform.fill_translation[0] = (0.0+delta1)*dir;     \r
+                       s_frame2->frame_transform().image_transform.fill_translation[0] = (0.0+delta2)*dir;             \r
                }\r
                else if(info_.type == transition_type::wipe)            \r
                {\r
-                       d_frame1->get_frame_transform().clip_scale[0] = delta1; \r
-                       d_frame2->get_frame_transform().clip_scale[0] = delta2;                 \r
+                       d_frame1->frame_transform().image_transform.clip_scale[0] = delta1;     \r
+                       d_frame2->frame_transform().image_transform.clip_scale[0] = delta2;                     \r
                }\r
                                \r
-               const auto s_frame = s_frame1->get_frame_transform() == s_frame2->get_frame_transform() ? s_frame2 : draw_frame::interlace(s_frame1, s_frame2, mode_);\r
-               const auto d_frame = d_frame1->get_frame_transform() == d_frame2->get_frame_transform() ? d_frame2 : draw_frame::interlace(d_frame1, d_frame2, mode_);\r
+               const auto s_frame = s_frame1->frame_transform() == s_frame2->frame_transform() ? s_frame2 : draw_frame::interlace(s_frame1, s_frame2, mode_);\r
+               const auto d_frame = d_frame1->frame_transform() == d_frame2->frame_transform() ? d_frame2 : draw_frame::interlace(d_frame1, d_frame2, mode_);\r
                \r
                return draw_frame::over(s_frame, d_frame);\r
        }\r
index e20e6430c4c28228b7df26d2520ab32fbf5068cc..2542eb873df7053b72158d8650528b5f44ce4df5 100644 (file)
@@ -276,15 +276,15 @@ spl::shared_ptr<core::write_frame> make_write_frame(const void* tag, const spl::
 \r
        if(decoded_frame->height == 480) // NTSC DV\r
        {\r
-               write->get_frame_transform().fill_translation[1] += 2.0/static_cast<double>(frame_factory->video_format_desc().height);\r
-               write->get_frame_transform().fill_scale[1] = 1.0 - 6.0*1.0/static_cast<double>(frame_factory->video_format_desc().height);\r
+               write->frame_transform().image_transform.fill_translation[1] += 2.0/static_cast<double>(frame_factory->video_format_desc().height);\r
+               write->frame_transform().image_transform.fill_scale[1] = 1.0 - 6.0*1.0/static_cast<double>(frame_factory->video_format_desc().height);\r
        }\r
        \r
        // Fix field-order if needed\r
        if(get_mode(*decoded_frame) == core::field_mode::lower && frame_factory->video_format_desc().field_mode == core::field_mode::upper)\r
-               write->get_frame_transform().fill_translation[1] += 1.0/static_cast<double>(frame_factory->video_format_desc().height);\r
+               write->frame_transform().image_transform.fill_translation[1] += 1.0/static_cast<double>(frame_factory->video_format_desc().height);\r
        else if(get_mode(*decoded_frame) == core::field_mode::upper && frame_factory->video_format_desc().field_mode == core::field_mode::lower)\r
-               write->get_frame_transform().fill_translation[1] -= 1.0/static_cast<double>(frame_factory->video_format_desc().height);\r
+               write->frame_transform().image_transform.fill_translation[1] -= 1.0/static_cast<double>(frame_factory->video_format_desc().height);\r
 \r
        return spl::make_shared_ptr(write);\r
 }\r
index b2e4bd27f61e036f03d7f4b9142759214684a2e2..f56627554c31d055b7306cba6d2dde62df0cbd91 100644 (file)
@@ -172,8 +172,8 @@ struct image_scroll_producer : public core::frame_producer
 \r
                        for(int n = 0; n < frames_.size(); ++n)\r
                        {\r
-                               frames_[n]->get_frame_transform().fill_translation[0] = start_offset_[0];\r
-                               frames_[n]->get_frame_transform().fill_translation[1] = start_offset_[1] - (n+1) + delta_ * 0.5/static_cast<double>(format_desc_.height);\r
+                               frames_[n]->frame_transform().image_transform.fill_translation[0] = start_offset_[0];\r
+                               frames_[n]->frame_transform().image_transform.fill_translation[1] =     start_offset_[1] - (n+1) + delta_ * 0.5/static_cast<double>(format_desc_.height);\r
                        }\r
                }\r
                else\r
@@ -183,8 +183,8 @@ struct image_scroll_producer : public core::frame_producer
 \r
                        for(int n = 0; n < frames_.size(); ++n)\r
                        {\r
-                               frames_[n]->get_frame_transform().fill_translation[0] = start_offset_[0] - (n+1) + delta_ * 0.5/static_cast<double>(format_desc_.width);                                \r
-                               frames_[n]->get_frame_transform().fill_translation[1] = start_offset_[1];\r
+                               frames_[n]->frame_transform().image_transform.fill_translation[0] = start_offset_[0] - (n+1) + delta_ * 0.5/static_cast<double>(format_desc_.width);                            \r
+                               frames_[n]->frame_transform().image_transform.fill_translation[1] = start_offset_[1];\r
                        }\r
                }\r
 \r
index a81b48648b77748856ec7364f4f3e0c646f81ba2..40e11cdd7ec2de87437d3cbfdf9805cb799fecc8 100644 (file)
@@ -258,14 +258,14 @@ bool ChannelGridCommand::DoExecute()
                        int index = x+y*n+1;\r
                        auto transform = [=](frame_transform transform) -> frame_transform\r
                        {               \r
-                               transform.fill_translation[0]   = x*delta;\r
-                               transform.fill_translation[1]   = y*delta;\r
-                               transform.fill_scale[0]                 = delta;\r
-                               transform.fill_scale[1]                 = delta;\r
-                               transform.clip_translation[0]   = x*delta;\r
-                               transform.clip_translation[1]   = y*delta;\r
-                               transform.clip_scale[0]                 = delta;\r
-                               transform.clip_scale[1]                 = delta;                        \r
+                               transform.image_transform.fill_translation[0]   = x*delta;\r
+                               transform.image_transform.fill_translation[1]   = y*delta;\r
+                               transform.image_transform.fill_scale[0]                 = delta;\r
+                               transform.image_transform.fill_scale[1]                 = delta;\r
+                               transform.image_transform.clip_translation[0]   = x*delta;\r
+                               transform.image_transform.clip_translation[1]   = y*delta;\r
+                               transform.image_transform.clip_scale[0]                 = delta;\r
+                               transform.image_transform.clip_scale[1]                 = delta;                        \r
                                return transform;\r
                        };\r
                        self->stage().apply_transform(index, transform);\r
@@ -337,7 +337,7 @@ bool MixerCommand::DoExecute()
                        bool value = boost::lexical_cast<int>(_parameters.at(1));\r
                        transforms.push_back(stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform\r
                        {\r
-                               transform.is_key = value;\r
+                               transform.image_transform.is_key = value;\r
                                return transform;                                       \r
                        }, 0, L"linear"));\r
                }\r
@@ -350,7 +350,7 @@ bool MixerCommand::DoExecute()
                        \r
                        transforms.push_back(stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform\r
                        {\r
-                               transform.opacity = value;\r
+                               transform.image_transform.opacity = value;\r
                                return transform;                                       \r
                        }, duration, tween));\r
                }\r
@@ -365,14 +365,14 @@ bool MixerCommand::DoExecute()
 \r
                        transforms.push_back(stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) mutable -> frame_transform\r
                        {\r
-                               transform.fill_translation[0]   = x;\r
-                               transform.fill_translation[1]   = y;\r
-                               transform.fill_scale[0]                 = x_s;\r
-                               transform.fill_scale[1]                 = y_s;\r
-                               transform.clip_translation[0]   = x;\r
-                               transform.clip_translation[1]   = y;\r
-                               transform.clip_scale[0]                 = x_s;\r
-                               transform.clip_scale[1]                 = y_s;\r
+                               transform.image_transform.fill_translation[0]   = x;\r
+                               transform.image_transform.fill_translation[1]   = y;\r
+                               transform.image_transform.fill_scale[0]                 = x_s;\r
+                               transform.image_transform.fill_scale[1]                 = y_s;\r
+                               transform.image_transform.clip_translation[0]   = x;\r
+                               transform.image_transform.clip_translation[1]   = y;\r
+                               transform.image_transform.clip_scale[0]                 = x_s;\r
+                               transform.image_transform.clip_scale[1]                 = y_s;\r
                                return transform;\r
                        }, duration, tween));\r
                }\r
@@ -387,10 +387,10 @@ bool MixerCommand::DoExecute()
 \r
                        transforms.push_back(stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform\r
                        {\r
-                               transform.clip_translation[0]   = x;\r
-                               transform.clip_translation[1]   = y;\r
-                               transform.clip_scale[0]                 = x_s;\r
-                               transform.clip_scale[1]                 = y_s;\r
+                               transform.image_transform.clip_translation[0]   = x;\r
+                               transform.image_transform.clip_translation[1]   = y;\r
+                               transform.image_transform.clip_scale[0]                 = x_s;\r
+                               transform.image_transform.clip_scale[1]                 = y_s;\r
                                return transform;\r
                        }, duration, tween));\r
                }\r
@@ -407,14 +407,14 @@ bool MixerCommand::DoExecute()
                                        int index = x+y*n+1;\r
                                        transforms.push_back(stage::transform_tuple_t(index, [=](frame_transform transform) -> frame_transform\r
                                        {               \r
-                                               transform.fill_translation[0]   = x*delta;\r
-                                               transform.fill_translation[1]   = y*delta;\r
-                                               transform.fill_scale[0]                 = delta;\r
-                                               transform.fill_scale[1]                 = delta;\r
-                                               transform.clip_translation[0]   = x*delta;\r
-                                               transform.clip_translation[1]   = y*delta;\r
-                                               transform.clip_scale[0]                 = delta;\r
-                                               transform.clip_scale[1]                 = delta;                        \r
+                                               transform.image_transform.fill_translation[0]   = x*delta;\r
+                                               transform.image_transform.fill_translation[1]   = y*delta;\r
+                                               transform.image_transform.fill_scale[0]                 = delta;\r
+                                               transform.image_transform.fill_scale[1]                 = delta;\r
+                                               transform.image_transform.clip_translation[0]   = x*delta;\r
+                                               transform.image_transform.clip_translation[1]   = y*delta;\r
+                                               transform.image_transform.clip_scale[0]                 = delta;\r
+                                               transform.image_transform.clip_scale[1]                 = delta;                        \r
                                                return transform;\r
                                        }, duration, tween));\r
                                }\r
@@ -433,7 +433,7 @@ bool MixerCommand::DoExecute()
                        std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
                        auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform\r
                        {\r
-                               transform.brightness = value;\r
+                               transform.image_transform.brightness = value;\r
                                return transform;\r
                        }, duration, tween);\r
                }\r
@@ -444,7 +444,7 @@ bool MixerCommand::DoExecute()
                        std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
                        auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform\r
                        {\r
-                               transform.saturation = value;\r
+                               transform.image_transform.saturation = value;\r
                                return transform;\r
                        }, duration, tween);    \r
                }\r
@@ -455,7 +455,7 @@ bool MixerCommand::DoExecute()
                        std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
                        auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform\r
                        {\r
-                               transform.contrast = value;\r
+                               transform.image_transform.contrast = value;\r
                                return transform;\r
                        }, duration, tween);    \r
                }\r
@@ -472,7 +472,7 @@ bool MixerCommand::DoExecute()
 \r
                        auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform\r
                        {\r
-                               transform.levels = value;\r
+                               transform.image_transform.levels = value;\r
                                return transform;\r
                        }, duration, tween);\r
                }\r
@@ -484,7 +484,7 @@ bool MixerCommand::DoExecute()
 \r
                        auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform\r
                        {\r
-                               transform.volume = value;\r
+                               transform.audio_transform.volume = value;\r
                                return transform;\r
                        }, duration, tween);\r
                }\r