{
int64_t buffer_start;
int buffer_size;
- int overlap, new_size;
+ int overlap, new_size, alloc_size;
if (s->write_flag)
return AVERROR(EINVAL);
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;