[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