Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Michael Niedermayer authored on 2014/03/27 07:58:48... | ... |
@@ -146,6 +146,13 @@ typedef struct AVIOContext { |
146 | 146 |
* This field is internal to libavformat and access from outside is not allowed. |
147 | 147 |
*/ |
148 | 148 |
int writeout_count; |
149 |
+ |
|
150 |
+ /** |
|
151 |
+ * Original buffer size |
|
152 |
+ * used internally after probing and ensure seekback to reset the buffer size |
|
153 |
+ * This field is internal to libavformat and access from outside is not allowed. |
|
154 |
+ */ |
|
155 |
+ int orig_buffer_size; |
|
149 | 156 |
} AVIOContext; |
150 | 157 |
|
151 | 158 |
/* unbuffered I/O */ |
... | ... |
@@ -78,6 +78,7 @@ int ffio_init_context(AVIOContext *s, |
78 | 78 |
int64_t (*seek)(void *opaque, int64_t offset, int whence)) |
79 | 79 |
{ |
80 | 80 |
s->buffer = buffer; |
81 |
+ s->orig_buffer_size = |
|
81 | 82 |
s->buffer_size = buffer_size; |
82 | 83 |
s->buf_ptr = buffer; |
83 | 84 |
s->opaque = opaque; |
... | ... |
@@ -434,14 +435,14 @@ static void fill_buffer(AVIOContext *s) |
434 | 434 |
} |
435 | 435 |
|
436 | 436 |
/* make buffer smaller in case it ended up large after probing */ |
437 |
- if (s->read_packet && s->buffer_size > max_buffer_size) { |
|
437 |
+ if (s->read_packet && s->orig_buffer_size && s->buffer_size > s->orig_buffer_size) { |
|
438 | 438 |
if (dst == s->buffer) { |
439 |
- ffio_set_buf_size(s, max_buffer_size); |
|
439 |
+ ffio_set_buf_size(s, s->orig_buffer_size); |
|
440 | 440 |
|
441 | 441 |
s->checksum_ptr = dst = s->buffer; |
442 | 442 |
} |
443 |
- av_assert0(len >= max_buffer_size); |
|
444 |
- len = max_buffer_size; |
|
443 |
+ av_assert0(len >= s->orig_buffer_size); |
|
444 |
+ len = s->orig_buffer_size; |
|
445 | 445 |
} |
446 | 446 |
|
447 | 447 |
if (s->read_packet) |
... | ... |
@@ -792,6 +793,7 @@ int ffio_set_buf_size(AVIOContext *s, int buf_size) |
792 | 792 |
|
793 | 793 |
av_free(s->buffer); |
794 | 794 |
s->buffer = buffer; |
795 |
+ s->orig_buffer_size = |
|
795 | 796 |
s->buffer_size = buf_size; |
796 | 797 |
s->buf_ptr = buffer; |
797 | 798 |
url_resetbuf(s, s->write_flag ? AVIO_FLAG_WRITE : AVIO_FLAG_READ); |