Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-08-08 20:46:40 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-08-08 20:46:40 +0400
commita0a67d298416946fff9ac824c9d9d7907a903fb5 (patch)
treee123e6950d3ca2bd66c8c4f14982939180e19e4c /source/blender/blenkernel
parent2a78c2d30405d17d804125e903e3fbec0f10d582 (diff)
Sequencer: initial support of refreshing only changed sequences
Before this the the whole sequencer cache would be invalidated when hanging sequence settings. This was completely annoying because changing color balance settings would re-load image file for which color balance is happening on every change, In fact it's still an issue if color balance is changing for image strip itself, but if this strip has got effect and color balance is changing for it file wouldn't be reloaded.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h4
-rw-r--r--source/blender/blenkernel/intern/seqcache.c13
-rw-r--r--source/blender/blenkernel/intern/sequencer.c27
3 files changed, 44 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index 1e4f7cf105c..8a051e5de2d 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -229,6 +229,8 @@ struct ImBuf *BKE_sequencer_cache_get(SeqRenderData context, struct Sequence *se
void BKE_sequencer_cache_put(SeqRenderData context, struct Sequence *seq, float cfra, seq_stripelem_ibuf_t type, struct ImBuf *nval);
+void BKE_sequencer_cache_cleanup_sequence(struct Sequence *seq);
+
/* **********************************************************************
* seqeffects.c
*
@@ -274,6 +276,8 @@ void BKE_sequencer_free_imbuf(struct Scene *scene, struct ListBase *seqbasep, in
struct Sequence *BKE_sequence_dupli_recursive(struct Scene *scene, struct Scene *scene_to, struct Sequence *seq, int dupe_flag);
int BKE_sequence_swap(struct Sequence *seq_a, struct Sequence *seq_b, const char **error_str);
+void BKE_sequence_invalidate_cache(struct Scene *scene, struct Sequence *seq);
+
void BKE_sequencer_update_sound_bounds_all(struct Scene *scene);
void BKE_sequencer_update_sound_bounds(struct Scene *scene, struct Sequence *seq);
void BKE_sequencer_update_muting(struct Editing *ed);
diff --git a/source/blender/blenkernel/intern/seqcache.c b/source/blender/blenkernel/intern/seqcache.c
index 4f2eaba82a5..a4ea5d1fb26 100644
--- a/source/blender/blenkernel/intern/seqcache.c
+++ b/source/blender/blenkernel/intern/seqcache.c
@@ -170,6 +170,19 @@ void BKE_sequencer_cache_cleanup(void)
}
}
+static int seqcache_key_check_seq(void *userkey, void *userdata)
+{
+ SeqCacheKey *key = (SeqCacheKey *) userkey;
+ Sequence *seq = (Sequence *) userdata;
+
+ return key->seq == seq;
+}
+
+void BKE_sequencer_cache_cleanup_sequence(Sequence *seq)
+{
+ IMB_moviecache_cleanup(moviecache, seqcache_key_check_seq, seq);
+}
+
struct ImBuf *BKE_sequencer_cache_get(SeqRenderData context, Sequence *seq, float cfra, seq_stripelem_ibuf_t type)
{
if (moviecache && seq) {
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index d5a766ef97e..1488c1c2188 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -2711,6 +2711,33 @@ static void free_anim_seq(Sequence *seq)
}
}
+void BKE_sequence_invalidate_cache(Scene *scene, Sequence *seq)
+{
+ Editing *ed = scene->ed;
+ Sequence *cur;
+ int left = seq->start, right = seq->start + seq->len;
+
+ /* invalidate cache for current sequence */
+ BKE_sequencer_cache_cleanup_sequence(seq);
+
+ /* invalidate cache for all dependent sequences */
+ SEQ_BEGIN (ed, cur)
+ {
+ int cur_left = cur->start, cur_right = cur->start + cur->len;
+
+ /* sequence is outside of changed one, shouldn't be invalidated */
+ if (cur_right < left || cur_left > right)
+ continue;
+
+ /* sequence is below changed one, not dependent on it */
+ if (cur->machine < seq->machine)
+ continue;
+
+ BKE_sequencer_cache_cleanup_sequence(cur);
+ }
+ SEQ_END
+}
+
void BKE_sequencer_free_imbuf(Scene *scene, ListBase *seqbase, int check_mem_usage, int keep_file_handles)
{
Sequence *seq;