[vlc-devel] [RFC PATCH 2/2] decoder: fallback to a next module on error

Thomas Guillem thomas at gllm.fr
Fri Apr 8 16:44:43 CEST 2016


---
 src/input/decoder.c | 39 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 5 deletions(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index a1d7414..a9375b0 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -125,6 +125,9 @@ struct decoder_owner_sys_t
 
     /* Delay */
     mtime_t i_ts_delay;
+
+    module_t **pp_tested_modules;
+    int        i_tested_modules;
 };
 
 /* Pictures which are DECODER_BOGUS_VIDEO_DELAY or more in advance probably have
@@ -140,6 +143,8 @@ struct decoder_owner_sys_t
 static int LoadDecoder( decoder_t *p_dec, bool b_packetizer,
                         const es_format_t *restrict p_fmt )
 {
+    decoder_owner_sys_t *p_owner = p_dec->p_owner;
+
     p_dec->b_frame_drop_allowed = true;
     p_dec->i_extra_picture_buffers = 0;
 
@@ -155,9 +160,13 @@ static int LoadDecoder( decoder_t *p_dec, bool b_packetizer,
 
     /* Find a suitable decoder/packetizer module */
     if( !b_packetizer )
-        p_dec->p_module = module_need( p_dec, "decoder", "$codec", false );
+        p_dec->p_module = module_need_ignored( p_dec, "decoder", "$codec", false,
+                                               p_owner->pp_tested_modules,
+                                               p_owner->i_tested_modules  );
     else
-        p_dec->p_module = module_need( p_dec, "packetizer", "$packetizer", false );
+        p_dec->p_module = module_need_ignored( p_dec, "packetizer", "$packetizer", false,
+                                               p_owner->pp_tested_modules,
+                                               p_owner->i_tested_modules  );
 
     if( !p_dec->p_module )
     {
@@ -165,7 +174,12 @@ static int LoadDecoder( decoder_t *p_dec, bool b_packetizer,
         return -1;
     }
     else
+    {
+        TAB_APPEND( p_owner->i_tested_modules, p_owner->pp_tested_modules,
+                    p_dec->p_module );
         return 0;
+
+    }
 }
 
 /**
@@ -1315,9 +1329,20 @@ static void DecoderProcess( decoder_t *p_dec, block_t *p_block )
 
     if( p_dec->b_error )
     {
-        if( p_block )
-            block_Release( p_block );
-        return;
+        if( p_dec->p_module != NULL )
+        {
+            es_format_t fmt;
+            es_format_Copy( &fmt, &p_dec->fmt_in );
+            UnloadDecoder( p_dec );
+            LoadDecoder( p_dec, false, &fmt );
+        }
+
+        if( p_dec->p_module == NULL )
+        {
+            if( p_block )
+                block_Release( p_block );
+            return;
+        }
     }
 
     if( p_block && p_block->i_buffer <= 0 )
@@ -1588,6 +1613,8 @@ static decoder_t * CreateDecoder( vlc_object_t *p_parent,
         return NULL;
     }
 
+    TAB_INIT( p_owner->i_tested_modules, p_owner->pp_tested_modules );
+
     vlc_mutex_init( &p_owner->lock );
     vlc_cond_init( &p_owner->wait_request );
     vlc_cond_init( &p_owner->wait_acknowledge );
@@ -1745,6 +1772,8 @@ static void DeleteDecoder( decoder_t * p_dec )
     vlc_cond_destroy( &p_owner->wait_request );
     vlc_mutex_destroy( &p_owner->lock );
 
+    TAB_CLEAN( p_owner->i_tested_modules, p_owner->pp_tested_modules );
+
     vlc_object_release( p_dec );
 
     free( p_owner );
-- 
2.8.0.rc3



More information about the vlc-devel mailing list