collect_proxy nested_clip/edl fixes
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / edl.C
index ca0d149c0e5042c4a4642bed651517f5fb0abca0..cb080aca25103b8349062e069f7200cff3891614 100644 (file)
@@ -437,7 +437,7 @@ int EDL::copy_assets(int copy_flags, double start, double end,
        if( (copy_flags & COPY_USED_ASSETS) ) {
 // Copy just the ones being used.
                for( current = tracks->first; current; current = NEXT ) {
-                       if( !current->record ) continue;
+                       if( !current->is_armed() ) continue;
                        current->copy_assets(start, end, &asset_list);
                }
        }
@@ -601,7 +601,7 @@ void EDL::copy_indexables(EDL *edl)
        }
 }
 
-EDL *EDL::new_nested_edl(EDL *edl, const char *path)
+EDL *EDL::new_nested_clip(EDL *edl, const char *path)
 {
        EDL *nested = new EDL;  // no parent for nested edl
        nested->create_objects();
@@ -614,19 +614,14 @@ EDL *EDL::new_nested_edl(EDL *edl, const char *path)
        return nested;
 }
 
-EDL *EDL::get_nested_edl()
+EDL *EDL::get_nested_edl(const char *path)
 {
-       Track *track = tracks->first;
-       Edit *edit = track ? track->edits->first : 0;
-       EDL *nested = edit && !edit->next && !edit->asset ? edit->nested_edl : 0;
-       while( nested && (track=track->next)!=0 ) {
-               Edit *edit = track->edits->first;
-               if( !edit || edit->next ||
-                   ( edit->nested_edl != nested &&
-                     strcmp(edit->nested_edl->path, nested->path) ) )
-                       nested = 0;
+       for( int i=0; i<nested_edls.size(); ++i ) {
+               EDL *nested_edl = nested_edls[i];
+               if( !strcmp(path, nested_edl->path) )
+                       return nested_edl;
        }
-       return nested;
+       return 0;
 }
 
 
@@ -642,8 +637,8 @@ void EDL::create_nested(EDL *nested)
 {
        int video_tracks = 0, audio_tracks = 0;
        for( Track *track=nested->tracks->first; track!=0; track=track->next ) {
-               if( track->data_type == TRACK_VIDEO && track->record ) ++video_tracks;
-               if( track->data_type == TRACK_AUDIO && track->record ) ++audio_tracks;
+               if( track->data_type == TRACK_VIDEO && track->play ) ++video_tracks;
+               if( track->data_type == TRACK_AUDIO && track->play ) ++audio_tracks;
        }
 // renderengine properties
        if( video_tracks > 0 )
@@ -1049,6 +1044,7 @@ int EDL::get_tracks_height(Theme *theme)
 {
        int total_pixels = 0;
        for( Track *current=tracks->first; current; current=NEXT ) {
+               if( current->is_hidden() ) continue;
                total_pixels += current->vertical_span(theme);
        }
        return total_pixels;
@@ -1058,6 +1054,7 @@ int64_t EDL::get_tracks_width()
 {
        int64_t total_pixels = 0;
        for( Track *current=tracks->first; current; current=NEXT ) {
+               if( current->is_hidden() ) continue;
                int64_t pixels = current->horizontal_span();
                if( pixels > total_pixels ) total_pixels = pixels;
        }
@@ -1233,7 +1230,7 @@ void EDL::insert_asset(Asset *asset,
        }
 
        for( ; current && vtrack<layers; current=NEXT ) {
-               if( !current->record || current->data_type != TRACK_VIDEO ) continue;
+               if( !current->is_armed() || current->data_type != TRACK_VIDEO ) continue;
                current->insert_asset(new_asset, new_nested_edl,
                        length, position, vtrack++);
        }
@@ -1255,7 +1252,7 @@ void EDL::insert_asset(Asset *asset,
 
        current = tracks->first;
        for( ; current && atrack < channels; current=NEXT ) {
-               if( !current->record || current->data_type != TRACK_AUDIO ) continue;
+               if( !current->is_armed() || current->data_type != TRACK_AUDIO ) continue;
                current->insert_asset(new_asset, new_nested_edl,
                        length, position, atrack++);
        }
@@ -1309,7 +1306,7 @@ void EDL::get_shared_plugins(Track *source,
        int data_type)
 {
        for( Track *track=tracks->first; track; track=track->next ) {
-               if( track->record && omit_recordable ) continue;
+               if( track->is_armed() && omit_recordable ) continue;
                if( track == source || track->data_type != data_type ) continue;
                for( int i=0; i<track->plugin_set.size(); ++i ) {
                        Plugin *plugin = track->get_current_plugin(
@@ -1326,7 +1323,7 @@ void EDL::get_shared_tracks(Track *track,
        int omit_recordable, int data_type)
 {
        for( Track *current=tracks->first; current; current=NEXT ) {
-               if( omit_recordable && current->record ) continue;
+               if( omit_recordable && current->is_armed() ) continue;
                if( current == track || current->data_type != data_type ) continue;
                module_locations->append(new SharedLocation(tracks->number_of(current), 0));
        }
@@ -1599,7 +1596,7 @@ double EDL::next_edit(double position)
 
 // Test for edit handles after position
        for( Track *track=tracks->first; track; track=track->next ) {
-               if( !track->record ) continue;
+               if( !track->is_armed() ) continue;
                for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
                        double edit_end = track->from_units(edit->startproject + edit->length);
                        Units::fix_double(&edit_end);
@@ -1623,7 +1620,7 @@ double EDL::prev_edit(double position)
 
 // Test for edit handles before cursor position
        for( Track *track=tracks->first; track; track=track->next ) {
-               if( !track->record ) continue;
+               if( !track->is_armed() ) continue;
                for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
                        double edit_end = track->from_units(edit->startproject);
                        Units::fix_double(&edit_end);
@@ -1869,7 +1866,7 @@ EDL *EDL::selected_edits_to_clip(int packed,
        double start = DBL_MAX, end = DBL_MIN;
        Track *first_track=0, *last_track = 0;
        for( Track *track=tracks->first; track; track=track->next ) {
-               if( !track->record ) continue;
+               if( !track->is_armed() ) continue;
                int empty = 1;
                for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
                        if( !edit->is_selected || edit->silence() ) continue;
@@ -1895,7 +1892,7 @@ EDL *EDL::selected_edits_to_clip(int packed,
        new_edl->session->video_tracks = 0;
        new_edl->session->audio_tracks = 0;
        for( Track *track=tracks->first; track; track=track->next ) {
-               if( !track->record ) continue;
+               if( !track->is_armed() ) continue;
                if( first_track ) {
                        if( first_track != track ) continue;
                        first_track = 0;
@@ -2045,7 +2042,7 @@ void EDL::paste_edits(EDL *clip, Track *first_track, double position, int overwr
                first_track = tracks->first;
        Track *src = clip->tracks->first;
        for( Track *track=first_track; track && src; track=track->next ) {
-               if( !track->record ) continue;
+               if( !track->is_armed() ) continue;
                int64_t pos = track->to_units(position, 0);
                if( edit_edits ) {
                        for( Edit *edit=src->edits->first; edit; edit=edit->next ) {
@@ -2199,8 +2196,7 @@ void EDL::replace_assets(ArrayList<Indexable*> &orig_idxbls, ArrayList<Asset*> &
 int EDL::collect_effects(EDL *&group)
 {
 // to remap shared plugins in copied plugin stack
-       class shared : public ArrayList<int> { public: int trk; };
-       class shared_list : public ArrayList<shared> {} shared_map;
+       edl_shared_list shared_map;
        int ret = 0;
        EDL *new_edl = new EDL(parent_edl ? parent_edl : this);
        new_edl->create_objects();
@@ -2212,9 +2208,9 @@ int EDL::collect_effects(EDL *&group)
                Edit *edit = track->edits->first;
                while( edit && !edit->is_selected ) edit = edit->next;
                if( !edit ) continue;
-               if( !track->record ) { ret = COLLECT_EFFECTS_RECORD;  break; } 
+               if( !track->is_armed() ) { ret = COLLECT_EFFECTS_RECORD;  break; } 
                Track *new_track = 0;
-               shared *location = 0;
+               edl_shared *location = 0;
                int64_t start_pos = edit->startproject;
                int64_t end_pos = start_pos + edit->length;
                int pluginsets = track->plugin_set.size();
@@ -2267,7 +2263,7 @@ int EDL::collect_effects(EDL *&group)
                                int m = shared_map.size(), n = -1;
                                while( --m>=0 && shared_map[m].trk!=trk );
                                if( m >= 0 ) {
-                                       shared &location = shared_map[m];
+                                       edl_shared &location = shared_map[m];
                                        n = location.size();
                                        while( --n>=0 && location[n]!=set );
                                }
@@ -2279,19 +2275,21 @@ int EDL::collect_effects(EDL *&group)
        }
        if( !ret )
                group = new_edl;
+       else
+               new_edl->remove_user();
        return ret;
 }
 
+void edl_SharedLocations::add(int trk, int plg)
+{
+       SharedLocation &s = append();
+       s.module = trk;  s.plugin = plg;
+}
+
 // inserts pluginsets in group to first selected edit in tracks
 int EDL::insert_effects(EDL *group, Track *first_track)
 {
-       class SharedLocations : public ArrayList<SharedLocation> {
-       public:
-               void add(int trk, int plg) {
-                       SharedLocation &s = append();
-                       s.module = trk;  s.plugin = plg;
-               }
-       } edl_locs, new_locs;
+       edl_SharedLocations edl_locs, new_locs;
        Track *new_track = group->tracks->first;
        if( !first_track ) first_track = tracks->first;
        Track *track = first_track;
@@ -2299,7 +2297,7 @@ int EDL::insert_effects(EDL *group, Track *first_track)
                Edit *edit = track->edits->first;
                while( edit && !edit->is_selected ) edit = edit->next;
                if( !edit ) continue;
-               if( !track->record ) return INSERT_EFFECTS_RECORD;
+               if( !track->is_armed() ) return INSERT_EFFECTS_RECORD;
                if( track->data_type != new_track->data_type ) return INSERT_EFFECTS_TYPE;
                int gtrk = group->tracks->number_of(new_track);
                int trk = tracks->number_of(track);
@@ -2322,7 +2320,7 @@ int EDL::insert_effects(EDL *group, Track *first_track)
        new_track = group->tracks->first;
        track = first_track;
        for( ; track && new_track; track=track->next ) {
-               if( !track->record ) continue;
+               if( !track->is_armed() ) continue;
                Edit *edit = track->edits->first;
                while( edit && !edit->is_selected ) edit = edit->next;
                if( !edit ) continue;