summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2024-05-27 14:14:24 +0300
committerBackport Bot <gitlab-backport-bot@gstreamer-foundation.org>2024-06-01 16:15:53 +0300
commitcd4d0406724993cdaa434c9d8eacb8d5ec96b314 (patch)
tree3638f3fe26403c8cb3cab4df562131c1aa5e2fbc
parentd263a8d2febefc644e66196c0833e2e7041313cb (diff)
rtspsrc: Only update from the Content-Base header in the initial OPTION / DESCRIBE response
Some servers send a new content base in the SETUP response, which is just the non-aggregate control URL of the individual streams. See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3563 Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6982>
-rw-r--r--subprojects/gst-plugins-good/gst/rtsp/gstrtspsrc.c51
1 files changed, 30 insertions, 21 deletions
diff --git a/subprojects/gst-plugins-good/gst/rtsp/gstrtspsrc.c b/subprojects/gst-plugins-good/gst/rtsp/gstrtspsrc.c
index 16794f6294..385fbcdec6 100644
--- a/subprojects/gst-plugins-good/gst/rtsp/gstrtspsrc.c
+++ b/subprojects/gst-plugins-good/gst/rtsp/gstrtspsrc.c
@@ -6705,7 +6705,8 @@ propagate_error:
static GstRTSPResult
gst_rtsp_src_receive_response (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
- GstRTSPMessage * response, GstRTSPStatusCode * code)
+ GstRTSPMessage * response, GstRTSPStatusCode * code,
+ gboolean update_content_base)
{
GstRTSPStatusCode thecode;
gchar *content_base = NULL;
@@ -6766,12 +6767,14 @@ next:
if (thecode != GST_RTSP_STS_OK)
return GST_RTSP_OK;
- /* store new content base if any */
- gst_rtsp_message_get_header (response, GST_RTSP_HDR_CONTENT_BASE,
- &content_base, 0);
- if (content_base) {
- g_free (src->content_base);
- src->content_base = g_strdup (content_base);
+ if (update_content_base) {
+ /* store new content base if any */
+ gst_rtsp_message_get_header (response, GST_RTSP_HDR_CONTENT_BASE,
+ &content_base, 0);
+ if (content_base) {
+ g_free (src->content_base);
+ src->content_base = g_strdup (content_base);
+ }
}
return GST_RTSP_OK;
@@ -6818,7 +6821,7 @@ server_eof:
static GstRTSPResult
gst_rtspsrc_try_send (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
GstRTSPMessage * request, GstRTSPMessage * response,
- GstRTSPStatusCode * code)
+ GstRTSPStatusCode * code, gboolean update_content_base)
{
GstRTSPResult res;
gint try = 0;
@@ -6847,7 +6850,9 @@ again:
if (!response)
return res;
- res = gst_rtsp_src_receive_response (src, conninfo, response, code);
+ res =
+ gst_rtsp_src_receive_response (src, conninfo, response, code,
+ update_content_base);
if (res == GST_RTSP_EEOF) {
GST_WARNING_OBJECT (src, "server closed connection");
/* only try once after reconnect, then fallthrough and error out */
@@ -6923,7 +6928,8 @@ receive_error:
static GstRTSPResult
gst_rtspsrc_send (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
GstRTSPMessage * request, GstRTSPMessage * response,
- GstRTSPStatusCode * code, GstRTSPVersion * versions)
+ GstRTSPStatusCode * code, GstRTSPVersion * versions,
+ gboolean update_content_base)
{
GstRTSPStatusCode int_code = GST_RTSP_STS_OK;
GstRTSPResult res = GST_RTSP_ERROR;
@@ -6948,7 +6954,7 @@ gst_rtspsrc_send (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
if ((res =
gst_rtspsrc_try_send (src, conninfo, request, response,
- &int_code)) < 0)
+ &int_code, update_content_base)) < 0)
goto error;
switch (int_code) {
@@ -7075,7 +7081,8 @@ static GstRTSPResult
gst_rtspsrc_send_cb (GstRTSPExtension * ext, GstRTSPMessage * request,
GstRTSPMessage * response, GstRTSPSrc * src)
{
- return gst_rtspsrc_send (src, &src->conninfo, request, response, NULL, NULL);
+ return gst_rtspsrc_send (src, &src->conninfo, request, response, NULL, NULL,
+ FALSE);
}
@@ -7561,7 +7568,7 @@ gst_rtspsrc_setup_streams_end (GstRTSPSrc * src, gboolean async)
if (!src->conninfo.connection)
conninfo = &((GstRTSPStream *) tmp->data)->conninfo;
- gst_rtsp_src_receive_response (src, conninfo, &response, NULL);
+ gst_rtsp_src_receive_response (src, conninfo, &response, NULL, FALSE);
gst_rtsp_src_setup_stream_from_response (src, stream,
&response, NULL, 0, NULL, NULL);
@@ -7792,7 +7799,7 @@ gst_rtspsrc_setup_streams_start (GstRTSPSrc * src, gboolean async)
/* handle the code ourselves */
res =
gst_rtspsrc_send (src, conninfo, &request,
- pipelined_request_id ? NULL : &response, &code, NULL);
+ pipelined_request_id ? NULL : &response, &code, NULL, FALSE);
if (res < 0)
goto send_error;
@@ -8335,7 +8342,7 @@ restart:
if ((res =
gst_rtspsrc_send (src, &src->conninfo, &request, &response,
- NULL, versions)) < 0) {
+ NULL, versions, TRUE)) < 0) {
goto send_error;
}
@@ -8372,7 +8379,7 @@ restart:
if ((res =
gst_rtspsrc_send (src, &src->conninfo, &request, &response,
- NULL, NULL)) < 0)
+ NULL, NULL, TRUE)) < 0)
goto send_error;
/* we only perform redirect for describe and play, currently */
@@ -8613,7 +8620,8 @@ gst_rtspsrc_close (GstRTSPSrc * src, gboolean async, gboolean only_close)
GST_ELEMENT_PROGRESS (src, CONTINUE, "close", ("Closing stream"));
if ((res =
- gst_rtspsrc_send (src, info, &request, &response, NULL, NULL)) < 0)
+ gst_rtspsrc_send (src, info, &request, &response, NULL, NULL,
+ FALSE)) < 0)
goto send_error;
/* FIXME, parse result? */
@@ -9060,7 +9068,8 @@ restart:
GST_ELEMENT_PROGRESS (src, CONTINUE, "request", ("Sending PLAY request"));
if ((res =
- gst_rtspsrc_send (src, conninfo, &request, &response, NULL, NULL))
+ gst_rtspsrc_send (src, conninfo, &request, &response, NULL, NULL,
+ FALSE))
< 0)
goto send_error;
@@ -9294,7 +9303,7 @@ gst_rtspsrc_pause (GstRTSPSrc * src, gboolean async)
if ((res =
gst_rtspsrc_send (src, conninfo, &request, &response, NULL,
- NULL)) < 0)
+ NULL, FALSE)) < 0)
goto send_error;
gst_rtsp_message_unset (&request);
@@ -9904,7 +9913,7 @@ gst_rtspsrc_get_parameter (GstRTSPSrc * src, ParameterRequest * req)
}
if ((res = gst_rtspsrc_send (src, &src->conninfo,
- &request, &response, &code, NULL)) < 0)
+ &request, &response, &code, NULL, FALSE)) < 0)
goto send_error;
res = gst_rtsp_message_get_body (&response, (guint8 **) & recv_body,
@@ -10024,7 +10033,7 @@ gst_rtspsrc_set_parameter (GstRTSPSrc * src, ParameterRequest * req)
}
if ((res = gst_rtspsrc_send (src, &src->conninfo,
- &request, &response, &code, NULL)) < 0)
+ &request, &response, &code, NULL, FALSE)) < 0)
goto send_error;
done: