]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 2 Mar 2011 22:09:07 +0000 (22:09 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 2 Mar 2011 22:09:07 +0000 (22:09 +0000)
mixer/frame_mixer_device.cpp
mixer/frame_mixer_device.h
protocol/amcp/AMCPCommandsImpl.cpp

index aa0070fee7e84c324b8180c29b454c23cbbedcc0..39129b3edac15c5774b1862f54af0a0451ee03d1 100644 (file)
@@ -44,6 +44,9 @@ struct frame_mixer_device::implementation : boost::noncopyable
        std::unordered_map<int, image_transform> image_transforms_;\r
        std::unordered_map<int, audio_transform> audio_transforms_;\r
 \r
+       image_transform root_image_transform_;\r
+       audio_transform root_audio_transform_;\r
+\r
        executor executor_;\r
 public:\r
        implementation(const printer& parent_printer, const video_format_desc& format_desc, const output_func& output) \r
@@ -71,7 +74,7 @@ public:
                        auto image = image_mixer_.begin_pass();\r
                        BOOST_FOREACH(auto& frame, frames)\r
                        {\r
-                               image_mixer_.begin(image_transforms_[frame->get_layer_index()]);\r
+                               image_mixer_.begin(root_image_transform_*image_transforms_[frame->get_layer_index()]);\r
                                frame->process_image(image_mixer_);\r
                                image_mixer_.end();\r
                        }\r
@@ -80,7 +83,7 @@ public:
                        auto audio = audio_mixer_.begin_pass();\r
                        BOOST_FOREACH(auto& frame, frames)\r
                        {\r
-                               audio_mixer_.begin(audio_transforms_[frame->get_layer_index()]);\r
+                               audio_mixer_.begin(root_audio_transform_*audio_transforms_[frame->get_layer_index()]);\r
                                frame->process_audio(audio_mixer_);\r
                                audio_mixer_.end();\r
                        }\r
@@ -111,20 +114,36 @@ public:
        {\r
                return executor_.invoke([&]{return audio_transforms_[index];});\r
        }\r
+       \r
+       void set_image_transform(const image_transform& transform, int mix_duration)\r
+       {\r
+               return executor_.invoke([&]\r
+               {\r
+                       root_image_transform_ = root_image_transform_;\r
+               });\r
+       }\r
+\r
+       void set_audio_transform(const audio_transform& transform, int mix_duration)\r
+       {\r
+               return executor_.invoke([&]\r
+               {\r
+                       root_audio_transform_ = root_audio_transform_;\r
+               });\r
+       }\r
 \r
-       void set_image_transform(int index, image_transform&& transform, int mix_duration)\r
+       void set_image_transform(int index, const image_transform& transform, int mix_duration)\r
        {\r
                return executor_.invoke([&]\r
                {\r
-                       image_transforms_[index] = std::move(transform);\r
+                       image_transforms_[index] = transform;\r
                });\r
        }\r
 \r
-       void set_audio_transform(int index, audio_transform&& transform, int mix_duration)\r
+       void set_audio_transform(int index, const audio_transform& transform, int mix_duration)\r
        {\r
                return executor_.invoke([&]\r
                {\r
-                       audio_transforms_[index] = std::move(transform);\r
+                       audio_transforms_[index] = transform;\r
                });\r
        }\r
 \r
@@ -158,7 +177,9 @@ safe_ptr<write_frame> frame_mixer_device::create_frame(pixel_format::type pix_fm
 }\r
 image_transform frame_mixer_device::get_image_transform(int index){return impl_->get_image_transform(index);}\r
 audio_transform frame_mixer_device::get_audio_transform(int index){return impl_->get_audio_transform(index);}\r
-void frame_mixer_device::set_image_transform(int index, image_transform&& transform, int mix_duration){impl_->set_image_transform(index, std::move(transform), mix_duration);}\r
-void frame_mixer_device::set_audio_transform(int index, audio_transform&& transform, int mix_duration){impl_->set_audio_transform(index, std::move(transform), mix_duration);}\r
+void frame_mixer_device::set_image_transform(const image_transform& transform, int mix_duration){impl_->set_image_transform(transform, mix_duration);}\r
+void frame_mixer_device::set_audio_transform(const audio_transform& transform, int mix_duration){impl_->set_audio_transform(transform, mix_duration);}\r
+void frame_mixer_device::set_image_transform(int index, const image_transform& transform, int mix_duration){impl_->set_image_transform(index, transform, mix_duration);}\r
+void frame_mixer_device::set_audio_transform(int index, const audio_transform& transform, int mix_duration){impl_->set_audio_transform(index, transform, mix_duration);}\r
 \r
 }}
\ No newline at end of file
index 879bd32baf518975d0aebb14c009f1a178f3e042..e462f633b6cd6cb0474bb03d9ffbfbd2fa7bda3e 100644 (file)
@@ -56,9 +56,11 @@ public:
 \r
        image_transform get_image_transform(int index);\r
        audio_transform get_audio_transform(int index);\r
-\r
-       void set_image_transform(int index, image_transform&& transform, int mix_duration = 0);\r
-       void set_audio_transform(int index, audio_transform&& transform, int mix_duration = 0);\r
+       \r
+       void set_image_transform(const image_transform& transform, int mix_duration = 0);\r
+       void set_audio_transform(const audio_transform& transform, int mix_duration = 0);\r
+       void set_image_transform(int index, const image_transform& transform, int mix_duration = 0);\r
+       void set_audio_transform(int index, const audio_transform& transform, int mix_duration = 0);\r
 \r
 private:\r
        struct implementation;\r
