]> git.sesse.net Git - ffmpeg/commitdiff
rtsp: Recheck the reordering queue if getting a new packet
authorMartin Storsjö <martin@martin.st>
Mon, 7 Jan 2013 16:39:04 +0000 (18:39 +0200)
committerMartin Storsjö <martin@martin.st>
Tue, 8 Jan 2013 09:22:37 +0000 (11:22 +0200)
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>
libavformat/rtsp.c

index 134b3223e4bc48efabc966ef50d117d3b0c157df..b3e54442af109c5c503775adfe3ba913322fddeb 100644 (file)
@@ -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)