summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/rtsp.c4
-rw-r--r--libavformat/rtsp.h5
-rw-r--r--libavformat/rtspdec.c4
3 files changed, 12 insertions, 1 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 14111e69fd..2ebf7e0510 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -808,6 +808,10 @@ void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf,
p += strspn(p, SPACE_CHARS);
if (method && !strcmp(method, "PLAY"))
rtsp_parse_rtp_info(rt, p);
+ } else if (av_stristart(p, "Public:", &p) && rt) {
+ if (strstr(p, "GET_PARAMETER") &&
+ method && !strcmp(method, "OPTIONS"))
+ rt->get_parameter_supported = 1;
}
}
diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
index e1f1df990e..ff66502626 100644
--- a/libavformat/rtsp.h
+++ b/libavformat/rtsp.h
@@ -331,6 +331,11 @@ typedef struct RTSPState {
* Polling array for udp
*/
struct pollfd *p;
+
+ /**
+ * Whether the server supports the GET_PARAMETER method.
+ */
+ int get_parameter_supported;
} RTSPState;
/**
diff --git a/libavformat/rtspdec.c b/libavformat/rtspdec.c
index 866f313d10..ccfc4d8e27 100644
--- a/libavformat/rtspdec.c
+++ b/libavformat/rtspdec.c
@@ -341,7 +341,9 @@ retry:
/* send dummy request to keep TCP connection alive */
if ((av_gettime() - rt->last_cmd_time) / 1000000 >= rt->timeout / 2) {
- if (rt->server_type != RTSP_SERVER_REAL) {
+ if (rt->server_type == RTSP_SERVER_WMS ||
+ (rt->server_type != RTSP_SERVER_REAL &&
+ rt->get_parameter_supported)) {
ff_rtsp_send_cmd_async(s, "GET_PARAMETER", rt->control_uri, NULL);
} else {
ff_rtsp_send_cmd_async(s, "OPTIONS", "*", NULL);