index 7158ee8d033e04add86370807f5e4f1a677afdc7..111637559f04ecbdcb55502a1207e6f49c4f5819 100644 (file)
@@ -179,20 +179,33 @@ bool MixerCommand::DoExecute()
                {\r
                        if(_parameters[1] == L"OPACITY")\r
                        {\r
+                               int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
                                double value = boost::lexical_cast<double>(_parameters.at(2));\r
                                auto transform = GetChannel()->mixer().get_image_transform(GetLayerIndex());\r
                                transform.set_opacity(value);\r
-                               GetChannel()->mixer().set_image_transform(GetLayerIndex(), std::move(transform));\r
+\r
+                               int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
+                               if(layer != std::numeric_limits<int>::min())                                    \r
+                                       GetChannel()->mixer().set_image_transform(GetLayerIndex(), transform, duration);\r
+                               else\r
+                                       GetChannel()->mixer().set_image_transform(transform, duration);\r
                        }\r
                        else if(_parameters[1] == L"GAIN")\r
                        {\r
+                               int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
                                double value = boost::lexical_cast<double>(_parameters.at(2));\r
                                auto transform = GetChannel()->mixer().get_image_transform(GetLayerIndex());\r
                                transform.set_gain(value);\r
-                               GetChannel()->mixer().set_image_transform(GetLayerIndex(), std::move(transform));\r
+\r
+                               int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
+                               if(layer != std::numeric_limits<int>::min())\r
+                                       GetChannel()->mixer().set_image_transform(GetLayerIndex(), transform, duration);\r
+                               else\r
+                                       GetChannel()->mixer().set_image_transform(GetLayerIndex(), transform, duration);\r
                        }\r
                        else if(_parameters[1] == L"FIX_RECT")\r
                        {\r
+                               int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[5], 0) : 0;\r
                                double x        = boost::lexical_cast<double>(_parameters.at(2));\r
                                double y        = boost::lexical_cast<double>(_parameters.at(3));\r
                                double x_s      = boost::lexical_cast<double>(_parameters.at(4));\r
@@ -202,10 +215,16 @@ bool MixerCommand::DoExecute()
                                transform.set_image_scale(x_s, y_s);\r
                                transform.set_mask_translation(x, y);\r
                                transform.set_mask_scale(x_s, y_s);\r
-                               GetChannel()->mixer().set_image_transform(GetLayerIndex(), std::move(transform));\r
+\r
+                               int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
+                               if(layer != std::numeric_limits<int>::min())\r
+                                       GetChannel()->mixer().set_image_transform(GetLayerIndex(), transform, duration);\r
+                               else\r
+                                       GetChannel()->mixer().set_image_transform(transform, duration);\r
                        }\r
                        else if(_parameters[1] == L"CLIP_RECT")\r
                        {\r
+                               int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[5], 0) : 0;\r
                                double x        = boost::lexical_cast<double>(_parameters.at(2));\r
                                double y        = boost::lexical_cast<double>(_parameters.at(3));\r
                                double x_s      = boost::lexical_cast<double>(_parameters.at(4));\r
@@ -215,7 +234,12 @@ bool MixerCommand::DoExecute()
                                transform.set_image_scale(1.0, 1.0);\r
                                transform.set_mask_translation(x, y);\r
                                transform.set_mask_scale(x_s, y_s);\r
-                               GetChannel()->mixer().set_image_transform(GetLayerIndex(), std::move(transform));\r
+\r
+                               int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
+                               if(layer != std::numeric_limits<int>::min())\r
+                                       GetChannel()->mixer().set_image_transform(GetLayerIndex(), transform, duration);\r
+                               else\r
+                                       GetChannel()->mixer().set_image_transform(transform, duration);\r
                        }\r
                        else if(_parameters[1] == L"GRID")\r
                        {\r
@@ -231,7 +255,7 @@ bool MixerCommand::DoExecute()
                                                transform.set_image_scale(delta, delta);                        \r
                                                transform.set_mask_translation(x*delta, y*delta);\r
                                                transform.set_mask_scale(delta, delta);\r
-                                               GetChannel()->mixer().set_image_transform(index, std::move(transform));\r
+                                               GetChannel()->mixer().set_image_transform(index, transform, 0);\r
                                        }\r
                                }\r
                        }\r
@@ -244,10 +268,16 @@ bool MixerCommand::DoExecute()
                {\r
                        if(_parameters[1] == L"GAIN")\r
                        {\r
+                               int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
                                double value = boost::lexical_cast<double>(_parameters[2]);\r
                                auto transform = GetChannel()->mixer().get_audio_transform(GetLayerIndex());\r
                                transform.set_gain(value);\r
-                               GetChannel()->mixer().set_audio_transform(GetLayerIndex(), std::move(transform));\r
+\r
+                               int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
+                               if(layer != std::numeric_limits<int>::min())\r
+                                       GetChannel()->mixer().set_audio_transform(GetLayerIndex(), transform, duration);\r
+                               else\r
+                                       GetChannel()->mixer().set_audio_transform(transform, duration);\r
                        }\r
                        else if(_parameters[1] == L"RESET")\r
                        {\r