bsd lang segv fix, enable bsd lv2, lv2 gui enable fix, proxy/ffmpeg toggle resize...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mwindowedit.C
index 065c1f9f08d475fe994aec06fb3a1f39de87cd04..e2f552042cf5b6f2a97645de05da41f25765dd9b 100644 (file)
@@ -1065,10 +1065,16 @@ void MWindow::overwrite(EDL *source, int all)
 {
        FileXML file;
 
+       LocalSession *src = source->local_session;
        double src_start = all ? 0 :
-               source->local_session->get_selectionstart();
-       double overwrite_len = all ? source->tracks->total_length() :
-               source->local_session->get_selectionend() - src_start;
+               src->inpoint_valid() ? src->get_inpoint() :
+               src->outpoint_valid() ? 0 :
+                       src->get_selectionstart();
+       double src_end = all ? source->tracks->total_length() :
+               src->outpoint_valid() ? src->get_outpoint() :
+               src->inpoint_valid() ? source->tracks->total_length() :
+                       src->get_selectionend();
+       double overwrite_len = src_end - src_start;
        double dst_start = edl->local_session->get_selectionstart();
        double dst_len = edl->local_session->get_selectionend() - dst_start;
 
@@ -1602,7 +1608,7 @@ void MWindow::paste_silence()
                if( edl->session->frame_rate > 0 )
                        end += 1./edl->session->frame_rate;
        }
