[FFmpeg-cvslog] avformat/cache: remember EOF point if hit and use it to handle SEEK_END
Michael Niedermayer
git at videolan.org
Thu Dec 25 22:11:05 CET 2014
ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Thu Dec 25 21:27:04 2014 +0100| [681559d3ffebcba3c525b7c7f94a58cc36847ee1] | committer: Michael Niedermayer
avformat/cache: remember EOF point if hit and use it to handle SEEK_END
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=681559d3ffebcba3c525b7c7f94a58cc36847ee1
---
libavformat/cache.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/libavformat/cache.c b/libavformat/cache.c
index ef33d17..9d1b4b9 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) {
More information about the ffmpeg-cvslog
mailing list