aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2011-05-09 20:11:16 +0300
committerMartin Storsjö <martin@martin.st>2011-05-11 10:42:34 +0300
commit0b4949b51816bc2fd23ba4c4de183b877b58aa25 (patch)
treef7d251606dc8461ba0533591baa8667a13b49403
parent3fd62c6e247468d792ce8f1d3c458017d1ea9eb5 (diff)
downloadffmpeg-0b4949b51816bc2fd23ba4c4de183b877b58aa25.tar.gz
rtsp: Only do keepalive using GET_PARAMETER if the server supports it
This is more like what VLC does. If the server doesn't mention supporting GET_PARAMETER in response to an OPTIONS request, VLC doesn't send any keepalive requests at all. After this patch, libavformat will still send OPTIONS keepalives if GET_PARAMETER isn't explicitly said to be supported. Some RTSP cameras don't support GET_PARAMETER, and will close the connection if this is sent as keepalive request (but support OPTIONS just fine, but probably don't need any keepalive at all). Some other cameras don't support using OPTIONS as keepalive, but require GET_PARAMETER instead. Signed-off-by: Martin Storsjö <martin@martin.st>
-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);