[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58648] branches/soc-2013-vse/source/ blender/sequencer: Updating sequencer main:

Alexander Kuznetsov kuzsasha at gmail.com
Sat Jul 27 07:26:20 CEST 2013


Revision: 58648
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58648
Author:   alexk
Date:     2013-07-27 05:26:20 +0000 (Sat, 27 Jul 2013)
Log Message:
-----------
Updating sequencer main:
Moved dependency creation into the engine.
Continued C++ port
Fixed some memory and frame issues
Finished the buckets generator so I'm able to actually play strips with effects (still can be optimized)

I will port to C++ other files and update these over the weekend.

Modified Paths:
--------------
    branches/soc-2013-vse/source/blender/sequencer/sequencer_main.cpp
    branches/soc-2013-vse/source/blender/sequencer/sequencer_main.h

Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_main.cpp
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_main.cpp	2013-07-27 04:30:15 UTC (rev 58647)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_main.cpp	2013-07-27 05:26:20 UTC (rev 58648)
@@ -77,11 +77,185 @@
 
 void seq_frame_ref_inc(seqEngine *se, seqFrame *frame);
 void seq_device_bucket_add(seqDeviceGen *devg, seqBucket * bucket);
+void SEQ_generate_instruction(seqEngine *se, SeqRenderNode *rtree, seqFrame *frm, seqOutputImage *out, int type, SeqCanvasInfo *canvas);
 
 ImBuf * maintestimg;
 
 
 
