[vlc-commits] input: item: fix false positives when matching slaves

Thomas Guillem git at videolan.org
Mon Nov 6 15:54:47 CET 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Mon Nov  6 15:39:07 2017 +0100| [aa4c7ce7952252d0196cb539b582313ca3f93d99] | committer: Thomas Guillem

input: item: fix false positives when matching slaves

 - don't match 2 possible slaves between each others
 - The slave name len should not be twice longer than the item name len.
   (avoid matching "2016 - blabla.aac" with "20.mkv" for example)

The matching algorithm is still quite dumb and far from perfect. We should
detect item as slaves only if they have a language indication in their path
name.

Fixes #18913

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=aa4c7ce7952252d0196cb539b582313ca3f93d99
---

 src/input/item.c                                   | 11 +++++
 test/libvlc/slaves.c                               | 53 +++++++++++++++++-----
 test/samples/slaves/{left-test.srt => lt-test.srt} |  0
 test/samples/slaves/{test-right.srt => t.mp4}      |  0
 test/samples/slaves/test.rt.srt                    |  0
 5 files changed, 52 insertions(+), 12 deletions(-)

diff --git a/src/input/item.c b/src/input/item.c
index 0327e21f03..11cfccf8f7 100644
--- a/src/input/item.c
+++ b/src/input/item.c
@@ -1456,6 +1456,13 @@ static uint8_t rdh_get_slave_priority(input_item_t *p_item,
     if (!psz_item_name || !psz_slave_name)
         goto done;
 
+    size_t i_item_len = strlen(psz_item_name);
+    size_t i_slave_len = strlen(psz_slave_name);
+
+    /* The slave name len should not be twice longer than the item name len. */
+    if (i_item_len > i_slave_len || i_slave_len > 2 * i_item_len)
+        goto done;
+
     /* check if the names match exactly */
     if (!strcmp(psz_item_name, psz_slave_name))
     {
@@ -1546,6 +1553,10 @@ static void rdh_attach_slaves(struct vlc_readdir_helper *p_rdh,
         input_item_node_t *p_node = p_parent_node->pp_children[i];
         input_item_t *p_item = p_node->p_item;
 
+        enum slave_type unused;
+        if (input_item_slave_GetType(p_item->psz_name, &unused))
+            continue; /* don't match 2 possible slaves between each others */
+
         for (size_t j = 0; j < p_rdh->i_slaves; j++)
         {
             struct rdh_slave *p_rdh_slave = p_rdh->pp_slaves[j];
diff --git a/test/libvlc/slaves.c b/test/libvlc/slaves.c
index e36e301d6c..7b2c24fa43 100644
--- a/test/libvlc/slaves.c
+++ b/test/libvlc/slaves.c
@@ -24,7 +24,6 @@
 #include <vlc_threads.h>
 
 #define SLAVES_DIR SRCDIR "/samples/slaves"
-#define MAIN_MEDIA_PATH SLAVES_DIR "/test.mp4"
 
 static void
 finished_event(const libvlc_event_t *p_ev, void *p_data)
@@ -106,6 +105,7 @@ test_expected_slaves(libvlc_media_t *p_m,
 
 static void
 test_media_has_slaves_from_parent(libvlc_instance_t *p_vlc,
+                                  const char *psz_main_media,
                                   libvlc_media_slave_t *p_expected_slaves,
                                   unsigned i_expected_slaves)
 {
@@ -115,7 +115,7 @@ test_media_has_slaves_from_parent(libvlc_instance_t *p_vlc,
     printf("Parse media dir to get subitems\n");
     media_parse_sync(p_m);
 
-    char *psz_main_media_mrl = path_to_mrl(p_vlc, MAIN_MEDIA_PATH);
+    char *psz_main_media_mrl = path_to_mrl(p_vlc, psz_main_media);
     assert(psz_main_media_mrl != NULL);
     printf("Main media mrl: '%s'\n", psz_main_media_mrl);
 
@@ -159,17 +159,17 @@ main (void)
     test_init();
 
     const char *pp_slave_paths[] = {
-        SLAVES_DIR "/nomatch.srt",
-        SLAVES_DIR "/left-test.srt",
-        SLAVES_DIR "/test-right.srt",
         SLAVES_DIR "/test.aac",
+        SLAVES_DIR "/test.rt.srt",
+        SLAVES_DIR "/lt-test.srt",
+        SLAVES_DIR "/nomatch.srt",
     };
 
     libvlc_media_slave_t p_expected_slaves[] = {
-        { NULL, libvlc_media_slave_type_subtitle, 0 /* none */ },
-        { NULL, libvlc_media_slave_type_subtitle, 1 /* left */ },
-        { NULL, libvlc_media_slave_type_subtitle, 2 /* right */ },
         { NULL, libvlc_media_slave_type_audio, 3 /* all */ },
+        { NULL, libvlc_media_slave_type_subtitle, 2 /* right */ },
+        { NULL, libvlc_media_slave_type_subtitle, 1 /* left */ },
+        { NULL, libvlc_media_slave_type_subtitle, 0 /* none */ },
     };
 
     #define EXPECTED_SLAVES_COUNT (sizeof(p_expected_slaves) / sizeof(*p_expected_slaves))
@@ -194,16 +194,45 @@ main (void)
         assert(p_expected_slaves[i].psz_uri != NULL);
     }
 
-    printf("== Test if a media has slaves from its parent ==\n");
-    test_media_has_slaves_from_parent(p_vlc, p_expected_slaves,
+    printf("== Testing --sub-autodetect-fuzzy 1 (everything) ==\n");
+    test_media_has_slaves_from_parent(p_vlc, SLAVES_DIR "/test.mp4",
+                                      p_expected_slaves,
                                       EXPECTED_SLAVES_COUNT);
     libvlc_release(p_vlc);
 
-    printf("== Test if a media doesn't have slaves from its parent ==\n");
+    printf("== Testing --sub-autodetect-fuzzy 2 (full, left, and right match) ==\n");
+    pp_args[2] = "2";
+    p_vlc = libvlc_new(ARGC - 1, pp_args);
+    assert(p_vlc != NULL);
+    test_media_has_slaves_from_parent(p_vlc, SLAVES_DIR "/test.mp4",
+                                      p_expected_slaves, 3);
+
+    printf("== Testing if the matching is not too permissive  ==\n");
+    test_media_has_slaves_from_parent(p_vlc, SLAVES_DIR "/t.mp4",
+                                      NULL, 0);
+    libvlc_release(p_vlc);
+
+    printf("== Testing --sub-autodetect-fuzzy 3 (full and left match) ==\n");
+    pp_args[2] = "3";
+    p_vlc = libvlc_new(ARGC - 1, pp_args);
+    assert(p_vlc != NULL);
+    test_media_has_slaves_from_parent(p_vlc, SLAVES_DIR "/test.mp4",
+                                      p_expected_slaves, 2);
+    libvlc_release(p_vlc);
+
+    printf("== Testing --sub-autodetect-fuzzy 4 (full match) ==\n");
+    pp_args[2] = "4";
+    p_vlc = libvlc_new(ARGC - 1, pp_args);
+    assert(p_vlc != NULL);
+    test_media_has_slaves_from_parent(p_vlc, SLAVES_DIR "/test.mp4",
+                                      p_expected_slaves, 1);
+    libvlc_release(p_vlc);
+
+    printf("== Testing  --no-sub-autodetect-file (no match) ==\n");
     pp_args[ARGC - 1] = "--no-sub-autodetect-file";
     p_vlc = libvlc_new(ARGC, pp_args);
     assert(p_vlc != NULL);
-    test_media_has_slaves_from_parent(p_vlc, NULL, 0);
+    test_media_has_slaves_from_parent(p_vlc, SLAVES_DIR "/test.mp4", NULL, 0);
     libvlc_release(p_vlc);
 
     for (unsigned int i = 0; i < EXPECTED_SLAVES_COUNT; ++i)
diff --git a/test/samples/slaves/left-test.srt b/test/samples/slaves/lt-test.srt
similarity index 100%
rename from test/samples/slaves/left-test.srt
rename to test/samples/slaves/lt-test.srt
diff --git a/test/samples/slaves/test-right.srt b/test/samples/slaves/t.mp4
similarity index 100%
rename from test/samples/slaves/test-right.srt
rename to test/samples/slaves/t.mp4
diff --git a/test/samples/slaves/test.rt.srt b/test/samples/slaves/test.rt.srt
new file mode 100644
index 0000000000..e69de29bb2



More information about the vlc-commits mailing list