]> git.sesse.net Git - casparcg/commitdiff
2.0.2: Improved INFO.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 2 Dec 2011 14:27:03 +0000 (14:27 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 2 Dec 2011 14:27:03 +0000 (14:27 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.2@1757 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

20 files changed:
casparcg.sln
core/consumer/frame_consumer.cpp
core/consumer/frame_consumer.h
core/consumer/output.cpp
core/consumer/output.h
core/mixer/mixer.cpp
core/mixer/mixer.h
core/producer/frame_producer.h
core/producer/layer.cpp
core/producer/layer.h
core/producer/stage.cpp
core/producer/stage.h
core/video_channel.cpp
core/video_channel.h
modules/decklink/interop/DeckLinkAPI_h.h
modules/decklink/interop/DeckLinkAPI_i.c
modules/flash/util/swf.cpp
modules/flash/util/swf.h
protocol/amcp/AMCPCommandsImpl.cpp
shell/casparcg.config

index bd760c768c807cf78fd1efd8d5698fdb8d228597..ef1bcec920c0e3daf23c615fe9eed279664449e1 100644 (file)
@@ -1,8 +1,6 @@
 \r
 Microsoft Visual Studio Solution File, Format Version 11.00\r
 # Visual Studio 2010\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common\common.vcxproj", "{02308602-7FE0-4253-B96E-22134919F56A}"\r
-EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core", "core\core.vcxproj", "{79388C20-6499-4BF6-B8B9-D8C33D7D4DDD}"\r
 EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shell", "shell\shell.vcxproj", "{8C26C94F-8092-4769-8D84-DEA479721C5B}"\r
@@ -31,6 +29,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ogl", "modules\ogl\ogl.vcxp
 EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "image", "modules\image\image.vcxproj", "{3E11FF65-A9DA-4F80-87F2-A7C6379ED5E2}"\r
 EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common\common.vcxproj", "{02308602-7FE0-4253-B96E-22134919F56A}"\r
+EndProject\r
 Global\r
        GlobalSection(SubversionScc) = preSolution\r
                Svn-Managed = True\r
@@ -43,14 +43,6 @@ Global
                Release|Win32 = Release|Win32\r
        EndGlobalSection\r
        GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
-               {02308602-7FE0-4253-B96E-22134919F56A}.Debug|Win32.ActiveCfg = Debug|Win32\r
-               {02308602-7FE0-4253-B96E-22134919F56A}.Debug|Win32.Build.0 = Debug|Win32\r
-               {02308602-7FE0-4253-B96E-22134919F56A}.Develop|Win32.ActiveCfg = Develop|Win32\r
-               {02308602-7FE0-4253-B96E-22134919F56A}.Develop|Win32.Build.0 = Develop|Win32\r
-               {02308602-7FE0-4253-B96E-22134919F56A}.Profile|Win32.ActiveCfg = Profile|Win32\r
-               {02308602-7FE0-4253-B96E-22134919F56A}.Profile|Win32.Build.0 = Profile|Win32\r
-               {02308602-7FE0-4253-B96E-22134919F56A}.Release|Win32.ActiveCfg = Release|Win32\r
-               {02308602-7FE0-4253-B96E-22134919F56A}.Release|Win32.Build.0 = Release|Win32\r
                {79388C20-6499-4BF6-B8B9-D8C33D7D4DDD}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {79388C20-6499-4BF6-B8B9-D8C33D7D4DDD}.Debug|Win32.Build.0 = Debug|Win32\r
                {79388C20-6499-4BF6-B8B9-D8C33D7D4DDD}.Develop|Win32.ActiveCfg = Develop|Win32\r
@@ -131,6 +123,14 @@ Global
                {3E11FF65-A9DA-4F80-87F2-A7C6379ED5E2}.Profile|Win32.Build.0 = Profile|Win32\r
                {3E11FF65-A9DA-4F80-87F2-A7C6379ED5E2}.Release|Win32.ActiveCfg = Release|Win32\r
                {3E11FF65-A9DA-4F80-87F2-A7C6379ED5E2}.Release|Win32.Build.0 = Release|Win32\r
+               {02308602-7FE0-4253-B96E-22134919F56A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {02308602-7FE0-4253-B96E-22134919F56A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {02308602-7FE0-4253-B96E-22134919F56A}.Develop|Win32.ActiveCfg = Develop|Win32\r
+               {02308602-7FE0-4253-B96E-22134919F56A}.Develop|Win32.Build.0 = Develop|Win32\r
+               {02308602-7FE0-4253-B96E-22134919F56A}.Profile|Win32.ActiveCfg = Profile|Win32\r
+               {02308602-7FE0-4253-B96E-22134919F56A}.Profile|Win32.Build.0 = Profile|Win32\r
+               {02308602-7FE0-4253-B96E-22134919F56A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {02308602-7FE0-4253-B96E-22134919F56A}.Release|Win32.Build.0 = Release|Win32\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r
index 11eb115eed5d5ff18ad28ee8f08cb0f46a4ff9d2..45974d014b790d5574f1deda6f2c3b77fb58f043 100644 (file)
@@ -71,8 +71,8 @@ class cadence_guard : public frame_consumer
        boost::circular_buffer<size_t>  sync_buffer_;\r
        bool                                                    synced_;\r
 public:\r
-       cadence_guard(safe_ptr<frame_consumer>&& consumer)\r
-               : consumer_(std::move(consumer))\r
+       cadence_guard(const safe_ptr<frame_consumer>& consumer)\r
+               : consumer_(consumer)\r
        {\r
        }\r
        \r
@@ -126,7 +126,7 @@ public:
        }\r
 };\r
 \r
-safe_ptr<frame_consumer> create_consumer_cadence_guard(safe_ptr<frame_consumer>&& consumer)\r
+safe_ptr<frame_consumer> create_consumer_cadence_guard(const safe_ptr<frame_consumer>& consumer)\r
 {\r
        return make_safe<cadence_guard>(std::move(consumer));\r
 }\r
index 3d8fb1f93078193220b9fbf86fb45aa91ced856e..a75882a5a97bc2af433f9bd0878f05f07008aaa6 100644 (file)
@@ -59,7 +59,7 @@ struct frame_consumer : boost::noncopyable
        }\r
 };\r
 \r
-safe_ptr<frame_consumer> create_consumer_cadence_guard(safe_ptr<frame_consumer>&& consumer);\r
+safe_ptr<frame_consumer> create_consumer_cadence_guard(const safe_ptr<frame_consumer>& consumer);\r
 \r
 typedef std::function<safe_ptr<core::frame_consumer>(const std::vector<std::wstring>&)> consumer_factory_t;\r
 \r
index 4a7f810b3fa469663072080d015592441fa87aa8..b2258e912c9e6a96e093fc174c4eee4edc04e237 100644 (file)
@@ -40,6 +40,7 @@
 #include <boost/timer.hpp>\r
 #include <boost/range/algorithm.hpp>\r
 #include <boost/range/adaptors.hpp>\r
+#include <boost/property_tree/ptree.hpp>\r
 \r
 namespace caspar { namespace core {\r
        \r
@@ -69,20 +70,25 @@ public:
                graph_->set_color("consume-time", diagnostics::color(1.0f, 0.4f, 0.0f));\r
        }       \r
        \r
-       void add(safe_ptr<frame_consumer>&& consumer)\r
+       void add(int index, safe_ptr<frame_consumer> consumer)\r
        {               \r
-               remove(consumer->index());\r
+               remove(index);\r
 \r
-               consumer = create_consumer_cadence_guard(std::move(consumer));\r
+               consumer = create_consumer_cadence_guard(consumer);\r
                consumer->initialize(format_desc_, channel_index_);\r
 \r
                executor_.invoke([&]\r
                {\r
-                       consumers_.insert(std::make_pair(consumer->index(), consumer));\r
+                       consumers_.insert(std::make_pair(index, consumer));\r
                        CASPAR_LOG(info) << print() << L" " << consumer->print() << L" Added.";\r
                }, high_priority);\r
        }\r
 \r
+       void add(const safe_ptr<frame_consumer>& consumer)\r
+       {\r
+               add(consumer->index(), consumer);\r
+       }\r
+\r
        void remove(int index)\r
        {               \r
                // Destroy  consumer on calling thread:\r
@@ -105,6 +111,11 @@ public:
                        CASPAR_LOG(info) << print() << L" " << str << L" Removed.";\r
                }\r
        }\r
+\r
+       void remove(const safe_ptr<frame_consumer>& consumer)\r
+       {\r
+               remove(consumer->index());\r
+       }\r
        \r
        void set_video_format_desc(const video_format_desc& format_desc)\r
        {\r
@@ -225,11 +236,29 @@ public:
        {\r
                return L"output[" + boost::lexical_cast<std::wstring>(channel_index_) + L"]";\r
        }\r
+\r
+       boost::unique_future<boost::property_tree::wptree> info()\r
+       {\r
+               return std::move(executor_.begin_invoke([&]() -> boost::property_tree::wptree\r
+               {                       \r
+                       boost::property_tree::wptree info;\r
+                       BOOST_FOREACH(auto& consumer, consumers_)\r
+                       {\r
+                               auto& node = info.add(L"output.devices.device", L"");\r
+                               node.add(L"index", consumer.first);\r
+                               node.add(L"consumer", consumer.second->print());\r
+                       }\r
+                       return info;\r
+               }, high_priority));\r
+       }\r
 };\r
 \r
 output::output(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, int channel_index) : impl_(new implementation(graph, format_desc, channel_index)){}\r
-void output::add(safe_ptr<frame_consumer>&& consumer){impl_->add(std::move(consumer));}\r
+void output::add(int index, const safe_ptr<frame_consumer>& consumer){impl_->add(index, consumer);}\r
+void output::add(const safe_ptr<frame_consumer>& consumer){impl_->add(consumer);}\r
 void output::remove(int index){impl_->remove(index);}\r
+void output::remove(const safe_ptr<frame_consumer>& consumer){impl_->remove(consumer);}\r
 void output::send(const std::pair<safe_ptr<read_frame>, std::shared_ptr<void>>& frame) {impl_->send(frame); }\r
 void output::set_video_format_desc(const video_format_desc& format_desc){impl_->set_video_format_desc(format_desc);}\r
+boost::unique_future<boost::property_tree::wptree> output::info() const{return impl_->info();}\r
 }}
