Commit 50789e35 authored by Gyan Doshi's avatar Gyan Doshi

avformat/cache - delete cache file after closing handle

Verified that cache files get deleted on Windows.
parent a6818d5b
...@@ -54,6 +54,7 @@ typedef struct CacheEntry { ...@@ -54,6 +54,7 @@ typedef struct CacheEntry {
typedef struct Context { typedef struct Context {
AVClass *class; AVClass *class;
int fd; int fd;
char *filename;
struct AVTreeNode *root; struct AVTreeNode *root;
int64_t logical_pos; int64_t logical_pos;
int64_t cache_pos; int64_t cache_pos;
...@@ -72,6 +73,7 @@ static int cmp(const void *key, const void *node) ...@@ -72,6 +73,7 @@ static int cmp(const void *key, const void *node)
static int cache_open(URLContext *h, const char *arg, int flags, AVDictionary **options) static int cache_open(URLContext *h, const char *arg, int flags, AVDictionary **options)
{ {
int ret;
char *buffername; char *buffername;
Context *c= h->priv_data; Context *c= h->priv_data;
...@@ -83,8 +85,12 @@ static int cache_open(URLContext *h, const char *arg, int flags, AVDictionary ** ...@@ -83,8 +85,12 @@ static int cache_open(URLContext *h, const char *arg, int flags, AVDictionary **
return c->fd; return c->fd;
} }
unlink(buffername); ret = unlink(buffername);
av_freep(&buffername);
if (ret >= 0)
av_freep(&buffername);
else
c->filename = buffername;
return ffurl_open_whitelist(&c->inner, arg, flags, &h->interrupt_callback, return ffurl_open_whitelist(&c->inner, arg, flags, &h->interrupt_callback,
options, h->protocol_whitelist, h->protocol_blacklist, h); options, h->protocol_whitelist, h->protocol_blacklist, h);
...@@ -292,11 +298,18 @@ static int enu_free(void *opaque, void *elem) ...@@ -292,11 +298,18 @@ static int enu_free(void *opaque, void *elem)
static int cache_close(URLContext *h) static int cache_close(URLContext *h)
{ {
Context *c= h->priv_data; Context *c= h->priv_data;
int ret;
av_log(h, AV_LOG_INFO, "Statistics, cache hits:%"PRId64" cache misses:%"PRId64"\n", av_log(h, AV_LOG_INFO, "Statistics, cache hits:%"PRId64" cache misses:%"PRId64"\n",
c->cache_hit, c->cache_miss); c->cache_hit, c->cache_miss);
close(c->fd); close(c->fd);
if (c->filename) {
ret = unlink(c->filename);
if (ret < 0)
av_log(h, AV_LOG_ERROR, "Could not delete %s.\n", c->filename);
av_freep(&c->filename);
}
ffurl_close(c->inner); ffurl_close(c->inner);
av_tree_enumerate(c->root, NULL, NULL, enu_free); av_tree_enumerate(c->root, NULL, NULL, enu_free);
av_tree_destroy(c->root); av_tree_destroy(c->root);
......
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