Commit: bdb372338b7f4a97b15af1685df9c3b836f0d51b
Author: Antony Riakiotakis
Date:   Wed Feb 4 18:14:12 2015 +0100
Branches: gooseberry
https://developer.blender.org/rBbdb372338b7f4a97b15af1685df9c3b836f0d51b

Sequencer: Implement priority queue based on frame number instead of
memory size (Thanks to sergey for suggestion)

===================================================================

M       source/blender/blenkernel/intern/seqcache.c

===================================================================

diff --git a/source/blender/blenkernel/intern/seqcache.c 
b/source/blender/blenkernel/intern/seqcache.c
index fd03186..5de9d16 100644
--- a/source/blender/blenkernel/intern/seqcache.c
+++ b/source/blender/blenkernel/intern/seqcache.c
@@ -27,6 +27,7 @@
  */
 
 #include <stddef.h>
+#include <stdlib.h>
 
 #include "BLI_sys_types.h"  /* for intptr_t */
 #include "BKE_global.h"
@@ -117,6 +118,36 @@ static bool seqcache_hashcmp(const void *a_, const void 
*b_)
                seq_cmp_render_data(&a->context, &b->context));
 }
 
+typedef struct {
+       int framenr;
+} SeqCachePriorityData;
+
+static void *moviecache_getprioritydata(void *key_v)
+{
+       SeqCacheKey *key = (SeqCacheKey *) key_v;
+       SeqCachePriorityData *priority_data;
+
+       priority_data = MEM_callocN(sizeof(*priority_data), "movie cache clip 
priority data");
+       priority_data->framenr = key->cfra;
+
+       return priority_data;
+}
+
+static int moviecache_getitempriority(void *last_userkey_v, void 
*priority_data_v)
+{
+       SeqCacheKey *last_userkey = (SeqCacheKey *) last_userkey_v;
+       SeqCachePriorityData *priority_data = (SeqCachePriorityData *) 
priority_data_v;
+
+       return -abs(last_userkey->cfra - priority_data->framenr);
+}
+
+static void moviecache_prioritydeleter(void *priority_data_v)
+{
+       SeqCachePriorityData *priority_data = (SeqCachePriorityData *) 
priority_data_v;
+
+       MEM_freeN(priority_data);
+}
+
 void BKE_sequencer_cache_destruct(void)
 {
        if (moviecache)
@@ -130,6 +161,8 @@ void BKE_sequencer_cache_cleanup(void)
        if (moviecache) {
                IMB_moviecache_free(moviecache);
                moviecache = IMB_moviecache_create("seqcache", 
sizeof(SeqCacheKey), seqcache_hashhash, seqcache_hashcmp);
+               IMB_moviecache_set_priority_callback(moviecache, 
moviecache_getprioritydata, moviecache_getitempriority,
+                                                    
moviecache_prioritydeleter);
        }
 
        BKE_sequencer_preprocessed_cache_cleanup();
@@ -175,6 +208,8 @@ void BKE_sequencer_cache_put(const SeqRenderData *context, 
Sequence *seq, float
 
        if (!moviecache) {
                moviecache = IMB_moviecache_create("seqcache", 
sizeof(SeqCacheKey), seqcache_hashhash, seqcache_hashcmp);
+               IMB_moviecache_set_priority_callback(moviecache, 
moviecache_getprioritydata, moviecache_getitempriority,
+                                                    
moviecache_prioritydeleter);
        }
 
        key.seq = seq;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to