summaryrefslogtreecommitdiff
path: root/libavformat/cache.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-12-25 21:27:04 +0100
committerMichael Niedermayer <michaelni@gmx.at>2014-12-25 22:07:23 +0100
commit681559d3ffebcba3c525b7c7f94a58cc36847ee1 (patch)
treea12b0636284bed9317a7c3d0f05864f917190b17 /libavformat/cache.c
parent0c0168a2104b9f7020e82059121679d302cefa40 (diff)
downloadffmpeg-681559d3ffebcba3c525b7c7f94a58cc36847ee1.tar.gz
avformat/cache: remember EOF point if hit and use it to handle SEEK_END
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/cache.c')
-rw-r--r--libavformat/cache.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/libavformat/cache.c b/libavformat/cache.c
index ef33d173cf..9d1b4b97e4 100644
--- a/libavformat/cache.c
+++ b/libavformat/cache.c
@@ -57,6 +57,7 @@ typedef struct Context {
int64_t cache_pos;
int64_t inner_pos;
int64_t end;
+ int is_true_eof;
URLContext *inner;
int64_t cache_hit, cache_miss;
} Context;
@@ -174,6 +175,10 @@ static int cache_read(URLContext *h, unsigned char *buf, int size)
}
r = ffurl_read(c->inner, buf, size);
+ if (r == 0 && size>0) {
+ c->is_true_eof = 1;
+ av_assert0(c->end >= c->logical_pos);
+ }
if (r<=0)
return r;
c->inner_pos += r;
@@ -198,6 +203,8 @@ static int64_t cache_seek(URLContext *h, int64_t pos, int whence)
if (ffurl_seek(c->inner, c->inner_pos, SEEK_SET) < 0)
av_log(h, AV_LOG_ERROR, "Inner protocol failed to seekback\n");
}
+ if (pos > 0)
+ c->is_true_eof = 1;
c->end = FFMAX(c->end, pos);
return pos;
}
@@ -205,6 +212,9 @@ static int64_t cache_seek(URLContext *h, int64_t pos, int whence)
if (whence == SEEK_CUR) {
whence = SEEK_SET;
pos += c->logical_pos;
+ } else if (whence == SEEK_END && c->is_true_eof) {
+ whence = SEEK_SET;
+ pos += c->end;
}
if (whence == SEEK_SET && pos >= 0 && pos < c->end) {