diff options
author | Martin Storsjö <martin@martin.st> | 2013-01-07 18:39:04 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2013-01-08 11:22:37 +0200 |
commit | 8729698d50739524665090e083d1bfdf28235724 (patch) | |
tree | b58cae850c1e0c524f59bd546eed72a599f400ea /libavformat/rtsp.c | |
parent | 7ff3fd7ae4d6b178501f2f98ff64cbaad02752cc (diff) | |
download | ffmpeg-8729698d50739524665090e083d1bfdf28235724.tar.gz |
rtsp: Recheck the reordering queue if getting a new packet
If we timed out and consumed a packet from the reordering queue,
but didn't return a packet to the caller, recheck the queue status.
Otherwise, we could end up in an infinite loop, trying to consume
a queued packet that has already been consumed.
CC: libav-stable@libav.org
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r-- | libavformat/rtsp.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 134b3223e4..b3e54442af 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1867,6 +1867,7 @@ int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt) rt->cur_transport_priv = NULL; } +redo: if (rt->transport == RTSP_TRANSPORT_RTP) { int i; int64_t first_queue_time = 0; @@ -1882,12 +1883,15 @@ int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt) first_queue_st = rt->rtsp_streams[i]; } } - if (first_queue_time) + if (first_queue_time) { wait_end = first_queue_time + s->max_delay; + } else { + wait_end = 0; + first_queue_st = NULL; + } } /* read next RTP packet */ - redo: if (!rt->recvbuf) { rt->recvbuf = av_malloc(RECVBUF_SIZE); if (!rt->recvbuf) |