mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-05 17:09:48 +00:00
gst/rtsp/gstrtspsrc.c: Let more error state trickle down so that we can catch more error cases.
Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_loop_udp), (gst_rtspsrc_try_send), (gst_rtspsrc_send), (gst_rtspsrc_setup_streams), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), (gst_rtspsrc_change_state): Let more error state trickle down so that we can catch more error cases. Handle keep-alive a little smarter by selecting a method the server actually supports. Fix a race in UDP streaming shutdown.
This commit is contained in:
parent
5f2fbbd76b
commit
9e37243eca
2 changed files with 54 additions and 22 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
2007-05-04 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive),
|
||||||
|
(gst_rtspsrc_loop_udp), (gst_rtspsrc_try_send), (gst_rtspsrc_send),
|
||||||
|
(gst_rtspsrc_setup_streams), (gst_rtspsrc_open),
|
||||||
|
(gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause),
|
||||||
|
(gst_rtspsrc_change_state):
|
||||||
|
Let more error state trickle down so that we can catch more error
|
||||||
|
cases.
|
||||||
|
Handle keep-alive a little smarter by selecting a method the server
|
||||||
|
actually supports.
|
||||||
|
Fix a race in UDP streaming shutdown.
|
||||||
|
|
||||||
2007-05-04 Wim Taymans <wim@fluendo.com>
|
2007-05-04 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive):
|
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive):
|
||||||
|
|
|
@ -2043,17 +2043,22 @@ gst_rtspsrc_send_keep_alive (GstRTSPSrc * src)
|
||||||
RTSPMessage response = { 0 };
|
RTSPMessage response = { 0 };
|
||||||
RTSPResult res;
|
RTSPResult res;
|
||||||
RTSPStatusCode code;
|
RTSPStatusCode code;
|
||||||
|
RTSPMethod method;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (src, "creating server keep-alive");
|
GST_DEBUG_OBJECT (src, "creating server keep-alive");
|
||||||
|
|
||||||
res =
|
/* find a method to use for keep-alive */
|
||||||
rtsp_message_init_request (&request, RTSP_GET_PARAMETER,
|
if (src->methods & RTSP_GET_PARAMETER)
|
||||||
src->req_location);
|
method = RTSP_GET_PARAMETER;
|
||||||
|
else
|
||||||
|
method = RTSP_OPTIONS;
|
||||||
|
|
||||||
|
res = rtsp_message_init_request (&request, method, src->req_location);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
goto send_error;
|
goto send_error;
|
||||||
|
|
||||||
/* let us handle the error code because we don't care */
|
/* let us handle the error code because we don't care */
|
||||||
if (!gst_rtspsrc_send (src, &request, &response, &code))
|
if ((res = gst_rtspsrc_send (src, &request, &response, &code)) < 0)
|
||||||
goto send_error;
|
goto send_error;
|
||||||
|
|
||||||
rtsp_message_unset (&request);
|
rtsp_message_unset (&request);
|
||||||
|
@ -2224,6 +2229,11 @@ receive_error:
|
||||||
GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL),
|
GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL),
|
||||||
("Could not receive message. (%s)", str));
|
("Could not receive message. (%s)", str));
|
||||||
g_free (str);
|
g_free (str);
|
||||||
|
/* don't bother continueing if we the connection was closed */
|
||||||
|
if (res == RTSP_EEOF) {
|
||||||
|
src->running = FALSE;
|
||||||
|
gst_task_pause (src->task);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
handle_request_failed:
|
handle_request_failed:
|
||||||
|
@ -2419,7 +2429,7 @@ no_user_pass:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static RTSPResult
|
||||||
gst_rtspsrc_try_send (GstRTSPSrc * src, RTSPMessage * request,
|
gst_rtspsrc_try_send (GstRTSPSrc * src, RTSPMessage * request,
|
||||||
RTSPMessage * response, RTSPStatusCode * code)
|
RTSPMessage * response, RTSPStatusCode * code)
|
||||||
{
|
{
|
||||||
|
@ -2463,13 +2473,15 @@ next:
|
||||||
|
|
||||||
thecode = response->type_data.response.code;
|
thecode = response->type_data.response.code;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (src, "got response message %d", thecode);
|
||||||
|
|
||||||
/* if the caller wanted the result code, we store it. */
|
/* if the caller wanted the result code, we store it. */
|
||||||
if (code)
|
if (code)
|
||||||
*code = thecode;
|
*code = thecode;
|
||||||
|
|
||||||
/* If the request didn't succeed, bail out before doing any more */
|
/* If the request didn't succeed, bail out before doing any more */
|
||||||
if (thecode != RTSP_STS_OK)
|
if (thecode != RTSP_STS_OK)
|
||||||
return FALSE;
|
return RTSP_OK;
|
||||||
|
|
||||||
/* store new content base if any */
|
/* store new content base if any */
|
||||||
rtsp_message_get_header (response, RTSP_HDR_CONTENT_BASE, &content_base);
|
rtsp_message_get_header (response, RTSP_HDR_CONTENT_BASE, &content_base);
|
||||||
|
@ -2479,7 +2491,7 @@ next:
|
||||||
if (src->extension && src->extension->after_send)
|
if (src->extension && src->extension->after_send)
|
||||||
src->extension->after_send (src->extension, request, response);
|
src->extension->after_send (src->extension, request, response);
|
||||||
|
|
||||||
return TRUE;
|
return RTSP_OK;
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
send_error:
|
send_error:
|
||||||
|
@ -2489,7 +2501,7 @@ send_error:
|
||||||
GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL),
|
GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL),
|
||||||
("Could not send message. (%s)", str));
|
("Could not send message. (%s)", str));
|
||||||
g_free (str);
|
g_free (str);
|
||||||
return FALSE;
|
return res;
|
||||||
}
|
}
|
||||||
receive_error:
|
receive_error:
|
||||||
{
|
{
|
||||||
|
@ -2498,12 +2510,12 @@ receive_error:
|
||||||
GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
|
GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
|
||||||
("Could not receive message. (%s)", str));
|
("Could not receive message. (%s)", str));
|
||||||
g_free (str);
|
g_free (str);
|
||||||
return FALSE;
|
return res;
|
||||||
}
|
}
|
||||||
handle_request_failed:
|
handle_request_failed:
|
||||||
{
|
{
|
||||||
/* ERROR was posted */
|
/* ERROR was posted */
|
||||||
return FALSE;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2526,19 +2538,20 @@ handle_request_failed:
|
||||||
* to retrieve authentication credentials via gst_rtspsrc_setup_auth and retry
|
* to retrieve authentication credentials via gst_rtspsrc_setup_auth and retry
|
||||||
* the request.
|
* the request.
|
||||||
*
|
*
|
||||||
* Returns: TRUE if the processing was successful.
|
* Returns: RTSP_OK if the processing was successful.
|
||||||
*/
|
*/
|
||||||
gboolean
|
RTSPResult
|
||||||
gst_rtspsrc_send (GstRTSPSrc * src, RTSPMessage * request,
|
gst_rtspsrc_send (GstRTSPSrc * src, RTSPMessage * request,
|
||||||
RTSPMessage * response, RTSPStatusCode * code)
|
RTSPMessage * response, RTSPStatusCode * code)
|
||||||
{
|
{
|
||||||
RTSPStatusCode int_code = RTSP_STS_OK;
|
RTSPStatusCode int_code = RTSP_STS_OK;
|
||||||
gboolean res;
|
RTSPResult res;
|
||||||
gboolean retry;
|
gboolean retry;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
retry = FALSE;
|
retry = FALSE;
|
||||||
res = gst_rtspsrc_try_send (src, request, response, &int_code);
|
if ((res = gst_rtspsrc_try_send (src, request, response, &int_code)) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
if (int_code == RTSP_STS_UNAUTHORIZED) {
|
if (int_code == RTSP_STS_UNAUTHORIZED) {
|
||||||
if (gst_rtspsrc_setup_auth (src, response)) {
|
if (gst_rtspsrc_setup_auth (src, response)) {
|
||||||
|
@ -2558,6 +2571,12 @@ gst_rtspsrc_send (GstRTSPSrc * src, RTSPMessage * request,
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
/* ERRORS */
|
||||||
|
error:
|
||||||
|
{
|
||||||
|
GST_DEBUG_OBJECT (src, "got error %d", res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
error_response:
|
error_response:
|
||||||
{
|
{
|
||||||
switch (response->type_data.response.code) {
|
switch (response->type_data.response.code) {
|
||||||
|
@ -2573,7 +2592,7 @@ error_response:
|
||||||
}
|
}
|
||||||
/* we return FALSE so we should unset the response ourselves */
|
/* we return FALSE so we should unset the response ourselves */
|
||||||
rtsp_message_unset (response);
|
rtsp_message_unset (response);
|
||||||
return FALSE;
|
return RTSP_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2872,7 +2891,7 @@ gst_rtspsrc_setup_streams (GstRTSPSrc * src)
|
||||||
rtsp_message_add_header (&request, RTSP_HDR_TRANSPORT, transports);
|
rtsp_message_add_header (&request, RTSP_HDR_TRANSPORT, transports);
|
||||||
g_free (transports);
|
g_free (transports);
|
||||||
|
|
||||||
if (!gst_rtspsrc_send (src, &request, &response, NULL))
|
if ((res = gst_rtspsrc_send (src, &request, &response, NULL) < 0))
|
||||||
goto send_error;
|
goto send_error;
|
||||||
|
|
||||||
/* parse response transport */
|
/* parse response transport */
|
||||||
|
@ -3019,7 +3038,7 @@ gst_rtspsrc_open (GstRTSPSrc * src)
|
||||||
|
|
||||||
/* send OPTIONS */
|
/* send OPTIONS */
|
||||||
GST_DEBUG_OBJECT (src, "send options...");
|
GST_DEBUG_OBJECT (src, "send options...");
|
||||||
if (!gst_rtspsrc_send (src, &request, &response, NULL))
|
if ((res = gst_rtspsrc_send (src, &request, &response, NULL)) < 0)
|
||||||
goto send_error;
|
goto send_error;
|
||||||
|
|
||||||
/* parse OPTIONS */
|
/* parse OPTIONS */
|
||||||
|
@ -3043,7 +3062,7 @@ gst_rtspsrc_open (GstRTSPSrc * src)
|
||||||
|
|
||||||
/* send DESCRIBE */
|
/* send DESCRIBE */
|
||||||
GST_DEBUG_OBJECT (src, "send describe...");
|
GST_DEBUG_OBJECT (src, "send describe...");
|
||||||
if (!gst_rtspsrc_send (src, &request, &response, NULL))
|
if ((res = gst_rtspsrc_send (src, &request, &response, NULL)) < 0)
|
||||||
goto send_error;
|
goto send_error;
|
||||||
|
|
||||||
/* check if reply is SDP */
|
/* check if reply is SDP */
|
||||||
|
@ -3219,7 +3238,7 @@ gst_rtspsrc_close (GstRTSPSrc * src)
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
goto create_request_failed;
|
goto create_request_failed;
|
||||||
|
|
||||||
if (!gst_rtspsrc_send (src, &request, &response, NULL))
|
if ((res = gst_rtspsrc_send (src, &request, &response, NULL)) < 0)
|
||||||
goto send_error;
|
goto send_error;
|
||||||
|
|
||||||
/* FIXME, parse result? */
|
/* FIXME, parse result? */
|
||||||
|
@ -3375,7 +3394,7 @@ gst_rtspsrc_play (GstRTSPSrc * src)
|
||||||
|
|
||||||
rtsp_message_add_header (&request, RTSP_HDR_RANGE, "npt=0-");
|
rtsp_message_add_header (&request, RTSP_HDR_RANGE, "npt=0-");
|
||||||
|
|
||||||
if (!gst_rtspsrc_send (src, &request, &response, NULL))
|
if ((res = gst_rtspsrc_send (src, &request, &response, NULL)) < 0)
|
||||||
goto send_error;
|
goto send_error;
|
||||||
|
|
||||||
rtsp_message_unset (&request);
|
rtsp_message_unset (&request);
|
||||||
|
@ -3466,7 +3485,7 @@ gst_rtspsrc_pause (GstRTSPSrc * src)
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
goto create_request_failed;
|
goto create_request_failed;
|
||||||
|
|
||||||
if (!gst_rtspsrc_send (src, &request, &response, NULL))
|
if ((res = gst_rtspsrc_send (src, &request, &response, NULL)) < 0)
|
||||||
goto send_error;
|
goto send_error;
|
||||||
|
|
||||||
rtsp_message_unset (&request);
|
rtsp_message_unset (&request);
|
||||||
|
@ -3621,7 +3640,7 @@ gst_rtspsrc_change_state (GstElement * element, GstStateChange transition)
|
||||||
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
GST_DEBUG_OBJECT (rtspsrc, "start flush");
|
GST_DEBUG_OBJECT (rtspsrc, "start flush");
|
||||||
rtsp_connection_flush (rtspsrc->connection, TRUE);
|
gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_STOP, TRUE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue