]> git.sesse.net Git - casparcg/commitdiff
2.1.0: Added more monitor events.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 19 Feb 2012 11:53:04 +0000 (11:53 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 19 Feb 2012 11:53:04 +0000 (11:53 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@2457 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

13 files changed:
core/monitor/monitor.h
core/producer/color/color_producer.cpp
core/producer/frame_producer.h
core/producer/layer.cpp
core/producer/separated/separated_producer.cpp
core/producer/transition/transition_producer.cpp
core/video_channel.cpp
modules/decklink/producer/decklink_producer.cpp
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/flash/producer/flash_producer.cpp
modules/image/producer/image_producer.cpp
modules/image/producer/image_scroll_producer.cpp
protocol/osc/server.cpp

index 66b78e985b089b94d8b287a8a61e5f100be4868d..eb3701e8fe174a0c874310ce9228135f5743e57e 100644 (file)
@@ -105,7 +105,7 @@ std::ostream& operator<<(std::ostream& o, const path& p);
 \r
 typedef boost::chrono::duration<double, boost::ratio<1, 1>> duration;\r
 \r
-typedef boost::variant<bool, int32_t, int64_t, float, double, std::string, std::vector<int8_t>, duration> param;\r
+typedef boost::variant<bool, int32_t, int64_t, float, double, std::string, std::wstring, std::vector<int8_t>, duration> param;\r
 \r
 std::ostream& operator<<(std::ostream& o, const param& p);\r
 \r
index f2e96a37417b7a07531c6935dcb7e2f37354577e..8e1848bd1d9dda12537d3f6080203667036bcdba 100644 (file)
@@ -28,6 +28,7 @@
 #include <core/frame/draw_frame.h>\r
 #include <core/frame/frame_factory.h>\r
 #include <core/frame/pixel_format.h>\r
+#include <core/monitor/monitor.h>\r
 \r
 #include <common/except.h>\r
 #include <common/memory/array.h>\r
@@ -40,8 +41,10 @@ namespace caspar { namespace core {
        \r
 class color_producer : public frame_producer\r
 {\r
-       draw_frame frame_;\r
-       const std::wstring color_str_;\r
+       monitor::basic_subject  event_subject_;\r
+\r
+       draw_frame                              frame_;\r
+       const std::wstring              color_str_;\r
 \r
 public:\r
        explicit color_producer(const spl::shared_ptr<core::frame_factory>& frame_factory, const std::wstring& color) \r
@@ -55,6 +58,8 @@ public:
                        \r
        virtual draw_frame receive(int) override\r
        {\r
+               event_subject_ << monitor::event("color") % color_str_;\r
+\r
                return frame_;\r
        }       \r
        \r
@@ -80,6 +85,16 @@ public:
                info.add(L"color", color_str_);\r
                return info;\r
        }\r
+\r
+       virtual void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     \r
+       {\r
+               return event_subject_.subscribe(o);\r
+       }\r
+\r
+       virtual void unsubscribe(const monitor::observable::observer_ptr& o) override           \r
+       {\r
+               return event_subject_.unsubscribe(o);\r
+       }\r
 };\r
 \r
 std::wstring get_hex_color(const std::wstring& str)\r
index e5d22e170c1769d40a9f4adea2a823c35c3caf1b..e1581252563054279805b4f058807a200a3ac8af 100644 (file)
@@ -76,8 +76,8 @@ public:
        \r
        // monitor::observable\r
 \r
-       virtual void subscribe(const monitor::observable::observer_ptr& o) {}\r
-       virtual void unsubscribe(const monitor::observable::observer_ptr& o) {}\r
+       virtual void subscribe(const monitor::observable::observer_ptr& o) = 0;\r
+       virtual void unsubscribe(const monitor::observable::observer_ptr& o) = 0;\r
 \r
        // Properties\r
 \r
index 64319652ad3ec2df9e99050988371a433f5e96aa..c4004c4c5a5ac20f9e31ed1fc147c19f5f39047c 100644 (file)
@@ -150,8 +150,8 @@ public:
                                                        << monitor::event("frame")      % static_cast<int64_t>(frame_number_)\r
                                                                                                                % static_cast<int64_t>((static_cast<int64_t>(foreground_->nb_frames()) - static_cast<int64_t>(auto_play_delta_ ? *auto_play_delta_ : 0)));\r
 \r
-                       foreground_event_subject_ << monitor::event("type") % u8(foreground_->name());\r
-                       background_event_subject_ << monitor::event("type") % u8(background_->name());\r
+                       foreground_event_subject_ << monitor::event("type") % foreground_->name();\r
+                       background_event_subject_ << monitor::event("type") % background_->name();\r
                                \r
                        return frame;\r
                }\r
index 913b47af8f5b2ff4f8b14677ef18872d802d5aba..1703ec11ef6a5e2438e2b7e2979435b89ca86a86 100644 (file)
@@ -23,8 +23,9 @@
 \r
 #include "separated_producer.h"\r
 \r
-#include "../frame_producer.h"\r
-#include "../../frame/draw_frame.h"\r
+#include <core/producer/frame_producer.h>\r
+#include <core/frame/draw_frame.h>\r
+#include <core/monitor/monitor.h>\r
 \r
 #include <tbb/parallel_invoke.h>\r
 \r
@@ -32,6 +33,9 @@ namespace caspar { namespace core {
 \r
 class separated_producer : public frame_producer\r
 {              \r
+       monitor::basic_subject                  event_subject_;\r
+       monitor::basic_subject                  key_event_subject_;\r
+\r
        spl::shared_ptr<frame_producer> fill_producer_;\r
        spl::shared_ptr<frame_producer> key_producer_;\r
        draw_frame                                              fill_;\r
@@ -40,13 +44,19 @@ class separated_producer : public frame_producer
                        \r
 public:\r
        explicit separated_producer(const spl::shared_ptr<frame_producer>& fill, const spl::shared_ptr<frame_producer>& key) \r
-               : fill_producer_(fill)\r
+               : key_event_subject_("keyer")           \r
+               , fill_producer_(fill)\r
                , key_producer_(key)\r
                , fill_(core::draw_frame::late())\r
                , key_(core::draw_frame::late())\r
                , last_frame_(core::draw_frame::empty())\r
        {\r
                CASPAR_LOG(info) << print() << L" Initialized";\r
+\r
+               key_event_subject_.subscribe(event_subject_);\r
+\r
+               key_producer_->subscribe(key_event_subject_);\r
+               fill_producer_->subscribe(event_subject_);\r
        }\r
 \r
        // frame_producer\r
@@ -109,12 +119,12 @@ public:
 \r
        virtual void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     \r
        {\r
-               return fill_producer_->subscribe(o);\r
+               return event_subject_.subscribe(o);\r
        }\r
 \r
        virtual void unsubscribe(const monitor::observable::observer_ptr& o) override           \r
        {\r
-               return fill_producer_->unsubscribe(o);\r
+               return event_subject_.unsubscribe(o);\r
        }\r
 };\r
 \r
index c2f315d52dd811da1e52db01f20ee92297cd1a41..cea84969d0e5bf99262a63f27888a4839d828c3a 100644 (file)
@@ -77,20 +77,6 @@ public:
 \r
                ++current_frame_;\r
 \r
-               event_subject_  << monitor::event("transition/frame") % current_frame_ % info_.duration\r
-                                               << monitor::event("transition/type") % [&]() -> std::string\r
-                                                                                                                               {\r
-                                                                                                                                       switch(info_.type.value())\r
-                                                                                                                                       {\r
-                                                                                                                                       case transition_type::mix:              return "mix";\r
-                                                                                                                                       case transition_type::wipe:             return "wipe";\r
-                                                                                                                                       case transition_type::slide:    return "slide";\r
-                                                                                                                                       case transition_type::push:             return "push";\r
-                                                                                                                                       case transition_type::cut:              return "cut";\r
-                                                                                                                                       default:                                                return "n/a";\r
-                                                                                                                                       }\r
-                                                                                                                               }();\r
-\r
                auto dest = draw_frame::empty();\r
                auto source = draw_frame::empty();\r
 \r
@@ -108,6 +94,20 @@ public:
                                source = source_producer_->last_frame();\r
                });                             \r
                \r
+               event_subject_  << monitor::event("transition/frame") % current_frame_ % info_.duration\r
+                                               << monitor::event("transition/type") % [&]() -> std::string\r
+                                                                                                                               {\r
+                                                                                                                                       switch(info_.type.value())\r
+                                                                                                                                       {\r
+                                                                                                                                       case transition_type::mix:              return "mix";\r
+                                                                                                                                       case transition_type::wipe:             return "wipe";\r
+                                                                                                                                       case transition_type::slide:    return "slide";\r
+                                                                                                                                       case transition_type::push:             return "push";\r
+                                                                                                                                       case transition_type::cut:              return "cut";\r
+                                                                                                                                       default:                                                return "n/a";\r
+                                                                                                                                       }\r
+                                                                                                                               }();\r
+\r
                return compose(dest, source);\r
        }\r
 \r
index 623bd56a43e810bf3c1923a7aa7b327523cd15a5..a8febb9f32b21cdd32993ae3047c920131092c80 100644 (file)
@@ -125,7 +125,7 @@ public:
                        graph_->set_value("tick-time", frame_timer.elapsed()*format_desc.fps*0.5);\r
 \r
                        event_subject_  << monitor::event("profiler/time")      % frame_timer.elapsed() % (1.0/format_desc_.fps)\r
-                                                       << monitor::event("format")                                     % u8(format_desc.name);\r
+                                                       << monitor::event("format")                     % format_desc.name;\r
                }\r
                catch(...)\r
                {\r
index f766c6e1ae96eb7b3171592b2ae8070938ab7da5..c2c0d224ca9378c2af5919379fb0f5de9d4325c3 100644 (file)
@@ -41,6 +41,7 @@
 #include <core/frame/draw_frame.h>\r
 #include <core/frame/frame_transform.h>\r
 #include <core/frame/frame_factory.h>\r
+#include <core/monitor/monitor.h>\r
 \r
 #include <tbb/concurrent_queue.h>\r
 \r
@@ -79,9 +80,9 @@ namespace caspar { namespace decklink {
                \r
 class decklink_producer : boost::noncopyable, public IDeckLinkInputCallback\r
 {      \r
+       monitor::basic_subject                                                  event_subject_;\r
        spl::shared_ptr<diagnostics::graph>                             graph_;\r
        boost::timer                                                                    tick_timer_;\r
-       boost::timer                                                                    frame_timer_;\r
 \r
        CComPtr<IDeckLink>                                                              decklink_;\r
        CComQIPtr<IDeckLinkInput>                                               input_;\r
@@ -188,7 +189,7 @@ public:
                        graph_->set_value("tick-time", tick_timer_.elapsed()*out_format_desc_.fps*0.5);\r
                        tick_timer_.restart();\r
 \r
-                       frame_timer_.restart();\r
+                       boost::timer frame_timer;       \r
 \r
                        // PUSH\r
 \r
@@ -207,6 +208,16 @@ public:
                        av_frame->interlaced_frame      = in_format_desc_.field_mode != core::field_mode::progressive;\r
                        av_frame->top_field_first       = in_format_desc_.field_mode == core::field_mode::upper ? 1 : 0;\r
                                \r
+                       event_subject_  << monitor::event("file/name")                          % model_name_\r
+                                                       << monitor::event("file/path")                          % device_index_\r
+                                                       << monitor::event("file/video/width")           % video->GetWidth()\r
+                                                       << monitor::event("file/video/height")          % video->GetHeight()\r
+                                                       << monitor::event("file/video/field")           % u8(!av_frame->interlaced_frame ? "progressive" : (av_frame->top_field_first ? "upper" : "lower"))\r
+                                                       << monitor::event("file/audio/sample-rate")     % 48000\r
+                                                       << monitor::event("file/audio/channels")        % 2\r
+                                                       << monitor::event("file/audio/format")          % u8(av_get_sample_fmt_name(AV_SAMPLE_FMT_S32))\r
+                                                       << monitor::event("file/fps")                           % in_format_desc_.fps;\r
+\r
                        std::shared_ptr<core::audio_buffer> audio_buffer;\r
 \r
                        // It is assumed that audio is always equal or ahead of video.\r
@@ -243,9 +254,11 @@ public:
                                        graph_->set_tag("dropped-frame");\r
                        }\r
                        \r
-                       graph_->set_value("frame-time", frame_timer_.elapsed()*out_format_desc_.fps*0.5);\r
+                       graph_->set_value("frame-time", frame_timer.elapsed()*out_format_desc_.fps*0.5);        \r
+                       event_subject_ << monitor::event("profiler/time") % frame_timer.elapsed() % out_format_desc_.fps;\r
 \r
                        graph_->set_value("output-buffer", static_cast<float>(frame_buffer_.size())/static_cast<float>(frame_buffer_.capacity()));      \r
+                       event_subject_ << monitor::event("buffer") % frame_buffer_.size() % frame_buffer_.capacity();\r
                }\r
                catch(...)\r
                {\r
@@ -274,6 +287,16 @@ public:
        {\r
                return model_name_ + L" [" + boost::lexical_cast<std::wstring>(device_index_) + L"|" + in_format_desc_.name + L"]";\r
        }\r
+\r
+       void subscribe(const monitor::observable::observer_ptr& o)\r
+       {\r
+               event_subject_.subscribe(o);\r
+       }\r
+\r
+       void unsubscribe(const monitor::observable::observer_ptr& o)\r
+       {\r
+               event_subject_.unsubscribe(o);\r
+       }\r
 };\r
        \r
 class decklink_producer_proxy : public core::frame_producer\r
@@ -307,6 +330,16 @@ public:
                        CoUninitialize();\r
                });\r
        }\r
