{
vlc_mutex_lock( &p_sys->frame_lock );
if( p_video_frame )
- p_sys->p_video_frame = p_video_frame; // FIXME: leak
+ {
+ if( p_sys->p_video_frame )
+ block_Release( p_sys->p_video_frame );
+ p_sys->p_video_frame = p_video_frame;
+ }
if( p_audio_frame )
- p_sys->p_audio_frame = p_audio_frame; // FIXME: leak
+ {
+ if( p_sys->p_audio_frame )
+ block_Release( p_sys->p_audio_frame );
+ p_sys->p_audio_frame = p_audio_frame;
+ }
vlc_cond_signal( &p_sys->has_frame );
vlc_mutex_unlock( &p_sys->frame_lock );
}
if( !decklink_iterator )
{
msg_Err( p_demux, "DeckLink drivers not found." );
- // FIXME: Leak here and several other error paths.
+ decklink_iterator->Release();
+ Close( p_this );
return VLC_EGENERIC;
}
break;
}
+ decklink_iterator->Release();
+
if( result != S_OK )
{
msg_Err( p_demux, "DeckLink PCI card %d not found", i_card_index );
+ Close( p_this );
return VLC_EGENERIC;
}
if( result != S_OK )
{
msg_Err( p_demux, "Could not get model name" );
+ Close( p_this );
return VLC_EGENERIC;
}
if( p_sys->p_card->QueryInterface( IID_IDeckLinkInput, (void**)&p_sys->p_input) != S_OK )
{
msg_Err( p_demux, "Card has no inputs" );
+ Close( p_this );
return VLC_EGENERIC;
}
if( p_sys->p_card->QueryInterface( IID_IDeckLinkConfiguration, (void**)&p_config) != S_OK )
{
msg_Err( p_demux, "Failed to get configuration interface" );
+ Close( p_this );
return VLC_EGENERIC;
}
{
msg_Err( p_demux, "Invalid --sdi-video-connection specified; choose one of " \
"sdi, hdmi, opticalsdi, component, composite, or svideo." );
+ p_config->Release();
+ free( psz_tmp );
+ Close( p_this );
return VLC_EGENERIC;
}
free( psz_tmp );
if( result != S_OK )
{
msg_Err( p_demux, "Failed to set video input connection" );
+ p_config->Release();
+ Close( p_this );
return VLC_EGENERIC;
}
}
{
msg_Err( p_demux, "Invalid --sdi-audio-connection specified; choose one of " \
"embedded, aesebu, or analog." );
+ Close( p_this );
return VLC_EGENERIC;
}
free( psz_tmp );
if( result != S_OK )
{
msg_Err( p_demux, "Failed to set audio input connection" );
+ p_config->Release();
+ Close( p_this );
return VLC_EGENERIC;
}
- }
+ }
+
+ p_config->Release();
// Get the list of display modes.
IDeckLinkDisplayModeIterator *p_display_iterator;
if( result != S_OK )
{
msg_Err( p_demux, "Failed to enumerate display modes" );
+ p_display_iterator->Release();
+ Close( p_this );
return VLC_EGENERIC;
}
char *psz_display_mode = var_CreateGetString( p_demux, "sdi-mode" );
if( !psz_display_mode || strlen( psz_display_mode ) == 0 || strlen( psz_display_mode ) > 4 ) {
msg_Err( p_demux, "Missing or invalid --sdi-mode string" );
+ p_display_iterator->Release();
+ Close( p_this );
return VLC_EGENERIC;
}
if( result != S_OK )
{
msg_Err( p_demux, "Failed to get display mode name" );
+ p_display_iterator->Release();
+ Close( p_this );
return VLC_EGENERIC;
}
if( result != S_OK )
{
msg_Err( p_demux, "Failed to get frame rate" );
+ p_display_iterator->Release();
+ Close( p_this );
return VLC_EGENERIC;
}
}
}
+ p_display_iterator->Release();
+
if( !b_found_mode )
{
msg_Err( p_demux, "Unknown SDI mode specified. " \
"Run VLC with -v --verbose-objects=-all,+sdi " \
"to get a list of supported modes." );
+ Close( p_this );
return VLC_EGENERIC;
}
if( result != S_OK )
{
msg_Err( p_demux, "Failed to enable video input" );
+ Close( p_this );
return VLC_EGENERIC;
}
if( result != S_OK )
{
msg_Err( p_demux, "Failed to enable audio input" );
+ Close( p_this );
return VLC_EGENERIC;
}
}
if( result != S_OK )
{
msg_Err( p_demux, "Failed to start streams" );
+ Close( p_this );
return VLC_EGENERIC;
}
demux_t *p_demux = (demux_t *)p_this;
demux_sys_t *p_sys = p_demux->p_sys;
+ if( p_sys->p_input )
+ {
+ p_sys->p_input->StopStreams();
+ p_sys->p_input->Release();
+ }
+
+ if( p_sys->p_card )
+ p_sys->p_card->Release();
+
+ delete p_sys->p_delegate;
free( p_sys );
}