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
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
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.
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)
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;
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&);
// 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
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_;
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")
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);
}
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
namespace caspar { namespace core {
-class output sealed : public monitor::observable
+class output sealed
{
output(const output&);
output& operator=(const output&);
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
#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)
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
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();}
namespace caspar { namespace core {
-class port : public monitor::observable
+class port
{
port(const port&);
port& operator=(const port&);
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
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
#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
class color_producer : public frame_producer_base
{
- monitor::basic_subject event_subject_;
+ monitor::subject monitor_subject_;
const std::wstring color_str_;
constraints constraints_;
draw_frame receive_impl() override
{
- event_subject_ << monitor::event("color") % color_str_;
+ monitor_subject_ << monitor::message("color") % color_str_;
return frame_;
}
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)
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;
}
};
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());}
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();}
};
// 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&);
// 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 { }
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()
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;
{
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();
}
void stop()
{
- foreground_->unsubscribe(foreground_event_subject_);
-
- foreground_ = std::move(frame_producer::empty());
+ set_foreground(frame_producer::empty());
auto_play_delta_.reset();
}
}
}
- 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;
}
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
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&);
// 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
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;
}
};
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()
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:
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;
}
};
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)
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(
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_;
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())
{
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
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)
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_;
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")
{
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;
}
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;
}
{
return executor_.begin_invoke([=]
{
- layers_[index].pause();
+ get_layer(index).pause();
}, task_priority::high_priority);
}
{
return executor_.begin_invoke([=]
{
- layers_[index].play();
+ get_layer(index).play();
}, task_priority::high_priority);
}
{
return executor_.begin_invoke([=]
{
- layers_[index].stop();
+ get_layer(index).stop();
}, task_priority::high_priority);
}
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([=]
{
return executor_.begin_invoke([=]
{
- std::swap(layers_[index], layers_[other_index]);
+ std::swap(get_layer(index), get_layer(other_index));
}, task_priority::high_priority);
}
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([=]
{
return executor_.begin_invoke([=]
{
- return layers_[index].foreground();
+ return get_layer(index).foreground();
}, task_priority::high_priority);
}
{
return executor_.begin_invoke([=]
{
- return layers_[index].background();
+ return get_layer(index).background();
}, task_priority::high_priority);
}
{
return executor_.begin_invoke([=]
{
- return layers_[index].info();
+ return get_layer(index).info();
}, task_priority::high_priority);
}
{
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));
}
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); }
}}
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&);
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
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(); }
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();
class transition_producer : public frame_producer_base
{
- monitor::basic_subject event_subject_;
+ monitor::subject monitor_subject_;
const field_mode mode_;
int current_frame_;
, source_producer_(frame_producer::empty())
, paused_(false)
{
- dest->subscribe(event_subject_);
+ dest->monitor_output().link_target(&monitor_subject_);
CASPAR_LOG(info) << print() << L" Initialized";
}
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())
{
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
struct video_channel::impl sealed
{
- monitor::basic_subject event_subject_;
+ monitor::subject monitor_subject_;
const int index_;
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)
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();});
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(...)
{
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
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&);
// 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
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)
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)
+++ /dev/null
-/* -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
+++ /dev/null
-/* -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
+++ /dev/null
-/* -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 */
-
+++ /dev/null
-/* -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;
-};
-
+++ /dev/null
-/* -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);
-};
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_;
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
}
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(...)
{
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_;
}
};
});
}
- 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
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_;
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)
{
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;
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)
{
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_;
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;
}
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
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);
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;
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_;
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());
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();
}
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;
}
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
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_;
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;
}
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
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);
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;
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)
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
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;
}
} com_init_;
- monitor::basic_subject& event_subject_;
+ monitor::subject& monitor_subject_;
const std::wstring filename_;
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)
graph_->set_tag("sync");
graph_->set_value("sync", sync);
- event_subject_ << monitor::event("sync") % sync;
+ monitor_subject_ << monitor::message("/sync") % sync;
ax_->Tick();
}
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_;
}
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_;
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;
}
{
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());
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
}
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();
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)
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_;
core::draw_frame receive_impl() override
{
- event_subject_ << monitor::event("file/path") % description_;
+ monitor_subject_ << monitor::message("/file/path") % description_;
return frame_;
}
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_;
}
};
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_;
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;
}
}
}
- 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_;
}
};
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)
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;
}
};
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;
}
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)
#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>
{
: 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
#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
<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
#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>
#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>
// 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;
#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>
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_;
}
}
- channel->subscribe(monitor::observable::observer_ptr(event_subject_));
+ channel->monitor_output().link_target(&monitor_subject_);
channels_.push_back(channel);
}
{ 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;
}
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
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_;