+\r
+       virtual void subscribe(const monitor::observable::observer_ptr& o) override\r
+       {\r
+               producer_->subscribe(o);\r
+       }\r
+\r
+       virtual void unsubscribe(const monitor::observable::observer_ptr& o) override\r
+       {\r
+               producer_->unsubscribe(o);\r
+       }\r
        \r
        // frame_producer\r
                                \r
index 714b56395f7cf25df4275465e351bf53cf8f3de7..ecb9ec9ebd600e9cc4345f8c03eb2a26f4363154 100644 (file)
@@ -151,7 +151,7 @@ public:
        // frame_producer\r
        \r
        virtual core::draw_frame receive(int flags) override\r
-       {               \r
+       {                               \r
                boost::timer frame_timer;\r
                                \r
                auto frame = core::draw_frame::late();          \r
@@ -162,16 +162,8 @@ public:
                }\r
                                                        \r
                graph_->set_value("frame-time", frame_timer.elapsed()*format_desc_.fps*0.5);\r
-               \r
-               event_subject_  << monitor::event("profiler/time")              % frame_timer.elapsed() % (1.0/format_desc_.fps)                                        \r
-                                               << monitor::event("file/time")                  % monitor::duration(file_frame_number()/fps_) \r
-                                                                                                                               % monitor::duration(file_nb_frames()/fps_)\r
-                                               << monitor::event("file/frame")                 % static_cast<int32_t>(file_frame_number())\r
-                                                                                                                               % static_cast<int32_t>(file_nb_frames())\r
-                                               << monitor::event("file/fps")                   % fps_\r
-                                               << monitor::event("filename")                   % u8(filename_)\r
-                                               << monitor::event("loop")                               % input_.loop();\r
-                                       \r
+               event_subject_  << monitor::event("profiler/time") % frame_timer.elapsed() % (1.0/format_desc_.fps);                    \r
+                                                               \r
                graph_->set_text(print());\r
 \r
                if(frame != core::draw_frame::late())\r
@@ -180,6 +172,14 @@ public:
                        last_frame_ = frame;\r
                }\r
                                \r
