/* 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);
/* */
if (vlc_clone(&vout->p->thread, Thread, vout,
VLC_THREAD_PRIORITY_OUTPUT)) {
+ spu_Destroy(vout->p->p_spu);
vlc_object_release(vout);
return NULL;
}
if (vout->p->input)
spu_Attach(vout->p->p_spu, vout->p->input, false);
- vlc_object_detach(vout->p->p_spu);
vout_snapshot_End(&vout->p->snapshot);
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);
}
/* */
free(vout->p->splitter_name);
- /* */
- spu_Destroy(vout->p->p_spu);
-
/* 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);
}
int vout_RegisterSubpictureChannel( vout_thread_t *vout )
{
- return spu_RegisterChannel(vout->p->p_spu);
+ int channel = SPU_DEFAULT_CHANNEL;
+
+ 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;
}
void vout_FlushSubpictureChannel( vout_thread_t *vout, int channel )
{
- spu_ClearChannel(vout->p->p_spu, channel);
+ vout_control_PushInteger(&vout->p->control, VOUT_CONTROL_FLUSH_SUBPICTURE,
+ channel);
}
/* vout_Control* are usable by anyone at anytime */
{
spu_DisplaySubpicture(vout->p->p_spu, subpicture);
}
+
+static void ThreadFlushSubpicture(vout_thread_t *vout, int channel)
+{
+ spu_ClearChannel(vout->p->p_spu, channel);
+}
+
static void ThreadDisplayOsdTitle(vout_thread_t *vout, const char *string)
{
if (!vout->p->title.show)
ThreadDisplaySubpicture(vout, cmd.u.subpicture);
cmd.u.subpicture = NULL;
break;
+ case VOUT_CONTROL_FLUSH_SUBPICTURE:
+ ThreadFlushSubpicture(vout, cmd.u.integer);
+ break;
case VOUT_CONTROL_OSD_TITLE:
ThreadDisplayOsdTitle(vout, cmd.u.string);
break;