boost::fusion::map<boost::fusion::pair<core::image_transform, image_transforms>,\r
boost::fusion::pair<core::audio_transform, audio_transforms>> transforms_;\r
\r
- boost::fusion::map<boost::fusion::pair<core::image_transform, tweened_transform<core::image_transform>>,\r
- boost::fusion::pair<core::audio_transform, tweened_transform<core::audio_transform>>> root_transforms_;\r
public:\r
implementation(video_channel_context& video_channel) \r
: channel_(video_channel)\r
{\r
channel_.execution().invoke([&]\r
{\r
- set_transform(image_transform(), 0, L"none");\r
- set_transform(audio_transform(), 0, L"none");\r
-\r
boost::fusion::at_key<image_transform>(transforms_).clear();\r
boost::fusion::at_key<audio_transform>(transforms_).clear();\r
});\r
}\r
- \r
- template<typename T> \r
- void set_transform(const T& transform, unsigned int mix_duration, const std::wstring& tween)\r
- {\r
- channel_.execution().invoke([&]\r
- {\r
- auto& root = boost::fusion::at_key<T>(root_transforms_);\r
-\r
- auto src = root.fetch();\r
- auto dst = transform;\r
- root = tweened_transform<T>(src, dst, mix_duration, tween);\r
- });\r
- }\r
\r
template<typename T>\r
void set_transform(int index, const T& transform, unsigned int mix_duration, const std::wstring& tween)\r
transforms[index] = tweened_transform<T>(src, dst, mix_duration, tween);\r
});\r
}\r
- \r
- template<typename T>\r
- void apply_transform(const std::function<T(const T&)>& transform, unsigned int mix_duration, const std::wstring& tween)\r
- {\r
- return channel_.execution().invoke([&]\r
- {\r
- auto& root = boost::fusion::at_key<T>(root_transforms_);\r
-\r
- auto src = root.fetch();\r
- auto dst = transform(src);\r
- root = tweened_transform<T>(src, dst, mix_duration, tween);\r
- });\r
- }\r
- \r
+ \r
template<typename T>\r
void apply_transform(int index, const std::function<T(T)>& transform, unsigned int mix_duration, const std::wstring& tween)\r
{\r
\r
safe_ptr<host_buffer> mix_image(std::map<int, safe_ptr<core::basic_frame>> frames)\r
{ \r
- auto& root_image_transform = boost::fusion::at_key<core::image_transform>(root_transforms_);\r
auto& image_transforms = boost::fusion::at_key<core::image_transform>(transforms_);\r
\r
BOOST_FOREACH(auto& frame, frames)\r
auto frame1 = make_safe<core::basic_frame>(frame.second);\r
auto frame2 = make_safe<core::basic_frame>(frame.second);\r
\r
- frame1->get_image_transform() = root_image_transform.fetch_and_tick(1)*image_transforms[frame.first].fetch_and_tick(1);\r
- frame2->get_image_transform() = root_image_transform.fetch_and_tick(1)*image_transforms[frame.first].fetch_and_tick(1);\r
+ frame1->get_image_transform() = image_transforms[frame.first].fetch_and_tick(1);\r
+ frame2->get_image_transform() = image_transforms[frame.first].fetch_and_tick(1);\r
\r
if(frame1->get_image_transform() != frame2->get_image_transform())\r
core::basic_frame::interlace(frame1, frame2, channel_.get_format_desc().mode)->accept(image_mixer_);\r
else\r
{\r
auto frame1 = make_safe<core::basic_frame>(frame.second);\r
- frame1->get_image_transform() = root_image_transform.fetch_and_tick(1)*image_transforms[frame.first].fetch_and_tick(1);\r
+ frame1->get_image_transform() = image_transforms[frame.first].fetch_and_tick(1);\r
frame1->accept(image_mixer_);\r
}\r
\r
\r
std::vector<int16_t> mix_audio(const std::map<int, safe_ptr<core::basic_frame>>& frames)\r
{\r
- auto& root_audio_transform = boost::fusion::at_key<core::audio_transform>(root_transforms_);\r
auto& audio_transforms = boost::fusion::at_key<core::audio_transform>(transforms_);\r
\r
BOOST_FOREACH(auto& frame, frames)\r
const unsigned int num = channel_.get_format_desc().mode == core::video_mode::progressive ? 1 : 2;\r
\r
auto frame1 = make_safe<core::basic_frame>(frame.second);\r
- frame1->get_audio_transform() = root_audio_transform.fetch_and_tick(num)*audio_transforms[frame.first].fetch_and_tick(num);\r
+ frame1->get_audio_transform() = audio_transforms[frame.first].fetch_and_tick(num);\r
frame1->accept(audio_mixer_);\r
}\r
\r
return create_frame(tag, desc);\r
}\r
void mixer::reset_transforms(){impl_->reset_transforms();}\r
-void mixer::set_image_transform(const core::image_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform<core::image_transform>(transform, mix_duration, tween);}\r
void mixer::set_image_transform(int index, const core::image_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform<core::image_transform>(index, transform, mix_duration, tween);}\r
-void mixer::set_audio_transform(const core::audio_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform<core::audio_transform>(transform, mix_duration, tween);}\r
void mixer::set_audio_transform(int index, const core::audio_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform<core::audio_transform>(index, transform, mix_duration, tween);}\r
-void mixer::apply_image_transform(const std::function<core::image_transform(core::image_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform<core::image_transform>(transform, mix_duration, tween);}\r
void mixer::apply_image_transform(int index, const std::function<core::image_transform(core::image_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform<core::image_transform>(index, transform, mix_duration, tween);}\r
-void mixer::apply_audio_transform(const std::function<core::audio_transform(core::audio_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform<core::audio_transform>(transform, mix_duration, tween);}\r
void mixer::apply_audio_transform(int index, const std::function<core::audio_transform(core::audio_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform<core::audio_transform>(index, transform, mix_duration, tween);}\r
\r
}}
\ No newline at end of file
\r
void reset_transforms();\r
\r
- void set_image_transform(const core::image_transform& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
void set_image_transform(int index, const core::image_transform& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
-\r
- void set_audio_transform(const core::audio_transform& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
void set_audio_transform(int index, const core::audio_transform& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
- \r
- void apply_image_transform(const std::function<core::image_transform(core::image_transform)>& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
void apply_image_transform(int index, const std::function<core::image_transform(core::image_transform)>& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
-\r
- void apply_audio_transform(const std::function<core::audio_transform(core::audio_transform)>& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
void apply_audio_transform(int index, const std::function<core::audio_transform(core::audio_transform)>& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
\r
private:\r
return transform; \r
};\r
\r
- int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
- if(layer != std::numeric_limits<int>::min()) \r
- GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, 0);\r
- else\r
- GetChannel()->mixer()->apply_image_transform(transform, 0);\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform);\r
}\r
else if(_parameters[1] == L"OPACITY")\r
{\r
return transform; \r
};\r
\r
- int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
- if(layer != std::numeric_limits<int>::min()) \r
- GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
- else\r
- GetChannel()->mixer()->apply_image_transform(transform, duration, tween);\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
}\r
else if(_parameters[1] == L"GAIN")\r
{\r
return transform; \r
};\r
\r
- int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
- if(layer != std::numeric_limits<int>::min())\r
- GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
- else\r
- GetChannel()->mixer()->apply_image_transform(transform, duration, tween);\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
}\r
else if(_parameters[1] == L"FILL_RECT")\r
{\r
transform.set_clip_scale(x_s, y_s);\r
return transform;\r
};\r
-\r
- int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
- if(layer != std::numeric_limits<int>::min())\r
- GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
- else\r
- GetChannel()->mixer()->apply_image_transform(transform, duration, tween);\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
}\r
else if(_parameters[1] == L"CLIP_RECT")\r
{\r
transform.set_clip_scale(x_s, y_s);\r
return transform;\r
};\r
-\r
- int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
- if(layer != std::numeric_limits<int>::min())\r
- GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
- else\r
- GetChannel()->mixer()->apply_image_transform(transform, duration, tween);\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
}\r
else if(_parameters[1] == L"GRID")\r
{\r
return transform;\r
};\r
\r
- int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
- if(layer != std::numeric_limits<int>::min())\r
- GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, 0);\r
- else\r
- GetChannel()->mixer()->apply_image_transform(transform, 0); \r
-\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, 0); \r
}\r
else if(_parameters[1] == L"RESET")\r
{\r
int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\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(), image_transform(), duration, tween);\r
- else\r
- GetChannel()->mixer()->set_image_transform(image_transform(), duration, tween);\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->set_image_transform(GetLayerIndex(), image_transform(), duration, tween);\r
}\r
}\r
else if(_parameters[0] == L"AUDIO")\r
return transform;\r
};\r
\r
- int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
- if(layer != std::numeric_limits<int>::min())\r
- GetChannel()->mixer()->apply_audio_transform(GetLayerIndex(), transform, duration, tween);\r
- else\r
- GetChannel()->mixer()->apply_audio_transform(transform, duration, tween);\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_audio_transform(GetLayerIndex(), transform, duration, tween);\r
}\r
else if(_parameters[1] == L"RESET")\r
{\r
int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
- int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
- if(layer != std::numeric_limits<int>::min())\r
- GetChannel()->mixer()->set_audio_transform(GetLayerIndex(), audio_transform(), duration, tween);\r
- else \r
- GetChannel()->mixer()->set_audio_transform(audio_transform(), duration, tween);\r
+\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->set_audio_transform(GetLayerIndex(), audio_transform(), duration, tween);\r
}\r
}\r
else if(_parameters[0] == L"RESET")\r
- {\r
- int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
- std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
- GetChannel()->mixer()->set_image_transform(image_transform(), duration, tween);\r
- GetChannel()->mixer()->set_audio_transform(audio_transform(), duration, tween);\r
- }\r
- else if(_parameters[0] == L"CLEAR")\r
{\r
GetChannel()->mixer()->reset_transforms();\r
}\r