+               event_subject_  << monitor::event("file/time")                  % monitor::duration(file_frame_number()/fps_) \r
+                                                                                                                               % monitor::duration(file_nb_frames()/fps_)\r
+                                               << monitor::event("file/frame")                 % static_cast<int32_t>(file_frame_number())\r
+                                                                                                                               % static_cast<int32_t>(file_nb_frames())\r
+                                               << monitor::event("file/fps")                   % fps_\r
+                                               << monitor::event("file/path")                  % filename_\r
+                                               << monitor::event("loop")                               % input_.loop();\r
+\r
                return frame;\r
        }\r
 \r
index 3e749f53649bfd67865394462e1026b1582c9904..9883b3e263eb13eb7d2288b78e51919624e81a48 100644 (file)
@@ -35,6 +35,7 @@
 #include <core/frame/draw_frame.h>\r
 #include <core/frame/frame_factory.h>\r
 #include <core/frame/pixel_format.h>\r
+#include <core/monitor/monitor.h>\r
 \r
 #include <common/env.h>\r
 #include <common/concurrency/executor.h>\r
@@ -164,26 +165,27 @@ class flash_renderer
                }\r
        } com_init_;\r
 \r
-       const std::wstring filename_;\r
+       monitor::basic_subject&                                         event_subject_;\r
 \r
