add timecode units/alignment/probe, add prefs auto_rotate,
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / edits.C
index ea67b6cb976fa8783d458dc262e0945508e842ca..b2bcaf98f1cf40eacdef8f6b19aa5c938781f10e 100644 (file)
@@ -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"
@@ -102,6 +103,15 @@ 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)
 {
@@ -403,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 &&
@@ -829,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;
+       }
+}
+