[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49702] trunk/blender/source/blender: Sequencer: initial support of refreshing only changed sequences

Sergey Sharybin sergey.vfx at gmail.com
Wed Aug 8 18:46:40 CEST 2012


Revision: 49702
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49702
Author:   nazgul
Date:     2012-08-08 16:46:40 +0000 (Wed, 08 Aug 2012)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/intern/seqcache.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c

Modified: trunk/blender/source/blender/blenkernel/BKE_sequencer.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-08-08 16:46:12 UTC (rev 49701)
+++ trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-08-08 16:46:40 UTC (rev 49702)
@@ -229,6 +229,8 @@
 
 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 @@
 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);

Modified: trunk/blender/source/blender/blenkernel/intern/seqcache.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/seqcache.c	2012-08-08 16:46:12 UTC (rev 49701)
+++ trunk/blender/source/blender/blenkernel/intern/seqcache.c	2012-08-08 16:46:40 UTC (rev 49702)
@@ -170,6 +170,19 @@
 	}
 }
 
+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) {

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-08-08 16:46:12 UTC (rev 49701)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-08-08 16:46:40 UTC (rev 49702)
@@ -2711,6 +2711,33 @@
 	}
 }
 
+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;

Modified: trunk/blender/source/blender/makesrna/intern/rna_sequencer.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_sequencer.c	2012-08-08 16:46:12 UTC (rev 49701)
+++ trunk/blender/source/blender/makesrna/intern/rna_sequencer.c	2012-08-08 16:46:40 UTC (rev 49702)
@@ -59,6 +59,11 @@
 
 #ifdef RNA_RUNTIME
 