-       const std::shared_ptr<core::frame_factory> frame_factory_;\r
+       const std::wstring                                                      filename_;\r
+\r
+       const std::shared_ptr<core::frame_factory>      frame_factory_;\r
        \r
        CComObject<caspar::flash::FlashAxContainer>* ax_;\r
-       core::draw_frame head_;\r
-       bitmap bmp_;\r
+       core::draw_frame                                                        head_;\r
+       bitmap                                                                          bmp_;\r
        \r
-       spl::shared_ptr<diagnostics::graph> graph_;\r
-       boost::timer frame_timer_;\r
-       boost::timer tick_timer_;\r
-\r
-       prec_timer timer_;\r
+       spl::shared_ptr<diagnostics::graph>                     graph_;\r
+       \r
+       prec_timer                                                                      timer_;\r
 \r
-       const int width_;\r
-       const int height_;\r
+       const int                                                                       width_;\r
+       const int                                                                       height_;\r
        \r
 public:\r
-       flash_renderer(const spl::shared_ptr<diagnostics::graph>& graph, const std::shared_ptr<core::frame_factory>& frame_factory, const std::wstring& filename, int width, int height) \r
-               : graph_(graph)\r
+       flash_renderer(monitor::basic_subject& event_subject, const spl::shared_ptr<diagnostics::graph>& graph, const std::shared_ptr<core::frame_factory>& frame_factory, const std::wstring& filename, int width, int height) \r
+               : event_subject_(event_subject)\r
+               , graph_(graph)\r
                , filename_(filename)\r
                , frame_factory_(frame_factory)\r
                , ax_(nullptr)\r
