summaryrefslogtreecommitdiffstats
path: root/libavformat/rtsp.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2010-10-01 17:41:31 +0000
committerMartin Storsjö <martin@martin.st>2010-10-01 17:41:31 +0000
commit96a7c9753e81ac1f2de12f3249ea7c001d50a3f7 (patch)
tree186f31611a2e0b10ef9b7a3763158ce508e1364a /libavformat/rtsp.c
parent6705dd5f9889d7877b3503fb09b46fb9d875de17 (diff)
downloadffmpeg-streaming-96a7c9753e81ac1f2de12f3249ea7c001d50a3f7.zip
ffmpeg-streaming-96a7c9753e81ac1f2de12f3249ea7c001d50a3f7.tar.gz
rtsp: Use a dynamically allocated receive buffer
Originally committed as revision 25288 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r--libavformat/rtsp.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index ab34900..be99587 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -53,6 +53,7 @@ int rtsp_default_protocols = (1 << RTSP_LOWER_TRANSPORT_UDP);
#define READ_PACKET_TIMEOUT_S 10
#define MAX_TIMEOUTS READ_PACKET_TIMEOUT_S * 1000 / SELECT_TIMEOUT_MS
#define SDP_MAX_SIZE 16384
+#define RECVBUF_SIZE 10 * RTP_MAX_PACKET_LENGTH
static void get_word_until_chars(char *buf, int buf_size,
const char *sep, const char **pp)
@@ -498,6 +499,7 @@ void ff_rtsp_close_streams(AVFormatContext *s)
av_close_input_stream (rt->asf_ctx);
rt->asf_ctx = NULL;
}
+ av_free(rt->recvbuf);
}
static void *rtsp_rtp_mux_open(AVFormatContext *s, AVStream *st,
@@ -1794,7 +1796,6 @@ static int rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
{
RTSPState *rt = s->priv_data;
int ret, len;
- uint8_t buf[10 * RTP_MAX_PACKET_LENGTH];
RTSPStream *rtsp_st;
if (rt->nb_byes == rt->nb_rtsp_streams)
@@ -1817,16 +1818,22 @@ static int rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
/* read next RTP packet */
redo:
+ if (!rt->recvbuf) {
+ rt->recvbuf = av_malloc(RECVBUF_SIZE);
+ if (!rt->recvbuf)
+ return AVERROR(ENOMEM);
+ }
+
switch(rt->lower_transport) {
default:
#if CONFIG_RTSP_DEMUXER
case RTSP_LOWER_TRANSPORT_TCP:
- len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf));
+ len = 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, buf, sizeof(buf));
+ len = udp_read_packet(s, &rtsp_st, rt->recvbuf, RECVBUF_SIZE);
if (len >=0 && rtsp_st->transport_priv && rt->transport == RTSP_TRANSPORT_RTP)
rtp_check_and_send_back_rr(rtsp_st->transport_priv, len);
break;
@@ -1836,9 +1843,9 @@ static int rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
if (len == 0)
return AVERROR_EOF;
if (rt->transport == RTSP_TRANSPORT_RDT) {
- ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, buf, len);
+ ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, rt->recvbuf, len);
} else {
- ret = rtp_parse_packet(rtsp_st->transport_priv, pkt, buf, len);
+ ret = rtp_parse_packet(rtsp_st->transport_priv, pkt, rt->recvbuf, len);
if (ret < 0) {
/* Either bad packet, or a RTCP packet. Check if the
* first_rtcp_ntp_time field was initialized. */
OpenPOWER on IntegriCloud