Revision: 14195
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14195
Author:   schlaile
Date:     2008-03-21 11:47:59 +0100 (Fri, 21 Mar 2008)

Log Message:
-----------
== Sequencer ==

Reworked seq_cut completely. Now it is equivalent to: dup and set startofs /
endofs, which is what most people probably expected...

Fixes:
[#8388] Sequencer Cut on empty meta
[#8546] Sequencer: 2 different problems cutting some metastrips

Modified Paths:
--------------
    trunk/blender/source/blender/src/editseq.c
    trunk/blender/source/blender/src/seqaudio.c

Modified: trunk/blender/source/blender/src/editseq.c
===================================================================
--- trunk/blender/source/blender/src/editseq.c  2008-03-21 09:46:37 UTC (rev 
14194)
+++ trunk/blender/source/blender/src/editseq.c  2008-03-21 10:47:59 UTC (rev 
14195)
@@ -176,7 +176,7 @@
 /* seq funcs's for transforming internally
  notice the difference between start/end and left/right.
  
- left and right are the bounds at which the setuence is rendered,
+ left and right are the bounds at which the sequence is rendered,
 start and end are from the start and fixed length of the sequence.
 */
 int seq_tx_get_start(Sequence *seq) {
@@ -2245,6 +2245,22 @@
        return seqn;
 }
 
+static Sequence * deep_dupli_seq(Sequence * seq)
+{
+       Sequence * seqn = dupli_seq(seq);
+       if (seq->type == SEQ_META) {
+               Sequence * s;
+               for(s= seq->seqbase.first; s; s = s->next) {
+                       Sequence * n = deep_dupli_seq(s);
+                       if (n) { 
+                               BLI_addtail(&seqn->seqbase, n);
+                       }
+               }
+       }
+       return seqn;
+}
+
+
 static void recurs_dupli_seq(ListBase *old, ListBase *new)
 {
        Sequence *seq;
@@ -2271,15 +2287,97 @@
        }
 }
 
+static Sequence * cut_seq(Sequence * seq, int cutframe)
+{
+       TransSeq ts;
+       Sequence *seqn = 0;
+       int skip_dup = FALSE;
+
+       /* backup values */
+       ts.start= seq->start;
+       ts.machine= seq->machine;
+       ts.startstill= seq->startstill;
+       ts.endstill= seq->endstill;
+       ts.startdisp= seq->startdisp;
+       ts.enddisp= seq->enddisp;
+       ts.startofs= seq->startofs;
+       ts.endofs= seq->endofs;
+       ts.len= seq->len;
+       
+       /* First Strip! */
+       /* strips with extended stillfames before */
+       
+       if ((seq->startstill) && (cutframe <seq->start)) {
+               /* don't do funny things with METAs ... */
+               if (seq->type == SEQ_META) {
+                       skip_dup = TRUE;
+                       seq->startstill = seq->start - cutframe;
+               } else {
+                       seq->start= cutframe -1;
+                       seq->startstill= cutframe -seq->startdisp -1;
+                       seq->endofs = seq->len - 1;
+                       seq->endstill= 0;
+               }
+       }
+       /* normal strip */
+       else if ((cutframe >=seq->start)&&(cutframe <=(seq->start+seq->len))) {
+               seq->endofs = (seq->start+seq->len) - cutframe;
+       }
+       /* strips with extended stillframes after */
+       else if (((seq->start+seq->len) < cutframe) && (seq->endstill)) {
+               seq->endstill -= seq->enddisp - cutframe;
+               /* don't do funny things with METAs ... */
+               if (seq->type == SEQ_META) {
+                       skip_dup = TRUE;
+               }
+       }
+       
+       calc_sequence(seq);
+       
+       if (!skip_dup) {
+               /* Duplicate AFTER the first change */
+               seqn = deep_dupli_seq(seq);
+       }
+       
+       if (seqn) { /* should never fail */
+               seqn->flag |= SELECT;
+                       
+               /* Second Strip! */
+               /* strips with extended stillframes before */
+               if ((seqn->startstill) && (cutframe == seqn->start + 1)) {
+                       seqn->start = ts.start;
+                       seqn->startstill= ts.start- cutframe;
+                       seqn->endofs = ts.endofs;
+                       seqn->endstill = ts.endstill;
+               }
+               
+               /* normal strip */
+               else if 
((cutframe>=seqn->start)&&(cutframe<=(seqn->start+seqn->len))) {
+                       seqn->startstill = 0;
+                       seqn->startofs = cutframe - ts.start;
+                       seqn->endofs = ts.endofs;
+                       seqn->endstill = ts.endstill;
+               }                               
+               
+               /* strips with extended stillframes after */
+               else if (((seqn->start+seqn->len) < cutframe) && 
(seqn->endstill)) {
+                       seqn->start = cutframe - ts.len +1;
+                       seqn->startofs = ts.len-1;
+                       seqn->endstill = ts.enddisp - cutframe -1;
+                       seqn->startstill = 0;
+               }
+               
+               calc_sequence(seqn);
+       }
+       return seqn;
+}
+
 /* like duplicate, but only duplicate and cut overlapping strips,
  * strips to the left of the cutframe are ignored and strips to the right are 
moved into the new list */
-static void recurs_cut_seq(ListBase *old, ListBase *new, int cutframe)
+static void cut_seq_list(ListBase *old, ListBase *new, int cutframe)
 {
        Sequence *seq, *seq_next;
-       Sequence *seqn = 0;
        
-       TransSeq ts;
-
        seq= old->first;
        
        while(seq) {
@@ -2287,86 +2385,11 @@
                
                seq->tmp= NULL;
                if(seq->flag & SELECT) {
-                       if(cutframe > seq->startdisp && cutframe < 
seq->enddisp) {
-                               
-                               /* backup values */
-                               ts.start= seq->start;
-                               ts.machine= seq->machine;
-                               ts.startstill= seq->startstill;
-                               ts.endstill= seq->endstill;
-                               ts.startdisp= seq->startdisp;
-                               ts.enddisp= seq->enddisp;
-                               ts.startofs= seq->startofs;
-                               ts.endofs= seq->endofs;
-                               ts.len= seq->len;
-                               
-                               /* First Strip! */
-                               /* strips with extended stillfames before */
-                               if(seq->type!=SEQ_META) {
-                                       
-                                       if ((seq->startstill) && (cutframe 
<seq->start)) {
-                                               seq->start= cutframe -1;
-                                               seq->startstill= cutframe 
-seq->startdisp -1;
-                                               seq->len= 1;
-                                               seq->endstill= 0;
-                                       }
-                               
-                                       /* normal strip */
-                                       else if ((cutframe 
>=seq->start)&&(cutframe <=(seq->start+seq->len))) {
-                                               seq->endofs = 
(seq->start+seq->len) - cutframe;
-                                       }
-                               
-                                       /* strips with extended stillframes 
after */
-                                       else if (((seq->start+seq->len) < 
cutframe) && (seq->endstill)) {
-                                               seq->endstill -= seq->enddisp - 
cutframe;
-                                       }
-                                       
-                                       calc_sequence(seq);
-                               }
-                               
-                               /* Duplicate AFTER the first change */
-                               seqn = dupli_seq(seq);
-                               
-                               if (seqn) { /* should never fail */
-                                       seqn->flag |= SELECT;
-                                       
-                                       
+                       if(cutframe > seq->startdisp && 
+                          cutframe < seq->enddisp) {
+                               Sequence * seqn = cut_seq(seq, cutframe);
+                               if (seqn) {
                                        BLI_addtail(new, seqn);
-                                       
-                                       /* dont transform meta's - just do 
their children then recalc */
-                                       if(seq->type==SEQ_META) {
-                                               
recurs_cut_seq(&seq->seqbase,&seqn->seqbase, cutframe);
-                                       } else {
-                                               /* Second Strip! */
-                                               /* strips with extended 
stillframes before */
-                                               if ((seqn->startstill) && 
(cutframe == seqn->start + 1)) {
-                                                       seqn->start = ts.start;
-                                                       seqn->startstill= 
ts.start- cutframe;
-                                                       seqn->len = ts.len;
-                                                       seqn->endstill = 
ts.endstill;
-                                               }
-                       
-                                               /* normal strip */
-                                               else if 
((cutframe>=seqn->start)&&(cutframe<=(seqn->start+seqn->len))) {
-                                                       seqn->startstill = 0;
-                                                       seqn->startofs = 
cutframe - ts.start;
-                                                       seqn->endofs = 
ts.endofs;
-                                                       seqn->endstill = 
ts.endstill;
-                                               }                               
-                       
-                                               /* strips with extended 
stillframes after */
-                                               else if 
(((seqn->start+seqn->len) < cutframe) && (seqn->endstill)) {
-                                                       seqn->start = cutframe 
- ts.len +1;
-                                                       seqn->startofs = 
ts.len-1;
-                                                       seqn->endstill = 
ts.enddisp - cutframe -1;
-                                                       seqn->startstill = 0;
-                                               }
-                                       }
-                                       
-                                       if(seq->type==SEQ_META) /* account for 
strips within changing */
-                                               calc_sequence(seq);
-                                       
-                                       calc_sequence(seqn);
                                }
                        } else if (seq->enddisp <= cutframe) {
                                /* do nothing */
@@ -2390,7 +2413,7 @@
        
        newlist.first= newlist.last= NULL;
        
-       recurs_cut_seq(ed->seqbasep, &newlist, cutframe);
+       cut_seq_list(ed->seqbasep, &newlist, cutframe);
        
        if (newlist.first) { /* simple check to see if anything was done */
                Sequence *seq;

Modified: trunk/blender/source/blender/src/seqaudio.c
===================================================================
--- trunk/blender/source/blender/src/seqaudio.c 2008-03-21 09:46:37 UTC (rev 
14194)
+++ trunk/blender/source/blender/src/seqaudio.c 2008-03-21 10:47:59 UTC (rev 
14195)
@@ -519,9 +519,6 @@
                desired.samples=U.mixbufsize;
                desired.userdata=0;
 
-               fprintf(stderr, "freq: %d, samples: %d\n",
-                       G.scene->audio.mixrate, U.mixbufsize);
-
                if (audio_init(&desired)==0) {
                        U.mixbufsize = 0;       /* no audio */
                }


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to