fixes for vicons checkin
[goodguy/history.git] / cinelerra-5.0 / cinelerra / mwindow.C
index 8fffe15fd88eab00d98ce7cfdcb28c59cf4e64d0..cfb2caf07d09213bc5de4adbd4656c3809a11ebd 100644 (file)
 #include "bcdisplayinfo.h"
 #include "bcsignals.h"
 #include "bctimer.h"
+#include "bdcreate.h"
 #include "brender.h"
 #include "cache.h"
 #include "channel.h"
 #include "channeldb.h"
 #include "channelinfo.h"
 #include "clip.h"
-#include "colormodels.h"
+#include "bccmodels.h"
 #include "commercials.h"
 #include "cplayback.h"
 #include "ctimebar.h"
 #include "cwindow.h"
 #include "bchash.h"
 #include "devicedvbinput.inc"
+#include "dvdcreate.h"
 #include "editpanel.h"
 #include "edl.h"
 #include "edlsession.h"
 #include "errorbox.h"
 #include "fileformat.h"
 #include "file.h"
-#include "fileserver.h"
 #include "filesystem.h"
 #include "filexml.h"
 #include "format.inc"
@@ -156,7 +157,6 @@ int atexit(void (*function)(void))
 
 
 ArrayList<PluginServer*>* MWindow::plugindb = 0;
-FileServer* MWindow::file_server = 0;
 Commercials* MWindow::commercials = 0;
 
 
@@ -192,6 +192,7 @@ MWindow::MWindow()
        plugin_guis = 0;
        dead_plugins = 0;
        keyframe_threads = 0;
+       create_bd = 0;
        create_dvd = 0;
        batch_render = 0;
        render = 0;
@@ -222,6 +223,7 @@ MWindow::~MWindow()
        brender_lock->lock("MWindow::quit");
        delete brender;         brender = 0;
        brender_lock->unlock();
+       delete create_bd;       create_bd = 0;
        delete create_dvd;      create_dvd = 0;
        delete batch_render;    batch_render = 0;
        commit_commercial();
