[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36716] trunk/blender: [PATCH] == Sequencer ==

Peter Schlaile peter at schlaile.de
Mon May 16 19:14:48 CEST 2011


Revision: 36716
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36716
Author:   schlaile
Date:     2011-05-16 17:14:47 +0000 (Mon, 16 May 2011)
Log Message:
-----------
[PATCH] == Sequencer ==

This patch adds adjustment layer tracks to the sequencer and does some cleaning
up of the code.

What's an adjustment layer?

Think of it as an effect track, which takes no explicit input, but alters
the output of everything down the layer stack.

So: you can add several stages of color correction with it.

And: you can even use it with metastrips to group several adjustments together.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_sequencer.py
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/intern/seqeffects.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
    trunk/blender/source/blender/makesdna/DNA_sequence_types.h
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_sequencer.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_sequencer.py	2011-05-16 13:34:42 UTC (rev 36715)
+++ trunk/blender/release/scripts/startup/bl_ui/space_sequencer.py	2011-05-16 17:14:47 UTC (rev 36716)
@@ -213,6 +213,7 @@
         layout.operator("sequencer.effect_strip_add", text="Color").type = 'COLOR'
         layout.operator("sequencer.effect_strip_add", text="Speed Control").type = 'SPEED'
         layout.operator("sequencer.effect_strip_add", text="Multicam Selector").type = 'MULTICAM'
+        layout.operator("sequencer.effect_strip_add", text="Adjustment Layer").type = 'ADJUSTMENT'
 
 
 class SEQUENCER_MT_strip(bpy.types.Menu):
@@ -391,7 +392,7 @@
                               'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
                               'PLUGIN',
                               'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED',
-                              'MULTICAM'}
+                              'MULTICAM', 'ADJUSTMENT'}
 
     def draw(self, context):
         layout = self.layout
@@ -530,7 +531,7 @@
                               'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
                               'PLUGIN',
                               'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
-                              'MULTICAM', 'SPEED'}
+                              'MULTICAM', 'SPEED', 'ADJUSTMENT'}
 
     def draw(self, context):
         layout = self.layout
@@ -680,7 +681,7 @@
                               'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
                               'PLUGIN',
                               'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
-                              'MULTICAM', 'SPEED'}
+                              'MULTICAM', 'SPEED', 'ADJUSTMENT'}
 
     def draw(self, context):
         layout = self.layout

Modified: trunk/blender/source/blender/blenkernel/BKE_sequencer.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2011-05-16 13:34:42 UTC (rev 36715)
+++ trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2011-05-16 17:14:47 UTC (rev 36716)
@@ -268,6 +268,10 @@
 void seq_sound_init(struct Scene *scene, struct Sequence *seq);
 struct Sequence *seq_foreground_frame_get(struct Scene *scene, int frame);
 struct ListBase *seq_seqbase(struct ListBase *seqbase, struct Sequence *seq);
+struct Sequence *seq_metastrip(
+	ListBase * seqbase /* = ed->seqbase */, 
+	struct Sequence * meta /* = NULL */, struct Sequence *seq);
+
 void seq_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs);
 void seq_dupe_animdata(struct Scene *scene, char *name_from, char *name_to);
 int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test, struct Scene *evil_scene);

