]> git.sesse.net Git - vlc/commitdiff
* src/video_output/vout_subpictures.c, video_output.c: fixed a crash with dvd menus.
authorGildas Bazin <gbazin@videolan.org>
Mon, 23 Aug 2004 15:19:56 +0000 (15:19 +0000)
committerGildas Bazin <gbazin@videolan.org>
Mon, 23 Aug 2004 15:19:56 +0000 (15:19 +0000)
include/video_output.h
src/video_output/video_output.c
src/video_output/vout_subpictures.c

index c08903838cf59f83586a2f0443779750f5e87c5b..b3b8712a9486ecd8c279ef26bfa5103514676a87 100644 (file)
@@ -278,6 +278,7 @@ VLC_EXPORT( void, __spu_DestroyRegion, ( vlc_object_t *, subpicture_region_t * )
 
 void           vout_InitSPU( vout_thread_t * );
 void           vout_DestroySPU( vout_thread_t * );
+void           vout_AttachSPU( vout_thread_t *, vlc_bool_t );
 subpicture_t * vout_SortSubPictures  ( vout_thread_t *, mtime_t );
 void           vout_RenderSubPictures( vout_thread_t *, picture_t *,
                                        picture_t *, subpicture_t * );
index cb8e0af0a6d6ee07f188e4f59c8e9b082c51ae90..8f2b19634f71c816acb68674c1cafd1a4d3f1939 100644 (file)
@@ -94,11 +94,12 @@ vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout,
         {
             vlc_object_t *p_playlist;
 
-            p_playlist = vlc_object_find( p_this,
-                                          VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+            p_playlist = vlc_object_find( p_this, VLC_OBJECT_PLAYLIST,
+                                          FIND_ANYWHERE );
 
             if( p_playlist )
             {
+                vout_AttachSPU( p_vout, VLC_FALSE );
                 vlc_object_detach( p_vout );
                 vlc_object_attach( p_vout, p_playlist );
 
@@ -194,6 +195,7 @@ vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout,
             /* This video output is cool! Hijack it. */
             vlc_object_detach( p_vout );
             vlc_object_attach( p_vout, p_this );
+            vout_AttachSPU( p_vout, VLC_TRUE );
             vlc_object_release( p_vout );
         }
     }
@@ -1420,4 +1422,3 @@ static int FilterCallback( vlc_object_t *p_this, char const *psz_cmd,
     var_Set( p_vout, "intf-change", val );
     return VLC_SUCCESS;
 }
-
index f6ea6b6b92cde83311234e036369d370e26dbd69..e504e30b830d1a30b57c3912ba25cfe9acd4891e 100644 (file)
@@ -51,7 +51,6 @@ static void spu_del_buffer( filter_t *, subpicture_t * );
  */
 void vout_InitSPU( vout_thread_t *p_vout )
 {
-    vlc_object_t *p_input;
     int i_index;
 
     for( i_index = 0; i_index < VOUT_MAX_SUBPICTURES; i_index++)
@@ -83,14 +82,7 @@ void vout_InitSPU( vout_thread_t *p_vout )
     p_vout->b_force_alpha = VLC_FALSE;
     p_vout->b_force_crop = VLC_FALSE;
 
-    /* Create callback */
-    p_input = vlc_object_find( p_vout, VLC_OBJECT_INPUT, FIND_PARENT );
-    if( p_input )
-    {
-        UpdateSPU( p_vout, VLC_OBJECT(p_input) );
-        var_AddCallback( p_input, "highlight", CropCallback, p_vout );
-        vlc_object_release( p_input );
-    }
+    vout_AttachSPU( p_vout, VLC_TRUE );
 }
 
 /**
@@ -100,7 +92,6 @@ void vout_InitSPU( vout_thread_t *p_vout )
  */
 void vout_DestroySPU( vout_thread_t *p_vout )
 {
-    vlc_object_t *p_input;
     int i_index;
 
     /* Destroy all remaining subpictures */
@@ -131,13 +122,35 @@ void vout_DestroySPU( vout_thread_t *p_vout )
         vlc_object_destroy( p_vout->p_blend );
     }
 
-    /* Delete callback */
+    vout_AttachSPU( p_vout, VLC_FALSE );
+}
+
+/**
+ * Attach/Detach the SPU from any input
+ *
+ * \param p_vout the vout in which to destroy the subpicture unit
+ * \param b_attach to select attach or detach
+ */
+void vout_AttachSPU( vout_thread_t *p_vout, vlc_bool_t b_attach )
+{
+    vlc_object_t *p_input;
+
     p_input = vlc_object_find( p_vout, VLC_OBJECT_INPUT, FIND_PARENT );
-    if( p_input )
+    if( !p_input ) return;
+
+    if( b_attach )
     {
+        UpdateSPU( p_vout, VLC_OBJECT(p_input) );
+        var_AddCallback( p_input, "highlight", CropCallback, p_vout );
+        vlc_object_release( p_input );
+    }
+    else
+    {
+        /* Delete callback */
         var_DelCallback( p_input, "highlight", CropCallback, p_vout );
         vlc_object_release( p_input );
     }
+
 }
 
 /**