From: Marcin Kolny Date: Thu, 4 Nov 2021 09:30:31 +0000 (+0000) Subject: typefind: fix reading file extension from URI X-Git-Tag: 1.20.0~356 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a46ab2ced20d757e0e770d4de1edc3a152cc4f2f;p=platform%2Fupstream%2Fgstreamer.git typefind: fix reading file extension from URI Currently reading extension relies on the fact that everything after the last"." character is a file extension. Whereas that works fine for most of the cases, it breaks when the URI contains a query part. E.g.: `http://url.com/file.mp4?param=value` returns `mp4?param=value` instead of `mp4`. In this commit we use URI parser to read the path of the URI (in the example above, that is `/file.mp4`) and read extension from that path. Part-of: --- diff --git a/subprojects/gstreamer/plugins/elements/gsttypefindelement.c b/subprojects/gstreamer/plugins/elements/gsttypefindelement.c index fb14df6..84e60a9 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; } }