mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-15 11:17:49 +00:00
rtsp: Factor out packet reading
This commit is contained in:
parent
4141a5a240
commit
150e99d694
@ -2043,6 +2043,44 @@ static int pick_stream(AVFormatContext *s, RTSPStream **rtsp_st,
|
|||||||
return AVERROR(EAGAIN);
|
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 = ffio_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)
|
int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
|
||||||
{
|
{
|
||||||
RTSPState *rt = s->priv_data;
|
RTSPState *rt = s->priv_data;
|
||||||
@ -2107,30 +2145,7 @@ redo:
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(rt->lower_transport) {
|
len = read_packet(s, &rtsp_st, first_queue_st, wait_end);
|
||||||
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 = ffio_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 == AVERROR(EAGAIN) && first_queue_st &&
|
if (len == AVERROR(EAGAIN) && first_queue_st &&
|
||||||
rt->transport == RTSP_TRANSPORT_RTP) {
|
rt->transport == RTSP_TRANSPORT_RTP) {
|
||||||
av_log(s, AV_LOG_WARNING,
|
av_log(s, AV_LOG_WARNING,
|
||||||
@ -2141,8 +2156,7 @@ redo:
|
|||||||
}
|
}
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
return len;
|
return len;
|
||||||
if (len == 0)
|
|
||||||
return AVERROR_EOF;
|
|
||||||
if (rt->transport == RTSP_TRANSPORT_RDT) {
|
if (rt->transport == RTSP_TRANSPORT_RDT) {
|
||||||
ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, &rt->recvbuf, len);
|
ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, &rt->recvbuf, len);
|
||||||
} else if (rt->transport == RTSP_TRANSPORT_RTP) {
|
} else if (rt->transport == RTSP_TRANSPORT_RTP) {
|
||||||
|
Loading…
Reference in New Issue
Block a user