X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;ds=sidebyside;f=cinelerra-5.1%2Fcinelerra%2Fedits.C;h=ea67b6cb976fa8783d458dc262e0945508e842ca;hb=c63c2c2707e1b1145db2edd6824bd69f59341e15;hp=9e3c2a5efcd63a0d52b3cf42df26935420d9fd72;hpb=54cc56bff09f5004b2a6cd454375f06e56acf5a0;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/edits.C b/cinelerra-5.1/cinelerra/edits.C index 9e3c2a5e..ea67b6cb 100644 --- a/cinelerra-5.1/cinelerra/edits.C +++ b/cinelerra-5.1/cinelerra/edits.C @@ -102,15 +102,6 @@ void Edits::copy_from(Edits *edits) } } - -Edits& Edits::operator=(Edits& edits) -{ -printf("Edits::operator= 1\n"); - copy_from(&edits); - return *this; -} - - void Edits::insert_asset(Asset *asset, EDL *nested_edl, int64_t length, int64_t position, int track_number) { @@ -178,7 +169,7 @@ void Edits::insert_edits(Edits *source_edits, // Open destination area Edit *dest_edit = insert_new_edit(position + source_edit->startproject); - dest_edit->copy_from(source_edit); + dest_edit->clone_from(source_edit); dest_edit->asset = dest_asset; dest_edit->nested_edl = dest_nested_edl; dest_edit->startproject = position + source_edit->startproject; @@ -223,9 +214,7 @@ Edit* Edits::insert_new_edit(int64_t position) //printf("Edits::insert_new_edit 1\n"); Edit *new_edit = create_edit(); - if( current ) new_edit->hard_right = current->hard_left; if( current ) current = PREVIOUS; - if( current ) new_edit->hard_left = current->hard_right; //printf("Edits::insert_new_edit 1\n"); insert_after(current, new_edit); new_edit->startproject = position; @@ -244,9 +233,17 @@ Edit* Edits::split_edit(int64_t position) Edit *new_edit = create_edit(); insert_after(edit, new_edit); - new_edit->copy_from(edit); + new_edit->clone_from(edit); new_edit->length = new_edit->startproject + new_edit->length - position; edit->length = position - edit->startproject; + if( !new_edit->length || edit->silence() ) + new_edit->hard_left = new_edit->hard_right = 0; + else if( !edit->length ) + edit->hard_left = edit->hard_right = 0; + else { + new_edit->hard_right = edit->hard_right; + new_edit->hard_left = edit->hard_right = 0; + } new_edit->startproject = position; new_edit->startsource += edit->length; @@ -326,6 +323,14 @@ int Edits::optimize() } } +// trim edits before position 0 + while( first && first->startproject+first->length < 0 ) + delete first; + if( first && first->startproject < 0 ) { + first->length += first->startproject; + first->startproject = 0; + } + // Insert silence between edits which aren't consecutive for(current = last; current; current = current->previous) { @@ -359,13 +364,19 @@ int Edits::optimize() // delete 0 length edits for( current = first; !result && current; ) { - Edit* next = current->next; + Edit* prev = current->previous, *next = current->next; if( current->length == 0 ) { if( next && current->transition && !next->transition) { next->transition = current->transition; next->transition->edit = next; current->transition = 0; } + if( !current->silence() ) { + if( current->hard_left && next && !next->silence() ) + next->hard_left = 1; + if( current->hard_right && prev && !prev->silence()) + prev->hard_right = 1; + } delete current; result = 1; break; @@ -386,7 +397,8 @@ int Edits::optimize() Edit *next_edit = 0; for( ; current && (next_edit=current->next); current=NEXT ) { // both edges are not hard edges - if( current->hard_right || next_edit->hard_left ) continue; + if( current->hard_right || next_edit->hard_left ) + continue; // next edit is a glitch if( is_glitch(next_edit) ) break;