X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindowedit.C;h=eac149e9b445a28f601548f30bfe34e7423a057c;hp=d424d60879335f2f4dc267f2b57dedb9f88f47dc;hb=6ad20126d5f82618e5dd4dd2d14b0682a5529d17;hpb=9303c74f396d12f0fb48639ff6a835824cbc5987 diff --git a/cinelerra-5.1/cinelerra/mwindowedit.C b/cinelerra-5.1/cinelerra/mwindowedit.C index d424d608..eac149e9 100644 --- a/cinelerra-5.1/cinelerra/mwindowedit.C +++ b/cinelerra-5.1/cinelerra/mwindowedit.C @@ -289,7 +289,8 @@ void MWindow::clear_entry() edl->optimize(); save_backup(); - undo_after(_("clear"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("clear"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); restart_brender(); update_plugin_guis(); @@ -336,7 +337,7 @@ void MWindow::set_automation_mode(int mode) edl->local_session->get_selectionstart(), edl->local_session->get_selectionend(), mode); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); char string[BCSTRLEN]; sprintf(string,"set %s", FloatAuto::curve_name(mode)); @@ -352,7 +353,7 @@ void MWindow::clear_automation() speed_before(); edl->tracks->clear_automation(edl->local_session->get_selectionstart(), edl->local_session->get_selectionend()); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); undo_after(_("clear keyframes"), !changed_edl ? LOAD_AUTOMATION : @@ -365,7 +366,7 @@ int MWindow::clear_default_keyframe() undo_before(); speed_before(); edl->tracks->clear_default_keyframe(); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); undo_after(_("clear default keyframe"), !changed_edl ? LOAD_AUTOMATION : @@ -668,7 +669,7 @@ int MWindow::cut_automation() copy_automation(); edl->tracks->clear_automation(edl->local_session->get_selectionstart(), edl->local_session->get_selectionend()); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); undo_after(_("cut keyframes"), !changed_edl ? LOAD_AUTOMATION : @@ -684,7 +685,7 @@ int MWindow::cut_default_keyframe() speed_before(); copy_default_keyframe(); edl->tracks->clear_default_keyframe(); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); undo_after(_("cut default keyframe"), !changed_edl ? LOAD_AUTOMATION : @@ -1326,7 +1327,8 @@ void MWindow::overwrite(EDL *source, int all) edl->local_session->set_selectionend(dst_start + overwrite_len); save_backup(); - undo_after(_("overwrite"), LOAD_EDITS); + undo_after(_("overwrite"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); restart_brender(); update_plugin_guis(); @@ -1379,7 +1381,8 @@ void MWindow::paste(double start, Track *first_track, int clear_selection, int o save_backup(); - undo_after(_("paste"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("paste"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); restart_brender(); update_plugin_guis(); gui->update(1, FORCE_REDRAW, 1, 1, 0, 1, 0); @@ -1416,7 +1419,8 @@ int MWindow::paste_assets(double position, Track *dest_track, int overwrite) save_backup(); - undo_after(_("paste assets"), LOAD_EDITS); + undo_after(_("paste assets"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); restart_brender(); gui->update(1, FORCE_REDRAW, 1, 0, 0, 1, 0); sync_parameters(CHANGE_EDL); @@ -1490,7 +1494,7 @@ int MWindow::paste_automation() edl->tracks->clear_automation(start, end); edl->tracks->paste_automation(start, &file, 0, 1, edl->session->typeless_keyframes); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 0); save_backup(); undo_after(_("paste keyframes"), !changed_edl ? LOAD_AUTOMATION : @@ -1517,7 +1521,7 @@ int MWindow::paste_default_keyframe() edl->tracks->paste_automation(start, &file, 1, 0, edl->session->typeless_keyframes); // edl->tracks->paste_default_keyframe(&file); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); undo_after(_("paste default keyframe"), !changed_edl ? LOAD_AUTOMATION : LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); @@ -1837,7 +1841,8 @@ void MWindow::paste_silence() edl->session->autos_follow_edits); edl->optimize(); save_backup(); - undo_after(_("silence"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("silence"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_plugin_guis(); restart_brender(); @@ -2208,7 +2213,8 @@ void MWindow::splice(EDL *source, int all) edl->local_session->set_selectionend(start + source_end - source_start); save_backup(); - undo_after(_("splice"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("splice"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_plugin_guis(); restart_brender(); gui->update(1, NORMAL_DRAW, 1, 1, 0, 1, 0); @@ -2339,7 +2345,8 @@ void MWindow::trim_selection() edl->session->autos_follow_edits); save_backup(); - undo_after(_("trim selection"), LOAD_EDITS | LOAD_TIMEBAR); + undo_after(_("trim selection"), + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_plugin_guis(); gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); @@ -2567,9 +2574,13 @@ void MWindow::cut_commercials() #endif } -int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl) +int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl, int edit_speed) { - int result = 0; + int edit_plugins = edl->session->plugins_follow_edits; + int edit_autos = edl->session->autos_follow_edits; + int edit_labels = edl->session->labels_follow_edits; + if( !edit_autos ) edit_speed = 0; + int result = 0, first_track = 1; Track *old_track = old_edl->tracks->first; Track *new_track = new_edl->tracks->first; for( ; old_track && new_track; old_track=old_track->next, new_track=new_track->next ) { @@ -2583,19 +2594,121 @@ int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl) old_speed = (FloatAuto *)old_speed->next; new_speed = (FloatAuto *)new_speed->next; } + if( edit_speed ) { + Autos *old_autos = old_track->automation->autos[AUTOMATION_SPEED]; + Autos *new_autos = new_track->automation->autos[AUTOMATION_SPEED]; + Auto *old_auto = old_autos ? old_autos->first : 0; + Auto *new_auto = new_autos ? new_autos->first : 0; + while( old_auto && new_auto ) { + int64_t auto_pos = old_auto->position; + if( old_speed || new_speed ) { + double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD); + auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); + result = 1; + } + new_auto->position = auto_pos; + old_auto = old_auto->next; + new_auto = new_auto->next; + } + } Edit *old_edit = old_track->edits->first; Edit *new_edit = new_track->edits->first; - for( ; old_edit && new_edit; old_edit=old_edit->next, new_edit=new_edit->next ) { - int64_t edit_start = old_edit->startproject, edit_end = edit_start + old_edit->length; + while( old_edit && new_edit ) { + int64_t edit_start = old_edit->startproject; + int64_t edit_end = edit_start + old_edit->length; if( old_speed || new_speed ) { double orig_start = old_speeds->automation_integral(0, edit_start, PLAY_FORWARD); double orig_end = old_speeds->automation_integral(0, edit_end, PLAY_FORWARD); - edit_start = new_speeds->speed_position(orig_start); - edit_end = new_speeds->speed_position(orig_end); + edit_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1); + edit_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1); result = 1; } new_edit->startproject = edit_start; new_edit->length = edit_end - edit_start; + old_edit = old_edit->next; + new_edit = new_edit->next; + } + if( first_track && old_track->is_armed() ) { + if( edit_labels ) { + Labels *old_labels = old_edl->labels; + Labels *new_labels = new_edl->labels; + Label *old_label = old_labels ? old_labels->first : 0; + Label *new_label = new_labels ? new_labels->first : 0; + while( old_label && new_label ) { + int64_t label_pos = old_track->to_units(old_label->position, 1); + if( old_speed || new_speed ) { + double orig_pos = old_speeds->automation_integral(0, label_pos, PLAY_FORWARD); + label_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); + result = 1; + } + new_label->position = new_track->from_units(label_pos); + old_label = old_label->next; + new_label = new_label->next; + } + } + first_track = 0; + } + if( edit_plugins ) { + int old_size = old_track->plugin_set.size(); + int new_size = new_track->plugin_set.size(); + int n = bmin(old_size, new_size); + for( int i=0; iplugin_set[i]; + Plugin *old_plugin = (Plugin *)(old_plugin_set ? old_plugin_set->first : 0); + PluginSet *new_plugin_set = new_track->plugin_set[i]; + Plugin *new_plugin = (Plugin *)(new_plugin_set ? new_plugin_set->first : 0); + while( old_plugin && new_plugin ) { + int64_t plugin_start = old_plugin->startproject; + int64_t plugin_end = plugin_start + old_plugin->length; + if( old_speed || new_speed ) { + double orig_start = old_speeds->automation_integral(0, plugin_start, PLAY_FORWARD); + double orig_end = old_speeds->automation_integral(0, plugin_end, PLAY_FORWARD); + plugin_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1); + plugin_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1); + result = 1; + } + new_plugin->startproject = plugin_start; + new_plugin->length = plugin_end - plugin_start; + if( edit_autos ) { + KeyFrames *old_keyframes = old_plugin->keyframes; + Auto *old_auto = old_keyframes ? old_keyframes->first : 0; + KeyFrames *new_keyframes = new_plugin->keyframes; + Auto *new_auto = new_keyframes ? new_keyframes->first : 0; + while( old_auto && new_auto ) { + int64_t auto_pos = old_auto->position; + if( old_speed || new_speed ) { + double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD); + auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); + result = 1; + } + new_auto->position = auto_pos; + old_auto = old_auto->next; + new_auto = new_auto->next; + } + } + old_plugin = (Plugin *)old_plugin->next; + new_plugin = (Plugin *)new_plugin->next; + } + } + } + if( edit_autos ) { // speed must be last + for( int i=0; iautomation->autos[i]; + Autos *new_autos = new_track->automation->autos[i]; + Auto *old_auto = old_autos ? old_autos->first : 0; + Auto *new_auto = new_autos ? new_autos->first : 0; + while( old_auto && new_auto ) { + int64_t auto_pos = old_auto->position; + if( old_speed || new_speed ) { + double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD); + auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); + result = 1; + } + new_auto->position = auto_pos; + old_auto = old_auto->next; + new_auto = new_auto->next; + } + } } } return result; @@ -2610,12 +2723,12 @@ void MWindow::speed_before() speed_edl->copy_all(edl); } -int MWindow::speed_after(int done) +int MWindow::speed_after(int done, int edit_speed) { int result = 0; if( speed_edl ) { if( done >= 0 ) - result = normalize_speed(speed_edl, edl); + result = normalize_speed(speed_edl, edl, edit_speed); if( done != 0 ) { speed_edl->remove_user(); speed_edl = 0; @@ -2810,3 +2923,20 @@ void MWindow::mix_masters() save_backup(); } +void MWindow::create_keyframes(int mask, int mode) +{ + undo_before(); + double start = edl->local_session->get_selectionstart(); + edl->tracks->create_keyframes(start, mask, mode); + double end = edl->local_session->get_selectionend(); + if( end != start ) + edl->tracks->create_keyframes(end, mask, mode); + undo_after(_("create kyfrms"), LOAD_AUTOMATION); + + restart_brender(); + gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0); + gui->activate_timeline(); + cwindow->refresh_frame(CHANGE_EDL); + save_backup(); +} +