diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-06-30 18:18:13 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-07-04 19:13:38 +0200 |
commit | 186ec1784336df11df48e646595e2ec646f82329 (patch) | |
tree | 517c54149f39834c172b7d00369002755a5fedc8 | |
parent | 2ca48e466675a8a3630061cd2c15325eab8eda97 (diff) | |
download | ffmpeg-186ec1784336df11df48e646595e2ec646f82329.tar.gz |
avformat/aviobuf: Add ffio_ensure_seekback()
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/avio_internal.h | 9 | ||||
-rw-r--r-- | libavformat/aviobuf.c | 25 |
2 files changed, 34 insertions, 0 deletions
diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h index cf3676402b..311e297e9a 100644 --- a/libavformat/avio_internal.h +++ b/libavformat/avio_internal.h @@ -71,6 +71,15 @@ uint64_t ffio_read_varlen(AVIOContext *bc); /** @warning must be called before any I/O */ int ffio_set_buf_size(AVIOContext *s, int buf_size); +/** + * Ensures that the requested seekback buffer size will be available + * + * Will ensure that when reading sequentially up to buf_size, seeking + * within the current pos and pos+buf_size is possible. + * Once the stream position moves outside this window this gurantee is lost. + */ +int ffio_ensure_seekback(AVIOContext *s, int buf_size); + int ffio_limit(AVIOContext *s, int size); void ffio_init_checksum(AVIOContext *s, diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 790c26155f..93a187b4aa 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -725,6 +725,31 @@ int ffio_fdopen(AVIOContext **s, URLContext *h) return 0; } +int ffio_ensure_seekback(AVIOContext *s, int buf_size) +{ + uint8_t *buffer; + int max_buffer_size = s->max_packet_size ? + s->max_packet_size : IO_BUFFER_SIZE; + + buf_size += s->buf_ptr - s->buffer + max_buffer_size; + + if (buf_size < s->buffer_size || s->seekable) + return 0; + av_assert0(!s->write_flag); + + buffer = av_malloc(buf_size); + if (!buffer) + return AVERROR(ENOMEM); + + memcpy(buffer, s->buffer, s->buffer_size); + av_free(s->buffer); + s->buf_ptr = buffer + (s->buf_ptr - s->buffer); + s->buf_end = buffer + (s->buf_end - s->buffer); + s->buffer = buffer; + s->buffer_size = buf_size; + return 0; +} + int ffio_set_buf_size(AVIOContext *s, int buf_size) { uint8_t *buffer; |