aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/aviobuf.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-03-01 23:09:40 +0100
committerMichael Niedermayer <michaelni@gmx.at>2014-03-01 23:57:40 +0100
commit9600486d10a9728f1503363334268ecfafa9b0e5 (patch)
tree08bd28641d97631952f43bde89c7e52bb7a7772e /libavformat/aviobuf.c
parent2adf422ce24bd8038d5d2f50549d0d3fb4170171 (diff)
downloadffmpeg-9600486d10a9728f1503363334268ecfafa9b0e5.tar.gz
avformat/aviobuf: optimize sequential backward seeking
This reduces the number of protocol seeks Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/aviobuf.c')
-rw-r--r--libavformat/aviobuf.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 18431e7086..95fdf200ef 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -234,9 +234,20 @@ int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
if (s->eof_reached)
return AVERROR_EOF;
s->buf_ptr = s->buf_end + offset - s->pos;
- } else {
+ } else if(!s->write_flag && offset1 < 0 && -offset1 < buffer_size>>1 && s->seek && offset > 0) {
int64_t res;
+ pos -= FFMIN(buffer_size>>1, pos);
+ if ((res = s->seek(s->opaque, pos, SEEK_SET)) < 0)
+ return res;
+ s->buf_end =
+ s->buf_ptr = s->buffer;
+ s->pos = pos;
+ s->eof_reached = 0;
+ fill_buffer(s);
+ return avio_seek(s, offset, SEEK_SET | force);
+ } else {
+ int64_t res;
if (s->write_flag) {
flush_buffer(s);
s->must_flush = 1;