+typedef struct SequenceSearchData {
+	Sequence *seq;
+	void *data;
+} SequenceSearchData;
+
 /* build a temp reference to the parent */
 static void meta_tmp_ref(Sequence *seq_par, Sequence *seq)
 {
@@ -292,67 +297,92 @@
 
 static int transform_seq_cmp_cb(Sequence *seq, void *arg_pt)
 {
-	struct { Sequence *seq; void *transform; } *data = arg_pt;
+	SequenceSearchData *data = arg_pt;
 
-	if (seq->strip && seq->strip->transform == data->transform) {
+	if (seq->strip && seq->strip->transform == data->data) {
 		data->seq = seq;
 		return -1; /* done so bail out */
 	}
 	return 1;
 }
 
-static char *rna_SequenceTransform_path(PointerRNA *ptr)
+static Sequence *sequence_get_by_transform(Editing *ed, StripTransform *transform)
 {
-	Scene *scene = ptr->id.data;
-	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
-	Sequence *seq;
+	SequenceSearchData data;
 
-	struct { Sequence *seq; void *transform; } data;
 	data.seq = NULL;
-	data.transform = ptr->data;
+	data.data = transform;
 
 	/* irritating we need to search for our sequence! */
 	BKE_sequencer_base_recursive_apply(&ed->seqbase, transform_seq_cmp_cb, &data);
-	seq = data.seq;
 
+	return data.seq;
+}
+
+static char *rna_SequenceTransform_path(PointerRNA *ptr)
+{
+	Scene *scene = ptr->id.data;
+	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
+	Sequence *seq = sequence_get_by_transform(ed, ptr->data);
+
 	if (seq && seq->name + 2)
 		return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].transform", seq->name + 2);
 	else
 		return BLI_strdup("");
 }
 
+static void rna_SequenceTransform_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
+{
+	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
+	Sequence *seq = sequence_get_by_transform(ed, ptr->data);
+
+	BKE_sequence_invalidate_cache(scene, seq);
+}
+
 static int crop_seq_cmp_cb(Sequence *seq, void *arg_pt)
 {
-	struct { Sequence *seq; void *crop; } *data = arg_pt;
+	SequenceSearchData *data = arg_pt;
 
-	if (seq->strip && seq->strip->crop == data->crop) {
+	if (seq->strip && seq->strip->crop == data->data) {
 		data->seq = seq;
 		return -1; /* done so bail out */
 	}
 	return 1;
 }
 
-static char *rna_SequenceCrop_path(PointerRNA *ptr)
+static Sequence *sequence_get_by_crop(Editing *ed, StripCrop *crop)
 {
-	Scene *scene = ptr->id.data;
-	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
-	Sequence *seq;
+	SequenceSearchData data;
 
-	struct { Sequence *seq; void *crop; } data;
 	data.seq = NULL;
-	data.crop = ptr->data;
+	data.data = crop;
 
 	/* irritating we need to search for our sequence! */
 	BKE_sequencer_base_recursive_apply(&ed->seqbase, crop_seq_cmp_cb, &data);
-	seq = data.seq;
 
+	return data.seq;
+}
+
+static char *rna_SequenceCrop_path(PointerRNA *ptr)
+{
+	Scene *scene = ptr->id.data;
+	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
+	Sequence *seq = sequence_get_by_crop(ed, ptr->data);
+
 	if (seq && seq->name + 2)
 		return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].crop", seq->name + 2);
 	else
 		return BLI_strdup("");
 }
 
+static void rna_SequenceCrop_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
+{
+	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
+	Sequence *seq = sequence_get_by_crop(ed, ptr->data);
 
+	BKE_sequence_invalidate_cache(scene, seq);
+}
+
 /* name functions that ignore the first two characters */
 static void rna_Sequence_name_get(PointerRNA *ptr, char *value)
 {
@@ -575,12 +605,15 @@
 }
 #endif
 
-static void rna_Sequence_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr))
+static void rna_Sequence_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
 {
 	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
 
-	if (ed)
-		BKE_sequencer_free_imbuf(scene, &ed->seqbase, FALSE, TRUE);
+	if (ed) {
+		Sequence *seq = (Sequence *) ptr->data;
+
+		BKE_sequence_invalidate_cache(scene, seq);
+	}
 }
 
 static void rna_Sequence_update_reopen_files(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
@@ -611,32 +644,43 @@
 
 static int seqproxy_seq_cmp_cb(Sequence *seq, void *arg_pt)
 {
-	struct { Sequence *seq; void *seq_proxy; } *data = arg_pt;
+	SequenceSearchData *data = arg_pt;
 
-	if (seq->strip && seq->strip->proxy == data->seq_proxy) {
+	if (seq->strip && seq->strip->proxy == data->data) {
 		data->seq = seq;
 		return -1; /* done so bail out */
 	}
 	return 1;
 }
 
-static void rna_Sequence_tcindex_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static Sequence *sequence_get_by_proxy(Editing *ed, StripProxy *proxy)
 {
-	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
-	Sequence *seq;
+	SequenceSearchData data;
 
-	struct { Sequence *seq; void *seq_proxy; } data;
-
 	data.seq = NULL;
-	data.seq_proxy = ptr->data;
+	data.data = proxy;
 
 	BKE_sequencer_base_recursive_apply(&ed->seqbase, seqproxy_seq_cmp_cb, &data);
-	seq = data.seq;
+	return data.seq;
+}
 
+static void rna_Sequence_tcindex_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
+	Sequence *seq = sequence_get_by_proxy(ed, ptr->data);
+
 	BKE_sequence_reload_new_file(scene, seq, FALSE);
 	rna_Sequence_frame_change_update(scene, seq);
 }
 
+static void rna_SequenceProxy_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
+{
+	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
+	Sequence *seq = sequence_get_by_proxy(ed, ptr->data);
+
+	BKE_sequence_invalidate_cache(scene, seq);
+}
+
 /* do_versions? */
 static float rna_Sequence_opacity_get(PointerRNA *ptr)
 {
@@ -650,37 +694,50 @@
 	seq->blend_opacity = value * 100.0f;
 }
 
-
 static int colbalance_seq_cmp_cb(Sequence *seq, void *arg_pt)
 {
-	struct { Sequence *seq; void *color_balance; } *data = arg_pt;
+	SequenceSearchData *data = arg_pt;
 
-	if (seq->strip && seq->strip->color_balance == data->color_balance) {
+	if (seq->strip && seq->strip->color_balance == data->data) {
 		data->seq = seq;
 		return -1; /* done so bail out */
 	}
 	return 1;
 }
-static char *rna_SequenceColorBalance_path(PointerRNA *ptr)
+
+static Sequence *sequence_get_by_colorbalance(Editing *ed, StripColorBalance *cb)
 {
-	Scene *scene = ptr->id.data;
-	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
-	Sequence *seq;
+	SequenceSearchData data;
 
-	struct { Sequence *seq; void *color_balance; } data;
 	data.seq = NULL;
-	data.color_balance = ptr->data;
+	data.data = cb;
 
 	/* irritating we need to search for our sequence! */
 	BKE_sequencer_base_recursive_apply(&ed->seqbase, colbalance_seq_cmp_cb, &data);
-	seq = data.seq;
 
+	return data.seq;
+}
+
+static char *rna_SequenceColorBalance_path(PointerRNA *ptr)
+{
+	Scene *scene = ptr->id.data;
+	Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
+	Sequence *seq = sequence_get_by_colorbalance(ed, ptr->data);
+
 	if (seq && seq->name + 2)
 		return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].color_balance", seq->name + 2);
 	else
 		return BLI_strdup("");
 }
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list