]> git.sesse.net Git - casparcg/commitdiff
manually merged a72be89 from master
authorniklaspandersson <niklas.p.andersson@svt.se>
Wed, 9 Oct 2013 07:57:59 +0000 (09:57 +0200)
committerniklaspandersson <niklas.p.andersson@svt.se>
Wed, 9 Oct 2013 07:57:59 +0000 (09:57 +0200)
58 files changed:
core/consumer/frame_consumer.cpp
core/consumer/frame_consumer.h
core/consumer/output.cpp
core/consumer/output.h
core/consumer/port.cpp
core/consumer/port.h
core/monitor/monitor.cpp
core/monitor/monitor.h
core/producer/color/color_producer.cpp
core/producer/draw/freehand_producer.cpp
core/producer/frame_producer.cpp
core/producer/frame_producer.h
core/producer/layer.cpp
core/producer/layer.h
core/producer/scene/const_producer.cpp
core/producer/scene/hotswap_producer.cpp
core/producer/scene/hotswap_producer.h
core/producer/scene/scene_producer.cpp
core/producer/scene/scene_producer.h
core/producer/separated/separated_producer.cpp
core/producer/stage.cpp
core/producer/stage.h
core/producer/text/text_producer.cpp
core/producer/text/text_producer.h
core/producer/transition/transition_producer.cpp
core/video_channel.cpp
core/video_channel.h
modules/bluefish/consumer/bluefish_consumer.cpp
modules/decklink/consumer/decklink_consumer.cpp
modules/decklink/interop/DeckLinkAPI.idl [deleted file]
modules/decklink/interop/DeckLinkAPI_h.h
modules/decklink/interop/DeckLinkAPI_i.c
modules/decklink/interop/DeckLinkAPI_v7_1.idl [deleted file]
modules/decklink/interop/DeckLinkAPI_v7_3.idl [deleted file]
modules/decklink/interop/DeckLinkAPI_v7_6.idl [deleted file]
modules/decklink/interop/DeckLinkAPI_v7_9.idl [deleted file]
modules/decklink/producer/decklink_producer.cpp
modules/ffmpeg/consumer/ffmpeg_consumer.cpp
modules/ffmpeg/producer/audio/audio_decoder.cpp
modules/ffmpeg/producer/audio/audio_decoder.h
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/video/video_decoder.cpp
modules/ffmpeg/producer/video/video_decoder.h
modules/flash/producer/cg_proxy.cpp
modules/flash/producer/cg_proxy.h
modules/flash/producer/flash_producer.cpp
modules/image/consumer/image_consumer.cpp
modules/image/producer/image_producer.cpp
modules/image/producer/image_scroll_producer.cpp
modules/oal/consumer/oal_consumer.cpp
modules/reroute/producer/reroute_producer.cpp
modules/screen/consumer/screen_consumer.cpp
protocol/osc/server.cpp
protocol/osc/server.h
shell/casparcg.config
shell/main.cpp
shell/server.cpp
shell/server.h

index de153d6a56090f73d7d95de6d2800bf10b3bd001..634ae9ea29922be906b1a5d92b08d3287a0001dc 100644 (file)
@@ -85,8 +85,7 @@ public:
        bool has_synchronization_clock() const override                                                                                                         {return consumer_->has_synchronization_clock();}
        int buffer_depth() const override                                                                                                                                       {return consumer_->buffer_depth();}
        int index() const override                                                                                                                                                      {return consumer_->index();}
-       void subscribe(const monitor::observable::observer_ptr& o) override                                                                     {consumer_->subscribe(o);}
-       void unsubscribe(const monitor::observable::observer_ptr& o) override                                                           {consumer_->unsubscribe(o);}                    
+       monitor::source& monitor_output() override                                                                                                                      {return consumer_->monitor_output();}                                                                           
 };
 
 class print_consumer_proxy : public frame_consumer
@@ -115,8 +114,7 @@ public:
        bool has_synchronization_clock() const override                                                                                         {return consumer_->has_synchronization_clock();}
        int buffer_depth() const override                                                                                                                       {return consumer_->buffer_depth();}
        int index() const override                                                                                                                                      {return consumer_->index();}
-       void subscribe(const monitor::observable::observer_ptr& o) override                                                                     {consumer_->subscribe(o);}
-       void unsubscribe(const monitor::observable::observer_ptr& o) override                                                           {consumer_->unsubscribe(o);}    
+       monitor::source& monitor_output() override                                                                                                      {return consumer_->monitor_output();}                                                                           
 };
 
 class recover_consumer_proxy : public frame_consumer
@@ -166,8 +164,7 @@ public:
        bool has_synchronization_clock() const override                                                 {return consumer_->has_synchronization_clock();}
        int buffer_depth() const override                                                                               {return consumer_->buffer_depth();}
        int index() const override                                                                                              {return consumer_->index();}
-       void subscribe(const monitor::observable::observer_ptr& o) override             {consumer_->subscribe(o);}
-       void unsubscribe(const monitor::observable::observer_ptr& o) override   {consumer_->unsubscribe(o);}    
+       monitor::source& monitor_output() override                                                              {return consumer_->monitor_output();}                                                                           
 };
 
 // This class is used to guarantee that audio cadence is correct. This is important for NTSC audio.
@@ -218,8 +215,7 @@ public:
        bool has_synchronization_clock() const override                                                 {return consumer_->has_synchronization_clock();}
        int buffer_depth() const override                                                                               {return consumer_->buffer_depth();}
        int index() const override                                                                                              {return consumer_->index();}
-       void subscribe(const monitor::observable::observer_ptr& o) override             {consumer_->subscribe(o);}
-       void unsubscribe(const monitor::observable::observer_ptr& o) override   {consumer_->unsubscribe(o);}    
+       monitor::source& monitor_output() override                                                              {return consumer_->monitor_output();}                                                                           
 };
 
 spl::shared_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)
@@ -263,8 +259,7 @@ const spl::shared_ptr<frame_consumer>& frame_consumer::empty()
                bool has_synchronization_clock() const override {return false;}
                int buffer_depth() const override {return 0;};
                virtual int index() const{return -1;}
