[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60386] branches/soc-2013-vse/source/ blender/sequencer: Fix for adding non-replace strips into vse.

Alexander Kuznetsov kuzsasha at gmail.com
Fri Sep 27 08:05:19 CEST 2013


Revision: 60386
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60386
Author:   alexk
Date:     2013-09-27 06:05:18 +0000 (Fri, 27 Sep 2013)
Log Message:
-----------
Fix for adding non-replace strips into vse. Thanks Schlaile for pointing it out.

Modified Paths:
--------------
    branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.cpp
    branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.h
    branches/soc-2013-vse/source/blender/sequencer/sequencer_seqFrame.cpp
    branches/soc-2013-vse/source/blender/sequencer/sequencer_seqOutputImage.cpp
    branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.cpp
    branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.h

Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.cpp
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.cpp	2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.cpp	2013-09-27 06:05:18 UTC (rev 60386)
@@ -1 +1,29 @@
- 
+#include "sequencer_seqChannel.h"
+
+
+int seqChannel::find_seq(int size, Sequence *seq)
+{
+
+	while(size >= 0)
+	{
+		size--;
+		if(this[size].seq == seq)
+			break;
+
+	}
+
+	return size;
+}
+
+int seqChannel::find_next_bellow(int size)
+{
+	while(size >= 0)
+	{
+		size--;
+		if(this[size].seq)
+			break;
+
+	}
+
+	return size;
+}

Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.h
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.h	2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.h	2013-09-27 06:05:18 UTC (rev 60386)
@@ -10,7 +10,7 @@
 class seqChannel
 {
 public:
-	Sequence *seq;
+	struct Sequence *seq;
 	seqRenderNode *rnode;
 
 
@@ -21,7 +21,10 @@
 
 	}
 
+	int find_seq(int size, Sequence *seq);
+	int find_next_bellow(int size);
 
+
 	MEM_CXX_CLASS_ALLOC_FUNCS("SeqChannel");
 
 

Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqFrame.cpp
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqFrame.cpp	2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqFrame.cpp	2013-09-27 06:05:18 UTC (rev 60386)
@@ -19,7 +19,7 @@
 
 	Retain();
 
