# HG changeset patch # User mstorsjo # Date 1268670980 0 # Node ID 6821f3887d0ed1330aebf2d5542b8b52c979c4b9 # Parent 7512694b051561282e76c87b6e464614bd32fb7a 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. diff -r 7512694b0515 -r 6821f3887d0e rtspenc.c --- a/rtspenc.c Mon Mar 15 16:31:15 2010 +0000 +++ b/rtspenc.c Mon Mar 15 16:36:20 2010 +0000 @@ -72,20 +72,30 @@ 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);