X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=protocol%2Famcp%2FAMCPCommandsImpl.cpp;h=11b6032816fb479fd11aa5c2e8a58fa85bdd5fa1;hb=d100d17e81ed61c7638b681989cfdab5276430db;hp=a412e806f6374eeb44a71ebc2a5688502b9f0120;hpb=ca1389095f5853d240f98ca3babd0c6ae419fd42;p=casparcg diff --git a/protocol/amcp/AMCPCommandsImpl.cpp b/protocol/amcp/AMCPCommandsImpl.cpp index a412e806f..11b603281 100644 --- a/protocol/amcp/AMCPCommandsImpl.cpp +++ b/protocol/amcp/AMCPCommandsImpl.cpp @@ -23,18 +23,17 @@ #include "AMCPCommandsImpl.h" #include "AMCPProtocolStrategy.h" -#include "../media.h" - #include #include #include -#include +#include +#include +#include #include -#include -#include -#include +#include +#include #include #include @@ -46,6 +45,7 @@ #include #include #include +#include #if defined(_MSC_VER) #pragma warning (push, 1) // TODO: Legacy code, just disable warnings @@ -164,7 +164,7 @@ void AMCPCommand::SendReply() void AMCPCommand::Clear() { - pChannel_->producer().clear(); + pChannel_->producer()->clear(); pClientInfo_.reset(); channelIndex_ = 0; _parameters.clear(); @@ -179,67 +179,155 @@ bool MixerCommand::DoExecute() { if(_parameters[1] == L"OPACITY") { + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[3], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[4] : L"linear"; + double value = boost::lexical_cast(_parameters.at(2)); - auto transform = GetChannel()->mixer().get_image_transform(GetLayerIndex()); - transform.set_opacity(value); - GetChannel()->mixer().set_image_transform(GetLayerIndex(), std::move(transform)); + + auto transform = [=](image_transform transform) -> image_transform + { + transform.set_opacity(value); + return transform; + }; + + int layer = GetLayerIndex(std::numeric_limits::min()); + if(layer != std::numeric_limits::min()) + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + else + GetChannel()->mixer()->apply_image_transform(transform, duration, tween); } else if(_parameters[1] == L"GAIN") { + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[3], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[4] : L"linear"; double value = boost::lexical_cast(_parameters.at(2)); - auto transform = GetChannel()->mixer().get_image_transform(GetLayerIndex()); - transform.set_gain(value); - GetChannel()->mixer().set_image_transform(GetLayerIndex(), std::move(transform)); + + auto transform = [=](image_transform transform) -> image_transform + { + transform.set_gain(value); + return transform; + }; + + int layer = GetLayerIndex(std::numeric_limits::min()); + if(layer != std::numeric_limits::min()) + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + else + GetChannel()->mixer()->apply_image_transform(transform, duration, tween); } - else if(_parameters[1] == L"FIX_RECT") + else if(_parameters[1] == L"FILL_RECT") { + int duration = _parameters.size() > 5 ? lexical_cast_or_default(_parameters[6], 0) : 0; + std::wstring tween = _parameters.size() > 6 ? _parameters[7] : L"linear"; double x = boost::lexical_cast(_parameters.at(2)); double y = boost::lexical_cast(_parameters.at(3)); double x_s = boost::lexical_cast(_parameters.at(4)); double y_s = boost::lexical_cast(_parameters.at(5)); - auto transform = GetChannel()->mixer().get_image_transform(GetLayerIndex()); - transform.set_image_translation(x, y); - transform.set_image_scale(x_s, y_s); - transform.set_mask_translation(0.0, 0.0); - transform.set_mask_scale(1.0, 1.0); - GetChannel()->mixer().set_image_transform(GetLayerIndex(), std::move(transform)); + + auto transform = [=](image_transform transform) -> image_transform + { + transform.set_fill_translation(x, y); + transform.set_fill_scale(x_s, y_s); + transform.set_key_translation(x, y); + transform.set_key_scale(x_s, y_s); + return transform; + }; + + int layer = GetLayerIndex(std::numeric_limits::min()); + if(layer != std::numeric_limits::min()) + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + else + GetChannel()->mixer()->apply_image_transform(transform, duration, tween); } - else if(_parameters[1] == L"CLIP_RECT") + else if(_parameters[1] == L"KEY_RECT") { + int duration = _parameters.size() > 5 ? lexical_cast_or_default(_parameters[6], 0) : 0; + std::wstring tween = _parameters.size() > 6 ? _parameters[7] : L"linear"; double x = boost::lexical_cast(_parameters.at(2)); double y = boost::lexical_cast(_parameters.at(3)); double x_s = boost::lexical_cast(_parameters.at(4)); double y_s = boost::lexical_cast(_parameters.at(5)); - auto transform = GetChannel()->mixer().get_image_transform(GetLayerIndex()); - transform.set_image_translation(0.0, 0.0); - transform.set_image_scale(1.0, 1.0); - transform.set_mask_translation(x, y); - transform.set_mask_scale(x_s, y_s); - GetChannel()->mixer().set_image_transform(GetLayerIndex(), std::move(transform)); + + auto transform = [=](image_transform transform) -> image_transform + { + transform.set_key_translation(x, y); + transform.set_key_scale(x_s, y_s); + return transform; + }; + + int layer = GetLayerIndex(std::numeric_limits::min()); + if(layer != std::numeric_limits::min()) + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + else + GetChannel()->mixer()->apply_image_transform(transform, duration, tween); + } + else if(_parameters[1] == L"GRID") + { + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[3], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[4] : L"linear"; + int n = boost::lexical_cast(_parameters.at(2)); + double delta = 1.0/static_cast(n); + for(int x = 0; x < n; ++x) + { + for(int y = 0; y < n; ++y) + { + int index = x+y*n+1; + auto transform = [=](image_transform transform) -> image_transform + { + transform.set_fill_translation(x*delta, y*delta); + transform.set_fill_scale(delta, delta); + transform.set_key_translation(x*delta, y*delta); + transform.set_key_scale(delta, delta); + return transform; + }; + GetChannel()->mixer()->apply_image_transform(index, transform, duration, tween); + } + } } else if(_parameters[1] == L"RESET") { - GetChannel()->mixer().set_image_transform(GetLayerIndex(), image_transform()); + int duration = _parameters.size() > 1 ? lexical_cast_or_default(_parameters[2], 0) : 0; + std::wstring tween = _parameters.size() > 2 ? _parameters[3] : L"linear"; + + int layer = GetLayerIndex(std::numeric_limits::min()); + if(layer != std::numeric_limits::min()) + GetChannel()->mixer()->reset_image_transform(GetLayerIndex(), duration, tween); + else + GetChannel()->mixer()->reset_image_transform(duration, tween); } } else if(_parameters[0] == L"AUDIO") { if(_parameters[1] == L"GAIN") { + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[3], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[4] : L"linear"; double value = boost::lexical_cast(_parameters[2]); - auto transform = GetChannel()->mixer().get_audio_transform(GetLayerIndex()); - transform.set_gain(value); - GetChannel()->mixer().set_audio_transform(GetLayerIndex(), std::move(transform)); + + auto transform = [=](audio_transform transform) -> audio_transform + { + transform.set_gain(value); + return transform; + }; + + int layer = GetLayerIndex(std::numeric_limits::min()); + if(layer != std::numeric_limits::min()) + GetChannel()->mixer()->apply_audio_transform(GetLayerIndex(), transform, duration, tween); + else + GetChannel()->mixer()->apply_audio_transform(transform, duration, tween); } else if(_parameters[1] == L"RESET") { - GetChannel()->mixer().set_audio_transform(GetLayerIndex(), audio_transform()); + int duration = _parameters.size() > 1 ? lexical_cast_or_default(_parameters[2], 0) : 0; + std::wstring tween = _parameters.size() > 2 ? _parameters[3] : L"linear"; + GetChannel()->mixer()->reset_audio_transform(duration, tween); } } else if(_parameters[0] == L"RESET") { - GetChannel()->mixer().set_image_transform(GetLayerIndex(), image_transform()); - GetChannel()->mixer().set_audio_transform(GetLayerIndex(), audio_transform()); + int duration = _parameters.size() > 1 ? lexical_cast_or_default(_parameters[2], 0) : 0; + std::wstring tween = _parameters.size() > 2 ? _parameters[3] : L"linear"; + GetChannel()->mixer()->reset_image_transform(duration, tween); + GetChannel()->mixer()->reset_audio_transform(duration, tween); } SetReplyString(TEXT("202 MIXER OK\r\n")); @@ -276,13 +364,13 @@ bool SwapCommand::DoExecute() int l1 = GetLayerIndex(); int l2 = boost::lexical_cast(strs.at(1)); - ch1->producer().swap_layer(l1, l2, ch2->producer()); + ch1->producer()->swap_layer(l1, l2, *ch2->producer()); } else { auto ch1 = GetChannel(); auto ch2 = GetChannels().at(boost::lexical_cast(_parameters[0])-1); - ch1->producer().swap_output(ch2->producer()); + ch1->producer()->swap(*ch2->producer()); } CASPAR_LOG(info) << "Swapped successfully"; @@ -310,7 +398,7 @@ bool AddCommand::DoExecute() //Perform loading of the clip try { - GetChannel()->consumer().add(GetLayerIndex(), create_consumer(_parameters)); + GetChannel()->consumer()->add(GetLayerIndex(), create_consumer(_parameters)); CASPAR_LOG(info) << "Added " << _parameters[0] << TEXT(" successfully"); @@ -337,9 +425,7 @@ bool RemoveCommand::DoExecute() //Perform loading of the clip try { - GetChannel()->consumer().remove(GetLayerIndex()); - - CASPAR_LOG(info) << "Removed " << TEXT(" successfully"); + GetChannel()->consumer()->remove(GetLayerIndex()); SetReplyString(TEXT("202 REMOVE OK\r\n")); @@ -365,8 +451,8 @@ bool LoadCommand::DoExecute() try { _parameters[0] = _parameters[0]; - auto pFP = create_producer(_parameters); - GetChannel()->producer().preview(GetLayerIndex(), pFP); + auto pFP = create_producer(GetChannel()->mixer(), _parameters); + GetChannel()->producer()->load(GetLayerIndex(), pFP, true); CASPAR_LOG(info) << "Loaded " << _parameters[0] << TEXT(" successfully"); @@ -388,65 +474,97 @@ bool LoadCommand::DoExecute() } } + + +//std::function channel_cg_add_command::parse(const std::wstring& message, const std::vector& channels) +//{ +// static boost::wregex expr(L"^CG\\s(?\\d+)-?(?\\d+)?\\sADD\\s(?\\d+)\\s(?