changeset 6306:175c5f6cb556 libavformat

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).
author mstorsjo
date Sat, 24 Jul 2010 09:04:44 +0000
parents 0ad342a200fb
children 43fe2984f310
files aviobuf.c
diffstat 1 files changed, 7 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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;