aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/rtsp.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2009-07-27 14:03:53 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2009-07-27 14:03:53 +0000
commitfccb1770e6f8b21716e61193396fd9dc2e43b79d (patch)
tree4739090110c8f69680ce582fc66658898e152af2 /libavformat/rtsp.c
parentc2f3eec445389d67afc8c699ba23915a20cae51c (diff)
downloadffmpeg-fccb1770e6f8b21716e61193396fd9dc2e43b79d.tar.gz
Implement support for EOS as used by WMS and other RTSP servers that do not
implement RTCP/bye. See "[PATCH] rtsp.c: EOS support" thread from a few months back. Originally committed as revision 19517 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r--libavformat/rtsp.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 4cbfd7e49a..320d45ce7f 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -700,6 +700,9 @@ void rtsp_parse_line(RTSPMessageHeader *reply, const char *buf)
} else if (av_stristart(p, "Server:", &p)) {
skip_spaces(&p);
av_strlcpy(reply->server, p, sizeof(reply->server));
+ } else if (av_stristart(p, "Notice:", &p) ||
+ av_stristart(p, "X-Notice:", &p)) {
+ reply->notice = strtol(p, NULL, 10);
}
}
@@ -823,6 +826,17 @@ rtsp_read_reply (AVFormatContext *s, RTSPMessageHeader *reply,
else
av_free(content);
+ /* EOS */
+ if (reply->notice == 2101 /* End-of-Stream Reached */ ||
+ reply->notice == 2104 /* Start-of-Stream Reached */ ||
+ reply->notice == 2306 /* Continuous Feed Terminated */)
+ rt->state = RTSP_STATE_IDLE;
+ else if (reply->notice >= 4400 && reply->notice < 5500)
+ return AVERROR(EIO); /* data or server error */
+ else if (reply->notice == 2401 /* Ticket Expired */ ||
+ (reply->notice >= 5500 && reply->notice < 5600) /* end of term */ )
+ return AVERROR(EPERM);
+
return 0;
}
@@ -1314,6 +1328,8 @@ static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
if (ret == 1) /* received '$' */
break;
/* XXX: parse message */
+ if (rt->state != RTSP_STATE_PLAYING)
+ return 0;
}
ret = url_read_complete(rt->rtsp_hd, buf, 3);
if (ret != 3)
@@ -1399,6 +1415,8 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
rtsp_read_reply(s, &reply, NULL, 0);
/* XXX: parse message */
+ if (rt->state != RTSP_STATE_PLAYING)
+ return 0;
}
}
}
@@ -1506,6 +1524,8 @@ static int rtsp_read_packet(AVFormatContext *s,
}
if (len < 0)
return len;
+ if (len == 0)
+ return AVERROR_EOF;
if (rt->transport == RTSP_TRANSPORT_RDT)
ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, buf, len);
else