[vlc-devel] [PATCH] decoder: reset the deleted vout on lock and release it outside of variable lock
Steve Lhomme
robux4 at ycbcr.xyz
Tue Sep 3 11:32:04 CEST 2019
- on_vout_deleted() was and is not called under lock
- vout_UnregisterSubpictureChannel() is not called under lock anymore (in some
cases it's called without the variable lock)
- vout_Release() is not called under lock anymore (in many cases it's called
without the variable lock)
---
src/input/decoder.c | 24 ++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 5bd59fc6b0..51defd973e 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -610,19 +610,23 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec,
if( !p_vout )
{
msg_Warn( p_dec, "no vout found, dropping subpicture" );
- if( p_owner->p_vout )
+ vlc_mutex_lock( &p_owner->lock );
+ vout_thread_t *p_deleted_vout = p_owner->p_vout;
+ ssize_t i_deleted_spu_channel = p_owner->i_spu_channel;
+
+ p_owner->p_vout = NULL;
+ p_owner->i_spu_channel = VOUT_SPU_CHANNEL_INVALID;
+ vlc_mutex_unlock( &p_owner->lock );
+
+ if( p_deleted_vout )
{
- assert(p_owner->i_spu_channel != VOUT_SPU_CHANNEL_INVALID);
- decoder_Notify(p_owner, on_vout_deleted, p_owner->p_vout);
+ assert(i_deleted_spu_channel != VOUT_SPU_CHANNEL_INVALID);
+ decoder_Notify(p_owner, on_vout_deleted, p_deleted_vout);
- vlc_mutex_lock( &p_owner->lock );
- vout_UnregisterSubpictureChannel(p_owner->p_vout,
- p_owner->i_spu_channel);
- p_owner->i_spu_channel = VOUT_SPU_CHANNEL_INVALID;
+ vout_UnregisterSubpictureChannel(p_deleted_vout,
+ i_deleted_spu_channel);
- vout_Release(p_owner->p_vout);
- p_owner->p_vout = NULL;
- vlc_mutex_unlock( &p_owner->lock );
+ vout_Release(p_deleted_vout);
}
return NULL;
}
--
2.17.1
More information about the vlc-devel
mailing list