@@ -388,23 +390,30 @@ int MWindow::load_plugin_index(MWindow *mwindow, char *path)
            index_version != PLUGIN_FILE_VERSION ) ret = 1;
 
        while( !ret && !feof(fp)) {
-               char *sp = index_line, *plugin_path = 0, *plugin_title = 0;
-               if( fgets(sp, BCTEXTLEN, fp) ) {
-                       plugin_path = PluginServer::table_quoted_field(sp);
-                       if( plugin_exists(plugin_path) ) continue;
-                       plugin_title = PluginServer::table_quoted_field(sp);
+               if( !fgets(index_line, BCTEXTLEN, fp) ) break;
+               if( index_line[0] == ';' ) continue;
+               if( index_line[0] == '#' ) continue;
+               int type = PLUGIN_TYPE_UNKNOWN;
+               char path[BCTEXTLEN], title[BCTEXTLEN];
+               if( PluginServer::scan_table(index_line, type, path, title) ) continue;
+               PluginServer *server = 0;
+               switch( type ) {
+               case PLUGIN_TYPE_BUILTIN:
+               case PLUGIN_TYPE_LADSPA:
+                       server = new PluginServer(mwindow, path, type);
+                       break;
+               case PLUGIN_TYPE_FFMPEG: // skip "ff_..."
+                       server = new_ffmpeg_server(mwindow, path+3);
+                       break;
                }
-               if( plugin_path && plugin_title ) {
+               if( !server ) continue;
 // Create plugin server from index entry
-                       PluginServer *new_plugin = new PluginServer(path, mwindow);
-                       new_plugin->set_path(plugin_path);
-                       new_plugin->set_title(plugin_title);
-                       if( new_plugin->read_table(sp) ) {
-                               delete new_plugin;
-                               ret = 1;  break;
-                       }
-                       plugindb->append(new_plugin);
+               server->set_title(title);
+               if( server->read_table(index_line) ) {
+                       delete server;
+                       ret = 1;  break;
                }
+               plugindb->append(server);
        }
 
        fclose(fp);
@@ -423,7 +432,7 @@ void MWindow::init_plugin_index(MWindow *mwindow, Preferences *preferences, FILE
        fs.set_filter( "[*.plugin][*.so]" );
        int result = fs.update(plugin_path);
        if( result || !fs.dir_list.total ) return;
-       int vis_id = ++idx;
+       int vis_id = idx++;
 
        for( int i=0; i<fs.dir_list.total; ++i ) {
                char *fs_path = fs.dir_list.values[i]->path;
@@ -437,30 +446,31 @@ void MWindow::init_plugin_index(MWindow *mwindow, Preferences *preferences, FILE
                        continue;
                }
                if( plugin_exists(plugin_path) ) continue;
-               PluginServer *new_plugin = new PluginServer(plugin_path, mwindow);
-               result = new_plugin->open_plugin(1, preferences, 0, 0);
+               PluginServer *server = new PluginServer(mwindow, plugin_path, PLUGIN_TYPE_UNKNOWN);
+               result = server->open_plugin(1, preferences, 0, 0);
                if( !result ) {
-                       new_plugin->write_table(fp,vis_id);
-                       new_plugin->close_plugin();
-                       new_plugin->delete_this();
+                       server->write_table(fp,vis_id);
+                       server->close_plugin();
+                       server->delete_this();
                        continue;
                }
                if( result != PLUGINSERVER_IS_LAD ) continue;
                int lad_index = 0;
                for(;;) {
-                       PluginServer *new_plugin = new PluginServer(plugin_path, mwindow);
-                       new_plugin->set_lad_index(lad_index++);
-                       result = new_plugin->open_plugin(1, preferences, 0, 0);
+                       PluginServer *server = new PluginServer(mwindow, plugin_path, PLUGIN_TYPE_LADSPA);
+                       server->set_lad_index(lad_index++);
+                       result = server->open_plugin(1, preferences, 0, 0);
                        if( result ) break;
-                       new_plugin->write_table(fp,vis_id);
-                       new_plugin->close_plugin();
-                       new_plugin->delete_this();
+                       server->write_table(fp, PLUGIN_LADSPA_ID);
+                       server->close_plugin();
+                       server->delete_this();
                }
        }
 }
 
 int MWindow::init_plugins(MWindow *mwindow, Preferences *preferences)
 {
+       init_ffmpeg();
        if( !plugindb ) plugindb = new ArrayList<PluginServer*>;
        char index_path[BCTEXTLEN];
        sprintf(index_path, "%s/%s", preferences->plugin_dir, PLUGIN_FILE);
@@ -473,8 +483,9 @@ int MWindow::init_plugins(MWindow *mwindow, Preferences *preferences)
        }
        fprintf(fp, "%d\n", PLUGIN_FILE_VERSION);
        char *plug_path = FileSystem::basepath(preferences->plugin_dir);
-       int dir_id = 0;
+       int dir_id = PLUGIN_IDS;
        init_plugin_index(mwindow, preferences, fp, plug_path, ".", dir_id);
+       init_ffmpeg_index(mwindow, preferences, fp);
        fclose(fp);
        delete [] plug_path;
        return load_plugin_index(mwindow, index_path);
@@ -641,6 +652,8 @@ void MWindow::clean_indexes()
 //printf("MWindow::clean_indexes 2 %s\n", string2);
                                sprintf(ptr, ".toc");
                                remove(string2);
+                               sprintf(ptr, ".mkr");
+                               remove(string2);
                        }
                }
 
