[vlc-devel] [PATCHv2 11/13] input/input: load slaves from input items

Thomas Guillem thomas at gllm.fr
Tue May 3 19:02:38 CEST 2016


From: Benjamin Adolphi <b.adolphi at gmail.com>

Also-by: Thomas Guillem <thomas at gllm.fr>

Signed-off-by: Thomas Guillem <thomas at gllm.fr>
---
 src/input/input.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 49 insertions(+), 7 deletions(-)

diff --git a/src/input/input.c b/src/input/input.c
index 49337ba..26e4ff7 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -1005,6 +1005,18 @@ static void SlaveSort( input_item_slave **pp_slaves, int i_slaves )
     qsort( pp_slaves, i_slaves, sizeof(input_item_slave*), SlaveCompare );
 }
 
+static bool SlaveExists( input_item_slave **pp_slaves, int i_slaves,
+                         const char *psz_uri)
+{
+    for( int i = 0; i < i_slaves; i++ )
+    {
+        if( pp_slaves[i] != NULL
+         && !strcmp( pp_slaves[i]->psz_uri, psz_uri ) )
+            return true;
+    }
+    return false;
+}
+
 static void SetSubtitlesOptions( input_thread_t *p_input )
 {
     /* Get fps and set it if not already set */
@@ -1028,9 +1040,9 @@ static void SetSubtitlesOptions( input_thread_t *p_input )
         var_SetInteger( p_input, "spu-delay", (mtime_t)i_delay * 100000 );
 }
 
-static void LoadSubtitles( input_thread_t *p_input )
+static void LoadSlaves( input_thread_t *p_input )
 {
-    /* Look for and add subtitle files */
+    /* Look for and add slaves */
 
     char *psz_subtitle = var_GetNonEmptyString( p_input, "sub-file" );
     if( psz_subtitle != NULL )
@@ -1071,14 +1083,44 @@ static void LoadSubtitles( input_thread_t *p_input )
         }
         free( psz_autopath );
 
+        /* Add subtitles found by the directory demuxer */
+        vlc_mutex_lock( &p_input->p->p_item->lock );
+        input_item_t *p_item = p_input->p->p_item;
+        for( int i = 0; i < p_item->i_slaves; i++ )
+        {
+            input_item_slave *p_slave = p_item->pp_slaves[i];
+            if( !SlaveExists( pp_slaves, i_slaves, p_slave->psz_uri )
+             && ( !psz_subtitle || strcmp( psz_subtitle, p_slave->psz_uri ) ) )
+            {
+                input_item_slave *p_sub = input_item_slave_New( p_slave->psz_uri,
+                                                                p_slave->i_type,
+                                                                p_slave->i_priority );
+                if( p_sub )
+                    INSERT_ELEM( pp_slaves, i_slaves, i_slaves, p_sub );
+            }
+        }
+        vlc_mutex_unlock( &p_input->p->p_item->lock );
+
         SlaveSort( pp_slaves, i_slaves );
 
         /* add all detected subtitles */
         for( int i = 0; i < i_slaves && pp_slaves[i] != NULL; i++ )
         {
-            const char *psz_uri = pp_slaves[i]->psz_uri;
-            input_SubtitleAdd( p_input, psz_uri, SUB_CANFAIL );
-
+            input_item_slave *p_slave = pp_slaves[i];
+            if( p_slave->i_type == SLAVE_TYPE_SPU )
+            {
+                msg_Err( p_input, "Loading spu slave: %s", p_slave->psz_uri );
+                input_SubtitleAdd( p_input, p_slave->psz_uri, SUB_CANFAIL );
+            }
+            else
+            {
+                msg_Err( p_input, "Loading slave: %s", p_slave->psz_uri );
+                input_source_t *p_source = InputSourceNew( p_input,
+                                                           p_slave->psz_uri,
+                                                           NULL, true );
+                if( p_source )
+                    TAB_APPEND( p_input->p->i_slave, p_input->p->slave, p_source );
+            }
             input_item_slave_Delete( pp_slaves[i] );
         }
 
@@ -1125,7 +1167,7 @@ static void LoadSubtitles( input_thread_t *p_input )
         var_Destroy( p_input, "sub-description" );
 }
 
-static void LoadSlaves( input_thread_t *p_input )
+static void LoadVarSlaves( input_thread_t *p_input )
 {
     char *psz = var_GetNonEmptyString( p_input, "input-slave" );
     if( !psz )
@@ -1297,8 +1339,8 @@ static int Init( input_thread_t * p_input )
     {
         StartTitle( p_input );
         SetSubtitlesOptions( p_input );
-        LoadSubtitles( p_input );
         LoadSlaves( p_input );
+        LoadVarSlaves( p_input );
         InitPrograms( p_input );
 
         double f_rate = var_InheritFloat( p_input, "rate" );
-- 
2.8.0.rc3



More information about the vlc-devel mailing list