]> git.sesse.net Git - vlc/blobdiff - src/video_output/video_output.c
Improved spu_SortSubpictures.
[vlc] / src / video_output / video_output.c
index aab5e0c77b0dc3470fa2229e5566a490acc2121a..2cc823d9f0787ffdfe7df98c90918392fc6227ec 100644 (file)
@@ -126,6 +126,7 @@ static vout_thread_t *VoutCreate(vlc_object_t *object,
     /* Initialize locks */
     vlc_mutex_init(&vout->p->picture_lock);
     vlc_mutex_init(&vout->p->vfilter_lock);
+    vlc_mutex_init(&vout->p->spu_lock);
 
     /* Attach the new object now so we can use var inheritance below */
     vlc_object_attach(vout, object);
@@ -235,7 +236,10 @@ void vout_Close(vout_thread_t *vout)
     vout_control_PushVoid(&vout->p->control, VOUT_CONTROL_CLEAN);
     vlc_join(vout->p->thread, NULL);
 
+    vlc_mutex_lock(&vout->p->spu_lock);
     spu_Destroy(vout->p->p_spu);
+    vout->p->p_spu = NULL;
+    vlc_mutex_unlock(&vout->p->spu_lock);
 }
 
 /* */
@@ -249,6 +253,7 @@ static void VoutDestructor(vlc_object_t *object)
     free(vout->p->splitter_name);
 
     /* Destroy the locks */
+    vlc_mutex_destroy(&vout->p->spu_lock);
     vlc_mutex_destroy(&vout->p->picture_lock);
     vlc_mutex_destroy(&vout->p->vfilter_lock);
     vout_control_Clean(&vout->p->control);
@@ -358,12 +363,10 @@ int vout_RegisterSubpictureChannel( vout_thread_t *vout )
 {
     int channel = SPU_DEFAULT_CHANNEL;
 
-    vout_control_cmd_t cmd;
-    vout_control_cmd_Init(&cmd, VOUT_CONTROL_REGISTER_SUBPICTURE);
-    cmd.u.integer_ptr = &channel;
-
-    vout_control_Push(&vout->p->control, &cmd);
-    vout_control_WaitEmpty(&vout->p->control);
+    vlc_mutex_lock(&vout->p->spu_lock);
+    if (vout->p->p_spu)
+        channel = spu_RegisterChannel(vout->p->p_spu);
+    vlc_mutex_unlock(&vout->p->spu_lock);
 
     return channel;
 }
@@ -768,11 +771,6 @@ static void ThreadDisplaySubpicture(vout_thread_t *vout,
     spu_DisplaySubpicture(vout->p->p_spu, subpicture);
 }
 
-static void ThreadRegisterSubpicture(vout_thread_t *vout, int *channel)
-{
-    *channel = spu_RegisterChannel(vout->p->p_spu);
-}
-
 static void ThreadFlushSubpicture(vout_thread_t *vout, int channel)
 {
     spu_ClearChannel(vout->p->p_spu, channel);
@@ -1136,9 +1134,6 @@ static void *Thread(void *object)
             case VOUT_CONTROL_FLUSH_SUBPICTURE:
                 ThreadFlushSubpicture(vout, cmd.u.integer);
                 break;
-            case VOUT_CONTROL_REGISTER_SUBPICTURE:
-                ThreadRegisterSubpicture(vout, cmd.u.integer_ptr);
-                break;
             case VOUT_CONTROL_OSD_TITLE:
                 ThreadDisplayOsdTitle(vout, cmd.u.string);
                 break;