[vlc-commits] [Git][videolan/vlc][master] decoder: allow holding Fifo lock while sending events.
Thomas Guillem (@tguillem)
gitlab at videolan.org
Mon Dec 1 09:28:10 UTC 2025
Thomas Guillem pushed to branch master at VideoLAN / VLC
Commits:
c6c4fb85 by Thomas Guillem at 2025-12-01T08:27:01+00:00
decoder: allow holding Fifo lock while sending events.
The Fifo lock can be held while calling `decoder_Notify()`. Therefore,
don't try to avoid calling `decoder_Notify()` with the lock.
```
vlc_input_decoder_t
=> es_out.c (es_out lock can't be held from these callbacks)
=> input_SendEvent().
```
- - - - -
1 changed file:
- src/input/decoder.c
Changes:
=====================================
src/input/decoder.c
=====================================
@@ -685,12 +685,11 @@ static int ModuleThread_UpdateVideoFormat( decoder_t *p_dec, vlc_video_context *
p_owner->video.started = true;
Decoder_UpdateOutState( p_owner );
- vlc_fifo_Unlock(p_owner->p_fifo);
if (vout_state == INPUT_RESOURCE_VOUT_STARTED)
decoder_Notify(p_owner, on_vout_started, p_vout,
p_owner->video.vout_order);
-
+ vlc_fifo_Unlock(p_owner->p_fifo);
return 0;
}
else
@@ -886,10 +885,10 @@ static subpicture_t *ModuleThread_NewSpuBuffer( decoder_t *p_dec,
msg_Warn( p_dec, "no vout found, dropping subpicture" );
if( p_owner->spu.vout )
{
+ vlc_fifo_Lock( p_owner->p_fifo );
assert(p_owner->spu.channel != VOUT_SPU_CHANNEL_INVALID);
decoder_Notify(p_owner, on_vout_stopped, p_owner->spu.vout);
- vlc_fifo_Lock( p_owner->p_fifo );
vout_UnregisterSubpictureChannel(p_owner->spu.vout,
p_owner->spu.channel);
p_owner->spu.channel = VOUT_SPU_CHANNEL_INVALID;
@@ -903,11 +902,11 @@ static subpicture_t *ModuleThread_NewSpuBuffer( decoder_t *p_dec,
if( p_owner->spu.vout != p_vout )
{
+ vlc_fifo_Lock(p_owner->p_fifo);
+
if (p_owner->spu.vout) /* notify the previous vout deletion unlocked */
decoder_Notify(p_owner, on_vout_stopped, p_owner->spu.vout);
- vlc_fifo_Lock(p_owner->p_fifo);
-
if (p_owner->spu.vout)
{
/* Unregister the SPU channel of the previous vout */
@@ -934,10 +933,10 @@ static subpicture_t *ModuleThread_NewSpuBuffer( decoder_t *p_dec,
p_owner->spu.vout = p_vout;
Decoder_UpdateOutState(p_owner);
- vlc_fifo_Unlock(p_owner->p_fifo);
assert(channel_order != VLC_VOUT_ORDER_NONE);
decoder_Notify(p_owner, on_vout_started, p_vout, channel_order);
+ vlc_fifo_Unlock(p_owner->p_fifo);
}
else
vout_Release(p_vout);
@@ -1429,9 +1428,8 @@ static void ModuleThread_QueueVideo( decoder_t *p_dec, picture_t *p_pic )
if (success != VLC_SUCCESS)
vout_lost++;
- vlc_fifo_Unlock(p_owner->p_fifo);
-
decoder_Notify(p_owner, on_new_video_stats, 1, vout_lost, displayed, vout_late);
+ vlc_fifo_Unlock(p_owner->p_fifo);
}
static vlc_decoder_device * thumbnailer_get_device( decoder_t *p_dec )
@@ -1461,17 +1459,14 @@ static picture_t *thumbnailer_buffer_new( decoder_t *p_dec )
static void ModuleThread_QueueThumbnail( decoder_t *p_dec, picture_t *p_pic )
{
vlc_input_decoder_t *p_owner = dec_get_owner( p_dec );
- bool b_first;
vlc_fifo_Lock(p_owner->p_fifo);
- b_first = p_owner->b_first;
+ if( p_owner->b_first )
+ decoder_Notify(p_owner, on_thumbnail_ready, p_pic);
p_owner->b_first = false;
vlc_fifo_Unlock(p_owner->p_fifo);
- if( b_first )
- decoder_Notify(p_owner, on_thumbnail_ready, p_pic);
picture_Release( p_pic );
-
}
static int ModuleThread_PlayAudio( vlc_input_decoder_t *p_owner, vlc_frame_t *p_audio )
@@ -1567,9 +1562,8 @@ static void ModuleThread_QueueAudio( decoder_t *p_dec, vlc_frame_t *p_aout_buf )
if (success != VLC_SUCCESS)
aout_lost++;
- vlc_fifo_Unlock(p_owner->p_fifo);
-
decoder_Notify(p_owner, on_new_audio_stats, 1, aout_lost, played);
+ vlc_fifo_Unlock(p_owner->p_fifo);
}
static void ModuleThread_PlaySpu( vlc_input_decoder_t *p_owner, subpicture_t *p_subpic )
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/c6c4fb85305760e2b65cba64f98133bde95f0f58
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/c6c4fb85305760e2b65cba64f98133bde95f0f58
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list