[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18464] trunk/blender/source/blender/ python/api2_2x/sceneSequence.c: can now add sequencer effects with the python api

Campbell Barton ideasman42 at gmail.com
Mon Jan 12 16:58:32 CET 2009


Revision: 18464
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18464
Author:   campbellbarton
Date:     2009-01-12 16:58:32 +0100 (Mon, 12 Jan 2009)

Log Message:
-----------
can now add sequencer effects with the python api
also fixed crashes when incorrect args were used

cross = 13; track= 5; frame = 1 # no effect constants 
scene.sequence.new((cross, seq1, seq2), frame, track)

Modified Paths:
--------------
    trunk/blender/source/blender/python/api2_2x/sceneSequence.c

Modified: trunk/blender/source/blender/python/api2_2x/sceneSequence.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/sceneSequence.c	2009-01-12 15:25:17 UTC (rev 18463)
+++ trunk/blender/source/blender/python/api2_2x/sceneSequence.c	2009-01-12 15:58:32 UTC (rev 18464)
@@ -43,6 +43,7 @@
 #include "BIF_editsound.h" // RFS: sound_open_hdaudio
 #include "BLI_blenlib.h"
 #include "BSE_sequence.h"
+#include "BSE_seqeffects.h"
 #include "Ipo.h"
 #include "blendef.h"  /* CLAMP */
 #include "BKE_utildefines.h"
@@ -116,12 +117,16 @@
 	{NULL, NULL, 0, NULL}
 };
 
