From 4a04f7206914a49f5f95adc5eb786237f1a9f547 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 23 Oct 2011 17:52:20 +0000 Subject: remove $Id: tags after discussion on the mailign list: http://markmail.org/message/fp7ozcywxum3ar7n --- source/blender/blenkernel/intern/seqcache.c | 172 ++++++---------------------- 1 file changed, 32 insertions(+), 140 deletions(-) (limited to 'source/blender/blenkernel/intern/seqcache.c') diff --git a/source/blender/blenkernel/intern/seqcache.c b/source/blender/blenkernel/intern/seqcache.c index 88e9d9209d4..c5761dcc456 100644 --- a/source/blender/blenkernel/intern/seqcache.c +++ b/source/blender/blenkernel/intern/seqcache.c @@ -1,6 +1,4 @@ /* - * $Id$ - * * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -19,6 +17,8 @@ * * Peter Schlaile 2010 * + * Contributor(s): Sergey Sharybin + * * ***** END GPL LICENSE BLOCK ***** */ @@ -28,22 +28,15 @@ #include -#include -#include -#include + +#include "BLO_sys_types.h" /* for intptr_t */ #include "MEM_guardedalloc.h" -#include "MEM_CacheLimiterC-Api.h" #include "DNA_sequence_types.h" #include "BKE_sequencer.h" -#include "BLI_utildefines.h" -#include "BLI_ghash.h" -#include "BLI_mempool.h" -#include -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" +#include "IMB_moviecache.h" typedef struct seqCacheKey { @@ -53,20 +46,9 @@ typedef struct seqCacheKey seq_stripelem_ibuf_t type; } seqCacheKey; -typedef struct seqCacheEntry -{ - ImBuf * ibuf; - MEM_CacheLimiterHandleC * c_handle; -} seqCacheEntry; - -static GHash * hash = NULL; -static MEM_CacheLimiterC * limitor = NULL; -static struct BLI_mempool * entrypool = NULL; -static struct BLI_mempool * keypool = NULL; -static int ibufs_in = 0; -static int ibufs_rem = 0; - -static unsigned int HashHash(const void *key_) +static struct MovieCache *moviecache = NULL; + +static unsigned int seqcache_hashhash(const void *key_) { const seqCacheKey *key = (seqCacheKey*) key_; unsigned int rval = seq_hash_render_data(&key->context); @@ -78,7 +60,7 @@ static unsigned int HashHash(const void *key_) return rval; } -static int HashCmp(const void *a_, const void *b_) +static int seqcache_hashcmp(const void *a_, const void *b_) { const seqCacheKey * a = (seqCacheKey*) a_; const seqCacheKey * b = (seqCacheKey*) b_; @@ -107,109 +89,37 @@ static int HashCmp(const void *a_, const void *b_) return seq_cmp_render_data(&a->context, &b->context); } -static void HashKeyFree(void *key) -{ - BLI_mempool_free(keypool, key); -} - -static void HashValFree(void *val) -{ - seqCacheEntry* e = (seqCacheEntry*) val; - - if (e->ibuf) { - /* fprintf(stderr, "Removing: %p, cnt: %d\n", e->ibuf, - e->ibuf->refcounter); */ - IMB_freeImBuf(e->ibuf); - MEM_CacheLimiter_unmanage(e->c_handle); - ibufs_rem++; - } - - e->ibuf = NULL; - e->c_handle = NULL; - - BLI_mempool_free(entrypool, e); -} - -static void IMB_seq_cache_destructor(void * p) -{ - seqCacheEntry* e = (seqCacheEntry*) p; - - if (e && e->ibuf) { - /* fprintf(stderr, "Removing: %p, cnt: %d\n", e->ibuf, - e->ibuf->refcounter); */ - IMB_freeImBuf(e->ibuf); - ibufs_rem++; - - e->ibuf = NULL; - e->c_handle = NULL; - } -} - -void seq_stripelem_cache_init(void) -{ - hash = BLI_ghash_new(HashHash, HashCmp, "seq stripelem cache hash"); - limitor = new_MEM_CacheLimiter( IMB_seq_cache_destructor ); - - entrypool = BLI_mempool_create(sizeof(seqCacheEntry), 64, 64, 0); - keypool = BLI_mempool_create(sizeof(seqCacheKey), 64, 64, 0); -} - void seq_stripelem_cache_destruct(void) { - if (!entrypool) { - return; - } - BLI_ghash_free(hash, HashKeyFree, HashValFree); - delete_MEM_CacheLimiter(limitor); - BLI_mempool_destroy(entrypool); - BLI_mempool_destroy(keypool); + if(moviecache) + IMB_moviecache_free(moviecache); } void seq_stripelem_cache_cleanup(void) { - if (!entrypool) { - seq_stripelem_cache_init(); + if(moviecache) { + IMB_moviecache_free(moviecache); + moviecache = IMB_moviecache_create(sizeof(seqCacheKey), seqcache_hashhash, + seqcache_hashcmp, NULL); } - - /* fprintf(stderr, "Stats before cleanup: in: %d rem: %d\n", - ibufs_in, ibufs_rem); */ - - BLI_ghash_free(hash, HashKeyFree, HashValFree); - hash = BLI_ghash_new(HashHash, HashCmp, "seq stripelem cache hash"); - - /* fprintf(stderr, "Stats after cleanup: in: %d rem: %d\n", - ibufs_in, ibufs_rem); */ - } struct ImBuf * seq_stripelem_cache_get( SeqRenderData context, struct Sequence * seq, float cfra, seq_stripelem_ibuf_t type) { - seqCacheKey key; - seqCacheEntry * e; - if (!seq) { - return NULL; - } + if(moviecache && seq) { + seqCacheKey key; - if (!entrypool) { - seq_stripelem_cache_init(); - } + key.seq = seq; + key.context = context; + key.cfra = cfra - seq->start; + key.type = type; - key.seq = seq; - key.context = context; - key.cfra = cfra - seq->start; - key.type = type; - - e = (seqCacheEntry*) BLI_ghash_lookup(hash, &key); - - if (e && e->ibuf) { - IMB_refImBuf(e->ibuf); - - MEM_CacheLimiter_touch(e->c_handle); - return e->ibuf; + return IMB_moviecache_get(moviecache, &key); } + return NULL; } @@ -217,39 +127,21 @@ void seq_stripelem_cache_put( SeqRenderData context, struct Sequence * seq, float cfra, seq_stripelem_ibuf_t type, struct ImBuf * i) { - seqCacheKey * key; - seqCacheEntry * e; + seqCacheKey key; if (!i) { return; } - ibufs_in++; - - if (!entrypool) { - seq_stripelem_cache_init(); + if(!moviecache) { + moviecache = IMB_moviecache_create(sizeof(seqCacheKey), seqcache_hashhash, + seqcache_hashcmp, NULL); } - key = (seqCacheKey*) BLI_mempool_alloc(keypool); - - key->seq = seq; - key->context = context; - key->cfra = cfra - seq->start; - key->type = type; - - IMB_refImBuf(i); - - e = (seqCacheEntry*) BLI_mempool_alloc(entrypool); - - e->ibuf = i; - e->c_handle = NULL; - - BLI_ghash_remove(hash, key, HashKeyFree, HashValFree); - BLI_ghash_insert(hash, key, e); - - e->c_handle = MEM_CacheLimiter_insert(limitor, e); + key.seq = seq; + key.context = context; + key.cfra = cfra - seq->start; + key.type = type; - MEM_CacheLimiter_ref(e->c_handle); - MEM_CacheLimiter_enforce_limits(limitor); - MEM_CacheLimiter_unref(e->c_handle); + IMB_moviecache_put(moviecache, &key, i); } -- cgit v1.2.3