X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fedits.C;h=b2bcaf98f1cf40eacdef8f6b19aa5c938781f10e;hp=8c8901bf4df3b85d391e0027d5acd356365779f9;hb=c9c0e07706fad701a70ee0d1ffb0fcb6304f138c;hpb=9668279ccef86a9cc9138aaa1a659f158698f829 diff --git a/cinelerra-5.1/cinelerra/edits.C b/cinelerra-5.1/cinelerra/edits.C index 8c8901bf..b2bcaf98 100644 --- a/cinelerra-5.1/cinelerra/edits.C +++ b/cinelerra-5.1/cinelerra/edits.C @@ -31,6 +31,7 @@ #include "edits.h" #include "edl.h" #include "edlsession.h" +#include "ffmpeg.h" #include "file.h" #include "filexml.h" #include "filesystem.h" @@ -178,7 +179,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; @@ -242,7 +243,7 @@ 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() ) @@ -412,8 +413,8 @@ int Edits::optimize() 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 && @@ -838,3 +839,58 @@ void Edits::shift_effects_recursive(int64_t position, int64_t length, int edit_a track->shift_effects(position, length, edit_autos, 0); } +double Edits::early_timecode() +{ + double result = -1; + for( Edit *edit=first; edit; edit=edit->next ) { + Asset *asset = edit->asset; + if( !asset ) continue; + if( asset->timecode < -1 ) + asset->timecode = FFMPEG::get_timecode(asset->path, + track->data_type, edit->channel, + edl->session->frame_rate); + if( asset->timecode < 0 ) continue; + if( result < 0 || result > asset->timecode ) + result = asset->timecode; + } + return result; +} + +void Edits::align_timecodes(double offset) +{ + for( Edit *edit=first, *next=0; edit; edit=next ) { + next = edit->next; + if( edit->silence() ) delete edit; + } + for( Edit *edit=first, *next=0; edit; edit=next ) { + next = edit->next; + Asset *asset = edit->asset; + if( !asset && asset->timecode < 0 ) continue; + double position = asset->timecode - offset; + edit->startproject = track->to_units(position, 1) + edit->startsource; + } + int result = 1; + while( result ) { + result = 0; + for( Edit *edit=first, *next=0; edit; edit=next ) { + next = edit->next; + if( !next || next->startproject >= edit->startproject ) continue; + swap(next, edit); + next = edit; + result = 1; + } + } + int64_t startproject = 0; + for( Edit *edit=first; edit; edit=edit->next ) { + int64_t length = edit->startproject - startproject; + if( length > 0 ) { + Edit *new_edit = create_edit(); + insert_before(edit, new_edit); + new_edit->startproject = startproject; + new_edit->length = length; + startproject = edit->startproject; + } + startproject += edit->length; + } +} +