aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2010-03-15 16:36:20 +0000
committerMartin Storsjö <martin@martin.st>2010-03-15 16:36:20 +0000
commitad2ae6dbafe262f8755026e23015488a8b23d7ca (patch)
treebd5a616430b3612d526186f062092ae6b98ef220
parentec55edba312199245d7b830284b861673d27e999 (diff)
downloadffmpeg-ad2ae6dbafe262f8755026e23015488a8b23d7ca.tar.gz
Don't let ff_rtsp_read_reply skip interleaved RTP/TCP packets in rtsp_write_packet.
Skip interleaved packets manually and recheck if there's more to be read. Originally committed as revision 22548 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/rtspenc.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/libavformat/rtspenc.c b/libavformat/rtspenc.c
index 22db85809f..052c5c868b 100644
--- a/libavformat/rtspenc.c
+++ b/libavformat/rtspenc.c
@@ -72,20 +72,30 @@ static int rtsp_write_packet(AVFormatContext *s, AVPacket *pkt)
struct timeval tv;
AVFormatContext *rtpctx;
AVPacket local_pkt;
+ int ret;
- FD_ZERO(&rfds);
tcp_fd = url_get_file_handle(rt->rtsp_hd);
- FD_SET(tcp_fd, &rfds);
+ while (1) {
+ FD_ZERO(&rfds);
+ FD_SET(tcp_fd, &rfds);
tv.tv_sec = 0;
tv.tv_usec = 0;
n = select(tcp_fd + 1, &rfds, NULL, NULL, &tv);
- if (n > 0) {
+ if (n <= 0)
+ break;
if (FD_ISSET(tcp_fd, &rfds)) {
RTSPMessageHeader reply;
- if (ff_rtsp_read_reply(s, &reply, NULL, 0) < 0)
+ /* Don't let ff_rtsp_read_reply handle interleaved packets,
+ * since it would block and wait for an RTSP reply on the socket
+ * (which may not be coming any time soon) if it handles
+ * interleaved packets internally. */
+ ret = ff_rtsp_read_reply(s, &reply, NULL, 1);
+ if (ret < 0)
return AVERROR(EPIPE);
+ if (ret == 1)
+ ff_rtsp_skip_packet(s);
/* XXX: parse message */
if (rt->state != RTSP_STATE_STREAMING)
return AVERROR(EPIPE);