Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Schlaile <peter@schlaile.de>2006-11-09 21:58:02 +0300
committerPeter Schlaile <peter@schlaile.de>2006-11-09 21:58:02 +0300
commit0df60a9ef437afbcd2bad259dd93fd66e3e10fe8 (patch)
treedd62d465528f9ffc1453606d6d51b85109e1541b /source/blender/src/sequence.c
parentd1285dc756711b6dccb30a30df661376fe513bee (diff)
== Sequencer ==
Added enhancements by blendix (Patch #4919: Insert sequence effect between) It adds the following things: - You can add a sequence strip afterwards in the middle of an effect chain (you have to move strips around before, so that there is "room" for it. Blender will ask you then, if you want to add in between or after the selected strips) - In the case you messed it up and want your effect strips to be reassigned in a different way, there is the new "R"-key. Just select three arbitrary strips and press "R". If you don't create a cycle, those will be connected to a new effect chain. - Fixed freeing of imbufs on changes to properly take into account dependencies. An example of a simple case that went wrong is one image strip with two glow effects, changing the parameters of the first glow strip will not result in any updates. Basically only direct dependencies were taken into account, which resulted in the image preview not being updated in some cases. - Let the sequencer detect an active sequence strip if none is defined, to get rid of annoying error messages when trying to add an effect to a selected sequence strip right after loading a file. - Delete is less destructive. If you delete somewhere between other strips, Blender now tries to relink in a reasonable way. - The active sequence strip is now displayed with a light instead of a dark outline, which makes it easier to spot, and is especially useful for the tools using the active sequence strip. - Ability to view the final result when editing inside meta strip. The channel button was modified to also allow negative numbers, where -n is n levels up the meta stack. There is probably a nicer way to specify this, instead of (ab)using the channel button, but this seems to work quite efficient. - Also a small bugfix: don't crash on loading files from newer versions with an unknown effect strip.
Diffstat (limited to 'source/blender/src/sequence.c')
-rw-r--r--source/blender/src/sequence.c250
1 files changed, 141 insertions, 109 deletions
diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c
index ca9f9f48801..f81df5357f9 100644
--- a/source/blender/src/sequence.c
+++ b/source/blender/src/sequence.c
@@ -109,7 +109,6 @@ void free_strip(Strip *strip)
void new_stripdata(Sequence *seq)
{
-
if(seq->strip) {
if(seq->strip->stripdata) free_stripdata(seq->strip->len, seq->strip->stripdata);
seq->strip->stripdata= 0;
@@ -133,7 +132,7 @@ void free_sequence(Sequence *seq)
sh.free(seq);
}
- if(seq==last_seq) set_last_seq_to_null();
+ if(seq==last_seq) set_last_seq(NULL);
MEM_freeN(seq);
}
@@ -200,6 +199,8 @@ void free_editing(Editing *ed)
}
MEM_freeN(ed);
+
+ clear_last_seq();
}
void calc_sequence(Sequence *seq)
@@ -348,7 +349,7 @@ void clear_scene_in_allseqs(Scene *sce)
void make_black_ibuf(ImBuf *ibuf)
{
- int *rect;
+ unsigned int *rect;
float *rect_float;
int tot;
@@ -415,7 +416,7 @@ void do_effect(int cfra, Sequence *seq, StripElem *se)
int x, y;
struct SeqEffectHandle sh = get_sequence_effect(seq);
- if(se->se1==0 || se->se2==0 || se->se3==0) {
+ if(!sh.execute || se->se1==0 || se->se2==0 || se->se3==0) {
make_black_ibuf(se->ibuf);
return;
}
@@ -563,7 +564,7 @@ int evaluate_seq_frame(int cfra)
}
-static Sequence * get_shown_seq_from_metastrip(Sequence * seqm, int cfra)
+Sequence *get_shown_seq_from_metastrip(Sequence * seqm, int cfra)
{
Sequence *seq, *seqim, *seqeff;
Sequence *seq_arr[MAXSEQ+1];
@@ -657,10 +658,8 @@ static void do_seq_unref_cfra(ListBase *seqbase, int cfra)
else do_seq_unref_cfra(&seq->seqbase, cfra);
}
- if (seq->curelem && seq->curelem->ibuf
- && seq->curelem->isneeded) {
+ if (seq->curelem && seq->curelem->ibuf && seq->curelem->isneeded)
IMB_cache_limiter_unref(seq->curelem->ibuf);
- }
}
seq= seq->next;
}
@@ -737,9 +736,7 @@ static void do_effect_depend(int cfra, Sequence * seq, StripElem *se)
static void do_build_seq_depend(Sequence * seq, int cfra)
{
- StripElem *se;
-
- se=seq->curelem= give_stripelem(seq, cfra);
+ StripElem *se = seq->curelem;
if(se && !se->isneeded) {
se->isneeded = 1;
@@ -762,11 +759,9 @@ static void do_build_seq_depend(Sequence * seq, int cfra)
static void do_build_seq_ibuf(Sequence * seq, int cfra)
{
- StripElem *se;
+ StripElem *se = seq->curelem;
char name[FILE_MAXDIR+FILE_MAXFILE];
- se=seq->curelem= give_stripelem(seq, cfra);
-
if(se && se->isneeded) {
if(seq->type == SEQ_META) {
se->ok= 2;
@@ -788,7 +783,7 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
}
}
- /* does the effect should be recalculated? */
+ /* should the effect be recalculated? */
if(se->ibuf==0
|| (se->se1 != seq->seq1->curelem)
@@ -800,12 +795,13 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
if(se->ibuf==NULL) {
/* if one of two first inputs are rectfloat, output is float too */
- if((se->se1->ibuf && se->se1->ibuf->rect_float) ||
+ if((se->se1->ibuf && se->se1->ibuf->rect_float) ||
(se->se2->ibuf && se->se2->ibuf->rect_float))
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
else
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
}
+
do_effect(cfra, seq, se);
}
@@ -981,34 +977,38 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
}
}
+static void do_set_seq_curelem(ListBase *seqbase, int cfra)
+{
+ Sequence *seq;
+
+ for(seq=seqbase->first; seq; seq=seq->next) {
+ seq->curelem= give_stripelem(seq, cfra);
+
+ if (seq->curelem) {
+ seq->curelem->isneeded= 0; /* nobody is needed a priori */
+
+ if (seq->seqbase.first)
+ do_set_seq_curelem(&seq->seqbase, cfra);
+ }
+ }
+}
+
static void do_build_seqar_cfra(ListBase *seqbase, Sequence ***seqar, int cfra)
{
Sequence *seq;
- StripElem *se;
if(seqar==NULL) return;
seq= seqbase->first;
while(seq) {
-
- /* set at zero because free_imbuf_seq... */
- seq->curelem= 0;
-
if ((seq->type == SEQ_RAM_SOUND || seq->type == SEQ_HD_SOUND) && (seq->ipo)
&& (seq->startdisp <= cfra+2) && (seq->enddisp > cfra)) {
do_seq_ipo(seq);
}
- if(seq->startdisp <=cfra && seq->enddisp > cfra) {
+ if(seq->curelem) {
**seqar= seq;
(*seqar)++;
-
- /* nobody is needed a priori */
- se = seq->curelem= give_stripelem(seq, cfra);
-
- if (se) {
- se->isneeded = 0;
- }
}
seq= seq->next;
@@ -1021,10 +1021,6 @@ static void do_build_seq_ibufs(ListBase *seqbase, int cfra)
seq= seqbase->first;
while(seq) {
-
- /* set at zero because free_imbuf_seq... */
- seq->curelem= 0;
-
if ((seq->type == SEQ_RAM_SOUND || seq->type == SEQ_HD_SOUND) && (seq->ipo)
&& (seq->startdisp <= cfra+2) && (seq->enddisp > cfra)) {
do_seq_ipo(seq);
@@ -1052,7 +1048,8 @@ ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
Sequence *seq, *seqfirst=0;/* , *effirst=0; */
Editing *ed;
StripElem *se;
- int seqnr, totseq;
+ int seqnr, totseq, count;
+ ListBase *seqbasep;
/* we make recursively a 'stack' of sequences, these are
* sorted nicely as well.
@@ -1063,7 +1060,16 @@ ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
totseq= 0;
ed= G.scene->ed;
if(ed==0) return 0;
- do_seq_count_cfra(ed->seqbasep, &totseq, cfra);
+
+ count = BLI_countlist(&ed->metastack);
+ if((chanshown < 0) && (count > 0)) {
+ count = MAX2(count + chanshown, 0);
+ seqbasep= ((MetaStack*)BLI_findlink(&ed->metastack, count))->oldbasep;
+ }
+ else
+ seqbasep= ed->seqbasep;
+
+ do_seq_count_cfra(seqbasep, &totseq, cfra);
if(totseq==0) return 0;
@@ -1073,8 +1079,11 @@ ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
/* tseqar is needed because in do_build_... the pointer changes */
seqar= tseqar= MEM_callocN(sizeof(void *)*totseq, "seqar");
+ /* set curelem pointers to stripelem */
+ do_set_seq_curelem(seqbasep, cfra);
+
/* this call creates the sequence order array */
- do_build_seqar_cfra(ed->seqbasep, &seqar, cfra);
+ do_build_seqar_cfra(seqbasep, &seqar, cfra);
seqar= tseqar;
@@ -1083,7 +1092,7 @@ ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
se= seq->curelem;
if((seq->type != SEQ_RAM_SOUND && seq->type != SEQ_HD_SOUND)
- && (se) && (chanshown == 0 || seq->machine == chanshown)) {
+ && (se) && (chanshown <= 0 || seq->machine == chanshown)) {
if(seq->type==SEQ_META) {
/* bottom strip! */
@@ -1120,9 +1129,9 @@ ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
if (seqfirst) {
do_build_seq_depend(seqfirst, cfra);
- do_build_seq_ibufs(ed->seqbasep, cfra);
- do_seq_unref_cfra(ed->seqbasep, cfra);
- do_seq_test_unref_cfra(ed->seqbasep, cfra);
+ do_build_seq_ibufs(seqbasep, cfra);
+ do_seq_unref_cfra(seqbasep, cfra);
+ do_seq_test_unref_cfra(seqbasep, cfra);
}
if(!seqfirst) return 0;
@@ -1131,116 +1140,139 @@ ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
}
-void free_imbuf_effect_spec(int cfra)
+/* Functions to free imbuf and anim data on changes */
+
+static void free_imbuf_strip_elem(StripElem *se)
{
+ if (se->ibuf) {
+ if (se->ok != 2)
+ IMB_freeImBuf(se->ibuf);
+ se->ibuf= 0;
+ se->ok= 1;
+ se->se1= se->se2= se->se3= 0;
+ }
+}
+
+static void free_anim_seq(Sequence *seq)
+{
+ if(seq->anim) {
+ IMB_free_anim(seq->anim);
+ seq->anim = 0;
+ }
+}
+
+void free_imbuf_seq_except(int cfra)
+{
+ Editing *ed= G.scene->ed;
Sequence *seq;
StripElem *se;
- Editing *ed;
int a;
- ed= G.scene->ed;
if(ed==0) return;
WHILE_SEQ(&ed->seqbase) {
-
if(seq->strip) {
+ for(a=0, se= seq->strip->stripdata; a<seq->len; a++, se++)
+ if(se!=seq->curelem)
+ free_imbuf_strip_elem(se);
- if(seq->type & SEQ_EFFECT) {
- se= seq->strip->stripdata;
- for(a=0; a<seq->len; a++, se++) {
- if(se==seq->curelem && se->ibuf) {
- IMB_freeImBuf(se->ibuf);
- se->ibuf= 0;
- se->ok= 1;
- se->se1= se->se2= se->se3= 0;
- }
- }
- }
+ if(seq->type==SEQ_MOVIE)
+ if(seq->startdisp > cfra || seq->enddisp < cfra)
+ free_anim_seq(seq);
}
}
END_SEQ
}
-void free_imbuf_seq_except(int cfra)
+void free_imbuf_seq()
{
+ Editing *ed= G.scene->ed;
Sequence *seq;
StripElem *se;
- Editing *ed;
int a;
- ed= G.scene->ed;
if(ed==0) return;
WHILE_SEQ(&ed->seqbase) {
-
if(seq->strip) {
+ for(a=0, se= seq->strip->stripdata; a<seq->len; a++, se++)
+ free_imbuf_strip_elem(se);
- if( seq->type==SEQ_META ) {
- ;
- }
- else {
- se= seq->strip->stripdata;
- for(a=0; a<seq->len; a++, se++) {
- if(se!=seq->curelem && se->ibuf) {
- IMB_freeImBuf(se->ibuf);
- se->ibuf= 0;
- se->ok= 1;
- se->se1= se->se2= se->se3= 0;
- }
- }
- }
-
- if(seq->type==SEQ_MOVIE) {
- if(seq->startdisp > cfra || seq->enddisp < cfra) {
- if(seq->anim) {
- IMB_free_anim(seq->anim);
- seq->anim = 0;
- }
- }
- }
+ if(seq->type==SEQ_MOVIE)
+ free_anim_seq(seq);
}
}
END_SEQ
}
-void free_imbuf_seq()
+void free_imbuf_seq_with_ipo(struct Ipo *ipo)
{
+ /* force update of all sequences with this ipo, on ipo changes */
+ Editing *ed= G.scene->ed;
Sequence *seq;
- StripElem *se;
- Editing *ed;
- int a;
- ed= G.scene->ed;
if(ed==0) return;
WHILE_SEQ(&ed->seqbase) {
+ if(seq->ipo == ipo)
+ update_changed_seq_and_deps(seq, 0, 1);
+ }
+ END_SEQ
+}
- if(seq->strip) {
+static int update_changed_seq_recurs(Sequence *seq, Sequence *changed_seq, int len_change, int ibuf_change)
+{
+ Sequence *subseq;
+ int a, free_imbuf = 0;
+ StripElem *se;
- if( seq->type==SEQ_META ) {
- ;
- }
- else {
- se= seq->strip->stripdata;
- for(a=0; a<seq->len; a++, se++) {
- if(se->ibuf) {
- IMB_freeImBuf(se->ibuf);
- se->ibuf= 0;
- se->ok= 1;
- se->se1= se->se2= se->se3= 0;
- }
- }
- }
+ /* recurs downwards to see if this seq depends on the changed seq */
- if(seq->type==SEQ_MOVIE) {
- if(seq->anim) {
- IMB_free_anim(seq->anim);
- seq->anim = 0;
- }
- }
+ if(seq == NULL)
+ return 0;
+
+ if(seq == changed_seq)
+ free_imbuf = 1;
+
+ for(subseq=seq->seqbase.first; subseq; subseq=subseq->next)
+ if(update_changed_seq_recurs(subseq, changed_seq, len_change, ibuf_change))
+ free_imbuf = 1;
+
+ if(seq->seq1)
+ if(update_changed_seq_recurs(seq->seq1, changed_seq, len_change, ibuf_change))
+ free_imbuf = 1;
+ if(seq->seq2 && (seq->seq2 != seq->seq1))
+ if(update_changed_seq_recurs(seq->seq2, changed_seq, len_change, ibuf_change))
+ free_imbuf = 1;
+ if(seq->seq3 && (seq->seq3 != seq->seq1) && (seq->seq3 != seq->seq2))
+ if(update_changed_seq_recurs(seq->seq3, changed_seq, len_change, ibuf_change))
+ free_imbuf = 1;
+
+ if(free_imbuf) {
+ if(ibuf_change) {
+ for(a=0, se= seq->strip->stripdata; a<seq->len; a++, se++)
+ free_imbuf_strip_elem(se);
+
+ if(seq->type==SEQ_MOVIE)
+ free_anim_seq(seq);
}
+
+ if(len_change)
+ calc_sequence(seq);
}
- END_SEQ
+
+ return free_imbuf;
+}
+
+void update_changed_seq_and_deps(Sequence *changed_seq, int len_change, int ibuf_change)
+{
+ Editing *ed= G.scene->ed;
+ Sequence *seq;
+
+ if (!ed) return;
+
+ for (seq=ed->seqbase.first; seq; seq=seq->next)
+ update_changed_seq_recurs(seq, changed_seq, len_change, ibuf_change);
}
/* bad levell call... */