Merge commit '150e99d694f33ab9ad678834964909aa315d14a1'
authorJames Almer <jamrial@gmail.com>
Wed, 4 Oct 2017 00:34:08 +0000 (21:34 -0300)
committerJames Almer <jamrial@gmail.com>
Wed, 4 Oct 2017 00:34:08 +0000 (21:34 -0300)
* commit '150e99d694f33ab9ad678834964909aa315d14a1':
  rtsp: Factor out packet reading

Merged-by: James Almer <jamrial@gmail.com>
1  2 
libavformat/rtsp.c

@@@ -2054,6 -2043,44 +2054,44 @@@ static int pick_stream(AVFormatContext 
      return AVERROR(EAGAIN);
  }
  
 -            len = ffio_read_partial(s->pb, rt->recvbuf, RECVBUF_SIZE);
+ static int read_packet(AVFormatContext *s,
+                        RTSPStream **rtsp_st, RTSPStream *first_queue_st,
+                        int64_t wait_end)
+ {
+     RTSPState *rt = s->priv_data;
+     int len;
+     switch(rt->lower_transport) {
+     default:
+ #if CONFIG_RTSP_DEMUXER
+     case RTSP_LOWER_TRANSPORT_TCP:
+         len = ff_rtsp_tcp_read_packet(s, rtsp_st, rt->recvbuf, RECVBUF_SIZE);
+         break;
+ #endif
+     case RTSP_LOWER_TRANSPORT_UDP:
+     case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
+         len = udp_read_packet(s, rtsp_st, rt->recvbuf, RECVBUF_SIZE, wait_end);
+         if (len > 0 && (*rtsp_st)->transport_priv && rt->transport == RTSP_TRANSPORT_RTP)
+             ff_rtp_check_and_send_back_rr((*rtsp_st)->transport_priv, (*rtsp_st)->rtp_handle, NULL, len);
+         break;
+     case RTSP_LOWER_TRANSPORT_CUSTOM:
+         if (first_queue_st && rt->transport == RTSP_TRANSPORT_RTP &&
+             wait_end && wait_end < av_gettime_relative())
+             len = AVERROR(EAGAIN);
+         else
++            len = avio_read_partial(s->pb, rt->recvbuf, RECVBUF_SIZE);
+         len = pick_stream(s, rtsp_st, rt->recvbuf, len);
+         if (len > 0 && (*rtsp_st)->transport_priv && rt->transport == RTSP_TRANSPORT_RTP)
+             ff_rtp_check_and_send_back_rr((*rtsp_st)->transport_priv, NULL, s->pb, len);
+         break;
+     }
+     if (len == 0)
+         return AVERROR_EOF;
+     return len;
+ }
  int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
  {
      RTSPState *rt = s->priv_data;