@@ -800,25 +813,25 @@ void MWindow::init_channeldb()
 void MWindow::init_menus()
 {
        char string[BCTEXTLEN];
-       cmodel_to_text(string, BC_RGB888);
+       BC_CModels::to_text(string, BC_RGB888);
        colormodels.append(new ColormodelItem(string, BC_RGB888));
-       cmodel_to_text(string, BC_RGBA8888);
+       BC_CModels::to_text(string, BC_RGBA8888);
        colormodels.append(new ColormodelItem(string, BC_RGBA8888));
-//     cmodel_to_text(string, BC_RGB161616);
+//     BC_CModels::to_text(string, BC_RGB161616);
 //     colormodels.append(new ColormodelItem(string, BC_RGB161616));
-//     cmodel_to_text(string, BC_RGBA16161616);
+//     BC_CModels::to_text(string, BC_RGBA16161616);
 //     colormodels.append(new ColormodelItem(string, BC_RGBA16161616));
-       cmodel_to_text(string, BC_RGB_FLOAT);
+       BC_CModels::to_text(string, BC_RGB_FLOAT);
        colormodels.append(new ColormodelItem(string, BC_RGB_FLOAT));
-       cmodel_to_text(string, BC_RGBA_FLOAT);
+       BC_CModels::to_text(string, BC_RGBA_FLOAT);
        colormodels.append(new ColormodelItem(string, BC_RGBA_FLOAT));
-       cmodel_to_text(string, BC_YUV888);
+       BC_CModels::to_text(string, BC_YUV888);
        colormodels.append(new ColormodelItem(string, BC_YUV888));
-       cmodel_to_text(string, BC_YUVA8888);
+       BC_CModels::to_text(string, BC_YUVA8888);
        colormodels.append(new ColormodelItem(string, BC_YUVA8888));
-//     cmodel_to_text(string, BC_YUV161616);
+//     BC_CModels::to_text(string, BC_YUV161616);
 //     colormodels.append(new ColormodelItem(string, BC_YUV161616));
-//     cmodel_to_text(string, BC_YUVA16161616);
+//     BC_CModels::to_text(string, BC_YUVA16161616);
 //     colormodels.append(new ColormodelItem(string, BC_YUVA16161616));
 }
 
@@ -847,6 +860,7 @@ ENABLE_BUFFER
 void MWindow::init_render()
 {
        render = new Render(this);
+       create_bd = new CreateBD_Thread(this);
        create_dvd = new CreateDVD_Thread(this);
        batch_render = new BatchRenderThread(this);
 }
@@ -1022,17 +1036,11 @@ void MWindow::stop_playback(int wait)
                0);
        cwindow->playback_engine->interrupt_playback(wait);
 
-       for(int i = 0; i < vwindows.size(); i++)
-       {
+       for(int i = 0; i < vwindows.size(); i++) {
                VWindow *vwindow = vwindows.get(i);
-               if(vwindow->running())
-               {
-                       vwindow->playback_engine->que->send_command(STOP,
-                               CHANGE_NONE, 
-                               0,
-                               0);
-                       vwindow->playback_engine->interrupt_playback(wait);
-               }
+               if( !vwindow->is_running() ) continue;
+               vwindow->playback_engine->que->send_command(STOP, CHANGE_NONE, 0, 0);
+               vwindow->playback_engine->interrupt_playback(wait);
        }
         if( locked ) gui->lock_window("MWindow::stop_playback");
 }
@@ -1597,16 +1605,6 @@ void MWindow::init_shm()
 }
 
 
-void MWindow::init_fileserver(Preferences *preferences)
-{
-#ifdef USE_FILEFORK
-       if( !file_server && preferences->file_forking ) {
-               file_server = new FileServer(preferences);
-               file_server->start();
-       }
-#endif
-}
-
 void MWindow::create_objects(int want_gui, 
        int want_new,
        char *config_path)