Modified: trunk/blender/source/blender/blenkernel/intern/seqeffects.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/seqeffects.c	2011-05-16 13:34:42 UTC (rev 36715)
+++ trunk/blender/source/blender/blenkernel/intern/seqeffects.c	2011-05-16 17:14:47 UTC (rev 36716)
@@ -2859,6 +2859,83 @@
 }
 
 /* **********************************************************************
+   ADJUSTMENT
+   ********************************************************************** */
+
+/* no effect inputs for adjustment, we use give_ibuf_seq */
+static int num_inputs_adjustment(void)
+{
+	return 0;
+}
+
+static int early_out_adjustment(struct Sequence *UNUSED(seq), float UNUSED(facf0), float UNUSED(facf1))
+{
+	return -1;
+}
+
+static struct ImBuf * do_adjustment_impl(SeqRenderData context, Sequence * seq,
+					 float cfra)
+{
+	Editing * ed;
+	ListBase * seqbasep;
+	struct ImBuf * i = 0;
+
+	ed = context.scene->ed;
+
+	seqbasep = seq_seqbase(&ed->seqbase, seq);
+
+	if (seq->machine > 0) {
+		i = give_ibuf_seqbase(context, cfra,
+				      seq->machine - 1, seqbasep);
+	}
+
+	/* found nothing? so let's work the way up the metastrip stack, so
+	   that it is possible to group a bunch of adjustment strips into
+	   a metastrip and have that work on everything below the metastrip
+	*/
+	   
+	if (!i) {
+		Sequence * meta;
+
+		meta = seq_metastrip(&ed->seqbase, NULL, seq);
+
+		if (meta) {
+			i = do_adjustment_impl(context, meta, cfra);
+		}
+	}
+
+	return i;
+}
+
+static struct ImBuf * do_adjustment(
+	SeqRenderData context, Sequence *seq, float cfra,
+	float UNUSED(facf0), float UNUSED(facf1),
+	struct ImBuf *UNUSED(ibuf1), struct ImBuf *UNUSED(ibuf2), 
+	struct ImBuf *UNUSED(ibuf3))
+{
+	struct ImBuf * i = 0;
+	struct ImBuf * out;
+	Editing * ed;
+
+	ed = context.scene->ed;
+
+	if (!ed) {
+		return NULL;
+	}
+
+	i = do_adjustment_impl(context, seq, cfra);
+
+	if (input_have_to_preprocess(context, seq, cfra)) {
+		out = IMB_dupImBuf(i);
+		IMB_freeImBuf(i);
+	} else {
+		out = i;
+	}
+	
+	return out;
+}
+
+/* **********************************************************************
    SPEED
    ********************************************************************** */
 static void init_speed_effect(Sequence *seq)
@@ -3256,6 +3333,11 @@
 		rval.early_out = early_out_multicam;
 		rval.execute = do_multicam;
 		break;
+	case SEQ_ADJUSTMENT:
+		rval.num_inputs = num_inputs_adjustment;
+		rval.early_out = early_out_adjustment;
+		rval.execute = do_adjustment;
+		break;
 	}
 
 	return rval;

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c	2011-05-16 13:34:42 UTC (rev 36715)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c	2011-05-16 17:14:47 UTC (rev 36716)
@@ -79,10 +79,16 @@
 #define snprintf _snprintf
 #endif
 
-/* **** XXX ******** */
-//static void waitcursor(int val) {}
-//static int blender_test_break() {return 0;}
 
+static ImBuf* seq_render_strip_stack( 
+	SeqRenderData context, ListBase *seqbasep, float cfra, int chanshown);
+
+static ImBuf * seq_render_strip(
+	SeqRenderData context, Sequence * seq, float cfra);
+
+static void seq_free_animdata(Scene *scene, Sequence *seq);
+
+
 /* **** XXX ******** */
 #define SELECT 1
 ListBase seqbase_clipboard;
@@ -177,8 +183,6 @@
 	MEM_freeN(strip);
 }
 
-static void seq_free_animdata(Scene *scene, Sequence *seq);
-
 void seq_free_sequence(Scene *scene, Sequence *seq)
 {
 	if(seq->strip) seq_free_strip(seq->strip);
@@ -191,6 +195,10 @@
 		sh.free(seq);
 	}
 
+	if(seq->sound) {
+		((ID *)seq->sound)->us--; 
+	}
+
 	/* clipboard has no scene and will never have a sound handle or be active */
 	if(scene) {
 		Editing *ed = scene->ed;
@@ -446,52 +454,7 @@
   * in metastrips!)
   **********************************************************************
 */
