--- src/input/decoder.c.orig 2014-11-17 02:57:59.000000000 +0800 +++ src/input/decoder.c 2015-12-14 11:02:12.905647943 +0800 @@ -1145,8 +1145,6 @@ } /* */ - vlc_mutex_lock( &p_owner->lock ); - if( p_audio && p_owner->b_waiting ) { p_owner->b_has_data = true; @@ -1177,6 +1175,7 @@ DecoderWaitDate( p_dec, &b_reject, p_audio->i_pts - AOUT_MAX_PREPARE_TIME ); + vlc_mutex_unlock( &p_owner->lock ); if( unlikely(p_owner->b_paused != b_paused) ) continue; /* race with input thread? retry... */ @@ -1199,7 +1198,6 @@ break; } - vlc_mutex_unlock( &p_owner->lock ); } static void DecoderDecodeAudio( decoder_t *p_dec, block_t *p_block ) @@ -1961,11 +1959,10 @@ /* Parameters changed, restart the aout */ vlc_mutex_lock( &p_owner->lock ); - - aout_DecDelete( p_owner->p_aout ); p_owner->p_aout = NULL; - vlc_mutex_unlock( &p_owner->lock ); + aout_DecDelete( p_owner->p_aout ); + input_resource_PutAout( p_owner->p_resource, p_aout ); } @@ -2014,7 +2011,6 @@ } vlc_mutex_lock( &p_owner->lock ); - p_owner->p_aout = p_aout; DecoderUpdateFormatLocked( p_dec ); if( unlikely(p_owner->b_paused) && p_aout != NULL )