+bool DiagnosticsCommand::DoExecute()\r
+{ \r
+ try\r
+ {\r
+ diagnostics::show_graphs(true);\r
+\r
+ SetReplyString(TEXT("202 DIAG OK\r\n"));\r
+\r
+ return true;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("502 DIAG FAILED\r\n"));\r
+ return false;\r
+ }\r
+}\r
+\r
+bool CallCommand::DoExecute()\r
+{ \r
+ //Perform loading of the clip\r
+ try\r
+ {\r
+ auto what = _parameters.at(0);\r
+\r
+ std::wstring param = _parameters2.at(1);\r
+ for(auto it = std::begin(_parameters2)+2; it != std::end(_parameters2); ++it)\r
+ param += L" " + *it;\r
+ \r
+ boost::unique_future<std::wstring> result;\r
+ if(what == L"B")\r
+ result = GetChannel()->stage()->call(GetLayerIndex(), false, param);\r
+ else if(what == L"F")\r
+ result = GetChannel()->stage()->call(GetLayerIndex(), true, param);\r
+ else\r
+ result = GetChannel()->stage()->call(GetLayerIndex(), true, _parameters.at(0) + L" " + param);\r
+ \r
+ if(!result.timed_wait(boost::posix_time::seconds(2)))\r
+ BOOST_THROW_EXCEPTION(timed_out());\r
+\r
+ CASPAR_LOG(info) << "Executed call: " << _parameters[0] << TEXT(" successfully");\r
+ \r
+ std::wstringstream replyString;\r
+ replyString << TEXT("201 CALL OK\r\n") << result.get() << L"\r\n";\r
+ \r
+ SetReplyString(replyString.str());\r
+\r
+ return true;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("502 CALL FAILED\r\n"));\r
+ return false;\r
+ }\r
+}\r
+\r
+bool MixerCommand::DoExecute()\r
+{ \r
+ //Perform loading of the clip\r
+ try\r
+ { \r
+ if(_parameters[0] == L"KEYER" || _parameters[0] == L"IS_KEY")\r
+ {\r
+ bool value = lexical_cast_or_default(_parameters.at(1), false);\r
+ auto transform = [=](frame_transform transform) -> frame_transform\r
+ {\r
+ transform.is_key = value;\r
+ return transform; \r
+ };\r
+\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_frame_transform(GetLayerIndex(), transform);\r
+ }\r
+ else if(_parameters[0] == L"OPACITY")\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
+ double value = boost::lexical_cast<double>(_parameters.at(1));\r
+ \r
+ auto transform = [=](frame_transform transform) -> frame_transform\r
+ {\r
+ transform.opacity = value;\r
+ return transform; \r
+ };\r
+\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_frame_transform(GetLayerIndex(), transform, duration, tween);\r
+ }\r
+ else if(_parameters[0] == L"FILL" || _parameters[0] == L"FILL_RECT")\r
+ {\r
+ int duration = _parameters.size() > 5 ? lexical_cast_or_default(_parameters[5], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 6 ? _parameters[6] : L"linear";\r
+ double x = boost::lexical_cast<double>(_parameters.at(1));\r
+ double y = boost::lexical_cast<double>(_parameters.at(2));\r
+ double x_s = boost::lexical_cast<double>(_parameters.at(3));\r
+ double y_s = boost::lexical_cast<double>(_parameters.at(4));\r
+\r
+ auto transform = [=](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
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_frame_transform(GetLayerIndex(), transform, duration, tween);\r
+ }\r
+ else if(_parameters[0] == L"CLIP" || _parameters[0] == L"CLIP_RECT")\r
+ {\r
+ int duration = _parameters.size() > 5 ? lexical_cast_or_default(_parameters[5], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 6 ? _parameters[6] : L"linear";\r
+ double x = boost::lexical_cast<double>(_parameters.at(1));\r
+ double y = boost::lexical_cast<double>(_parameters.at(2));\r
+ double x_s = boost::lexical_cast<double>(_parameters.at(3));\r
+ double y_s = boost::lexical_cast<double>(_parameters.at(4));\r
+\r
+ auto transform = [=](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
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_frame_transform(GetLayerIndex(), transform, duration, tween);\r
+ }\r
+ else if(_parameters[0] == L"GRID")\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 n = boost::lexical_cast<int>(_parameters.at(1));\r
+ double delta = 1.0/static_cast<double>(n);\r
+ for(int x = 0; x < n; ++x)\r
+ {\r
+ for(int y = 0; y < n; ++y)\r
+ {\r
+ 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
+ return transform;\r
+ };\r
+ GetChannel()->mixer()->apply_frame_transform(index, transform, duration, tween);\r
+ }\r
+ }\r
+ }\r
+ else if(_parameters[0] == L"BLEND")\r
+ {\r
+ auto blend_str = _parameters.at(1); \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->set_blend_mode(GetLayerIndex(), get_blend_mode(blend_str)); \r
+ }\r
+ else if(_parameters[0] == L"BRIGHTNESS")\r
+ {\r
+ auto value = boost::lexical_cast<double>(_parameters.at(1));\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
+ auto transform = [=](frame_transform transform) -> frame_transform\r
+ {\r
+ transform.brightness = value;\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_frame_transform(GetLayerIndex(), transform, duration, tween); \r
+ }\r
+ else if(_parameters[0] == L"SATURATION")\r
+ {\r
+ auto value = boost::lexical_cast<double>(_parameters.at(1));\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
+ auto transform = [=](frame_transform transform) -> frame_transform\r
+ {\r
+ transform.saturation = value;\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_frame_transform(GetLayerIndex(), transform, duration, tween); \r
+ }\r
+ else if(_parameters[0] == L"CONTRAST")\r
+ {\r
+ auto value = boost::lexical_cast<double>(_parameters.at(1));\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
+ auto transform = [=](frame_transform transform) -> frame_transform\r
+ {\r
+ transform.contrast = value;\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_frame_transform(GetLayerIndex(), transform, duration, tween); \r
+ }\r
+ else if(_parameters[0] == L"LEVELS")\r
+ {\r
+ levels value;\r
+ value.min_input = boost::lexical_cast<double>(_parameters.at(1));\r
+ value.max_input = boost::lexical_cast<double>(_parameters.at(2));\r
+ value.gamma = boost::lexical_cast<double>(_parameters.at(3));\r
+ value.min_output = boost::lexical_cast<double>(_parameters.at(4));\r
+ value.max_output = boost::lexical_cast<double>(_parameters.at(5));\r
+ int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear";\r
+\r
+ auto transform = [=](frame_transform transform) -> frame_transform\r
+ {\r
+ transform.levels = value;\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_frame_transform(GetLayerIndex(), transform, duration, tween); \r
+ }\r
+ else if(_parameters[0] == L"VOLUME")\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
+ double value = boost::lexical_cast<double>(_parameters[1]);\r
+\r
+ auto transform = [=](frame_transform transform) -> frame_transform\r
+ {\r
+ transform.volume = value;\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_frame_transform(GetLayerIndex(), transform, duration, tween);\r
+ }\r
+ else if(_parameters[0] == L"CLEAR")\r
+ {\r
+ int layer = GetLayerIndex(std::numeric_limits<int>::max());\r
+ if(layer == std::numeric_limits<int>::max())\r
+ GetChannel()->mixer()->clear_transforms();\r
+ else\r
+ GetChannel()->mixer()->clear_transforms(layer);\r
+ }\r
+ else\r
+ {\r
+ SetReplyString(TEXT("404 MIXER ERROR\r\n"));\r
+ return false;\r
+ }\r
+ \r
+ SetReplyString(TEXT("202 MIXER OK\r\n"));\r
+\r
+ return true;\r
+ }\r
+ catch(file_not_found&)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("404 MIXER ERROR\r\n"));\r
+ return false;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("502 MIXER FAILED\r\n"));\r
+ return false;\r
+ }\r
+}\r
+\r
+bool SwapCommand::DoExecute()\r
+{ \r
+ //Perform loading of the clip\r
+ try\r
+ {\r
+ if(GetLayerIndex(-1) != -1)\r
+ {\r
+ std::vector<std::string> strs;\r
+ boost::split(strs, _parameters[0], boost::is_any_of("-"));\r
+ \r
+ auto ch1 = GetChannel();\r
+ auto ch2 = GetChannels().at(boost::lexical_cast<int>(strs.at(0))-1);\r
+\r
+ int l1 = GetLayerIndex();\r
+ int l2 = boost::lexical_cast<int>(strs.at(1));\r
+\r
+ ch1->stage()->swap_layer(l1, l2, *ch2->stage());\r
+ }\r
+ else\r
+ {\r
+ auto ch1 = GetChannel();\r
+ auto ch2 = GetChannels().at(boost::lexical_cast<int>(_parameters[0])-1);\r
+ ch1->stage()->swap(*ch2->stage());\r
+ }\r
+\r
+ CASPAR_LOG(info) << "Swapped successfully";\r
+\r
+ SetReplyString(TEXT("202 SWAP OK\r\n"));\r
+\r
+ return true;\r
+ }\r
+ catch(file_not_found&)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("404 SWAP ERROR\r\n"));\r
+ return false;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("502 SWAP FAILED\r\n"));\r
+ return false;\r
+ }\r
+}\r
+\r