diff --git a/subprojects/gstreamer/plugins/elements/gsttypefindelement.c b/subprojects/gstreamer/plugins/elements/gsttypefindelement.c index fb14df69b3..84e60a9c68 100644 --- a/subprojects/gstreamer/plugins/elements/gsttypefindelement.c +++ b/subprojects/gstreamer/plugins/elements/gsttypefindelement.c @@ -800,9 +800,8 @@ static gchar * gst_type_find_get_extension (GstTypeFindElement * typefind, GstPad * pad) { GstQuery *query; - gchar *uri, *result; - size_t len; - gint find; + gchar *uri, *result, *path, *base_path, *find; + GstUri *gst_uri; query = gst_query_new_uri (); @@ -816,22 +815,30 @@ gst_type_find_get_extension (GstTypeFindElement * typefind, GstPad * pad) GST_DEBUG_OBJECT (typefind, "finding extension of %s", uri); - /* find the extension on the uri, this is everything after a '.' */ - len = strlen (uri); - find = len - 1; + gst_uri = gst_uri_from_string (uri); + if (gst_uri == NULL) + goto invalid_uri; - while (find >= 0) { - if (uri[find] == '.') - break; - find--; - } - if (find < 0) + path = gst_uri_get_path (gst_uri); + gst_uri_unref (gst_uri); + + if (path == NULL) + goto invalid_uri; + + base_path = g_path_get_basename (path); + g_free (path); + + /* find the extension on the path, this is everything after a '.' */ + find = strrchr (base_path, '.'); + + if (find == NULL) goto no_extension; - result = g_strdup (&uri[find + 1]); + result = g_strdup (find + 1); GST_DEBUG_OBJECT (typefind, "found extension %s", result); gst_query_unref (query); + g_free (base_path); g_free (uri); return result; @@ -849,11 +856,19 @@ no_uri: gst_query_unref (query); return NULL; } +invalid_uri: + { + GST_INFO_OBJECT (typefind, "failed to extract path from uri %s", uri); + g_free (uri); + gst_query_unref (query); + return NULL; + } no_extension: { GST_INFO_OBJECT (typefind, "could not find uri extension in %s", uri); - gst_query_unref (query); + g_free (base_path); g_free (uri); + gst_query_unref (query); return NULL; } }