]> git.sesse.net Git - casparcg/blobdiff - protocol/amcp/AMCPCommandsImpl.cpp
2.1.0: -Fixed ffmpeg input crash. -Log throwing call-stack.
[casparcg] / protocol / amcp / AMCPCommandsImpl.cpp
index 92fb6ba46cbec2ac85ff178fb29b274e7eb19067..3081237de6e53f6e699035f748aaa90d0487042f 100644 (file)
@@ -44,6 +44,7 @@
 #include <core/mixer/mixer.h>\r
 #include <core/consumer/output.h>\r
 \r
+#include <modules/reroute/producer/reroute_producer.h>\r
 #include <modules/bluefish/bluefish.h>\r
 #include <modules/decklink/decklink.h>\r
 #include <modules/ffmpeg/ffmpeg.h>\r
@@ -186,7 +187,7 @@ std::wstring ListTemplates()
 \r
 namespace amcp {\r
        \r
-AMCPCommand::AMCPCommand() : channelIndex_(0), scheduling_(Default), layerIndex_(-1)\r
+AMCPCommand::AMCPCommand() : channelIndex_(0), layerIndex_(-1)\r
 {}\r
 \r
 void AMCPCommand::SendReply()\r
@@ -227,52 +228,54 @@ bool DiagnosticsCommand::DoExecute()
 \r
 bool ChannelGridCommand::DoExecute()\r
 {\r
-       int index = 1;\r
-       auto self = GetChannels().back();\r
-       \r
-       std::vector<std::wstring> params;\r
-       params.push_back(L"SCREEN");\r
-       params.push_back(L"NAME");\r
-       params.push_back(L"Channel Grid Window");\r
-       auto screen = create_consumer(params);\r
-\r
-       self->output().add(screen);\r
-\r
-       BOOST_FOREACH(auto channel, GetChannels())\r
-       {\r
-               if(channel != self)\r
-               {\r
-                       auto producer = reroute::create_producer(self->frame_factory(), *channel);              \r
-                       self->stage().load(index, producer, false);\r
-                       self->stage().play(index);\r
-                       index++;\r
-               }\r
-       }\r
-\r
-       int n = GetChannels().size()-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.image_transform.fill_translation[0]   = x*delta;\r
-                               transform.image_transform.fill_translation[1]   = y*delta;\r
-                               transform.image_transform.fill_scale[0]                 = delta;\r
-                               transform.image_transform.fill_scale[1]                 = delta;\r
-                               transform.image_transform.clip_translation[0]   = x*delta;\r
-                               transform.image_transform.clip_translation[1]   = y*delta;\r
-                               transform.image_transform.clip_scale[0]                 = delta;\r
-                               transform.image_transform.clip_scale[1]                 = delta;                        \r
-                               return transform;\r
-                       };\r
-                       self->stage().apply_transform(index, transform);\r
-               }\r
-       }\r
-\r
-       return true;\r
+       CASPAR_THROW_EXCEPTION(not_implemented());\r
+\r
+       //int index = 1;\r
+       //auto self = GetChannels().back();\r
+       //\r
+       //std::vector<std::wstring> params;\r
+       //params.push_back(L"SCREEN");\r
+       //params.push_back(L"NAME");\r
+       //params.push_back(L"Channel Grid Window");\r
+       //auto screen = create_consumer(params);\r
+\r
+       //self->output().add(screen);\r
+\r
+       //BOOST_FOREACH(auto channel, GetChannels())\r
+       //{\r
+       //      if(channel != self)\r
+       //      {\r
+       //              auto producer = reroute::create_producer(self->frame_factory(), *channel);              \r
+       //              self->stage().load(index, producer, false);\r
+       //              self->stage().play(index);\r
+       //              index++;\r
+       //      }\r
+       //}\r
+\r
+       //int n = GetChannels().size()-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.image_transform.fill_translation[0]   = x*delta;\r
+       //                      transform.image_transform.fill_translation[1]   = y*delta;\r
+       //                      transform.image_transform.fill_scale[0]                 = delta;\r
+       //                      transform.image_transform.fill_scale[1]                 = delta;\r
+       //                      transform.image_transform.clip_translation[0]   = x*delta;\r
+       //                      transform.image_transform.clip_translation[1]   = y*delta;\r
+       //                      transform.image_transform.clip_scale[0]                 = delta;\r
+       //                      transform.image_transform.clip_scale[1]                 = delta;                        \r
+       //                      return transform;\r
+       //              };\r
+       //              self->stage().apply_transform(index, transform);\r
+       //      }\r
+       //}\r
+\r
+       //return true;\r
 }\r
 \r
 bool CallCommand::DoExecute()\r
