Commit 98713182 authored by Luca Abeni's avatar Luca Abeni

Split the sdp_read_packet() function out of rtsp_read_packet().

This allows to avoid compiling RTSP code when not needed.

Originally committed as revision 20526 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 1ced9da3
...@@ -43,6 +43,8 @@ ...@@ -43,6 +43,8 @@
//#define DEBUG //#define DEBUG
//#define DEBUG_RTP_TCP //#define DEBUG_RTP_TCP
static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
uint8_t *buf, int buf_size);
static int rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply, static int rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply,
unsigned char **content_ptr, unsigned char **content_ptr,
int return_on_interleaved_data); int return_on_interleaved_data);
...@@ -609,6 +611,63 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, ...@@ -609,6 +611,63 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
} }
} }
static int sdp_read_packet(AVFormatContext *s, AVPacket *pkt)
{
RTSPState *rt = s->priv_data;
int ret, len;
uint8_t buf[10 * RTP_MAX_PACKET_LENGTH];
RTSPStream *rtsp_st;
/* get next frames from the same RTP packet */
if (rt->cur_transport_priv) {
if (rt->transport == RTSP_TRANSPORT_RDT)
ret = ff_rdt_parse_packet(rt->cur_transport_priv, pkt, NULL, 0);
else
ret = rtp_parse_packet(rt->cur_transport_priv, pkt, NULL, 0);
if (ret == 0) {
rt->cur_transport_priv = NULL;
return 0;
} else if (ret == 1) {
return 0;
} else {
rt->cur_transport_priv = NULL;
}
}
/* read next RTP packet */
redo:
switch(rt->lower_transport) {
default:
#if CONFIG_RTSP_DEMUXER
case RTSP_LOWER_TRANSPORT_TCP:
len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf));
break;
#endif
case RTSP_LOWER_TRANSPORT_UDP:
case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
len = udp_read_packet(s, &rtsp_st, buf, sizeof(buf));
if (len >=0 && rtsp_st->transport_priv && rt->transport == RTSP_TRANSPORT_RTP)
rtp_check_and_send_back_rr(rtsp_st->transport_priv, len);
break;
}
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, buf, len);
else
ret = rtp_parse_packet(rtsp_st->transport_priv, pkt, buf, len);
if (ret < 0)
goto redo;
if (ret == 1) {
/* more packets may follow, so we save the RTP context */
rt->cur_transport_priv = rtsp_st->transport_priv;
}
return ret;
}
/* close and free RTSP streams */ /* close and free RTSP streams */
static void rtsp_close_streams(RTSPState *rt) static void rtsp_close_streams(RTSPState *rt)
{ {
...@@ -1498,9 +1557,7 @@ static int rtsp_read_packet(AVFormatContext *s, ...@@ -1498,9 +1557,7 @@ static int rtsp_read_packet(AVFormatContext *s,
AVPacket *pkt) AVPacket *pkt)
{ {
RTSPState *rt = s->priv_data; RTSPState *rt = s->priv_data;
RTSPStream *rtsp_st; int ret;
int ret, len;
uint8_t buf[10 * RTP_MAX_PACKET_LENGTH];
RTSPMessageHeader reply1, *reply = &reply1; RTSPMessageHeader reply1, *reply = &reply1;
char cmd[1024]; char cmd[1024];
...@@ -1564,49 +1621,9 @@ static int rtsp_read_packet(AVFormatContext *s, ...@@ -1564,49 +1621,9 @@ static int rtsp_read_packet(AVFormatContext *s,
} }
} }
/* get next frames from the same RTP packet */ ret = sdp_read_packet(s, pkt);
if (rt->cur_transport_priv) { if (ret < 0) {
if (rt->transport == RTSP_TRANSPORT_RDT) return ret;
ret = ff_rdt_parse_packet(rt->cur_transport_priv, pkt, NULL, 0);
else
ret = rtp_parse_packet(rt->cur_transport_priv, pkt, NULL, 0);
if (ret == 0) {
rt->cur_transport_priv = NULL;
return 0;
} else if (ret == 1) {
return 0;
} else {
rt->cur_transport_priv = NULL;
}
}
/* read next RTP packet */
redo:
switch(rt->lower_transport) {
default:
case RTSP_LOWER_TRANSPORT_TCP:
len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf));
break;
case RTSP_LOWER_TRANSPORT_UDP:
case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
len = udp_read_packet(s, &rtsp_st, buf, sizeof(buf));
if (len >=0 && rtsp_st->transport_priv && rt->transport == RTSP_TRANSPORT_RTP)
rtp_check_and_send_back_rr(rtsp_st->transport_priv, len);
break;
}
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, buf, len);
else
ret = rtp_parse_packet(rtsp_st->transport_priv, pkt, buf, len);
if (ret < 0)
goto redo;
if (ret == 1) {
/* more packets may follow, so we save the RTP context */
rt->cur_transport_priv = rtsp_st->transport_priv;
} }
/* send dummy request to keep TCP connection alive */ /* send dummy request to keep TCP connection alive */
...@@ -1777,12 +1794,6 @@ static int sdp_read_header(AVFormatContext *s, ...@@ -1777,12 +1794,6 @@ static int sdp_read_header(AVFormatContext *s,
return err; return err;
} }
static int sdp_read_packet(AVFormatContext *s,
AVPacket *pkt)
{
return rtsp_read_packet(s, pkt);
}
static int sdp_read_close(AVFormatContext *s) static int sdp_read_close(AVFormatContext *s)
{ {
RTSPState *rt = s->priv_data; RTSPState *rt = s->priv_data;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment