virtual safe_ptr<basic_frame> receive(int hints) {return producer_->receive(hints);}\r
virtual safe_ptr<basic_frame> last_frame() const {return producer_->last_frame();}\r
virtual std::wstring print() const {return producer_->print();}\r
- virtual void param(const std::wstring& str) {producer_->param(str);}\r
+ virtual bool param(const std::wstring& str) {return producer_->param(str);}\r
virtual safe_ptr<frame_producer> get_following_producer() const {return producer_->get_following_producer();}\r
virtual void set_leading_producer(const safe_ptr<frame_producer>& producer) {producer_->set_leading_producer(producer);}\r
virtual int64_t nb_frames() const {return producer_->nb_frames();}\r
\r
virtual std::wstring print() const = 0; // nothrow\r
\r
- virtual void param(const std::wstring&){}\r
+ virtual bool param(const std::wstring&){return false;}\r
\r
virtual safe_ptr<frame_producer> get_following_producer() const {return frame_producer::empty();} // nothrow\r
virtual void set_leading_producer(const safe_ptr<frame_producer>&) {} // nothrow\r
return L"transition[" + source_producer_->print() + L"|" + dest_producer_->print() + L"]";\r
}\r
\r
+ virtual bool param(const std::wstring& str)\r
+ {\r
+ return get_following_producer()->param(str);\r
+ }\r
+ \r
// transition_producer\r
\r
safe_ptr<basic_frame> compose(const safe_ptr<basic_frame>& dest_frame, const safe_ptr<basic_frame>& src_frame) \r
\r
\r
/* File created by MIDL compiler version 7.00.0555 */\r
-/* at Wed Oct 26 20:20:42 2011\r
+/* at Thu Oct 27 23:11:42 2011\r
*/\r
/* Compiler settings for interop\DeckLinkAPI.idl:\r
Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
\r
\r
/* File created by MIDL compiler version 7.00.0555 */\r
-/* at Wed Oct 26 20:20:42 2011\r
+/* at Thu Oct 27 23:11:42 2011\r
*/\r
/* Compiler settings for interop\DeckLinkAPI.idl:\r
Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
#include <crtdbg.h>\r
#endif\r
\r
+#define _SCL_SECURE_NO_WARNINGS \r
#define NOMINMAX\r
\r
#include <memory>\r
\r
virtual void run()\r
{\r
+ win32_exception::install_handler();\r
+\r
try\r
{\r
while(true)\r
#include <boost/filesystem.hpp>\r
#include <boost/range/algorithm/find_if.hpp>\r
#include <boost/range/algorithm/find.hpp>\r
+#include <boost/algorithm/string/split.hpp>\r
\r
#include <agents.h>\r
#include <concrt.h>\r
return nb_frames - start_;\r
}\r
\r
- virtual void param(const std::wstring& param)\r
+ virtual bool param(const std::wstring& param)\r
{\r
- typedef std::istream_iterator<std::wstring, wchar_t, std::char_traits<wchar_t>> wistream_iterator;\r
- std::wstringstream str(param);\r
std::vector<std::wstring> params;\r
- std::copy(wistream_iterator(str), wistream_iterator(), std::back_inserter(params));\r
+ boost::split(params, param, boost::is_any_of(" "), boost::token_compress_on);\r
\r
if(boost::iequals(params.at(0), L"LOOP"))\r
+ {\r
input_.loop(boost::lexical_cast<bool>(params.at(1)));\r
+ return true;\r
+ }\r
+ return false;\r
}\r
\r
virtual std::wstring print() const\r
#include <common/memory/safe_ptr.h>\r
\r
#include <boost/noncopyable.hpp>\r
+#include <boost/algorithm/string/case_conv.hpp>\r
\r
#include <string>\r
#include <vector>\r
\r
static bool is_double_rate(const std::wstring& filters)\r
{\r
- if(filters.find(L"YADIF=1") != std::string::npos)\r
+ if(boost::to_upper_copy(filters).find(L"YADIF=1") != std::string::npos)\r
return true;\r
\r
- if(filters.find(L"YADIF=3") != std::string::npos)\r
+ if(boost::to_upper_copy(filters).find(L"YADIF=3") != std::string::npos)\r
return true;\r
\r
return false;\r
\r
static bool is_deinterlacing(const std::wstring& filters)\r
{\r
- if(filters.find(L"YADIF") != std::string::npos)\r
+ if(boost::to_upper_copy(filters).find(L"YADIF") != std::string::npos)\r
return true; \r
return false;\r
}\r
seek_frame(start_);\r
\r
graph_->set_color("seek", diagnostics::color(1.0f, 0.5f, 0.0f));\r
+ graph_->set_color("buffer-count", diagnostics::color(0.7f, 0.4f, 0.4f));\r
+ graph_->set_color("buffer-size", diagnostics::color(1.0f, 1.0f, 0.0f)); \r
\r
is_running_ = true;\r
}\r
\r
virtual void run()\r
{\r
+ win32_exception::install_handler();\r
+\r
try\r
{\r
- win32_exception::install_handler();\r
for(auto packet = read_next_packet(); packet && is_running_; packet = read_next_packet())\r
{ \r
Concurrency::asend(target_, make_safe_ptr(packet));\r
\r
++packets_count_;\r
packets_size_ += size;\r
+ \r
+ graph_->update_value("buffer-size", (packets_size_+0.001)/MAX_PACKETS_SIZE);\r
+ graph_->update_value("buffer-count", (packets_count_+0.001)/MAX_PACKETS_COUNT);\r
\r
auto self = shared_from_this();\r
packet = safe_ptr<AVPacket>(packet.get(), [this, self, packet, size, data](AVPacket*)\r
--packets_count_;\r
packets_size_ -= size;\r
event_.set();\r
+\r
+ graph_->update_value("buffer-size", (packets_size_+0.001)/MAX_PACKETS_SIZE);\r
+ graph_->update_value("buffer-count", (packets_count_+0.001)/MAX_PACKETS_COUNT);\r
});\r
\r
if(is_running_ && (packets_count_ > MAX_PACKETS_COUNT || packets_size_ > MAX_PACKETS_SIZE))\r
return receive_video();\r
}\r
\r
- std::shared_ptr<core::audio_buffer> receive_audio(size_t n_samples)\r
+ std::shared_ptr<core::audio_buffer> receive_audio()\r
{ \r
if(!audio_source_)\r
- return make_safe<core::audio_buffer>(n_samples, 0);\r
+ return make_safe<core::audio_buffer>(format_desc_.audio_samples_per_frame, 0);\r
\r
- if(audio_data_.size() >= n_samples)\r
+ if(audio_data_.size() >= format_desc_.audio_samples_per_frame)\r
{\r
auto begin = audio_data_.begin(); \r
- auto end = begin + n_samples;\r
+ auto end = begin + format_desc_.audio_samples_per_frame;\r
auto audio = make_safe<core::audio_buffer>(begin, end);\r
audio_data_.erase(begin, end);\r
return audio;\r
audio_data_.insert(audio_data_.end(), audio->begin(), audio->end()); \r
audio.reset();\r
\r
- return receive_audio(n_samples);\r
+ return receive_audio();\r
}\r
\r
virtual void run()\r
{\r
+ win32_exception::install_handler();\r
+\r
try\r
{\r
while(display())\r
{ \r
- }\r
- \r
+ } \r
}\r
catch(...)\r
{\r
if(!video)\r
return false;\r
\r
- auto audio = receive_audio(format_desc_.audio_samples_per_frame);\r
+ auto audio = receive_audio();\r
if(!audio)\r
return false;\r
\r
send(target_, frame_muxer2::target_element_t(video, ticket));\r
\r
auto video2 = make_safe<core::write_frame>(*video); \r
- auto audio2 = receive_audio(format_desc_.audio_samples_per_frame);\r
+ auto audio2 = receive_audio();\r
\r
if(audio2)\r
{\r
\r
virtual void run()\r
{\r
+ win32_exception::install_handler();\r
+\r
try\r
{\r
while(true)\r
CASPAR_LOG(info) << print() << L" Thread ended.";\r
}\r
\r
- void param(const std::wstring& param)\r
+ bool param(const std::wstring& param)\r
{ \r
- if(!ax_->FlashCall(param))\r
+ bool success = ax_->FlashCall(param); \r
+ if(!success)\r
CASPAR_LOG(warning) << print() << L" Flash call failed:" << param;//BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("Flash function call failed.") << arg_name_info("param") << arg_value_info(narrow(param)));\r
- graph_->add_tag("param");\r
+ else\r
+ graph_->add_tag("param");\r
+ return success;\r
}\r
\r
safe_ptr<core::basic_frame> operator()()\r
return last_frame_.value();\r
} \r
\r
- virtual void param(const std::wstring& param) \r
+ virtual bool param(const std::wstring& param) \r
{ \r
if(!is_running_.fetch_and_store(true))\r
{\r
start();\r
}\r
asend(params_, param);\r
+ return true;\r
}\r
\r
virtual std::wstring print() const\r
for(auto it = std::begin(_parameters2)+2; it != std::end(_parameters2); ++it)\r
param += L" " + *it;\r
\r
+ bool success = false;\r
+ \r
if(what == L"B")\r
- GetChannel()->stage()->background(GetLayerIndex()).get()->param(param);\r
+ success = GetChannel()->stage()->background(GetLayerIndex()).get()->param(param);\r
else if(what == L"F")\r
- GetChannel()->stage()->foreground(GetLayerIndex()).get()->param(param);\r
+ success = GetChannel()->stage()->foreground(GetLayerIndex()).get()->param(param);\r
\r
+ if(!success)\r
+ {\r
+ SetReplyString(TEXT("502 PARAM FAILED\r\n"));\r
+ return false;\r
+ }\r
+\r
CASPAR_LOG(info) << "Executed param: " << _parameters[0] << TEXT(" successfully");\r
\r
SetReplyString(TEXT("202 PARAM OK\r\n"));\r