alt transport keys, snap editing, grab focus, inv hilight clr, subtitle fix
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mwindow.C
index 6e1ecaa912d094629747dbd28d3c122f03237679..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"
@@ -297,6 +298,9 @@ MWindow::~MWindow()
 #endif
        reset_caches();
        dead_plugins->remove_all_objects();
+// must delete theme before destroying plugindb
+//  theme destructor will be deleted by delete_plugins
+       delete theme;           theme = 0;
        delete_plugins();
        finit_error();
        keyframe_threads->remove_all_objects();
@@ -325,7 +329,6 @@ MWindow::~MWindow()
        delete defaults;        defaults = 0;
        delete assets;          assets = 0;
        delete splash_window;   splash_window = 0;
-//     delete theme;           theme = 0;      // deleted by delete_plugins
        if( !edl->Garbage::remove_user() ) edl = 0;
        delete channeldb_buz;
        delete channeldb_v4l2jpeg;
@@ -733,14 +736,14 @@ void MWindow::add_plugins(ArrayList<PluginServer*> &plugins)
        plugins.remove_all();
 }
 
-void MWindow::init_plugin_tips(ArrayList<PluginServer*> &plugins)
+void MWindow::init_plugin_tips(ArrayList<PluginServer*> &plugins, const char *lang)
 {
        const char *cfg_path = File::get_cindat_path();
        char msg_path[BCTEXTLEN];  int txt = 0;
        FILE *fp = 0;
        if( BC_Resources::language[0] ) {
                snprintf(msg_path, sizeof(msg_path), "%s/info/plugins.%s",
-                       cfg_path, BC_Resources::language);
+                       cfg_path, lang);
                fp = fopen(msg_path, "r");
        }
        if( !fp ) {
@@ -893,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()
@@ -1492,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;
@@ -1815,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;
@@ -1825,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__);
@@ -1869,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)
 {
@@ -1983,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
 
@@ -2007,7 +2059,7 @@ void MWindow::create_objects(int want_gui,
        if(debug) PRINT_TRACE
        init_ladspa_plugins(this, preferences);
        if(debug) PRINT_TRACE
-       init_plugin_tips(*plugindb);
+       init_plugin_tips(*plugindb, cin_lang);
        if(splash_window)
                splash_window->operation->update(_("Initializing GUI"));
        if(debug) PRINT_TRACE
@@ -2564,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);
 
@@ -3310,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;
@@ -3335,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");
 }
 
@@ -3613,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.
@@ -3669,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;