[vlc-devel] [PATCH 07/11] input/input: move .sub/.idx/.cdg check

Thomas Guillem thomas at gllm.fr
Fri Apr 1 10:31:06 CEST 2016


This check can now be used for slaves coming from the demuxer.
---
 src/input/input.c     | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/input/subtitles.c | 46 ---------------------------------------
 2 files changed, 59 insertions(+), 47 deletions(-)

diff --git a/src/input/input.c b/src/input/input.c
index 4d4222e..cb47d94 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -947,6 +947,64 @@ static int SlaveCompare(const void *a, const void *b)
 #endif
 }
 
+static void SlaveSort( input_item_slave **pp_slaves, int i_slaves )
+{
+    for( int i = 0; i < i_slaves; i++ )
+    {
+        input_item_slave *p_slave = pp_slaves[i];
+
+        if( p_slave == NULL || p_slave->i_type != SLAVE_TYPE_SPU )
+            continue;
+
+        bool b_reject = false;
+        char *psz_ext = strrchr( p_slave->psz_uri, '.' );
+        if( !psz_ext )
+            continue;
+        psz_ext++;
+
+        if( !strcasecmp( psz_ext, "sub" ) )
+        {
+            /* Drop .sub slaves if a .idx exists */
+            for( int j = 0; j < i_slaves; j++ )
+            {
+                input_item_slave *p_sub_inner = pp_slaves[j];
+
+                if( p_sub_inner == NULL )
+                    continue;
+
+                /* check that the filenames without extension match */
+                if( strncasecmp( p_slave->psz_uri, p_sub_inner->psz_uri,
+                    strlen( p_slave->psz_uri ) - 3 ) )
+                    continue;
+
+                char *psz_ext_inner = strrchr( p_sub_inner->psz_uri, '.' );
+                if( !psz_ext_inner )
+                    continue;
+                psz_ext_inner++;
+
+                /* check that we have an idx file */
+                if( !strcasecmp( psz_ext_inner, "idx" ) )
+                {
+                    b_reject = true;
+                    break;
+                }
+            }
+        }
+        else if( !strcasecmp( psz_ext, "cdg" ) )
+        {
+            if( p_slave->i_priority < SLAVE_PRIORITY_MATCH_ALL )
+                b_reject = true;
+        }
+        if( b_reject )
+        {
+            pp_slaves[i] = NULL;
+            input_item_slave_Delete( p_slave );
+        }
+    }
+
+    qsort( pp_slaves, i_slaves, sizeof(input_item_slave*), SlaveCompare );
+}
+
 static void LoadSubtitles( input_thread_t *p_input )
 {
     /* Load subtitles */
@@ -1047,7 +1105,7 @@ static void LoadSubtitles( input_thread_t *p_input )
         }
         vlc_mutex_unlock( &p_input->p->p_item->lock );
 
-        qsort( pp_slaves, i_slaves, sizeof(input_item_slave*), SlaveCompare );
+        SlaveSort( pp_slaves, i_slaves );
 
         /* add all detected subtitles */
         for( int i = 0; i < i_slaves && pp_slaves[i] != NULL; i++ )
diff --git a/src/input/subtitles.c b/src/input/subtitles.c
index 8790af2..b4fc5b1 100644
--- a/src/input/subtitles.c
+++ b/src/input/subtitles.c
@@ -351,52 +351,6 @@ int subtitles_Detect( input_thread_t *p_this, char *psz_path, const char *psz_na
     free( f_fname_noext );
     free( psz_fname );
 
-    for( int i = 0; i < i_slaves; i++ )
-    {
-        input_item_slave *p_sub = pp_slaves[i];
-
-        bool b_reject = false;
-        char *psz_ext = strrchr( p_sub->psz_uri, '.' );
-        if( !psz_ext )
-            continue;
-        psz_ext++;
-
-        if( !strcasecmp( psz_ext, "sub" ) )
-        {
-            for( int j = 0; j < i_slaves; j++ )
-            {
-                input_item_slave *p_sub_inner = pp_slaves[j];
-
-                /* check that the filenames without extension match */
-                if( strncasecmp( p_sub->psz_uri, p_sub_inner->psz_uri,
-                    strlen( p_sub->psz_uri ) - 3 ) )
-                    continue;
-
-                char *psz_ext_inner = strrchr( p_sub_inner->psz_uri, '.' );
-                if( !psz_ext_inner )
-                    continue;
-                psz_ext_inner++;
-
-                /* check that we have an idx file */
-                if( !strcasecmp( psz_ext_inner, "idx" ) )
-                {
-                    b_reject = true;
-                    break;
-                }
-            }
-        }
-        else if( !strcasecmp( psz_ext, "cdg" ) )
-        {
-            if( p_sub->i_priority < SLAVE_PRIORITY_MATCH_ALL )
-                b_reject = true;
-        }
-        if( b_reject )
-        {
-            pp_slaves[i] = NULL;
-            input_item_slave_Delete( p_sub );
-        }
-    }
-
     *ppp_slaves = pp_slaves; /* in case of realloc */
     *p_slaves = i_slaves;
     return VLC_SUCCESS;
-- 
2.8.0.rc3



More information about the vlc-devel mailing list