Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / edits.C
index b2bcaf98f1cf40eacdef8f6b19aa5c938781f10e..71dd3b18e293ad41af189f0d9f161ceb1f010822 100644 (file)
@@ -255,7 +255,9 @@ Edit* Edits::split_edit(int64_t position)
                new_edit->hard_left = edit->hard_right = 0;
        }
        new_edit->startproject = position;
-       new_edit->startsource += edit->length;
+       int64_t edit_start = edit->startproject;
+       int64_t edit_end = edit_start + edit->length;
+       new_edit->startsource += track->speed_length(edit_start, edit_end);
 
 // Decide what to do with the transition
        if(edit->length && edit->transition) {
@@ -558,6 +560,13 @@ Edit* Edits::editof(int64_t position, int direction, int use_nudge)
        return 0;     // return 0 on failure
 }
 
+Edit* Edits::get_edit(int id)
+{
+       Edit *current = first;
+       while( current && current->orig_id != id ) current = NEXT;
+       return current;
+}
+
 Edit* Edits::get_playable_edit(int64_t position, int use_nudge)
 {
        Edit *current;
@@ -629,7 +638,7 @@ void Edits::clear(int64_t start, int64_t end)
 //printf("Edits::clear 3.5 %d %d %d %d\n", edit1->startproject, edit1->length, edit2->startproject, edit2->length);
                edit1->length = start - edit1->startproject;
                edit2->length -= end - edit2->startproject;
-               edit2->startsource += end - edit2->startproject;
+               edit2->startsource += track->speed_length(edit2->startproject, end);
                edit2->startproject += end - edit2->startproject;
 
 // delete
@@ -649,7 +658,7 @@ void Edits::clear(int64_t start, int64_t end)
                current_edit = split_edit(start);
                if( current_edit ) {
                        current_edit->length -= end - start;
-                       current_edit->startsource += end - start;
+                       current_edit->startsource += track->speed_length(start, end);
 // shift
                        while( (current_edit=current_edit->next) != 0 ) {
                                current_edit->startproject -= end - start;
@@ -881,7 +890,11 @@ void Edits::align_timecodes(double offset)
                }
        }
        int64_t startproject = 0;
-       for( Edit *edit=first; edit; edit=edit->next ) {
+       for( Edit *edit=first, *next=0; edit; edit=next ) {
+               if( (next = edit->next) != 0 ) {
+                       int64_t length = next->startproject - startproject;
+                       if( length > edit->length ) edit->length = length;
+               }
                int64_t length = edit->startproject - startproject;
                if( length > 0 ) {
                        Edit *new_edit = create_edit();
@@ -894,3 +907,20 @@ void Edits::align_timecodes(double offset)
        }
 }
 
+void Edits::update_idxbl_length(int id, int64_t du)
+{
+       for( Edit *edit=first; edit; edit=edit->next ) {
+               Indexable *idxbl = edit->asset ? (Indexable *)edit->asset :
+                       edit->nested_edl ? (Indexable *)edit->nested_edl : 0;
+               if( !idxbl || idxbl->id != id ) continue;
+               edit->length += du;
+               if(  edit->length > 0 && edit->next ) {
+                       int64_t next_start = edit->next->startproject;
+                       int64_t edit_end = edit->startproject + edit->length;
+                       if( edit_end > next_start )
+                               edit->length = next_start - edit->startproject;
+               }
+               if( edit->length < 0 ) edit->length = 0;
+       }
+}
+