\ No newline at end of file
index 3f9f638b022a730ff45c87daf24d6351849a58bb..656e8e2a89ab523857dba2b0ddf58702664e8a2e 100644 (file)
 #include <common/diagnostics/graph.h>\r
 \r
 #include <boost/noncopyable.hpp>\r
+#include <boost/property_tree/ptree_fwd.hpp>\r
+#include <boost/thread/future.hpp>\r
 \r
 namespace caspar { namespace core {\r
        \r
-class output : public target<std::pair<safe_ptr<read_frame>, std::shared_ptr<void>>>, boost::noncopyable\r
+class output : public target<std::pair<safe_ptr<read_frame>, std::shared_ptr<void>>>\r
+                        , boost::noncopyable\r
 {\r
 public:\r
        explicit output(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, int channel_index);\r
 \r
        // target\r
        \r
-       virtual void send(const std::pair<safe_ptr<read_frame>, std::shared_ptr<void>>& frame) override;\r
+       virtual void send( const std::pair<safe_ptr<read_frame>, std::shared_ptr<void>>& frame) override;\r
 \r
        // output\r
-\r
-       void add(safe_ptr<frame_consumer>&& consumer);\r
+       \r
+       void add(const safe_ptr<frame_consumer>& consumer);\r
+       void add(int index, const safe_ptr<frame_consumer>& consumer);\r
+       void remove(const safe_ptr<frame_consumer>& consumer);\r
        void remove(int index);\r
        \r
        void set_video_format_desc(const video_format_desc& format_desc);\r
 \r
+       boost::unique_future<boost::property_tree::wptree> info() const;\r
 private:\r
        struct implementation;\r
        safe_ptr<implementation> impl_;\r
index 045dbe36bf70544463debaa45ed6d8086c8b7515..793bf395e12d46c41bfc08636eee150aa7027366 100644 (file)
@@ -44,6 +44,7 @@
 \r
 #include <boost/foreach.hpp>\r
 #include <boost/timer.hpp>\r
+#include <boost/property_tree/ptree.hpp>\r
 \r
 #include <tbb/concurrent_queue.h>\r
 #include <tbb/spin_mutex.h>\r
@@ -225,6 +226,13 @@ public:
                tbb::spin_mutex::scoped_lock lock(format_desc_mutex_);\r
                return format_desc_;\r
        }\r
+\r
+       boost::unique_future<boost::property_tree::wptree> info() const\r
+       {\r
+               boost::promise<boost::property_tree::wptree> info;\r
+               info.set_value(boost::property_tree::wptree());\r
+               return info.get_future();\r
+       }\r
 };\r
        \r
 mixer::mixer(const safe_ptr<diagnostics::graph>& graph, const safe_ptr<target_t>& target, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl) \r
@@ -239,4 +247,5 @@ void mixer::clear_transforms(int index){impl_->clear_transforms(index);}
 void mixer::clear_transforms(){impl_->clear_transforms();}\r
 void mixer::set_blend_mode(int index, blend_mode::type value){impl_->set_blend_mode(index, value);}\r
 void mixer::set_video_format_desc(const video_format_desc& format_desc){impl_->set_video_format_desc(format_desc);}\r
+boost::unique_future<boost::property_tree::wptree> mixer::info() const{return impl_->info();}\r
 }}
