[vlc-commits] decoder: reload module if aout changed or failed
Thomas Guillem
git at videolan.org
Thu Jul 28 09:04:36 CEST 2016
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Jul 27 17:08:37 2016 +0200| [d904495ac17b838865d33ba80c02a98148594b51] | committer: Thomas Guillem
decoder: reload module if aout changed or failed
Mainly in order to be able to change from S/PDIF to PCM since there is no S/PDIF
converter anymore. This is also possible to change from PCM to S/PDIF.
We can't reload directly from DecoderPlayAudio since this function may be
called from a running asynchronous decoder.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d904495ac17b838865d33ba80c02a98148594b51
---
src/input/decoder.c | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 21f822a..eafc065 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -215,6 +215,23 @@ static int ReloadDecoder( decoder_t *p_dec, bool b_packetizer,
/* Restart the decoder module */
UnloadDecoder( p_dec );
+
+ if( reload == RELOAD_DECODER_AOUT )
+ {
+ decoder_owner_sys_t *p_owner = p_dec->p_owner;
+ assert( p_owner->fmt.i_cat == AUDIO_ES );
+ audio_output_t *p_aout = p_owner->p_aout;
+
+ vlc_mutex_lock( &p_owner->lock );
+ p_owner->p_aout = NULL;
+ vlc_mutex_unlock( &p_owner->lock );
+ if( p_aout )
+ {
+ aout_DecDelete( p_aout );
+ input_resource_PutAout( p_owner->p_resource, p_aout );
+ }
+ }
+
if( LoadDecoder( p_dec, b_packetizer, &fmt_in ) )
{
p_dec->b_error = true;
@@ -1146,7 +1163,19 @@ static int DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio,
&& i_rate <= INPUT_RATE_DEFAULT*AOUT_MAX_INPUT_RATE
&& !DecoderTimedWait( p_dec, p_audio->i_pts - AOUT_MAX_PREPARE_TIME ) )
{
- aout_DecPlay( p_aout, p_audio, i_rate );
+ int status = aout_DecPlay( p_aout, p_audio, i_rate );
+ if( status == AOUT_DEC_CHANGED )
+ {
+ /* Only reload the decoder */
+ decoder_RequestReload( p_dec );
+ }
+ else if( status == AOUT_DEC_FAILED )
+ {
+ /* If we reload because the aout failed, we should release it. That
+ * way, a next call to aout_update_format() won't re-use the
+ * previous (failing) aout but will try to create a new one. */
+ atomic_store( &p_owner->reload, RELOAD_DECODER_AOUT );
+ }
}
else
{
More information about the vlc-commits
mailing list