Hi Michael! On 2016-11-18 17:03 +0100, Michael Niedermayer wrote: > This allows user apps to stop OOM due to excessive number of streams > TODO: bump & docs > > Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc> > --- > libavformat/avformat.h | 7 +++++++ > libavformat/options_table.h | 1 + > libavformat/utils.c | 2 +- > 3 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index f9f4d72..c81a916 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -1899,6 +1899,13 @@ typedef struct AVFormatContext { > * - decoding: set by user through AVOptions (NO direct access) > */ > char *protocol_blacklist; > + > + /** > + * The maximum number of streams. > + * - encoding: unused > + * - decoding: set by user through AVOptions (NO direct access) > + */ > + int max_streams; > } AVFormatContext; > > int av_format_get_probe_score(const AVFormatContext *s); > diff --git a/libavformat/options_table.h b/libavformat/options_table.h > index 9d61d5a..d5448e5 100644 > --- a/libavformat/options_table.h > +++ b/libavformat/options_table.h > @@ -105,6 +105,7 @@ static const AVOption avformat_options[] = { > {"format_whitelist", "List of demuxers that are allowed to be used", > OFFSET(format_whitelist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, > CHAR_MAX, D }, > {"protocol_whitelist", "List of protocols that are allowed to be used", > OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, > CHAR_MAX, D }, > {"protocol_blacklist", "List of protocols that are not allowed to be used", > OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, > CHAR_MAX, D }, > +{"max_streams", "maximum number of streams", OFFSET(max_streams), > AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 0, INT_MAX, D }, > {NULL}, > }; > > diff --git a/libavformat/utils.c b/libavformat/utils.c > index 5664646..ded0b52 100644 > --- a/libavformat/utils.c > +++ b/libavformat/utils.c > @@ -4210,7 +4210,7 @@ AVStream *avformat_new_stream(AVFormatContext *s, const > AVCodec *c) > int i; > AVStream **streams; > > - if (s->nb_streams >= INT_MAX/sizeof(*streams)) > + if (s->nb_streams >= s->max_streams/sizeof(*streams)) > return NULL; > streams = av_realloc_array(s->streams, s->nb_streams + 1, > sizeof(*streams)); > if (!streams)
Maybe I am completely wrong, if so just tell me and sorry for the noise... You name the option max_streams, but you compare it to nb_streams after you divided it by size of a pointer. I guess you change it that way so the default stays the same. I hope that can be achieved in a different way. Alexander _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel