X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fedits.C;h=de93e5830d351d41ce3cd68e7a489f999e2c1312;hb=2fba7eab40198b35d9edb20c16bcc1b8c262f7a2;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..de93e583 100644 --- a/cinelerra-5.1/cinelerra/edits.C +++ b/cinelerra-5.1/cinelerra/edits.C @@ -178,7 +178,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 +223,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 +242,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 +332,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 +373,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,13 +406,14 @@ 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; // both edits are silence & not a plugin - if( !current->is_plugin && current->silence() && - !next_edit->is_plugin && next_edit->silence() ) + if( !current->is_plugin() && current->silence() && + !next_edit->is_plugin() && next_edit->silence() ) break; // source channels are identical & assets are identical if( !result && current->channel == next_edit->channel &&