X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindowedit.C;h=c0dcd61da4d24daec055e3cca68dcbe43c7c6025;hp=8fba7bfc95d48b110516db5e6ef81c743d8e59df;hb=243336668c89096732786c6b3f3c5918aa2eff26;hpb=65eb7d06c462c2caaa7fabcb8956add9e6b8abc7 diff --git a/cinelerra-5.1/cinelerra/mwindowedit.C b/cinelerra-5.1/cinelerra/mwindowedit.C index 8fba7bfc..c0dcd61d 100644 --- a/cinelerra-5.1/cinelerra/mwindowedit.C +++ b/cinelerra-5.1/cinelerra/mwindowedit.C @@ -74,6 +74,7 @@ #include "vwindow.h" #include "vwindowgui.h" #include "zoombar.h" +#include "zwindow.h" #include "automation.h" #include "maskautos.h" @@ -96,8 +97,7 @@ void MWindow::add_audio_track_entry(int above, Track *dst) // gui->cursor->draw(1); // gui->canvas->flash(); // gui->canvas->activate(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::add_video_track_entry(Track *dst) @@ -116,8 +116,7 @@ void MWindow::add_video_track_entry(Track *dst) // gui->cursor->draw(1); // gui->canvas->flash(); // gui->canvas->activate(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); save_backup(); } @@ -137,8 +136,7 @@ void MWindow::add_subttl_track_entry(Track *dst) // gui->cursor->draw(1); // gui->canvas->flash(); // gui->canvas->activate(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); save_backup(); } @@ -311,8 +309,7 @@ void MWindow::clear_entry() update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::clear(int clear_handle) @@ -408,8 +405,7 @@ void MWindow::concatenate_tracks() restart_brender(); gui->update(1, 1, 0, 0, 1, 0, 0); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } @@ -505,35 +501,93 @@ void MWindow::crop_video() undo->update_undo_after(_("crop"), LOAD_ALL); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_ALL, edl, 1); + cwindow->refresh_frame(CHANGE_ALL); save_backup(); } void MWindow::cut() { - undo->update_undo_before(); - double start = edl->local_session->get_selectionstart(); double end = edl->local_session->get_selectionend(); + if( EQUIV(start,end) ) + blade(start); + else + cut(start, end); +} + +void MWindow::blade(double position) +{ + undo->update_undo_before(); + edl->blade(position); + edl->optimize(); + save_backup(); + undo->update_undo_after(_("blade"), LOAD_EDITS | LOAD_TIMEBAR); + restart_brender(); + update_plugin_guis(); + gui->update(1, 2, 1, 1, 1, 1, 0); + cwindow->update(1, 0, 0, 0, 1); + awindow->gui->async_update_assets(); + cwindow->refresh_frame(CHANGE_EDL); +} +void MWindow::cut(double start, double end, double new_position) +{ + undo->update_undo_before(); copy(start, end); edl->clear(start, end, edl->session->labels_follow_edits, edl->session->plugins_follow_edits, edl->session->autos_follow_edits); - edl->optimize(); save_backup(); undo->update_undo_after(_("cut"), LOAD_EDITS | LOAD_TIMEBAR); - + if( new_position >= 0 ) { + edl->local_session->set_selectionstart(new_position); + edl->local_session->set_selectionend(new_position); + } restart_brender(); update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + awindow->gui->async_update_assets(); + cwindow->refresh_frame(CHANGE_EDL); +} + +void MWindow::snap_left_edit() +{ + double start_pos = edl->local_session->get_selectionstart(1); + double position = edl->prev_edit(start_pos); + if( position < start_pos ) + cut(position, start_pos, position); +} + +void MWindow::snap_right_edit() +{ + double end_pos = edl->local_session->get_selectionend(1); + double position = edl->next_edit(end_pos); + if( end_pos < position ) + cut(end_pos, position, end_pos); +} + +void MWindow::snap_left_label() +{ + double start_pos = edl->local_session->get_selectionstart(1); + Label *left_label = edl->labels->prev_label(start_pos); + if( !left_label ) return; + double position = left_label->position; + if( position < start_pos ) + cut(position, start_pos, position); +} + +void MWindow::snap_right_label() +{ + double end_pos = edl->local_session->get_selectionend(1); + Label *right_label = edl->labels->next_label(end_pos); + if( !right_label ) return; + double position = right_label->position; + if( end_pos < position ) + cut(end_pos, position, end_pos); } int MWindow::cut_automation() @@ -577,19 +631,6 @@ int MWindow::cut_default_keyframe() } -void MWindow::delete_inpoint() -{ - edl->local_session->unset_inpoint(); - save_backup(); -} - -void MWindow::delete_outpoint() -{ - edl->local_session->unset_outpoint(); - save_backup(); -} - - void MWindow::delete_track() { if( edl->tracks->last ) @@ -607,8 +648,7 @@ void MWindow::delete_tracks() update_plugin_states(); gui->update(1, 1, 1, 0, 1, 0, 0); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::delete_track(Track *track) @@ -621,8 +661,7 @@ void MWindow::delete_track(Track *track) update_plugin_states(); gui->update(1, 1, 1, 0, 1, 0, 0); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); save_backup(); } @@ -820,15 +859,18 @@ void MWindow::finish_modify_handles() if( (session->drag_handle == 1 && edit_mode != MOVE_NO_EDITS) || (session->drag_handle == 0 && edit_mode == MOVE_ONE_EDIT) ) { +//printf("MWindow::finish_modify_handles %d\n", __LINE__); edl->local_session->set_selectionstart(session->drag_position); edl->local_session->set_selectionend(session->drag_position); } else if( edit_mode != MOVE_NO_EDITS ) { +//printf("MWindow::finish_modify_handles %d\n", __LINE__); edl->local_session->set_selectionstart(session->drag_start); edl->local_session->set_selectionend(session->drag_start); } +// clamp the selection to 0 if( edl->local_session->get_selectionstart(1) < 0 ) { edl->local_session->set_selectionstart(0); edl->local_session->set_selectionend(0); @@ -840,6 +882,8 @@ void MWindow::finish_modify_handles() sync_parameters(CHANGE_EDL); update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 0); +// label list can be modified + awindow->gui->async_update_assets(); cwindow->update(1, 0, 0, 0, 1); } @@ -875,8 +919,7 @@ void MWindow::move_edits(ArrayList *edits, undo->update_undo_after(_("move edit"), LOAD_ALL); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); update_plugin_guis(); gui->update(1, 1, // 1 for incremental drawing. 2 for full refresh @@ -891,8 +934,7 @@ void MWindow::move_effect(Plugin *plugin, Track *track, int64_t position) undo->update_undo_after(_("paste effect"), LOAD_ALL); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); update_plugin_guis(); gui->update(1, 1, // 1 for incremental drawing. 2 for full refresh 0, 0, 0, 0, 0); @@ -906,8 +948,7 @@ void MWindow::move_effect(Plugin *plugin, PluginSet *plugin_set, int64_t positio undo->update_undo_after(_("move effect"), LOAD_ALL); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); update_plugin_guis(); gui->update(1, 1, // 1 for incremental drawing. 2 for full refresh 0, 0, 0, 0, 0); @@ -1005,14 +1046,14 @@ void MWindow::mute_selection() edl->paste_silence(start, end, 0, edl->session->plugins_follow_edits, edl->session->autos_follow_edits); + save_backup(); undo->update_undo_after(_("mute"), LOAD_EDITS); restart_brender(); update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 0); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } } @@ -1034,7 +1075,7 @@ void MWindow::overwrite(EDL *source) } source->copy(src_start, src_start + overwrite_len, - 1, 0, 0, &file, "", 1); + 0, 0, 0, &file, "", 1); // HACK around paste_edl get_start/endselection on its own // so we need to clear only when not using both io points @@ -1084,7 +1125,7 @@ void MWindow::paste() int64_t len = gui->clipboard_len(BC_PRIMARY_SELECTION); if( len ) { - char *string = new char[len + 1]; + char *string = new char[len]; undo->update_undo_before(); gui->from_clipboard(string, len, BC_PRIMARY_SELECTION); FileXML file; @@ -1203,7 +1244,7 @@ int MWindow::paste_automation() if( len ) { undo->update_undo_before(); - char *string = new char[len + 1]; + char *string = new char[len]; gui->from_clipboard(string, len, BC_PRIMARY_SELECTION); FileXML file; file.read_from_string(string); @@ -1234,7 +1275,7 @@ int MWindow::paste_default_keyframe() if( len ) { undo->update_undo_before(); - char *string = new char[len + 1]; + char *string = new char[len]; gui->from_clipboard(string, len, BC_PRIMARY_SELECTION); FileXML file; file.read_from_string(string); @@ -1272,7 +1313,7 @@ int MWindow::paste_edls(ArrayList *new_edls, int load_mode, if( !new_edls->total ) return 0; //PRINT_TRACE -// double original_length = edl->tracks->total_playable_length(); +// double original_length = edl->tracks->total_length(); // double original_preview_end = edl->local_session->preview_end; //PRINT_TRACE @@ -1286,6 +1327,7 @@ int MWindow::paste_edls(ArrayList *new_edls, int load_mode, edl = new EDL; edl->create_objects(); edl->copy_session(new_edls->values[0]); + edl->copy_mixers(new_edls->values[0]); gui->mainmenu->update_toggles(0); gui->unlock_window(); gwindow->gui->update_toggles(1); @@ -1547,7 +1589,7 @@ int MWindow::paste_edls(ArrayList *new_edls, int load_mode, // Fix preview range // if( EQUIV(original_length, original_preview_end) ) // { -// edl->local_session->preview_end = edl->tracks->total_playable_length(); +// edl->local_session->preview_end = edl->tracks->total_length(); // } // Start examining next batch of index files @@ -1575,8 +1617,7 @@ void MWindow::paste_silence() restart_brender(); gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::detach_transition(Transition *transition) @@ -1819,22 +1860,11 @@ void MWindow::set_transition_length(double length) void MWindow::redo_entry(BC_WindowBase *calling_window_gui) { - calling_window_gui->unlock_window(); + stop_playback(0); + close_mixers(); - cwindow->playback_engine->que-> - send_command(STOP, CHANGE_NONE, 0, 0); - cwindow->playback_engine->interrupt_playback(0); - - for( int i = 0; i < vwindows.size(); i++ ) { - if( vwindows.get(i)->is_running() ) { - vwindows.get(i)->playback_engine->que-> - send_command(STOP, CHANGE_NONE, 0, 0); - vwindows.get(i)->playback_engine->interrupt_playback(0); - } - } - - cwindow->gui->lock_window("MWindow::redo_entry"); + cwindow->gui->lock_window("MWindow::redo_entry 1"); for( int i = 0; i < vwindows.size(); i++ ) { if( vwindows.get(i)->is_running() ) { if( calling_window_gui != vwindows.get(i)->gui ) { @@ -1842,22 +1872,19 @@ void MWindow::redo_entry(BC_WindowBase *calling_window_gui) } } } - gui->lock_window(); + gui->lock_window("MWindow::redo_entry 3"); undo->redo(); save_backup(); + restart_brender(); update_plugin_states(); update_plugin_guis(); - restart_brender(); + gui->update(1, 2, 1, 1, 1, 1, 1); + gui->unlock_window(); cwindow->update(1, 1, 1, 1, 1); - - if( calling_window_gui != cwindow->gui ) - cwindow->gui->unlock_window(); - if( calling_window_gui != gui ) - gui->unlock_window(); - + cwindow->gui->unlock_window(); for( int i = 0; i < vwindows.size(); i++ ) { if( vwindows.get(i)->is_running() ) { @@ -1867,8 +1894,14 @@ void MWindow::redo_entry(BC_WindowBase *calling_window_gui) } } - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_ALL, edl, 1); + if( calling_window_gui != gui ) + gui->unlock_window(); + + open_mixers(); + awindow->gui->async_update_assets(); + + cwindow->refresh_frame(CHANGE_ALL); + calling_window_gui->lock_window("MWindow::redo_entry 4"); } @@ -1937,6 +1970,30 @@ void MWindow::set_outpoint(int is_mwindow) } } +void MWindow::unset_inoutpoint(int is_mwindow) +{ + undo->update_undo_before(); + edl->unset_inoutpoint(); + save_backup(); + undo->update_undo_after(_("clear in/out"), LOAD_TIMEBAR); + + if( !is_mwindow ) { + gui->lock_window("MWindow::unset_inoutpoint 1"); + } + gui->update_timebar(1); + if( !is_mwindow ) { + gui->unlock_window(); + } + + if( is_mwindow ) { + cwindow->gui->lock_window("MWindow::unset_inoutpoint 2"); + } + cwindow->gui->timebar->update(1); + if( is_mwindow ) { + cwindow->gui->unlock_window(); + } +} + void MWindow::splice(EDL *source) { FileXML file; @@ -2014,7 +2071,7 @@ void MWindow::save_clip(EDL *new_edl, const char *txt) edl->update_assets(new_edl); int cur_x, cur_y; - gui->get_abs_cursor_xy(cur_x, cur_y, 0); + gui->get_abs_cursor(cur_x, cur_y, 0); gui->unlock_window(); awindow->clip_edit->create_clip(new_edl, cur_x, cur_y); @@ -2109,28 +2166,17 @@ void MWindow::trim_selection() update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); + awindow->gui->async_update_assets(); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::undo_entry(BC_WindowBase *calling_window_gui) { calling_window_gui->unlock_window(); - - cwindow->playback_engine->que-> - send_command(STOP, CHANGE_NONE, 0, 0); - cwindow->playback_engine->interrupt_playback(0); - -//printf("MWindow::undo_entry %d %d\n", __LINE__, vwindows.size()); - for( int i = 0; i < vwindows.size(); i++ ) { - if( vwindows.get(i)->is_running() ) { - vwindows.get(i)->playback_engine->que-> - send_command(STOP, CHANGE_NONE, 0, 0); - vwindows.get(i)->playback_engine->interrupt_playback(0); - } - } + stop_playback(0); + close_mixers(); cwindow->gui->lock_window("MWindow::undo_entry 1"); for( int i = 0; i < vwindows.size(); i++ ) { @@ -2167,8 +2213,8 @@ void MWindow::undo_entry(BC_WindowBase *calling_window_gui) awindow->gui->async_update_assets(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_ALL, edl, 1); + open_mixers(); + cwindow->refresh_frame(CHANGE_ALL); calling_window_gui->lock_window("MWindow::undo_entry 4"); } @@ -2274,6 +2320,100 @@ void MWindow::remap_audio(int pattern) } } +void MWindow::set_proxy(int use_scaler, int new_scale, int auto_scale, + ArrayList *orig_assets, + ArrayList *proxy_assets) +{ + int orig_use_scaler = edl->session->proxy_use_scaler; + int orig_scale = edl->session->proxy_scale; +// rescale to full size asset in read_frame + edl->session->proxy_use_scaler = use_scaler; + edl->session->proxy_scale = new_scale; + edl->session->proxy_auto_scale = auto_scale; + + 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 && new_scale != orig_scale ) { +// project size + float orig_w = (float)edl->session->output_w * orig_scale; + float orig_h = (float)edl->session->output_h * orig_scale; + edl->session->output_w = Units::round(orig_w / new_scale); + edl->session->output_h = Units::round(orig_h / new_scale); + +// track sizes + for( Track *track=edl->tracks->first; track; track=track->next ) { + if( track->data_type != TRACK_VIDEO ) continue; + orig_w = (float)track->track_w * orig_scale; + orig_h = (float)track->track_h * orig_scale; + track->track_w = Units::round(orig_w / new_scale); + track->track_h = Units::round(orig_h / new_scale); + ((MaskAutos*)track->automation->autos[AUTOMATION_MASK])-> + set_proxy(orig_scale, new_scale); + ((FloatAutos*)track->automation->autos[AUTOMATION_CAMERA_X])-> + set_proxy(orig_scale, new_scale); + ((FloatAutos*)track->automation->autos[AUTOMATION_CAMERA_Y])-> + set_proxy(orig_scale, new_scale); + ((FloatAutos*)track->automation->autos[AUTOMATION_PROJECTOR_X])-> + set_proxy(orig_scale, new_scale); + ((FloatAutos*)track->automation->autos[AUTOMATION_PROJECTOR_Y])-> + set_proxy(orig_scale, new_scale); + } + } + +// change original assets to proxy assets + int awindow_folder = use_scaler || new_scale != 1 ? AW_PROXY_FOLDER : AW_MEDIA_FOLDER; + for( int i=0,n=proxy_assets->size(); iassets->update((Asset *)proxy_assets->get(i)); + proxy_asset->awindow_folder = awindow_folder; +// replace track contents + for( Track *track = edl->tracks->first; track; track = track->next ) { + if( track->data_type != TRACK_VIDEO ) continue; + for( Edit *edit = track->edits->first; edit; edit = edit->next ) { + if( !edit->asset ) continue; + if( !strcmp(edit->asset->path, orig_assets->get(i)->path) ) { + edit->asset = proxy_asset; + } + } + } + } +} + +void MWindow::add_proxy(int use_scaler, + 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(); + } + } + +// change original assets to proxy assets + for( int i=0,n=proxy_assets->size(); iassets->update((Asset *)proxy_assets->get(i)); + proxy_asset->awindow_folder = AW_PROXY_FOLDER; +// replace track contents + for( Track *track = edl->tracks->first; track; track = track->next ) { + if( track->data_type != TRACK_VIDEO ) continue; + for( Edit *edit = track->edits->first; edit; edit = edit->next ) { + if( !edit->asset ) continue; + if( !strcmp(edit->asset->path, orig_assets->get(i)->path) ) { + edit->asset = proxy_asset; + } + } + } + } +} + void MWindow::cut_commercials() { undo->update_undo_before(); @@ -2286,8 +2426,7 @@ void MWindow::cut_commercials() update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); }