+
+
+#define SEQ_NTYPE_EMPTY (1<<0)
+#define SEQ_NTYPE_SEQ (1<<1)
+
+/* move to SeqRenderNode() */
+SeqRenderNode * SeqRenderNode_create(Sequence *s)
+{
+	SeqRenderNode *r = new SeqRenderNode;
+
+
+
+	if(s)
+	{
+		r->data = s;
+		r->type |= SEQ_NTYPE_SEQ;
+	}
+	else
+	{
+		r->type |= SEQ_NTYPE_EMPTY;
+	};
+
+	r->Retain();
+
+
+	return r;
+}
+
+
+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;
+}
+
+
+int seq_SeqChannel_find_bellow(SeqChannel *chan_arr, int size, Sequence *seq)
+{
+	while(size >= 0)
+	{
+		size--;
+		if(chan_arr[size].seq)
+			break;
+
+	}
+
+	return size;
+}
+
+
+
+
+static int evaluate_seq_frame_gen(SeqChannel *seq_arr, ListBase *seqbase, int cfra)
+{
+	Sequence *seq;
+	int totseq = 0;
+
+	memset(seq_arr, 0, sizeof(SeqChannel) * (MAXSEQ + 1));
+
+	seq = (Sequence*)seqbase->first;
+	while (seq) {
+		if (seq->startdisp <= cfra && seq->enddisp > cfra) {
+			seq_arr[seq->machine].seq = seq;
+			totseq++;
+		}
+		seq = seq->next;
+	}
+
+	return totseq;
+}
+
+
+
+
+/* HACK! should just ask effect. Should be refactored after factory implementation for effects */
+int BKE_sequence_effect_get_num_inputs2(int seq_type)
+{
+	switch(seq_type)
+	{
+
+	case SEQ_TYPE_GLOW:
+	case SEQ_TYPE_BRIGHTNESSCONTRAST:
+	return 1;
+
+	}
+
+
+	return 0;
+}
+
+
+SeqRenderNode * seq_render_sub_tree_make(SeqChannel *chan_arr, int size, int pos)
+{
+	SeqRenderNode *r = NULL;
+	SeqRenderNode *sn = NULL;
+
+	int numinputs;
+
+	if(pos < 0)
+		return NULL;
+
+	if(chan_arr[pos].rnode)
+	{
+		chan_arr[pos].rnode->Retain();
+		return chan_arr[pos].rnode;
+	}
+
+
+	sn = SeqRenderNode_create(chan_arr[pos].seq);
+
+
+
+
+
+	numinputs = BKE_sequence_effect_get_num_inputs2(chan_arr[pos].seq->type);
+
+	if(numinputs >= 1)
+	{
+		int si = seq_SeqChannel_find_seq(chan_arr, size-1, chan_arr[pos].seq->seq1);
+
+		sn->input_low = seq_render_sub_tree_make(chan_arr, size-1, si);
+
+	}
+	if(numinputs >= 2)
+	{
+		int si = seq_SeqChannel_find_seq(chan_arr, size-1, chan_arr[pos].seq->seq2);
+
+		sn->input_high = seq_render_sub_tree_make(chan_arr, size-1, si);
+
+	}
+
+
+	if(chan_arr[pos].seq->blend_mode != SEQ_BLEND_REPLACE)
+	{
+		int si = seq_SeqChannel_find_bellow(chan_arr, size-1, 0);
+
+
+		r = SeqRenderNode_create(NULL);
+
+		r->input_high = sn;
+
+
+		r->input_low = seq_render_sub_tree_make(chan_arr, size-1, si);
+
+
+
+	} else
+	{
+		r = sn;
+
+	}
+
+
+	chan_arr[pos].rnode = r;
+
+	return r;
+
+
+}
+
+
+
+
+
+
 void seqFilter_cpu_GenTestImage(seqBucket * bucket, seqFilter_GenTestImage *filt)
 {
 	/*
@@ -241,16 +415,18 @@
 	}
 
 	//if(bucket->ImStack) MEM_freeN(bucket->ImStack);
-	if(bucket->dl) MEM_freeN(bucket->dl);
+	if(bucket->dl) delete [] bucket->dl;
 	//if(bucket->commands_cpp) delete;
 
+
 	bucket->commands_cpp.clear();
+
 	bucket->ImStack_cpp.clear();
 
+	delete bucket;
 
 
 
-
 }
 
 
@@ -398,6 +574,7 @@
 void seq_cpu_done_bucket(seqEngine *se, seqBucket * bucket)
 {
 	bucket->status |= SEQ_BUCKET_STATUS_READY;
+
 	seq_bucket_ref_dec(se, bucket);
 
 }
@@ -413,10 +590,11 @@
 	{
 		seq_CommandBase * com = bucket->commands_cpp[i];
 		com->exec_cpu(bucket);
+		delete com;
 
 	}
 
-	bucket->firstImgOutput = bucket->internalImg[0];
+	bucket->firstImgOutput = bucket->internalImg[bucket->ImStack_cpp.size()-1];
 
 	for(i = 0; i  < bucket->dl_num; i++)
 	{
@@ -437,7 +615,7 @@
 
 void seq_cpu_do_bucket_no(seqDeviceCPU *devcpu, seqBucket * bucket)
 {
-	uint *commands= (uint*)bucket->commands;
+/*	uint *commands= (uint*)bucket->commands;
 	int stop = 0;
 
 	uint i;
@@ -496,15 +674,16 @@
 	MEM_freeN(bucket->internalImg );
 
 
+*/
 
 
-
 }
 
 void seq_bucket_ref_init(seqEngine *se, seqFrame *frm, seqBucket *bucket)
 {
 
 	bucket->framep = frm;
+	bucket->refcount = 0;
 	seq_bucket_ref_inc(se, bucket);
 	seq_frame_ref_inc(se, frm);
 
@@ -667,9 +846,7 @@
 
 
 		cbuck->dl_num = 1;
-		cbuck->dl = (seqBucket_deplist*)MEM_mallocN(sizeof(seqBucket_deplist)*
-									cbuck->dl_num,
-									"seqBucket_deplist");
+		cbuck->dl = new seqBucket_deplist[cbuck->dl_num];
 		cbuck->dl[0].buck = (seqBucket*)dbuck;
 		cbuck->dl[0].dataid = 0;
 
@@ -731,7 +908,7 @@
 
 }
 
