[SCM] libav/experimental: Append read data onto the buffer instead of overwriting, this ensures that the whole buffer is available for seeking back. Fixes issue480

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:31:27 UTC 2013


The following commit has been merged in the experimental branch:
commit 4589dc5c4d1d84e34da6e2318358e33396d6c326
Author: Michael Niedermayer <michaelni at gmx.at>
Date:   Sat Oct 18 17:30:37 2008 +0000

    Append read data onto the buffer instead of overwriting, this ensures
    that the whole buffer is available for seeking back.
    Fixes issue480
    
    Originally committed as revision 15634 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 46458db..344664c 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -290,20 +290,25 @@ void put_tag(ByteIOContext *s, const char *tag)
 
 static void fill_buffer(ByteIOContext *s)
 {
-    int len=0;
+    uint8_t *dst= s->buf_end - s->buffer < s->buffer_size ? s->buf_ptr : s->buffer;
+    int len= s->buffer_size - (dst - s->buffer);
+
+    assert(s->buf_ptr == s->buf_end);
 
     /* no need to do anything if EOF already reached */
     if (s->eof_reached)
         return;
 
-    if(s->update_checksum){
+    if(s->update_checksum && dst == s->buffer){
         if(s->buf_end > s->checksum_ptr)
             s->checksum= s->update_checksum(s->checksum, s->checksum_ptr, s->buf_end - s->checksum_ptr);
         s->checksum_ptr= s->buffer;
     }
 
     if(s->read_packet)
-        len = s->read_packet(s->opaque, s->buffer, s->buffer_size);
+        len = s->read_packet(s->opaque, dst, len);
+    else
+        len = 0;
     if (len <= 0) {
         /* do not modify buffer if EOF reached so that a seek back can
            be done without rereading data */
@@ -312,8 +317,8 @@ static void fill_buffer(ByteIOContext *s)
             s->error= len;
     } else {
         s->pos += len;
-        s->buf_ptr = s->buffer;
-        s->buf_end = s->buffer + len;
+        s->buf_ptr = dst;
+        s->buf_end = dst + len;
     }
 }
 

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list