X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fedits.C;h=8c8901bf4df3b85d391e0027d5acd356365779f9;hp=a38bef5a0180474154687c026f2953f4850cdaf3;hb=32a609a6bd1181993569399ab51f314dc7cb4fba;hpb=0c086b3e7b552e0f6b06c8696d7682d9d4bd91db diff --git a/cinelerra-5.1/cinelerra/edits.C b/cinelerra-5.1/cinelerra/edits.C index a38bef5a..8c8901bf 100644 --- a/cinelerra-5.1/cinelerra/edits.C +++ b/cinelerra-5.1/cinelerra/edits.C @@ -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; @@ -247,6 +245,14 @@ Edit* Edits::split_edit(int64_t position) new_edit->copy_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,7 +406,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; @@ -682,8 +703,7 @@ int Edits::clear_handle(double start, double end, // Lengthen effects if(edit_plugins) track->shift_effects(current_edit->next->startproject, - length, - edit_autos); + length, edit_autos, 0); for(current_edit = current_edit->next; current_edit; current_edit = current_edit->next) { @@ -703,47 +723,38 @@ int Edits::clear_handle(double start, double end, int Edits::modify_handles(double oldposition, double newposition, int currentend, int edit_mode, int edit_edits, int edit_labels, int edit_plugins, int edit_autos, - Edits *trim_edits) + Edits *trim_edits, int group_id) { int result = 0; Edit *current_edit; + Edit *left = 0, *right = 0; + if( group_id > 0 ) { + double start = DBL_MAX, end = DBL_MIN; + for( Edit *edit=first; edit; edit=edit->next ) { + if( edit->group_id != group_id ) continue; + double edit_start = edit->track->from_units(edit->startproject); + if( edit_start < start ) { start = edit_start; left = edit; } + double edit_end = edit->track->from_units(edit->startproject+edit->length); + if( edit_end > end ) { end = edit_end; right = edit; } + } + } //printf("Edits::modify_handles 1 %d %f %f\n", currentend, newposition, oldposition); if(currentend == 0) { // left handle for(current_edit = first; current_edit && !result;) { - if(edl->equivalent(track->from_units(current_edit->startproject), - oldposition)) { + if( group_id > 0 ? current_edit == left : + edl->equivalent(track->from_units(current_edit->startproject), + oldposition) ) { // edit matches selection //printf("Edits::modify_handles 3 %f %f\n", newposition, oldposition); + double delta = newposition - oldposition; oldposition = track->from_units(current_edit->startproject); + if( group_id > 0 ) newposition = oldposition + delta; + current_edit->shift_start(edit_mode, + track->to_units(newposition, 0), track->to_units(oldposition, 0), + edit_labels, edit_autos, edit_plugins, trim_edits); result = 1; - - if(newposition >= oldposition) { -//printf("Edits::modify_handle 1 %s %f %f\n", track->title, oldposition, newposition); -// shift start of edit in - current_edit->shift_start_in(edit_mode, - track->to_units(newposition, 0), - track->to_units(oldposition, 0), - edit_edits, - edit_labels, - edit_plugins, - edit_autos, - trim_edits); - } - else - { -//printf("Edits::modify_handle 2 %s\n", track->title); -// move start of edit out - current_edit->shift_start_out(edit_mode, - track->to_units(newposition, 0), - track->to_units(oldposition, 0), - edit_edits, - edit_labels, - edit_plugins, - edit_autos, - trim_edits); - } } if(!result) current_edit = current_edit->next; @@ -752,40 +763,18 @@ int Edits::modify_handles(double oldposition, double newposition, int currentend else { // right handle selected for(current_edit = first; current_edit && !result;) { - if(edl->equivalent(track->from_units(current_edit->startproject) + - track->from_units(current_edit->length), oldposition)) { - oldposition = track->from_units(current_edit->startproject) + + if( group_id > 0 ? current_edit == right : + edl->equivalent(track->from_units(current_edit->startproject) + + track->from_units(current_edit->length), oldposition) ) { + double delta = newposition - oldposition; + oldposition = track->from_units(current_edit->startproject) + track->from_units(current_edit->length); + if( group_id > 0 ) newposition = oldposition + delta; result = 1; -//printf("Edits::modify_handle 3\n"); - if(newposition <= oldposition) { -// shift end of edit in -//printf("Edits::modify_handle 4\n"); - current_edit->shift_end_in(edit_mode, - track->to_units(newposition, 0), - track->to_units(oldposition, 0), - edit_edits, - edit_labels, - edit_plugins, - edit_autos, - trim_edits); -//printf("Edits::modify_handle 5\n"); - } - else - { -// move end of edit out -//printf("Edits::modify_handle %d edit_mode=%d\n", __LINE__, edit_mode); - current_edit->shift_end_out(edit_mode, - track->to_units(newposition, 0), - track->to_units(oldposition, 0), - edit_edits, - edit_labels, - edit_plugins, - edit_autos, - trim_edits); -//printf("Edits::modify_handle 7\n"); - } + current_edit->shift_end(edit_mode, + track->to_units(newposition, 0), track->to_units(oldposition, 0), + edit_labels, edit_autos, edit_plugins, trim_edits); } if(!result) current_edit = current_edit->next; @@ -797,7 +786,6 @@ int Edits::modify_handles(double oldposition, double newposition, int currentend return 0; } - void Edits::paste_silence(int64_t start, int64_t end) { Edit *new_edit = editof(start, PLAY_FORWARD, 0); @@ -847,6 +835,6 @@ void Edits::shift_keyframes_recursive(int64_t position, int64_t length) void Edits::shift_effects_recursive(int64_t position, int64_t length, int edit_autos) { - track->shift_effects(position, length, edit_autos); + track->shift_effects(position, length, edit_autos, 0); }