[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