From: Helge Norberg Date: Mon, 25 Apr 2016 15:18:14 +0000 (+0200) Subject: #430 Fixed bug where it was assumed that all Decklink devices implements the IDeckLin... X-Git-Tag: 2.1.0_Beta1~84 X-Git-Url: https://git.sesse.net/?p=casparcg;a=commitdiff_plain;h=e54e9fb019a185d9516b99d33d4c8aa8e44ccd7e #430 Fixed bug where it was assumed that all Decklink devices implements the IDeckLinkKeyer interface. Affected models are for example Decklink Mini Monitor and Decklink Duo/Quad 2 (when a device is configured to only use one connector). --- diff --git a/modules/decklink/consumer/decklink_consumer.cpp b/modules/decklink/consumer/decklink_consumer.cpp index 8766eca65..c16e6ee2f 100644 --- a/modules/decklink/consumer/decklink_consumer.cpp +++ b/modules/decklink/consumer/decklink_consumer.cpp @@ -289,7 +289,7 @@ struct key_video_context : public IDeckLinkVideoOutputCallback, boost::noncopyab const configuration config_; com_ptr decklink_ = get_device(config_.key_device_index()); com_iface_ptr output_ = iface_cast(decklink_); - com_iface_ptr keyer_ = iface_cast(decklink_); + com_iface_ptr keyer_ = iface_cast(decklink_, true); com_iface_ptr attributes_ = iface_cast(decklink_); com_iface_ptr configuration_ = iface_cast(decklink_); tbb::atomic current_presentation_delay_; @@ -363,7 +363,7 @@ struct decklink_consumer : public IDeckLinkVideoOutputCallback, public IDeckLink com_ptr decklink_ = get_device(config_.device_index); com_iface_ptr output_ = iface_cast(decklink_); com_iface_ptr configuration_ = iface_cast(decklink_); - com_iface_ptr keyer_ = iface_cast(decklink_); + com_iface_ptr keyer_ = iface_cast(decklink_, true); com_iface_ptr attributes_ = iface_cast(decklink_); tbb::spin_mutex exception_mutex_; diff --git a/modules/decklink/decklink_api.h b/modules/decklink/decklink_api.h index 8c48e76b4..10561e3e2 100644 --- a/modules/decklink/decklink_api.h +++ b/modules/decklink/decklink_api.h @@ -86,11 +86,11 @@ static com_ptr create_iterator() } template -static com_iface_ptr iface_cast(const com_ptr& ptr) +static com_iface_ptr iface_cast(const com_ptr& ptr, bool optional = false) { com_iface_ptr result = ptr; - if (!result) + if (!optional && !result) CASPAR_THROW_EXCEPTION(not_supported() << msg_info(std::string("Could not cast from ") + typeid(T).name() + " to " + typeid(I).name() + ". This is probably due to old Decklink drivers.")); return result; @@ -177,7 +177,7 @@ template<> REFIID iface_id() { return IID_IDec template<> REFIID iface_id() { return IID_IDeckLinkInput; } template -static com_iface_ptr iface_cast(com_ptr ptr) +static com_iface_ptr iface_cast(com_ptr ptr, bool optional = false) { I* iface; ptr->QueryInterface(iface_id(), reinterpret_cast(&iface));