+
 /* use to add a sequence to a scene or its listbase */
 static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
 {
 	PyObject *py_data = NULL;
 	
 	Sequence *seq;
+	PyObject *pyob1= NULL, *pyob2= NULL, *pyob3= NULL; /* for effects */
+	int type;
+
 	int a;
 	Strip *strip;
 	StripElem *se;
@@ -130,17 +135,98 @@
 	if( !PyArg_ParseTuple( args, "Oii", &py_data, &start, &machine ) )
 		return EXPP_ReturnPyObjError( PyExc_ValueError,
 			"expect sequence data then 2 ints - (seqdata, start, track)" );
-	
+
+	if (machine < 1 || machine >= MAXSEQ) {
+		return EXPP_ReturnPyObjError( PyExc_ValueError,
+			"track out of range" );
+	}
+
 	seq = alloc_sequence(seqbase, start, machine); /* warning, this sets last */
+
+
+	if (PyArg_ParseTuple( py_data, "iO!|O!O!", &type, &Sequence_Type, &pyob1, &Sequence_Type, &pyob2, &Sequence_Type, &pyob3)) {
 	
-	if (PyTuple_Check(py_data) && PyTuple_GET_SIZE(py_data) == 2) {
+		struct SeqEffectHandle sh;
+		Sequence *seq1, *seq2= NULL, *seq3= NULL; /* for effects */
+
+		seq1= ((BPy_Sequence *)pyob1)->seq;
+		if(pyob2) seq2= ((BPy_Sequence *)pyob2)->seq;
+		if(pyob3) seq3= ((BPy_Sequence *)pyob3)->seq;
+
+		if (type <= SEQ_EFFECT || type > SEQ_EFFECT_MAX || type==SEQ_PLUGIN){
+			BLI_remlink(seqbase, seq);
+			free_sequence(seq);
+			
+			return EXPP_ReturnPyObjError( PyExc_ValueError,
+				"sequencer type out of range, expected a value from 9 to 29, plugins not supported");
+		}
+	
+
+		if (BLI_findindex(seqbase, seq1)==-1 || (seq2 && BLI_findindex(seqbase, seq2)==-1) || (seq3 && BLI_findindex(seqbase, seq3)==-1)) {
+			BLI_remlink(seqbase, seq);
+			free_sequence(seq);
+			
+			return EXPP_ReturnPyObjError( PyExc_ValueError,
+				"one of the given effect sequences wasnt in accessible at the same level as the sequence being added");
+		}
+
+		if ((seq2 && seq2==seq1) || (seq3 && (seq3==seq1 || seq3==seq2))) {
+			BLI_remlink(seqbase, seq);
+			free_sequence(seq);
+			
+			return EXPP_ReturnPyObjError( PyExc_ValueError,
+				"2 or more of the sequence arguments were the same");
+
+		}
+
+		/* allocate and initialize */
+		seq->type= type;
+
+		sh = get_sequence_effect(seq);
+
+		seq->seq1= seq1;
+		seq->seq2= seq2;
+		seq->seq3= seq3;
+
+		sh.init(seq);
+
+		if (!seq1) {
+			seq->len= 1;
+			seq->startstill= 25;
+			seq->endstill= 24;
+		}
+
+		calc_sequence(seq);
+
+		seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
+		strip->len= seq->len;
+		strip->us= 1;
+		if(seq->len>0)
+			strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+
+#if 0
+		/* initialize plugin */
+		if(newseq->type == SEQ_PLUGIN) {
+			sh.init_plugin(seq, str);
+
+			if(newseq->plugin==0) {
+				BLI_remlink(ed->seqbasep, seq);
+				free_sequence(seq);
+				return 0;
+			}
+		}
+#endif
+
+		update_changed_seq_and_deps(seq, 1, 1);
+
+	} else if (PyTuple_Check(py_data) && PyTuple_GET_SIZE(py_data) == 2) {
 		/* Image */
 		PyObject *list;
 		char *name;
 		
 		if (!PyArg_ParseTuple( py_data, "sO!", &name, &PyList_Type, &list)) {
 			BLI_remlink(seqbase, seq);
-			MEM_freeN(seq);
+			free_sequence(seq);
 			
 			return EXPP_ReturnPyObjError( PyExc_ValueError,
 				"images data needs to be a tuple of a string and a list of images - (path, [filenames...])" );
@@ -165,14 +251,15 @@
 	} else if (PyTuple_Check(py_data) && PyTuple_GET_SIZE(py_data) == 3) {
 		float r,g,b;
 		SolidColorVars *colvars;
-		seq->effectdata = MEM_callocN(sizeof(struct SolidColorVars), "solidcolor");
-		colvars = (SolidColorVars *)seq->effectdata;
-		
+
 		if (!PyArg_ParseTuple( py_data, "fff", &r, &g, &b)) {
+			BLI_remlink(seqbase, seq);
+			free_sequence(seq);
 			return EXPP_ReturnPyObjError( PyExc_ValueError,
 					"color needs to be a tuple of 3 floats - (r,g,b)" );
 		}
-		
+
+		seq->effectdata = MEM_callocN(sizeof(struct SolidColorVars), "solidcolor");
 		seq->type= SEQ_COLOR;
 		
 		CLAMP(r,0,1);
@@ -199,7 +286,7 @@
 
 		if (!PyArg_ParseTuple( py_data, "ssss", &filename, &dir, &fullpath, &type )) {
 			BLI_remlink(seqbase, seq);
-			MEM_freeN(seq);
+			free_sequence(seq);
 			
 			return EXPP_ReturnPyObjError( PyExc_ValueError,
 				"movie/audio hd data needs to be a tuple of a string and a list of images - (filename, dir, fullpath, type)" );
@@ -215,7 +302,7 @@
 			struct anim * an = openanim(fullpath, IB_rect);
 			if(an==0) {
 				BLI_remlink(seqbase, seq);
-				MEM_freeN(seq);
+				free_sequence(seq);
 				
 				return EXPP_ReturnPyObjError( PyExc_ValueError,
 					"invalid movie strip" );
@@ -254,7 +341,7 @@
 			hdaudio = sound_open_hdaudio( fullpath );
 			if(hdaudio==0) {
 				BLI_remlink(seqbase, seq);
-				MEM_freeN(seq);
+				free_sequence(seq);
 				
 				return EXPP_ReturnPyObjError( PyExc_ValueError,
 					fullpath );
@@ -949,7 +1036,73 @@
 	return 0;
 }
 
+static PyObject *getEffectSeq( BPy_Sequence *self, void *type )
+{
+	int t = GET_INT_FROM_POINTER(type);
+	Sequence *seq= NULL;
+	switch(t) {
+	case 1:
+		seq= self->seq->seq1;
+		break;
+	case 2:
+		seq= self->seq->seq2;
+		break;
+	case 3:
+		seq= self->seq->seq3;
+		break;
+	}
 
+	if (seq) {
+	    return Sequence_CreatePyObject(seq, NULL, self->scene); 
+	} else {
+		Py_RETURN_NONE;
+	}
+}
+
+
+/*
+ * set one of the effect sequences
+ */
+
+static int setEffectSeq( BPy_Sequence *self, PyObject *value, void *type )
+{
+	int t = GET_INT_FROM_POINTER(type);
+	Sequence **seq;
+	if ((value==Py_None || BPy_Sequence_Check(value))==0)
+		return EXPP_ReturnIntError( PyExc_TypeError,
+				"expected Sequence or None" );
+	
+	switch(t) {
+	case 1:
+		seq= &self->seq->seq1;
+		break;
+	case 2:
+		seq= &self->seq->seq2;
+		break;
+	case 3:
+		seq= &self->seq->seq3;
+		break;
+	}
+
+	if (value==Py_None)
+		*seq= NULL;
+	else {
+		Sequence *newseq= ((BPy_Sequence *)value)->seq;
+		if (newseq==self->seq) {
+			return EXPP_ReturnIntError( PyExc_TypeError, "cannot set a sequence as its own effect" );
+		}
+
+		*seq= ((BPy_Sequence *)value)->seq;
+	}
+
+
+	calc_sequence(self->seq);
+	update_changed_seq_and_deps(self->seq, 1, 1);
+
+	return 0;
+}
+
+
 /*****************************************************************************/
 /* Python attributes get/set structure:                                      */
 /*****************************************************************************/
@@ -1070,7 +1223,18 @@
 	 (getter)getFlagAttr, (setter)setFlagAttr,
 	 "",
 	 (void *)SEQ_IPO_FRAME_LOCKED},
-	 
+	{"seq1",
+	 (getter)getEffectSeq, (setter)setEffectSeq,
+	 "",
+	 (void *)1},
+	{"seq2",
+	 (getter)getEffectSeq, (setter)setEffectSeq,
+	 "",
+	 (void *)2},
+	{"seq3",
+	 (getter)getEffectSeq, (setter)setEffectSeq,
+	 "",
+	 (void *)3},
 	{NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
 };
 





More information about the Bf-blender-cvs mailing list