Camera tracking integration
[blender.git] / source / blender / blenkernel / intern / seqcache.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Peter Schlaile <peter [at] schlaile [dot] de> 2010
21  *
22  * Contributor(s): Sergey Sharybin
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/blenkernel/intern/seqcache.c
28  *  \ingroup bke
29  */
30
31
32 #include <stddef.h>
33
34 #include "BLO_sys_types.h"      /* for intptr_t */
35
36 #include "MEM_guardedalloc.h"
37
38 #include "DNA_sequence_types.h"
39 #include "BKE_sequencer.h"
40
41 #include "IMB_moviecache.h"
42
43 typedef struct seqCacheKey 
44 {
45         struct Sequence * seq;
46         SeqRenderData context;
47         float cfra;
48         seq_stripelem_ibuf_t type;
49 } seqCacheKey;
50
51 static struct MovieCache *moviecache = NULL;
52
53 static unsigned int seqcache_hashhash(const void *key_)
54 {
55         const seqCacheKey *key = (seqCacheKey*) key_;
56         unsigned int rval = seq_hash_render_data(&key->context);
57
58         rval ^= *(unsigned int*) &key->cfra;
59         rval += key->type;
60         rval ^= ((intptr_t) key->seq) << 6;
61
62         return rval;
63 }
64
65 static int seqcache_hashcmp(const void *a_, const void *b_)
66 {
67         const seqCacheKey * a = (seqCacheKey*) a_;
68         const seqCacheKey * b = (seqCacheKey*) b_;
69
70         if (a->seq < b->seq) {
71                 return -1;              
72         }
73         if (a->seq > b->seq) {
74                 return 1;
75         }
76
77         if (a->cfra < b->cfra) {
78                 return -1;
79         }
80         if (a->cfra > b->cfra) {
81                 return 1;
82         }
83
84         if (a->type < b->type) {
85                 return -1;
86         }
87         if (a->type > b->type) {
88                 return 1;
89         }
90
91         return seq_cmp_render_data(&a->context, &b->context);
92 }
93
94 void seq_stripelem_cache_destruct(void)
95 {
96         if(moviecache)
97                 IMB_moviecache_free(moviecache);
98 }
99
100 void seq_stripelem_cache_cleanup(void)
101 {
102         if(moviecache) {
103                 IMB_moviecache_free(moviecache);
104                 moviecache = IMB_moviecache_create(sizeof(seqCacheKey), seqcache_hashhash,
105                                 seqcache_hashcmp, NULL);
106         }
107 }
108
109 struct ImBuf * seq_stripelem_cache_get(
110         SeqRenderData context, struct Sequence * seq, 
111         float cfra, seq_stripelem_ibuf_t type)
112 {
113
114         if(moviecache && seq) {
115                 seqCacheKey key;
116
117                 key.seq = seq;
118                 key.context = context;
119                 key.cfra = cfra - seq->start;
120                 key.type = type;
121
122                 return IMB_moviecache_get(moviecache, &key);
123         }
124
125         return NULL;
126 }
127
128 void seq_stripelem_cache_put(
129         SeqRenderData context, struct Sequence * seq, 
130         float cfra, seq_stripelem_ibuf_t type, struct ImBuf * i)
131 {
132         seqCacheKey key;
133
134         if (!i) {
135                 return;
136         }
137
138         if(!moviecache) {
139                 moviecache = IMB_moviecache_create(sizeof(seqCacheKey), seqcache_hashhash,
140                                 seqcache_hashcmp, NULL);
141         }
142
143         key.seq = seq;
144         key.context = context;
145         key.cfra = cfra - seq->start;
146         key.type = type;
147
148         IMB_moviecache_put(moviecache, &key, i);
149 }