2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2010-07-23 16:57:11 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* Peter Schlaile <peter [at] schlaile [dot] de> 2010
|
|
|
|
*
|
2011-10-23 17:52:20 +00:00
|
|
|
* Contributor(s): Sergey Sharybin
|
|
|
|
*
|
2010-07-23 16:57:11 +00:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
2011-02-27 20:40:57 +00:00
|
|
|
/** \file blender/blenkernel/intern/seqcache.c
|
|
|
|
* \ingroup bke
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2010-07-23 16:57:11 +00:00
|
|
|
#include <stddef.h>
|
2011-10-23 17:52:20 +00:00
|
|
|
|
2012-06-10 15:20:10 +00:00
|
|
|
#include "BLO_sys_types.h" /* for intptr_t */
|
2010-07-23 16:57:11 +00:00
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
#include "DNA_sequence_types.h"
|
|
|
|
#include "BKE_sequencer.h"
|
|
|
|
|
2011-10-23 17:52:20 +00:00
|
|
|
#include "IMB_moviecache.h"
|
2012-08-08 11:52:14 +00:00
|
|
|
#include "IMB_imbuf_types.h"
|
2010-07-23 16:57:11 +00:00
|
|
|
|
2012-06-10 15:20:10 +00:00
|
|
|
typedef struct SeqCacheKey {
|
|
|
|
struct Sequence *seq;
|
2010-11-21 20:00:31 +00:00
|
|
|
SeqRenderData context;
|
2010-07-23 16:57:11 +00:00
|
|
|
float cfra;
|
|
|
|
seq_stripelem_ibuf_t type;
|
2012-06-10 15:20:10 +00:00
|
|
|
} SeqCacheKey;
|
2010-07-23 16:57:11 +00:00
|
|
|
|
2011-10-23 17:52:20 +00:00
|
|
|
static struct MovieCache *moviecache = NULL;
|
|
|
|
|
2012-08-08 11:15:32 +00:00
|
|
|
static int seq_cmp_render_data(const SeqRenderData *a, const SeqRenderData *b)
|
|
|
|
{
|
|
|
|
if (a->preview_render_size < b->preview_render_size) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a->preview_render_size > b->preview_render_size) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a->rectx < b->rectx) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a->rectx > b->rectx) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a->recty < b->recty) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a->recty > b->recty) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a->bmain < b->bmain) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a->bmain > b->bmain) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a->scene < b->scene) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a->scene > b->scene) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a->motion_blur_shutter < b->motion_blur_shutter) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a->motion_blur_shutter > b->motion_blur_shutter) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a->motion_blur_samples < b->motion_blur_samples) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a->motion_blur_samples > b->motion_blur_samples) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static unsigned int seq_hash_render_data(const SeqRenderData *a)
|
|
|
|
{
|
|
|
|
unsigned int rval = a->rectx + a->recty;
|
|
|
|
|
|
|
|
rval ^= a->preview_render_size;
|
|
|
|
rval ^= ((intptr_t) a->bmain) << 6;
|
|
|
|
rval ^= ((intptr_t) a->scene) << 6;
|
|
|
|
rval ^= (int)(a->motion_blur_shutter * 100.0f) << 10;
|
|
|
|
rval ^= a->motion_blur_samples << 24;
|
|
|
|
|
|
|
|
return rval;
|
|
|
|
}
|
|
|
|
|
2011-10-23 17:52:20 +00:00
|
|
|
static unsigned int seqcache_hashhash(const void *key_)
|
2010-07-23 16:57:11 +00:00
|
|
|
{
|
2012-06-10 15:20:10 +00:00
|
|
|
const SeqCacheKey *key = (SeqCacheKey *) key_;
|
2010-11-21 20:00:31 +00:00
|
|
|
unsigned int rval = seq_hash_render_data(&key->context);
|
2010-07-23 16:57:11 +00:00
|
|
|
|
2012-06-10 15:20:10 +00:00
|
|
|
rval ^= *(unsigned int *) &key->cfra;
|
2010-07-23 16:57:11 +00:00
|
|
|
rval += key->type;
|
2010-09-12 14:46:41 +00:00
|
|
|
rval ^= ((intptr_t) key->seq) << 6;
|
2010-07-23 16:57:11 +00:00
|
|
|
|
|
|
|
return rval;
|
|
|
|
}
|
|
|
|
|
2011-10-23 17:52:20 +00:00
|
|
|
static int seqcache_hashcmp(const void *a_, const void *b_)
|
2010-07-23 16:57:11 +00:00
|
|
|
{
|
2012-06-10 15:20:10 +00:00
|
|
|
const SeqCacheKey *a = (SeqCacheKey *) a_;
|
|
|
|
const SeqCacheKey *b = (SeqCacheKey *) b_;
|
2010-07-23 16:57:11 +00:00
|
|
|
|
|
|
|
if (a->seq < b->seq) {
|
2012-06-10 15:20:10 +00:00
|
|
|
return -1;
|
2010-07-23 16:57:11 +00:00
|
|
|
}
|
|
|
|
if (a->seq > b->seq) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a->cfra < b->cfra) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a->cfra > b->cfra) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a->type < b->type) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a->type > b->type) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-11-21 20:00:31 +00:00
|
|
|
return seq_cmp_render_data(&a->context, &b->context);
|
2010-07-23 16:57:11 +00:00
|
|
|
}
|
|
|
|
|
2012-08-08 11:56:58 +00:00
|
|
|
void BKE_sequencer_cache_destruct(void)
|
2010-07-23 16:57:11 +00:00
|
|
|
{
|
2012-03-24 06:18:31 +00:00
|
|
|
if (moviecache)
|
2011-10-23 17:52:20 +00:00
|
|
|
IMB_moviecache_free(moviecache);
|
2010-07-23 16:57:11 +00:00
|
|
|
}
|
|
|
|
|
2012-08-08 11:56:58 +00:00
|
|
|
void BKE_sequencer_cache_cleanup(void)
|
2010-07-23 16:57:11 +00:00
|
|
|
{
|
2012-03-24 06:18:31 +00:00
|
|
|
if (moviecache) {
|
2011-10-23 17:52:20 +00:00
|
|
|
IMB_moviecache_free(moviecache);
|
2012-07-10 14:43:50 +00:00
|
|
|
moviecache = IMB_moviecache_create("seqcache", sizeof(SeqCacheKey), seqcache_hashhash, seqcache_hashcmp);
|
2010-07-23 16:57:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-08 11:52:14 +00:00
|
|
|
struct ImBuf *BKE_sequencer_cache_get(SeqRenderData context, Sequence *seq, float cfra, seq_stripelem_ibuf_t type)
|
2010-07-23 16:57:11 +00:00
|
|
|
{
|
2012-03-24 06:18:31 +00:00
|
|
|
if (moviecache && seq) {
|
2012-06-10 15:20:10 +00:00
|
|
|
SeqCacheKey key;
|
2010-07-23 16:57:11 +00:00
|
|
|
|
2011-10-23 17:52:20 +00:00
|
|
|
key.seq = seq;
|
|
|
|
key.context = context;
|
|
|
|
key.cfra = cfra - seq->start;
|
|
|
|
key.type = type;
|
2010-07-23 16:57:11 +00:00
|
|
|
|
2011-10-23 17:52:20 +00:00
|
|
|
return IMB_moviecache_get(moviecache, &key);
|
2010-07-23 16:57:11 +00:00
|
|
|
}
|
2011-10-23 17:52:20 +00:00
|
|
|
|
2011-02-13 10:52:18 +00:00
|
|
|
return NULL;
|
2010-07-23 16:57:11 +00:00
|
|
|
}
|
|
|
|
|
2012-08-08 11:52:14 +00:00
|
|
|
void BKE_sequencer_cache_put(SeqRenderData context, Sequence *seq, float cfra, seq_stripelem_ibuf_t type, ImBuf *i)
|
2010-07-23 16:57:11 +00:00
|
|
|
{
|
2012-06-10 15:20:10 +00:00
|
|
|
SeqCacheKey key;
|
2010-07-23 16:57:11 +00:00
|
|
|
|
|
|
|
if (!i) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-03-24 06:18:31 +00:00
|
|
|
if (!moviecache) {
|
2012-07-10 14:43:50 +00:00
|
|
|
moviecache = IMB_moviecache_create("seqcache", sizeof(SeqCacheKey), seqcache_hashhash, seqcache_hashcmp);
|
2010-07-23 16:57:11 +00:00
|
|
|
}
|
|
|
|
|
2011-10-23 17:52:20 +00:00
|
|
|
key.seq = seq;
|
|
|
|
key.context = context;
|
|
|
|
key.cfra = cfra - seq->start;
|
|
|
|
key.type = type;
|
2010-07-23 16:57:11 +00:00
|
|
|
|
2011-10-23 17:52:20 +00:00
|
|
|
IMB_moviecache_put(moviecache, &key, i);
|
2010-07-23 16:57:11 +00:00
|
|
|
}
|