\ No newline at end of file
index d1c841d3e2523c67918efd7218d5e8a2061ef48a..d17207772975557789e15aad08b48d49163172b9 100644 (file)
@@ -27,6 +27,9 @@
 #include <common/concurrency/target.h>\r
 #include <common/diagnostics/graph.h>\r
 \r
+#include <boost/property_tree/ptree_fwd.hpp>\r
+#include <boost/thread/future.hpp>\r
+\r
 #include <map>\r
 \r
 namespace caspar { \r
@@ -42,7 +45,8 @@ class ogl_device;
 struct frame_transform;\r
 struct pixel_format;\r
 \r
-class mixer : public target<std::pair<std::map<int, safe_ptr<core::basic_frame>>, std::shared_ptr<void>>>, public core::frame_factory\r
+class mixer : public target<std::pair<std::map<int, safe_ptr<core::basic_frame>>, std::shared_ptr<void>>>\r
+                       , public core::frame_factory\r
 {\r
 public:        \r
        typedef target<std::pair<safe_ptr<read_frame>, std::shared_ptr<void>>> target_t;\r
@@ -66,6 +70,8 @@ public:
        void clear_transforms();\r
 \r
        void set_blend_mode(int index, blend_mode::type value);\r
+\r
+       boost::unique_future<boost::property_tree::wptree> info() const;\r
        \r
 private:\r
        struct implementation;\r
index ac7ba1ea6dc16f2b9cdad3617b59f225fbbd3f99..93c45ddfe1019e564c34f161d8987a616ebd361a 100644 (file)
@@ -31,6 +31,7 @@
 #include <numeric>\r
 \r
 #include <boost/thread/future.hpp>\r
+#include <boost/property_tree/ptree.hpp>\r
 \r
 namespace caspar { \r
        \r
@@ -61,6 +62,13 @@ public:
                return promise.get_future();\r
        }\r
 \r
+       virtual boost::property_tree::wptree info() const\r
+       {\r
+               boost::property_tree::wptree info;\r
+               info.push_front(std::make_pair(L"producer", print()));\r
+               return info;\r
+       }\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
                \r
index 14ee7045753fec6e2f7ec6612998e3e3691875b3..7548ab9902c2c04d8ab74ee1d595c9f6864118ca 100644 (file)
@@ -25,6 +25,8 @@
 #include "frame_producer.h"\r
 #include "frame/basic_frame.h"\r
 \r
+#include <boost/property_tree/ptree.hpp>\r
+\r
 namespace caspar { namespace core {\r
        \r
 struct layer::implementation\r
@@ -144,6 +146,16 @@ public:
        {\r
                return background_ == core::frame_producer::empty() && foreground_ == core::frame_producer::empty();\r
        }\r
+\r
+       boost::property_tree::wptree info() const\r
+       {\r
+               boost::property_tree::wptree info;\r
+               info.add_child(L"layer.foreground", foreground_->info());\r
+               info.add_child(L"layer.background", foreground_->info());\r
+               info.add(L"layer.status",     is_paused_ ? L"paused" : (foreground_ == frame_producer::empty() ? L"stopped" : L"playing"));\r
+               info.add(L"layer.auto_delta", auto_play_delta_);\r
+               return info;\r
+       }\r
 };\r
 \r
 layer::layer() : impl_(new implementation()){}\r
@@ -176,4 +188,5 @@ safe_ptr<frame_producer> layer::foreground() const { return impl_->foreground_;}
 safe_ptr<frame_producer> layer::background() const { return impl_->background_;}\r
 bool layer::empty() const {return impl_->empty();}\r
 boost::unique_future<std::wstring> layer::call(bool foreground, const std::wstring& param){return impl_->call(foreground, param);}\r
+boost::property_tree::wptree layer::info() const{return impl_->info();}\r
 }}
\ No newline at end of file
index 45eda8dadbecb7beb7ebbdd63edbc4c345157ac8..cd8e57e6ca3e2000087a691d3d2d8b1c3608cf83 100644 (file)
@@ -24,6 +24,7 @@
 \r
 #include <boost/noncopyable.hpp>\r
 #include <boost/thread/future.hpp>\r
+#include <boost/property_tree/ptree_fwd.hpp>\r
 \r
 #include <string>\r
 \r
@@ -71,6 +72,8 @@ public:
        safe_ptr<frame_producer> background() const; // nothrow\r
 \r
        safe_ptr<basic_frame> receive(); // nothrow\r
+\r
+       boost::property_tree::wptree info() const;\r
 private:\r
        struct implementation;\r
        safe_ptr<implementation> impl_;\r
index 3799b87a1f274c797f040e4408bf237544aed901..f2f38dd767eea58d39d604934f3a8b88c8ae4ff5 100644 (file)
@@ -34,6 +34,8 @@
 \r
 #include <tbb/parallel_for_each.h>\r
 \r
+#include <boost/property_tree/ptree.hpp>\r
+\r
 #include <map>\r
 \r
 namespace caspar { namespace core {\r
@@ -231,7 +233,24 @@ public:
                executor_.begin_invoke([=]\r
                {\r
                        format_desc_ = format_desc;\r
-               }, high_priority );\r
+               }, high_priority);\r
+       }\r
+\r
+       boost::unique_future<boost::property_tree::wptree> info()\r
+       {\r
+               return std::move(executor_.begin_invoke([&]() -> boost::property_tree::wptree\r
+               {\r
+                       boost::property_tree::wptree info;\r
+                       auto& layers_node = info.add(L"layers", L"");\r
+                       BOOST_FOREACH(auto& layer, layers_)\r
+                       {\r
+                               auto layer_info = layer.second.info();\r
+                               layer_info.add(L"layer.index", layer.first);\r
+                               BOOST_FOREACH(auto& update, layer_info)   \r
+                                       layers_node.add_child(update.first, update.second);\r
+                       }\r
+                       return info;\r
+               }, high_priority));\r
        }\r
 };\r
 \r
