[vlc-devel] [PATCH] decoder: add an assert to make sure decoders serialize calls in a single thread
Steve Lhomme
robux4 at ycbcr.xyz
Wed Sep 4 12:24:19 CEST 2019
---
src/input/decoder.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index aa7d45dde6c..5f37d5f8e5d 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -105,6 +105,10 @@ struct decoder_owner
audio_output_t *p_aout;
vout_thread_t *p_vout;
+#ifndef NDEBUG
+ unsigned long aout_thread_id;
+ unsigned long vout_thread_id;
+#endif
/* -- Theses variables need locking on read *and* write -- */
/* Preroll */
@@ -215,6 +219,10 @@ static int ReloadDecoder( struct decoder_owner *p_owner, bool b_packetizer,
/* Restart the decoder module */
decoder_Clean( p_dec );
+#ifndef NDEBUG
+ p_owner->aout_thread_id = -1;
+ p_owner->vout_thread_id = -1;
+#endif
p_owner->error = false;
if( reload == RELOAD_DECODER_AOUT )
@@ -234,6 +242,10 @@ static int ReloadDecoder( struct decoder_owner *p_owner, bool b_packetizer,
if( LoadDecoder( p_dec, b_packetizer, &fmt_in ) )
{
+#ifndef NDEBUG
+ p_owner->aout_thread_id = -1;
+ p_owner->vout_thread_id = -1;
+#endif
p_owner->error = true;
es_format_Clean( &fmt_in );
return VLC_EGENERIC;
@@ -296,6 +308,13 @@ static int aout_update_format( decoder_t *p_dec )
{
struct decoder_owner *p_owner = dec_get_owner( p_dec );
+#ifndef NDEBUG
+ if (p_owner->aout_thread_id == -1)
+ p_owner->aout_thread_id = vlc_thread_id();
+ else
+ assert(p_owner->aout_thread_id == vlc_thread_id());
+#endif
+
if( p_owner->p_aout &&
( !AOUT_FMTS_IDENTICAL(&p_dec->fmt_out.audio, &p_owner->fmt.audio) ||
p_dec->fmt_out.i_codec != p_dec->fmt_out.audio.i_format ||
@@ -390,6 +409,13 @@ static int vout_update_format( decoder_t *p_dec )
bool need_vout = false;
bool need_format_update = false;
+#ifndef NDEBUG
+ if (p_owner->vout_thread_id == -1)
+ p_owner->vout_thread_id = vlc_thread_id();
+ else
+ assert(p_owner->vout_thread_id == vlc_thread_id());
+#endif
+
if( p_owner->p_vout == NULL )
{
msg_Dbg(p_dec, "vout: none found");
@@ -1760,6 +1786,10 @@ static struct decoder_owner * CreateDecoder( vlc_object_t *p_parent,
p_owner->cbs_userdata = cbs_userdata;
p_owner->p_aout = NULL;
p_owner->p_vout = NULL;
+#ifndef NDEBUG
+ p_owner->aout_thread_id = -1;
+ p_owner->vout_thread_id = -1;
+#endif
p_owner->i_spu_channel = VOUT_SPU_CHANNEL_INVALID;
p_owner->i_spu_order = 0;
p_owner->p_sout = p_sout;
@@ -1901,6 +1931,11 @@ static void DeleteDecoder( decoder_t * p_dec )
const enum es_format_category_e i_cat =p_dec->fmt_in.i_cat;
decoder_Clean( p_dec );
+#ifndef NDEBUG
+ p_owner->vout_thread_id = -1;
+ p_owner->aout_thread_id = -1;
+#endif
+
/* Free all packets still in the decoder fifo. */
block_FifoRelease( p_owner->p_fifo );
--
2.17.1
More information about the vlc-devel
mailing list