[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