no longer need ffmpeg patch0 which was for Termux
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / edl.C
index 5df16099ea7de304e2ca7f7f582e03b288c7db4f..30e9e894dc2fafc267c7610756035d39ca4c0a87 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * CINELERRA
  * Copyright (C) 1997-2012 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 2003-2016 Cinelerra CV contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -270,8 +271,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 +281,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 +300,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( 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);
 
-                               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;
-
-                                       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 +595,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 +608,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 +631,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 )
@@ -914,8 +903,8 @@ static void get_edit_regions(ArrayList<Edit*> *edits, ArrayList<Range> &regions)
 // move edit inclusive labels by regions
        for( int i=0; i<edits->size(); ++i ) {
                Edit *edit = edits->get(i);
-               double pos = edit->track->from_units(edit->startproject);
-               double end = edit->track->from_units(edit->startproject + edit->length);
+               volatile double pos = edit->track->from_units(edit->startproject);
+               volatile double end = edit->track->from_units(edit->startproject + edit->length);
                int n = regions.size(), k = n;
                while( --k >= 0 ) {
                        Range &range = regions[k];
@@ -1687,26 +1676,29 @@ void EDL::set_proxy(int new_scale, int new_use_scaler,
        ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
 {
        int orig_scale = session->proxy_scale;
-       session->proxy_scale = new_scale;
+       int proxy_scale = new_scale;
+       if( !proxy_scale ) proxy_scale = 1;
+       session->proxy_scale = proxy_scale;
        int orig_use_scaler = session->proxy_use_scaler;
        session->proxy_use_scaler = new_use_scaler;
        if( orig_use_scaler ) orig_scale = 1;
-       int scale = new_use_scaler ? new_scale : 1;
-       int asset_scale = new_scale == 1 && !new_use_scaler ? 0 : scale;
+       int scale = new_use_scaler ? proxy_scale : 1;
+       int asset_scale = !new_scale ? 0 : !new_use_scaler ? 1 : scale;
 // change original assets to proxy assets
-       int folder_no = new_use_scaler || new_scale != 1 ? AW_PROXY_FOLDER : AW_MEDIA_FOLDER;
+       int folder_no = !new_use_scaler && !new_scale ? AW_MEDIA_FOLDER : AW_PROXY_FOLDER;
        for( int i=0,n=proxy_assets->size(); i<n; ++i ) {
                Indexable *proxy_idxbl = proxy_assets->get(i);
                proxy_idxbl->folder_no = folder_no;
                if( !proxy_idxbl->is_asset ) continue;
                Asset *proxy_asset = assets->update((Asset *)proxy_idxbl);
+               proxy_asset->proxy_scale = asset_scale;
+               if( !new_scale ) continue;  // in case geom resized
                proxy_asset->width = proxy_asset->actual_width * scale;
                proxy_asset->height = proxy_asset->actual_height * scale;
-               proxy_asset->proxy_scale = asset_scale;
        }
 // rescale to full size asset in read_frame
-       if( new_use_scaler ) new_scale = 1;
-       rescale_proxy(orig_scale, new_scale);
+       if( new_use_scaler ) proxy_scale = 1;
+       rescale_proxy(orig_scale, proxy_scale);
 
 // replace track contents
        for( Track *track=tracks->first; track; track=track->next ) {
@@ -1750,7 +1742,7 @@ void EDL::set_proxy(int new_scale, int new_use_scaler,
                        }
                }
                if( has_proxy && !orig_use_scaler )
-                       clip->rescale_proxy(orig_scale, new_scale);
+                       clip->rescale_proxy(orig_scale, proxy_scale);
        }
 }