-seqOutputImage * seq_create_output_image(seqEngine *se, seqFrame *frm, unsigned int size[2], int ftime)
+seqOutputImage * seq_create_output_image(seqEngine *se, seqFrame *frm, unsigned int size[2], SeqRenderNode *rtree, int ftime)
 {
 	seqOutputImage * r;
 	char * buff;
@@ -749,16 +926,28 @@
 	r->size[1] = size[1];
 
 
-	seq_create_output_create_buckets(se, frm, r, ftime);
-	seq_engine_buckets_list_add(se, r->buckets_cpp);
 
+	SeqCanvasInfo canvas;
+	canvas.memory_size[0] = 512;
+	canvas.memory_size[1] = 512;
 
+	canvas.real_size[0] = 64.0f;
+	canvas.real_size[1] = 64.0f;
 
+
+//	seq_create_output_create_buckets(se, frm, r, ftime);
+//	seq_engine_buckets_list_add(se, r->buckets_cpp);
+
+	SEQ_generate_instruction(se, rtree, frm, r, 0, &canvas);
+
+
+
+
 	return r;
 
 }
 
-void seq_free_frame(seqFrame *frame);
+void seq_free_frame(seqEngine *se, seqFrame *frame);
 
 
 seqFrame *seq_alloc_frame(void)
@@ -795,7 +984,7 @@
 	}
 	else if(frame->refcount == 0)
 	{
-		seq_free_frame(frame);
+		seq_free_frame(se, frame);
 	}
 
 	pthread_mutex_unlock(&se->engine_mutex);
@@ -804,15 +993,15 @@
 
 
 }
+static SeqRenderNode * do_frame_id(ListBase *seqbasep, int cfra, int chanshown);
 
-
-void seq_create_frame(seqEngine *se, seqFrame *frame, uint frame_time)
+void seq_create_frame(seqEngine *se, Scene *scene, seqFrame *frame, uint frame_time)
 {
 	uint i;
 
-	uint size[2] = {64, 64};
+	uint size[2] = {512, 512};
 
-	memset(frame, 0, sizeof(*frame));
+	//memset(frame, 0, sizeof(*frame));
 
 	frame->time = frame_time;
 	frame->id = rand();
@@ -820,29 +1009,32 @@
 	frame->num_outputs = 1;
 
 
-	frame->Outputs = (seqOutput**)MEM_callocN(
-				sizeof(*frame->Outputs )*frame->num_outputs,
-				"seqOutputImage");
+	frame->Outputs = new seqOutput*[frame->num_outputs];
 
-	seq_frame_ref_inc(se, frame); /*move later*/
 
-	frame->Outputs[0] = seq_create_output_image(se, frame, size, frame_time);
 
+	seq_frame_ref_inc(se, frame); /*move later*/
 
+	SeqRenderNode *rtree = do_frame_id(&scene->ed->seqbase, frame_time, 0);
 
 
+	frame->Outputs[0] = seq_create_output_image(se, frame, size, rtree, frame_time);
 
 
 }
 
 
 
