]> git.sesse.net Git - vlc/commitdiff
Fix the worst memory leaks. I hope.
authorSteinar Gunderson <sgunderson@bigfoot.com>
Sat, 25 Sep 2010 17:15:04 +0000 (19:15 +0200)
committerSteinar Gunderson <sgunderson@bigfoot.com>
Sat, 25 Sep 2010 17:15:04 +0000 (19:15 +0200)
modules/access/sdi.cpp

index 8ac5f97bd9e755d130099bd49edaf513c047de0b..84b3b4dad46614e86ef64071a3d7bf353c696146 100644 (file)
@@ -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 );
 }