summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
c23d6db)
Also, add a couple of missing releases.
#include "DeckLinkAPI.h"
#endif
#include "DeckLinkAPI.h"
#endif
+#define SAFE_RELEASE(V) if (V) { V->Release(); V = NULL; }
+
static const unsigned PREROLL_MINIMUM = 3;
class DeckLinkConsumer
static const unsigned PREROLL_MINIMUM = 3;
class DeckLinkConsumer
IDeckLinkDisplayMode* getDisplayMode()
{
mlt_profile profile = mlt_service_profile( MLT_CONSUMER_SERVICE( getConsumer() ) );
IDeckLinkDisplayMode* getDisplayMode()
{
mlt_profile profile = mlt_service_profile( MLT_CONSUMER_SERVICE( getConsumer() ) );
- IDeckLinkDisplayModeIterator* iter;
- IDeckLinkDisplayMode* mode;
+ IDeckLinkDisplayModeIterator* iter = NULL;
+ IDeckLinkDisplayMode* mode = NULL;
IDeckLinkDisplayMode* result = 0;
if ( m_deckLinkOutput->GetDisplayModeIterator( &iter ) == S_OK )
IDeckLinkDisplayMode* result = 0;
if ( m_deckLinkOutput->GetDisplayModeIterator( &iter ) == S_OK )
&& m_fps == mlt_profile_fps( profile )
&& ( m_height == profile->height || ( m_height == 486 && profile->height == 480 ) ) )
result = mode;
&& m_fps == mlt_profile_fps( profile )
&& ( m_height == profile->height || ( m_height == 486 && profile->height == 480 ) ) )
result = mode;
+ else
+ SAFE_RELEASE( mode );
public:
mlt_consumer getConsumer()
{ return &m_consumer; }
public:
mlt_consumer getConsumer()
{ return &m_consumer; }
+
+ DeckLinkConsumer()
+ {
+ m_displayMode = NULL;
+ m_deckLinkKeyer = NULL;
+ m_deckLinkOutput = NULL;
+ m_deckLink = NULL;
+ }
+
- if ( m_deckLinkKeyer )
- m_deckLinkKeyer->Release();
- if ( m_deckLinkOutput )
- m_deckLinkOutput->Release();
- if ( m_deckLink )
- m_deckLink->Release();
+ SAFE_RELEASE( m_displayMode );
+ SAFE_RELEASE( m_deckLinkKeyer );
+ SAFE_RELEASE( m_deckLinkOutput );
+ SAFE_RELEASE( m_deckLink );
}
bool listDevices( mlt_properties properties )
}
bool listDevices( mlt_properties properties )
free( key );
free( name );
}
free( key );
free( name );
}
- m_deckLinkOutput->Release();
+ SAFE_RELEASE( m_deckLinkOutput );
+ SAFE_RELEASE( m_deckLink );
- decklinkIterator->Release();
+ SAFE_RELEASE( decklinkIterator );
mlt_properties_set_int( properties, "devices", i );
mlt_log_verbose( NULL, "[consumer decklink] devices = %d\n", i );
mlt_properties_set_int( properties, "devices", i );
mlt_log_verbose( NULL, "[consumer decklink] devices = %d\n", i );
}
catch ( const char *error )
{
}
catch ( const char *error )
{
- if ( decklinkIterator )
- decklinkIterator->Release();
+ SAFE_RELEASE( decklinkIterator );
mlt_log_error( getConsumer(), "%s\n", error );
return false;
}
mlt_log_error( getConsumer(), "%s\n", error );
return false;
}
// Connect to the Nth DeckLink instance
// Connect to the Nth DeckLink instance
- do {
- if ( deckLinkIterator->Next( &m_deckLink ) != S_OK )
- {
- mlt_log_error( getConsumer(), "DeckLink card not found\n" );
- deckLinkIterator->Release();
- return false;
- }
- } while ( ++i <= card );
- deckLinkIterator->Release();
-
+ for ( i = 0; deckLinkIterator->Next( &m_deckLink ) == S_OK ; i++)
+ {
+ if( i == card )
+ break;
+ else
+ SAFE_RELEASE( m_deckLink );
+ }
+ SAFE_RELEASE( deckLinkIterator );
+ if ( !m_deckLink )
+ {
+ mlt_log_error( getConsumer(), "DeckLink card not found\n" );
+ return false;
+ }
+
// Obtain the audio/video output interface (IDeckLinkOutput)
if ( m_deckLink->QueryInterface( IID_IDeckLinkOutput, (void**)&m_deckLinkOutput ) != S_OK )
{
mlt_log_error( getConsumer(), "No DeckLink cards support output\n" );
// Obtain the audio/video output interface (IDeckLinkOutput)
if ( m_deckLink->QueryInterface( IID_IDeckLinkOutput, (void**)&m_deckLinkOutput ) != S_OK )
{
mlt_log_error( getConsumer(), "No DeckLink cards support output\n" );
- m_deckLink->Release();
- m_deckLink = 0;
+ SAFE_RELEASE( m_deckLink );
return false;
}
// Get the keyer interface
IDeckLinkAttributes *deckLinkAttributes = 0;
return false;
}
// Get the keyer interface
IDeckLinkAttributes *deckLinkAttributes = 0;
if ( m_deckLink->QueryInterface( IID_IDeckLinkAttributes, (void**) &deckLinkAttributes ) == S_OK )
{
#ifdef WIN32
if ( m_deckLink->QueryInterface( IID_IDeckLinkAttributes, (void**) &deckLinkAttributes ) == S_OK )
{
#ifdef WIN32
if ( m_deckLink->QueryInterface( IID_IDeckLinkKeyer, (void**) &m_deckLinkKeyer ) != S_OK )
{
mlt_log_error( getConsumer(), "Failed to get keyer\n" );
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;
+ SAFE_RELEASE( m_deckLinkOutput );
+ SAFE_RELEASE( m_deckLink );
- deckLinkAttributes->Release();
+ SAFE_RELEASE( deckLinkAttributes );
}
// Provide this class as a delegate to the audio and video output interfaces
}
// Provide this class as a delegate to the audio and video output interfaces
}
// release decklink frame
}
// release decklink frame
- if ( m_decklinkFrame )
- m_decklinkFrame->Release();
- m_decklinkFrame = NULL;
+ SAFE_RELEASE( m_decklinkFrame );
if ( wasRunning )
pthread_join( m_prerollThread, NULL );
if ( wasRunning )
pthread_join( m_prerollThread, NULL );
uint8_t* buffer = 0;
int stride = m_width * ( m_isKeyer? 4 : 2 );
uint8_t* buffer = 0;
int stride = m_width * ( m_isKeyer? 4 : 2 );
- if ( m_decklinkFrame )
- m_decklinkFrame->Release();
+ SAFE_RELEASE( m_decklinkFrame );
if ( createFrame( &m_decklinkFrame ) )
m_decklinkFrame->GetBytes( (void**) &buffer );
if ( createFrame( &m_decklinkFrame ) )
m_decklinkFrame->GetBytes( (void**) &buffer );
#include "DeckLinkAPI.h"
#endif
#include "DeckLinkAPI.h"
#endif
+#define SAFE_RELEASE(V) if (V) { V->Release(); V = NULL; }
+
class DeckLinkProducer
: public IDeckLinkInputCallback
{
class DeckLinkProducer
: public IDeckLinkInputCallback
{
BMDDisplayMode getDisplayMode( mlt_profile profile, int vancLines )
{
BMDDisplayMode getDisplayMode( mlt_profile profile, int vancLines )
{
- IDeckLinkDisplayModeIterator* iter;
- IDeckLinkDisplayMode* mode;
+ IDeckLinkDisplayModeIterator* iter = NULL;
+ IDeckLinkDisplayMode* mode = NULL;
BMDDisplayMode result = (BMDDisplayMode) bmdDisplayModeNotSupported;
if ( m_decklinkInput->GetDisplayModeIterator( &iter ) == S_OK )
BMDDisplayMode result = (BMDDisplayMode) bmdDisplayModeNotSupported;
if ( m_decklinkInput->GetDisplayModeIterator( &iter ) == S_OK )
&& ( height + vancLines == profile->height || ( height == 486 && profile->height == 480 + vancLines ) )
&& fps == mlt_profile_fps( profile ) )
result = mode->GetDisplayMode();
&& ( height + vancLines == profile->height || ( height == 486 && profile->height == 480 + vancLines ) )
&& fps == mlt_profile_fps( profile ) )
result = mode->GetDisplayMode();
mlt_producer getProducer() const
{ return m_producer; }
mlt_producer getProducer() const
{ return m_producer; }
+ DeckLinkProducer()
+ {
+ m_decklink = NULL;
+ m_decklinkInput = NULL;
+ }
+
~DeckLinkProducer()
{
if ( m_queue )
~DeckLinkProducer()
{
if ( m_queue )
pthread_cond_destroy( &m_condition );
mlt_cache_close( m_cache );
}
pthread_cond_destroy( &m_condition );
mlt_cache_close( m_cache );
}
- if ( m_decklinkInput )
- m_decklinkInput->Release();
- if ( m_decklink )
- m_decklink->Release();
+ SAFE_RELEASE( m_decklinkInput );
+ SAFE_RELEASE( m_decklink );
}
bool listDevices( mlt_properties properties )
}
bool listDevices( mlt_properties properties )
free( key );
free( name );
}
free( key );
free( name );
}
- m_decklinkInput->Release();
+ SAFE_RELEASE( m_decklinkInput );
+ SAFE_RELEASE( m_decklink );
- decklinkIterator->Release();
+ SAFE_RELEASE( decklinkIterator );
mlt_properties_set_int( properties, "devices", i );
return true;
}
catch ( const char *error )
{
mlt_properties_set_int( properties, "devices", i );
return true;
}
catch ( const char *error )
{
- if ( decklinkIterator )
- decklinkIterator->Release();
+ SAFE_RELEASE( decklinkIterator );
mlt_log_error( getProducer(), "%s\n", error );
return false;
}
mlt_log_error( getProducer(), "%s\n", error );
return false;
}
#endif
// Connect to the Nth DeckLink instance
#endif
// Connect to the Nth DeckLink instance
- unsigned i = 0;
- do {
- if ( decklinkIterator->Next( &m_decklink ) != S_OK )
- throw "DeckLink card not found.";
- } while ( ++i <= card );
- decklinkIterator->Release();
+ for ( unsigned i = 0; decklinkIterator->Next( &m_decklink ) == S_OK ; i++)
+ {
+ if ( i == card )
+ break;
+ else
+ SAFE_RELEASE( m_decklink );
+ }
+ SAFE_RELEASE( decklinkIterator );
+ if ( !m_decklink )
+ throw "DeckLink card not found.";
// Get the input interface
if ( m_decklink->QueryInterface( IID_IDeckLinkInput, (void**) &m_decklinkInput ) != S_OK )
// Get the input interface
if ( m_decklink->QueryInterface( IID_IDeckLinkInput, (void**) &m_decklinkInput ) != S_OK )
}
catch ( const char *error )
{
}
catch ( const char *error )
{
- if ( decklinkIterator )
- decklinkIterator->Release();
+ SAFE_RELEASE( m_decklinkInput );
+ SAFE_RELEASE( m_decklink );
mlt_log_error( getProducer(), "%s\n", error );
return false;
}
mlt_log_error( getProducer(), "%s\n", error );
return false;
}
{
if ( decklinkAttributes->GetFlag( BMDDeckLinkSupportsInputFormatDetection, &doesDetectFormat ) != S_OK )
doesDetectFormat = false;
{
if ( decklinkAttributes->GetFlag( BMDDeckLinkSupportsInputFormatDetection, &doesDetectFormat ) != S_OK )
doesDetectFormat = false;
- decklinkAttributes->Release();
+ SAFE_RELEASE( decklinkAttributes );
}
mlt_log_verbose( getProducer(), "%s format detection\n", doesDetectFormat ? "supports" : "does not support" );
}
mlt_log_verbose( getProducer(), "%s format detection\n", doesDetectFormat ? "supports" : "does not support" );
else
mlt_log_debug( getProducer(), "failed capture vanc line %d\n", i );
}
else
mlt_log_debug( getProducer(), "failed capture vanc line %d\n", i );
}
}
if ( timecodeString )
free( (void*) timecodeString );
}
if ( timecodeString )
free( (void*) timecodeString );
+ SAFE_RELEASE( timecode );