From 186ec1784336df11df48e646595e2ec646f82329 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 30 Jun 2013 18:18:13 +0200 Subject: [PATCH] avformat/aviobuf: Add ffio_ensure_seekback() Signed-off-by: Michael Niedermayer --- libavformat/avio_internal.h | 9 +++++++++ libavformat/aviobuf.c | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+) 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;