From ebd8bd8f13dd163f40e6cf2def21b3075b548174 Mon Sep 17 00:00:00 2001 From: Bruce Liang Date: Tue, 12 Jul 2022 16:58:00 +0800 Subject: [PATCH] rtsp-client: Fix url for generating key in media factory The mount point at / can be accessed by both the URL forms rtsp://: and rtsp://:/. To make media factory generating the same key for both the URL forms, the url sent to gst_rtsp_media_factory_construct() needs to be normalized first. This commit creates a new GstRTSPUrl as the normalized url to send to gst_rtsp_media_factory_construct(). Fixes:https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1297 Part-of: --- subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-client.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-client.c b/subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-client.c index 6e9de4c..4fb80f1 100644 --- a/subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-client.c +++ b/subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-client.c @@ -977,6 +977,7 @@ find_media (GstRTSPClient * client, GstRTSPContext * ctx, gchar * path, GstRTSPClientPrivate *priv = client->priv; GstRTSPMediaFactory *factory; GstRTSPMedia *media; + GstRTSPUrl *url; gint path_len; /* find the longest matching factory for the uri first */ @@ -997,13 +998,20 @@ find_media (GstRTSPClient * client, GstRTSPContext * ctx, gchar * path, else path_len = strlen (path); + url = gst_rtsp_url_copy (ctx->uri); + /* normalize rtsp://: to rtsp://:/ */ + if (url->abspath[0] == 0) { + g_free (url->abspath); + url->abspath = g_strdup ("/"); + } + if (!paths_are_equal (priv->path, path, path_len)) { /* remove any previously cached values before we try to construct a new * media for uri */ clean_cached_media (client, TRUE); /* prepare the media and add it to the pipeline */ - if (!(media = gst_rtsp_media_factory_construct (factory, ctx->uri))) + if (!(media = gst_rtsp_media_factory_construct (factory, url))) goto no_media; ctx->media = media; @@ -1032,6 +1040,7 @@ find_media (GstRTSPClient * client, GstRTSPContext * ctx, gchar * path, GST_INFO ("reusing cached media %p for path %s", media, priv->path); } + gst_rtsp_url_free (url); g_object_unref (factory); ctx->factory = NULL; @@ -1068,6 +1077,7 @@ no_media: { GST_ERROR ("client %p: can't create media", client); send_generic_response (client, GST_RTSP_STS_BAD_REQUEST, ctx); + gst_rtsp_url_free (url); g_object_unref (factory); ctx->factory = NULL; return NULL; @@ -1076,6 +1086,7 @@ no_thread: { GST_ERROR ("client %p: can't create thread", client); send_generic_response (client, GST_RTSP_STS_SERVICE_UNAVAILABLE, ctx); + gst_rtsp_url_free (url); g_object_unref (media); ctx->media = NULL; g_object_unref (factory); @@ -1086,6 +1097,7 @@ no_prepare: { GST_ERROR ("client %p: can't prepare media", client); send_generic_response (client, GST_RTSP_STS_SERVICE_UNAVAILABLE, ctx); + gst_rtsp_url_free (url); g_object_unref (media); ctx->media = NULL; g_object_unref (factory); -- 2.7.4