@@ -286,12 +289,10 @@ bool CallCommand::DoExecute()
                for(auto it = std::begin(_parameters2); it != std::end(_parameters2); ++it, param += L" ")\r
                        param += *it;\r
 \r
-               auto producer = GetChannel()->stage().foreground(GetLayerIndex()).get();\r
-\r
-               auto result = producer->call(boost::trim_copy(param));\r
-\r
+               auto result = GetChannel()->stage().call(GetLayerIndex(), boost::trim_copy(param));\r
+               \r
                if(!result.timed_wait(boost::posix_time::seconds(2)))\r
-                       BOOST_THROW_EXCEPTION(timed_out());\r
+                       CASPAR_THROW_EXCEPTION(timed_out());\r
                                \r
                std::wstringstream replyString;\r
                if(result.get().empty())\r
@@ -674,7 +675,7 @@ bool LoadCommand::DoExecute()
 //     {       \r
 //             std::wstring fullFilename = flash::flash_producer::find_template(server::template_folder() + templatename);\r
 //             if(fullFilename.empty())\r
-//                     BOOST_THROW_EXCEPTION(file_not_found());\r
+//                     CASPAR_THROW_EXCEPTION(file_not_found());\r
 //     \r
 //             std::wstring extension = boost::filesystem::wpath(fullFilename).extension();\r
 //             std::wstring filename = templatename;\r
@@ -733,19 +734,31 @@ bool LoadbgCommand::DoExecute()
        //Perform loading of the clip\r
        try\r
        {\r
-               _parameters[0] = _parameters[0];\r
-               auto pFP = create_producer(GetChannel()->frame_factory(), GetChannel()->video_format_desc(), _parameters);\r
+               std::shared_ptr<core::frame_producer> pFP;\r
+               \r
+               static boost::wregex expr(L"\\[(?<CHANNEL>\\d+)\\]", boost::regex::icase);\r
+                       \r
+               boost::wsmatch what;\r
+               if(boost::regex_match(_parameters.at(0), what, expr))\r
+               {\r
+                       auto channel_index = boost::lexical_cast<int>(what["CHANNEL"].str());\r
+                       pFP = reroute::create_producer(*GetChannels().at(channel_index-1)); \r
+               }\r
+               else\r
+                       pFP = create_producer(GetChannel()->frame_factory(), GetChannel()->video_format_desc(), _parameters);\r
+               \r
                if(pFP == frame_producer::empty())\r
-                       BOOST_THROW_EXCEPTION(file_not_found() << msg_info(_parameters.size() > 0 ? _parameters[0] : L""));\r
+                       CASPAR_THROW_EXCEPTION(file_not_found() << msg_info(_parameters.size() > 0 ? _parameters[0] : L""));\r
 \r
                bool auto_play = std::find(_parameters.begin(), _parameters.end(), L"AUTO") != _parameters.end();\r
 \r
-               auto pFP2 = create_transition_producer(GetChannel()->video_format_desc().field_mode, pFP, transitionInfo);\r
+               auto pFP2 = create_transition_producer(GetChannel()->video_format_desc().field_mode, spl::make_shared_ptr(pFP), transitionInfo);\r
                if(auto_play)\r
                        GetChannel()->stage().load(GetLayerIndex(), pFP2, false, transitionInfo.duration); // TODO: LOOP\r
                else\r
                        GetChannel()->stage().load(GetLayerIndex(), pFP2, false); // TODO: LOOP\r
        \r
+               \r
                SetReplyString(TEXT("202 LOADBG OK\r\n"));\r
 \r
                return true;\r
@@ -791,6 +804,7 @@ bool PlayCommand::DoExecute()
                {\r
                        LoadbgCommand lbg;\r
                        lbg.SetChannel(GetChannel());\r
+                       lbg.SetChannels(GetChannels());\r
                        lbg.SetChannelIndex(GetChannelIndex());\r
                        lbg.SetLayerIntex(GetLayerIndex());\r
                        lbg.SetClientInfo(GetClientInfo());\r