-	seqRenderNode *rtree = do_frame_id(&scene->ed->seqbase, frame_time, 0);
+	seqRenderNode *rtree = seqRenderNode::generate_full_tree(&scene->ed->seqbase, frame_time, 0);
 
 
 

Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqOutputImage.cpp
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqOutputImage.cpp	2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqOutputImage.cpp	2013-09-27 06:05:18 UTC (rev 60386)
@@ -10,7 +10,7 @@
 
 seqBucket *seqOutputImage::createBucketFromTree(seqEngine *se, seqRenderNode *rtree, seqFrame *frm, seqOutputImage *out, int type, seqCanvas *canvas, int level)
 {
-	Sequence *seq = rtree->data;
+	Sequence *seq = rtree->get_data();
 	seqBucket *b = new seqBucket(se);
 
 	seqImageStackInfo ti;
@@ -26,55 +26,90 @@
 	ti.format = SEQ_ING_FORMAT_RGBA;
 	outd = b->new_image_on_stack(ti);
 
-	seqEffect *efff = seqGetEffectFromType(seq->type);
+	seqEffect *efff;
+	void *eff_data;
 
-	if(rtree && seq && seq->strip)
+	seqRenderNode *high = rtree->get_input_high();
+
+	if(seq)
 	{
-		Strip *scene = seq->strip;
+		efff = seqGetEffectFromType(seq->type);
+		if(!efff)
+		{
+			printf("Unregistered effect type \n");
+		}
 
-		curcanvas.translate(scene->transformation.TranX, scene->transformation.TranY);
-		curcanvas.rotate(scene->transformation.rotRad);
-		curcanvas.scale(scene->transformation.ScaleX, scene->transformation.ScaleY);
-	}
+		if(rtree && seq && seq->strip)
+		{
+			Strip *scene = seq->strip;
 
+			curcanvas.translate(scene->transformation.TranX, scene->transformation.TranY);
+			curcanvas.rotate(scene->transformation.rotRad);
+			curcanvas.scale(scene->transformation.ScaleX, scene->transformation.ScaleY);
+		}
+
 #if 0
-	if(seq->type == SEQ_TYPE_ALPHAOVER)
-	{
-		seqEffect *efff = seqGetEffectFromType(SEQ_TYPE_WAVEFORM);
+		if(seq->type == SEQ_TYPE_ALPHAOVER)
+		{
+			seqEffect *efff = seqGetEffectFromType(SEQ_TYPE_WAVEFORM);
 
-		efff->gen_command_for_bucket(b, seq, NULL, frm, &curcanvas, &outd, &ind[0]);
-		outd = ind[0];
-	}
+			efff->gen_command_for_bucket(b, seq, NULL, frm, &curcanvas, &outd, &ind[0]);
+			outd = ind[0];
+		}
 #endif
 
-	for (SequenceModifierData *smd = (SequenceModifierData*)seq->modifiers.last;
-		 smd; smd = (SequenceModifierData*)smd->prev) {
+		for (SequenceModifierData *smd = (SequenceModifierData*)seq->modifiers.last;
+			 smd; smd = (SequenceModifierData*)smd->prev) {
 
-		/* modifier is muted, do nothing */
-		if (smd->flag & SEQUENCE_MODIFIER_MUTE)
-			continue;
+			/* modifier is muted, do nothing */
+			if (smd->flag & SEQUENCE_MODIFIER_MUTE)
+				continue;
 
-		seqEffect *modeff = seqGetEffectFromType(0x38+smd->type);
+			seqEffect *modeff = seqGetEffectFromType(0x38+smd->type);
 
-		if(modeff)
+			if(modeff)
+			{
+				modeff->gen_command_for_bucket(b, seq, smd+1, frm, &curcanvas, &outd, &ind[0]);
+				outd = ind[0];
+			}
+		}
+
+		eff_data = seq->effectdata;
+	}
+	else if(high && high->get_data())
+	{
+		// blending for this sequence
+		seq = high->get_data();
+		efff = seqGetEffectFromType(seq->blend_mode);
+		if(!efff)
 		{
-			modeff->gen_command_for_bucket(b, seq, smd+1, frm, &curcanvas, &outd, &ind[0]);
-			outd = ind[0];
+			printf("Unregistered effect type \n");
 		}
-	}
 
+		TransitionVars blend_data;
+		blend_data.factor = 0.01f * seq->blend_opacity;
 
+		eff_data = (void*)&blend_data;
 
-	if(seq->type == SEQ_TYPE_MOVIE)
+	} else
 	{
-		seqEffect *efff = seqGetEffectFromType(SEQ_TYPE_TRANSFORMATION);
+		printf("Error in the render tree");
+		BLI_assert(0);
 
-		efff->gen_command_for_bucket(b, seq, NULL, frm, &curcanvas, &outd, &ind[0]);
+	}
+
+	int newin = efff ? efff->get_num_inputs() : 0;
+
+	// initial input from file
+	if(newin == 0)
+	{
+		seqEffect *lef = seqGetEffectFromType(SEQ_TYPE_TRANSFORMATION);
+
+		lef->gen_command_for_bucket(b, seq, NULL, frm, &curcanvas, &outd, &ind[0]);
 		outd = ind[0];
 	}
 
 
-	int newin = efff->get_num_inputs();
 	for(int i = newin-1; i >= 0; i--)
 	{
 		ti = curcanvas.get_ssi();
@@ -83,7 +118,7 @@
 	}
 
 
