Commit 23f6c1e3 authored by Laurent Aimar's avatar Laurent Aimar

Avoid a deadlock when a decoder is in error.

parent 5a55a589
...@@ -54,7 +54,8 @@ static decoder_t *CreateDecoder( input_thread_t *, es_format_t *, int, sout_inst ...@@ -54,7 +54,8 @@ static decoder_t *CreateDecoder( input_thread_t *, es_format_t *, int, sout_inst
static void DeleteDecoder( decoder_t * ); static void DeleteDecoder( decoder_t * );
static void *DecoderThread( vlc_object_t * ); static void *DecoderThread( vlc_object_t * );
static int DecoderProcess( decoder_t *, block_t * ); static void DecoderProcess( decoder_t *, block_t * );
static void DecoderError( decoder_t *p_dec, block_t *p_block );
static void DecoderOutputChangePause( decoder_t *, bool b_paused, mtime_t i_date ); static void DecoderOutputChangePause( decoder_t *, bool b_paused, mtime_t i_date );
static void DecoderFlush( decoder_t * ); static void DecoderFlush( decoder_t * );
static void DecoderSignalBuffering( decoder_t *, bool ); static void DecoderSignalBuffering( decoder_t *, bool );
...@@ -828,10 +829,14 @@ static void *DecoderThread( vlc_object_t *p_this ) ...@@ -828,10 +829,14 @@ static void *DecoderThread( vlc_object_t *p_this )
if( p_block ) if( p_block )
{ {
int canc = vlc_savecancel();
if( p_dec->b_error ) if( p_dec->b_error )
block_Release( p_block ); DecoderError( p_dec, p_block );
else else
DecoderProcess( p_dec, p_block ); DecoderProcess( p_dec, p_block );
vlc_restorecancel( canc );
} }
} }
...@@ -1860,6 +1865,17 @@ static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block, bool b_flush ...@@ -1860,6 +1865,17 @@ static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block, bool b_flush
} }
} }
/* */
static void DecoderProcessOnFlush( decoder_t *p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_mutex_lock( &p_owner->lock );
DecoderFlushBuffering( p_dec );
vlc_mutex_unlock( &p_owner->lock );
DecoderSignalFlushed( p_dec );
}
/** /**
* Decode a block * Decode a block
* *
...@@ -1867,7 +1883,7 @@ static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block, bool b_flush ...@@ -1867,7 +1883,7 @@ static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block, bool b_flush
* \param p_block the block to decode * \param p_block the block to decode
* \return VLC_SUCCESS or an error code * \return VLC_SUCCESS or an error code
*/ */
static int DecoderProcess( decoder_t *p_dec, block_t *p_block ) static void DecoderProcess( decoder_t *p_dec, block_t *p_block )
{ {
decoder_owner_sys_t *p_owner = (decoder_owner_sys_t *)p_dec->p_owner; decoder_owner_sys_t *p_owner = (decoder_owner_sys_t *)p_dec->p_owner;
const bool b_flush_request = p_block && (p_block->i_flags & BLOCK_FLAG_CORE_FLUSH); const bool b_flush_request = p_block && (p_block->i_flags & BLOCK_FLAG_CORE_FLUSH);
...@@ -1876,10 +1892,9 @@ static int DecoderProcess( decoder_t *p_dec, block_t *p_block ) ...@@ -1876,10 +1892,9 @@ static int DecoderProcess( decoder_t *p_dec, block_t *p_block )
{ {
assert( !b_flush_request ); assert( !b_flush_request );
block_Release( p_block ); block_Release( p_block );
return VLC_SUCCESS; return;
} }
int canc = vlc_savecancel();
#ifdef ENABLE_SOUT #ifdef ENABLE_SOUT
if( p_dec->i_object_type == VLC_OBJECT_PACKETIZER ) if( p_dec->i_object_type == VLC_OBJECT_PACKETIZER )
{ {
...@@ -1924,18 +1939,22 @@ static int DecoderProcess( decoder_t *p_dec, block_t *p_block ) ...@@ -1924,18 +1939,22 @@ static int DecoderProcess( decoder_t *p_dec, block_t *p_block )
/* */ /* */
if( b_flush_request ) if( b_flush_request )
{ DecoderProcessOnFlush( p_dec );
vlc_mutex_lock( &p_owner->lock ); }
DecoderFlushBuffering( p_dec );
vlc_mutex_unlock( &p_owner->lock );
DecoderSignalFlushed( p_dec ); static void DecoderError( decoder_t *p_dec, block_t *p_block )
} {
vlc_restorecancel( canc ); const bool b_flush_request = p_block && (p_block->i_flags & BLOCK_FLAG_CORE_FLUSH);
/* */
if( p_block )
block_Release( p_block );
return p_dec->b_error ? VLC_EGENERIC : VLC_SUCCESS; if( b_flush_request )
DecoderProcessOnFlush( p_dec );
} }
/** /**
* Destroys a decoder object * Destroys a decoder object
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment