X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fedl.C;h=b46a4102d35b5abae035e4d3d2fdf1f710950c1c;hp=fd481cea332c1628fabc683a8b2b8301ef15aa98;hb=3b4b6f588c4f2643316afcbc486ca6a35c16a431;hpb=9668279ccef86a9cc9138aaa1a659f158698f829 diff --git a/cinelerra-5.1/cinelerra/edl.C b/cinelerra-5.1/cinelerra/edl.C index fd481cea..b46a4102 100644 --- a/cinelerra-5.1/cinelerra/edl.C +++ b/cinelerra-5.1/cinelerra/edl.C @@ -34,6 +34,7 @@ #include "edits.h" #include "edl.h" #include "edlsession.h" +#include "file.h" #include "filexml.h" #include "floatauto.h" #include "floatautos.h" @@ -600,7 +601,7 @@ void EDL::copy_indexables(EDL *edl) } } -EDL *EDL::new_nested(EDL *edl, const char *path) +EDL *EDL::new_nested_edl(EDL *edl, const char *path) { EDL *nested = new EDL; // no parent for nested edl nested->create_objects(); @@ -613,6 +614,22 @@ EDL *EDL::new_nested(EDL *edl, const char *path) return nested; } +EDL *EDL::get_nested_edl() +{ + 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; + } + return nested; +} + + EDL *EDL::create_nested_clip(EDL *nested) { EDL *new_edl = new EDL(this); // parent for clip edl @@ -623,14 +640,51 @@ EDL *EDL::create_nested_clip(EDL *nested) 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; + } +// renderengine properties + if( video_tracks > 0 ) + video_tracks = 1; + if( audio_tracks > 0 ) + audio_tracks = nested->session->audio_channels; + // Keep frame rate, sample rate, and output size unchanged. // Nest all video & audio outputs + session->video_channels = video_tracks; + session->audio_channels = audio_tracks; session->video_tracks = 1; - session->audio_tracks = nested->session->audio_channels; + session->audio_tracks = audio_tracks; create_default_tracks(); insert_asset(0, nested, 0, 0, 0); } +void EDL::overwrite_clip(EDL *clip) +{ + int folder = folder_no; + char clip_title[BCTEXTLEN], clip_notes[BCTEXTLEN], clip_icon[BCSTRLEN]; + if( parent_edl ) { + strcpy(clip_title, local_session->clip_title); + strcpy(clip_notes, local_session->clip_notes); + strcpy(clip_icon, local_session->clip_icon); + } + copy_all(clip); + folder_no = folder; + if( parent_edl ) { + strcpy(local_session->clip_title, clip_title); + strcpy(local_session->clip_notes, clip_notes); + strcpy(local_session->clip_icon, clip_icon); + } + if( !clip_icon[0] ) return; +// discard old clip icon to reconstruct + char clip_icon_path[BCTEXTLEN]; + snprintf(clip_icon_path, sizeof(clip_icon_path), + "%s/%s", File::get_config_path(), clip_icon); + remove(clip_icon_path); +} + void EDL::retrack() { int min_w = session->output_w, min_h = session->output_h; @@ -1158,7 +1212,7 @@ void EDL::insert_asset(Asset *asset, if( new_nested_edl ) { length = new_nested_edl->tracks->total_length(); - layers = 1; + layers = new_nested_edl->session->video_channels; channels = new_nested_edl->session->audio_channels; } @@ -1627,39 +1681,31 @@ void EDL::rescale_proxy(int orig_scale, int new_scale) } } -void EDL::set_proxy(int new_scale, int use_scaler, +void EDL::set_proxy(int new_scale, int new_use_scaler, ArrayList *orig_assets, ArrayList *proxy_assets) { int orig_scale = session->proxy_scale; - int orig_use_scaler = session->proxy_use_scaler; - -// rescale to full size asset in read_frame session->proxy_scale = new_scale; - session->proxy_use_scaler = use_scaler; - - if( use_scaler ) { - for( int i=0; isize(); ++i ) { - Asset *proxy_asset = (Asset *)proxy_assets->get(i); - proxy_asset->width = orig_assets->get(i)->get_w(); - proxy_asset->height = orig_assets->get(i)->get_h(); - } - new_scale = 1; - } - - if( !orig_use_scaler ) - rescale_proxy(orig_scale, new_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; // change original assets to proxy assets - int folder_no = use_scaler || new_scale != 1 ? AW_PROXY_FOLDER : AW_MEDIA_FOLDER; + int folder_no = new_use_scaler || new_scale != 1 ? AW_PROXY_FOLDER : AW_MEDIA_FOLDER; for( int i=0,n=proxy_assets->size(); iget(i); proxy_idxbl->folder_no = folder_no; 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(); + 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); + // replace track contents for( Track *track=tracks->first; track; track=track->next ) { if( track->data_type != TRACK_VIDEO ) continue; @@ -1706,15 +1752,17 @@ void EDL::set_proxy(int new_scale, int use_scaler, } } -void EDL::add_proxy(int use_scaler, - ArrayList *orig_assets, ArrayList *proxy_assets) +void EDL::add_proxy(ArrayList *orig_assets, ArrayList *proxy_assets) { - if( use_scaler ) { - for( int i=0,n=proxy_assets->size(); iget(i); - proxy_asset->width = orig_assets->get(i)->get_w(); - proxy_asset->height = orig_assets->get(i)->get_h(); - } + int asset_scale = session->proxy_scale; + if( asset_scale == 1 ) asset_scale = 0; + int scale = !asset_scale ? 1 : asset_scale; +// update proxy geom using scale + for( int i=0; isize(); ++i ) { + Asset *proxy_asset = (Asset *)proxy_assets->get(i); + proxy_asset->proxy_scale = asset_scale; + proxy_asset->width = proxy_asset->actual_width * scale; + proxy_asset->height = proxy_asset->actual_height * scale; } // change original assets to proxy assets @@ -2125,3 +2173,24 @@ void EDL::paste_edits(EDL *clip, Track *first_track, double position, int overwr session->plugins_follow_edits); } +void EDL::replace_assets(ArrayList &orig_idxbls, ArrayList &new_assets) +{ + for( Track *track=tracks->first; track; track=track->next ) { + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + Indexable *idxbl = (Indexable *)edit->asset; + if( !idxbl ) continue; + int i = orig_idxbls.size(); + while( --i>=0 && strcmp(orig_idxbls[i]->path, idxbl->path) ); + if( i < 0 ) continue; + Asset *new_asset = new_assets[i]; + if( track->data_type == TRACK_VIDEO && !new_asset->video_data ) continue; + if( track->data_type == TRACK_AUDIO && !new_asset->audio_data ) continue; + edit->asset = assets->update(new_assets[i]); + } + } + if( !parent_edl ) { + for( int j=0,n=clips.size(); jreplace_assets(orig_idxbls, new_assets); + } +} +