-	efff->gen_command_for_bucket(b, seq, seq->effectdata, frm, &curcanvas,
+	efff->gen_command_for_bucket(b, seq, eff_data, frm, &curcanvas,
 								 &outd, newin>0?&ind[0]:NULL, newin>1?&ind[1]:NULL);
 
 
@@ -97,10 +132,12 @@
 
 	int dl_num = 0;
 
-	if(newin >= 1 &&  rtree->input_low)
+	seqRenderNode *low = rtree->get_input_low();
+
+	if(newin >= 1 &&  low)
 	{
 
-		seqBucket *lb = createBucketFromTree(se, rtree->input_low, frm, out, type, &curcanvas, level+1);
+		seqBucket *lb = createBucketFromTree(se, low, frm, out, type, &curcanvas, level+1);
 
 		lb->Retain();
 
@@ -111,9 +148,11 @@
 		b->dependencies.push_back(di);
 		dl_num++;
 
-		if(newin >= 2 && rtree->input_high)
+		high = rtree->get_input_high();
+
+		if(newin >= 2 && high)
 		{
-			seqBucket *hb = createBucketFromTree(se, rtree->input_high, frm, out, type, &curcanvas, level+1);
+			seqBucket *hb = createBucketFromTree(se, high, frm, out, type, &curcanvas, level+1);
 
 
 			hb->Retain();

Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.cpp
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.cpp	2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.cpp	2013-09-27 06:05:18 UTC (rev 60386)
@@ -4,41 +4,12 @@
 #include "effects/sequencer_seqEffect.h"
 
 
-static int seq_seqChannel_find_seq(seqChannel *chan_arr, int size, Sequence *seq)
-{
 
-	while(size >= 0)
-	{
-		size--;
-		if(chan_arr[size].seq == seq)
-			break;
-
-	}
-
-	return size;
-}
-
-static int seq_seqChannel_find_bellow(seqChannel *chan_arr, int size, Sequence *seq)
-{
-	while(size >= 0)
-	{
-		size--;
-		if(chan_arr[size].seq)
-			break;
-
-	}
-
-	return size;
-}
-
-
-
-
 seqRenderNode::seqRenderNode(Sequence *s):
-	type(0),
-	data(s),
 	input_low(NULL),
-	input_high(NULL)
+	input_high(NULL),
+	data(s),
+	type(0)
 {
 
 	if(s)
@@ -51,9 +22,6 @@
 	};
 
 	Retain();
-
-
-
 }
 
 
@@ -67,38 +35,40 @@
 
 
 
-seqRenderNode * seqRenderNode::make_subtree(seqChannel *chan_arr, int size, int pos) const
+seqRenderNode * seqRenderNode::make_subtree(seqChannel *chan_arr, int size, int pos)
 {
 	seqRenderNode *r = NULL;
 	seqRenderNode *sn = NULL;
 
 	int numinputs;
 
-	if(pos < 0)
+	if(pos < 0 || pos >= size)
 		return NULL;
 
+#if 0
 	if(chan_arr[pos].rnode)
 	{
 		chan_arr[pos].rnode->Retain();
 		return chan_arr[pos].rnode;
 	}
+#endif
 
-
 	sn = new seqRenderNode(chan_arr[pos].seq);
 
 
-	numinputs = seqGetEffectFromType(chan_arr[pos].seq->type)->get_num_inputs();
+	seqEffect *ef = seqGetEffectFromType(chan_arr[pos].seq->type);
+	numinputs = ef ? ef->get_num_inputs() : 0;
 
 	if(numinputs >= 1)
 	{
-		int si = seq_seqChannel_find_seq(chan_arr, size-1, chan_arr[pos].seq->seq1);
+		int si = chan_arr->find_seq(size-1, chan_arr[pos].seq->seq1);
 
 		sn->input_low = make_subtree(chan_arr, size-1, si);
 
 	}
 	if(numinputs >= 2)
 	{
-		int si = seq_seqChannel_find_seq(chan_arr, size-1, chan_arr[pos].seq->seq2);
+		int si = chan_arr->find_seq(size-1, chan_arr[pos].seq->seq2);
 
 		sn->input_high = make_subtree(chan_arr, size-1, si);
 
@@ -107,22 +77,26 @@
 
 	if(chan_arr[pos].seq->blend_mode != SEQ_BLEND_REPLACE)
 	{
-		int si = seq_seqChannel_find_bellow(chan_arr, size-1, 0);
+		int si = chan_arr->find_next_bellow(size-1);
 
 		r = new seqRenderNode(NULL);
-		r->input_high = sn;
 
 		r->input_low = make_subtree(chan_arr, size-1, si);
 
-
-
+		// There is nothing bellow
+		if(r->input_low == NULL)
+		{
+			delete r;
+			r = sn;
+		} else
+		{
+			r->input_high = sn;
+		}
 	} else
 	{
 		r = sn;
-
 	}
 
-
 	chan_arr[pos].rnode = r;
 
 	return r;
@@ -157,10 +131,25 @@
 }
 
 
+Sequence *seqRenderNode::get_data()
+{
+	return data;
+}
 
+seqRenderNode *seqRenderNode::get_input_low()
+{
+	return input_low;
+}
 
-seqRenderNode * do_frame_id(ListBase *seqbasep, int cfra, int chanshown)
+seqRenderNode *seqRenderNode::get_input_high()
 {
+	return input_high;
+}
+
+
+
+seqRenderNode * seqRenderNode::generate_full_tree(ListBase *seqbasep, int cfra, int chanshown)
+{
 	seqChannel seq_arr[MAXSEQ + 1];
 	int b = chanshown;
 
@@ -196,7 +185,7 @@
 		}
 	}
 
-	seq_tree  = seq_tree->make_subtree(seq_arr, cnt, cnt-1);
+	seq_tree  = seqRenderNode::make_subtree(seq_arr, cnt, cnt-1);
 
 
 	return seq_tree;

Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.h
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.h	2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.h	2013-09-27 06:05:18 UTC (rev 60386)
@@ -12,22 +12,25 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list