[vlc-devel] [PATCH 4/5] decoder: add a way to try an other decoder module
Thomas Guillem
thomas at gllm.fr
Wed Jun 3 17:35:44 CEST 2015
if p-dec->b_try_next is set to true, the current module will be unloaded and a
next one will be tried.
---
include/vlc_codec.h | 1 +
src/input/decoder.c | 19 +++++++++++++++----
2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/include/vlc_codec.h b/include/vlc_codec.h
index 8f6f46a..197bda7 100644
--- a/include/vlc_codec.h
+++ b/include/vlc_codec.h
@@ -128,6 +128,7 @@ struct decoder_t
decoder_owner_sys_t *p_owner;
bool b_error;
+ bool b_try_next;
};
/**
diff --git a/src/input/decoder.c b/src/input/decoder.c
index e922589..7d47d40 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -1404,9 +1404,11 @@ static int CreateDecoderModule( decoder_t *p_dec )
/* Find a suitable decoder/packetizer module */
if( !p_owner->b_packetizer )
- p_dec->p_module = module_need( p_dec, "decoder", "$codec", false );
+ p_dec->p_module = module_need_next( p_dec, "decoder", "$codec",
+ false, p_dec->p_module );
else
- p_dec->p_module = module_need( p_dec, "packetizer", "$packetizer", false );
+ p_dec->p_module = module_need_next( p_dec, "packetizer", "$packetizer",
+ false, p_dec->p_module );
if (!p_dec->p_module)
return VLC_EGENERIC;
@@ -1479,6 +1481,9 @@ static void DeleteDecoderModule( decoder_t *p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
+ if( p_dec->p_module )
+ module_unneed( p_dec, p_dec->p_module );
+
/* Cleanup */
if( p_owner->p_aout )
{
@@ -1580,6 +1585,14 @@ static void *DecoderThread( void *p_data )
int canc = vlc_savecancel();
DecoderProcess( p_dec, p_block );
+ if ( p_dec->b_try_next )
+ {
+ p_dec->b_try_next = false;
+ DeleteDecoderModule( p_dec );
+ if( CreateDecoderModule( p_dec ) != VLC_SUCCESS )
+ p_dec->b_error = true;
+ }
+
vlc_mutex_lock( &p_owner->lock );
if( p_block == NULL )
{ /* Draining: the decoder is drained and all decoded buffers are
@@ -1855,8 +1868,6 @@ void input_DecoderDelete( decoder_t *p_dec )
vlc_join( p_owner->thread, NULL );
- module_unneed( p_dec, p_dec->p_module );
-
/* */
if( p_dec->p_owner->cc.b_supported )
{
--
2.1.4
More information about the vlc-devel
mailing list