mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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
This commit is contained in:
parent
8ddd280d2d
commit
4589dc5c4d
@ -290,20 +290,25 @@ void put_tag(ByteIOContext *s, const char *tag)
|
|||||||
|
|
||||||
static void fill_buffer(ByteIOContext *s)
|
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 */
|
/* no need to do anything if EOF already reached */
|
||||||
if (s->eof_reached)
|
if (s->eof_reached)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(s->update_checksum){
|
if(s->update_checksum && dst == s->buffer){
|
||||||
if(s->buf_end > s->checksum_ptr)
|
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= s->update_checksum(s->checksum, s->checksum_ptr, s->buf_end - s->checksum_ptr);
|
||||||
s->checksum_ptr= s->buffer;
|
s->checksum_ptr= s->buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(s->read_packet)
|
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) {
|
if (len <= 0) {
|
||||||
/* do not modify buffer if EOF reached so that a seek back can
|
/* do not modify buffer if EOF reached so that a seek back can
|
||||||
be done without rereading data */
|
be done without rereading data */
|
||||||
@ -312,8 +317,8 @@ static void fill_buffer(ByteIOContext *s)
|
|||||||
s->error= len;
|
s->error= len;
|
||||||
} else {
|
} else {
|
||||||
s->pos += len;
|
s->pos += len;
|
||||||
s->buf_ptr = s->buffer;
|
s->buf_ptr = dst;
|
||||||
s->buf_end = s->buffer + len;
|
s->buf_end = dst + len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user