fix undo segv with plugin guis open, add cache demand limits, exit when malloc fails...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / edl.C
index 5df16099ea7de304e2ca7f7f582e03b288c7db4f..98200322a4866d2a86797ba7eaff645b8a9fe9eb 100644 (file)
@@ -270,8 +270,7 @@ int EDL::read_xml(FileXML *file, uint32_t load_flags)
                        }
                        else
                        if( file->tag.title_is("SESSION") ) {
-                               if( (load_flags & LOAD_SESSION) &&
-                                       !parent_edl )
+                               if( (load_flags & LOAD_SESSION) && !parent_edl )
                                        session->load_xml(file, 0, load_flags);
                                else
                                        result = file->skip_tag();
@@ -281,14 +280,13 @@ int EDL::read_xml(FileXML *file, uint32_t load_flags)
                                tracks->load(file, track_offset, load_flags);
                        }
                        else
-// Sub EDL.
-// Causes clip creation to fail because that involves an opening EDL tag.
-                       if( file->tag.title_is("CLIP_EDL") && !parent_edl ) {
+                       if( file->tag.title_is("CLIP_EDL") ) {
                                EDL *new_edl = new EDL(this);
                                new_edl->create_objects();
                                new_edl->read_xml(file, LOAD_ALL);
-                               if( (load_flags & LOAD_ALL) == LOAD_ALL )
+                               if( (load_flags & LOAD_ALL) == LOAD_ALL ) {
                                        clips.add_clip(new_edl);
+                               }
                                new_edl->remove_user();
                        }
                        else
@@ -301,27 +299,22 @@ int EDL::read_xml(FileXML *file, uint32_t load_flags)
                                nested_edl->remove_user();
                        }
                        else
-                       if( file->tag.title_is("VWINDOW_EDL") && !parent_edl ) {
-                               EDL *new_edl = new EDL(this);
-                               new_edl->create_objects();
-                               new_edl->read_xml(file, LOAD_ALL);
-
-
-                               if( (load_flags & LOAD_ALL) == LOAD_ALL ) {
-//                                             if( vwindow_edl && !vwindow_edl_shared )
-//                                                     vwindow_edl->remove_user();
-//                                             vwindow_edl_shared = 0;
-//                                             vwindow_edl = new_edl;
+                       if( file->tag.title_is("VWINDOW_EDL") ) {
+                               if( !parent_edl ) {
+                                       EDL *new_edl = new EDL(this);
+                                       new_edl->create_objects();
+                                       new_edl->read_xml(file, LOAD_ALL);
 
-                                       append_vwindow_edl(new_edl, 0);
 
+                                       if( (load_flags & LOAD_ALL) == LOAD_ALL ) {
+                                               append_vwindow_edl(new_edl, 0);
+                                       }
+                                       else { // Discard if not replacing EDL
+                                               new_edl->remove_user();
+                                       }
                                }
                                else
-// Discard if not replacing EDL
-                               {
-                                       new_edl->remove_user();
-                                       new_edl = 0;
-                               }
+                                       result = file->skip_tag();
                        }
                }
        } while(!result);
@@ -601,7 +594,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 +607,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 +630,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->is_armed() ) ++video_tracks;
-               if( track->data_type == TRACK_AUDIO && track->is_armed() ) ++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 )