-               void subscribe(const monitor::observable::observer_ptr& o) override{}
-               void unsubscribe(const monitor::observable::observer_ptr& o) override{}
+               monitor::source& monitor_output() override {static monitor::subject monitor_subject(""); return monitor_subject;}                                                                               
                boost::property_tree::wptree info() const override
                {
                        boost::property_tree::wptree info;
index 9288b2a487094070c35701d6bbb121e808bccfb7..8a078f89cd6555eab8c99048335a37796d2a6d14 100644 (file)
@@ -35,7 +35,7 @@
 namespace caspar { namespace core {
 
 // Interface
-class frame_consumer : public monitor::observable
+class frame_consumer
 {
        frame_consumer(const frame_consumer&);
        frame_consumer& operator=(const frame_consumer&);
@@ -57,8 +57,7 @@ public:
        
        // monitor::observable
 
-       virtual void subscribe(const monitor::observable::observer_ptr& o) = 0;
-       virtual void unsubscribe(const monitor::observable::observer_ptr& o) = 0;
+       virtual monitor::source& monitor_output() = 0;
 
        // Properties
 
index 01e4f7b7c51a68e793f09c4d4cff337353f7538b..e23908ca24f33df7f967dbf05afdbf0aaf0e89c0 100644 (file)
@@ -53,7 +53,7 @@ namespace caspar { namespace core {
 struct output::impl
 {              
        spl::shared_ptr<diagnostics::graph>     graph_;
-       monitor::basic_subject                          event_subject_;
+       monitor::subject                                        monitor_subject_;
        const int                                                       channel_index_;
        video_format_desc                                       format_desc_;
        std::map<int, port>                                     ports_; 
@@ -63,7 +63,7 @@ struct output::impl
 public:
        impl(spl::shared_ptr<diagnostics::graph> graph, const video_format_desc& format_desc, int channel_index) 
                : graph_(std::move(graph))
-               , event_subject_("output")
+               , monitor_subject_("/output")
                , channel_index_(channel_index)
                , format_desc_(format_desc)
                , executor_(L"output")
@@ -80,7 +80,7 @@ public:
                executor_.begin_invoke([this, index, consumer]
                {                       
                        port p(index, channel_index_, std::move(consumer));
-                       p.subscribe(event_subject_);
+                       p.monitor_output().link_target(&monitor_subject_);
                        ports_.insert(std::make_pair(index, std::move(p)));
                }, task_priority::high_priority);
        }
@@ -253,6 +253,5 @@ void output::remove(int index){impl_->remove(index);}
 void output::remove(const spl::shared_ptr<frame_consumer>& consumer){impl_->remove(consumer);}
 boost::unique_future<boost::property_tree::wptree> output::info() const{return impl_->info();}
 void output::operator()(const_frame frame, const video_format_desc& format_desc){(*impl_)(std::move(frame), format_desc);}
-void output::subscribe(const monitor::observable::observer_ptr& o) {impl_->event_subject_.subscribe(o);}
-void output::unsubscribe(const monitor::observable::observer_ptr& o) {impl_->event_subject_.unsubscribe(o);}
+monitor::source& output::monitor_output() {return impl_->monitor_subject_;}
 }}
\ No newline at end of file
index 00e69cbc5440cc60009d12e098028bf3adcf6274..5621bd6f2679f9d0325611a8140444aced81ddae 100644 (file)
@@ -34,7 +34,7 @@ FORWARD2(caspar, diagnostics, class graph);
 
 namespace caspar { namespace core {
        
-class output sealed : public monitor::observable
+class output sealed
 {
        output(const output&);
        output& operator=(const output&);
@@ -55,10 +55,7 @@ public:
        void remove(const spl::shared_ptr<class frame_consumer>& consumer);
        void remove(int index);
        
-       // monitor::observable
-
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
 
        // Properties
 
index b85849c9e6979e002a730cc3dbeddaa79a5ee80e..9ed7aae68a8415f355fa43b0a4be846574d32002 100644 (file)
@@ -4,23 +4,24 @@
 
 #include "frame_consumer.h"
 #include "../frame/frame.h"
+#include <boost/lexical_cast.hpp>
 
 namespace caspar { namespace core {
 
 struct port::impl
 {
-       monitor::basic_subject                          event_subject_;
+       monitor::subject                                        monitor_subject_;
        std::shared_ptr<frame_consumer>         consumer_;
        int                                                                     index_;
        int                                                                     channel_index_;
 public:
        impl(int index, int channel_index, spl::shared_ptr<frame_consumer> consumer)
-               : event_subject_(monitor::path("port") % index)
+               : monitor_subject_("/port" + boost::lexical_cast<std::string>(index))
                , consumer_(std::move(consumer))
                , index_(index)
                , channel_index_(channel_index)
        {
-               consumer_->subscribe(event_subject_);
+               consumer_->monitor_output().link_target(&monitor_subject_);
        }
        
        void video_format_desc(const struct video_format_desc& format_desc)
@@ -30,7 +31,7 @@ public:
                
        boost::unique_future<bool> send(const_frame frame)
        {
-               event_subject_ << monitor::event("type") % consumer_->name();
+               monitor_subject_ << monitor::message("/type") % consumer_->name();
                return consumer_->send(std::move(frame));
        }
        std::wstring print() const
@@ -64,8 +65,7 @@ port::port(port&& other) : impl_(std::move(other.impl_)){}
 port::~port(){}
 port& port::operator=(port&& other){impl_ = std::move(other.impl_); return *this;}
 boost::unique_future<bool> port::send(const_frame frame){return impl_->send(std::move(frame));}        
-void port::subscribe(const monitor::observable::observer_ptr& o){impl_->event_subject_.subscribe(o);}
-void port::unsubscribe(const monitor::observable::observer_ptr& o){impl_->event_subject_.unsubscribe(o);}
+monitor::source& port::monitor_output() {return impl_->monitor_subject_;}
 void port::video_format_desc(const struct video_format_desc& format_desc){impl_->video_format_desc(format_desc);}
 int port::buffer_depth() const{return impl_->buffer_depth();}
 std::wstring port::print() const{ return impl_->print();}
index 119deb0f71839af8ab19c4420fd87b5d40b6618f..a8bddc5fcdf84e0a1811c3cc3cd5785443d3d094 100644 (file)
@@ -9,7 +9,7 @@
 
 namespace caspar { namespace core {
 
-class port : public monitor::observable
+class port
 {
        port(const port&);
        port& operator=(const port&);
@@ -29,10 +29,7 @@ public:
 
        boost::unique_future<bool> send(class const_frame frame);       
 
-       // monitor::observable
-       
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
 
        // Properties
 
index 8d48970492819f8b210d89d32fb945871e2a7346..0378be0d5e023c60c74eaf2aea5659f41934d63c 100644 (file)
@@ -6,161 +6,4 @@
 
 namespace caspar { namespace monitor {
        
-// param
-       
-namespace detail {
-
-struct param_visitor : public boost::static_visitor<void>
-{
-       std::ostream& o;
-
-       param_visitor(std::ostream& o)
-               : o(o)
-       {
-       }
-
-       void operator()(const std::vector<int8_t>& bytes)
-       {               
-               o << std::string(std::begin(bytes), std::end(bytes));
-       }
-
-       void operator()(const duration& duration)
-       {               
-               o << duration.count();
-       }
-
-       template<typename T>
-       void operator()(const T& value)
-       {
-               o << value;
-       }
-};
-
-}
-
-std::ostream& operator<<(std::ostream& o, const param& p)
-{
-       detail::param_visitor v(o);
-       boost::apply_visitor(v, p);
-       return o;
-}
-
-// path
-
-path::path()
-{
-}
-
-path::path(const char* path)
-       : str_(path)
-{
-}
-
-path::path(std::string path)
-       : str_(path)
-{
-}
-
-path::path(const path& other)
-       : str_(other.str_)
-{              
-}
-       
-path::path(path&& other)
-       : str_(std::move(other.str_))
-{              
-}
-
-path& path::operator=(path other)
-{
-       std::swap(*this, other);
-       return *this;
-}
-
-path& path::operator%=(path other)
-{
-       return *this %= other.str_;
-}
-
-void path::swap(path& other)
-{
-       std::swap(str_, other.str_);
-}
-       
-const std::string& path::str() const
-{
-       return str_;
-}
-
-bool path::empty() const
-{
-       return str_.empty();
-}
-
-std::ostream& operator<<(std::ostream& o, const path& p)
-{
-       o << p.str();
-       return o;
-}
-
-// event
-
-event::event(monitor::path path)
-       : path_(std::move(path))
-{
-}
-       
-event::event(monitor::path path, params_t params)
-       : path_(std::move(path))
-       , params_(std::move(params))
-{
-}
-
-event::event(const event& other)
-       : path_(other.path_)
-       , params_(other.params_)
-{
-}
-
-event::event(event&& other)
-       : path_(std::move(other.path_))
-       , params_(std::move(other.params_))
-{
-}
-
-event& event::operator=(event other)
-{
-       other.swap(*this);
-       return *this;
-}
-
-void event::swap(event& other)
-{
-       std::swap(path_, other.path_);
-       std::swap(params_, other.params_);
-}
-               
-const path&    event::path() const             
-{
-       return path_;
-}
-
-const event::params_t& event::params() const   
-{
-       return params_;
-}
-
-event event::propagate(monitor::path path) const
-{
-       return event(std::move(path) % path_, params_);
-}
-
-std::ostream& operator<<(std::ostream& o, const event& e)
-{
-       o << e.path();
-       for(auto it = e.params().begin(); it != e.params().end(); ++it)
-               o << " " << *it;
-       return o;
-}
-
 }}
\ No newline at end of file
index ba6d7af282b703fe494c5db07c12cdfd388c8a19..d6f445f269ac884babf1f52f2abb5d3d30591c05 100644 (file)
 #pragma once
 
-#include <common/reactive.h>
-
-#include <functional>
-#include <memory>
-#include <ostream>
-#include <string>
-#include <type_traits>
-#include <vector>
+#include <common/memory.h>
+#include <common/assert.h>
 
 #include <boost/variant.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/chrono.hpp>
+#include <boost/chrono/duration.hpp>
 
-#include <tbb/cache_aligned_allocator.h>
-
-namespace boost {
-namespace detail { namespace variant {
-
-template <>
-struct has_nothrow_move<std::string>
-: mpl::true_
-{
-};
-  
-template <>
-struct has_nothrow_move<std::vector<int8_t>>
-: mpl::true_
-{
-};
-
-template <>
-struct has_nothrow_move<boost::chrono::duration<double, boost::ratio<1, 1>>>
-: mpl::true_
-{
-};
+#include <cstdint>
+#include <string>
+#include <vector>
 
-}}}
+#include <agents.h>
 
 namespace caspar { namespace monitor {
-       
-// path
-
-class path sealed
-{
-public:        
 
-       // Static Members
+typedef boost::variant<bool, 
+                                          std::int32_t, 
+                                          std::int64_t, 
+                                          float, 
+                                          double, 
+                                          std::string,
+                                          std::wstring,
+                                          std::vector<std::int8_t>> data_t;
 
-       // Constructors
-
-       path();         
-       path(const char* path);
-       path(std::string path);
-
-       path(const path& other);        
-       path(path&& other);
-               
-       // Methods
-
-       path& operator=(path other);
-       path& operator%=(path other);
-
-       template<typename T>
-       typename std::enable_if<!std::is_same<typename std::decay<T>::type, path>::value, path&>::type operator%=(T&& value)
-       {
-               auto str = boost::lexical_cast<std::string>(std::forward<T>(value));
-
-               if(!str.empty())
-                       str_ += (str.front() != '/' ? "/" : "") + std::move(str);
+class message
+{
+public:
 
-               return *this;
-       }
-       
-       path& operator%=(const char* value)
+       message(std::string path, std::vector<data_t> data = std::vector<data_t>())
+               : path_(std::move(path))
+               , data_ptr_(std::make_shared<std::vector<data_t>>(std::move(data)))
        {
-               return *this %= std::string(value);
+               CASPAR_ASSERT(path.empty() || path[0] == '/');
        }
 
-       void swap(path& other);
-
-       // Properties
-
-       const std::string& str() const; 
-       bool empty() const;
-private:
-       std::string str_;
-};
-
-template<typename T>
-path operator%(path path, T&& value)
-{      
-       return std::move(path %= std::forward<T>(value));
-}
-
-std::ostream& operator<<(std::ostream& o, const path& p);
-
-// param
-
-typedef boost::chrono::duration<double, boost::ratio<1, 1>> duration;
-
-typedef boost::variant<bool, int32_t, int64_t, float, double, std::string, std::wstring, std::vector<int8_t>, duration> param;
-
-std::ostream& operator<<(std::ostream& o, const param& p);
-
-// event
-
-class event sealed
-{      
-public:        
-       
-       // Static Members
-
-       typedef std::vector<param, tbb::cache_aligned_allocator<param>> params_t;
-
-       // Constructors
-
-       event(path path);       
-       event(path path, params_t params);                                      
-       event(const event& other);
-       event(event&& other);
-
-       // Methods
-
-       event& operator=(event other);
-
-       void swap(event& other);
-               
-       template<typename T>
-       event& operator%(T&& value)
+       message(std::string path, spl::shared_ptr<std::vector<data_t>> data_ptr)
+               : path_(std::move(path))
+               , data_ptr_(std::move(data_ptr))
        {
-               params_.push_back(std::forward<T>(value));
-               return *this;
+               CASPAR_ASSERT(path.empty() || path[0] == '/');
        }
-       
-       event propagate(path path) const;
-
-       // Properties
-
-       const path&             path() const;
-       const params_t& params() const;
-private:
-       monitor::path   path_;
-       params_t                params_;
-};
-
-std::ostream& operator<<(std::ostream& o, const event& e);
-
-// reactive
-
-typedef reactive::observable<monitor::event>   observable;
-typedef reactive::observer<monitor::event>             observer;
-typedef reactive::subject<monitor::event>              subject;
-       
-class basic_subject sealed : public reactive::subject<monitor::event>
-{          
-       basic_subject(const basic_subject&);
-       basic_subject& operator=(const basic_subject&);
-       
-       class impl : public observer
-       {
-       public:
-               impl(monitor::path path = monitor::path())
-                       : impl_()
-                       , path_(std::move(path))
-               {
-               }
-
-               impl(impl&& other)
-                       : impl_(std::move(other.impl_))
-                       , path_(std::move(other.path_))
-               {               
-               }
-
-               impl& operator=(impl&& other)
-               {
-                       impl_ = std::move(other.impl_);         
-                       path_ = std::move(other.path_);
-               }
-                                                       
-               void on_next(const monitor::event& e) override
-               {                               
-                       impl_.on_next(path_.empty() ? e : e.propagate(path_));
-               }
-
-               void subscribe(const observer_ptr& o)
-               {                               
-                       impl_.subscribe(o);
-               }
-
-               void unsubscribe(const observer_ptr& o)
-               {
-                       impl_.unsubscribe(o);
-               }
-                               
-       private:
-               reactive::basic_subject_impl<monitor::event>    impl_;          
-               monitor::path                                                                   path_;
-       };
-
-public:                
-
-       // Static Members
-
-       // Constructors
-
-       basic_subject(monitor::path path = monitor::path())
-               : impl_(std::make_shared<impl>(std::move(path)))
 
+       const std::string& path() const
        {
+               return path_;
        }
-               
-       basic_subject(basic_subject&& other)
-               : impl_(std::move(other.impl_))
+
+       const std::vector<data_t>& data() const
        {
+               return *data_ptr_;
        }
-       
-       // Methods
 
-       basic_subject& operator=(basic_subject&& other)
+       message propagate(const std::string& path) const
        {
-               impl_ = std::move(other.impl_);
+               return message(path + path_, data_ptr_);
        }
 
-       operator std::weak_ptr<observer>()
+       template<typename T>
+       message& operator%(T&& data)
        {
-               return impl_;
+               data_ptr_->push_back(std::forward<T>(data));
+               return *this;
        }
 
-       // observable
-       
-       void subscribe(const observer_ptr& o) override
-       {                               
-               impl_->subscribe(o);
-       }
+private:
+       std::string                                                             path_;
+       spl::shared_ptr<std::vector<data_t>>    data_ptr_;
+};
 
-       void unsubscribe(const observer_ptr& o) override
+class subject : public Concurrency::transformer<monitor::message, monitor::message>
+{
+public:
+       subject(std::string path = "")
+               : Concurrency::transformer<monitor::message, monitor::message>([=](const message& msg)
+               {
+                       return msg.propagate(path);
+               })
        {
-               impl_->unsubscribe(o);
+               CASPAR_ASSERT(path.empty() || path[0] == '/');
        }
 
-       // observer
-                               
-       void on_next(const monitor::event& e) override
-       {                               
-               impl_->on_next(e);
+       template<typename T>
+       subject& operator<<(T&& msg)
+       {
+               Concurrency::send(*this, std::forward<T>(msg));
+               return *this;
        }
-
-       // Properties
-
-private:
-       std::shared_ptr<impl> impl_;
 };
 
-inline subject& operator<<(subject& s, const event& e)
-{
-       s.on_next(e);
-       return s;
-}
+typedef Concurrency::ISource<monitor::message> source;
+
 
 }}
\ No newline at end of file
index b3de8c95b93a8f2bb4a6dbc3f495f4e8dcad1ebe..4d58ed838e4054536f2ccbdf6c917325bf455263 100644 (file)
@@ -41,7 +41,7 @@ namespace caspar { namespace core {
 
 class color_producer : public frame_producer_base
 {
-       monitor::basic_subject  event_subject_;
+       monitor::subject                monitor_subject_;
 
        const std::wstring              color_str_;
        constraints                             constraints_;
@@ -69,7 +69,7 @@ public:
                        
        draw_frame receive_impl() override
        {
-               event_subject_ << monitor::event("color") % color_str_;
+               monitor_subject_ << monitor::message("color") % color_str_;
 
                return frame_;
        }
@@ -97,15 +97,7 @@ public:
                return info;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     
-       {
-               return event_subject_.subscribe(o);
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override           
-       {
-               return event_subject_.unsubscribe(o);
-       }
+       monitor::source& monitor_output() override {return monitor_subject_;}                                                                           
 };
 
 std::wstring get_hex_color(const std::wstring& str)
index f426802affc65386d7a18fbad0c8e1e7da3a1781..53a1f45f7f1c9dcadf710312c36e17acd2f57f63 100644 (file)
@@ -161,12 +161,9 @@ public:
                return info;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     
-       {
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override           
+       monitor::source& monitor_output()
        {
+               static monitor::subject monitor_subject(""); return monitor_subject;
        }
 };
 
index e367316498d80c98c9306f68e09cb14cf0a7f989..bfe9223fb866ca91272a58b2ac3e46c991efd6c2 100644 (file)
@@ -167,8 +167,7 @@ const spl::shared_ptr<frame_producer>& frame_producer::empty()
                void paused(bool value) override{}
                uint32_t nb_frames() const override {return 0;}
                std::wstring print() const override { return L"empty";}
-               void subscribe(const monitor::observable::observer_ptr& o) override{}
-               void unsubscribe(const monitor::observable::observer_ptr& o) override{} 
+               monitor::source& monitor_output() override {static monitor::subject monitor_subject(""); return monitor_subject;}                                                                               
                std::wstring name() const override {return L"empty";}
                uint32_t frame_number() const override {return 0;}
                boost::unique_future<std::wstring> call(const std::vector<std::wstring>& params) override{CASPAR_THROW_EXCEPTION(not_supported());}
@@ -250,8 +249,7 @@ public:
        uint32_t                                                                                        nb_frames() const override                                                                                                              {return producer_->nb_frames();}
        class draw_frame                                                                        last_frame()                                                                                                                                    {return producer_->last_frame();}
        draw_frame                                                                                      create_thumbnail_frame()                                                                                                                {return producer_->create_thumbnail_frame();}
-       void                                                                                            subscribe(const monitor::observable::observer_ptr& o)                                                   {return producer_->subscribe(o);}
-       void                                                                                            unsubscribe(const monitor::observable::observer_ptr& o)                                                 {return producer_->unsubscribe(o);}
+       monitor::source&                                                                        monitor_output() override                                                                                                               {return producer_->monitor_output();}                                                                           
        bool                                                                                            collides(double x, double y)                                                                                                    {return producer_->collides(x, y);}
        void                                                                                            on_interaction(const interaction_event::ptr& event)                                                             {return producer_->on_interaction(event);}
        constraints&                                                                            pixel_constraints() override                                                                                                    {return producer_->pixel_constraints();}
index cbec012bbcbd080b64cb2aad40a7424e96fdbc48..4ff54790e07620d5646b82bdca8198987513ff01 100644 (file)
@@ -56,7 +56,7 @@ struct constraints
 };
        
 // Interface
-class frame_producer : public monitor::observable, public interaction_sink
+class frame_producer : public interaction_sink
 {
        frame_producer(const frame_producer&);
        frame_producer& operator=(const frame_producer&);
@@ -80,8 +80,7 @@ public:
        
        // monitor::observable
 
-       virtual void subscribe(const monitor::observable::observer_ptr& o) = 0;
-       virtual void unsubscribe(const monitor::observable::observer_ptr& o) = 0;
+       virtual monitor::source& monitor_output() = 0;
 
        // interaction_sink
        virtual void on_interaction(const interaction_event::ptr& event) override { }
index bc5267fa91e24d6382b47c458a89618a41a64af3..7bbdd056582264a2cd339ee7c42722cf44e16eb6 100644 (file)
@@ -36,23 +36,28 @@ namespace caspar { namespace core {
 
 struct layer::impl
 {                              
-       monitor::basic_subject                          event_subject_;
-       monitor::basic_subject                          foreground_event_subject_;
-       monitor::basic_subject                          background_event_subject_;
+       monitor::subject                                        monitor_subject_;
        spl::shared_ptr<frame_producer>         foreground_;
        spl::shared_ptr<frame_producer>         background_;
        boost::optional<int32_t>                        auto_play_delta_;
 
 public:
        impl(int index) 
-               : event_subject_(monitor::path("layer") % index)
-               , foreground_event_subject_("")
-               , background_event_subject_("background")
+               : monitor_subject_("/layer/" + boost::lexical_cast<std::string>(index))
+//             , foreground_event_subject_("")
+//             , background_event_subject_("background")
                , foreground_(frame_producer::empty())
                , background_(frame_producer::empty())
        {
-               foreground_event_subject_.subscribe(event_subject_);
-               background_event_subject_.subscribe(event_subject_);
+//             foreground_event_subject_.subscribe(event_subject_);
+//             background_event_subject_.subscribe(event_subject_);
+       }
+
+       void set_foreground(spl::shared_ptr<frame_producer> producer)
+       {
+               foreground_->monitor_output().unlink_target(&monitor_subject_);
+               foreground_ = std::move(producer);
+               foreground_->monitor_output().link_target(&monitor_subject_);
        }
 
        void pause()
@@ -62,9 +67,9 @@ public:
        
        void load(spl::shared_ptr<frame_producer> producer, bool preview, const boost::optional<int32_t>& auto_play_delta)
        {               
-               background_->unsubscribe(background_event_subject_);
+//             background_->unsubscribe(background_event_subject_);
                background_ = std::move(producer);
-               background_->subscribe(background_event_subject_);
+//             background_->subscribe(background_event_subject_);
 
                auto_play_delta_ = auto_play_delta;
 
@@ -84,13 +89,8 @@ public:
                {
                        background_->leading_producer(foreground_);
 
-                       background_->unsubscribe(background_event_subject_);
-                       foreground_->unsubscribe(foreground_event_subject_);
-
-                       foreground_ = std::move(background_);
+                       set_foreground(background_);
                        background_ = std::move(frame_producer::empty());
-                       
-                       foreground_->subscribe(foreground_event_subject_);
 
                        auto_play_delta_.reset();
                }
@@ -100,9 +100,7 @@ public:
        
        void stop()
        {
-               foreground_->unsubscribe(foreground_event_subject_);
-
-               foreground_ = std::move(frame_producer::empty());
+               set_foreground(frame_producer::empty());
 
                auto_play_delta_.reset();
        }
@@ -126,13 +124,13 @@ public:
                                }
                        }
 
-                       event_subject_  << monitor::event("time")       % monitor::duration(foreground_->frame_number()/format_desc.fps)
-                                                                                                               % monitor::duration(static_cast<int64_t>(foreground_->nb_frames()) - static_cast<int64_t>(auto_play_delta_ ? *auto_play_delta_ : 0)/format_desc.fps)
-                                                       << monitor::event("frame")      % static_cast<int64_t>(foreground_->frame_number())
-                                                                                                               % static_cast<int64_t>((static_cast<int64_t>(foreground_->nb_frames()) - static_cast<int64_t>(auto_play_delta_ ? *auto_play_delta_ : 0)));
+                       //event_subject_        << monitor::event("time")       % monitor::duration(foreground_->frame_number()/format_desc.fps)
+                       //                                                                                      % monitor::duration(static_cast<int64_t>(foreground_->nb_frames()) - static_cast<int64_t>(auto_play_delta_ ? *auto_play_delta_ : 0)/format_desc.fps)
+                       //                              << monitor::event("frame")      % static_cast<int64_t>(foreground_->frame_number())
+                       //                                                                                      % static_cast<int64_t>((static_cast<int64_t>(foreground_->nb_frames()) - static_cast<int64_t>(auto_play_delta_ ? *auto_play_delta_ : 0)));
 
-                       foreground_event_subject_ << monitor::event("type") % foreground_->name();
-                       background_event_subject_ << monitor::event("type") % background_->name();
+                       //foreground_event_subject_ << monitor::event("type") % foreground_->name();
+                       //background_event_subject_ << monitor::event("type") % background_->name();
                                
                        return frame;
                }
@@ -189,8 +187,7 @@ draw_frame layer::receive(const video_format_desc& format_desc) {return impl_->r
 spl::shared_ptr<frame_producer> layer::foreground() const { return impl_->foreground_;}
 spl::shared_ptr<frame_producer> layer::background() const { return impl_->background_;}
 boost::property_tree::wptree layer::info() const{return impl_->info();}
-void layer::subscribe(const monitor::observable::observer_ptr& o) {impl_->event_subject_.subscribe(o);}
-void layer::unsubscribe(const monitor::observable::observer_ptr& o) {impl_->event_subject_.unsubscribe(o);}
+monitor::source& layer::monitor_output() {return impl_->monitor_subject_;}
 void layer::on_interaction(const interaction_event::ptr& event) { impl_->on_interaction(event); }
 bool layer::collides(double x, double y) const { return impl_->collides(x, y); }
 }}
\ No newline at end of file
index b35bb570d629b90cbb31de793ab7740a05a10aaa..d81baa0b85d12e8b3289e328c1580ba1b9f9b2b2 100644 (file)
@@ -38,7 +38,7 @@ FORWARD1(boost, template<typename T> class optional);
 
 namespace caspar { namespace core {
        
-class layer sealed : public monitor::observable, public interaction_sink
+class layer sealed : public interaction_sink
 {
        layer(const layer&);
        layer& operator=(const layer&);
@@ -65,8 +65,7 @@ public:
        
        // monitor::observable
 
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
 
        // interaction_sink
 
index 223263127dd3e08b142443e31c176b9d07e05930..6f2c2269c39861f359abc97ecb6887ac65311f24 100644 (file)
@@ -82,12 +82,9 @@ public:
                return info;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     
-       {
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override           
+       monitor::source& monitor_output()
        {
+               static monitor::subject monitor_subject(""); return monitor_subject;
        }
 };
 
index f120cc8f8327afd1ccf985c4abb6935acd0f382b..15644060afdad6787f9bcb4cf582cf0b8a07ca94 100644 (file)
@@ -87,12 +87,9 @@ boost::property_tree::wptree hotswap_producer::info() const
        return info;
 }
 
-void hotswap_producer::subscribe(const monitor::observable::observer_ptr& o)
-{
-}
-
-void hotswap_producer::unsubscribe(const monitor::observable::observer_ptr& o)
+monitor::source& hotswap_producer::monitor_output()
 {
+       static monitor::subject monitor_subject(""); return monitor_subject;
 }
 
 binding<std::shared_ptr<frame_producer>>& hotswap_producer::producer()
index 5e95caabc69fb0ab1f5d89d161d891d80232dc99..756e2dd4d5d8a364ecf32f473e3e076abae1db97 100644 (file)
@@ -41,8 +41,7 @@ public:
        std::wstring print() const override;
        std::wstring name() const override;
        boost::property_tree::wptree info() const override;
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
 
        binding<std::shared_ptr<frame_producer>>& producer();
 private:
index 133871aab425d9e16467166a2359474d76576fc1..61eace8e56cfa8ccc00532fab443ba5e2beb71c9 100644 (file)
@@ -273,12 +273,9 @@ struct scene_producer::impl
                return info;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o)
-       {
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o)
+       monitor::source& monitor_output()
        {
+               static monitor::subject monitor_subject(""); return monitor_subject;
        }
 };
 
@@ -345,14 +342,9 @@ boost::unique_future<std::wstring> scene_producer::call(const std::vector<std::w
        return impl_->call(params);
 }
 
-void scene_producer::subscribe(const monitor::observable::observer_ptr& o)
-{
-       impl_->subscribe(o);
-}
-
-void scene_producer::unsubscribe(const monitor::observable::observer_ptr& o)
+monitor::source& scene_producer::monitor_output()
 {
-       impl_->unsubscribe(o);
+       return impl_->monitor_output();
 }
 
 void scene_producer::store_keyframe(void* timeline_identity, const keyframe& k)
index 5e8f27b057d7a86905a91ff2d11e206c5e9f2265..32e8e2c3102575704c8fa91aed78663adffded1f 100644 (file)
@@ -94,8 +94,8 @@ public:
        std::wstring name() const override;
        boost::unique_future<std::wstring>      call(const std::vector<std::wstring>& params) override;
        boost::property_tree::wptree info() const override;
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
+
        layer& create_layer(
                        const spl::shared_ptr<frame_producer>& producer, int x, int y, const std::wstring& name);
        layer& create_layer(
index f2848a6b050393816a4755221c1f8690cfeb9158..a1acef3fa3a2567c9a28f824ebc98f301c50bab0 100644 (file)
@@ -33,8 +33,8 @@ namespace caspar { namespace core {
 
 class separated_producer : public frame_producer_base
 {              
-       monitor::basic_subject                  event_subject_;
-       monitor::basic_subject                  key_event_subject_;
+       monitor::subject                                monitor_subject_;
+       monitor::subject                                key_monitor_subject_;
 
        spl::shared_ptr<frame_producer> fill_producer_;
        spl::shared_ptr<frame_producer> key_producer_;
@@ -43,7 +43,8 @@ class separated_producer : public frame_producer_base
                        
 public:
        explicit separated_producer(const spl::shared_ptr<frame_producer>& fill, const spl::shared_ptr<frame_producer>& key) 
-               : key_event_subject_("keyer")           
+               : monitor_subject_("")
+               , key_monitor_subject_("/keyer")                
                , fill_producer_(fill)
                , key_producer_(key)
                , fill_(core::draw_frame::late())
@@ -51,10 +52,10 @@ public:
        {
                CASPAR_LOG(info) << print() << L" Initialized";
 
-               key_event_subject_.subscribe(event_subject_);
+               key_monitor_subject_.link_target(&monitor_subject_);
 
-               key_producer_->subscribe(key_event_subject_);
-               fill_producer_->subscribe(event_subject_);
+               key_producer_->monitor_output().link_target(&key_monitor_subject_);
+               fill_producer_->monitor_output().link_target(&monitor_subject_);
        }
 
        // frame_producer
@@ -134,15 +135,7 @@ public:
                return fill_producer_->info();;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     
-       {
-               return event_subject_.subscribe(o);
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override           
-       {
-               return event_subject_.unsubscribe(o);
-       }
+       monitor::source& monitor_output() { return monitor_subject_; }
 };
 
 spl::shared_ptr<frame_producer> create_separated_producer(const spl::shared_ptr<frame_producer>& fill, const spl::shared_ptr<frame_producer>& key)
index 6175ba030174e5830b1bb7b62a839fb15d4ff0ad..938c5023553ff12d36939442c10059f9c2db6b5e 100644 (file)
@@ -51,8 +51,8 @@ namespace caspar { namespace core {
 struct stage::impl : public std::enable_shared_from_this<impl>
 {                              
        spl::shared_ptr<diagnostics::graph>                                                     graph_;
-       monitor::basic_subject                                                                          event_subject_;
-       reactive::basic_subject<std::map<int, class draw_frame>>        frames_subject_;
+       monitor::subject                                                                                        monitor_subject_;
+       //reactive::basic_subject<std::map<int, class draw_frame>>      frames_subject_;
        std::map<int, layer>                                                                            layers_;        
        std::map<int, tweened_transform>                                                        tweens_;
        interaction_aggregator                                                                          aggregator_;
@@ -60,7 +60,7 @@ struct stage::impl : public std::enable_shared_from_this<impl>
 public:
        impl(spl::shared_ptr<diagnostics::graph> graph) 
                : graph_(std::move(graph))
-               , event_subject_("stage")
+               , monitor_subject_("/stage")
                , aggregator_([=] (double x, double y) { return collission_detect(x, y); })
                , executor_(L"stage")
        {
@@ -101,10 +101,10 @@ public:
                        return frames;
                });
                
-               frames_subject_ << frames;
+               //frames_subject_ << frames;
                
                graph_->set_value("produce-time", frame_timer.elapsed()*format_desc.fps*0.5);
-               event_subject_ << monitor::event("profiler/time") % frame_timer.elapsed() % (1.0/format_desc.fps);
+               monitor_subject_ << monitor::message("/profiler/time") % frame_timer.elapsed() % (1.0/format_desc.fps);
 
                return frames;
        }
@@ -134,7 +134,7 @@ public:
                if(it == std::end(layers_))
                {
                        it = layers_.insert(std::make_pair(index, layer(index))).first;
-                       it->second.subscribe(event_subject_);
+                       it->second.monitor_output().link_target(&monitor_subject_);
                }
                return it->second;
        }
@@ -190,7 +190,7 @@ public:
        {               
                return executor_.begin_invoke([=]
                {
-                       layers_[index].pause();
+                       get_layer(index).pause();
                }, task_priority::high_priority);
        }
 
@@ -198,7 +198,7 @@ public:
        {               
                return executor_.begin_invoke([=]
                {
-                       layers_[index].play();
+                       get_layer(index).play();
                }, task_priority::high_priority);
        }
 
@@ -206,7 +206,7 @@ public:
        {               
                return executor_.begin_invoke([=]
                {
-                       layers_[index].stop();
+                       get_layer(index).stop();
                }, task_priority::high_priority);
        }
 
@@ -239,18 +239,18 @@ public:
                        auto other_layers       = other_impl->layers_ | boost::adaptors::map_values;
 
                        BOOST_FOREACH(auto& layer, layers)
-                               layer.unsubscribe(event_subject_);
+                               layer.monitor_output().unlink_target(&monitor_subject_);
                        
                        BOOST_FOREACH(auto& layer, other_layers)
-                               layer.unsubscribe(event_subject_);
+                               layer.monitor_output().unlink_target(&monitor_subject_);
                        
                        std::swap(layers_, other_impl->layers_);
                                                
                        BOOST_FOREACH(auto& layer, layers)
-                               layer.subscribe(event_subject_);
+                               layer.monitor_output().link_target(&monitor_subject_);
                        
                        BOOST_FOREACH(auto& layer, other_layers)
-                               layer.subscribe(event_subject_);
+                               layer.monitor_output().link_target(&monitor_subject_);
                };              
 
                return executor_.begin_invoke([=]
@@ -263,7 +263,7 @@ public:
        {
                return executor_.begin_invoke([=]
                {
-                       std::swap(layers_[index], layers_[other_index]);
+                       std::swap(get_layer(index), get_layer(other_index));
                }, task_priority::high_priority);
        }
 
@@ -280,13 +280,13 @@ public:
                                auto& my_layer          = get_layer(index);
                                auto& other_layer       = other_impl->get_layer(other_index);
 
-                               my_layer.unsubscribe(event_subject_);
-                               other_layer.unsubscribe(other_impl->event_subject_);
+                               my_layer.monitor_output().unlink_target(&monitor_subject_);
+                               other_layer.monitor_output().unlink_target(&other_impl->monitor_subject_);
 
                                std::swap(my_layer, other_layer);
 
-                               my_layer.subscribe(event_subject_);
-                               other_layer.subscribe(other_impl->event_subject_);
+                               my_layer.monitor_output().link_target(&monitor_subject_);
+                               other_layer.monitor_output().link_target(&other_impl->monitor_subject_);
                        };              
 
                        return executor_.begin_invoke([=]
@@ -300,7 +300,7 @@ public:
        {
                return executor_.begin_invoke([=]
                {
-                       return layers_[index].foreground();
+                       return get_layer(index).foreground();
                }, task_priority::high_priority);
        }
        
@@ -308,7 +308,7 @@ public:
        {
                return executor_.begin_invoke([=]
                {
-                       return layers_[index].background();
+                       return get_layer(index).background();
                }, task_priority::high_priority);
        }
 
@@ -328,7 +328,7 @@ public:
        {
                return executor_.begin_invoke([=]
                {
-                       return layers_[index].info();
+                       return get_layer(index).info();
                }, task_priority::high_priority);
        }               
        
@@ -336,7 +336,7 @@ public:
        {
                return flatten(executor_.begin_invoke([=]
                {
-                       return make_shared(layers_[index].foreground()->call(params));
+                       return make_shared(get_layer(index).foreground()->call(params));
                }, task_priority::high_priority));
        }
 
@@ -389,9 +389,8 @@ boost::unique_future<spl::shared_ptr<frame_producer>> stage::background(int inde
 boost::unique_future<boost::property_tree::wptree> stage::info() const{return impl_->info();}
 boost::unique_future<boost::property_tree::wptree> stage::info(int index) const{return impl_->info(index);}
 std::map<int, class draw_frame> stage::operator()(const video_format_desc& format_desc){return (*impl_)(format_desc);}
-void stage::subscribe(const monitor::observable::observer_ptr& o) {impl_->event_subject_.subscribe(o);}
-void stage::unsubscribe(const monitor::observable::observer_ptr& o) {impl_->event_subject_.unsubscribe(o);}
-void stage::subscribe(const frame_observable::observer_ptr& o) {impl_->frames_subject_.subscribe(o);}
-void stage::unsubscribe(const frame_observable::observer_ptr& o) {impl_->frames_subject_.unsubscribe(o);}
+monitor::source& stage::monitor_output(){return impl_->monitor_subject_;}
+//void stage::subscribe(const frame_observable::observer_ptr& o) {impl_->frames_subject_.subscribe(o);}
+//void stage::unsubscribe(const frame_observable::observer_ptr& o) {impl_->frames_subject_.unsubscribe(o);}
 void stage::on_interaction(const interaction_event::ptr& event) { impl_->on_interaction(event); }
 }}
index 70a5f8ad92b92883eca1aae376f75a134413dffe..77595ecaec43673b620a50f4cf95d7817e97a276 100644 (file)
@@ -43,9 +43,9 @@ FORWARD2(caspar, diagnostics, class graph);
 
 namespace caspar { namespace core {
 
-typedef reactive::observable<std::map<int, class draw_frame>> frame_observable;
+//typedef reactive::observable<std::map<int, class draw_frame>> frame_observable;
        
-class stage sealed : public monitor::observable, public frame_observable, public interaction_sink
+class stage sealed : public interaction_sink
 {
        stage(const stage&);
        stage& operator=(const stage&);
@@ -79,15 +79,11 @@ public:
        boost::unique_future<void>                      swap_layer(int index, int other_index);
        boost::unique_future<void>                      swap_layer(int index, int other_index, stage& other);   
 
-       // monitor::observable
+       monitor::source& monitor_output();      
 
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
-       
        // frame_observable
-
-       void subscribe(const frame_observable::observer_ptr& o) override;
-       void unsubscribe(const frame_observable::observer_ptr& o) override;
+       //void subscribe(const frame_observable::observer_ptr& o) override;
+       //void unsubscribe(const frame_observable::observer_ptr& o) override;
 
        // interaction_sink
 
index 7777cd9b2c790dcea5aca416735c3fe8cb0e37b0..6e8b386a382321d577124dbc7362efd6f958f452 100644 (file)
@@ -308,8 +308,7 @@ constraints& text_producer::pixel_constraints() { return impl_->pixel_constraint
 std::wstring text_producer::print() const { return impl_->print(); }
 std::wstring text_producer::name() const { return impl_->name(); }
 boost::property_tree::wptree text_producer::info() const { return impl_->info(); }
-void text_producer::subscribe(const monitor::observable::observer_ptr& o) {}
-void text_producer::unsubscribe(const monitor::observable::observer_ptr& o) {}
+monitor::source& text_producer::monitor_output() { static monitor::subject monitor_subject(""); return monitor_subject; }
 binding<std::wstring>& text_producer::text() { return impl_->text(); }
 binding<double>& text_producer::tracking() { return impl_->tracking(); }
 const binding<double>& text_producer::current_bearing_y() const { return impl_->current_bearing_y(); }
index 97e47888f88e8bce79bb65919f811cbeaedfc378..4921792e54302b1dccf044ded9c9059cd661d1c4 100644 (file)
@@ -56,8 +56,7 @@ public:
        std::wstring print() const override;
        std::wstring name() const override;
        boost::property_tree::wptree info() const override;
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
 
        binding<std::wstring>& text();
        binding<double>& tracking();
index cc9fd328405d35ce435dfd8d5518969f24ace9a7..50a8761d28e6734299934eb952b2c80258d9bd78 100644 (file)
@@ -34,7 +34,7 @@ namespace caspar { namespace core {
 
 class transition_producer : public frame_producer_base
 {      
-       monitor::basic_subject                          event_subject_;
+       monitor::subject                                        monitor_subject_;
        const field_mode                                        mode_;
        int                                                                     current_frame_;
        
@@ -54,7 +54,7 @@ public:
                , source_producer_(frame_producer::empty())
                , paused_(false)
        {
-               dest->subscribe(event_subject_);
+               dest->monitor_output().link_target(&monitor_subject_);
 
                CASPAR_LOG(info) << print() << L" Initialized";
        }
@@ -93,8 +93,8 @@ public:
                                source = source_producer_->last_frame();
                });                     
                                                
-               event_subject_  << monitor::event("transition/frame") % current_frame_ % info_.duration
-                                               << monitor::event("transition/type") % [&]() -> std::string
+               monitor_subject_        << monitor::message("/transition/frame") % current_frame_ % info_.duration
+                                               << monitor::message("/transition/type") % [&]() -> std::string
                                                                                                                                {
                                                                                                                                        switch(info_.type.value())
                                                                                                                                        {
@@ -207,14 +207,9 @@ public:
                return draw_frame::over(s_frame, d_frame);
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     
+       monitor::source& monitor_output()
        {
-               event_subject_.subscribe(o);
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override           
-       {
-               event_subject_.unsubscribe(o);
+               return monitor_subject_;
        }
 
        void on_interaction(const interaction_event::ptr& event) override
index 6614f48567d43cf327ac472fd5456ddd048134b9..1bdf34e0f1e737d5508139236ade590b582ee439 100644 (file)
@@ -49,7 +49,7 @@ namespace caspar { namespace core {
 
 struct video_channel::impl sealed
 {
-       monitor::basic_subject                                                  event_subject_;
+       monitor::subject                                                                monitor_subject_;
 
        const int                                                                               index_;
 
@@ -66,7 +66,7 @@ struct video_channel::impl sealed
        executor                                                                                executor_;
 public:
        impl(int index, const core::video_format_desc& format_desc, std::unique_ptr<image_mixer> image_mixer)  
-               : event_subject_(monitor::path() % "channel" % index)
+               : monitor_subject_("/channel" + boost::lexical_cast<std::string>(index))
                , index_(index)
                , format_desc_(format_desc)
                , output_(graph_, format_desc, index)
@@ -79,8 +79,8 @@ public:
                graph_->set_text(print());
                diagnostics::register_graph(graph_);
                
-               output_.subscribe(event_subject_);
-               stage_.subscribe(event_subject_);
+               output_.monitor_output().link_target(&monitor_subject_);
+               stage_.monitor_output().link_target(&monitor_subject_);
 
                executor_.begin_invoke([=]{tick();});
 
@@ -127,8 +127,8 @@ public:
                
                        graph_->set_value("tick-time", frame_timer.elapsed()*format_desc.fps*0.5);
 
-                       event_subject_  << monitor::event("profiler/time")      % frame_timer.elapsed() % (1.0/format_desc_.fps)
-                                                       << monitor::event("format")                     % format_desc.name;
+                       monitor_subject_        << monitor::message("/profiler/time")   % frame_timer.elapsed() % (1.0/format_desc_.fps)
+                                                               << monitor::message("/format")                  % format_desc.name;
                }
                catch(...)
                {
@@ -172,7 +172,6 @@ spl::shared_ptr<frame_factory> video_channel::frame_factory() { return impl_->im
 core::video_format_desc video_channel::video_format_desc() const{return impl_->video_format_desc();}
 void core::video_channel::video_format_desc(const core::video_format_desc& format_desc){impl_->video_format_desc(format_desc);}
 boost::property_tree::wptree video_channel::info() const{return impl_->info();}                
-void video_channel::subscribe(const monitor::observable::observer_ptr& o) {impl_->event_subject_.subscribe(o);}
-void video_channel::unsubscribe(const monitor::observable::observer_ptr& o) {impl_->event_subject_.unsubscribe(o);}
+monitor::source& video_channel::monitor_output(){return impl_->monitor_subject_;}
 
 }}
\ No newline at end of file
index 2390819a9b26ea3205134177fcfdf38b3c04a2f8..df3cc0411f979a6b77e90281f200a10e3e6c3642 100644 (file)
@@ -39,7 +39,7 @@ FORWARD2(caspar, core, class frame_factory);
 
 namespace caspar { namespace core {
        
-class video_channel sealed : public monitor::observable
+class video_channel sealed
 {
        video_channel(const video_channel&);
        video_channel& operator=(const video_channel&);
@@ -54,10 +54,7 @@ public:
 
        // Methods
                        
-       // monitor::observable
-
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
 
        // Properties
 
index 23421ff0275a85bba14a45cbe8c1e003b1917ad4..e223bc4fa4a73dd52845564e0617e5ec2c91f795 100644 (file)
@@ -363,13 +363,10 @@ public:
                return 400 + device_index_;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
+               static monitor::subject monitor_subject(""); return monitor_subject;
        }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
-       {
-       }       
 };     
 
 spl::shared_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)
index f5e0e69ef18b1830a32d47c1019ab0646d30d8f9..11c22634ecf664d022ec30fb2065860dc5a17ccc 100644 (file)
@@ -589,13 +589,10 @@ public:
                return 300 + config_.device_index;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
+               static monitor::subject monitor_subject(""); return monitor_subject;
        }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
-       {
-       }       
 };     
 
 spl::shared_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params) 
diff --git a/modules/decklink/interop/DeckLinkAPI.idl b/modules/decklink/interop/DeckLinkAPI.idl
deleted file mode 100644 (file)
index abe5247..0000000
+++ /dev/null
@@ -1,1159 +0,0 @@
-/* -LICENSE-START-\r
-** Copyright (c) 2011 Blackmagic Design\r
-**\r
-** Permission is hereby granted, free of charge, to any person or organization\r
-** obtaining a copy of the software and accompanying documentation covered by\r
-** this license (the "Software") to use, reproduce, display, distribute,\r
-** execute, and transmit the Software, and to prepare derivative works of the\r
-** Software, and to permit third-parties to whom the Software is furnished to\r
-** do so, all subject to the following:\r
-** \r
-** The copyright notices in the Software and this entire statement, including\r
-** the above license grant, this restriction and the following disclaimer,\r
-** must be included in all copies of the Software, in whole or in part, and\r
-** all derivative works of the Software, unless such copies or derivative\r
-** works are solely in the form of machine-executable object code generated by\r
-** a source language processor.\r
-** \r
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\r
-** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\r
-** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\r
-** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
-** DEALINGS IN THE SOFTWARE.\r
-** -LICENSE-END-\r
-*/\r
-\r
-/* DeckLinkAPI.idl */\r
-\r
-import "unknwn.idl";\r
-\r
-[uuid(D864517A-EDD5-466D-867D-C819F1C052BB),\r
-version(1.0), helpstring("DeckLink API Library")]\r
-library DeckLinkAPI\r
-{\r
-\r
-// Type Declarations\r
-\r
-typedef LONGLONG BMDTimeValue;\r
-typedef LONGLONG BMDTimeScale;\r
-typedef unsigned long BMDTimecodeBCD;\r
-typedef unsigned long BMDTimecodeUserBits;\r
-\r
-\r
-// Enumeration Mapping\r
-\r
-cpp_quote("typedef unsigned long BMDDisplayModeFlags;")\r
-cpp_quote("typedef unsigned long BMDFrameFlags;")\r
-cpp_quote("typedef unsigned long BMDVideoInputFlags;")\r
-cpp_quote("typedef unsigned long BMDVideoInputFormatChangedEvents;")\r
-cpp_quote("typedef unsigned long BMDDetectedVideoInputFormatFlags;")\r
-cpp_quote("typedef unsigned long BMDTimecodeFlags;")\r
-cpp_quote("typedef unsigned long BMDAnalogVideoFlags;")\r
-cpp_quote("typedef unsigned long BMDDeckControlStatusFlags;")\r
-cpp_quote("typedef unsigned long BMDDeckControlExportModeOpsFlags;")\r
-cpp_quote("#if 0")\r
-typedef enum _BMDDisplayModeFlags BMDDisplayModeFlags;\r
-typedef enum _BMDFrameFlags BMDFrameFlags;\r
-typedef enum _BMDVideoInputFlags BMDVideoInputFlags;\r
-typedef enum _BMDVideoInputFormatChangedEvents BMDVideoInputFormatChangedEvents;\r
-typedef enum _BMDDetectedVideoInputFormatFlags BMDDetectedVideoInputFormatFlags;\r
-typedef enum _BMDTimecodeFlags BMDTimecodeFlags;\r
-typedef enum _BMDAnalogVideoFlags BMDAnalogVideoFlags;\r
-typedef enum _BMDDeckControlStatusFlags BMDDeckControlStatusFlags;\r
-typedef enum _BMDDeckControlExportModeOpsFlags BMDDeckControlExportModeOpsFlags;\r
-cpp_quote("#endif")\r
-\r
-\r
-/* Enum BMDDisplayMode - Video display modes */\r
-\r
-typedef [v1_enum] enum _BMDDisplayMode {\r
-\r
-    /* SD Modes */\r
-\r
-    bmdModeNTSC                                        = /* 'ntsc' */ 0x6E747363,\r
-    bmdModeNTSC2398                                    = /* 'nt23' */ 0x6E743233,      // 3:2 pulldown\r
-    bmdModePAL                                         = /* 'pal ' */ 0x70616C20,\r
-    bmdModeNTSCp                                       = /* 'ntsp' */ 0x6E747370,\r
-    bmdModePALp                                        = /* 'palp' */ 0x70616C70,\r
-\r
-    /* HD 1080 Modes */\r
-\r
-    bmdModeHD1080p2398                                 = /* '23ps' */ 0x32337073,\r
-    bmdModeHD1080p24                                   = /* '24ps' */ 0x32347073,\r
-    bmdModeHD1080p25                                   = /* 'Hp25' */ 0x48703235,\r
-    bmdModeHD1080p2997                                 = /* 'Hp29' */ 0x48703239,\r
-    bmdModeHD1080p30                                   = /* 'Hp30' */ 0x48703330,\r
-    bmdModeHD1080i50                                   = /* 'Hi50' */ 0x48693530,\r
-    bmdModeHD1080i5994                                 = /* 'Hi59' */ 0x48693539,\r
-    bmdModeHD1080i6000                                 = /* 'Hi60' */ 0x48693630,      // N.B. This _really_ is 60.00 Hz.\r
-    bmdModeHD1080p50                                   = /* 'Hp50' */ 0x48703530,\r
-    bmdModeHD1080p5994                                 = /* 'Hp59' */ 0x48703539,\r
-    bmdModeHD1080p6000                                 = /* 'Hp60' */ 0x48703630,      // N.B. This _really_ is 60.00 Hz.\r
-\r
-    /* HD 720 Modes */\r
-\r
-    bmdModeHD720p50                                    = /* 'hp50' */ 0x68703530,\r
-    bmdModeHD720p5994                                  = /* 'hp59' */ 0x68703539,\r
-    bmdModeHD720p60                                    = /* 'hp60' */ 0x68703630,\r
-\r
-    /* 2k Modes */\r
-\r
-    bmdMode2k2398                                      = /* '2k23' */ 0x326B3233,\r
-    bmdMode2k24                                        = /* '2k24' */ 0x326B3234,\r
-    bmdMode2k25                                        = /* '2k25' */ 0x326B3235\r
-} BMDDisplayMode;\r
-\r
-\r
-/* Enum BMDFieldDominance - Video field dominance */\r
-\r
-typedef [v1_enum] enum _BMDFieldDominance {\r
-    bmdUnknownFieldDominance                           = 0,\r
-    bmdLowerFieldFirst                                 = /* 'lowr' */ 0x6C6F7772,\r
-    bmdUpperFieldFirst                                 = /* 'uppr' */ 0x75707072,\r
-    bmdProgressiveFrame                                = /* 'prog' */ 0x70726F67,\r
-    bmdProgressiveSegmentedFrame                       = /* 'psf ' */ 0x70736620\r
-} BMDFieldDominance;\r
-\r
-\r
-/* Enum BMDPixelFormat - Video pixel formats supported for output/input */\r
-\r
-typedef [v1_enum] enum _BMDPixelFormat {\r
-    bmdFormat8BitYUV                                   = /* '2vuy' */ 0x32767579,\r
-    bmdFormat10BitYUV                                  = /* 'v210' */ 0x76323130,\r
-    bmdFormat8BitARGB                                  = 32,\r
-    bmdFormat8BitBGRA                                  = /* 'BGRA' */ 0x42475241,\r
-    bmdFormat10BitRGB                                  = /* 'r210' */ 0x72323130       // Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10\r
-} BMDPixelFormat;\r
-\r
-\r
-/* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */\r
-\r
-[v1_enum] enum _BMDDisplayModeFlags {\r
-    bmdDisplayModeSupports3D                           = 1 << 0,\r
-    bmdDisplayModeColorspaceRec601                     = 1 << 1,\r
-    bmdDisplayModeColorspaceRec709                     = 1 << 2\r
-};\r
-\r
-\r
-/* Enum BMDVideoOutputFlags - Flags to control the output of ancillary data along with video. */\r
-\r
-typedef [v1_enum] enum _BMDVideoOutputFlags {\r
-    bmdVideoOutputFlagDefault                          = 0,\r
-    bmdVideoOutputVANC                                 = 1 << 0,\r
-    bmdVideoOutputVITC                                 = 1 << 1,\r
-    bmdVideoOutputRP188                                = 1 << 2,\r
-    bmdVideoOutputDualStream3D                         = 1 << 4\r
-} BMDVideoOutputFlags;\r
-\r
-\r
-/* Enum BMDFrameFlags - Frame flags */\r
-\r
-[v1_enum] enum _BMDFrameFlags {\r
-    bmdFrameFlagDefault                                = 0,\r
-    bmdFrameFlagFlipVertical                           = 1 << 0,\r
-\r
-    /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */\r
-\r
-    bmdFrameHasNoInputSource                           = 1 << 31\r
-};\r
-\r
-\r
-/* Enum BMDVideoInputFlags - Flags applicable to video input */\r
-\r
-[v1_enum] enum _BMDVideoInputFlags {\r
-    bmdVideoInputFlagDefault                           = 0,\r
-    bmdVideoInputEnableFormatDetection                 = 1 << 0,\r
-    bmdVideoInputDualStream3D                          = 1 << 1\r
-};\r
-\r
-\r
-/* Enum BMDVideoInputFormatChangedEvents - Bitmask passed to the VideoInputFormatChanged notification to identify the properties of the input signal that have changed */\r
-\r
-[v1_enum] enum _BMDVideoInputFormatChangedEvents {\r
-    bmdVideoInputDisplayModeChanged                    = 1 << 0,\r
-    bmdVideoInputFieldDominanceChanged                 = 1 << 1,\r
-    bmdVideoInputColorspaceChanged                     = 1 << 2\r
-};\r
-\r
-\r
-/* Enum BMDDetectedVideoInputFormatFlags - Flags passed to the VideoInputFormatChanged notification to describe the detected video input signal */\r
-\r
-[v1_enum] enum _BMDDetectedVideoInputFormatFlags {\r
-    bmdDetectedVideoInputYCbCr422                      = 1 << 0,\r
-    bmdDetectedVideoInputRGB444                        = 1 << 1\r
-};\r
-\r
-\r
-/* Enum BMDOutputFrameCompletionResult - Frame Completion Callback */\r
-\r
-typedef [v1_enum] enum _BMDOutputFrameCompletionResult {\r
-    bmdOutputFrameCompleted,                          \r
-    bmdOutputFrameDisplayedLate,                      \r
-    bmdOutputFrameDropped,                            \r
-    bmdOutputFrameFlushed                             \r
-} BMDOutputFrameCompletionResult;\r
-\r
-\r
-/* Enum BMDReferenceStatus - GenLock input status */\r
-\r
-typedef [v1_enum] enum _BMDReferenceStatus {\r
-    bmdReferenceNotSupportedByHardware                 = 1 << 0,\r
-    bmdReferenceLocked                                 = 1 << 1\r
-} BMDReferenceStatus;\r
-\r
-\r
-/* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */\r
-\r
-typedef [v1_enum] enum _BMDAudioSampleRate {\r
-    bmdAudioSampleRate48kHz                            = 48000\r
-} BMDAudioSampleRate;\r
-\r
-\r
-/* Enum BMDAudioSampleType - Audio sample sizes supported for output/input */\r
-\r
-typedef [v1_enum] enum _BMDAudioSampleType {\r
-    bmdAudioSampleType16bitInteger                     = 16,\r
-    bmdAudioSampleType32bitInteger                     = 32\r
-} BMDAudioSampleType;\r
-\r
-\r
-/* Enum BMDAudioOutputStreamType - Audio output stream type */\r
-\r
-typedef [v1_enum] enum _BMDAudioOutputStreamType {\r
-    bmdAudioOutputStreamContinuous,                   \r
-    bmdAudioOutputStreamContinuousDontResample,       \r
-    bmdAudioOutputStreamTimestamped                   \r
-} BMDAudioOutputStreamType;\r
-\r
-\r
-/* Enum BMDDisplayModeSupport - Output mode supported flags */\r
-\r
-typedef [v1_enum] enum _BMDDisplayModeSupport {\r
-    bmdDisplayModeNotSupported                         = 0,\r
-    bmdDisplayModeSupported,                          \r
-    bmdDisplayModeSupportedWithConversion             \r
-} BMDDisplayModeSupport;\r
-\r
-\r
-/* Enum BMDTimecodeFormat - Timecode formats for frame metadata */\r
-\r
-typedef [v1_enum] enum _BMDTimecodeFormat {\r
-    bmdTimecodeRP188                                   = /* 'rp18' */ 0x72703138,\r
-    bmdTimecodeRP188Field2                             = /* 'rp12' */ 0x72703132,\r
-    bmdTimecodeVITC                                    = /* 'vitc' */ 0x76697463,\r
-    bmdTimecodeVITCField2                              = /* 'vit2' */ 0x76697432,\r
-    bmdTimecodeSerial                                  = /* 'seri' */ 0x73657269\r
-} BMDTimecodeFormat;\r
-\r
-\r
-/* Enum BMDTimecodeFlags - Timecode flags */\r
-\r
-[v1_enum] enum _BMDTimecodeFlags {\r
-    bmdTimecodeFlagDefault                             = 0,\r
-    bmdTimecodeIsDropFrame                             = 1 << 0\r
-};\r
-\r
-\r
-/* Enum BMDVideoConnection - Video connection types */\r
-\r
-typedef [v1_enum] enum _BMDVideoConnection {\r
-    bmdVideoConnectionSDI                              = 1 << 0,\r
-    bmdVideoConnectionHDMI                             = 1 << 1,\r
-    bmdVideoConnectionOpticalSDI                       = 1 << 2,\r
-    bmdVideoConnectionComponent                        = 1 << 3,\r
-    bmdVideoConnectionComposite                        = 1 << 4,\r
-    bmdVideoConnectionSVideo                           = 1 << 5\r
-} BMDVideoConnection;\r
-\r
-\r
-/* Enum BMDAnalogVideoFlags - Analog video display flags */\r
-\r
-[v1_enum] enum _BMDAnalogVideoFlags {\r
-    bmdAnalogVideoFlagCompositeSetup75                 = 1 << 0,\r
-    bmdAnalogVideoFlagComponentBetacamLevels           = 1 << 1\r
-};\r
-\r
-\r
-/* Enum BMDAudioConnection - Audio connection types */\r
-\r
-typedef [v1_enum] enum _BMDAudioConnection {\r
-    bmdAudioConnectionEmbedded                         = /* 'embd' */ 0x656D6264,\r
-    bmdAudioConnectionAESEBU                           = /* 'aes ' */ 0x61657320,\r
-    bmdAudioConnectionAnalog                           = /* 'anlg' */ 0x616E6C67\r
-} BMDAudioConnection;\r
-\r
-\r
-/* Enum BMDAudioOutputAnalogAESSwitch - Audio output Analog/AESEBU switch */\r
-\r
-typedef [v1_enum] enum _BMDAudioOutputAnalogAESSwitch {\r
-    bmdAudioOutputSwitchAESEBU                         = /* 'aes ' */ 0x61657320,\r
-    bmdAudioOutputSwitchAnalog                         = /* 'anlg' */ 0x616E6C67\r
-} BMDAudioOutputAnalogAESSwitch;\r
-\r
-\r
-/* Enum BMDVideoOutputConversionMode - Video/audio conversion mode */\r
-\r
-typedef [v1_enum] enum _BMDVideoOutputConversionMode {\r
-    bmdNoVideoOutputConversion                         = /* 'none' */ 0x6E6F6E65,\r
-    bmdVideoOutputLetterboxDownconversion              = /* 'ltbx' */ 0x6C746278,\r
-    bmdVideoOutputAnamorphicDownconversion             = /* 'amph' */ 0x616D7068,\r
-    bmdVideoOutputHD720toHD1080Conversion              = /* '720c' */ 0x37323063,\r
-    bmdVideoOutputHardwareLetterboxDownconversion      = /* 'HWlb' */ 0x48576C62,\r
-    bmdVideoOutputHardwareAnamorphicDownconversion     = /* 'HWam' */ 0x4857616D,\r
-    bmdVideoOutputHardwareCenterCutDownconversion      = /* 'HWcc' */ 0x48576363,\r
-    bmdVideoOutputHardware720p1080pCrossconversion     = /* 'xcap' */ 0x78636170,\r
-    bmdVideoOutputHardwareAnamorphic720pUpconversion   = /* 'ua7p' */ 0x75613770,\r
-    bmdVideoOutputHardwareAnamorphic1080iUpconversion  = /* 'ua1i' */ 0x75613169,\r
-    bmdVideoOutputHardwareAnamorphic149To720pUpconversion = /* 'u47p' */ 0x75343770,\r
-    bmdVideoOutputHardwareAnamorphic149To1080iUpconversion = /* 'u41i' */ 0x75343169,\r
-    bmdVideoOutputHardwarePillarbox720pUpconversion    = /* 'up7p' */ 0x75703770,\r
-    bmdVideoOutputHardwarePillarbox1080iUpconversion   = /* 'up1i' */ 0x75703169\r
-} BMDVideoOutputConversionMode;\r
-\r
-\r
-/* Enum BMDVideoInputConversionMode - Video input conversion mode */\r
-\r
-typedef [v1_enum] enum _BMDVideoInputConversionMode {\r
-    bmdNoVideoInputConversion                          = /* 'none' */ 0x6E6F6E65,\r
-    bmdVideoInputLetterboxDownconversionFromHD1080     = /* '10lb' */ 0x31306C62,\r
-    bmdVideoInputAnamorphicDownconversionFromHD1080    = /* '10am' */ 0x3130616D,\r
-    bmdVideoInputLetterboxDownconversionFromHD720      = /* '72lb' */ 0x37326C62,\r
-    bmdVideoInputAnamorphicDownconversionFromHD720     = /* '72am' */ 0x3732616D,\r
-    bmdVideoInputLetterboxUpconversion                 = /* 'lbup' */ 0x6C627570,\r
-    bmdVideoInputAnamorphicUpconversion                = /* 'amup' */ 0x616D7570\r
-} BMDVideoInputConversionMode;\r
-\r
-\r
-/* Enum BMDVideo3DPackingFormat - Video 3D packing format */\r
-\r
-typedef [v1_enum] enum _BMDVideo3DPackingFormat {\r
-    bmdVideo3DPackingSidebySideHalf                    = /* 'sbsh' */ 0x73627368,\r
-    bmdVideo3DPackingLinebyLine                        = /* 'lbyl' */ 0x6C62796C,\r
-    bmdVideo3DPackingTopAndBottom                      = /* 'tabo' */ 0x7461626F,\r
-    bmdVideo3DPackingFramePacking                      = /* 'frpk' */ 0x6672706B,\r
-    bmdVideo3DPackingLeftOnly                          = /* 'left' */ 0x6C656674,\r
-    bmdVideo3DPackingRightOnly                         = /* 'righ' */ 0x72696768\r
-} BMDVideo3DPackingFormat;\r
-\r
-\r
-/* Enum BMDIdleVideoOutputOperation - Video output operation when not playing video */\r
-\r
-typedef [v1_enum] enum _BMDIdleVideoOutputOperation {\r
-    bmdIdleVideoOutputBlack                            = /* 'blac' */ 0x626C6163,\r
-    bmdIdleVideoOutputLastFrame                        = /* 'lafa' */ 0x6C616661\r
-} BMDIdleVideoOutputOperation;\r
-\r
-\r
-/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */\r
-\r
-typedef [v1_enum] enum _BMDDeckLinkConfigurationID {\r
-\r
-    /* Serial port Flags */\r
-\r
-    bmdDeckLinkConfigSwapSerialRxTx                    = /* 'ssrt' */ 0x73737274,\r
-\r
-    /* Video Input/Output Flags */\r
-\r
-    bmdDeckLinkConfigUse1080pNotPsF                    = /* 'fpro' */ 0x6670726F,\r
-\r
-    /* Video Input/Output Integers */\r
-\r
-    bmdDeckLinkConfigHDMI3DPackingFormat               = /* '3dpf' */ 0x33647066,\r
-    bmdDeckLinkConfigBypass                            = /* 'byps' */ 0x62797073,\r
-\r
-    /* Audio Input/Output Flags */\r
-\r
-    bmdDeckLinkConfigAnalogAudioConsumerLevels         = /* 'aacl' */ 0x6161636C,\r
-\r
-    /* Video output flags */\r
-\r
-    bmdDeckLinkConfigFieldFlickerRemoval               = /* 'fdfr' */ 0x66646672,\r
-    bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion  = /* 'to59' */ 0x746F3539,\r
-    bmdDeckLinkConfig444SDIVideoOutput                 = /* '444o' */ 0x3434346F,\r
-    bmdDeckLinkConfig3GBpsVideoOutput                  = /* '3gbs' */ 0x33676273,\r
-    bmdDeckLinkConfigBlackVideoOutputDuringCapture     = /* 'bvoc' */ 0x62766F63,\r
-    bmdDeckLinkConfigLowLatencyVideoOutput             = /* 'llvo' */ 0x6C6C766F,\r
-\r
-    /* Video Output Integers */\r
-\r
-    bmdDeckLinkConfigVideoOutputConnection             = /* 'vocn' */ 0x766F636E,\r
-    bmdDeckLinkConfigVideoOutputConversionMode         = /* 'vocm' */ 0x766F636D,\r
-    bmdDeckLinkConfigAnalogVideoOutputFlags            = /* 'avof' */ 0x61766F66,\r
-    bmdDeckLinkConfigReferenceInputTimingOffset        = /* 'glot' */ 0x676C6F74,\r
-    bmdDeckLinkConfigVideoOutputIdleOperation          = /* 'voio' */ 0x766F696F,\r
-\r
-    /* Video Output Floats */\r
-\r
-    bmdDeckLinkConfigVideoOutputComponentLumaGain      = /* 'oclg' */ 0x6F636C67,\r
-    bmdDeckLinkConfigVideoOutputComponentChromaBlueGain = /* 'occb' */ 0x6F636362,\r
-    bmdDeckLinkConfigVideoOutputComponentChromaRedGain = /* 'occr' */ 0x6F636372,\r
-    bmdDeckLinkConfigVideoOutputCompositeLumaGain      = /* 'oilg' */ 0x6F696C67,\r
-    bmdDeckLinkConfigVideoOutputCompositeChromaGain    = /* 'oicg' */ 0x6F696367,\r
-    bmdDeckLinkConfigVideoOutputSVideoLumaGain         = /* 'oslg' */ 0x6F736C67,\r
-    bmdDeckLinkConfigVideoOutputSVideoChromaGain       = /* 'oscg' */ 0x6F736367,\r
-\r
-    /* Video Input Integers */\r
-\r
-    bmdDeckLinkConfigVideoInputConnection              = /* 'vicn' */ 0x7669636E,\r
-    bmdDeckLinkConfigAnalogVideoInputFlags             = /* 'avif' */ 0x61766966,\r
-    bmdDeckLinkConfigVideoInputConversionMode          = /* 'vicm' */ 0x7669636D,\r
-    bmdDeckLinkConfig32PulldownSequenceInitialTimecodeFrame = /* 'pdif' */ 0x70646966,\r
-    bmdDeckLinkConfigVANCSourceLine1Mapping            = /* 'vsl1' */ 0x76736C31,\r
-    bmdDeckLinkConfigVANCSourceLine2Mapping            = /* 'vsl2' */ 0x76736C32,\r
-    bmdDeckLinkConfigVANCSourceLine3Mapping            = /* 'vsl3' */ 0x76736C33,\r
-\r
-    /* Video Input Floats */\r
-\r
-    bmdDeckLinkConfigVideoInputComponentLumaGain       = /* 'iclg' */ 0x69636C67,\r
-    bmdDeckLinkConfigVideoInputComponentChromaBlueGain = /* 'iccb' */ 0x69636362,\r
-    bmdDeckLinkConfigVideoInputComponentChromaRedGain  = /* 'iccr' */ 0x69636372,\r
-    bmdDeckLinkConfigVideoInputCompositeLumaGain       = /* 'iilg' */ 0x69696C67,\r
-    bmdDeckLinkConfigVideoInputCompositeChromaGain     = /* 'iicg' */ 0x69696367,\r
-    bmdDeckLinkConfigVideoInputSVideoLumaGain          = /* 'islg' */ 0x69736C67,\r
-    bmdDeckLinkConfigVideoInputSVideoChromaGain        = /* 'iscg' */ 0x69736367,\r
-\r
-    /* Audio Input Integers */\r
-\r
-    bmdDeckLinkConfigAudioInputConnection              = /* 'aicn' */ 0x6169636E,\r
-\r
-    /* Audio Input Floats */\r
-\r
-    bmdDeckLinkConfigAnalogAudioInputScaleChannel1     = /* 'ais1' */ 0x61697331,\r
-    bmdDeckLinkConfigAnalogAudioInputScaleChannel2     = /* 'ais2' */ 0x61697332,\r
-    bmdDeckLinkConfigAnalogAudioInputScaleChannel3     = /* 'ais3' */ 0x61697333,\r
-    bmdDeckLinkConfigAnalogAudioInputScaleChannel4     = /* 'ais4' */ 0x61697334,\r
-    bmdDeckLinkConfigDigitalAudioInputScale            = /* 'dais' */ 0x64616973,\r
-\r
-    /* Audio Output Integers */\r
-\r
-    bmdDeckLinkConfigAudioOutputAESAnalogSwitch        = /* 'aoaa' */ 0x616F6161,\r
-\r
-    /* Audio Output Floats */\r
-\r
-    bmdDeckLinkConfigAnalogAudioOutputScaleChannel1    = /* 'aos1' */ 0x616F7331,\r
-    bmdDeckLinkConfigAnalogAudioOutputScaleChannel2    = /* 'aos2' */ 0x616F7332,\r
-    bmdDeckLinkConfigAnalogAudioOutputScaleChannel3    = /* 'aos3' */ 0x616F7333,\r
-    bmdDeckLinkConfigAnalogAudioOutputScaleChannel4    = /* 'aos4' */ 0x616F7334,\r
-    bmdDeckLinkConfigDigitalAudioOutputScale           = /* 'daos' */ 0x64616F73\r
-} BMDDeckLinkConfigurationID;\r
-\r
-\r
-/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */\r
-\r
-typedef [v1_enum] enum _BMDDeckLinkAttributeID {\r
-\r
-    /* Flags */\r
-\r
-    BMDDeckLinkSupportsInternalKeying                  = /* 'keyi' */ 0x6B657969,\r
-    BMDDeckLinkSupportsExternalKeying                  = /* 'keye' */ 0x6B657965,\r
-    BMDDeckLinkSupportsHDKeying                        = /* 'keyh' */ 0x6B657968,\r
-    BMDDeckLinkSupportsInputFormatDetection            = /* 'infd' */ 0x696E6664,\r
-    BMDDeckLinkHasReferenceInput                       = /* 'hrin' */ 0x6872696E,\r
-    BMDDeckLinkHasSerialPort                           = /* 'hspt' */ 0x68737074,\r
-    BMDDeckLinkHasAnalogVideoOutputGain                = /* 'avog' */ 0x61766F67,\r
-    BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain     = /* 'ovog' */ 0x6F766F67,\r
-    BMDDeckLinkHasVideoInputAntiAliasingFilter         = /* 'aafl' */ 0x6161666C,\r
-    BMDDeckLinkHasBypass                               = /* 'byps' */ 0x62797073,\r
-\r
-    /* Integers */\r
-\r
-    BMDDeckLinkMaximumAudioChannels                    = /* 'mach' */ 0x6D616368,\r
-    BMDDeckLinkNumberOfSubDevices                      = /* 'nsbd' */ 0x6E736264,\r
-    BMDDeckLinkSubDeviceIndex                          = /* 'subi' */ 0x73756269,\r
-    BMDDeckLinkVideoOutputConnections                  = /* 'vocn' */ 0x766F636E,\r
-    BMDDeckLinkVideoInputConnections                   = /* 'vicn' */ 0x7669636E,\r
-\r
-    /* Floats */\r
-\r
-    BMDDeckLinkVideoInputGainMinimum                   = /* 'vigm' */ 0x7669676D,\r
-    BMDDeckLinkVideoInputGainMaximum                   = /* 'vigx' */ 0x76696778,\r
-    BMDDeckLinkVideoOutputGainMinimum                  = /* 'vogm' */ 0x766F676D,\r
-    BMDDeckLinkVideoOutputGainMaximum                  = /* 'vogx' */ 0x766F6778,\r
-\r
-    /* Strings */\r
-\r
-    BMDDeckLinkSerialPortDeviceName                    = /* 'slpn' */ 0x736C706E\r
-} BMDDeckLinkAttributeID;\r
-\r
-\r
-/* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */\r
-\r
-typedef [v1_enum] enum _BMDDeckLinkAPIInformationID {\r
-    BMDDeckLinkAPIVersion                              = /* 'vers' */ 0x76657273\r
-} BMDDeckLinkAPIInformationID;\r
-\r
-\r
-/* Enum BMDDeckControlMode - DeckControl mode */\r
-\r
-typedef [v1_enum] enum _BMDDeckControlMode {\r
-    bmdDeckControlNotOpened                            = /* 'ntop' */ 0x6E746F70,\r
-    bmdDeckControlVTRControlMode                       = /* 'vtrc' */ 0x76747263,\r
-    bmdDeckControlExportMode                           = /* 'expm' */ 0x6578706D,\r
-    bmdDeckControlCaptureMode                          = /* 'capm' */ 0x6361706D\r
-} BMDDeckControlMode;\r
-\r
-\r
-/* Enum BMDDeckControlEvent - DeckControl event */\r
-\r
-typedef [v1_enum] enum _BMDDeckControlEvent {\r
-    bmdDeckControlAbortedEvent                         = /* 'abte' */ 0x61627465,      // This event is triggered when a capture or edit-to-tape operation is aborted.\r
-\r
-    /* Export-To-Tape events */\r
-\r
-    bmdDeckControlPrepareForExportEvent                = /* 'pfee' */ 0x70666565,      // This event is triggered a few frames before reaching the in-point. IDeckLinkInput::StartScheduledPlayback() should be called at this point.\r
-    bmdDeckControlExportCompleteEvent                  = /* 'exce' */ 0x65786365,      // This event is triggered a few frames after reaching the out-point. At this point, it is safe to stop playback.\r
-\r
-    /* Capture events */\r
-\r
-    bmdDeckControlPrepareForCaptureEvent               = /* 'pfce' */ 0x70666365,      // This event is triggered a few frames before reaching the in-point. The serial timecode attached to IDeckLinkVideoInputFrames is now valid.\r
-    bmdDeckControlCaptureCompleteEvent                 = /* 'ccev' */ 0x63636576       // This event is triggered a few frames after reaching the out-point.\r
-} BMDDeckControlEvent;\r
-\r
-\r
-/* Enum BMDDeckControlVTRControlState - VTR Control state */\r
-\r
-typedef [v1_enum] enum _BMDDeckControlVTRControlState {\r
-    bmdDeckControlNotInVTRControlMode                  = /* 'nvcm' */ 0x6E76636D,\r
-    bmdDeckControlVTRControlPlaying                    = /* 'vtrp' */ 0x76747270,\r
-    bmdDeckControlVTRControlRecording                  = /* 'vtrr' */ 0x76747272,\r
-    bmdDeckControlVTRControlStill                      = /* 'vtra' */ 0x76747261,\r
-    bmdDeckControlVTRControlSeeking                    = /* 'vtrs' */ 0x76747273,\r
-    bmdDeckControlVTRControlStopped                    = /* 'vtro' */ 0x7674726F\r
-} BMDDeckControlVTRControlState;\r
-\r
-\r
-/* Enum BMDDeckControlStatusFlags - Deck Control status flags */\r
-\r
-[v1_enum] enum _BMDDeckControlStatusFlags {\r
-    bmdDeckControlStatusDeckConnected                  = 1 << 0,\r
-    bmdDeckControlStatusRemoteMode                     = 1 << 1,\r
-    bmdDeckControlStatusRecordInhibited                = 1 << 2,\r
-    bmdDeckControlStatusCassetteOut                    = 1 << 3\r
-};\r
-\r
-\r
-/* Enum BMDDeckControlExportModeOpsFlags - Export mode flags */\r
-\r
-[v1_enum] enum _BMDDeckControlExportModeOpsFlags {\r
-    bmdDeckControlExportModeInsertVideo                = 1 << 0,\r
-    bmdDeckControlExportModeInsertAudio1               = 1 << 1,\r
-    bmdDeckControlExportModeInsertAudio2               = 1 << 2,\r
-    bmdDeckControlExportModeInsertAudio3               = 1 << 3,\r
-    bmdDeckControlExportModeInsertAudio4               = 1 << 4,\r
-    bmdDeckControlExportModeInsertAudio5               = 1 << 5,\r
-    bmdDeckControlExportModeInsertAudio6               = 1 << 6,\r
-    bmdDeckControlExportModeInsertAudio7               = 1 << 7,\r
-    bmdDeckControlExportModeInsertAudio8               = 1 << 8,\r
-    bmdDeckControlExportModeInsertAudio9               = 1 << 9,\r
-    bmdDeckControlExportModeInsertAudio10              = 1 << 10,\r
-    bmdDeckControlExportModeInsertAudio11              = 1 << 11,\r
-    bmdDeckControlExportModeInsertAudio12              = 1 << 12,\r
-    bmdDeckControlExportModeInsertTimeCode             = 1 << 13,\r
-    bmdDeckControlExportModeInsertAssemble             = 1 << 14,\r
-    bmdDeckControlExportModeInsertPreview              = 1 << 15,\r
-    bmdDeckControlUseManualExport                      = 1 << 16\r
-};\r
-\r
-\r
-/* Enum BMDDeckControlError - Deck Control error */\r
-\r
-typedef [v1_enum] enum _BMDDeckControlError {\r
-    bmdDeckControlNoError                              = /* 'noer' */ 0x6E6F6572,\r
-    bmdDeckControlModeError                            = /* 'moer' */ 0x6D6F6572,\r
-    bmdDeckControlMissedInPointError                   = /* 'mier' */ 0x6D696572,\r
-    bmdDeckControlDeckTimeoutError                     = /* 'dter' */ 0x64746572,\r
-    bmdDeckControlCommandFailedError                   = /* 'cfer' */ 0x63666572,\r
-    bmdDeckControlDeviceAlreadyOpenedError             = /* 'dalo' */ 0x64616C6F,\r
-    bmdDeckControlFailedToOpenDeviceError              = /* 'fder' */ 0x66646572,\r
-    bmdDeckControlInLocalModeError                     = /* 'lmer' */ 0x6C6D6572,\r
-    bmdDeckControlEndOfTapeError                       = /* 'eter' */ 0x65746572,\r
-    bmdDeckControlUserAbortError                       = /* 'uaer' */ 0x75616572,\r
-    bmdDeckControlNoTapeInDeckError                    = /* 'nter' */ 0x6E746572,\r
-    bmdDeckControlNoVideoFromCardError                 = /* 'nvfc' */ 0x6E766663,\r
-    bmdDeckControlNoCommunicationError                 = /* 'ncom' */ 0x6E636F6D,\r
-    bmdDeckControlBufferTooSmallError                  = /* 'btsm' */ 0x6274736D,\r
-    bmdDeckControlBadChecksumError                     = /* 'chks' */ 0x63686B73,\r
-    bmdDeckControlUnknownError                         = /* 'uner' */ 0x756E6572\r
-} BMDDeckControlError;\r
-\r
-\r
-/* Enum BMD3DPreviewFormat - Linked Frame preview format */\r
-\r
-typedef [v1_enum] enum _BMD3DPreviewFormat {\r
-    bmd3DPreviewFormatDefault                          = /* 'defa' */ 0x64656661,\r
-    bmd3DPreviewFormatLeftOnly                         = /* 'left' */ 0x6C656674,\r
-    bmd3DPreviewFormatRightOnly                        = /* 'righ' */ 0x72696768,\r
-    bmd3DPreviewFormatSideBySide                       = /* 'side' */ 0x73696465,\r
-    bmd3DPreviewFormatTopBottom                        = /* 'topb' */ 0x746F7062\r
-} BMD3DPreviewFormat;\r
-\r
-\r
-// Forward Declarations\r
-\r
-interface IDeckLinkVideoOutputCallback;\r
-interface IDeckLinkInputCallback;\r
-interface IDeckLinkMemoryAllocator;\r
-interface IDeckLinkAudioOutputCallback;\r
-interface IDeckLinkIterator;\r
-interface IDeckLinkAPIInformation;\r
-interface IDeckLinkDisplayModeIterator;\r
-interface IDeckLinkDisplayMode;\r
-interface IDeckLink;\r
-interface IDeckLinkOutput;\r
-interface IDeckLinkInput;\r
-interface IDeckLinkTimecode;\r
-interface IDeckLinkVideoFrame;\r
-interface IDeckLinkMutableVideoFrame;\r
-interface IDeckLinkVideoFrame3DExtensions;\r
-interface IDeckLinkVideoInputFrame;\r
-interface IDeckLinkVideoFrameAncillary;\r
-interface IDeckLinkAudioInputPacket;\r
-interface IDeckLinkScreenPreviewCallback;\r
-interface IDeckLinkGLScreenPreviewHelper;\r
-interface IDeckLinkConfiguration;\r
-interface IDeckLinkAttributes;\r
-interface IDeckLinkKeyer;\r
-interface IDeckLinkVideoConversion;\r
-interface IDeckLinkDeckControlStatusCallback;\r
-interface IDeckLinkDeckControl;\r
-\r
-\r
-/* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */\r
-\r
-[\r
-    object,\r
-    uuid(20AA5225-1958-47CB-820B-80A8D521A6EE),\r
-    helpstring("Frame completion callback.")\r
-] interface IDeckLinkVideoOutputCallback : IUnknown\r
-{\r
-    HRESULT ScheduledFrameCompleted([in] IDeckLinkVideoFrame *completedFrame, [in] BMDOutputFrameCompletionResult result);\r
-    HRESULT ScheduledPlaybackHasStopped(void);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkInputCallback - Frame arrival callback. */\r
-\r
-[\r
-    object,\r
-    uuid(DD04E5EC-7415-42AB-AE4A-E80C4DFC044A),\r
-    helpstring("Frame arrival callback.")\r
-] interface IDeckLinkInputCallback : IUnknown\r
-{\r
-    HRESULT VideoInputFormatChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags);\r
-    HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame* videoFrame, [in] IDeckLinkAudioInputPacket* audioPacket);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */\r
-\r
-[\r
-    object,\r
-    uuid(B36EB6E7-9D29-4AA8-92EF-843B87A289E8),\r
-    local, \r
-    helpstring("Memory allocator for video frames.")\r
-] interface IDeckLinkMemoryAllocator : IUnknown\r
-{\r
-    HRESULT AllocateBuffer([in] unsigned long bufferSize, [out] void **allocatedBuffer);\r
-    HRESULT ReleaseBuffer([in] void *buffer);\r
-\r
-    HRESULT Commit(void);\r
-    HRESULT Decommit(void);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkAudioOutputCallback - Optional callback to allow audio samples to be pulled as required. */\r
-\r
-[\r
-    object,\r
-    uuid(403C681B-7F46-4A12-B993-2BB127084EE6),\r
-    local, \r
-    helpstring("Optional callback to allow audio samples to be pulled as required.")\r
-] interface IDeckLinkAudioOutputCallback : IUnknown\r
-{\r
-    HRESULT RenderAudioSamples([in] BOOL preroll);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkIterator - enumerates installed DeckLink hardware */\r
-\r
-[\r
-    object,\r
-    uuid(74E936FC-CC28-4A67-81A0-1E94E52D4E69),\r
-    helpstring("enumerates installed DeckLink hardware")\r
-] interface IDeckLinkIterator : IUnknown\r
-{\r
-    HRESULT Next([out] IDeckLink **deckLinkInstance);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkAPIInformation - DeckLinkAPI attribute interface */\r
-\r
-[\r
-    object,\r
-    uuid(7BEA3C68-730D-4322-AF34-8A7152B532A4),\r
-    helpstring("DeckLinkAPI attribute interface")\r
-] interface IDeckLinkAPIInformation : IUnknown\r
-{\r
-    HRESULT GetFlag([in] BMDDeckLinkAPIInformationID cfgID, [out] BOOL *value);\r
-    HRESULT GetInt([in] BMDDeckLinkAPIInformationID cfgID, [out] LONGLONG *value);\r
-    HRESULT GetFloat([in] BMDDeckLinkAPIInformationID cfgID, [out] double *value);\r
-    HRESULT GetString([in] BMDDeckLinkAPIInformationID cfgID, [out] BSTR *value);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */\r
-\r
-[\r
-    object,\r
-    uuid(9C88499F-F601-4021-B80B-032E4EB41C35),\r
-    helpstring("enumerates over supported input/output display modes.")\r
-] interface IDeckLinkDisplayModeIterator : IUnknown\r
-{\r
-    HRESULT Next([out] IDeckLinkDisplayMode **deckLinkDisplayMode);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkDisplayMode - represents a display mode */\r
-\r
-[\r
-    object,\r
-    uuid(3EB2C1AB-0A3D-4523-A3AD-F40D7FB14E78),\r
-    helpstring("represents a display mode")\r
-] interface IDeckLinkDisplayMode : IUnknown\r
-{\r
-    HRESULT GetName([out] BSTR *name);\r
-    BMDDisplayMode GetDisplayMode(void);\r
-    long GetWidth(void);\r
-    long GetHeight(void);\r
-    HRESULT GetFrameRate([out] BMDTimeValue *frameDuration, [out] BMDTimeScale *timeScale);\r
-    BMDFieldDominance GetFieldDominance(void);\r
-    BMDDisplayModeFlags GetFlags(void);\r
-};\r
-\r
-\r
-/* Interface IDeckLink - represents a DeckLink device */\r
-\r
-[\r
-    object,\r
-    uuid(62BFF75D-6569-4E55-8D4D-66AA03829ABC),\r
-    helpstring("represents a DeckLink device")\r
-] interface IDeckLink : IUnknown\r
-{\r
-    HRESULT GetModelName([out] BSTR *modelName);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */\r
-\r
-[\r
-    object,\r
-    uuid(A3EF0963-0862-44ED-92A9-EE89ABF431C7),\r
-    local, \r
-    helpstring("Created by QueryInterface from IDeckLink.")\r
-] interface IDeckLinkOutput : IUnknown\r
-{\r
-    HRESULT DoesSupportVideoMode([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoOutputFlags flags, [out] BMDDisplayModeSupport *result, [out] IDeckLinkDisplayMode **resultDisplayMode);\r
-    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator);\r
-\r
-    HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);\r
-\r
-    /* Video Output */\r
-\r
-    HRESULT EnableVideoOutput([in] BMDDisplayMode displayMode, [in] BMDVideoOutputFlags flags);\r
-    HRESULT DisableVideoOutput(void);\r
-\r
-    HRESULT SetVideoOutputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator);\r
-    HRESULT CreateVideoFrame([in] long width, [in] long height, [in] long rowBytes, [in] BMDPixelFormat pixelFormat, [in] BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame **outFrame);\r
-    HRESULT CreateAncillaryData([in] BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer);\r
-\r
-    HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame *theFrame);\r
-    HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame *theFrame, [in] BMDTimeValue displayTime, [in] BMDTimeValue displayDuration, [in] BMDTimeScale timeScale);\r
-    HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback *theCallback);\r
-    HRESULT GetBufferedVideoFrameCount([out] unsigned long *bufferedFrameCount);\r
-\r
-    /* Audio Output */\r
-\r
-    HRESULT EnableAudioOutput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned long channelCount, [in] BMDAudioOutputStreamType streamType);\r
-    HRESULT DisableAudioOutput(void);\r
-\r
-    HRESULT WriteAudioSamplesSync([in] void *buffer, [in] unsigned long sampleFrameCount, [out] unsigned long *sampleFramesWritten);\r
-\r
-    HRESULT BeginAudioPreroll(void);\r
-    HRESULT EndAudioPreroll(void);\r
-    HRESULT ScheduleAudioSamples([in] void *buffer, [in] unsigned long sampleFrameCount, [in] BMDTimeValue streamTime, [in] BMDTimeScale timeScale, [out] unsigned long *sampleFramesWritten);\r
-\r
-    HRESULT GetBufferedAudioSampleFrameCount([out] unsigned long *bufferedSampleFrameCount);\r
-    HRESULT FlushBufferedAudioSamples(void);\r
-\r
-    HRESULT SetAudioCallback([in] IDeckLinkAudioOutputCallback *theCallback);\r
-\r
-    /* Output Control */\r
-\r
-    HRESULT StartScheduledPlayback([in] BMDTimeValue playbackStartTime, [in] BMDTimeScale timeScale, [in] double playbackSpeed);\r
-    HRESULT StopScheduledPlayback([in] BMDTimeValue stopPlaybackAtTime, [out] BMDTimeValue *actualStopTime, [in] BMDTimeScale timeScale);\r
-    HRESULT IsScheduledPlaybackRunning([out] BOOL *active);\r
-    HRESULT GetScheduledStreamTime([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *streamTime, [out] double *playbackSpeed);\r
-    HRESULT GetReferenceStatus([out] BMDReferenceStatus *referenceStatus);\r
-\r
-    /* Hardware Timing */\r
-\r
-    HRESULT GetHardwareReferenceClock([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */\r
-\r
-[\r
-    object,\r
-    uuid(6D40EF78-28B9-4E21-990D-95BB7750A04F),\r
-    helpstring("Created by QueryInterface from IDeckLink.")\r
-] interface IDeckLinkInput : IUnknown\r
-{\r
-    HRESULT DoesSupportVideoMode([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoInputFlags flags, [out] BMDDisplayModeSupport *result, [out] IDeckLinkDisplayMode **resultDisplayMode);\r
-    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator);\r
-\r
-    HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);\r
-\r
-    /* Video Input */\r
-\r
-    HRESULT EnableVideoInput([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoInputFlags flags);\r
-    HRESULT DisableVideoInput(void);\r
-    HRESULT GetAvailableVideoFrameCount([out] unsigned long *availableFrameCount);\r
-\r
-    /* Audio Input */\r
-\r
-    HRESULT EnableAudioInput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned long channelCount);\r
-    HRESULT DisableAudioInput(void);\r
-    HRESULT GetAvailableAudioSampleFrameCount([out] unsigned long *availableSampleFrameCount);\r
-\r
-    /* Input Control */\r
-\r
-    HRESULT StartStreams(void);\r
-    HRESULT StopStreams(void);\r
-    HRESULT PauseStreams(void);\r
-    HRESULT FlushStreams(void);\r
-    HRESULT SetCallback([in] IDeckLinkInputCallback *theCallback);\r
-\r
-    /* Hardware Timing */\r
-\r
-    HRESULT GetHardwareReferenceClock([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkTimecode - Used for video frame timecode representation. */\r
-\r
-[\r
-    object,\r
-    uuid(BC6CFBD3-8317-4325-AC1C-1216391E9340),\r
-    helpstring("Used for video frame timecode representation.")\r
-] interface IDeckLinkTimecode : IUnknown\r
-{\r
-    BMDTimecodeBCD GetBCD(void);\r
-    HRESULT GetComponents([out] unsigned char *hours, [out] unsigned char *minutes, [out] unsigned char *seconds, [out] unsigned char *frames);\r
-    HRESULT GetString([out] BSTR *timecode);\r
-    BMDTimecodeFlags GetFlags(void);\r
-    HRESULT GetTimecodeUserBits([out] BMDTimecodeUserBits *userBits);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */\r
-\r
-[\r
-    object,\r
-    uuid(3F716FE0-F023-4111-BE5D-EF4414C05B17),\r
-    local, \r
-    helpstring("Interface to encapsulate a video frame; can be caller-implemented.")\r
-] interface IDeckLinkVideoFrame : IUnknown\r
-{\r
-    long GetWidth(void);\r
-    long GetHeight(void);\r
-    long GetRowBytes(void);\r
-    BMDPixelFormat GetPixelFormat(void);\r
-    BMDFrameFlags GetFlags(void);\r
-    HRESULT GetBytes([out] void **buffer);\r
-\r
-    HRESULT GetTimecode([in] BMDTimecodeFormat format, [out] IDeckLinkTimecode **timecode);\r
-    HRESULT GetAncillaryData([out] IDeckLinkVideoFrameAncillary **ancillary);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */\r
-\r
-[\r
-    object,\r
-    uuid(69E2639F-40DA-4E19-B6F2-20ACE815C390),\r
-    local, \r
-    helpstring("Created by IDeckLinkOutput::CreateVideoFrame.")\r
-] interface IDeckLinkMutableVideoFrame : IDeckLinkVideoFrame\r
-{\r
-    HRESULT SetFlags([in] BMDFrameFlags newFlags);\r
-\r
-    HRESULT SetTimecode([in] BMDTimecodeFormat format, [in] IDeckLinkTimecode *timecode);\r
-    HRESULT SetTimecodeFromComponents([in] BMDTimecodeFormat format, [in] unsigned char hours, [in] unsigned char minutes, [in] unsigned char seconds, [in] unsigned char frames, [in] BMDTimecodeFlags flags);\r
-    HRESULT SetAncillaryData([in] IDeckLinkVideoFrameAncillary *ancillary);\r
-    HRESULT SetTimecodeUserBits([in] BMDTimecodeFormat format, [in] BMDTimecodeUserBits userBits);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkVideoFrame3DExtensions - Optional interface implemented on IDeckLinkVideoFrame to support 3D frames */\r
-\r
-[\r
-    object,\r
-    uuid(DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7),\r
-    local, \r
-    helpstring("Optional interface implemented on IDeckLinkVideoFrame to support 3D frames")\r
-] interface IDeckLinkVideoFrame3DExtensions : IUnknown\r
-{\r
-    BMDVideo3DPackingFormat Get3DPackingFormat(void);\r
-    HRESULT GetFrameForRightEye([out] IDeckLinkVideoFrame* *rightEyeFrame);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */\r
-\r
-[\r
-    object,\r
-    uuid(05CFE374-537C-4094-9A57-680525118F44),\r
-    local, \r
-    helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.")\r
-] interface IDeckLinkVideoInputFrame : IDeckLinkVideoFrame\r
-{\r
-    HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration, [in] BMDTimeScale timeScale);\r
-    HRESULT GetHardwareReferenceTimestamp([in] BMDTimeScale timeScale, [out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkVideoFrameAncillary - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */\r
-\r
-[\r
-    object,\r
-    uuid(732E723C-D1A4-4E29-9E8E-4A88797A0004),\r
-    local, \r
-    helpstring("Obtained through QueryInterface() on an IDeckLinkVideoFrame object.")\r
-] interface IDeckLinkVideoFrameAncillary : IUnknown\r
-{\r
-\r
-    HRESULT GetBufferForVerticalBlankingLine([in] unsigned long lineNumber, [out] void **buffer);\r
-    BMDPixelFormat GetPixelFormat(void);\r
-    BMDDisplayMode GetDisplayMode(void);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */\r
-\r
-[\r
-    object,\r
-    uuid(E43D5870-2894-11DE-8C30-0800200C9A66),\r
-    local, \r
-    helpstring("Provided by the IDeckLinkInput callback.")\r
-] interface IDeckLinkAudioInputPacket : IUnknown\r
-{\r
-    long GetSampleFrameCount(void);\r
-    HRESULT GetBytes([out] void **buffer);\r
-    HRESULT GetPacketTime([out] BMDTimeValue *packetTime, [in] BMDTimeScale timeScale);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */\r
-\r
-[\r
-    object,\r
-    uuid(B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438),\r
-    local, \r
-    helpstring("Screen preview callback")\r
-] interface IDeckLinkScreenPreviewCallback : IUnknown\r
-{\r
-    HRESULT DrawFrame([in] IDeckLinkVideoFrame *theFrame);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */\r
-\r
-[\r
-    object,\r
-    uuid(504E2209-CAC7-4C1A-9FB4-C5BB6274D22F),\r
-    local, \r
-    helpstring("Created with CoCreateInstance().")\r
-] interface IDeckLinkGLScreenPreviewHelper : IUnknown\r
-{\r
-\r
-    /* Methods must be called with OpenGL context set */\r
-\r
-    HRESULT InitializeGL(void);\r
-    HRESULT PaintGL(void);\r
-    HRESULT SetFrame([in] IDeckLinkVideoFrame *theFrame);\r
-    HRESULT Set3DPreviewFormat([in] BMD3DPreviewFormat previewFormat);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkConfiguration - DeckLink Configuration interface */\r
-\r
-[\r
-    object,\r
-    uuid(C679A35B-610C-4D09-B748-1D0478100FC0),\r
-    local, \r
-    helpstring("DeckLink Configuration interface")\r
-] interface IDeckLinkConfiguration : IUnknown\r
-{\r
-    HRESULT SetFlag([in] BMDDeckLinkConfigurationID cfgID, [in] BOOL value);\r
-    HRESULT GetFlag([in] BMDDeckLinkConfigurationID cfgID, [out] BOOL *value);\r
-    HRESULT SetInt([in] BMDDeckLinkConfigurationID cfgID, [in] LONGLONG value);\r
-    HRESULT GetInt([in] BMDDeckLinkConfigurationID cfgID, [out] LONGLONG *value);\r
-    HRESULT SetFloat([in] BMDDeckLinkConfigurationID cfgID, [in] double value);\r
-    HRESULT GetFloat([in] BMDDeckLinkConfigurationID cfgID, [out] double *value);\r
-    HRESULT SetString([in] BMDDeckLinkConfigurationID cfgID, [in] BSTR value);\r
-    HRESULT GetString([in] BMDDeckLinkConfigurationID cfgID, [out] BSTR *value);\r
-    HRESULT WriteConfigurationToPreferences(void);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkAttributes - DeckLink Attribute interface */\r
-\r
-[\r
-    object,\r
-    uuid(ABC11843-D966-44CB-96E2-A1CB5D3135C4),\r
-    local, \r
-    helpstring("DeckLink Attribute interface")\r
-] interface IDeckLinkAttributes : IUnknown\r
-{\r
-    HRESULT GetFlag([in] BMDDeckLinkAttributeID cfgID, [out] BOOL *value);\r
-    HRESULT GetInt([in] BMDDeckLinkAttributeID cfgID, [out] LONGLONG *value);\r
-    HRESULT GetFloat([in] BMDDeckLinkAttributeID cfgID, [out] double *value);\r
-    HRESULT GetString([in] BMDDeckLinkAttributeID cfgID, [out] BSTR *value);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkKeyer - DeckLink Keyer interface */\r
-\r
-[\r
-    object,\r
-    uuid(89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3),\r
-    local, \r
-    helpstring("DeckLink Keyer interface")\r
-] interface IDeckLinkKeyer : IUnknown\r
-{\r
-    HRESULT Enable([in] BOOL isExternal);\r
-    HRESULT SetLevel([in] unsigned char level);\r
-    HRESULT RampUp([in] unsigned long numberOfFrames);\r
-    HRESULT RampDown([in] unsigned long numberOfFrames);\r
-    HRESULT Disable(void);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */\r
-\r
-[\r
-    object,\r
-    uuid(3BBCB8A2-DA2C-42D9-B5D8-88083644E99A),\r
-    local, \r
-    helpstring("Created with CoCreateInstance().")\r
-] interface IDeckLinkVideoConversion : IUnknown\r
-{\r
-    HRESULT ConvertFrame([in] IDeckLinkVideoFrame* srcFrame, [in] IDeckLinkVideoFrame* dstFrame);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkDeckControlStatusCallback - Deck control state change callback. */\r
-\r
-[\r
-    object,\r
-    uuid(E5F693C1-4283-4716-B18F-C1431521955B),\r
-    helpstring("Deck control state change callback.")\r
-] interface IDeckLinkDeckControlStatusCallback : IUnknown\r
-{\r
-    HRESULT TimecodeUpdate([in] BMDTimecodeBCD currentTimecode);\r
-    HRESULT VTRControlStateChanged([in] BMDDeckControlVTRControlState newState, [in] BMDDeckControlError error);\r
-    HRESULT DeckControlEventReceived([in] BMDDeckControlEvent event, [in] BMDDeckControlError error);\r
-    HRESULT DeckControlStatusChanged([in] BMDDeckControlStatusFlags flags, [in] unsigned long mask);\r
-};\r
-\r
-\r
-/* Interface IDeckLinkDeckControl - Deck Control main interface */\r
-\r
-[\r
-    object,\r
-    uuid(522A9E39-0F3C-4742-94EE-D80DE335DA1D),\r
-    helpstring("Deck Control main interface")\r
-] interface IDeckLinkDeckControl : IUnknown\r
-{\r
-    HRESULT Open([in] BMDTimeScale timeScale, [in] BMDTimeValue timeValue, [in] BOOL timecodeIsDropFrame, [out] BMDDeckControlError *error);\r
-    HRESULT Close([in] BOOL standbyOn);\r
-    HRESULT GetCurrentState([out] BMDDeckControlMode *mode, [out] BMDDeckControlVTRControlState *vtrControlState, [out] BMDDeckControlStatusFlags *flags);\r
-    HRESULT SetStandby([in] BOOL standbyOn);\r
-    HRESULT SendCommand([in] unsigned char *inBuffer, [in] unsigned long inBufferSize, [out] unsigned char *outBuffer, [out] unsigned long *outDataSize, [in] unsigned long outBufferSize, [out] BMDDeckControlError *error);\r
-    HRESULT Play([out] BMDDeckControlError *error);\r
-    HRESULT Stop([out] BMDDeckControlError *error);\r
-    HRESULT TogglePlayStop([out] BMDDeckControlError *error);\r
-    HRESULT Eject([out] BMDDeckControlError *error);\r
-    HRESULT GoToTimecode([in] BMDTimecodeBCD timecode, [out] BMDDeckControlError *error);\r
-    HRESULT FastForward([in] BOOL viewTape, [out] BMDDeckControlError *error);\r
-    HRESULT Rewind([in] BOOL viewTape, [out] BMDDeckControlError *error);\r
-    HRESULT StepForward([out] BMDDeckControlError *error);\r
-    HRESULT StepBack([out] BMDDeckControlError *error);\r
-    HRESULT Jog([in] double rate, [out] BMDDeckControlError *error);\r
-    HRESULT Shuttle([in] double rate, [out] BMDDeckControlError *error);\r
-    HRESULT GetTimecodeString([out] BSTR *currentTimeCode, [out] BMDDeckControlError *error);\r
-    HRESULT GetTimecode([out] IDeckLinkTimecode **currentTimecode, [out] BMDDeckControlError *error);\r
-    HRESULT GetTimecodeBCD([out] BMDTimecodeBCD *currentTimecode, [out] BMDDeckControlError *error);\r
-    HRESULT SetPreroll([in] unsigned long prerollSeconds);\r
-    HRESULT GetPreroll([out] unsigned long *prerollSeconds);\r
-    HRESULT SetExportOffset([in] long exportOffsetFields);\r
-    HRESULT GetExportOffset([out] long *exportOffsetFields);\r
-    HRESULT GetManualExportOffset([out] long *deckManualExportOffsetFields);\r
-    HRESULT SetCaptureOffset([in] long captureOffsetFields);\r
-    HRESULT GetCaptureOffset([out] long *captureOffsetFields);\r
-    HRESULT StartExport([in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [in] BMDDeckControlExportModeOpsFlags exportModeOps, [out] BMDDeckControlError *error);\r
-    HRESULT StartCapture([in] BOOL useVITC, [in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [out] BMDDeckControlError *error);\r
-    HRESULT GetDeviceID([out] unsigned short *deviceId, [out] BMDDeckControlError *error);\r
-    HRESULT Abort(void);\r
-    HRESULT CrashRecordStart([out] BMDDeckControlError *error);\r
-    HRESULT CrashRecordStop([out] BMDDeckControlError *error);\r
-    HRESULT SetCallback([in] IDeckLinkDeckControlStatusCallback *callback);\r
-};\r
-\r
-\r
-/* Coclasses */\r
-\r
-importlib("stdole2.tlb");\r
-\r
-[\r
-    uuid(D9EDA3B3-2887-41FA-B724-017CF1EB1D37),\r
-    helpstring("CDeckLinkIterator Class")\r
-] coclass CDeckLinkIterator\r
-{\r
-    [default] interface IDeckLinkIterator;\r
-};\r
-\r
-[\r
-    uuid(263CA19F-ED09-482E-9F9D-84005783A237),\r
-    helpstring("CDeckLinkAPIInformation Class")\r
-] coclass CDeckLinkAPIInformation\r
-{\r
-    [default] interface IDeckLinkAPIInformation;\r
-};\r
-\r
-[\r
-    uuid(F63E77C7-B655-4A4A-9AD0-3CA85D394343),\r
-    helpstring("CDeckLinkGLScreenPreviewHelper Class")\r
-] coclass CDeckLinkGLScreenPreviewHelper\r
-{\r
-    [default] interface IDeckLinkGLScreenPreviewHelper;\r
-};\r
-\r
-[\r
-    uuid(7DBBBB11-5B7B-467D-AEA4-CEA468FD368C),\r
-    helpstring("CDeckLinkVideoConversion Class")\r
-] coclass CDeckLinkVideoConversion\r
-{\r
-    [default] interface IDeckLinkVideoConversion;\r
-};\r
-\r
-\r
-// import deprecated interfaces\r
-#include "DeckLinkAPI_v7_9.idl"\r
-#include "DeckLinkAPI_v7_6.idl"\r
-#include "DeckLinkAPI_v7_3.idl"\r
-#include "DeckLinkAPI_v7_1.idl"\r
-};\r
index f051cea4eb44189e7e5275578084b0bdb2578268..fa2dc2217a502a68d1924b25dec82eb515b21099 100644 (file)
@@ -12255,3 +12255,4 @@ EXTERN_C const IID IID_IDeckLinkInput_v7_1;
 
 #endif
 
+
index 29eeda6f2b283c6b84d7717d9960719c804dfcc5..cf06b2180a817a839c6ef73be9038bd39ee24343 100644 (file)
@@ -325,3 +325,4 @@ MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v7_1,0x2B54EDEF,0x5B32,0x429F,0xBA,0x11
 #endif
 
 
+
diff --git a/modules/decklink/interop/DeckLinkAPI_v7_1.idl b/modules/decklink/interop/DeckLinkAPI_v7_1.idl
deleted file mode 100644 (file)
index 20d4e5f..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/* -LICENSE-START-\r
-** Copyright (c) 2009 Blackmagic Design\r
-**\r
-** Permission is hereby granted, free of charge, to any person or organization\r
-** obtaining a copy of the software and accompanying documentation covered by\r
-** this license (the "Software") to use, reproduce, display, distribute,\r
-** execute, and transmit the Software, and to prepare derivative works of the\r
-** Software, and to permit third-parties to whom the Software is furnished to\r
-** do so, all subject to the following:\r
-** \r
-** The copyright notices in the Software and this entire statement, including\r
-** the above license grant, this restriction and the following disclaimer,\r
-** must be included in all copies of the Software, in whole or in part, and\r
-** all derivative works of the Software, unless such copies or derivative\r
-** works are solely in the form of machine-executable object code generated by\r
-** a source language processor.\r
-** \r
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\r
-** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\r
-** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\r
-** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
-** DEALINGS IN THE SOFTWARE.\r
-** -LICENSE-END-\r
-*/\r
-/* DeckLinkAPI_v7_1.idl */\r
-\r
-       interface IDeckLinkDisplayModeIterator_v7_1;\r
-       interface IDeckLinkDisplayMode_v7_1;\r
-       interface IDeckLinkVideoFrame_v7_1;\r
-       interface IDeckLinkVideoInputFrame_v7_1;\r
-       interface IDeckLinkAudioInputPacket_v7_1;\r
-       \r
-       [object, uuid(B28131B6-59AC-4857-B5AC-CD75D5883E2F),\r
-        helpstring("IDeckLinkDisplayModeIterator_v7_1 enumerates over supported input/output display modes.")]\r
-       interface IDeckLinkDisplayModeIterator_v7_1 : IUnknown\r
-       {\r
-               HRESULT         Next ([out] IDeckLinkDisplayMode_v7_1** deckLinkDisplayMode);\r
-       };\r
-\r
-\r
-       [object, uuid(AF0CD6D5-8376-435E-8433-54F9DD530AC3),\r
-        helpstring("IDeckLinkDisplayMode_v7_1 represents a display mode")]\r
-       interface IDeckLinkDisplayMode_v7_1 : IUnknown\r
-       {\r
-               HRESULT                         GetName ([out] BSTR* name);\r
-               BMDDisplayMode          GetDisplayMode ();\r
-               long                            GetWidth ();\r
-               long                            GetHeight ();\r
-               HRESULT                         GetFrameRate ([out] BMDTimeValue *frameDuration, [out] BMDTimeScale *timeScale);\r
-       };\r
-       \r
-       [object, uuid(EBD01AFA-E4B0-49C6-A01D-EDB9D1B55FD9),\r
-     helpstring("IDeckLinkVideoOutputCallback. Frame completion callback.")]\r
-    interface IDeckLinkVideoOutputCallback_v7_1 : IUnknown\r
-    {\r
-        HRESULT                ScheduledFrameCompleted ([in] IDeckLinkVideoFrame_v7_1* completedFrame, [in] BMDOutputFrameCompletionResult result);\r
-    };\r
-       \r
-    [object, uuid(7F94F328-5ED4-4E9F-9729-76A86BDC99CC),\r
-     helpstring("IDeckLinkInputCallback_v7_1. Frame arrival callback.")]\r
-    interface IDeckLinkInputCallback_v7_1 : IUnknown\r
-    {\r
-        HRESULT                VideoInputFrameArrived ([in] IDeckLinkVideoInputFrame_v7_1* videoFrame, [in] IDeckLinkAudioInputPacket_v7_1* audioPacket);\r
-    };\r
-       \r
-\r
-    [object, uuid(AE5B3E9B-4E1E-4535-B6E8-480FF52F6CE5), local,\r
-     helpstring("IDeckLinkOutput_v7_1.  Created by QueryInterface from IDeckLink.")]\r
-    interface IDeckLinkOutput_v7_1 : IUnknown\r
-    {\r
-               HRESULT         DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);\r
-               HRESULT         GetDisplayModeIterator ([out] IDeckLinkDisplayModeIterator_v7_1 **iterator);\r
-               \r
-               // Video output\r
-        HRESULT                EnableVideoOutput (BMDDisplayMode displayMode);\r
-        HRESULT                DisableVideoOutput ();\r
-               \r
-               HRESULT         SetVideoOutputFrameMemoryAllocator ([in] IDeckLinkMemoryAllocator* theAllocator);\r
-        HRESULT                CreateVideoFrame (long width, long height, long rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1** outFrame);\r
-        HRESULT                CreateVideoFrameFromBuffer (void* buffer, long width, long height, long rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1** outFrame);\r
-\r
-        HRESULT                DisplayVideoFrameSync (IDeckLinkVideoFrame_v7_1* theFrame);\r
-        HRESULT                ScheduleVideoFrame (IDeckLinkVideoFrame_v7_1* theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale);\r
-        HRESULT                SetScheduledFrameCompletionCallback ([in] IDeckLinkVideoOutputCallback_v7_1* theCallback);\r
-               \r
-               // Audio output\r
-               HRESULT         EnableAudioOutput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount);\r
-               HRESULT         DisableAudioOutput ();\r
-               \r
-               HRESULT         WriteAudioSamplesSync (void* buffer, unsigned long sampleFrameCount, [out] unsigned long *sampleFramesWritten);\r
-               \r
-               HRESULT         BeginAudioPreroll ();\r
-               HRESULT         EndAudioPreroll ();\r
-               HRESULT         ScheduleAudioSamples (void* buffer, unsigned long sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, [out] unsigned long *sampleFramesWritten);\r
-               \r
-               HRESULT         GetBufferedAudioSampleFrameCount ( [out] unsigned long *bufferedSampleCount);\r
-               HRESULT         FlushBufferedAudioSamples ();\r
-               \r
-               HRESULT         SetAudioCallback ( [in] IDeckLinkAudioOutputCallback* theCallback);\r
-               \r
-               // Output control\r
-        HRESULT                StartScheduledPlayback (BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed);\r
-        HRESULT                StopScheduledPlayback (BMDTimeValue stopPlaybackAtTime, BMDTimeValue *actualStopTime, BMDTimeScale timeScale);\r
-        HRESULT                GetHardwareReferenceClock (BMDTimeScale desiredTimeScale, BMDTimeValue *elapsedTimeSinceSchedulerBegan);\r
-    };\r
-\r
-    [object, uuid(2B54EDEF-5B32-429F-BA11-BB990596EACD),\r
-     helpstring("IDeckLinkInput_v7_1.  Created by QueryInterface from IDeckLink.")]\r
-    interface IDeckLinkInput_v7_1 : IUnknown\r
-    {\r
-               HRESULT         DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);\r
-               HRESULT         GetDisplayModeIterator ([out] IDeckLinkDisplayModeIterator_v7_1 **iterator);\r
-               \r
-               // Video input\r
-               HRESULT         EnableVideoInput (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags);\r
-               HRESULT         DisableVideoInput ();\r
-               \r
-               // Audio input\r
-               HRESULT         EnableAudioInput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount);\r
-               HRESULT         DisableAudioInput ();\r
-               HRESULT         ReadAudioSamples (void* buffer, unsigned long sampleFrameCount, [out] unsigned long *sampleFramesRead, [out] BMDTimeValue *audioPacketTime, BMDTimeScale timeScale);\r
-               HRESULT         GetBufferedAudioSampleFrameCount ( [out] unsigned long *bufferedSampleCount);\r
-               \r
-               // Input control\r
-               HRESULT         StartStreams ();\r
-               HRESULT         StopStreams ();\r
-               HRESULT         PauseStreams ();\r
-               HRESULT         SetCallback ([in] IDeckLinkInputCallback_v7_1* theCallback);\r
-    };\r
-       \r
-       [object, uuid(333F3A10-8C2D-43CF-B79D-46560FEEA1CE), local,\r
-     helpstring("IDeckLinkVideoFrame_v7_1.  Created by IDeckLinkVideoOutput::CreateVideoFrame.")]\r
-    interface IDeckLinkVideoFrame_v7_1 : IUnknown\r
-    {\r
-        long                           GetWidth ();\r
-        long                           GetHeight ();\r
-        long                           GetRowBytes ();\r
-        BMDPixelFormat         GetPixelFormat ();\r
-        BMDFrameFlags          GetFlags ();\r
-        HRESULT                                GetBytes (void* *buffer);\r
-    };\r
-       \r
-       [object, uuid(C8B41D95-8848-40EE-9B37-6E3417FB114B), local,\r
-     helpstring("IDeckLinkVideoInputFrame_v7_1.  Provided by the IDeckLinkVideoInput frame arrival callback.")]\r
-    interface IDeckLinkVideoInputFrame_v7_1 : IDeckLinkVideoFrame_v7_1\r
-    {\r
-        HRESULT                                GetFrameTime (BMDTimeValue *frameTime, BMDTimeValue *frameDuration, BMDTimeScale timeScale);\r
-    };\r
-       \r
-       [object, uuid(C86DE4F6-A29F-42E3-AB3A-1363E29F0788), local,\r
-     helpstring("IDeckLinkAudioInputPacket_v7_1.  Provided by the IDeckLinkInput callback.")]\r
-    interface IDeckLinkAudioInputPacket_v7_1 : IUnknown\r
-    {\r
-               long                            GetSampleCount ();\r
-               HRESULT                         GetBytes (void* *buffer);\r
-               HRESULT                         GetAudioPacketTime (BMDTimeValue *packetTime, BMDTimeScale timeScale);\r
-    };\r
-       \r
diff --git a/modules/decklink/interop/DeckLinkAPI_v7_3.idl b/modules/decklink/interop/DeckLinkAPI_v7_3.idl
deleted file mode 100644 (file)
index da367d6..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/* -LICENSE-START-
-** Copyright (c) 2009 Blackmagic Design
-**
-** Permission is hereby granted, free of charge, to any person or organization
-** obtaining a copy of the software and accompanying documentation covered by
-** this license (the "Software") to use, reproduce, display, distribute,
-** execute, and transmit the Software, and to prepare derivative works of the
-** Software, and to permit third-parties to whom the Software is furnished to
-** do so, all subject to the following:
-** 
-** The copyright notices in the Software and this entire statement, including
-** the above license grant, this restriction and the following disclaimer,
-** must be included in all copies of the Software, in whole or in part, and
-** all derivative works of the Software, unless such copies or derivative
-** works are solely in the form of machine-executable object code generated by
-** a source language processor.
-** 
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-** DEALINGS IN THE SOFTWARE.
-** -LICENSE-END-
-*/
-
-/* Forward Declarations */
-
-interface IDeckLinkInputCallback_v7_3;
-interface IDeckLinkOutput_v7_3;
-interface IDeckLinkInput_v7_3;
-interface IDeckLinkVideoInputFrame_v7_3;
-
-/* End Forward Declarations */
-
-
-/* Interface IDeckLinkInputCallback - Frame arrival callback. */
-
-[
-    object,
-    uuid(FD6F311D-4D00-444B-9ED4-1F25B5730AD0),
-    helpstring("Frame arrival callback.")
-] interface IDeckLinkInputCallback_v7_3 : IUnknown
-{
-    HRESULT VideoInputFormatChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode_v7_6 *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags);
-    HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame_v7_3 *videoFrame, [in] IDeckLinkAudioInputPacket *audioPacket);
-};
-
-/* End Interface IDeckLinkInputCallback */
-
-
-/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */
-
-[
-    object,
-    uuid(271C65E3-C323-4344-A30F-D908BCB20AA3),
-    local, 
-    helpstring("Created by QueryInterface from IDeckLink.")
-] interface IDeckLinkOutput_v7_3 : IUnknown
-{
-    HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);
-    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator);
-
-    HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);
-
-    /* Video Output */
-
-    HRESULT EnableVideoOutput(BMDDisplayMode displayMode, BMDVideoOutputFlags flags);
-    HRESULT DisableVideoOutput(void);
-
-    HRESULT SetVideoOutputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator);
-    HRESULT CreateVideoFrame(long width, long height, long rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame_v7_6 **outFrame);
-    HRESULT CreateAncillaryData(BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer);
-
-    HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame_v7_6 *theFrame);
-    HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale);
-    HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback *theCallback);
-    HRESULT GetBufferedVideoFrameCount([out] unsigned long *bufferedFrameCount);
-
-    /* Audio Output */
-
-    HRESULT EnableAudioOutput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount, BMDAudioOutputStreamType streamType);
-    HRESULT DisableAudioOutput(void);
-
-    HRESULT WriteAudioSamplesSync([in] void *buffer, unsigned long sampleFrameCount, [out] unsigned long *sampleFramesWritten);
-
-    HRESULT BeginAudioPreroll(void);
-    HRESULT EndAudioPreroll(void);
-    HRESULT ScheduleAudioSamples([in] void *buffer, unsigned long sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, [out] unsigned long *sampleFramesWritten);
-
-    HRESULT GetBufferedAudioSampleFrameCount([out] unsigned long *bufferedSampleFrameCount);
-    HRESULT FlushBufferedAudioSamples(void);
-
-    HRESULT SetAudioCallback([in] IDeckLinkAudioOutputCallback *theCallback);
-
-    /* Output Control */
-
-    HRESULT StartScheduledPlayback(BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed);
-    HRESULT StopScheduledPlayback(BMDTimeValue stopPlaybackAtTime, [out] BMDTimeValue *actualStopTime, BMDTimeScale timeScale);
-    HRESULT IsScheduledPlaybackRunning([out] BOOL *active);
-    HRESULT GetHardwareReferenceClock(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *elapsedTimeSinceSchedulerBegan);
-};
-
-/* End Interface IDeckLinkOutput */
-
-/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */
-
-[
-    object,
-    uuid(4973F012-9925-458C-871C-18774CDBBECB),
-    helpstring("Created by QueryInterface from IDeckLink.")
-] interface IDeckLinkInput_v7_3 : IUnknown
-{
-    HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);
-    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator);
-
-    HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);
-
-    /* Video Input */
-
-    HRESULT EnableVideoInput(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags);
-    HRESULT DisableVideoInput(void);
-    HRESULT GetAvailableVideoFrameCount([out] unsigned long *availableFrameCount);
-
-    /* Audio Input */
-
-    HRESULT EnableAudioInput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount);
-    HRESULT DisableAudioInput(void);
-    HRESULT GetAvailableAudioSampleFrameCount([out] unsigned long *availableSampleFrameCount);
-
-    /* Input Control */
-
-    HRESULT StartStreams(void);
-    HRESULT StopStreams(void);
-    HRESULT PauseStreams(void);
-    HRESULT FlushStreams(void);
-    HRESULT SetCallback([in] IDeckLinkInputCallback_v7_3 *theCallback);
-};
-
-/* End Interface IDeckLinkInput */
-
-
-/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
-
-[
-    object,
-    uuid(CF317790-2894-11DE-8C30-0800200C9A66),
-    local, 
-    helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.")
-] interface IDeckLinkVideoInputFrame_v7_3 : IDeckLinkVideoFrame_v7_6
-{
-    HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration, BMDTimeScale timeScale);
-};
-
-/* End Interface IDeckLinkVideoInputFrame */
-
diff --git a/modules/decklink/interop/DeckLinkAPI_v7_6.idl b/modules/decklink/interop/DeckLinkAPI_v7_6.idl
deleted file mode 100644 (file)
index 271801c..0000000
+++ /dev/null
@@ -1,396 +0,0 @@
-/* -LICENSE-START-
-** Copyright (c) 2009 Blackmagic Design
-**
-** Permission is hereby granted, free of charge, to any person or organization
-** obtaining a copy of the software and accompanying documentation covered by
-** this license (the "Software") to use, reproduce, display, distribute,
-** execute, and transmit the Software, and to prepare derivative works of the
-** Software, and to permit third-parties to whom the Software is furnished to
-** do so, all subject to the following:
-** 
-** The copyright notices in the Software and this entire statement, including
-** the above license grant, this restriction and the following disclaimer,
-** must be included in all copies of the Software, in whole or in part, and
-** all derivative works of the Software, unless such copies or derivative
-** works are solely in the form of machine-executable object code generated by
-** a source language processor.
-** 
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-** DEALINGS IN THE SOFTWARE.
-** -LICENSE-END-
-*/
-
-/* Enum BMDVideoConnection - Video connection types */
-
-typedef [v1_enum] enum  _BMDVideoConnection_v7_6 {
-    bmdVideoConnectionSDI_v7_6                              = /* 'sdi ' */ 0x73646920,
-    bmdVideoConnectionHDMI_v7_6                             = /* 'hdmi' */ 0x68646D69,
-    bmdVideoConnectionOpticalSDI_v7_6                       = /* 'opti' */ 0x6F707469,
-    bmdVideoConnectionComponent_v7_6                        = /* 'cpnt' */ 0x63706E74,
-    bmdVideoConnectionComposite_v7_6                        = /* 'cmst' */ 0x636D7374,
-    bmdVideoConnectionSVideo_v7_6                           = /* 'svid' */ 0x73766964
-} BMDVideoConnection_v7_6;
-
-
-
-/* Forward Declarations */
-
-interface IDeckLinkDisplayModeIterator_v7_6;
-interface IDeckLinkDisplayMode_v7_6;
-interface IDeckLinkOutput_v7_6;
-interface IDeckLinkInput_v7_6;
-interface IDeckLinkTimecode_v7_6;
-interface IDeckLinkVideoFrame_v7_6;
-interface IDeckLinkMutableVideoFrame_v7_6;
-interface IDeckLinkVideoInputFrame_v7_6;
-interface IDeckLinkScreenPreviewCallback_v7_6;
-interface IDeckLinkGLScreenPreviewHelper_v7_6;
-interface IDeckLinkVideoConversion_v7_6;
-interface IDeckLinkConfiguration_v7_6;
-
-
-/* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */
-
-[
-    object,
-    uuid(E763A626-4A3C-49D1-BF13-E7AD3692AE52),
-    helpstring("Frame completion callback.")
-] interface IDeckLinkVideoOutputCallback_v7_6 : IUnknown
-{
-    HRESULT ScheduledFrameCompleted([in] IDeckLinkVideoFrame_v7_6 *completedFrame, [in] BMDOutputFrameCompletionResult result);
-    HRESULT ScheduledPlaybackHasStopped(void);
-};
-
-
-/* Interface IDeckLinkInputCallback - Frame arrival callback. */
-
-[
-    object,
-    uuid(31D28EE7-88B6-4CB1-897A-CDBF79A26414),
-    helpstring("Frame arrival callback.")
-] interface IDeckLinkInputCallback_v7_6 : IUnknown
-{
-    HRESULT VideoInputFormatChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode_v7_6 *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags);
-    HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame_v7_6* videoFrame, [in] IDeckLinkAudioInputPacket* audioPacket);
-};
-
-
-/* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */
-
-[
-    object,
-    uuid(455D741F-1779-4800-86F5-0B5D13D79751),
-    helpstring("enumerates over supported input/output display modes.")
-] interface IDeckLinkDisplayModeIterator_v7_6 : IUnknown
-{
-    HRESULT Next([out] IDeckLinkDisplayMode_v7_6 **deckLinkDisplayMode);
-};
-
-
-/* Interface IDeckLinkDisplayMode - represents a display mode */
-
-[
-    object,
-    uuid(87451E84-2B7E-439E-A629-4393EA4A8550),
-    helpstring("represents a display mode")
-] interface IDeckLinkDisplayMode_v7_6 : IUnknown
-{
-    HRESULT GetName([out] BSTR *name);
-    BMDDisplayMode GetDisplayMode(void);
-    long GetWidth(void);
-    long GetHeight(void);
-    HRESULT GetFrameRate([out] BMDTimeValue *frameDuration, [out] BMDTimeScale *timeScale);
-    BMDFieldDominance GetFieldDominance(void);
-};
-
-
-/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */
-
-[
-    object,
-    uuid(29228142-EB8C-4141-A621-F74026450955),
-    local, 
-    helpstring("Created by QueryInterface from IDeckLink.")
-] interface IDeckLinkOutput_v7_6 : IUnknown
-{
-    HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);
-    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator);
-
-    HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback_v7_6 *previewCallback);
-
-    /* Video Output */
-
-    HRESULT EnableVideoOutput(BMDDisplayMode displayMode, BMDVideoOutputFlags flags);
-    HRESULT DisableVideoOutput(void);
-
-    HRESULT SetVideoOutputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator);
-    HRESULT CreateVideoFrame(long width, long height, long rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame_v7_6 **outFrame);
-    HRESULT CreateAncillaryData(BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer);
-
-    HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame_v7_6 *theFrame);
-    HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale);
-    HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback_v7_6 *theCallback);
-    HRESULT GetBufferedVideoFrameCount([out] unsigned long *bufferedFrameCount);
-
-    /* Audio Output */
-
-    HRESULT EnableAudioOutput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount, BMDAudioOutputStreamType streamType);
-    HRESULT DisableAudioOutput(void);
-
-    HRESULT WriteAudioSamplesSync([in] void *buffer, unsigned long sampleFrameCount, [out] unsigned long *sampleFramesWritten);
-
-    HRESULT BeginAudioPreroll(void);
-    HRESULT EndAudioPreroll(void);
-    HRESULT ScheduleAudioSamples([in] void *buffer, unsigned long sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, [out] unsigned long *sampleFramesWritten);
-
-    HRESULT GetBufferedAudioSampleFrameCount([out] unsigned long *bufferedSampleFrameCount);
-    HRESULT FlushBufferedAudioSamples(void);
-
-    HRESULT SetAudioCallback([in] IDeckLinkAudioOutputCallback *theCallback);
-
-    /* Output Control */
-
-    HRESULT StartScheduledPlayback(BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed);
-    HRESULT StopScheduledPlayback(BMDTimeValue stopPlaybackAtTime, [out] BMDTimeValue *actualStopTime, BMDTimeScale timeScale);
-    HRESULT IsScheduledPlaybackRunning([out] BOOL *active);
-    HRESULT GetScheduledStreamTime(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *streamTime, [out] double *playbackSpeed);
-
-    /* Hardware Timing */
-
-    HRESULT GetHardwareReferenceClock(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame);
-};
-
-
-/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */
-
-[
-    object,
-    uuid(300C135A-9F43-48E2-9906-6D7911D93CF1),
-    helpstring("Created by QueryInterface from IDeckLink.")
-] interface IDeckLinkInput_v7_6 : IUnknown
-{
-    HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);
-    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator);
-
-    HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback_v7_6 *previewCallback);
-
-    /* Video Input */
-
-    HRESULT EnableVideoInput(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags);
-    HRESULT DisableVideoInput(void);
-    HRESULT GetAvailableVideoFrameCount([out] unsigned long *availableFrameCount);
-
-    /* Audio Input */
-
-    HRESULT EnableAudioInput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount);
-    HRESULT DisableAudioInput(void);
-    HRESULT GetAvailableAudioSampleFrameCount([out] unsigned long *availableSampleFrameCount);
-
-    /* Input Control */
-
-    HRESULT StartStreams(void);
-    HRESULT StopStreams(void);
-    HRESULT PauseStreams(void);
-    HRESULT FlushStreams(void);
-    HRESULT SetCallback([in] IDeckLinkInputCallback_v7_6 *theCallback);
-
-    /* Hardware Timing */
-
-    HRESULT GetHardwareReferenceClock(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame);
-};
-
-
-/* Interface IDeckLinkTimecode_v7_6 - Used for video frame timecode representation. */
-
-[
-    object,
-    uuid(EFB9BCA6-A521-44F7-BD69-2332F24D9EE6),
-    helpstring("Used for video frame timecode representation.")
-] interface IDeckLinkTimecode_v7_6 : IUnknown
-{
-    BMDTimecodeBCD GetBCD(void);
-    HRESULT GetComponents([out] unsigned char *hours, [out] unsigned char *minutes, [out] unsigned char *seconds, [out] unsigned char *frames);
-    HRESULT GetString([out] BSTR *timecode);
-    BMDTimecodeFlags GetFlags(void);
-};
-
-
-/* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */
-
-[
-    object,
-    uuid(A8D8238E-6B18-4196-99E1-5AF717B83D32),
-    local, 
-    helpstring("Interface to encapsulate a video frame; can be caller-implemented.")
-] interface IDeckLinkVideoFrame_v7_6 : IUnknown
-{
-    long GetWidth(void);
-    long GetHeight(void);
-    long GetRowBytes(void);
-    BMDPixelFormat GetPixelFormat(void);
-    BMDFrameFlags GetFlags(void);
-    HRESULT GetBytes([out] void **buffer);
-
-    HRESULT GetTimecode(BMDTimecodeFormat format, [out] IDeckLinkTimecode_v7_6 **timecode);
-    HRESULT GetAncillaryData([out] IDeckLinkVideoFrameAncillary **ancillary);
-};
-
-
-/* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */
-
-[
-    object,
-    uuid(46FCEE00-B4E6-43D0-91C0-023A7FCEB34F),
-    local, 
-    helpstring("Created by IDeckLinkOutput::CreateVideoFrame.")
-] interface IDeckLinkMutableVideoFrame_v7_6 : IDeckLinkVideoFrame_v7_6
-{
-    HRESULT SetFlags(BMDFrameFlags newFlags);
-
-    HRESULT SetTimecode(BMDTimecodeFormat format, [in] IDeckLinkTimecode_v7_6 *timecode);
-    HRESULT SetTimecodeFromComponents(BMDTimecodeFormat format, unsigned char hours, unsigned char minutes, unsigned char seconds, unsigned char frames, BMDTimecodeFlags flags);
-    HRESULT SetAncillaryData([in] IDeckLinkVideoFrameAncillary *ancillary);
-};
-
-
-/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
-
-[
-    object,
-    uuid(9A74FA41-AE9F-47AC-8CF4-01F42DD59965),
-    local, 
-    helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.")
-] interface IDeckLinkVideoInputFrame_v7_6 : IDeckLinkVideoFrame_v7_6
-{
-    HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration, BMDTimeScale timeScale);
-    HRESULT GetHardwareReferenceTimestamp(BMDTimeScale timeScale, [out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration);
-};
-
-
-/* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */
-
-[
-    object,
-    uuid(373F499D-4B4D-4518-AD22-6354E5A5825E),
-    local, 
-    helpstring("Screen preview callback")
-] interface IDeckLinkScreenPreviewCallback_v7_6 : IUnknown
-{
-    HRESULT DrawFrame([in] IDeckLinkVideoFrame_v7_6 *theFrame);
-};
-
-
-/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */
-
-[
-    object,
-    uuid(BA575CD9-A15E-497B-B2C2-F9AFE7BE4EBA),
-    local, 
-    helpstring("Created with CoCreateInstance().")
-] interface IDeckLinkGLScreenPreviewHelper_v7_6 : IUnknown
-{
-
-    /* Methods must be called with OpenGL context set */
-
-    HRESULT InitializeGL(void);
-    HRESULT PaintGL(void);
-    HRESULT SetFrame([in] IDeckLinkVideoFrame_v7_6 *theFrame);
-};
-
-
-/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */
-
-[
-    object,
-    uuid(3EB504C9-F97D-40FE-A158-D407D48CB53B),
-    local, 
-    helpstring("Created with CoCreateInstance().")
-] interface IDeckLinkVideoConversion_v7_6 : IUnknown
-{
-    HRESULT ConvertFrame([in] IDeckLinkVideoFrame_v7_6* srcFrame, [in] IDeckLinkVideoFrame_v7_6* dstFrame);
-};
-
-/* Interface IDeckLinkConfiguration_v7_6 - Created by QueryInterface from IDeckLink. */
-
-[
-    object,
-    uuid(B8EAD569-B764-47F0-A73F-AE40DF6CBF10),
-    helpstring("Created by QueryInterface from IDeckLink.")
-] interface IDeckLinkConfiguration_v7_6 : IUnknown
-{
-    HRESULT GetConfigurationValidator([out] IDeckLinkConfiguration_v7_6 **configObject);
-    HRESULT WriteConfigurationToPreferences(void);
-
-    /* Video Output Configuration */
-
-    HRESULT SetVideoOutputFormat([in] BMDVideoConnection_v7_6 videoOutputConnection);
-    HRESULT IsVideoOutputActive([in] BMDVideoConnection_v7_6 videoOutputConnection, [out] BOOL *active);
-
-    HRESULT SetAnalogVideoOutputFlags([in] BMDAnalogVideoFlags analogVideoFlags);
-    HRESULT GetAnalogVideoOutputFlags([out] BMDAnalogVideoFlags *analogVideoFlags);
-
-    HRESULT EnableFieldFlickerRemovalWhenPaused([in] BOOL enable);
-    HRESULT IsEnabledFieldFlickerRemovalWhenPaused([out] BOOL *enabled);
-
-    HRESULT Set444And3GBpsVideoOutput([in] BOOL enable444VideoOutput, [in] BOOL enable3GbsOutput);
-    HRESULT Get444And3GBpsVideoOutput([out] BOOL *is444VideoOutputEnabled, [out] BOOL *threeGbsOutputEnabled);
-
-    HRESULT SetVideoOutputConversionMode([in] BMDVideoOutputConversionMode conversionMode);
-    HRESULT GetVideoOutputConversionMode([out] BMDVideoOutputConversionMode *conversionMode);
-
-    HRESULT Set_HD1080p24_to_HD1080i5994_Conversion([in] BOOL enable);
-    HRESULT Get_HD1080p24_to_HD1080i5994_Conversion([out] BOOL *enabled);
-
-    /* Video Input Configuration */
-
-    HRESULT SetVideoInputFormat([in] BMDVideoConnection_v7_6 videoInputFormat);
-    HRESULT GetVideoInputFormat([out] BMDVideoConnection_v7_6 *videoInputFormat);
-
-    HRESULT SetAnalogVideoInputFlags([in] BMDAnalogVideoFlags analogVideoFlags);
-    HRESULT GetAnalogVideoInputFlags([out] BMDAnalogVideoFlags *analogVideoFlags);
-
-    HRESULT SetVideoInputConversionMode([in] BMDVideoInputConversionMode conversionMode);
-    HRESULT GetVideoInputConversionMode([out] BMDVideoInputConversionMode *conversionMode);
-
-    HRESULT SetBlackVideoOutputDuringCapture([in] BOOL blackOutInCapture);
-    HRESULT GetBlackVideoOutputDuringCapture([out] BOOL *blackOutInCapture);
-
-    HRESULT Set32PulldownSequenceInitialTimecodeFrame([in] unsigned long aFrameTimecode);
-    HRESULT Get32PulldownSequenceInitialTimecodeFrame([out] unsigned long *aFrameTimecode);
-
-    HRESULT SetVancSourceLineMapping([in] unsigned long activeLine1VANCsource, [in] unsigned long activeLine2VANCsource, [in] unsigned long activeLine3VANCsource);
-    HRESULT GetVancSourceLineMapping([out] unsigned long *activeLine1VANCsource, [out] unsigned long *activeLine2VANCsource, [out] unsigned long *activeLine3VANCsource);
-
-    /* Audio Input Configuration */
-
-    HRESULT SetAudioInputFormat([in] BMDAudioConnection audioInputFormat);
-    HRESULT GetAudioInputFormat([out] BMDAudioConnection *audioInputFormat);
-};
-
-
-
-/* Coclasses */
-
-importlib("stdole2.tlb");
-
-[
-    uuid(D398CEE7-4434-4CA3-9BA6-5AE34556B905),
-    helpstring("CDeckLinkGLScreenPreviewHelper Class (DeckLink API v7.6)")
-] coclass CDeckLinkGLScreenPreviewHelper_v7_6
-{
-    [default] interface IDeckLinkGLScreenPreviewHelper_v7_6;
-};
-
-[
-    uuid(FFA84F77-73BE-4FB7-B03E-B5E44B9F759B),
-    helpstring("CDeckLinkVideoConversion Class (DeckLink API v7.6)")
-] coclass CDeckLinkVideoConversion_v7_6
-{
-    [default] interface IDeckLinkVideoConversion_v7_6;
-};
-
diff --git a/modules/decklink/interop/DeckLinkAPI_v7_9.idl b/modules/decklink/interop/DeckLinkAPI_v7_9.idl
deleted file mode 100644 (file)
index 5e57b14..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -LICENSE-START-
-** Copyright (c) 2010 Blackmagic Design
-**
-** Permission is hereby granted, free of charge, to any person or organization
-** obtaining a copy of the software and accompanying documentation covered by
-** this license (the "Software") to use, reproduce, display, distribute,
-** execute, and transmit the Software, and to prepare derivative works of the
-** Software, and to permit third-parties to whom the Software is furnished to
-** do so, all subject to the following:
-** 
-** The copyright notices in the Software and this entire statement, including
-** the above license grant, this restriction and the following disclaimer,
-** must be included in all copies of the Software, in whole or in part, and
-** all derivative works of the Software, unless such copies or derivative
-** works are solely in the form of machine-executable object code generated by
-** a source language processor.
-** 
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-** DEALINGS IN THE SOFTWARE.
-** -LICENSE-END-
-*/
-/* DeckLinkAPI_v7_9.idl */
-
-/* Interface IDeckLinkDeckControl_v7_9 - Deck Control main interface */
-
-[
-       object,
-       uuid(A4D81043-0619-42B7-8ED6-602D29041DF7),
-       helpstring("Deck Control main interface")
-] interface IDeckLinkDeckControl_v7_9 : IUnknown
-{
-       HRESULT Open([in] BMDTimeScale timeScale, [in] BMDTimeValue timeValue, [in] BOOL timecodeIsDropFrame, [out] BMDDeckControlError *error);
-       HRESULT Close([in] BOOL standbyOn);
-       HRESULT GetCurrentState([out] BMDDeckControlMode *mode, [out] BMDDeckControlVTRControlState *vtrControlState, [out] BMDDeckControlStatusFlags *flags);
-       HRESULT SetStandby([in] BOOL standbyOn);
-       HRESULT Play([out] BMDDeckControlError *error);
-       HRESULT Stop([out] BMDDeckControlError *error);
-       HRESULT TogglePlayStop([out] BMDDeckControlError *error);
-       HRESULT Eject([out] BMDDeckControlError *error);
-       HRESULT GoToTimecode([in] BMDTimecodeBCD timecode, [out] BMDDeckControlError *error);
-       HRESULT FastForward([in] BOOL viewTape, [out] BMDDeckControlError *error);
-       HRESULT Rewind([in] BOOL viewTape, [out] BMDDeckControlError *error);
-       HRESULT StepForward([out] BMDDeckControlError *error);
-       HRESULT StepBack([out] BMDDeckControlError *error);
-       HRESULT Jog([in] double rate, [out] BMDDeckControlError *error);
-       HRESULT Shuttle([in] double rate, [out] BMDDeckControlError *error);
-       HRESULT GetTimecodeString([out] BSTR *currentTimeCode, [out] BMDDeckControlError *error);
-       HRESULT GetTimecode([out] IDeckLinkTimecode **currentTimecode, [out] BMDDeckControlError *error);
-       HRESULT GetTimecodeBCD([out] BMDTimecodeBCD *currentTimecode, [out] BMDDeckControlError *error);
-       HRESULT SetPreroll([in] unsigned long prerollSeconds);
-       HRESULT GetPreroll([out] unsigned long *prerollSeconds);
-       HRESULT SetExportOffset([in] long exportOffsetFields);
-       HRESULT GetExportOffset([out] long *exportOffsetFields);
-       HRESULT GetManualExportOffset([out] long *deckManualExportOffsetFields);
-       HRESULT SetCaptureOffset([in] long captureOffsetFields);
-       HRESULT GetCaptureOffset([out] long *captureOffsetFields);
-       HRESULT StartExport([in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [in] BMDDeckControlExportModeOpsFlags exportModeOps, [out] BMDDeckControlError *error);
-       HRESULT StartCapture([in] BOOL useVITC, [in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [out] BMDDeckControlError *error);
-       HRESULT GetDeviceID([out] unsigned short *deviceId, [out] BMDDeckControlError *error);
-       HRESULT Abort(void);
-       HRESULT CrashRecordStart([out] BMDDeckControlError *error);
-       HRESULT CrashRecordStop([out] BMDDeckControlError *error);
-       HRESULT SetCallback([in] IDeckLinkDeckControlStatusCallback *callback);
-};
index 331aa3f818332731d07a4fa351fed23b2d3373da..62d56b0a36fc7d16b4e143e05d851908bc91dd1e 100644 (file)
@@ -81,7 +81,7 @@ namespace caspar { namespace decklink {
                
 class decklink_producer : boost::noncopyable, public IDeckLinkInputCallback
 {      
-       monitor::basic_subject                                                  event_subject_;
+       monitor::subject                                                                monitor_subject_;
        spl::shared_ptr<diagnostics::graph>                             graph_;
        boost::timer                                                                    tick_timer_;
 
@@ -213,15 +213,15 @@ public:
                        video_frame->interlaced_frame   = in_format_desc_.field_mode != core::field_mode::progressive;
                        video_frame->top_field_first    = in_format_desc_.field_mode == core::field_mode::upper ? 1 : 0;
                                
-                       event_subject_  << monitor::event("file/name")                          % model_name_
-                                                       << monitor::event("file/path")                          % device_index_
-                                                       << monitor::event("file/video/width")           % video->GetWidth()
-                                                       << monitor::event("file/video/height")          % video->GetHeight()
-                                                       << monitor::event("file/video/field")           % u8(!video_frame->interlaced_frame ? "progressive" : (video_frame->top_field_first ? "upper" : "lower"))
-                                                       << monitor::event("file/audio/sample-rate")     % 48000
-                                                       << monitor::event("file/audio/channels")        % 2
-                                                       << monitor::event("file/audio/format")          % u8(av_get_sample_fmt_name(AV_SAMPLE_FMT_S32))
-                                                       << monitor::event("file/fps")                           % in_format_desc_.fps;
+                       monitor_subject_        << monitor::message("/file/name")                               % model_name_
+                                                               << monitor::message("/file/path")                               % device_index_
+                                                               << monitor::message("/file/video/width")                        % video->GetWidth()
+                                                               << monitor::message("/file/video/height")               % video->GetHeight()
+                                                               << monitor::message("/file/video/field")                        % u8(!video_frame->interlaced_frame ? "progressive" : (video_frame->top_field_first ? "upper" : "lower"))
+                                                               << monitor::message("/file/audio/sample-rate")  % 48000
+                                                               << monitor::message("/file/audio/channels")             % 2
+                                                               << monitor::message("/file/audio/format")               % u8(av_get_sample_fmt_name(AV_SAMPLE_FMT_S32))
+                                                               << monitor::message("/file/fps")                                        % in_format_desc_.fps;
 
                        // Audio
 
@@ -273,10 +273,10 @@ public:
                        }
                        
                        graph_->set_value("frame-time", frame_timer.elapsed()*out_format_desc_.fps*0.5);        
-                       event_subject_ << monitor::event("profiler/time") % frame_timer.elapsed() % out_format_desc_.fps;
+                       monitor_subject_ << monitor::message("/profiler/time") % frame_timer.elapsed() % out_format_desc_.fps;
 
                        graph_->set_value("output-buffer", static_cast<float>(frame_buffer_.size())/static_cast<float>(frame_buffer_.capacity()));      
-                       event_subject_ << monitor::event("buffer") % frame_buffer_.size() % frame_buffer_.capacity();
+                       monitor_subject_ << monitor::message("/buffer") % frame_buffer_.size() % frame_buffer_.capacity();
                }
                catch(...)
                {
@@ -304,14 +304,9 @@ public:
                return model_name_ + L" [" + boost::lexical_cast<std::wstring>(device_index_) + L"|" + in_format_desc_.name + L"]";
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o)
+       monitor::source& monitor_output()
        {
-               event_subject_.subscribe(o);
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o)
-       {
-               event_subject_.unsubscribe(o);
+               return monitor_subject_;
        }
 };
        
@@ -345,14 +340,9 @@ public:
                });
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override
-       {
-               producer_->subscribe(o);
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
-               producer_->unsubscribe(o);
+               return producer_->monitor_output();
        }
        
        // frame_producer
index 29434559b9461513de843d0d59a9506dd2dff65e..3529907d8032b88385cada42bb64766fb6ae4ed6 100644 (file)
@@ -262,7 +262,7 @@ struct ffmpeg_consumer : boost::noncopyable
        const std::shared_ptr<AVFormatContext>          oc_;
        const core::video_format_desc                           format_desc_;   
 
-       monitor::basic_subject                                          event_subject_;
+       monitor::subject                                                        monitor_subject_;
        
        tbb::spin_mutex                                                         exception_mutex_;
        std::exception_ptr                                                      exception_;
@@ -388,16 +388,11 @@ public:
                return L"ffmpeg[" + u16(filename_) + L"]";
        }
        
-       void subscribe(const monitor::observable::observer_ptr& o)
+       monitor::source& monitor_output()
        {
-               event_subject_.subscribe(o);
+               return monitor_subject_;
        }
 
-       void unsubscribe(const monitor::observable::observer_ptr& o)
-       {
-               event_subject_.unsubscribe(o);
-       }               
-
 private:
        std::shared_ptr<AVStream> add_video_stream(std::vector<option>& options)
        { 
@@ -548,7 +543,7 @@ private:
                av_frame->top_field_first       = format_desc_.field_mode == core::field_mode::upper;
                av_frame->pts                           = frame_number_++;
 
-               event_subject_ << monitor::event("frame")       % static_cast<int64_t>(frame_number_)
+               monitor_subject_ << monitor::message("/frame")  % static_cast<int64_t>(frame_number_)
                                                                                                        % static_cast<int64_t>(std::numeric_limits<int64_t>::max());
 
                AVPacket pkt;
@@ -848,15 +843,10 @@ public:
                return 200;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
-               consumer_->subscribe(o);
+               return consumer_->monitor_output();
        }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
-       {
-               consumer_->unsubscribe(o);
-       }               
 };     
 spl::shared_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)
 {
index e6d5431a1f3334daf7868d40783baedfc3e91853..9d279694eac8f82ca3ec1405730b27e65a2bb651 100644 (file)
@@ -59,7 +59,7 @@ uint64_t get_channel_layout(AVCodecContext* dec)
 
 struct audio_decoder::impl : boost::noncopyable
 {      
-       monitor::basic_subject                                                                          event_subject_;
+       monitor::subject                                                                                        monitor_subject_;
        input*                                                                                                          input_;
        int                                                                                                                     index_;
        const spl::shared_ptr<AVCodecContext>                                           codec_context_;         
@@ -149,10 +149,10 @@ public:
                frame->nb_samples       = channel_samples;
                frame->format           = AV_SAMPLE_FMT_S32;
                                                        
-               event_subject_  << monitor::event("file/audio/sample-rate")     % codec_context_->sample_rate
-                                               << monitor::event("file/audio/channels")        % codec_context_->channels
-                                               << monitor::event("file/audio/format")          % u8(av_get_sample_fmt_name(codec_context_->sample_fmt))
-                                               << monitor::event("file/audio/codec")           % u8(codec_context_->codec->long_name);                 
+               monitor_subject_  << monitor::message("/file/audio/sample-rate")        % codec_context_->sample_rate
+                                               << monitor::message("/file/audio/channels")     % codec_context_->channels
+                                               << monitor::message("/file/audio/format")               % u8(av_get_sample_fmt_name(codec_context_->sample_fmt))
+                                               << monitor::message("/file/audio/codec")                % u8(codec_context_->codec->long_name);                 
 
                return frame;
        }
@@ -174,7 +174,5 @@ audio_decoder& audio_decoder::operator=(audio_decoder&& other){impl_ = std::move
 std::shared_ptr<AVFrame> audio_decoder::operator()(){return impl_->poll();}
 uint32_t audio_decoder::nb_frames() const{return impl_->nb_frames();}
 std::wstring audio_decoder::print() const{return impl_->print();}
-void audio_decoder::subscribe(const monitor::observable::observer_ptr& o){impl_->event_subject_.subscribe(o);}
-void audio_decoder::unsubscribe(const monitor::observable::observer_ptr& o){impl_->event_subject_.unsubscribe(o);}
-
+monitor::source& audio_decoder::monitor_output() { return impl_->monitor_subject_;}
 }}
\ No newline at end of file
index 160f5423716beb32774fbb1e924d2118d898cd18..177e104859b64cfe9172f6878f29756b10a3bae8 100644 (file)
@@ -41,8 +41,7 @@ struct video_format_desc;
 
 namespace ffmpeg {
        
-class audio_decoder : public monitor::observable
-                                       , boost::noncopyable
+class audio_decoder : public boost::noncopyable
 {
 public:
        explicit audio_decoder(class input& input, const core::video_format_desc& format_desc);
@@ -56,10 +55,7 @@ public:
        
        std::wstring print() const;
        
-       // monitor::observable
-       
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
 
 private:
        struct impl;
index 8a8afcad12de4edfd2c57099c12ad4cd44fa2e7f..0dffaaea4c1127dc96207af5ee3de9fbe33250a4 100644 (file)
@@ -66,7 +66,7 @@ namespace caspar { namespace ffmpeg {
                                
 struct ffmpeg_producer : public core::frame_producer_base
 {
-       monitor::basic_subject                                                  event_subject_;
+       monitor::subject                                                                monitor_subject_;
        const std::wstring                                                              filename_;
        
        const spl::shared_ptr<diagnostics::graph>               graph_;
@@ -113,7 +113,7 @@ public:
                try
                {
                        video_decoder_.reset(new video_decoder(input_));
-                       video_decoder_->subscribe(event_subject_);
+                       video_decoder_->monitor_output().link_target(&monitor_subject_);
                        constraints_.width.set(video_decoder_->width());
                        constraints_.height.set(video_decoder_->height());
                        
@@ -132,7 +132,7 @@ public:
                try
                {
                        audio_decoder_ .reset(new audio_decoder(input_, format_desc_));
-                       audio_decoder_->subscribe(event_subject_);
+                       audio_decoder_->monitor_output().link_target(&monitor_subject_);
                        
                        CASPAR_LOG(info) << print() << L" " << audio_decoder_->print();
                }
@@ -172,15 +172,15 @@ public:
                        graph_->set_tag("underflow");
                                                                        
                graph_->set_value("frame-time", frame_timer.elapsed()*format_desc_.fps*0.5);
-               event_subject_  << monitor::event("profiler/time") % frame_timer.elapsed() % (1.0/format_desc_.fps);                    
+               monitor_subject_        << monitor::message("/profiler/time") % frame_timer.elapsed() % (1.0/format_desc_.fps);                 
                                                                
-               event_subject_  << monitor::event("file/time")                  % monitor::duration(file_frame_number()/fps_) 
-                                                                                                                               % monitor::duration(file_nb_frames()/fps_)
-                                               << monitor::event("file/frame")                 % static_cast<int32_t>(file_frame_number())
+               monitor_subject_        << monitor::message("/file/time")                       % (file_frame_number()/fps_) 
+                                                                                                                               % (file_nb_frames()/fps_)
+                                                       << monitor::message("/file/frame")                      % static_cast<int32_t>(file_frame_number())
                                                                                                                                % static_cast<int32_t>(file_nb_frames())
-                                               << monitor::event("file/fps")                   % fps_
-                                               << monitor::event("file/path")                  % filename_
-                                               << monitor::event("loop")                               % input_.loop();
+                                                       << monitor::message("/file/fps")                        % fps_
+                                                       << monitor::message("/file/path")                       % filename_
+                                                       << monitor::message("/loop")                            % input_.loop();
                                                
                return frame;
        }
@@ -296,14 +296,9 @@ public:
                return info;
        }
        
-       void subscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
-               event_subject_.subscribe(o);
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
-       {
-               event_subject_.unsubscribe(o);
+               return monitor_subject_;
        }
 
        // ffmpeg_producer
index e9a805ac7f81c3cc72543cc79e1135298bdc1b1e..5d94f21690f80b39ecf30c208ec4ba0694bc8ab0 100644 (file)
@@ -54,7 +54,7 @@ namespace caspar { namespace ffmpeg {
        
 struct video_decoder::impl : boost::noncopyable
 {
-       monitor::basic_subject                                  event_subject_;
+       monitor::subject                                                monitor_subject_;
        input*                                                                  input_;
        int                                                                             index_;
        const spl::shared_ptr<AVCodecContext>   codec_context_;
@@ -144,10 +144,10 @@ public:
                if(frame->repeat_pict > 0)
                        CASPAR_LOG(warning) << "[video_decoder] repeat_pict not implemented.";
                                
-               event_subject_  << monitor::event("file/video/width")   % width_
-                                               << monitor::event("file/video/height")  % height_
-                                               << monitor::event("file/video/field")   % u8(!frame->interlaced_frame ? "progressive" : (frame->top_field_first ? "upper" : "lower"))
-                                               << monitor::event("file/video/codec")   % u8(codec_context_->codec->long_name);
+               monitor_subject_  << monitor::message("/file/video/width")      % width_
+                                               << monitor::message("/file/video/height")       % height_
+                                               << monitor::message("/file/video/field")        % u8(!frame->interlaced_frame ? "progressive" : (frame->top_field_first ? "upper" : "lower"))
+                                               << monitor::message("/file/video/codec")        % u8(codec_context_->codec->long_name);
                
                return frame;
        }
@@ -173,7 +173,5 @@ uint32_t video_decoder::nb_frames() const{return impl_->nb_frames();}
 uint32_t video_decoder::file_frame_number() const{return impl_->file_frame_number_;}
 bool video_decoder::is_progressive() const{return impl_->is_progressive_;}
 std::wstring video_decoder::print() const{return impl_->print();}
-void video_decoder::subscribe(const monitor::observable::observer_ptr& o){impl_->event_subject_.subscribe(o);}
-void video_decoder::unsubscribe(const monitor::observable::observer_ptr& o){impl_->event_subject_.unsubscribe(o);}
-
+monitor::source& video_decoder::monitor_output() { return impl_->monitor_subject_; }
 }}
\ No newline at end of file
index e77a16f3f47d2dd3b9a785643629b13797bb4248..f01c88140c34ae564378dd652fe13cfbfd4b2243 100644 (file)
@@ -34,8 +34,7 @@ struct AVPacket;
 
 namespace caspar { namespace ffmpeg {
 
-class video_decoder : public monitor::observable
-                                       , boost::noncopyable
+class video_decoder : public boost::noncopyable
 {
 public:
        explicit video_decoder(class input& input);
@@ -54,10 +53,7 @@ public:
 
        std::wstring print() const;
                
-       // monitor::observable
-       
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
 
 private:
        struct impl;
index 4e91263932c9052c8f9bfbd2b15d57e52b184a46..7802ceee37ebede4dbb50ed9f4a52764d891e6c6 100644 (file)
@@ -153,6 +153,11 @@ public:
                        return result.get();
                return L"";
        }
+
+       monitor::source& monitor_output()
+       {
+               return flash_producer_->monitor_output();
+       }
 };
        
 cg_proxy create_cg_proxy(const spl::shared_ptr<core::video_channel>& video_channel, int render_layer)
@@ -214,5 +219,6 @@ void cg_proxy::update(int layer, const std::wstring& data){impl_->update(layer,
 std::wstring cg_proxy::invoke(int layer, const std::wstring& label){return impl_->timed_invoke(layer, label);}
 std::wstring cg_proxy::description(int layer){return impl_->timed_description(layer);}
 std::wstring cg_proxy::template_host_info(){return impl_->timed_template_host_info();}
+monitor::source& cg_proxy::monitor_output(){return impl_->monitor_output();}
 
 }}
\ No newline at end of file
index bf9ef35ca437161d87ca54d4ddba26d9bc245be2..a5bd3a18b1d48fad84482217003148956862c93d 100644 (file)
@@ -51,6 +51,7 @@ public:
        std::wstring invoke(int layer, const std::wstring& label);
        std::wstring description(int layer);
        std::wstring template_host_info();
+       monitor::source& monitor_output();
 
 private:
        struct impl;
index be58dce0484745a5b0ea672121f522a19f8823fe..d29533ef9e105e04cc3801b8199b9d5074b7d92d 100644 (file)
@@ -167,7 +167,7 @@ class flash_renderer
                }
        } com_init_;
 
-       monitor::basic_subject&                                         event_subject_;
+       monitor::subject&                                                       monitor_subject_;
 
        const std::wstring                                                      filename_;
 
@@ -185,8 +185,8 @@ class flash_renderer
        const int                                                                       height_;
        
 public:
-       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) 
-               : event_subject_(event_subject)
+       flash_renderer(monitor::subject& monitor_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) 
+               : monitor_subject_(monitor_subject)
                , graph_(graph)
                , filename_(filename)
                , frame_factory_(frame_factory)
@@ -264,7 +264,7 @@ public:
                        graph_->set_tag("sync");
 
                graph_->set_value("sync", sync);
-               event_subject_ << monitor::event("sync") % sync;
+               monitor_subject_ << monitor::message("/sync") % sync;
                
                ax_->Tick();
                                        
@@ -299,7 +299,7 @@ public:
                }               
                                                                                
                graph_->set_value("frame-time", static_cast<float>(frame_timer.elapsed()/frame_time)*0.5f);
-               event_subject_ << monitor::event("renderer/profiler/time") % frame_timer.elapsed() % frame_time;
+               monitor_subject_ << monitor::message("/renderer/profiler/time") % frame_timer.elapsed() % frame_time;
                return head_;
        }
        
@@ -324,7 +324,7 @@ public:
 
 struct flash_producer : public core::frame_producer_base
 {      
-       monitor::basic_subject                                                  event_subject_;
+       monitor::subject                                                                monitor_subject_;
        const std::wstring                                                              filename_;      
        const spl::shared_ptr<core::frame_factory>              frame_factory_;
        const core::video_format_desc                                   format_desc_;
@@ -387,11 +387,11 @@ public:
                else            
                        graph_->set_tag("late-frame");          
                                
-               event_subject_ << monitor::event("host/path")   % filename_
-                                          << monitor::event("host/width")      % width_
-                                          << monitor::event("host/height") % height_
-                                          << monitor::event("host/fps")        % fps_
-                                          << monitor::event("buffer")          % output_buffer_.size() % buffer_size_;
+               monitor_subject_ << monitor::message("/host/path")      % filename_
+                                               << monitor::message("/host/width")      % width_
+                                               << monitor::message("/host/height") % height_
+                                               << monitor::message("/host/fps")        % fps_
+                                               << monitor::message("/buffer")          % output_buffer_.size() % buffer_size_;
 
                return last_frame_ = frame;
        }
@@ -411,7 +411,7 @@ public:
                        {
                                if(!renderer_)
                                {
-                                       renderer_.reset(new flash_renderer(event_subject_, graph_, frame_factory_, filename_, width_, height_));
+                                       renderer_.reset(new flash_renderer(monitor_subject_, graph_, frame_factory_, filename_, width_, height_));
 
                                        while(output_buffer_.size() < buffer_size_)
                                                output_buffer_.push(core::draw_frame::empty());
@@ -446,14 +446,9 @@ public:
                return info;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
-               event_subject_.subscribe(o);
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
-       {
-               event_subject_.unsubscribe(o);
+               return monitor_subject_;
        }
 
        // flash_producer
@@ -503,7 +498,7 @@ public:
                }
 
                graph_->set_value("tick-time", static_cast<float>(tick_timer_.elapsed()/fps_)*0.5f);
-               event_subject_ << monitor::event("profiler/time") % tick_timer_.elapsed() % fps_;
+               monitor_subject_ << monitor::message("/profiler/time") % tick_timer_.elapsed() % fps_;
 
                output_buffer_.push(std::move(frame_buffer_.front()));
                frame_buffer_.pop();
index 4c76a0785aa7957b7f36b0ac3d2a336b6ea034e0..660c5505a0d21a52f158b16fb343f3963cf590bf 100644 (file)
@@ -138,13 +138,10 @@ public:
                return 100;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
+               static monitor::subject monitor_subject(""); return monitor_subject;
        }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
-       {
-       }       
 };
 
 spl::shared_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)
index 9fb259af3bed2e34ad993c73aed17e3f017807f7..b499967cb75b0c4fb940c3d5a9e1dd69e4960688 100644 (file)
@@ -74,7 +74,7 @@ std::pair<core::draw_frame, core::constraints> load_image(
 
 struct image_producer : public core::frame_producer_base
 {      
-       monitor::basic_subject  event_subject_;
+       monitor::subject                monitor_subject_;
        const std::wstring              description_;
        const spl::shared_ptr<core::frame_factory> frame_factory_;
        core::draw_frame                frame_;
@@ -116,7 +116,7 @@ struct image_producer : public core::frame_producer_base
 
        core::draw_frame receive_impl() override
        {
-               event_subject_ << monitor::event("file/path") % description_;
+               monitor_subject_ << monitor::message("/file/path") % description_;
 
                return frame_;
        }
@@ -149,14 +149,9 @@ struct image_producer : public core::frame_producer_base
                return info;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     
+       monitor::source& monitor_output() 
        {
-               return event_subject_.subscribe(o);
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override           
-       {
-               return event_subject_.unsubscribe(o);
+               return monitor_subject_;
        }
 };
 
index f75297ddf2e962b06dfdca929e21e09c385d6f3d..73121823b6917067ed0aabb891efd6266a2968b9 100644 (file)
@@ -58,7 +58,7 @@ namespace caspar { namespace image {
                
 struct image_scroll_producer : public core::frame_producer_base
 {      
-       monitor::basic_subject                  event_subject_;
+       monitor::subject                                monitor_subject_;
 
        const std::wstring                              filename_;
        std::vector<core::draw_frame>   frames_;
@@ -350,9 +350,9 @@ struct image_scroll_producer : public core::frame_producer_base
                        result = core::draw_frame::interlace(field1, field2, format_desc_.field_mode);
                }
                
-               event_subject_ << monitor::event("file/path") % filename_
-                                          << monitor::event("delta") % delta_ 
-                                          << monitor::event("speed") % speed_;
+               monitor_subject_ << monitor::message("/file/path") % filename_
+                                                << monitor::message("/delta") % delta_ 
+                                                << monitor::message("/speed") % speed_;
 
                return result;
        }
@@ -394,14 +394,9 @@ struct image_scroll_producer : public core::frame_producer_base
                }
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override                                                                                                                     
+       monitor::source& monitor_output()
        {
-               return event_subject_.subscribe(o);
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override           
-       {
-               return event_subject_.unsubscribe(o);
+               return monitor_subject_;
        }
 };
 
index a8d33915f36fe76eb576bfa3294d1019b5406e33..778685937a896075722c6106e8518a17131886be 100644 (file)
@@ -258,13 +258,10 @@ public:
                return 500;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
+               static monitor::subject monitor_subject(""); return monitor_subject;
        }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
-       {
-       }       
 };
 
 spl::shared_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)
index 40daf74ff6982749b34f3e14ca4ae64ddaac7b45..145d0b83980a096c8a45c12799b516b63179b554 100644 (file)
@@ -113,12 +113,9 @@ public:
                return info;
        }
                
-       void subscribe(const monitor::observable::observer_ptr& o) override
-       {
-       }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
+               static monitor::subject monitor_subject(""); return monitor_subject;
        }
 };
 
@@ -128,7 +125,7 @@ spl::shared_ptr<core::frame_producer> create_producer(core::video_channel& chann
        
        std::weak_ptr<reactive::observer<std::map<int, core::draw_frame>>> o = producer;
 
-       channel.stage().subscribe(o);
+       //channel.stage().monitor_output().link_target.subscribe(o);
 
        return producer;
 }
index 5a829cd6b74dbcd321a02a4cc25d5ff388b881f2..fc5a15763b176c0dbc730194af7882f2f6c93b4c 100644 (file)
@@ -614,13 +614,10 @@ public:
                return 600 + (config_.key_only ? 10 : 0) + config_.screen_index;
        }
 
-       void subscribe(const monitor::observable::observer_ptr& o) override
+       monitor::source& monitor_output()
        {
+               static monitor::subject monitor_subject(""); return monitor_subject;
        }
-
-       void unsubscribe(const monitor::observable::observer_ptr& o) override
-       {
-       }       
 };     
 
 spl::shared_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)
index 9c72fd0ba8b8a973305ce6fa73d8a8a376170526..586142896fef2e9ca745236171160a621747e4b4 100644 (file)
@@ -4,27 +4,17 @@
 
 #include "oscpack/oscOutboundPacketStream.h"
 
-#include <algorithm>
-#include <array>
-#include <string>
-#include <set>
-#include <regex>
+#include <functional>
 #include <vector>
 
-#include <boost/optional.hpp>
-#include <boost/foreach.hpp>
 #include <boost/asio.hpp>
+#include <boost/foreach.hpp>
 #include <boost/thread.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/algorithm/string/iter_find.hpp>
-#include <boost/algorithm/string/finder.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/thread/mutex.hpp>
 
 using namespace boost::asio::ip;
 
 namespace caspar { namespace protocol { namespace osc {
-       
+
 template<typename T>
 struct param_visitor : public boost::static_visitor<void>
 {
@@ -34,218 +24,97 @@ struct param_visitor : public boost::static_visitor<void>
                : o(o)
        {
        }               
-               
+
        void operator()(const bool value)                                       {o << value;}
-       void operator()(const int32_t value)                            {o << value;}
-       void operator()(const uint32_t value)                           {o << value;}
-       void operator()(const int64_t value)                            {o << value;}
-       void operator()(const uint64_t value)                           {o << value;}
+       void operator()(const int32_t value)                            {o << static_cast<int64_t>(value);}
+       void operator()(const uint32_t value)                           {o << static_cast<int64_t>(value);}
+       void operator()(const int64_t value)                            {o << static_cast<int64_t>(value);}
+       void operator()(const uint64_t value)                           {o << static_cast<int64_t>(value);}
        void operator()(const float value)                                      {o << value;}
        void operator()(const double value)                                     {o << static_cast<float>(value);}
        void operator()(const std::string& value)                       {o << value.c_str();}
-       void operator()(const std::wstring& value)                      {o << u8(value).c_str();}
+       void operator()(const std::wstring& value)                      {o << std::string(value.begin(), value.end()).c_str();}
        void operator()(const std::vector<int8_t>& value)       {o << ::osc::Blob(value.data(), static_cast<unsigned long>(value.size()));}
-       void operator()(const monitor::duration& value)
-       {
-               o << boost::chrono::duration_cast<boost::chrono::duration<double, boost::ratio<1, 1>>>(value).count();
-       }
 };
 
-std::vector<char> write_osc_event(const monitor::event& e)
+std::vector<char> write_osc_event(const monitor::message& e)
 {
        std::array<char, 4096> buffer;
        ::osc::OutboundPacketStream o(buffer.data(), static_cast<unsigned long>(buffer.size()));
 
-       o       << ::osc::BeginMessage(e.path().str().c_str());
-                               
+       o       << ::osc::BeginMessage(e.path().c_str());
+
        param_visitor<decltype(o)> pd_visitor(o);
-       BOOST_FOREACH(auto param, e.params())
-               boost::apply_visitor(pd_visitor, param);
-                               
+       BOOST_FOREACH(auto data, e.data())
+               boost::apply_visitor(pd_visitor, data);
+
        o       << ::osc::EndMessage;
-               
+
        return std::vector<char>(o.Data(), o.Data() + o.Size());
 }
 
-class connection;
-
-typedef std::set<spl::shared_ptr<connection>> connection_set;
+struct server::impl
+{
+       boost::asio::io_service                                         service_;
 
-class connection : public spl::enable_shared_from_this<connection>
-{    
-    const spl::shared_ptr<tcp::socket>         socket_; 
-       const spl::shared_ptr<connection_set>   connection_set_;
+       udp::endpoint                                                           endpoint_;
+       udp::socket                                                                     socket_;        
 
-       boost::optional<std::regex>                             regex_;
-       std::array<char, 32768>                                 data_;
-       std::string                                                             input_;
+       boost::thread                                                           thread_;
 
-public:
-    static spl::shared_ptr<connection> create(spl::shared_ptr<tcp::socket> socket, spl::shared_ptr<connection_set> connection_set)
-       {
-               auto con = spl::shared_ptr<connection>(new connection(std::move(socket), std::move(connection_set)));
-               con->read_some();
-               return con;
-    }
-       
-       void stop()
-       {
-               connection_set_->erase(shared_from_this());
-               try
-               {
-                       socket_->close();
-               }
-               catch(...)
-               {
-                       CASPAR_LOG_CURRENT_EXCEPTION();
-               }
-               CASPAR_LOG(info) << print() << L" Disconnected.";
-       }
-               
-       std::wstring print() const
-       {
-               return L"osc[" + (socket_->is_open() ? u16(socket_->local_endpoint().address().to_string() + ":" + boost::lexical_cast<std::string>(socket_->local_endpoint().port())) : L"no-address") + L"]";
-       }
-               
-       void on_next(const monitor::event& e)
-       {       
-               if(regex_ && std::regex_search(e.path().str(), *regex_))
-                       return; 
-
-               auto data_ptr = spl::make_shared<std::vector<char>>(write_osc_event(e));
-               int32_t size = static_cast<int32_t>(data_ptr->size());
-               char* size_ptr = reinterpret_cast<char*>(&size);
-
-               data_ptr->insert(data_ptr->begin(), size_ptr, size_ptr + sizeof(int32_t));
-               socket_->async_write_some(boost::asio::buffer(*data_ptr), std::bind(&connection::handle_write, shared_from_this(), data_ptr, std::placeholders::_1, std::placeholders::_2));    
-       }
-       
-private:
-    connection(spl::shared_ptr<tcp::socket> socket, spl::shared_ptr<connection_set> connection_set) 
-               : socket_(std::move(socket))
-               , connection_set_(std::move(connection_set))
-       {
-               CASPAR_LOG(info) << print() << L" Connected.";
-    }
-                                       
-    void handle_read(const boost::system::error_code& error, size_t bytes_transferred) 
-       {               
-               if(!error)
-               {
-                       try
-                       {
-                               on_read(std::string(data_.begin(), data_.begin() + bytes_transferred));
-                       }
-                       catch(...)
-                       {
-                               CASPAR_LOG_CURRENT_EXCEPTION();
-                       }
-                       
-                       read_some();
-               }  
-               else if (error != boost::asio::error::operation_aborted)                
-                       stop();         
-    }
-
-    void handle_write(const spl::shared_ptr<std::vector<char>>& data, const boost::system::error_code& error, size_t bytes_transferred)
-       {
-               if(!error)                      
-               {
-               }
-               else if (error != boost::asio::error::operation_aborted)
-                       stop();         
-    }
-
-       void read_some()
-       {
-               socket_->async_read_some(boost::asio::buffer(data_.data(), data_.size()), std::bind(&connection::handle_read, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
-       }
-               
-       void on_read(std::string str)
-       {
-               input_ += str;
-
-               std::vector<std::string> split;
-               boost::iter_split(split, input_, boost::algorithm::first_finder("\r\n"));
-               
-               input_ = split.back();
-               split.pop_back();       
-               
-               if(split.empty())
-                       return;
-
-               if(split.back() == ".*")
-                       regex_.reset();
-               else
-                       regex_ = std::regex(split.back());
-       }
-};
+       Concurrency::call<monitor::message>     on_next_;
 
-class tcp_observer : public reactive::observer<monitor::event>
-{
-       boost::asio::io_service                 service_;
-       tcp::acceptor                                   acceptor_;
-       spl::shared_ptr<connection_set> connection_set_;
-       boost::thread                                   thread_;
-       
 public:
-       tcp_observer(unsigned short port)
-               : acceptor_(service_, tcp::endpoint(tcp::v4(), port))
+       impl(udp::endpoint endpoint, 
+                Concurrency::ISource<monitor::message>& source)
+               : endpoint_(endpoint)
+               , socket_(service_, endpoint_.protocol())
                , thread_(std::bind(&boost::asio::io_service::run, &service_))
+               , on_next_([this](const monitor::message& msg){ on_next(msg); })
        {
-               start_accept(); 
+               source.link_target(&on_next_);
        }
 
-       ~tcp_observer()
+       ~impl()
        {               
-               try
-               {
-                       acceptor_.close();
-               }
-               catch(...)
-               {
-                       CASPAR_LOG_CURRENT_EXCEPTION();
-               }
-
-               service_.post([=]
-               {
-                       auto connections = *connection_set_;
-                       BOOST_FOREACH(auto& connection, connections)
-                               connection->stop();                             
-               });
-
                thread_.join();
        }
-       
-       void on_next(const monitor::event& e) override
+
+       void on_next(const monitor::message& msg)
        {
-               service_.post([=]
-               {                       
-                       BOOST_FOREACH(auto& connection, *connection_set_)
-                               connection->on_next(e);
-               });             
+               auto data_ptr = spl::make_shared<std::vector<char>>(write_osc_event(msg));
+               if(data_ptr->size() >0)
+                       socket_.async_send_to(boost::asio::buffer(*data_ptr), 
+                                                         endpoint_,
+                                                         boost::bind(&impl::handle_send_to, this, data_ptr,    //data_ptr need to stay alive
+                                                         boost::asio::placeholders::error,
+                                                         boost::asio::placeholders::bytes_transferred));               
        }       
-private:               
-    void start_accept() 
-       {
-               auto socket = spl::make_shared<tcp::socket>(service_);
-               acceptor_.async_accept(*socket, std::bind(&tcp_observer::handle_accept, this, socket, std::placeholders::_1));
-    }
 
-       void handle_accept(const spl::shared_ptr<tcp::socket>& socket, const boost::system::error_code& error) 
+       void handle_send_to(spl::shared_ptr<std::vector<char>> data, const boost::system::error_code& /*error*/, size_t /*bytes_sent*/)
        {
-               if (!acceptor_.is_open())
-                       return;
-
-        if (!error)            
-                       connection_set_->insert(connection::create(socket, connection_set_));
-        
-               start_accept();
-    }
+       }
 };
 
-server::server(unsigned short port) 
-       : impl_(new tcp_observer(port)){}
-void server::on_next(const monitor::event& e){impl_->on_next(e);}
+server::server(udp::endpoint endpoint, 
+                          Concurrency::ISource<monitor::message>& source) 
+       : impl_(new impl(endpoint, source))
+{
+}
+
+server::server(server&& other)
+       : impl_(std::move(other.impl_))
+{
+}
+
+server& server::operator=(server&& other)
+{
+       impl_ = std::move(other.impl_);
+       return *this;
+}
+
+server::~server()
+{
+}
 
 }}}
\ No newline at end of file
index eec198b217c8230901b6a8a0a9a8a3020d3f7063..8a648b7a382fa6af2ba7510184251563363227fb 100644 (file)
@@ -3,19 +3,36 @@
 #include <common/memory.h>
 
 #include <core/monitor/monitor.h>
-
-#include <functional>
+#include <boost/asio/ip/udp.hpp>
 
 namespace caspar { namespace protocol { namespace osc {
 
-class server : public reactive::observer<monitor::event>
+class server
 {
+       server(const server&);
+       server& operator=(const server&);
 public:        
-       server(unsigned short port);
-       
-       void on_next(const monitor::event& e) override;
+
+       // Static Members
+
+       // Constructors
+
+       server(boost::asio::ip::udp::endpoint endpoint, 
+                  Concurrency::ISource<monitor::message>& source);
+
+       server(server&&);
+
+       ~server();
+
+       // Methods
+
+       server& operator=(server&&);
+
+       // Properties
+
 private:
-       spl::shared_ptr<observer<monitor::event>> impl_;
+       struct impl;
+       std::unique_ptr<impl> impl_;
 };
 
 }}}
\ No newline at end of file
index 4f47df501c7f393b094a4421fbcef14b7055a5e5..5f5207fe06d692fee9ddef513ccbc37bdb857d82 100644 (file)
       <port>5250</port>\r
       <protocol>AMCP</protocol>\r
     </tcp>\r
+    <udp>\r
+      <address>127.0.0.1</address>\r
+      <port>6250</port>\r
+      <protocol>OSC</protocol>\r
+    </udp>\r
   </controllers>\r
 </configuration>\r
 \r
index fc86da8c0ec2c2ee2d820750d99cdf97bd322aae..2d462a463cafacda19c02249c8e08b9e57ae807a 100644 (file)
@@ -44,7 +44,6 @@
 
 #include <protocol/util/strategy_adapters.h>
 #include <protocol/amcp/AMCPProtocolStrategy.h>
-#include <protocol/osc/server.h>
 
 #include <modules/bluefish/bluefish.h>
 #include <modules/decklink/decklink.h>
@@ -66,6 +65,7 @@
 #include <boost/property_tree/xml_parser.hpp>
 #include <boost/foreach.hpp>
 #include <boost/locale.hpp>
+#include <boost/lexical_cast.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/thread.hpp>
 #include <boost/thread/future.hpp>
@@ -288,10 +288,7 @@ bool run()
 
        // Create server object which initializes channels, protocols and controllers.
        server caspar_server(shutdown_server_now);
-                               
-       auto server = spl::make_shared<protocol::osc::server>(5253);
-       caspar_server.subscribe(server);
-                                               
+       
        //auto console_obs = reactive::make_observer([](const monitor::event& e)
        //{
        //      std::stringstream str;
index b569bf555e19f5d554d1209e0d21df19352b7797..f40e53f1103294d0e99b012b30698bf6093e3152 100644 (file)
@@ -61,6 +61,7 @@
 #include <protocol/CLK/CLKProtocolStrategy.h>
 #include <protocol/util/AsyncEventServer.h>
 #include <protocol/util/strategy_adapters.h>
+#include <protocol/osc/server.h>
 
 #include <boost/algorithm/string.hpp>
 #include <boost/thread.hpp>
@@ -76,9 +77,10 @@ using namespace protocol;
 
 struct server::impl : boost::noncopyable
 {
-       monitor::basic_subject                                                          event_subject_;
+       monitor::subject                                                                        monitor_subject_;
        accelerator::accelerator                                                        accelerator_;
-       std::vector<spl::shared_ptr<IO::AsyncEventServer>>      async_servers_; 
+       std::vector<spl::shared_ptr<IO::AsyncEventServer>>      async_servers_;
+       std::vector<osc::server>                                                        osc_servers_;
        std::vector<spl::shared_ptr<video_channel>>                     channels_;
        std::shared_ptr<thumbnail_generator>                            thumbnail_generator_;
        boost::promise<bool>&                                                           shutdown_server_now_;
@@ -173,7 +175,7 @@ struct server::impl : boost::noncopyable
                                }
                        }               
 
-                   channel->subscribe(monitor::observable::observer_ptr(event_subject_));
+                   channel->monitor_output().link_target(&monitor_subject_);
                        channels_.push_back(channel);
                }
 
@@ -226,6 +228,13 @@ struct server::impl : boost::noncopyable
                                                                                                                                                                        { CASPAR_LOG(info) << "Client disconnect (lifecycle)"; }));
                                                                                                                                                                });
                                }
