alt transport keys, snap editing, grab focus, inv hilight clr, subtitle fix
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mwindow.C
index 2c0ddff46de8ebc2c648ea7296982172cc6268aa..1aa06bacab9eecb97a2f23c6a231638ff57c69da 100644 (file)
@@ -89,6 +89,7 @@
 #include "pluginserver.h"
 #include "pluginset.h"
 #include "preferences.h"
+#include "proxy.h"
 #include "record.h"
 #include "recordmonitor.h"
 #include "recordlabel.h"
@@ -895,6 +896,7 @@ void MWindow::init_preferences()
        }
        BC_WindowBase::get_resources()->popupmenu_btnup = preferences->popupmenu_btnup;
        BC_WindowBase::get_resources()->textbox_focus_policy = preferences->textbox_focus_policy;
+       BC_WindowBase::get_resources()->grab_input_focus = preferences->grab_input_focus;
 }
 
 void MWindow::clean_indexes()
@@ -1494,14 +1496,10 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
 
                                if(load_mode != LOADMODE_RESOURCESONLY)
                                {
-SET_TRACE
                                        RecordLabels *labels = edl->session->label_cells ?
                                                new RecordLabels(new_file) : 0;
-SET_TRACE
                                        asset_to_edl(new_edl, new_asset, labels);
-SET_TRACE
                                        new_edls.append(new_edl);
-SET_TRACE
                                        new_asset->Garbage::remove_user();
                                        delete labels;
                                        new_asset = 0;
@@ -1817,6 +1815,9 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
            ( load_mode == LOADMODE_REPLACE ||
              load_mode == LOADMODE_REPLACE_CONCATENATE ) ) {
                select_asset(0, 0);
+               edl->session->proxy_scale = 1;
+               edl->session->proxy_use_scaler = 0;
+               edl->session->proxy_auto_scale = 0;
                edl->local_session->preview_start = 0;
                edl->local_session->preview_end = edl->tracks->total_playable_length();
                edl->local_session->loop_playback = 0;
@@ -1827,6 +1828,29 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
                goto_start();
        }
 
+       if( ( edl->session->proxy_auto_scale && edl->session->proxy_scale != 1 ) &&
+           ( load_mode != LOADMODE_REPLACE && load_mode != LOADMODE_REPLACE_CONCATENATE ) ) {
+               ArrayList<Indexable *> orig_idxbls;
+               for( int i=0; i<new_assets.size(); ++i )
+                       orig_idxbls.append(new_assets.get(i));
+               for( int i=0; i<new_edls.size(); ++i ) {
+                       EDL *new_edl = new_edls[i];
+                       for( Track *track=new_edl->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 ) continue;
+                                       if( !idxbl->have_video() ) continue;
+                                       if( edit->channel != 0 ) continue; // first layer only
+                                       orig_idxbls.append(edit->asset);
+                               }
+                       }
+               }
+               gui->unlock_window(); // to update progress bar
+               render_proxy(orig_idxbls);
+               gui->lock_window("MWindow::load_filenames");
+       }
+
 // need to update undo before project, since mwindow is unlocked & a new load
 // can begin here.  Should really prevent loading until we're done.
 if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
@@ -1871,8 +1895,35 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
        return 0;
 }
 
+void MWindow::render_proxy(ArrayList<Indexable *> &new_idxbls)
+{
+       Asset *format_asset = new Asset;
+       format_asset->format = FILE_FFMPEG;
+       format_asset->load_defaults(defaults, "PROXY_", 1, 1, 0, 0, 0);
+       ProxyRender proxy_render(this, format_asset);
+       int new_scale = edl->session->proxy_scale;
+       int use_scaler = edl->session->proxy_use_scaler;
 
+       for( int i=0; i<new_idxbls.size(); ++i ) {
+               Indexable *orig = new_idxbls.get(i);
+               Asset *proxy = proxy_render.add_original(orig, new_scale);
+               if( !proxy ) continue;
+               FileSystem fs;
+               int exists = fs.get_size(proxy->path) > 0 ? 1 : 0;
+               int got_it = exists && // if proxy exists, and is newer than orig
+                   fs.get_date(proxy->path) > fs.get_date(orig->path) ? 1 : 0;
+               if( got_it ) continue;
+               proxy_render.add_needed(orig, proxy);
+       }
 
+// render needed proxies
+       int result = proxy_render.create_needed_proxies(new_scale);
+       if( !result ) {
+               add_proxy(use_scaler,
+                       &proxy_render.orig_idxbls, &proxy_render.orig_proxies);
+       }
+       format_asset->remove_user();
+}
 
 void MWindow::test_plugins(EDL *new_edl, char *path)
 {
@@ -1985,7 +2036,6 @@ void MWindow::create_objects(int want_gui,
        int want_new,
        char *config_path)
 {
-       FileSystem fs;
        const int debug = 0;
        if(debug) PRINT_TRACE
 
@@ -2566,12 +2616,11 @@ SET_TRACE
 SET_TRACE
 
 //printf("MWindow::show_plugin 1\n");
-       if(!done)
-       {
-               if(!plugin->track)
-               {
-                       printf("MWindow::show_plugin track not defined.\n");
-               }
+       if( !done && !plugin->track ) {
+               printf("MWindow::show_plugin track not defined.\n");
+               done = 1;
+       }
+       if( !done ) {
                PluginServer *server = scan_plugindb(plugin->title,
                        plugin->track->data_type);
 
@@ -3312,7 +3361,8 @@ void MWindow::dump_exe(FILE *fp)
        char mtime[256];
        strftime(mtime, sizeof(mtime), "%F %T", tm);
        fprintf(fp,"mtime: %s\n", mtime);
-
+#if 0
+// people hit ctl-c waiting for this
        int fd = open(proc_path,O_RDONLY+O_NONBLOCK);
        if( fd < 0 ) { fprintf(fp,"open: %m\n"); return; }
        uint8_t *bfr = 0;
@@ -3337,6 +3387,7 @@ void MWindow::dump_exe(FILE *fp)
        for( int i=0; i<20; ++i ) fprintf(fp, "%02x", digest[i]);
        if( ret < 0 ) fprintf(fp, " (ret %d)", ret);
        if( pos < st.st_size ) fprintf(fp, " (pos %jd)", pos);
+#endif
        fprintf(fp, "\n");
 }
 
@@ -3615,7 +3666,8 @@ int MWindow::select_asset(Asset *asset, int vstream, int astream, int delete_tra
        int result = file->open_file(preferences, asset, 1, 0);
        if( !result && delete_tracks > 0 )
                undo->update_undo_before();
-       if( !result && asset->video_data && asset->get_video_layers() > 0 ) {
+       int video_layers = asset->get_video_layers();
+       if( !result && asset->video_data && vstream < video_layers ) {
                // try to get asset up to date, may fail
                file->select_video_stream(asset, vstream);
                // either way use what was/is there.
@@ -3671,7 +3723,7 @@ int MWindow::select_asset(Asset *asset, int vstream, int astream, int delete_tra
        if( !result && asset->audio_data && asset->channels > 0 ) {
                session->sample_rate = asset->get_sample_rate();
                int64_t channel_mask = 0;
-               int astrm = !asset->video_data ? -1 :
+               int astrm = !asset->video_data || vstream >= video_layers ? -1 :
                        file->get_audio_for_video(vstream, astream, channel_mask);
                if( astrm >= 0 ) file->select_audio_stream(asset, astrm);
                if( astrm < 0 || !channel_mask ) channel_mask = (1<<asset->channels)-1;