-#if 0 /* UNUSED */
-static void do_seq_count(ListBase *seqbase, int *totseq)
-{
-	Sequence *seq;
 
-	seq= seqbase->first;
-	while(seq) {
-		(*totseq)++;
-		if(seq->seqbase.first) do_seq_count(&seq->seqbase, totseq);
-		seq= seq->next;
-	}
-}
-
-static void do_build_seqar(ListBase *seqbase, Sequence ***seqar, int depth)
-{
-	Sequence *seq;
-
-	seq= seqbase->first;
-	while(seq) {
-		seq->depth= depth;
-		if(seq->seqbase.first) do_build_seqar(&seq->seqbase, seqar, depth+1);
-		**seqar= seq;
-		(*seqar)++;
-		seq= seq->next;
-	}
-}
-
-static void build_seqar(ListBase *seqbase, Sequence  ***seqar, int *totseq)
-{
-	Sequence **tseqar;
-
-	*totseq= 0;
-	do_seq_count(seqbase, totseq);
-
-	if(*totseq==0) {
-		*seqar= NULL;
-		return;
-	}
-	*seqar= MEM_mallocN(sizeof(void *)* *totseq, "seqar");
-	tseqar= *seqar;
-
-	do_build_seqar(seqbase, seqar, 0);
-	*seqar= tseqar;
-}
-#endif /* UNUSED */
-
 static void do_seq_count_cb(ListBase *seqbase, int *totseq,
 				int (*test_func)(Sequence * seq))
 {
@@ -916,6 +879,7 @@
 	case SEQ_TRANSFORM:  return "Transform";
 	case SEQ_COLOR:      return "Color";
 	case SEQ_MULTICAM:   return "Multicam";
+	case SEQ_ADJUSTMENT: return "Adjustment";
 	case SEQ_SPEED:      return "Speed";
 	default:
 		return NULL;
@@ -1093,16 +1057,13 @@
 	}
 
 	if(evaluate_seq_frame_gen(seq_arr, seqbasep, cfra)) {
-		if (b > 0) {
-			if (seq_arr[b] == NULL) {
-				return 0;
+		if (b == 0) {
+			b = MAXSEQ;
+		}
+		for (; b > 0; b--) {
+			if (video_seq_is_rendered(seq_arr[b])) {
+				break;
 			}
-		} else {
-			for (b = MAXSEQ; b > 0; b--) {
-				if (video_seq_is_rendered(seq_arr[b])) {
-					break;
-				}
-			}
 		}
 	}
 	
@@ -2855,7 +2816,10 @@
    since they work a bit differently to normal image seq's (during transform) */
 int seq_single_check(Sequence *seq)
 {
-	return (seq->len==1 && ELEM3(seq->type, SEQ_IMAGE, SEQ_COLOR, SEQ_MULTICAM));
+	return (seq->len==1 && (
+			seq->type == SEQ_IMAGE 
+			|| ((seq->type & SEQ_EFFECT) && 
+			    get_sequence_effect_num_inputs(seq->type) == 0)));
 }
 
 /* check if the selected seq's reference unselected seq's */
@@ -3214,6 +3178,24 @@
 	return NULL;
 }
 
+Sequence *seq_metastrip(ListBase * seqbase, Sequence * meta, Sequence *seq)
+{
+	Sequence * iseq;
+
+	for(iseq = seqbase->first; iseq; iseq = iseq->next) {
+		Sequence * rval;
+
+		if (seq == iseq) {
+			return meta;
+		} else if(iseq->seqbase.first && 
+			(rval = seq_metastrip(&iseq->seqbase, iseq, seq))) {
+			return rval;
+		}
+	}
+
+	return NULL;
+}
+
 int seq_swap(Sequence *seq_a, Sequence *seq_b)
 {
 	char name[sizeof(seq_a->name)];

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c	2011-05-16 13:34:42 UTC (rev 36715)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c	2011-05-16 17:14:47 UTC (rev 36716)
@@ -633,12 +633,13 @@
 			BKE_reportf(op->reports, RPT_ERROR, "Sequencer plugin \"%s\" could not load.", path);
 			return OPERATOR_CANCELLED;
 		}
-	}
-	else if (seq->type==SEQ_COLOR) {
+	} else if (seq->type == SEQ_COLOR) {
 		SolidColorVars *colvars= (SolidColorVars *)seq->effectdata;
 		RNA_float_get_array(op->ptr, "color", colvars->col);
 		seq->blend_mode= SEQ_CROSS; /* so alpha adjustment fade to the strip below */
 
+	} else if (seq->type == SEQ_ADJUSTMENT) {
+		seq->blend_mode= SEQ_CROSS;
 	}
 
 	// XXX, this conflicts with giving a channel with invoke, perhaps we should have an active channel

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list