Commit 7c210c44 authored by Michael Niedermayer's avatar Michael Niedermayer

avformat/cache: Extend cache entries if possible instead of creating new ones

This reduces the number of cache entries and should significantly
reduce memory requirements
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 312151bb
...@@ -94,14 +94,9 @@ static int add_entry(URLContext *h, const unsigned char *buf, int size) ...@@ -94,14 +94,9 @@ static int add_entry(URLContext *h, const unsigned char *buf, int size)
Context *c= h->priv_data; Context *c= h->priv_data;
int64_t pos = -1; int64_t pos = -1;
int ret; int ret;
CacheEntry *entry = av_malloc(sizeof(*entry)); CacheEntry *entry = NULL, *next[2] = {NULL, NULL};
CacheEntry *entry_ret; CacheEntry *entry_ret;
struct AVTreeNode *node = av_tree_node_alloc(); struct AVTreeNode *node = NULL;
if (!entry || !node) {
ret = AVERROR(ENOMEM);
goto fail;
}
//FIXME avoid lseek //FIXME avoid lseek
pos = lseek(c->fd, 0, SEEK_END); pos = lseek(c->fd, 0, SEEK_END);
...@@ -118,18 +113,35 @@ static int add_entry(URLContext *h, const unsigned char *buf, int size) ...@@ -118,18 +113,35 @@ static int add_entry(URLContext *h, const unsigned char *buf, int size)
av_log(h, AV_LOG_ERROR, "write in cache failed\n"); av_log(h, AV_LOG_ERROR, "write in cache failed\n");
goto fail; goto fail;
} }
c->cache_pos += ret;
entry->logical_pos = c->logical_pos; entry = av_tree_find(c->root, &c->logical_pos, cmp, (void**)next);
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)
if (entry_ret && entry_ret != entry) { entry = next[0];
ret = -1;
av_log(h, AV_LOG_ERROR, "av_tree_insert failed\n"); if (!entry ||
goto fail; entry->logical_pos + entry->size != c->logical_pos ||
} entry->physical_pos + entry->size != pos
) {
entry = av_malloc(sizeof(*entry));
node = av_tree_node_alloc();
if (!entry || !node) {
ret = AVERROR(ENOMEM);
goto fail;
}
entry->logical_pos = c->logical_pos;
entry->physical_pos = pos;
entry->size = ret;
entry_ret = av_tree_insert(&c->root, entry, cmp, &node);
if (entry_ret && entry_ret != entry) {
ret = -1;
av_log(h, AV_LOG_ERROR, "av_tree_insert failed\n");
goto fail;
}
} else
entry->size += ret;
return 0; return 0;
fail: fail:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment