summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien Jacobs <aurel@gnuage.org>2010-08-09 23:00:13 +0000
committerAurelien Jacobs <aurel@gnuage.org>2010-08-09 23:00:13 +0000
commitbe73ba2fa4890b857d987b79958e46af8c5e545b (patch)
tree70343f2d3971b7093b02ad98c93d7f58a1091199
parentdfdb353cd565efbd1f64105ce7519ec809ad338d (diff)
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.c15
-rw-r--r--libavformat/rtsp.h6
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,