From 13f11c9667f8799c7c4939f7f1353d4eacb22a02 Mon Sep 17 00:00:00 2001 From: Steinar Gunderson Date: Sat, 25 Sep 2010 19:15:04 +0200 Subject: [PATCH] Fix the worst memory leaks. I hope. --- modules/access/sdi.cpp | 57 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/modules/access/sdi.cpp b/modules/access/sdi.cpp index 8ac5f97bd9..84b3b4dad4 100644 --- a/modules/access/sdi.cpp +++ b/modules/access/sdi.cpp @@ -215,9 +215,17 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived(IDeckLinkVideoInputFrame { 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 ); } @@ -252,7 +260,8 @@ static int Open( vlc_object_t *p_this ) 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; } @@ -266,9 +275,12 @@ static int Open( vlc_object_t *p_this ) 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; } @@ -278,6 +290,7 @@ static int Open( vlc_object_t *p_this ) if( result != S_OK ) { msg_Err( p_demux, "Could not get model name" ); + Close( p_this ); return VLC_EGENERIC; } @@ -286,6 +299,7 @@ static int Open( vlc_object_t *p_this ) 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; } @@ -294,6 +308,7 @@ static int Open( vlc_object_t *p_this ) 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; } @@ -317,6 +332,9 @@ static int Open( vlc_object_t *p_this ) { 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 ); @@ -326,6 +344,8 @@ static int Open( vlc_object_t *p_this ) if( result != S_OK ) { msg_Err( p_demux, "Failed to set video input connection" ); + p_config->Release(); + Close( p_this ); return VLC_EGENERIC; } } @@ -344,6 +364,7 @@ static int Open( vlc_object_t *p_this ) { 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 ); @@ -353,9 +374,13 @@ static int Open( vlc_object_t *p_this ) 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; @@ -363,12 +388,16 @@ static int Open( vlc_object_t *p_this ) 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; } @@ -402,6 +431,8 @@ static int Open( vlc_object_t *p_this ) if( result != S_OK ) { msg_Err( p_demux, "Failed to get display mode name" ); + p_display_iterator->Release(); + Close( p_this ); return VLC_EGENERIC; } @@ -410,6 +441,8 @@ static int Open( vlc_object_t *p_this ) if( result != S_OK ) { msg_Err( p_demux, "Failed to get frame rate" ); + p_display_iterator->Release(); + Close( p_this ); return VLC_EGENERIC; } @@ -453,11 +486,14 @@ static int Open( vlc_object_t *p_this ) } } + 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; } @@ -465,6 +501,7 @@ static int Open( vlc_object_t *p_this ) if( result != S_OK ) { msg_Err( p_demux, "Failed to enable video input" ); + Close( p_this ); return VLC_EGENERIC; } @@ -477,6 +514,7 @@ static int Open( vlc_object_t *p_this ) if( result != S_OK ) { msg_Err( p_demux, "Failed to enable audio input" ); + Close( p_this ); return VLC_EGENERIC; } } @@ -488,6 +526,7 @@ static int Open( vlc_object_t *p_this ) if( result != S_OK ) { msg_Err( p_demux, "Failed to start streams" ); + Close( p_this ); return VLC_EGENERIC; } @@ -544,6 +583,16 @@ static void Close( vlc_object_t *p_this ) 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 ); } -- 2.39.2