]> git.sesse.net Git - vlc/commitdiff
video_output.c: Don't rely on the playlist to store vout, but store them in libvlc.
authorPierre d'Herbemont <pdherbemont@videolan.org>
Wed, 26 Mar 2008 09:18:08 +0000 (10:18 +0100)
committerPierre d'Herbemont <pdherbemont@videolan.org>
Wed, 26 Mar 2008 16:36:06 +0000 (17:36 +0100)
This sanitize the circular dependency there is between playlist and input and allow a safe destruction.

src/video_output/video_output.c

index 09595a0756a63096cff2416e30dd68890119cb89..81efa98f591bc51f8e0b8bcdf23ff27948275b6f 100644 (file)
@@ -129,11 +129,9 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
         /* Reattach video output to playlist before bailing out */
         if( p_vout )
         {
-            playlist_t  *p_playlist = pl_Yield( p_this );
             spu_Attach( p_vout->p_spu, p_this, VLC_FALSE );
             vlc_object_detach( p_vout );
-            vlc_object_attach( p_vout, p_this );
-            pl_Release( p_this );
+            vlc_object_attach( p_vout, p_this->p_libvlc );
         }
         return NULL;
     }
@@ -149,20 +147,16 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
 
         if( !p_vout )
         {
-            playlist_t *p_playlist = pl_Yield( p_this );
-            vlc_mutex_lock( &p_playlist->gc_lock );
-            p_vout = vlc_object_find( p_playlist,
+            p_vout = vlc_object_find( p_this->p_libvlc,
                                       VLC_OBJECT_VOUT, FIND_CHILD );
             /* only first children of p_input for unused vout */
-            if( p_vout && p_vout->p_parent != (vlc_object_t *)p_playlist )
+            if( p_vout && p_vout->p_parent != VLC_OBJECT(p_this->p_libvlc) )
             {
                 vlc_object_release( p_vout );
                 p_vout = NULL;
             }
             if( p_vout )
                 vlc_object_detach( p_vout );    /* Remove it from the GC */
-            vlc_mutex_unlock( &p_playlist->gc_lock );
-            pl_Release( p_this );
         }
     }
 
@@ -496,20 +490,21 @@ void vout_Destroy( vout_thread_t *p_vout )
 
 static void vout_Destructor( vlc_object_t * p_this )
 {
-    vout_thread_t *p_vout = p_this;
-    vout_thread_t *p_another_vout;
-    playlist_t *p_playlist = pl_Yield( p_vout );
+    vout_thread_t *p_vout = (vout_thread_t *)p_this;
 
     free( p_vout->psz_filter_chain );
 
     config_ChainDestroy( p_vout->p_cfg );
 
 #ifndef __APPLE__
+    vout_thread_t *p_another_vout;
+    playlist_t *p_playlist = pl_Yield( p_vout );
+
     /* This is a dirty hack for mostly Linux, where there is no way to get the GUI
        back if you closed it while playing video. This is solved in Mac OS X,
        where we have this novelty called menubar, that will always allow you access
        to the applications main functionality. They should try that on linux sometime */
-    p_another_vout = vlc_object_find( p_playlist,
+    p_another_vout = vlc_object_find( p_this->p_libvlc,
                                       VLC_OBJECT_VOUT, FIND_ANYWHERE );
     if( p_another_vout == NULL )
     {
@@ -521,8 +516,8 @@ static void vout_Destructor( vlc_object_t * p_this )
     {
         vlc_object_release( p_another_vout );
     }
-#endif
     vlc_object_release( p_playlist );
+#endif
 }
 
 /*****************************************************************************