[0.11] gstreamer: filesrc, filesink: fix URI creation regression for non-absolute locations

Wim Taymans wtay at kemper.freedesktop.org
Fri Mar 4 07:18:48 PST 2011


Module: gstreamer
Branch: 0.11
Commit: 1f59906ec1a20645b1c299e835fa2d14c197b5eb
URL:    http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=1f59906ec1a20645b1c299e835fa2d14c197b5eb

Author: Tim-Philipp Müller <tim.muller at collabora.co.uk>
Date:   Thu Feb 24 15:32:00 2011 +0000

filesrc, filesink: fix URI creation regression for non-absolute locations

Passing e.g. location=foo would lead to warnings because g_filename_to_uri()
wants an absolute file path and returns NULL otherwise. Use brand-new
gst_filename_to_uri() instead, which will try harder to create a proper
URI for us.

Also add unit test.

---

 plugins/elements/gstfilesink.c |    4 ++-
 plugins/elements/gstfilesrc.c  |    6 ++-
 tests/check/elements/filesrc.c |   62 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/plugins/elements/gstfilesink.c b/plugins/elements/gstfilesink.c
index 2431c14..d5fa283 100644
--- a/plugins/elements/gstfilesink.c
+++ b/plugins/elements/gstfilesink.c
@@ -302,7 +302,9 @@ gst_file_sink_set_location (GstFileSink * sink, const gchar * location)
     /* we store the filename as we received it from the application. On Windows
      * this should be in UTF8 */
     sink->filename = g_strdup (location);
-    sink->uri = g_filename_to_uri (sink->filename, NULL, NULL);
+    sink->uri = gst_filename_to_uri (location, NULL);
+    GST_INFO ("filename : %s", sink->filename);
+    GST_INFO ("uri      : %s", sink->uri);
   } else {
     sink->filename = NULL;
     sink->uri = NULL;
diff --git a/plugins/elements/gstfilesrc.c b/plugins/elements/gstfilesrc.c
index b14bf2d..16a3e03 100644
--- a/plugins/elements/gstfilesrc.c
+++ b/plugins/elements/gstfilesrc.c
@@ -367,10 +367,12 @@ gst_file_src_set_location (GstFileSrc * src, const gchar * location)
     src->filename = NULL;
     src->uri = NULL;
   } else {
-    /* we store the filename as received by the application. On Windoes this
+    /* we store the filename as received by the application. On Windows this
      * should be UTF8 */
     src->filename = g_strdup (location);
-    src->uri = g_filename_to_uri (src->filename, NULL, NULL);
+    src->uri = gst_filename_to_uri (location, NULL);
+    GST_INFO ("filename : %s", src->filename);
+    GST_INFO ("uri      : %s", src->uri);
   }
   g_object_notify (G_OBJECT (src), "location");
   gst_uri_handler_new_uri (GST_URI_HANDLER (src), src->uri);
diff --git a/tests/check/elements/filesrc.c b/tests/check/elements/filesrc.c
index 71a09f0..970ca9a 100644
--- a/tests/check/elements/filesrc.c
+++ b/tests/check/elements/filesrc.c
@@ -384,6 +384,67 @@ GST_START_TEST (test_uri_interface)
 
 GST_END_TEST;
 
+static void
+check_uri_for_location (GstElement * e, const gchar * location,
+    const gchar * uri)
+{
+  GstQuery *query;
+  gchar *query_uri = NULL;
+
+  g_object_set (e, "location", location, NULL);
+  query = gst_query_new_uri ();
+  fail_unless (gst_element_query (e, query));
+  gst_query_parse_uri (query, &query_uri);
+  gst_query_unref (query);
+
+  if (uri != NULL) {
+    fail_unless_equals_string (query_uri, uri);
+  } else {
+    gchar *fn;
+
+    fail_unless (gst_uri_is_valid (query_uri));
+    fn = g_filename_from_uri (query_uri, NULL, NULL);
+    fail_unless (g_path_is_absolute (fn));
+    fail_unless (fn != NULL);
+    g_free (fn);
+  }
+
+  g_free (query_uri);
+}
+
+GST_START_TEST (test_uri_query)
+{
+  GstElement *src;
+
+  src = setup_filesrc ();
+
+#ifdef G_OS_UNIX
+  {
+    GST_INFO ("*nix");
+    check_uri_for_location (src, "/i/do/not/exist", "file:///i/do/not/exist");
+    check_uri_for_location (src, "/i/do/not/../exist", "file:///i/do/exist");
+    check_uri_for_location (src, "/i/do/not/.././exist", "file:///i/do/exist");
+    check_uri_for_location (src, "/i/./do/not/../exist", "file:///i/do/exist");
+    check_uri_for_location (src, "/i/do/./not/../exist", "file:///i/do/exist");
+    check_uri_for_location (src, "/i/do/not/./../exist", "file:///i/do/exist");
+    check_uri_for_location (src, "/i/./do/./././././exist",
+        "file:///i/do/exist");
+    check_uri_for_location (src, "/i/do/not/../../exist", "file:///i/exist");
+    check_uri_for_location (src, "/i/../not/../exist", "file:///exist");
+    /* hard to test relative URIs, just make sure it returns an URI of sorts */
+    check_uri_for_location (src, "foo", NULL);
+    check_uri_for_location (src, "foo/../bar", NULL);
+    check_uri_for_location (src, "./foo", NULL);
+    check_uri_for_location (src, "../foo", NULL);
+    check_uri_for_location (src, "foo/./bar", NULL);
+  }
+#endif
+
+  cleanup_filesrc (src);
+}
+
+GST_END_TEST;
+
 static Suite *
 filesrc_suite (void)
 {
@@ -396,6 +457,7 @@ filesrc_suite (void)
   tcase_add_test (tc_chain, test_pull);
   tcase_add_test (tc_chain, test_coverage);
   tcase_add_test (tc_chain, test_uri_interface);
+  tcase_add_test (tc_chain, test_uri_query);
 
   return s;
 }



More information about the gstreamer-commits mailing list