fix histogram bez keyframe interp, update plugins/fonts/fonts.scale, edl copy clip...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / edl.C
index 21abfd7b99c95524e7d54020228b5f881b313840..77705fcf53f2e2b2b741373b696eecc48e3f905c 100644 (file)
@@ -1543,45 +1543,57 @@ void EDL::set_proxy(int new_scale, int use_scaler,
 // change original assets to proxy assets
        int folder_no = use_scaler || new_scale != 1 ? AW_PROXY_FOLDER : AW_MEDIA_FOLDER;
        for( int i=0,n=proxy_assets->size(); i<n; ++i ) {
-               const char *orig_path = orig_assets->get(i)->path;
                Indexable *proxy_idxbl = proxy_assets->get(i);
                proxy_idxbl->folder_no = folder_no;
-               Asset *proxy_asset = proxy_idxbl->is_asset ? assets->update((Asset *)proxy_idxbl) : 0;
-               if( proxy_asset && proxy_idxbl ) {
-                       proxy_asset->width = proxy_idxbl->get_w();
-                       proxy_asset->height = proxy_idxbl->get_h();
-               }
-               EDL *proxy_edl = !proxy_idxbl->is_asset ? (EDL *)proxy_idxbl : 0;
+               if( !proxy_idxbl->is_asset ) continue;
+               Asset *proxy_asset = assets->update((Asset *)proxy_idxbl);
+               if( proxy_asset == (Asset *)proxy_idxbl ) continue;
+               proxy_asset->width = proxy_idxbl->get_w();
+               proxy_asset->height = proxy_idxbl->get_h();
+       }
 // replace track contents
-               for( Track *track=tracks->first; track; track=track->next ) {
+       for( Track *track=tracks->first; track; track=track->next ) {
+               if( track->data_type != TRACK_VIDEO ) continue;
+               for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
+                       Indexable *idxbl = (Indexable *)edit->asset;
+                       if( !idxbl ) idxbl = (Indexable *)edit->nested_edl;
+                       if( !idxbl ) continue;
+                       int i = orig_assets->size();
+                       while( --i>=0 && strcmp(orig_assets->get(i)->path, idxbl->path) );
+                       if( i < 0 ) continue;
+                       Indexable *proxy_idxbl = proxy_assets->get(i);
+                       Asset *proxy_asset = proxy_idxbl->is_asset ?
+                               assets->update((Asset *)proxy_idxbl) : 0;
+                       EDL *proxy_edl = !proxy_idxbl->is_asset ?
+                               (EDL *)proxy_idxbl : 0;
+                       edit->asset = proxy_asset;
+                       edit->nested_edl = proxy_edl;
+               }
+       }
+       for( int j=0,n=clips.size(); j<n; ++j ) {
+               EDL *clip = clips[j];
+               int has_proxy = 0;
+               for( Track *track=clip->tracks->first; track; track=track->next ) {
                        if( track->data_type != TRACK_VIDEO ) continue;
                        for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
                                Indexable *idxbl = (Indexable *)edit->asset;
                                if( !idxbl ) idxbl = (Indexable *)edit->nested_edl;
                                if( !idxbl ) continue;
-                               if( strcmp(idxbl->path, orig_path) ) continue;
+                               int i = orig_assets->size();
+                               while( --i>=0 && strcmp(orig_assets->get(i)->path, idxbl->path) );
+                               if( i < 0 ) continue;
+                               Indexable *proxy_idxbl = proxy_assets->get(i);
+                               Asset *proxy_asset = proxy_idxbl->is_asset ?
+                                       assets->update((Asset *)proxy_idxbl) : 0;
+                               EDL *proxy_edl = !proxy_idxbl->is_asset ?
+                                       (EDL *)proxy_idxbl : 0;
                                edit->asset = proxy_asset;
                                edit->nested_edl = proxy_edl;
+                               has_proxy = 1;
                        }
                }
-               for( int j=0,m=clips.size(); j<m; ++j ) {
-                       EDL *clip = clips[j];
-                       int has_proxy = 0;
-                       for( Track *track=clip->tracks->first; track; track=track->next ) {
-                               if( track->data_type != TRACK_VIDEO ) continue;
-                               for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
-                                       Indexable *idxbl = (Indexable *)edit->asset;
-                                       if( !idxbl ) idxbl = (Indexable *)edit->nested_edl;
-                                       if( !idxbl ) continue;
-                                       if( strcmp(idxbl->path, orig_path) ) continue;
-                                       edit->asset = proxy_asset;
-                                       edit->nested_edl = proxy_edl;
-                                       has_proxy = 1;
-                               }
-                       }
-                       if( has_proxy && !orig_use_scaler )
-                               clip->rescale_proxy(orig_scale, new_scale);
-               }
+               if( has_proxy && !orig_use_scaler )
+                       clip->rescale_proxy(orig_scale, new_scale);
        }
 }