From 5606555ae5e96996318de22395c387583b6ee517 Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Tue, 12 Apr 2011 16:26:00 -0700 Subject: [PATCH] Fix decklink consumer on devices without keyer. --- src/modules/decklink/consumer_decklink.cpp | 28 +++++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/modules/decklink/consumer_decklink.cpp b/src/modules/decklink/consumer_decklink.cpp index ecc12474..cf31fe94 100644 --- a/src/modules/decklink/consumer_decklink.cpp +++ b/src/modules/decklink/consumer_decklink.cpp @@ -185,14 +185,24 @@ public: } // Get the keyer interface - if ( m_deckLink->QueryInterface( IID_IDeckLinkKeyer, (void**) &m_deckLinkKeyer ) != S_OK ) + IDeckLinkAttributes *deckLinkAttributes = 0; + m_deckLinkKeyer = 0; + if ( m_deckLink->QueryInterface( IID_IDeckLinkAttributes, (void**) &deckLinkAttributes ) == S_OK ) { - mlt_log_error( getConsumer(), "Failed to get keyer\n" ); - m_deckLinkOutput->Release(); - m_deckLinkOutput = 0; - m_deckLink->Release(); - m_deckLink = 0; - return false; + bool flag = false; + if ( deckLinkAttributes->GetFlag( BMDDeckLinkSupportsInternalKeying, &flag ) == S_OK && flag ) + { + if ( m_deckLink->QueryInterface( IID_IDeckLinkKeyer, (void**) &m_deckLinkKeyer ) != S_OK ) + { + mlt_log_error( getConsumer(), "Failed to get keyer\n" ); + m_deckLinkOutput->Release(); + m_deckLinkOutput = 0; + m_deckLink->Release(); + m_deckLink = 0; + return false; + } + } + deckLinkAttributes->Release(); } // Provide this class as a delegate to the audio and video output interfaces @@ -229,7 +239,7 @@ public: } // Set the keyer - if ( ( m_isKeyer = mlt_properties_get_int( properties, "keyer" ) ) ) + if ( m_deckLinkKeyer && ( m_isKeyer = mlt_properties_get_int( properties, "keyer" ) ) ) { bool external = false; double level = mlt_properties_get_double( properties, "keyer_level" ); @@ -240,7 +250,7 @@ public: m_preroll = 0; m_isAudio = false; } - else + else if ( m_deckLinkKeyer ) { m_deckLinkKeyer->Disable(); } -- 2.39.2