-void seq_free_output_image(seqOutputImage *output)
+void seq_free_output_image(seqEngine *se, seqOutputImage *output)
 {
 	uint i;
 	if(output->textid)
 		glDeleteTextures(1, &output->textid);
 
+
+	if(output->buckets_cpp.size()>0)
+		seq_bucket_ref_dec(se, output->buckets_cpp.back());
+
 /* CHANGE ME */
 /*	for(i=0; i<output->num_buckets; i++)
 	{
@@ -854,12 +1046,12 @@
 
 }
 
-void seq_free_output(seqOutput *output)
+void seq_free_output(seqEngine *se, seqOutput *output)
 {
 	switch(output->type)
 	{
 		case SEQ_OUTPUT_TYPE_IMAGE:
-			seq_free_output_image((seqOutputImage*)output);
+			seq_free_output_image(se, (seqOutputImage*)output);
 		break;
 
 		/*case SEQ_OUTPUT_TYPE_SOUND
@@ -872,24 +1064,27 @@
 	}
 
 
-	MEM_freeN(output);
+	delete output;
 }
 
-void seq_free_frame(seqFrame *frame)
+
+void seq_frame_mark_done(seqEngine *se, seqFrame *frame)
 {
-	uint i;
 
+	for(uint i = 0; i < frame->num_outputs; i++)
+	{
 
+		seq_free_output(se, frame->Outputs[i]);
 
+	}
 
-	for(i = 0; i < frame->num_outputs; i++)
-	{
+	delete []frame->Outputs;
+}
 
-		seq_free_output(frame->Outputs[i]);
 
-	}
+void seq_free_frame(seqEngine *se, seqFrame *frame)
+{
 
-	MEM_freeN(frame->Outputs);
 
 	MEM_freeN(frame);
 
@@ -900,13 +1095,13 @@
 
 
 
-int SEQ_NextFrame(seqEngine *se, seqPlayer * player, int nframe)
+int SEQ_NextFrame(seqEngine *se, Scene *scene, seqPlayer * player, int nframe)
 {
 	seqFrame *newframe = seq_alloc_frame();
 
 	printf("Nextframe %i\n", nframe);
 
-	seq_create_frame(se, newframe, nframe);
+	seq_create_frame(se, scene, newframe, nframe);
 
 	BLI_addhead(&player->frames_list, newframe);
 
@@ -961,6 +1156,7 @@
 			}
 
 			case SEQ_TYPE_GLOW:
+			case SEQ_TYPE_BRIGHTNESSCONTRAST:
 			{
 				*effect = new seq_seqEffectBrightness;
 				break;
@@ -1005,13 +1201,21 @@
 }
 
 
-seqBucket *createBucketFromTree(SeqRenderNode *rtree, seqOutputImage *out, int type, SeqCanvasInfo *canvas)
+seqBucket *createBucketFromTree(seqEngine *se, SeqRenderNode *rtree, seqFrame *frm, seqOutputImage *out, int type, SeqCanvasInfo *canvas, int level)
 {
 	seqBucket *b = new seqBucket;
 
 	seqImageStackInfo ti;
 
+	b->init(se, frm);
 
+	if(level==0)
+	{
+		b->Retain();
+	}
+
+
+
 	int sop;
 
 
@@ -1037,8 +1241,10 @@
 	if(num_inp >= 1 &&  rtree->input_low)
 	{
 
-		seqBucket *lb = createBucketFromTree(rtree->input_low, out, type, canvas);
+		seqBucket *lb = createBucketFromTree(se, rtree->input_low, frm, out, type, canvas, level+1);
 
+		lb->Retain();
+
 		b->dl[0].buck = lb;
 		b->dl[0].dataid = 0;
 		b->dl_num = 1;
@@ -1056,8 +1262,11 @@
 
 		if(num_inp >= 2 && rtree->input_high)
 		{
-			seqBucket *hb = createBucketFromTree(rtree->input_low, out, type, canvas);
+			seqBucket *hb = createBucketFromTree(se, rtree->input_low, frm, out, type, canvas, level+1);
 
+
+			hb->Retain();
+
 			b->dl[1].buck = lb;
 			b->dl[1].dataid = 1;
 			b->dl_num = 2;
@@ -1094,48 +1303,107 @@
 
 
 
+	ti.format = SEQ_ING_FORMAT_RGBA;
+	ti.size[0] = canvas->memory_size[0];
+	ti.size[1] = canvas->memory_size[1];
 
 
 
+	sop = efff->gen_command_for_bucket(b, rtree->data, frm, canvas, rtree->data->effectdata, b->dl_num>0?0:-1, b->dl_num>1?1:-1);
 
 
 
 
+	out->buckets_cpp.push_back(b);
 
-	ti.format = SEQ_ING_FORMAT_RGBA;
-	ti.size[0] = canvas->memory_size[0];
-	ti.size[1] = canvas->memory_size[1];
 
 
+	return b;
 
-	sop = efff->gen_command_for_bucket(b, canvas, rtree->data->effectdata, b->dl_num>0?0:-1, b->dl_num>1?1:-1);
 
 
+}
 
 
-	out->buckets_cpp.push_back(b);
+void SEQ_generate_instruction(seqEngine *se, SeqRenderNode *rtree, seqFrame *frm, seqOutputImage *out, int type, SeqCanvasInfo *canvas)
+{
+	if(rtree == NULL)
+		return;
 
+	createBucketFromTree(se, rtree, frm, out, type, canvas, 0);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list