@@ -193,7 +195,6 @@ public:
                , height_(height)\r
        {               \r
                graph_->set_color("frame-time", diagnostics::color(0.1f, 1.0f, 0.1f));\r
-               graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f));\r
                graph_->set_color("param", diagnostics::color(1.0f, 0.5f, 0.0f));       \r
                graph_->set_color("sync", diagnostics::color(0.8f, 0.3f, 0.2f));                        \r
                \r
@@ -255,15 +256,13 @@ public:
        {               \r
                const float frame_time = 1.0f/ax_->GetFPS();\r
 \r
-               graph_->set_value("tick-time", static_cast<float>(tick_timer_.elapsed()/frame_time)*0.5f);\r
-               tick_timer_.restart();\r
-                               \r
                if(sync > 0.00001)                      \r
                        timer_.tick(frame_time*sync); // This will block the thread.\r
                else\r
                        graph_->set_tag("sync");\r
 \r
                graph_->set_value("sync", sync);\r
+               event_subject_ << monitor::event("sync") % sync;\r
                \r
                ax_->Tick();\r
                                        \r
@@ -282,7 +281,7 @@ public:
        {                       \r
                const float frame_time = 1.0f/fps();\r
 \r
-               frame_timer_.restart();\r
+               boost::timer frame_timer;\r
 \r
                if(ax_->InvalidRect())\r
                {                       \r
@@ -297,7 +296,8 @@ public:
                        head_ = core::draw_frame(std::move(frame));     \r
                }               \r
                                                                                \r
-               graph_->set_value("frame-time", static_cast<float>(frame_timer_.elapsed()/frame_time)*0.5f);\r
+               graph_->set_value("frame-time", static_cast<float>(frame_timer.elapsed()/frame_time)*0.5f);\r
+               event_subject_ << monitor::event("renderer/profiler/time") % frame_timer.elapsed() % frame_time;\r
                return head_;\r
        }\r
        \r
@@ -322,6 +322,7 @@ public:
 \r
 struct flash_producer : public core::frame_producer\r
 {      \r
+       monitor::basic_subject                                                  event_subject_;\r
        const std::wstring                                                              filename_;      \r
        const spl::shared_ptr<core::frame_factory>              frame_factory_;\r
        const core::video_format_desc                                   format_desc_;\r
@@ -336,6 +337,7 @@ struct flash_producer : public core::frame_producer
        std::queue<core::draw_frame>                                    frame_buffer_;\r
        tbb::concurrent_bounded_queue<core::draw_frame> output_buffer_;\r
                                \r
+       boost::timer                                                                    tick_timer_;\r
        std::unique_ptr<flash_renderer>                                 renderer_;\r
 \r
        core::draw_frame                                                                last_frame_;\r
@@ -355,6 +357,7 @@ public:
                fps_ = 0;\r
         \r
                graph_->set_color("buffer-size", diagnostics::color(1.0f, 1.0f, 0.0f));\r
+               graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f));\r
                graph_->set_color("late-frame", diagnostics::color(0.6f, 0.3f, 0.9f));\r
                graph_->set_text(print());\r
                diagnostics::register_graph(graph_);\r
