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
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
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
{\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
}\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
{\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
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
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
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
{\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