X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fedits.C;h=cec86c847d449255a2441fcd0fa8070becc54697;hp=b2bcaf98f1cf40eacdef8f6b19aa5c938781f10e;hb=a6fa7638ac79011ab3188e1f4120680c641cca52;hpb=c9c0e07706fad701a70ee0d1ffb0fcb6304f138c diff --git a/cinelerra-5.1/cinelerra/edits.C b/cinelerra-5.1/cinelerra/edits.C index b2bcaf98..cec86c84 100644 --- a/cinelerra-5.1/cinelerra/edits.C +++ b/cinelerra-5.1/cinelerra/edits.C @@ -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) { @@ -629,7 +631,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 +651,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 +883,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 +900,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; + } +} +