# 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;