# HG changeset patch # User mstorsjo # Date 1279962284 0 # Node ID 175c5f6cb556af75b59c247adb780d3f503c8915 # Parent 0ad342a200fbb014763ba75ee9c403747bebc474 Never shrink the ByteIOContext buffer in ff_rewind_with_probe_data If there is little unread data in the ByteIOContext buffer, this may lead to reducing the size of the ByteIOContext buffer to little more the probe data size. This can lead to suboptimal aviobuf behaviour, e.g. making some demuxers fail to do short seeks backwards (if the input isn't seekable). diff -r 0ad342a200fb -r 175c5f6cb556 aviobuf.c --- a/aviobuf.c Sat Jul 24 08:43:52 2010 +0000 +++ b/aviobuf.c Sat Jul 24 09:04:44 2010 +0000 @@ -667,7 +667,7 @@ { int64_t buffer_start; int buffer_size; - int overlap, new_size; + int overlap, new_size, alloc_size; if (s->write_flag) return AVERROR(EINVAL); @@ -681,17 +681,20 @@ overlap = buf_size - buffer_start; new_size = buf_size + buffer_size - overlap; - if (new_size > buf_size) { - if (!(buf = av_realloc(buf, new_size))) + alloc_size = FFMAX(s->buffer_size, new_size); + if (alloc_size > buf_size) + if (!(buf = av_realloc(buf, alloc_size))) return AVERROR(ENOMEM); + if (new_size > buf_size) { memcpy(buf + buf_size, s->buffer + overlap, buffer_size - overlap); buf_size = new_size; } av_free(s->buffer); s->buf_ptr = s->buffer = buf; - s->pos = s->buffer_size = buf_size; + s->buffer_size = alloc_size; + s->pos = buf_size; s->buf_end = s->buf_ptr + buf_size; s->eof_reached = 0; s->must_flush = 0;