<ClInclude Include="utility\base64.h" />\r
<ClInclude Include="utility\iterator.h" />\r
<ClInclude Include="utility\move_on_copy.h" />\r
- <ClInclude Include="utility\param.h" />\r
<ClInclude Include="utility\string.h" />\r
<ClInclude Include="utility\timer.h" />\r
<ClInclude Include="utility\tweener.h" />\r
<ClInclude Include="concurrency\target.h">\r
<Filter>source\concurrency</Filter>\r
</ClInclude>\r
- <ClInclude Include="utility\param.h">\r
- <Filter>source\utility</Filter>\r
- </ClInclude>\r
<ClInclude Include="utility\utf8conv.h">\r
<Filter>source\utility</Filter>\r
</ClInclude>\r
return boost::range::find(params_, parameter) != params_.end();
}
+bool parameters::remove_if_exists(std::wstring const& key)
+{
+ auto iter = boost::range::find(params_, key);
+
+ if (iter == params_.end())
+ return false;
+
+ auto index = iter - params_.begin();
+
+ params_.erase(iter);
+ params_original_.erase(params_original_.begin() + index);
+
+ return true;
+}
+
std::vector<std::wstring> parameters::protocol_split(std::wstring const& s)
{
std::vector<std::wstring> result;
return *it;
}
-std::wstring parameters::get_original() const
+std::wstring parameters::get_original_string() const
{
std::wstring str;
BOOST_FOREACH(auto& param, params_)
#include <vector>
#include <stdint.h>
-namespace caspar {
-
-namespace core {
+namespace caspar { namespace core {
class parameters
{
public:
parameters() {}
- parameters(std::vector<std::wstring> const& params);
+ explicit parameters(std::vector<std::wstring> const& params);
std::vector<std::wstring> const& get_params() const {
return params_;
void to_upper();
bool has(std::wstring const& key) const;
+ bool remove_if_exists(std::wstring const& key);
template<typename C>
typename std::enable_if<!std::is_convertible<C, std::wstring>::value, typename std::decay<C>::type>::type get(std::wstring const& key, C default_value = C()) const
std::wstring get(std::wstring const& key, std::wstring const& default_value = L"") const;
- std::wstring get_original() const;
+ std::wstring get_original_string() const;
std::wstring at_original(size_t i) const;
void set(size_t index, std::wstring const& value);
- // Type conversion operator for compatibiltiy with existing code not yet updated.
- operator std::vector<std::wstring> const& () const
+ const std::vector<std::wstring>& get_original() const
{
- return params_;
+ return params_original_;
}
// Compatibility method though likely to be useful
}
// Compatibility method
- // Used for the upper casing
- //std::wstring& operator [] (size_t i) {
- // return params_[i];
- //}
+ std::wstring& operator [] (size_t i) {
+ return params_[i];
+ }
// Compatibility method
std::vector<std::wstring>::const_iterator begin() const
\r
if(producer == frame_producer::empty())\r
{\r
- std::wstring str = params.get_original();\r
+ std::wstring str = params.get_original_string();\r
BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No match found for supplied commands. Check syntax.") << arg_value_info(narrow(str)));\r
}\r
\r
\r
safe_ptr<core::frame_producer> create_thumbnail_producer(const safe_ptr<frame_factory>& my_frame_factory, const std::wstring& media_file)\r
{\r
- std::vector<std::wstring> params;\r
+ core::parameters params;\r
params.push_back(media_file);\r
\r
auto producer = do_create_producer(my_frame_factory, params, g_thumbnail_factories, true);\r
if(params.size() < 1 || params[0] != L"FILE")\r
return core::frame_consumer::empty();\r
\r
- std::vector<std::wstring> params2 = params;\r
+ auto params2 = params;\r
\r
auto filename = (params2.size() > 1 ? params2[1] : L"");\r
- auto separate_key_it = std::find(params2.begin(), params2.end(), L"SEPARATE_KEY");\r
- bool separate_key = false;\r
+ bool separate_key = params2.remove_if_exists(L"SEPARATE_KEY");\r
\r
- if (separate_key_it != params2.end())\r
- {\r
- separate_key = true;\r
- params2.erase(separate_key_it);\r
- }\r
- \r
std::vector<option> options;\r
\r
- if(params2.size() >= 3)\r
+ if (params2.size() >= 3)\r
{\r
- for(auto opt_it = params2.begin()+2; opt_it != params2.end();)\r
+ for (auto opt_it = params2.begin() + 2; opt_it != params2.end();)\r
{\r
auto name = narrow(boost::trim_copy(boost::to_lower_copy(*opt_it++))).substr(1);\r
+\r
+ if (opt_it == params2.end())\r
+ break;\r
+\r
auto value = narrow(boost::trim_copy(boost::to_lower_copy(*opt_it++)));\r
\r
- if(value == "h264")\r
+ if (value == "h264")\r
value = "libx264";\r
- else if(value == "dvcpro")\r
+ else if (value == "dvcpro")\r
value = "dvvideo";\r
\r
options.push_back(option(name, value));\r
static const std::vector<std::wstring> invalid_exts = boost::assign::list_of\r
(L".png")(L".tga")(L".bmp")(L".jpg")(L".jpeg")(L".gif")(L".tiff")(L".tif")(L".jp2")(L".jpx")(L".j2k")(L".j2c")(L".swf")(L".ct")\r
(L".wav")(L".mp3"); // audio shall not have thumbnails\r
- auto filename = probe_stem(env::media_folder() + L"\\" + params.at(0), invalid_exts);\r
+ auto filename = probe_stem(env::media_folder() + L"\\" + params.at_original(0), invalid_exts);\r
\r
if(filename.empty())\r
return core::frame_producer::empty();\r
\r
safe_ptr<core::frame_producer> create_cg_producer_and_autoplay_file(\r
const safe_ptr<core::frame_factory>& frame_factory, \r
- const std::vector<std::wstring>& params,\r
+ const core::parameters& params,\r
const std::wstring& filename) \r
{\r
if(!boost::filesystem::exists(filename))\r
const safe_ptr<core::frame_factory>& frame_factory,\r
const core::parameters& params) \r
{\r
- return create_cg_producer_and_autoplay_file(frame_factory, params, env::media_folder() + L"\\" + params[0] + L".ct");\r
+ return create_cg_producer_and_autoplay_file(frame_factory, params, env::media_folder() + L"\\" + params.at_original(0) + L".ct");\r
}\r
\r
safe_ptr<core::frame_producer> create_cg_producer(\r
}\r
\r
static const std::vector<std::wstring> extensions = list_of(L"png")(L"tga")(L"bmp")(L"jpg")(L"jpeg")(L"gif")(L"tiff")(L"tif")(L"jp2")(L"jpx")(L"j2k")(L"j2c");\r
- std::wstring filename = env::media_folder() + params[0];\r
+ std::wstring filename = env::media_folder() + params.at_original(0);\r
\r
auto ext = std::find_if(extensions.begin(), extensions.end(), [&](const std::wstring& ex) -> bool\r
{ \r
const safe_ptr<core::frame_factory>& frame_factory,\r
const core::parameters& params)\r
{\r
- static const std::vector<std::wstring> extensions = list_of(L"png")(L"tga")(L"bmp")(L"jpg")(L"jpeg")(L"gif")(L"tiff")(L"tif")(L"jp2")(L"jpx")(L"j2k")(L"j2c");\r
- std::wstring filename = env::media_folder() + L"\\" + params[0];\r
+ static const std::vector<std::wstring> extensions = list_of\r
+ (L"png")(L"tga")(L"bmp")(L"jpg")(L"jpeg")(L"gif")(L"tiff")(L"tif")\r
+ (L"jp2")(L"jpx")(L"j2k")(L"j2c");\r
+ std::wstring filename = env::media_folder() + L"\\" + params.at_original(0);\r
\r
- auto ext = std::find_if(extensions.begin(), extensions.end(), [&](const std::wstring& ex) -> bool\r
- { \r
- return boost::filesystem::is_regular_file(boost::filesystem::wpath(filename).replace_extension(ex));\r
- });\r
+ auto ext = std::find_if(\r
+ extensions.begin(),\r
+ extensions.end(),\r
+ [&](const std::wstring& ex) -> bool\r
+ { \r
+ return boost::filesystem::is_regular_file(\r
+ boost::filesystem::wpath(filename)\r
+ .replace_extension(ex));\r
+ });\r
\r
if(ext == extensions.end())\r
return core::frame_producer::empty();\r
\r
- double speed = 0.0;\r
- double duration = 0.0;\r
- auto speed_it = std::find(params.begin(), params.end(), L"SPEED");\r
- if(speed_it != params.end())\r
- {\r
- if(++speed_it != params.end())\r
- speed = boost::lexical_cast<double>(*speed_it);\r
- }\r
-\r
- if (speed == 0)\r
- {\r
- auto duration_it = std::find(params.begin(), params.end(), L"DURATION");\r
-\r
- if (duration_it != params.end() && ++duration_it != params.end())\r
- {\r
- duration = boost::lexical_cast<double>(*duration_it);\r
- }\r
- }\r
+ double speed = params.get(L"SPEED", 0.0);\r
+ double duration = params.get(L"DURATION", 0.0);\r
\r
if(speed == 0 && duration == 0)\r
return core::frame_producer::empty();\r
\r
- int motion_blur_px = 0;\r
- auto blur_it = std::find(params.begin(), params.end(), L"BLUR");\r
- if (blur_it != params.end() && ++blur_it != params.end())\r
- {\r
- motion_blur_px = boost::lexical_cast<int>(*blur_it);\r
- }\r
-\r
- bool premultiply_with_alpha = std::find(params.begin(), params.end(), L"PREMULTIPLY") != params.end();\r
- bool progressive = std::find(params.begin(), params.end(), L"PROGRESSIVE") != params.end();\r
+ int motion_blur_px = params.get(L"BLUR", 0);\r
+ bool premultiply_with_alpha = params.has(L"PREMULTIPLY");\r
+ bool progressive = params.has(L"PROGRESSIVE");\r
\r
return create_producer_print_proxy(make_safe<image_scroll_producer>(\r
- frame_factory, \r
- filename + L"." + *ext, \r
- -speed, \r
- -duration, \r
- motion_blur_px, \r
- premultiply_with_alpha,\r
- progressive));\r
+ frame_factory, \r
+ filename + L"." + *ext, \r
+ -speed, \r
+ -duration, \r
+ motion_blur_px, \r
+ premultiply_with_alpha,\r
+ progressive));\r
}\r
\r
}}
\ No newline at end of file
configuration config;\r
\r
if(params.size() > 1)\r
- config.screen_index = lexical_cast_or_default<int>(params[1], config.screen_index);\r
+ config.screen_index =\r
+ lexical_cast_or_default<int>(params[1], config.screen_index);\r
\r
- auto device_it = std::find(params.begin(), params.end(), L"DEVICE");\r
- if(device_it != params.end() && ++device_it != params.end())\r
- config.screen_index = boost::lexical_cast<int>(*device_it);\r
- \r
- config.windowed = std::find(params.begin(), params.end(), L"FULLSCREEN") == params.end();\r
- config.key_only = std::find(params.begin(), params.end(), L"KEY_ONLY") != params.end();\r
-\r
- auto name_it = std::find(params.begin(), params.end(), L"NAME");\r
- if(name_it != params.end() && ++name_it != params.end())\r
- config.name = *name_it;\r
+ config.screen_index = params.get(L"DEVICE", config.screen_index);\r
+ config.windowed = !params.has(L"FULLSCREEN");\r
+ config.key_only = params.has(L"KEY_ONLY");\r
+ config.name = params.get(L"NAME", config.name);\r
\r
return make_safe<ogl_consumer_proxy>(config);\r
}\r
\r
#include <boost/algorithm/string.hpp>\r
\r
-namespace caspar {\r
-namespace protocol {\r
-namespace amcp {\r
+namespace caspar { namespace protocol { namespace amcp {\r
\r
enum AMCPCommandScheduling\r
{\r
\r
protected:\r
core::parameters _parameters;\r
- std::vector<std::wstring> _parameters2; // TODO this can be deprecated with a small amount of coding CP 2013-01\r
\r
private:\r
unsigned int channelIndex_;\r
public:\r
virtual bool Execute()\r
{\r
- _parameters2 = _parameters; // TODO Refactor this in terms of the new parameters class CP 2013-01\r
_parameters.to_upper();\r
return (TNeedChannel && !GetChannel()) || _parameters.size() < TMinParameters ? false : DoExecute();\r
}\r
int index = 1;\r
auto self = GetChannels().back();\r
\r
- std::vector<std::wstring> params;\r
+ core::parameters params;\r
params.push_back(L"SCREEN");\r
params.push_back(L"NAME");\r
params.push_back(L"Channel Grid Window");\r
auto what = _parameters.at(0);\r
\r
boost::unique_future<std::wstring> result;\r
+ auto& params_orig = _parameters.get_original();\r
if(what == L"B" || what == L"F")\r
{\r
std::wstring param;\r
- for(auto it = std::begin(_parameters2)+1; it != std::end(_parameters2); ++it, param += L" ")\r
+ for(auto it = std::begin(params_orig)+1; it != std::end(params_orig); ++it, param += L" ")\r
param += *it;\r
result = GetChannel()->stage()->call(GetLayerIndex(), what == L"F", boost::trim_copy(param));\r
}\r
else\r
{\r
std::wstring param;\r
- for(auto it = std::begin(_parameters2); it != std::end(_parameters2); ++it, param += L" ")\r
+ for(auto it = std::begin(params_orig); it != std::end(params_orig); ++it, param += L" ")\r
param += *it;\r
result = GetChannel()->stage()->call(GetLayerIndex(), true, boost::trim_copy(param));\r
}\r
//Perform loading of the clip\r
try\r
{\r
- //_parameters[0] = _parameters[0]; // REVIEW: Why is this assignment done? CP 2013-01\r
auto pFP = create_producer(GetChannel()->mixer(), _parameters); \r
GetChannel()->stage()->load(GetLayerIndex(), pFP, true);\r
\r
//Perform loading of the clip\r
try\r
{\r
- //_parameters[0] = _parameters[0]; // REVIEW: Why is this assignment done? CP 2013-01\r
auto pFP = create_producer(GetChannel()->mixer(), _parameters);\r
if(pFP == frame_producer::empty())\r
BOOST_THROW_EXCEPTION(file_not_found() << msg_info(_parameters.size() > 0 ? narrow(_parameters[0]) : ""));\r
}\r
catch(file_not_found&)\r
{ \r
- std::wstring params2;\r
- for(auto it = _parameters2.begin(); it != _parameters2.end(); ++it)\r
- params2 += L" " + *it;\r
- CASPAR_LOG(error) << L"File not found. No match found for parameters. Check syntax:" << params2;\r
+ CASPAR_LOG(error) << L"File not found. No match found for parameters. Check syntax:" << _parameters.get_original_string();\r
SetReplyString(TEXT("404 LOADBG ERROR\r\n"));\r
return false;\r
}\r
\r
bool PrintCommand::DoExecute()\r
{\r
- parameters params;
- params.push_back(L"IMAGE");
- GetChannel()->output()->add(create_consumer(params));
+ parameters params;\r
+ params.push_back(L"IMAGE");\r
+ GetChannel()->output()->add(create_consumer(params));\r
\r
SetReplyString(TEXT("202 PRINT OK\r\n"));\r
\r
\r
if(_parameters[3].length() > 1) \r
{ //read label\r
- label = _parameters2[3];\r
+ label = _parameters.at_original(3);\r
++dataIndex;\r
\r
if(_parameters.size() > 4 && _parameters[4].length() > 0) //read play-on-load-flag\r
std::wstring dataFromFile;\r
if(_parameters.size() > dataIndex) \r
{ //read data\r
- const std::wstring& dataString = _parameters2[dataIndex];\r
+ const std::wstring& dataString = _parameters.at_original(dataIndex);\r
\r
if(dataString[0] == TEXT('<')) //the data is an XML-string\r
pDataString = dataString.c_str();\r
return false;\r
}\r
\r
- std::wstring dataString = _parameters2.at(2); \r
+ std::wstring dataString = _parameters.at_original(2);\r
if(dataString.at(0) != TEXT('<'))\r
{\r
//The data is not an XML-string, it must be a filename\r
return false;\r
}\r
int layer = _ttoi(_parameters[1].c_str());\r
- auto result = flash::get_default_cg_producer(safe_ptr<core::video_channel>(GetChannel()), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->invoke(layer, _parameters2[2]);\r
+ auto result = flash::get_default_cg_producer(safe_ptr<core::video_channel>(GetChannel()), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->invoke(layer, _parameters.at_original(2));\r
replyString << result << TEXT("\r\n"); \r
}\r
else \r
}\r
\r
datafile << static_cast<wchar_t>(65279); // UTF-8 BOM character\r
- datafile << _parameters2[2] << std::flush;\r
+ datafile << _parameters.at_original(2) << std::flush;\r
datafile.close();\r
\r
std::wstring replyString = TEXT("202 DATA STORE OK\r\n");\r
try\r
{\r
auto name = xml_consumer.first;\r
+\r
if (name == L"screen")\r
on_consumer(ogl::create_consumer(xml_consumer.second));\r
else if (name == L"bluefish") \r
on_consumer(bluefish::create_consumer(xml_consumer.second)); \r
else if (name == L"decklink") \r
on_consumer(decklink::create_consumer(xml_consumer.second)); \r
- else if (name == L"file" || name ==L"stream") \r
+ else if (name == L"file" || name == L"stream") \r
on_consumer(ffmpeg::create_consumer(xml_consumer.second)); \r
else if (name == L"system-audio")\r
on_consumer(oal::create_consumer());\r