@@ -251,4 +270,5 @@ boost::unique_future<safe_ptr<frame_producer>> stage::foreground(size_t index) {
 boost::unique_future<safe_ptr<frame_producer>> stage::background(size_t index) {return impl_->background(index);}\r
 boost::unique_future<std::wstring> stage::call(int index, bool foreground, const std::wstring& param){return impl_->call(index, foreground, param);}\r
 void stage::set_video_format_desc(const video_format_desc& format_desc){impl_->set_video_format_desc(format_desc);}\r
+boost::unique_future<boost::property_tree::wptree> stage::info() const{return impl_->info();}\r
 }}
\ No newline at end of file
index 9e393f46e5b4d120048faa8d7e1da5ef8e069b9b..eff2545b7079c5d6bf3e32fedafd25adeb679e7a 100644 (file)
@@ -27,6 +27,8 @@
 #include <common/diagnostics/graph.h>\r
 \r
 #include <boost/noncopyable.hpp>\r
+#include <boost/property_tree/ptree_fwd.hpp>\r
+#include <boost/thread/future.hpp>\r
 \r
 namespace caspar { namespace core {\r
 \r
@@ -62,6 +64,8 @@ public:
        \r
        void set_video_format_desc(const video_format_desc& format_desc);\r
 \r
+       boost::unique_future<boost::property_tree::wptree> info() const;\r
+\r
 private:\r
        struct implementation;\r
        safe_ptr<implementation> impl_;\r
index 67eebfde816cfdef6da6b4031ec5cda55d7f0d9f..5cca96834c72d28d1f0a5cff01ec61728d9c73e6 100644 (file)
@@ -32,6 +32,8 @@
 #include <common/diagnostics/graph.h>\r
 #include <common/env.h>\r
 \r
+#include <boost/property_tree/ptree.hpp>\r
+\r
 #include <string>\r
 \r
 namespace caspar { namespace core {\r
@@ -86,6 +88,26 @@ public:
        {\r
                return L"video_channel[" + boost::lexical_cast<std::wstring>(index_) + L"|" +  format_desc_.name + L"]";\r
        }\r
+\r
+       boost::property_tree::wptree info() const\r
+       {\r
+               boost::property_tree::wptree info;\r
+               info.put(L"channel.video-mode", format_desc_.name);\r
+\r
+               auto& channel_node = info.get_child(L"channel");\r
+               auto stage_info  = stage_->info();\r
+               auto mixer_info  = mixer_->info();\r
+               auto output_info = output_->info();\r
+\r
+               BOOST_FOREACH(auto& update, stage_info.get())   \r
+                       channel_node.put_child(update.first, update.second);\r
+               BOOST_FOREACH(auto& update, mixer_info.get())   \r
+                       channel_node.put_child(update.first, update.second);\r
+               BOOST_FOREACH(auto& update, output_info.get())   \r
+                       channel_node.put_child(update.first, update.second);\r
+   \r
+               return info;                       \r
+       }\r
 };\r
 \r
 video_channel::video_channel(int index, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl) : impl_(new implementation(index, format_desc, ogl)){}\r
@@ -94,5 +116,6 @@ safe_ptr<mixer> video_channel::mixer() { return impl_->mixer_;}
 safe_ptr<output> video_channel::output() { return impl_->output_;} \r
 video_format_desc video_channel::get_video_format_desc() const{return impl_->format_desc_;}\r
 void video_channel::set_video_format_desc(const video_format_desc& format_desc){impl_->set_video_format_desc(format_desc);}\r
+boost::property_tree::wptree video_channel::info() const{return impl_->info();}\r
 \r
 }}
\ No newline at end of file
index 45035486195b759ec8cc3cfdf6ee38fb91cd0acc..66d884847185e1cc9fbbf014aef72115b1fc9301 100644 (file)
@@ -24,6 +24,8 @@
 \r
 #include <boost/noncopyable.hpp>\r
 \r
+#include <boost/property_tree/ptree_fwd.hpp>\r
+\r
 namespace caspar { namespace core {\r
        \r
 class stage;\r
@@ -43,6 +45,8 @@ public:
        \r
        video_format_desc get_video_format_desc() const;\r
        void set_video_format_desc(const video_format_desc& format_desc);\r
+       \r
+       boost::property_tree::wptree info() const;\r
 \r
 private:\r
        struct implementation;\r
index 67c772703ea9e3660efea16a3f292642f64cf63a..c9abad893c5d5f8d0d6945ceec9f42d5294d76ee 100644 (file)
@@ -4,7 +4,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Thu Dec 01 20:20:22 2011\r
+/* at Fri Dec 02 15:12:59 2011\r
  */\r
 /* Compiler settings for interop\DeckLinkAPI.idl:\r
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
index 1e212c1502eafa65efb7f98b19c4a540c6c58f0b..b150561c0813eec7e9b479ddd13e3a3b0ae0c658 100644 (file)
@@ -6,7 +6,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Thu Dec 01 20:20:22 2011\r
+/* at Fri Dec 02 15:12:59 2011\r
  */\r
 /* Compiler settings for interop\DeckLinkAPI.idl:\r
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
index b8cf015f6577858f2665ae339ab94118d19fab59..b12becf531502817c07b2dea17eef3b82a3eed65 100644 (file)
@@ -2,11 +2,15 @@
 \r
 #include <common/exception/exceptions.h>\r
 \r
-#include <fstream>\r
-#include <streambuf>\r
+#include <boost/property_tree/ptree.hpp>\r
+#include <boost/property_tree/xml_parser.hpp>\r
+#include <boost/algorithm/string/replace.hpp>\r
 \r
 #include <zlib.h>\r
 \r
+#include <fstream>\r
+#include <streambuf>\r
+\r
 namespace caspar { namespace flash {\r
        \r
 std::vector<char> decompress_one_file(const std::vector<char>& in_data, uLong buf_size = 5000000)\r
@@ -29,7 +33,7 @@ std::vector<char> decompress_one_file(const std::vector<char>& in_data, uLong bu
        return out_data;\r
 }\r
 \r
-std::wstring read_template_meta_info(const std::wstring& filename)\r
+std::string read_template_meta_info(const std::wstring& filename)\r
 {\r
        auto file = std::fstream(filename, std::ios::in | std::ios::binary);\r
 \r
@@ -67,8 +71,8 @@ std::wstring read_template_meta_info(const std::wstring& filename)
        \r
        if(beg_it == data.end() || end_it == data.end())\r
                BOOST_THROW_EXCEPTION(file_read_error());\r
-       \r
-       return widen(std::string(beg_it, end_it+end_str.size()));\r
+                       \r
+       return std::string(beg_it, end_it+end_str.size());\r
 }\r
 \r
 }}
\ No newline at end of file
index 9cbfb399613bc27918fb4a497bc1c54062bac095..46675b5c295e6ce708a3814d969b5c6ef1a25143 100644 (file)
@@ -2,8 +2,10 @@
 \r
 #include <string>\r
 \r
+#include <boost/property_tree/ptree_fwd.hpp>\r
+\r
 namespace caspar { namespace flash {\r
 \r
-std::wstring read_template_meta_info(const std::wstring& filename);\r
+std::string read_template_meta_info(const std::wstring& filename);\r
 \r
 }}
\ No newline at end of file
index 339415d7b898a471d79337b561ee83463d5c01fa..d0d4090d2b1180a3480cbfac826e5e0a08585820 100644 (file)
@@ -57,6 +57,7 @@
 #include <boost/algorithm/string.hpp>\r
 #include <boost/filesystem.hpp>\r
 #include <boost/regex.hpp>\r
+#include <boost/property_tree/xml_parser.hpp>\r
 \r
 /* Return codes\r
 \r
@@ -525,7 +526,8 @@ bool AddCommand::DoExecute()
        //Perform loading of the clip\r
        try\r
        {\r
-               GetChannel()->output()->add(create_consumer(_parameters));\r
+               auto consumer = create_consumer(_parameters);\r
+               GetChannel()->output()->add(GetLayerIndex(consumer->index()), consumer);\r
        \r
                CASPAR_LOG(info) << "Added " <<  _parameters[0] << TEXT(" successfully");\r
 \r
@@ -1301,7 +1303,7 @@ bool CinfCommand::DoExecute()
                        SetReplyString(TEXT("404 CINF ERROR\r\n"));\r
                        return false;\r
                }\r
-               replyString << TEXT("200 INFO OK\r\n");\r
+               replyString << TEXT("200 CINF OK\r\n");\r
                replyString << info << "\r\n";\r
        }\r
        catch(...)\r
@@ -1331,7 +1333,10 @@ bool InfoCommand::DoExecute()
 \r
                        std::wstringstream ss;\r
                        ss << L"201 INFO OK\r\n";\r
-                       ss << flash::read_template_meta_info(filename) << L"\r\n";\r
+                       \r
+                       auto xml = flash::read_template_meta_info(filename);\r
+                       ss << widen(xml);\r
+                       ss << L"\r\n";\r
 \r
                        SetReplyString(ss.str());\r
                        return true;\r
@@ -1347,19 +1352,29 @@ bool InfoCommand::DoExecute()
                try\r
                {\r
                        std::wstringstream replyString;\r
+                       replyString << TEXT("201 INFO OK\r\n");\r
+\r
                        if(_parameters.size() >= 1)\r
                        {\r
-                               int channelIndex = boost::lexical_cast<int>(_parameters.at(0).c_str())-1;\r
-                               replyString << TEXT("201 INFO OK\r\n");\r
-                               GenerateChannelInfo(channelIndex, channels_.at(channelIndex), replyString);\r
+                               int channelIndex = boost::lexical_cast<int>(_parameters.at(0).c_str())-1;                                       \r
+                               boost::property_tree::xml_parser::write_xml(replyString, channels_.at(channelIndex)->info(), boost::property_tree::xml_writer_settings<wchar_t>(' ', 3));\r
                        }\r
                        else\r
                        {\r
-                               replyString << TEXT("200 INFO OK\r\n");\r
-                               for(size_t n = 0; n < channels_.size(); ++n)\r
-                                       GenerateChannelInfo(n, channels_[n], replyString);\r
-                               replyString << TEXT("\r\n");\r
+                               boost::property_tree::wptree info;\r
+                               auto& node = info.add(L"channels", L"");\r
+                               int index = 0;\r
+                               BOOST_FOREACH(auto channel, channels_)\r
+                               {\r
+                                       BOOST_FOREACH(auto update, channel->info())\r
+                                       {\r
+                                               auto& channel = node.add_child(update.first, update.second);\r
+                                               channel.push_front(std::make_pair(L"index", boost::lexical_cast<std::wstring>(++index)));\r
+                                       }\r
+                               }\r
+                               boost::property_tree::xml_parser::write_xml(replyString, info, boost::property_tree::xml_writer_settings<wchar_t>(' ', 3));\r
                        }\r
+                       replyString << TEXT("\r\n");\r
                        SetReplyString(replyString.str());\r
                        return true;\r
                }\r
index 092fa0334fec5ec661480540c7b3a3c7b3a2d5a8..56068843d6fab207345858d83b33832f37218d4d 100644 (file)
@@ -7,6 +7,14 @@
     <template-path>D:\casparcg\_templates\</template-path>\r
   </paths>\r
   <channels>\r
+    <channel>\r
+      <video-mode>720p5000</video-mode>\r
+      <consumers>\r
+        <decklink>\r
+          <device>1</device>\r
+        </decklink>\r
+      </consumers>\r
+    </channel>\r
     <channel>\r
       <video-mode>720p5000</video-mode>\r
       <consumers>\r