@@ -384,6 +387,12 @@ public:
                if(frame != core::draw_frame::late())\r
                        last_frame_ = frame;\r
                \r
+               event_subject_ << monitor::event("host/path")   % filename_\r
+                                          << monitor::event("host/width")      % width_\r
+                                          << monitor::event("host/height") % height_\r
+                                          << monitor::event("host/fps")        % fps_\r
+                                          << monitor::event("buffer")          % output_buffer_.size() % buffer_size_;\r
+\r
                return frame;\r
        }\r
 \r
@@ -400,7 +409,7 @@ public:
                        {\r
                                if(!renderer_)\r
                                {\r
-                                       renderer_.reset(new flash_renderer(graph_, frame_factory_, filename_, width_, height_));\r
+                                       renderer_.reset(new flash_renderer(event_subject_, graph_, frame_factory_, filename_, width_, height_));\r
 \r
                                        while(output_buffer_.size() < buffer_size_)\r
                                                output_buffer_.push(core::draw_frame::empty());\r
@@ -435,6 +444,16 @@ public:
                return info;\r
        }\r
 \r
+       virtual void subscribe(const monitor::observable::observer_ptr& o) override\r
+       {\r
+               event_subject_.subscribe(o);\r
+       }\r
+\r
+       virtual void unsubscribe(const monitor::observable::observer_ptr& o) override\r
+       {\r
+               event_subject_.unsubscribe(o);\r
+       }\r
+\r
        // flash_producer\r
        \r
        void tick()\r
@@ -449,6 +468,8 @@ public:
                if(!renderer_)\r
                        frame_buffer_.push(core::draw_frame::empty());\r
 \r
+               tick_timer_.restart();                          \r
+\r
                if(frame_buffer_.empty())\r
                {                                       \r
                        tick();\r
@@ -479,6 +500,9 @@ public:
                                renderer_.reset();\r
                }\r
 \r
+               graph_->set_value("tick-time", static_cast<float>(tick_timer_.elapsed()/fps_)*0.5f);\r
+               event_subject_ << monitor::event("profiler/time") % tick_timer_.elapsed() % fps_;\r
+\r
                output_buffer_.push(std::move(frame_buffer_.front()));\r
                frame_buffer_.pop();\r
        }\r
index e971eb82d9b025894c4da5c7fef6d54fcb059d9b..8d0734725a079cfc6440bca1ff7c7677c3f2c164 100644 (file)
 \r
 #include <core/video_format.h>\r
 \r
+#include <core/producer/frame_producer.h>\r
 #include <core/frame/frame.h>\r
 #include <core/frame/draw_frame.h>\r
 #include <core/frame/frame_factory.h>\r
 #include <core/frame/pixel_format.h>\r
+#include <core/monitor/monitor.h>\r
 \r
 #include <common/env.h>\r
 #include <common/log.h>\r