+                               else if(name == L"udp")
+                               {
+                                       const auto address = xml_controller.second.get(L"address", L"127.0.0.1");
+                                       const auto port = xml_controller.second.get<unsigned short>(L"port", 6250);
+
+                                       osc_servers_.push_back(osc::server(boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4::from_string(std::string(address.begin(), address.end())), port), monitor_subject_));
+                               }
                                else
                                        CASPAR_LOG(warning) << "Invalid controller: " << name;  
                        }
@@ -261,7 +270,6 @@ const std::vector<spl::shared_ptr<video_channel>> server::channels() const
        return impl_->channels_;
 }
 std::shared_ptr<core::thumbnail_generator> server::get_thumbnail_generator() const {return impl_->thumbnail_generator_; }
-void server::subscribe(const monitor::observable::observer_ptr& o){impl_->event_subject_.subscribe(o);}
-void server::unsubscribe(const monitor::observable::observer_ptr& o){impl_->event_subject_.unsubscribe(o);}
+monitor::source& server::monitor_output() { return impl_->monitor_subject_; }
 
 }
\ No newline at end of file
index 9c701f8102c101c9baf98104b3df996584cbf6dc..0ae69e5b05ed4d74b5126047a3cba89c201bf52a 100644 (file)
@@ -37,17 +37,14 @@ namespace core {
        class thumbnail_generator;
 }
 
-class server sealed : public monitor::observable
-                                       , boost::noncopyable
+class server sealed : public boost::noncopyable
 {
 public:
        explicit server(boost::promise<bool>& shutdown_server_now);
        const std::vector<spl::shared_ptr<core::video_channel>> channels() const;
        std::shared_ptr<core::thumbnail_generator> get_thumbnail_generator() const;
-       // monitor::observable
 
-       void subscribe(const monitor::observable::observer_ptr& o) override;
-       void unsubscribe(const monitor::observable::observer_ptr& o) override;
+       monitor::source& monitor_output();
 private:
        struct impl;
        spl::shared_ptr<impl> impl_;