Mercurial > libavformat.hg
comparison aviobuf.c @ 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 | 1b2b5dbcf549 |
children | daed56aa74bc |
comparison
equal
deleted
inserted
replaced
6305:0ad342a200fb | 6306:175c5f6cb556 |
---|---|
665 | 665 |
666 int ff_rewind_with_probe_data(ByteIOContext *s, unsigned char *buf, int buf_size) | 666 int ff_rewind_with_probe_data(ByteIOContext *s, unsigned char *buf, int buf_size) |
667 { | 667 { |
668 int64_t buffer_start; | 668 int64_t buffer_start; |
669 int buffer_size; | 669 int buffer_size; |
670 int overlap, new_size; | 670 int overlap, new_size, alloc_size; |
671 | 671 |
672 if (s->write_flag) | 672 if (s->write_flag) |
673 return AVERROR(EINVAL); | 673 return AVERROR(EINVAL); |
674 | 674 |
675 buffer_size = s->buf_end - s->buffer; | 675 buffer_size = s->buf_end - s->buffer; |
679 return AVERROR(EINVAL); | 679 return AVERROR(EINVAL); |
680 | 680 |
681 overlap = buf_size - buffer_start; | 681 overlap = buf_size - buffer_start; |
682 new_size = buf_size + buffer_size - overlap; | 682 new_size = buf_size + buffer_size - overlap; |
683 | 683 |
684 alloc_size = FFMAX(s->buffer_size, new_size); | |
685 if (alloc_size > buf_size) | |
686 if (!(buf = av_realloc(buf, alloc_size))) | |
687 return AVERROR(ENOMEM); | |
688 | |
684 if (new_size > buf_size) { | 689 if (new_size > buf_size) { |
685 if (!(buf = av_realloc(buf, new_size))) | |
686 return AVERROR(ENOMEM); | |
687 | |
688 memcpy(buf + buf_size, s->buffer + overlap, buffer_size - overlap); | 690 memcpy(buf + buf_size, s->buffer + overlap, buffer_size - overlap); |
689 buf_size = new_size; | 691 buf_size = new_size; |
690 } | 692 } |
691 | 693 |
692 av_free(s->buffer); | 694 av_free(s->buffer); |
693 s->buf_ptr = s->buffer = buf; | 695 s->buf_ptr = s->buffer = buf; |
694 s->pos = s->buffer_size = buf_size; | 696 s->buffer_size = alloc_size; |
697 s->pos = buf_size; | |
695 s->buf_end = s->buf_ptr + buf_size; | 698 s->buf_end = s->buf_ptr + buf_size; |
696 s->eof_reached = 0; | 699 s->eof_reached = 0; |
697 s->must_flush = 0; | 700 s->must_flush = 0; |
698 | 701 |
699 return 0; | 702 return 0; |