aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/rtsp.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2017-10-03 21:34:08 -0300
committerJames Almer <jamrial@gmail.com>2017-10-03 21:34:08 -0300
commitc244d4af43a160cfff84e368b5591f2a411eb001 (patch)
tree9904c71f9a580e69d857372569ac0381a733fd5f /libavformat/rtsp.c
parenta2b0602cdad8da62c137f7db07b608d6bbbcefaa (diff)
parent150e99d694f33ab9ad678834964909aa315d14a1 (diff)
downloadffmpeg-c244d4af43a160cfff84e368b5591f2a411eb001.tar.gz
Merge commit '150e99d694f33ab9ad678834964909aa315d14a1'
* commit '150e99d694f33ab9ad678834964909aa315d14a1': rtsp: Factor out packet reading Merged-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r--libavformat/rtsp.c66
1 files changed, 40 insertions, 26 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 0bd72dc5ce..736559eab3 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -2054,6 +2054,44 @@ static int pick_stream(AVFormatContext *s, RTSPStream **rtsp_st,
return AVERROR(EAGAIN);
}
+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;
@@ -2118,30 +2156,7 @@ redo:
return AVERROR(ENOMEM);
}
- 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;
- }
+ len = read_packet(s, &rtsp_st, first_queue_st, wait_end);
if (len == AVERROR(EAGAIN) && first_queue_st &&
rt->transport == RTSP_TRANSPORT_RTP) {
av_log(s, AV_LOG_WARNING,
@@ -2152,8 +2167,7 @@ redo:
}
if (len < 0)
return len;
- if (len == 0)
- return AVERROR_EOF;
+
if (rt->transport == RTSP_TRANSPORT_RDT) {
ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, &rt->recvbuf, len);
} else if (rt->transport == RTSP_TRANSPORT_RTP) {