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>
This commit is contained in:
Sebastian Dröge 2024-05-27 14:14:24 +03:00 committed by Backport Bot
parent d263a8d2fe
commit cd4d040672

View file

@ -6705,7 +6705,8 @@ propagate_error:
static GstRTSPResult static GstRTSPResult
gst_rtsp_src_receive_response (GstRTSPSrc * src, GstRTSPConnInfo * conninfo, gst_rtsp_src_receive_response (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
GstRTSPMessage * response, GstRTSPStatusCode * code) GstRTSPMessage * response, GstRTSPStatusCode * code,
gboolean update_content_base)
{ {
GstRTSPStatusCode thecode; GstRTSPStatusCode thecode;
gchar *content_base = NULL; gchar *content_base = NULL;
@ -6766,12 +6767,14 @@ next:
if (thecode != GST_RTSP_STS_OK) if (thecode != GST_RTSP_STS_OK)
return GST_RTSP_OK; return GST_RTSP_OK;
/* store new content base if any */ if (update_content_base) {
gst_rtsp_message_get_header (response, GST_RTSP_HDR_CONTENT_BASE, /* store new content base if any */
&content_base, 0); gst_rtsp_message_get_header (response, GST_RTSP_HDR_CONTENT_BASE,
if (content_base) { &content_base, 0);
g_free (src->content_base); if (content_base) {
src->content_base = g_strdup (content_base); g_free (src->content_base);
src->content_base = g_strdup (content_base);
}
} }
return GST_RTSP_OK; return GST_RTSP_OK;
@ -6818,7 +6821,7 @@ server_eof:
static GstRTSPResult static GstRTSPResult
gst_rtspsrc_try_send (GstRTSPSrc * src, GstRTSPConnInfo * conninfo, gst_rtspsrc_try_send (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
GstRTSPMessage * request, GstRTSPMessage * response, GstRTSPMessage * request, GstRTSPMessage * response,
GstRTSPStatusCode * code) GstRTSPStatusCode * code, gboolean update_content_base)
{ {
GstRTSPResult res; GstRTSPResult res;
gint try = 0; gint try = 0;
@ -6847,7 +6850,9 @@ again:
if (!response) if (!response)
return res; 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) { if (res == GST_RTSP_EEOF) {
GST_WARNING_OBJECT (src, "server closed connection"); GST_WARNING_OBJECT (src, "server closed connection");
/* only try once after reconnect, then fallthrough and error out */ /* only try once after reconnect, then fallthrough and error out */
@ -6923,7 +6928,8 @@ receive_error:
static GstRTSPResult static GstRTSPResult
gst_rtspsrc_send (GstRTSPSrc * src, GstRTSPConnInfo * conninfo, gst_rtspsrc_send (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
GstRTSPMessage * request, GstRTSPMessage * response, GstRTSPMessage * request, GstRTSPMessage * response,
GstRTSPStatusCode * code, GstRTSPVersion * versions) GstRTSPStatusCode * code, GstRTSPVersion * versions,
gboolean update_content_base)
{ {
GstRTSPStatusCode int_code = GST_RTSP_STS_OK; GstRTSPStatusCode int_code = GST_RTSP_STS_OK;
GstRTSPResult res = GST_RTSP_ERROR; GstRTSPResult res = GST_RTSP_ERROR;
@ -6948,7 +6954,7 @@ gst_rtspsrc_send (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
if ((res = if ((res =
gst_rtspsrc_try_send (src, conninfo, request, response, gst_rtspsrc_try_send (src, conninfo, request, response,
&int_code)) < 0) &int_code, update_content_base)) < 0)
goto error; goto error;
switch (int_code) { switch (int_code) {
@ -7075,7 +7081,8 @@ static GstRTSPResult
gst_rtspsrc_send_cb (GstRTSPExtension * ext, GstRTSPMessage * request, gst_rtspsrc_send_cb (GstRTSPExtension * ext, GstRTSPMessage * request,
GstRTSPMessage * response, GstRTSPSrc * src) 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) if (!src->conninfo.connection)
conninfo = &((GstRTSPStream *) tmp->data)->conninfo; 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, gst_rtsp_src_setup_stream_from_response (src, stream,
&response, NULL, 0, NULL, NULL); &response, NULL, 0, NULL, NULL);
@ -7792,7 +7799,7 @@ gst_rtspsrc_setup_streams_start (GstRTSPSrc * src, gboolean async)
/* handle the code ourselves */ /* handle the code ourselves */
res = res =
gst_rtspsrc_send (src, conninfo, &request, gst_rtspsrc_send (src, conninfo, &request,
pipelined_request_id ? NULL : &response, &code, NULL); pipelined_request_id ? NULL : &response, &code, NULL, FALSE);
if (res < 0) if (res < 0)
goto send_error; goto send_error;
@ -8335,7 +8342,7 @@ restart:
if ((res = if ((res =
gst_rtspsrc_send (src, &src->conninfo, &request, &response, gst_rtspsrc_send (src, &src->conninfo, &request, &response,
NULL, versions)) < 0) { NULL, versions, TRUE)) < 0) {
goto send_error; goto send_error;
} }
@ -8372,7 +8379,7 @@ restart:
if ((res = if ((res =
gst_rtspsrc_send (src, &src->conninfo, &request, &response, gst_rtspsrc_send (src, &src->conninfo, &request, &response,
NULL, NULL)) < 0) NULL, NULL, TRUE)) < 0)
goto send_error; goto send_error;
/* we only perform redirect for describe and play, currently */ /* 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")); GST_ELEMENT_PROGRESS (src, CONTINUE, "close", ("Closing stream"));
if ((res = 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; goto send_error;
/* FIXME, parse result? */ /* FIXME, parse result? */
@ -9060,7 +9068,8 @@ restart:
GST_ELEMENT_PROGRESS (src, CONTINUE, "request", ("Sending PLAY request")); GST_ELEMENT_PROGRESS (src, CONTINUE, "request", ("Sending PLAY request"));
if ((res = if ((res =
gst_rtspsrc_send (src, conninfo, &request, &response, NULL, NULL)) gst_rtspsrc_send (src, conninfo, &request, &response, NULL, NULL,
FALSE))
< 0) < 0)
goto send_error; goto send_error;
@ -9294,7 +9303,7 @@ gst_rtspsrc_pause (GstRTSPSrc * src, gboolean async)
if ((res = if ((res =
gst_rtspsrc_send (src, conninfo, &request, &response, NULL, gst_rtspsrc_send (src, conninfo, &request, &response, NULL,
NULL)) < 0) NULL, FALSE)) < 0)
goto send_error; goto send_error;
gst_rtsp_message_unset (&request); 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, if ((res = gst_rtspsrc_send (src, &src->conninfo,
&request, &response, &code, NULL)) < 0) &request, &response, &code, NULL, FALSE)) < 0)
goto send_error; goto send_error;
res = gst_rtsp_message_get_body (&response, (guint8 **) & recv_body, 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, if ((res = gst_rtspsrc_send (src, &src->conninfo,
&request, &response, &code, NULL)) < 0) &request, &response, &code, NULL, FALSE)) < 0)
goto send_error; goto send_error;
done: done: