diff --git a/libavformat/avio.h b/libavformat/avio.h index 7cf14f9f8c..920526f028 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -120,6 +120,12 @@ typedef struct { * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. */ int seekable; + + /** + * max filesize, used to limit allocations + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t maxsize; } AVIOContext; /* unbuffered I/O */ diff --git a/libavformat/utils.c b/libavformat/utils.c index 183aaff2b2..10cd6f3066 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -267,7 +267,15 @@ AVInputFormat *av_find_input_format(const char *short_name) int av_get_packet(AVIOContext *s, AVPacket *pkt, int size) { - int ret= av_new_packet(pkt, size); + int ret; + + if(s->maxsize>0){ + int64_t remaining= s->maxsize - avio_tell(s); + if(remaining>=0) + size= FFMIN(size, remaining); + } + + ret= av_new_packet(pkt, size); if(ret<0) return ret;