diff -rupN vlc-2.1.5/src/input/decoder.c vlc-2.1.5-new/src/input/decoder.c --- vlc-2.1.5/src/input/decoder.c 2014-06-25 09:02:17.000000000 -0400 +++ vlc-2.1.5-new/src/input/decoder.c 2014-07-14 13:33:47.000000000 -0400 @@ -1133,11 +1133,10 @@ static void DecoderWaitDate( decoder_t * { decoder_owner_sys_t *p_owner = p_dec->p_owner; - vlc_assert_locked( &p_owner->lock ); - if( *pb_reject || i_deadline < 0 ) return; + vlc_mutex_lock( &p_owner->lock ); do { if( p_owner->b_flushing || p_owner->b_exit ) @@ -1148,6 +1147,7 @@ static void DecoderWaitDate( decoder_t * } while( vlc_cond_timedwait( &p_owner->wait_request, &p_owner->lock, i_deadline ) == 0 ); + vlc_mutex_unlock( &p_owner->lock ); } static void DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio, @@ -1212,6 +1212,8 @@ static void DecoderPlayAudio( decoder_t DecoderFixTs( p_dec, &p_audio->i_pts, NULL, &p_audio->i_length, &i_rate, AOUT_MAX_ADVANCE_TIME ); + + vlc_mutex_unlock( &p_owner->lock ); if( p_audio->i_pts <= VLC_TS_INVALID || i_rate < INPUT_RATE_DEFAULT/AOUT_MAX_INPUT_RATE @@ -1228,7 +1230,6 @@ static void DecoderPlayAudio( decoder_t if( !b_reject ) { - assert( !p_owner->b_paused ); if( !aout_DecPlay( p_aout, p_audio, i_rate ) ) *pi_played_sum += 1; *pi_lost_sum += aout_DecGetResetLost( p_aout ); @@ -1241,7 +1242,9 @@ static void DecoderPlayAudio( decoder_t } if( !b_has_more ) - break; + return; + + vlc_mutex_lock( &p_owner->lock ); if( !p_owner->buffer.p_audio ) break; } @@ -1587,12 +1590,13 @@ static void DecoderPlaySpu( decoder_t *p DecoderFixTs( p_dec, &p_subpic->i_start, &p_subpic->i_stop, NULL, NULL, INT64_MAX ); + vlc_mutex_unlock( &p_owner->lock ); + if( p_subpic->i_start <= VLC_TS_INVALID ) b_reject = true; DecoderWaitDate( p_dec, &b_reject, p_subpic->i_start - SPU_MAX_PREPARE_TIME ); - vlc_mutex_unlock( &p_owner->lock ); if( !b_reject ) vout_PutSubpicture( p_vout, p_subpic );