CASPAR_LOG(info) << print() << L" Shutting down."; \r
}\r
\r
- void initialize(const video_format_desc& format_desc)\r
+ void initialize(const video_format_desc& format_desc, const printer& parent_printer)\r
{\r
blue_initialize();\r
\r
format_desc_ = format_desc;\r
+ parent_printer_ = parent_printer;\r
\r
blue_.reset(BlueVelvetFactory4());\r
\r
\r
CASPAR_LOG(info) << print() << TEXT(" Successfully initialized for ") << format_desc_ << TEXT(".");\r
}\r
-\r
- void set_parent_printer(const printer& parent_printer)\r
- {\r
- parent_printer_ = parent_printer;\r
- }\r
- \r
+ \r
void enable_video_output()\r
{\r
if(!BLUE_PASS(set_card_property(blue_, VIDEO_BLACKGENERATOR, 0)))\r
\r
bluefish_consumer::bluefish_consumer(bluefish_consumer&& other) : impl_(std::move(other.impl_)){}\r
bluefish_consumer::bluefish_consumer(unsigned int device_index, bool embed_audio) : impl_(new implementation(device_index, embed_audio)){} \r
-void bluefish_consumer::initialize(const video_format_desc& format_desc){impl_->initialize(format_desc);}\r
-void bluefish_consumer::set_parent_printer(const printer& parent_printer){impl_->set_parent_printer(parent_printer);}\r
+void bluefish_consumer::initialize(const video_format_desc& format_desc, const printer& parent_printer){impl_->initialize(format_desc, parent_printer);}\r
void bluefish_consumer::send(const safe_ptr<const read_frame>& frame){impl_->send(frame);}\r
size_t bluefish_consumer::buffer_depth() const{return impl_->buffer_depth();}\r
std::wstring bluefish_consumer::print() const {return impl_->print();} \r
explicit bluefish_consumer(unsigned int device_index, bool embed_audio = false);\r
bluefish_consumer(bluefish_consumer&& other);\r
\r
- virtual void initialize(const video_format_desc& format_desc);\r
- virtual void set_parent_printer(const printer& parent_printer);\r
+ virtual void initialize(const video_format_desc& format_desc, const printer& parent_printer);\r
virtual void send(const safe_ptr<const read_frame>&);\r
virtual size_t buffer_depth() const;\r
virtual std::wstring print() const;\r
tbb::concurrent_bounded_queue<safe_ptr<const read_frame>> audio_frame_buffer_;\r
\r
public:\r
- decklink_output(const printer& parent_printer, size_t device_index, bool embed_audio, bool internalKey) \r
+ decklink_output(const video_format_desc& format_desc, const printer& parent_printer, size_t device_index, bool embed_audio, bool internalKey) \r
: parent_printer_(parent_printer)\r
, model_name_(L"DECKLINK")\r
, device_index_(device_index)\r
, internal_key(internalKey)\r
, frames_scheduled_(0)\r
, audio_scheduled_(0)\r
- {}\r
-\r
- ~decklink_output()\r
- { \r
- if(output_ != nullptr) \r
- {\r
- output_->StopScheduledPlayback(0, nullptr, 0);\r
- if(embed_audio_)\r
- output_->DisableAudioOutput();\r
- output_->DisableVideoOutput();\r
- }\r
- CASPAR_LOG(info) << print() << L" Shutting down."; \r
- }\r
-\r
- void initialize(const video_format_desc& format_desc)\r
+ , format_desc_(format_desc)\r
{\r
format_desc_ = format_desc;\r
CComPtr<IDeckLinkIterator> pDecklinkIterator;\r
\r
CASPAR_LOG(info) << print() << L" Successfully initialized for " << format_desc_.name; \r
}\r
- \r
+\r
+ ~decklink_output()\r
+ { \r
+ if(output_ != nullptr) \r
+ {\r
+ output_->StopScheduledPlayback(0, nullptr, 0);\r
+ if(embed_audio_)\r
+ output_->DisableAudioOutput();\r
+ output_->DisableVideoOutput();\r
+ }\r
+ CASPAR_LOG(info) << print() << L" Shutting down."; \r
+ }\r
+ \r
virtual HRESULT STDMETHODCALLTYPE QueryInterface (REFIID, LPVOID*) {return E_NOINTERFACE;}\r
virtual ULONG STDMETHODCALLTYPE AddRef () {return 1;}\r
virtual ULONG STDMETHODCALLTYPE Release () {return 1;}\r
\r
struct decklink_consumer::implementation\r
{\r
- printer parent_printer_;\r
std::unique_ptr<decklink_output> input_;\r
+ size_t device_index_;\r
+ bool embed_audio_;\r
+ bool internal_key_;\r
\r
executor executor_;\r
public:\r
\r
- implementation(size_t device_index, bool embed_audio, bool internalKey)\r
- : executor_(L"DECKLINK[" + boost::lexical_cast<std::wstring>(device_index) + L"]")\r
+ implementation(size_t device_index, bool embed_audio, bool internal_key)\r
+ : device_index_(device_index)\r
+ , embed_audio_(embed_audio)\r
+ , internal_key_(internal_key)\r
+ , executor_(L"DECKLINK[" + boost::lexical_cast<std::wstring>(device_index) + L"]")\r
{\r
executor_.start();\r
- executor_.invoke([&]\r
- {\r
- input_.reset(new decklink_output(parent_printer_, device_index, embed_audio, internalKey));\r
- });\r
}\r
\r
~implementation()\r
});\r
}\r
\r
- void initialize(const video_format_desc& format_desc)\r
+ void initialize(const video_format_desc& format_desc, const printer& parent_printer)\r
{\r
executor_.invoke([&]\r
{\r
- input_->initialize(format_desc);\r
+ input_.reset(new decklink_output(format_desc, parent_printer, device_index_, embed_audio_, internal_key_));\r
});\r
}\r
-\r
- void set_parent_printer(const printer& parent_printer)\r
- {\r
- parent_printer_ = parent_printer;\r
- }\r
-\r
+ \r
void send(const safe_ptr<const read_frame>& frame)\r
{\r
input_->send(frame);\r
\r
decklink_consumer::decklink_consumer(size_t device_index, bool embed_audio, bool internalKey) : impl_(new implementation(device_index, embed_audio, internalKey)){}\r
decklink_consumer::decklink_consumer(decklink_consumer&& other) : impl_(std::move(other.impl_)){}\r
-void decklink_consumer::initialize(const video_format_desc& format_desc){impl_->initialize(format_desc);}\r
-void decklink_consumer::set_parent_printer(const printer& parent_printer){impl_->set_parent_printer(parent_printer);}\r
+void decklink_consumer::initialize(const video_format_desc& format_desc, const printer& parent_printer){impl_->initialize(format_desc, parent_printer);}\r
void decklink_consumer::send(const safe_ptr<const read_frame>& frame){impl_->send(frame);}\r
size_t decklink_consumer::buffer_depth() const{return impl_->buffer_depth();}\r
std::wstring decklink_consumer::print() const{return impl_->print();}\r
explicit decklink_consumer(size_t device_index, bool embed_audio = false, bool internal_key = false);\r
decklink_consumer(decklink_consumer&& other);\r
\r
- virtual void initialize(const video_format_desc& format_desc);\r
- virtual void set_parent_printer(const printer& parent_printer);\r
+ virtual void initialize(const video_format_desc& format_desc, const printer& parent_printer);\r
virtual void send(const safe_ptr<const read_frame>&);\r
virtual size_t buffer_depth() const;\r
virtual std::wstring print() const;\r
url_fclose(oc_->pb); // Close the output ffmpeg.\r
}\r
\r
- void initialize(const video_format_desc& format_desc)\r
+ void initialize(const video_format_desc& format_desc, const printer& parent_printer)\r
{\r
format_desc_ = format_desc;\r
+ parent_printer_ = parent_printer;\r
executor_.start();\r
active_ = executor_.begin_invoke([]{});\r
\r
CASPAR_LOG(info) << print() << L" Successfully initialized.";\r
}\r
\r
- void set_parent_printer(const printer& parent_printer) \r
- {\r
- parent_printer_ = parent_printer;\r
- }\r
-\r
std::wstring print() const\r
{\r
return (parent_printer_ ? parent_printer_() + L"/" : L"") + L"ffmpeg[" + widen(filename_) + L"]";\r
ffmpeg_consumer::ffmpeg_consumer(ffmpeg_consumer&& other) : impl_(std::move(other.impl_)){}\r
void ffmpeg_consumer::send(const safe_ptr<const read_frame>& frame){impl_->send(frame);}\r
size_t ffmpeg_consumer::buffer_depth() const{return impl_->buffer_depth();}\r
-void ffmpeg_consumer::initialize(const video_format_desc& format_desc) {impl_->initialize(format_desc);}\r
-void ffmpeg_consumer::set_parent_printer(const printer& parent_printer){impl_->set_parent_printer(parent_printer);}\r
+void ffmpeg_consumer::initialize(const video_format_desc& format_desc, const printer& parent_printer) {impl_->initialize(format_desc, parent_printer);}\r
std::wstring ffmpeg_consumer::print() const {return impl_->print();}\r
\r
safe_ptr<frame_consumer> create_ffmpeg_consumer(const std::vector<std::wstring>& params)\r
explicit ffmpeg_consumer(const std::wstring& filename);\r
ffmpeg_consumer(ffmpeg_consumer&& other);\r
\r
- virtual void initialize(const video_format_desc& format_desc);\r
- virtual void set_parent_printer(const printer& parent_printer);\r
+ virtual void initialize(const video_format_desc& format_desc, const printer& parent_printer);\r
virtual void send(const safe_ptr<const read_frame>&);\r
virtual size_t buffer_depth() const;\r
virtual std::wstring print() const;\r
\r
virtual void send(const safe_ptr<const read_frame>& frame) = 0;\r
virtual size_t buffer_depth() const = 0;\r
- virtual void initialize(const video_format_desc& format_desc) = 0;\r
- virtual void set_parent_printer(const printer& parent_printer) = 0;\r
+ virtual void initialize(const video_format_desc& format_desc, const printer& parent_printer = nullptr) = 0;\r
virtual std::wstring print() const = 0;\r
\r
static const safe_ptr<frame_consumer>& empty()\r
{\r
virtual void send(const safe_ptr<const read_frame>&){}\r
virtual size_t buffer_depth() const{return 0;}\r
- virtual void initialize(const video_format_desc&){}\r
- virtual void set_parent_printer(const printer&){}\r
+ virtual void initialize(const video_format_desc&, const printer&){}\r
virtual std::wstring print() const {return L"empty";}\r
};\r
static safe_ptr<frame_consumer> consumer = make_safe<empty_frame_consumer>();\r
\r
void add(int index, safe_ptr<frame_consumer>&& consumer)\r
{ \r
- consumer->set_parent_printer(std::bind(&implementation::print, this));\r
- consumer->initialize(format_desc_);\r
+ consumer->initialize(format_desc_, std::bind(&implementation::print, this));\r
executor_.invoke([&]\r
{\r
if(buffer_.capacity() < consumer->buffer_depth())\r
CASPAR_LOG(info) << print() << L" Shutting down."; \r
}\r
\r
- void initialize(const video_format_desc& format_desc)\r
+ void initialize(const video_format_desc& format_desc, const printer& parent_printer)\r
{\r
format_desc_ = format_desc;\r
+ parent_printer_ = parent_printer;\r
for(size_t n = 0; n < buffer_depth(); ++n)\r
input_.push(std::vector<short>(static_cast<size_t>(48000.0f/format_desc_.fps)*2, 0)); \r
sf::SoundStream::Initialize(2, 48000);\r
CASPAR_LOG(info) << print() << " Sucessfully initialized.";\r
}\r
\r
- void set_parent_printer(const printer& parent_printer)\r
- {\r
- parent_printer_ = parent_printer;\r
- }\r
- \r
void send(const safe_ptr<const read_frame>& frame)\r
{ \r
if(!frame->audio_data().empty())\r
oal_consumer::oal_consumer() : impl_(new implementation()){}\r
void oal_consumer::send(const safe_ptr<const read_frame>& frame){impl_->send(frame);}\r
size_t oal_consumer::buffer_depth() const{return impl_->buffer_depth();}\r
-void oal_consumer::initialize(const video_format_desc& format_desc){impl_->initialize(format_desc);}\r
-void oal_consumer::set_parent_printer(const printer& parent_printer){impl_->set_parent_printer(parent_printer);}\r
+void oal_consumer::initialize(const video_format_desc& format_desc, const printer& parent_printer){impl_->initialize(format_desc, parent_printer);}\r
std::wstring oal_consumer::print() const { return impl_->print(); }\r
\r
safe_ptr<frame_consumer> create_oal_consumer(const std::vector<std::wstring>& params)\r
explicit oal_consumer();\r
oal_consumer(oal_consumer&& other);\r
\r
- virtual void initialize(const video_format_desc& format_desc); \r
- virtual void set_parent_printer(const printer& parent_printer);\r
+ virtual void initialize(const video_format_desc& format_desc, const printer& parent_printer); \r
\r
virtual void send(const safe_ptr<const read_frame>&);\r
virtual size_t buffer_depth() const;\r
CASPAR_LOG(info) << print() << L" Shutting down."; \r
}\r
\r
- void initialize(const video_format_desc& format_desc)\r
+ void initialize(const video_format_desc& format_desc, const printer& parent_printer)\r
{\r
if(!GLEE_VERSION_2_1)\r
BOOST_THROW_EXCEPTION(not_supported() << msg_info("Missing OpenGL 2.1 support."));\r
-\r
+ \r
format_desc_ = format_desc;\r
+ parent_printer_ = parent_printer;\r
\r
screen_width_ = format_desc.width;\r
screen_height_ = format_desc.height;\r
active_ = executor_.begin_invoke([]{});\r
CASPAR_LOG(info) << print() << " Sucessfully initialized.";\r
}\r
-\r
- void set_parent_printer(const printer& parent_printer)\r
- {\r
- parent_printer_ = parent_printer;\r
- }\r
- \r
+ \r
std::pair<float, float> None()\r
{\r
float width = static_cast<float>(format_desc_.width)/static_cast<float>(screen_width_);\r
ogl_consumer::ogl_consumer(unsigned int screen_index, stretch stretch, bool windowed) : impl_(new implementation(screen_index, stretch, windowed)){}\r
void ogl_consumer::send(const safe_ptr<const read_frame>& frame){impl_->send(frame);}\r
size_t ogl_consumer::buffer_depth() const{return impl_->buffer_depth();}\r
-void ogl_consumer::initialize(const video_format_desc& format_desc){impl_->initialize(format_desc);}\r
-void ogl_consumer::set_parent_printer(const printer& parent_printer){impl_->set_parent_printer(parent_printer);}\r
+void ogl_consumer::initialize(const video_format_desc& format_desc, const printer& parent_printer){impl_->initialize(format_desc, parent_printer);}\r
std::wstring ogl_consumer::print() const {return impl_->print();}\r
\r
safe_ptr<frame_consumer> create_ogl_consumer(const std::vector<std::wstring>& params)\r
explicit ogl_consumer(unsigned int screen_index = 0, stretch stretch = stretch::fill, bool windowed = false);\r
ogl_consumer(ogl_consumer&& other);\r
\r
- virtual void initialize(const video_format_desc& format_desc);\r
- virtual void set_parent_printer(const printer& parent_printer);\r
+ virtual void initialize(const video_format_desc& format_desc, const printer& parent_printer);\r
virtual void send(const safe_ptr<const read_frame>&);\r
virtual size_t buffer_depth() const;\r
virtual std::wstring print() const;\r
<windowed>true</windowed>\r
</ogl>\r
<audio/>\r
- <!--decklink>\r
+ <decklink>\r
<device>1</device>\r
<embedded-audio>true</embedded-audio>\r
<internal-key>false</internal-key>\r
- </decklink-->\r
+ </decklink>\r
<!--<bluefish>\r
<device>1</device>\r
<embedded-audio>true</embedded-audio>\r