@@ -46,8 +48,9 @@ namespace caspar { namespace image {
 \r
 struct image_producer : public core::frame_producer\r
 {      \r
-       const std::wstring      filename_;\r
-       core::draw_frame        frame_;\r
+       monitor::basic_subject  event_subject_;\r
+       const std::wstring              filename_;\r
+       core::draw_frame                frame_;\r
        \r
        explicit image_producer(const spl::shared_ptr<core::frame_factory>& frame_factory, const std::wstring& filename) \r
                : filename_(filename)\r
@@ -70,6 +73,8 @@ struct image_producer : public core::frame_producer
 \r
        virtual core::draw_frame receive(int) override\r
        {\r
+               event_subject_ << monitor::event("file/path") % filename_;\r
+\r
                return frame_;\r
        }\r
 \r
@@ -95,6 +100,16 @@ struct image_producer : public core::frame_producer
                info.add(L"filename", filename_);\r
                return info;\r
        }\r
+\r
+       virtual void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     \r
+       {\r
+               return event_subject_.subscribe(o);\r
+       }\r
+\r
+       virtual void unsubscribe(const monitor::observable::observer_ptr& o) override           \r
+       {\r
+               return event_subject_.unsubscribe(o);\r
+       }\r
 };\r
 \r
 spl::shared_ptr<core::frame_producer> create_producer(const spl::shared_ptr<core::frame_factory>& frame_factory, const core::video_format_desc& format_desc, const std::vector<std::wstring>& params)\r
index 65bc196df7a87f4a7dc7a5654c70569080361786..41e68f71f982155d158ed95f1dc3923b5198c699 100644 (file)
@@ -30,6 +30,7 @@
 #include <core/frame/frame_factory.h>\r
 #include <core/frame/frame_transform.h>\r
 #include <core/frame/pixel_format.h>\r
+#include <core/monitor/monitor.h>\r
 \r
 #include <common/env.h>\r
 #include <common/log.h>\r
@@ -51,6 +52,8 @@ namespace caspar { namespace image {
                \r
 struct image_scroll_producer : public core::frame_producer\r
 {      \r
+       monitor::basic_subject                  event_subject_;\r
+\r
        const std::wstring                              filename_;\r
        std::vector<core::draw_frame>   frames_;\r
        core::video_format_desc                 format_desc_;\r
@@ -188,6 +191,10 @@ struct image_scroll_producer : public core::frame_producer
                                frames_[n].transform().image_transform.fill_translation[1] = start_offset_[1];\r
                        }\r
                }\r
+               \r
+               event_subject_ << monitor::event("file/path") % filename_\r
+                                          << monitor::event("delta") % delta_ \r
+                                          << monitor::event("speed") % speed_;\r
 \r
                return last_frame_ = core::draw_frame(frames_);\r
        }\r
@@ -229,6 +236,16 @@ struct image_scroll_producer : public core::frame_producer
                        return result;\r
                }\r
        }\r
+\r
+       virtual void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     \r
+       {\r
+               return event_subject_.subscribe(o);\r
+       }\r
+\r
+       virtual void unsubscribe(const monitor::observable::observer_ptr& o) override           \r
+       {\r
+               return event_subject_.unsubscribe(o);\r
+       }\r
 };\r
 \r
 spl::shared_ptr<core::frame_producer> create_scroll_producer(const spl::shared_ptr<core::frame_factory>& frame_factory, const core::video_format_desc& format_desc, const std::vector<std::wstring>& params)\r
index 98c1fcf6cb460d7d133ed984dbce63b60d00fa64..76d89736daa9b78e79bfb5eed1fccfae0c0af030 100644 (file)
@@ -43,6 +43,7 @@ struct param_visitor : public boost::static_visitor<void>
        void operator()(const float value)                                      {o << value;}\r
        void operator()(const double value)                                     {o << static_cast<float>(value);}\r
        void operator()(const std::string& value)                       {o << value.c_str();}\r
+       void operator()(const std::wstring& value)                      {o << u8(value).c_str();}\r
        void operator()(const std::vector<int8_t>& value)       {o << ::osc::Blob(value.data(), static_cast<unsigned long>(value.size()));}\r
        void operator()(const monitor::duration& value)\r
        {\r