summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
Diffstat (limited to 'gst')
-rw-r--r--gst/rtsp/gstrtspsrc.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c
index e1e2aea6..88c606aa 100644
--- a/gst/rtsp/gstrtspsrc.c
+++ b/gst/rtsp/gstrtspsrc.c
@@ -2772,9 +2772,14 @@ gst_rtspsrc_send (GstRTSPSrc * src, RTSPMessage * request,
RTSPStatusCode int_code = RTSP_STS_OK;
RTSPResult res;
gboolean retry;
+ RTSPMethod method;
do {
retry = FALSE;
+
+ /* save method so we can disable it when the server complains */
+ method = request->type_data.request.method;
+
if ((res = gst_rtspsrc_try_send (src, request, response, &int_code)) < 0)
goto error;
@@ -2804,11 +2809,20 @@ error:
}
error_response:
{
+ res = RTSP_ERROR;
+
switch (response->type_data.response.code) {
case RTSP_STS_NOT_FOUND:
GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), ("%s",
response->type_data.response.reason));
break;
+ case RTSP_STS_NOT_ACCEPTABLE:
+ case RTSP_STS_NOT_IMPLEMENTED:
+ GST_WARNING_OBJECT (src, "got NOT IMPLEMENTED, disable method %s",
+ rtsp_method_as_text (method));
+ src->methods &= ~method;
+ res = RTSP_OK;
+ break;
default:
GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
("Got error response: %d (%s).", response->type_data.response.code,
@@ -2817,7 +2831,7 @@ error_response:
}
/* we return FALSE so we should unset the response ourselves */
rtsp_message_unset (response);
- return RTSP_ERROR;
+ return res;
}
}