avio_flush() did nothing useful for read streams. Fix it to behave as expected, and discard the currently read buffer properly. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.5
@@ -289,10 +289,14 @@ int url_feof(AVIOContext *s); | |||||
int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); | int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); | ||||
/** | /** | ||||
* Force flushing of buffered data to the output s. | |||||
* Force flushing of buffered data. | |||||
* | * | ||||
* Force the buffered data to be immediately written to the output, | |||||
* For write streams, force the buffered data to be immediately written to the output, | |||||
* without to wait to fill the internal buffer. | * without to wait to fill the internal buffer. | ||||
* | |||||
* For read streams, discard all currently buffered data, and advance the | |||||
* reported file position to that of the underlying stream. This does not | |||||
* read new data, and does not perform any seeks. | |||||
*/ | */ | ||||
void avio_flush(AVIOContext *s); | void avio_flush(AVIOContext *s); | ||||
@@ -139,7 +139,7 @@ static void writeout(AVIOContext *s, const uint8_t *data, int len) | |||||
static void flush_buffer(AVIOContext *s) | static void flush_buffer(AVIOContext *s) | ||||
{ | { | ||||
if (s->buf_ptr > s->buffer) { | |||||
if (s->write_flag && s->buf_ptr > s->buffer) { | |||||
writeout(s, s->buffer, s->buf_ptr - s->buffer); | writeout(s, s->buffer, s->buf_ptr - s->buffer); | ||||
if (s->update_checksum) { | if (s->update_checksum) { | ||||
s->checksum = s->update_checksum(s->checksum, s->checksum_ptr, | s->checksum = s->update_checksum(s->checksum, s->checksum_ptr, | ||||
@@ -148,6 +148,8 @@ static void flush_buffer(AVIOContext *s) | |||||
} | } | ||||
} | } | ||||
s->buf_ptr = s->buffer; | s->buf_ptr = s->buffer; | ||||
if (!s->write_flag) | |||||
s->buf_end = s->buffer; | |||||
} | } | ||||
void avio_w8(AVIOContext *s, int b) | void avio_w8(AVIOContext *s, int b) | ||||