]> git.sesse.net Git - vlc/blobdiff - src/video_output/video_output.c
Join and unload vout safely
[vlc] / src / video_output / video_output.c
index b0e1eb53e90131121981fdf98d5fe24d5d5f0d93..0fe1be372ff74940b235d13784281b7c2e0ff49a 100644 (file)
@@ -131,6 +131,9 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
         if( p_vout )
         {
             spu_Attach( p_vout->p_spu, p_this, false );
+            vlc_object_kill( p_vout );
+            vlc_thread_join( p_vout );
+            module_Unneed( p_vout, p_vout->p_module );
             vlc_object_release( p_vout );
         }
         return NULL;
@@ -446,6 +449,9 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
         msg_Err( p_vout, "video output creation failed" );
 
         /* Make sure the thread is destroyed and data released */
+        vlc_object_kill( p_vout );
+        vlc_thread_join( p_vout );
+        module_Unneed( p_vout, p_vout->p_module );
         vlc_object_release( p_vout );
         return NULL;
     }
@@ -462,12 +468,6 @@ static void vout_Destructor( vlc_object_t * p_this )
     vlc_mutex_destroy( &p_vout->change_lock );
     vlc_mutex_destroy( &p_vout->vfilter_lock );
 
-    /* Release the module */
-    if( p_vout->p_module )
-    {
-        module_Unneed( p_vout, p_vout->p_module );
-    }
-
     free( p_vout->psz_filter_chain );
 
     config_ChainDestroy( p_vout->p_cfg );
@@ -1226,7 +1226,7 @@ static picture_t *ChromaGetPicture( filter_t *p_filter )
     return p_pic;
 }
 
-static int ChromaCopyRgbInfo( es_format_t *p_fmt, picture_heap_t *p_heap )
+static void ChromaCopyRgbInfo( es_format_t *p_fmt, picture_heap_t *p_heap )
 {
     p_fmt->video.i_rmask = p_heap->i_rmask;
     p_fmt->video.i_gmask = p_heap->i_gmask;