diff options
author | Aurelien Jacobs <aurel@gnuage.org> | 2010-08-09 23:00:13 +0000 |
---|---|---|
committer | Aurelien Jacobs <aurel@gnuage.org> | 2010-08-09 23:00:13 +0000 |
commit | be73ba2fa4890b857d987b79958e46af8c5e545b (patch) | |
tree | 70343f2d3971b7093b02ad98c93d7f58a1091199 | |
parent | dfdb353cd565efbd1f64105ce7519ec809ad338d (diff) | |
download | ffmpeg-be73ba2fa4890b857d987b79958e46af8c5e545b.tar.gz |
get rid of MAX_STREAMS limit in RTSP
Originally committed as revision 24752 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/rtsp.c | 15 | ||||
-rw-r--r-- | libavformat/rtsp.h | 6 |
2 files changed, 16 insertions, 5 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 4844e19980..53051db8aa 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1611,12 +1611,18 @@ redirect: static int rtsp_read_header(AVFormatContext *s, AVFormatParameters *ap) { + RTSPState *rt = s->priv_data; int ret; ret = ff_rtsp_connect(s); if (ret) return ret; + rt->real_setup_cache = av_mallocz(2 * s->nb_streams * sizeof(*rt->real_setup_cache)); + if (!rt->real_setup_cache) + return AVERROR(ENOMEM); + rt->real_setup = rt->real_setup_cache + s->nb_streams * sizeof(*rt->real_setup); + if (ap->initial_pause) { /* do not start immediately */ } else { @@ -1835,13 +1841,12 @@ static int rtsp_read_packet(AVFormatContext *s, AVPacket *pkt) if (rt->server_type == RTSP_SERVER_REAL) { int i; - enum AVDiscard cache[MAX_STREAMS]; for (i = 0; i < s->nb_streams; i++) - cache[i] = s->streams[i]->discard; + rt->real_setup[i] = s->streams[i]->discard; if (!rt->need_subscription) { - if (memcmp (cache, rt->real_setup_cache, + if (memcmp (rt->real_setup, rt->real_setup_cache, sizeof(enum AVDiscard) * s->nb_streams)) { snprintf(cmd, sizeof(cmd), "Unsubscribe: %s\r\n", @@ -1857,7 +1862,7 @@ static int rtsp_read_packet(AVFormatContext *s, AVPacket *pkt) if (rt->need_subscription) { int r, rule_nr, first = 1; - memcpy(rt->real_setup_cache, cache, + memcpy(rt->real_setup_cache, rt->real_setup, sizeof(enum AVDiscard) * s->nb_streams); rt->last_subscription[0] = 0; @@ -1969,6 +1974,8 @@ static int rtsp_read_close(AVFormatContext *s) ff_rtsp_close_streams(s); ff_rtsp_close_connections(s); ff_network_close(); + rt->real_setup = NULL; + av_freep(&rt->real_setup_cache); return 0; } diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h index 1dba9961c3..814d8d8e8d 100644 --- a/libavformat/rtsp.h +++ b/libavformat/rtsp.h @@ -267,7 +267,11 @@ typedef struct RTSPState { /** stream setup during the last frame read. This is used to detect if * we need to subscribe or unsubscribe to any new streams. */ - enum AVDiscard real_setup_cache[MAX_STREAMS]; + enum AVDiscard *real_setup_cache; + + /** current stream setup. This is a temporary buffer used to compare + * current setup to previous frame setup. */ + enum AVDiscard *real_setup; /** the last value of the "SET_PARAMETER Subscribe:" RTSP command. * this is used to send the same "Unsubscribe:" if stream setup changed, |