diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-12-26 01:22:52 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-12-26 01:22:52 +0100 |
commit | ce3551896ab4e19d5fa00b7580206b1bfa13675f (patch) | |
tree | ad83794b22928d913509b02a100d10987f92fb65 /libavformat/cache.c | |
parent | 954fc854f23740bf2b87240474cbc3c391449916 (diff) | |
download | ffmpeg-ce3551896ab4e19d5fa00b7580206b1bfa13675f.tar.gz |
avformat/cache: keep cache_pos updated
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/cache.c')
-rw-r--r-- | libavformat/cache.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/libavformat/cache.c b/libavformat/cache.c index 29b4a0687f..9a0c4bba03 100644 --- a/libavformat/cache.c +++ b/libavformat/cache.c @@ -110,6 +110,7 @@ static int add_entry(URLContext *h, const unsigned char *buf, int size) av_log(h, AV_LOG_ERROR, "seek in cache failed\n"); goto fail; } + c->cache_pos = pos; ret = write(c->fd, buf, size); if (ret < 0) { @@ -121,6 +122,7 @@ static int add_entry(URLContext *h, const unsigned char *buf, int size) entry->logical_pos = c->logical_pos; entry->physical_pos = pos; entry->size = ret; + c->cache_pos = entry->physical_pos + entry->size; entry_ret = av_tree_insert(&c->root, entry, cmp, &node); if (entry_ret && entry_ret != entry) { @@ -128,7 +130,6 @@ static int add_entry(URLContext *h, const unsigned char *buf, int size) av_log(h, AV_LOG_ERROR, "av_tree_insert failed\n"); goto fail; } - c->cache_pos = entry->physical_pos + entry->size; return 0; fail: @@ -157,10 +158,13 @@ static int cache_read(URLContext *h, unsigned char *buf, int size) int64_t physical_target = entry->physical_pos + in_block_pos; //FIXME avoid seek if unneeded r = lseek(c->fd, physical_target, SEEK_SET); - if (r >= 0) + if (r >= 0) { + c->cache_pos = r; r = read(c->fd, buf, FFMIN(size, entry->size - in_block_pos)); + } if (r > 0) { + c->cache_pos += r; c->logical_pos += r; c->cache_hit ++; return r; |