-       undo->update_undo_before();
+       undo->update_undo_before(_("silence"), this);
        edl->paste_silence(start, end,
                edl->session->labels_follow_edits,
                edl->session->plugins_follow_edits,
@@ -1655,11 +1661,6 @@ void MWindow::paste_transition()
        PluginServer *server = session->drag_pluginservers->values[0];
 
        undo->update_undo_before();
-       if( server->audio )
-               strcpy(edl->session->default_atransition, server->title);
-       else
-               strcpy(edl->session->default_vtransition, server->title);
-
        edl->tracks->paste_transition(server, session->edit_highlighted);
        save_backup();
        undo->update_undo_after(_("transition"), LOAD_EDITS);
@@ -1676,7 +1677,6 @@ void MWindow::paste_transitions(int track_type, char *title)
        double start = edl->local_session->get_selectionstart();
        double end = edl->local_session->get_selectionend();
        edl->tracks->paste_transitions(start, end, track_type, title);
-
        save_backup();
        undo->update_undo_after(_("attach transitions"), LOAD_EDITS);
 
@@ -1881,6 +1881,7 @@ void MWindow::redo_entry(BC_WindowBase *calling_window_gui)
        update_plugin_guis();
 
        gui->update(1, 2, 1, 1, 1, 1, 1);
+       gui->update_proxy_toggle();
        gui->unlock_window();
        cwindow->update(1, 1, 1, 1, 1);
        cwindow->gui->unlock_window();
@@ -1995,12 +1996,16 @@ void MWindow::unset_inoutpoint(int is_mwindow)
 void MWindow::splice(EDL *source, int all)
 {
        FileXML file;
+       LocalSession *src = source->local_session;
 
        undo->update_undo_before();
        double source_start = all ? 0 :
-               source->local_session->get_selectionstart();
+               src->inpoint_valid() ? src->get_inpoint() :
+               src->outpoint_valid() ? 0 : src->get_selectionstart();
        double source_end = all ? source->tracks->total_length() :
-               source->local_session->get_selectionend();
+               src->outpoint_valid() ? src->get_outpoint() :
+               src->inpoint_valid() ? source->tracks->total_length() :
+                       src->get_selectionend();
        source->copy(source_start, source_end, 1, &file, "", 1);
 //file.dump();
        double start = edl->local_session->get_selectionstart();
@@ -2087,14 +2092,16 @@ void MWindow::save_clip(EDL *new_edl, const char *txt)
 void MWindow::to_clip(EDL *edl, const char *txt, int all)
 {
        FileXML file;
-       double start, end;
+       LocalSession *src = edl->local_session;
 
        gui->lock_window("MWindow::to_clip 1");
-       start = all ? 0 :
-               edl->local_session->get_selectionstart();
-       end = all ? edl->tracks->total_length() :
-               edl->local_session->get_selectionend();
-
+       double start = all ? 0 :
+               src->inpoint_valid() ? src->get_inpoint() :
+               src->outpoint_valid() ? 0 : src->get_selectionstart();
+       double end = all ? edl->tracks->total_length() :
+               src->outpoint_valid() ? src->get_outpoint() :
+               src->inpoint_valid() ? edl->tracks->total_length() :
+                       src->get_selectionend();
        if( EQUIV(end, start) ) {
                start = 0;
                end = edl->tracks->total_length();
@@ -2203,6 +2210,7 @@ void MWindow::undo_entry(BC_WindowBase *calling_window_gui)
        update_plugin_guis();
 
        gui->update(1, 2, 1, 1, 1, 1, 1);
+       gui->update_proxy_toggle();
        gui->unlock_window();
        cwindow->update(1, 1, 1, 1, 1);
        cwindow->gui->unlock_window();
@@ -2319,114 +2327,21 @@ void MWindow::remap_audio(int pattern)
        }
 }
 
-void MWindow::set_proxy(int use_scaler, int new_scale, int auto_scale,
-               ArrayList<Indexable*> *orig_assets,
-               ArrayList<Indexable*> *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; i<proxy_assets->size(); ++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(); i<n; ++i ) {
-               Asset *proxy_asset = edl->assets->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;
-                               }
-                       }
-               }
-               for( int j=0,m=edl->clips.size(); j<m; ++j ) {
-                       EDL *clip = edl->clips[j];
-                       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 ) {
-                                       if( !edit->asset ) continue;
-                                       if( !strcmp(edit->asset->path, orig_assets->get(i)->path) ) {
-                                               edit->asset = proxy_asset;
-                                       }
-                               }
-                       }
-               }
-       }
+void MWindow::rescale_proxy(EDL *clip, int orig_scale, int new_scale)
+{
+       edl->rescale_proxy(orig_scale, new_scale);
 }
 
 void MWindow::add_proxy(int use_scaler,
-               ArrayList<Indexable*> *orig_assets,
-               ArrayList<Indexable*> *proxy_assets)
-{
-       if( use_scaler ) {
-               for( int i=0,n=proxy_assets->size(); i<n; ++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();
-               }
-       }
-
-// change original assets to proxy assets
-       for( int i=0,n=proxy_assets->size(); i<n; ++i ) {
-               Asset *proxy_asset = edl->assets->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;
-                               }
-                       }
-               }
-       }
+       ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
+{
+       edl->add_proxy(use_scaler, orig_assets, proxy_assets);
 }
 
 void MWindow::cut_commercials()
 {
+#ifdef HAVE_COMMERCIAL
        undo->update_undo_before();
        commercials->scan_media();
        edl->optimize();
@@ -2438,6 +2353,7 @@ void MWindow::cut_commercials()
        gui->update(1, 2, 1, 1, 1, 1, 0);
        cwindow->update(1, 0, 0, 0, 1);
        cwindow->refresh_frame(CHANGE_EDL);
+#endif
 }
 
 int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl)
@@ -2486,11 +2402,13 @@ void MWindow::speed_before()
 int MWindow::speed_after(int done)
 {
        int result = 0;
-       if( speed_edl && done >= 0 )
-               result = normalize_speed(speed_edl, edl);
-       if( done ) {
-               speed_edl->remove_user();
-               speed_edl = 0;
+       if( speed_edl ) {
+               if( done >= 0 )
+                       result = normalize_speed(speed_edl, edl);
+               if( done != 0 ) {
+                       speed_edl->remove_user();
+                       speed_edl = 0;
+               }
        }
        return result;
 }