@@ -1643,7 +1641,6 @@ void MWindow::create_objects(int want_gui,
 
 // Initialize before too much else is running
 // Preferences & theme are required for building MPEG table of contents
-       init_fileserver(preferences);
 
 // Default project created here
        init_edl();
@@ -1702,11 +1699,10 @@ void MWindow::create_objects(int want_gui,
                session->show_vwindow);
 
 // Show all vwindows
-//     if(session->show_vwindow)
-//     {
-//             for(int j = 0; j < vwindows.size(); j++)
-//             {
+//     if(session->show_vwindow) {
+//             for(int j = 0; j < vwindows.size(); j++) {
 //                     VWindow *vwindow = vwindows.get(j);
+//                     if( !vwindow->is_running() ) continue;
 //                     if(debug) printf("MWindow::create_objects %d vwindow=%p\n", 
 //                             __LINE__, 
 //                             vwindow);
@@ -1837,20 +1833,16 @@ void MWindow::show_vwindow()
        int total_running = 0;
        session->show_vwindow = 1;
 
-
 // Raise all windows which are visible
-       for(int j = 0; j < vwindows.size(); j++)
-       {
+       for(int j = 0; j < vwindows.size(); j++) {
                VWindow *vwindow = vwindows.get(j);
-               if(vwindow->is_running())
-               {
-                       vwindow->gui->lock_window("MWindow::show_vwindow");
-                       vwindow->gui->show_window(0);
-                       vwindow->gui->raise_window();
-                       vwindow->gui->flush();
-                       vwindow->gui->unlock_window();
-                       total_running++;
-               }
+               if( !vwindow->is_running() ) continue;
+               vwindow->gui->lock_window("MWindow::show_vwindow");
+               vwindow->gui->show_window(0);
+               vwindow->gui->raise_window();
+               vwindow->gui->flush();
+               vwindow->gui->unlock_window();
+               total_running++;
        }
 
 //printf("MWindow::show_vwindow %d %d\n", __LINE__, vwindows.size());
@@ -1990,6 +1982,7 @@ int MWindow::set_editing_mode(int new_editing_mode, int lock_mwindow, int lock_c
 
 void MWindow::sync_parameters(int change_type)
 {
+       if( in_destructor ) return;
 
 // Sync engines which are playing back
        if(cwindow->playback_engine->is_playing_back)
@@ -2537,30 +2530,28 @@ void MWindow::update_project(int load_mode)
 
 // Close all the vwindows
        if(load_mode == LOADMODE_REPLACE ||
-               load_mode == LOADMODE_REPLACE_CONCATENATE)
-       {
+               load_mode == LOADMODE_REPLACE_CONCATENATE) {
                if(debug) PRINT_TRACE
                int first_vwindow = 0;
                if(session->show_vwindow) first_vwindow = 1;
 // Change visible windows to no source
-               for(int i = 0; i < first_vwindow && i < vwindows.size(); i++)
-               {
-                       vwindows.get(i)->change_source(-1);
+               for(int i = 0; i < first_vwindow && i < vwindows.size(); i++) {
+                       VWindow *vwindow = vwindows.get(i);
+                       if( !vwindow->is_running() ) continue;
+                       vwindow->change_source(-1);
                }
 
 // Close remaining windows
-               for(int i = first_vwindow; i < vwindows.size(); i++)
-               {
-                       vwindows.get(i)->close_window();
+               for(int i = first_vwindow; i < vwindows.size(); i++) {
+                       VWindow *vwindow = vwindows.get(i);
+                       if( !vwindow->is_running() ) continue;
+                       vwindow->close_window();
                }
                if(debug) PRINT_TRACE
        }
-       else
-       if(vwindows.size())
-       {
+       else if(vwindows.size()) {
                VWindow *vwindow = vwindows.get(DEFAULT_VWINDOW);
-               if(vwindow->is_running())
-               {
+               if( vwindow->is_running() ) {
                        vwindow->gui->lock_window("MWindow::update_project");
                        vwindow->update(1);
                        vwindow->gui->unlock_window();
@@ -2599,6 +2590,7 @@ void MWindow::remove_indexfile(Indexable *indexable)
 // Erase file
        IndexFile::delete_index(preferences, asset, ".toc");
        IndexFile::delete_index(preferences, asset, ".idx");
+       IndexFile::delete_index(preferences, asset, ".mkr");
 }
 
 void MWindow::rebuild_indices()
@@ -2721,16 +2713,13 @@ void MWindow::reset_caches()
        if( cwindow->playback_engine && cwindow->playback_engine->video_cache )
                cwindow->playback_engine->video_cache->remove_all();
        
-       for(int i = 0; i < vwindows.size(); i++)
-       {
+       for(int i = 0; i < vwindows.size(); i++) {
                VWindow *vwindow = vwindows.get(i);
-               if(vwindow->is_running())
-               {
-                       if(vwindow->playback_engine && vwindow->playback_engine->audio_cache)
-                               vwindow->playback_engine->audio_cache->remove_all();
-                       if(vwindow->playback_engine && vwindow->playback_engine->video_cache)
-                               vwindow->playback_engine->video_cache->remove_all();
-               }
+               if( !vwindow->is_running() ) continue;
+               if(vwindow->playback_engine && vwindow->playback_engine->audio_cache)
+                       vwindow->playback_engine->audio_cache->remove_all();
+               if(vwindow->playback_engine && vwindow->playback_engine->video_cache)
+                       vwindow->playback_engine->video_cache->remove_all();
        }
 }
 
@@ -2744,16 +2733,13 @@ void MWindow::remove_asset_from_caches(Asset *asset)
                cwindow->playback_engine->audio_cache->delete_entry(asset);
        if( cwindow->playback_engine && cwindow->playback_engine->video_cache )
                cwindow->playback_engine->video_cache->delete_entry(asset);
-       for(int i = 0; i < vwindows.size(); i++)
-       {
+       for(int i = 0; i < vwindows.size(); i++) {
                VWindow *vwindow = vwindows.get(i);
-               if(vwindow->is_running())
-               {
-                       if(vwindow->playback_engine && vwindow->playback_engine->audio_cache)
-                               vwindow->playback_engine->audio_cache->delete_entry(asset);
-                       if(vwindow->playback_engine && vwindow->playback_engine->video_cache)
-                               vwindow->playback_engine->video_cache->delete_entry(asset);
-               }
+               if( !vwindow->is_running() ) continue;
+               if(vwindow->playback_engine && vwindow->playback_engine->audio_cache)
+                       vwindow->playback_engine->audio_cache->delete_entry(asset);
+               if(vwindow->playback_engine && vwindow->playback_engine->video_cache)
+                       vwindow->playback_engine->video_cache->delete_entry(asset);
        }
 }
 
@@ -2761,49 +2747,37 @@ void MWindow::remove_asset_from_caches(Asset *asset)
 
 void MWindow::remove_assets_from_project(int push_undo)
 {
-       for(int i = 0; i < session->drag_assets->total; i++)
-       {
+       for(int i = 0; i < session->drag_assets->total; i++) {
                Indexable *indexable = session->drag_assets->values[i];
                if(indexable->is_asset) remove_asset_from_caches((Asset*)indexable);
        }
 
 // Remove from VWindow.
-       for(int i = 0; i < session->drag_clips->total; i++)
-       {
-               for(int j = 0; j < vwindows.size(); j++)
-               {
+       for(int i = 0; i < session->drag_clips->total; i++) {
+               for(int j = 0; j < vwindows.size(); j++) {
                        VWindow *vwindow = vwindows.get(j);
-                       if(vwindow->is_running())
-                       {
-                               if(session->drag_clips->values[i] == vwindow->get_edl())
-                               {
-                                       vwindow->gui->lock_window("MWindow::remove_assets_from_project 1");
-                                       vwindow->delete_source(1, 1);
-                                       vwindow->gui->unlock_window();
-                               }
+                       if( !vwindow->is_running() ) continue;
+                       if(session->drag_clips->values[i] == vwindow->get_edl()) {
+                               vwindow->gui->lock_window("MWindow::remove_assets_from_project 1");
+                               vwindow->delete_source(1, 1);
+                               vwindow->gui->unlock_window();
                        }
                }
        }
        
-       for(int i = 0; i < session->drag_assets->size(); i++)
-       {
-               for(int j = 0; j < vwindows.size(); j++)
-               {
+       for(int i = 0; i < session->drag_assets->size(); i++) {
+               for(int j = 0; j < vwindows.size(); j++) {
                        VWindow *vwindow = vwindows.get(j);
-                       if(vwindow->is_running())
-                       {
-                               if(session->drag_assets->get(i) == vwindow->get_source())
-                               {
-                                       vwindow->gui->lock_window("MWindow::remove_assets_from_project 2");
-                                       vwindow->delete_source(1, 1);
-                                       vwindow->gui->unlock_window();
-                               }
+                       if( !vwindow->is_running() ) continue;
+                       if(session->drag_assets->get(i) == vwindow->get_source()) {
+                               vwindow->gui->lock_window("MWindow::remove_assets_from_project 2");
+                               vwindow->delete_source(1, 1);
+                               vwindow->gui->unlock_window();
                        }
                }
        }
        
-       for(int i = 0; i < session->drag_assets->size(); i++)
-       {
+       for(int i = 0; i < session->drag_assets->size(); i++) {
                Indexable *indexable = session->drag_assets->values[i];
                remove_indexfile(indexable);
        }
@@ -2851,8 +2825,9 @@ void MWindow::dump_plugins(FILE *fp)
        if( !plugindb ) return;
        for(int i = 0; i < plugindb->total; i++)
        {
-               fprintf(fp, "audio=%d video=%d rt=%d multi=%d"
+               fprintf(fp, "type=%d audio=%d video=%d rt=%d multi=%d"
                        " synth=%d transition=%d theme=%d %s\n",
+                       plugindb->values[i]->plugin_type,
                        plugindb->values[i]->audio,
                        plugindb->values[i]->video,
                        plugindb->values[i]->realtime,
@@ -2930,6 +2905,7 @@ int MWindow::save_defaults()
 // Pointer comparison
                plugin_guis->values[i]->save_defaults();
        }
+       awindow->save_defaults(defaults);
 
        defaults->save();
        return 0;
@@ -3096,15 +3072,12 @@ int MWindow::reset_meters()
        cwindow->gui->meters->reset_meters();
        cwindow->gui->unlock_window();
 
-       for(int j = 0; j < vwindows.size(); j++)
-       {
+       for(int j = 0; j < vwindows.size(); j++) {
                VWindow *vwindow = vwindows.get(j);
-               if(vwindow->is_running())
-               {
-                       vwindow->gui->lock_window("MWindow::reset_meters 2");
-                       vwindow->gui->meters->reset_meters();
-                       vwindow->gui->unlock_window();
-               }
+               if( !vwindow->is_running() ) continue;
+               vwindow->gui->lock_window("MWindow::reset_meters 2");
+               vwindow->gui->meters->reset_meters();
+               vwindow->gui->unlock_window();
        }
 
        lwindow->gui->lock_window("MWindow::reset_meters 3");
@@ -3134,9 +3107,9 @@ void MWindow::resync_guis()
        cwindow->gui->flush();
        cwindow->gui->unlock_window();
 
-       for(int i = 0; i < vwindows.size(); i++)
-       {
+       for(int i = 0; i < vwindows.size(); i++) {
                VWindow *vwindow = vwindows.get(i);
+               if( !vwindow->is_running() ) continue;
                vwindow->gui->lock_window("MWindow::resync_guis");
                vwindow->gui->resize_event(vwindow->gui->get_w(), 
                        vwindow->gui->get_h());