|
|
|
@ -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) { |
|
|
|
|