X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.0%2Fcinelerra%2Fmwindow.C;h=cfb2caf07d09213bc5de4adbd4656c3809a11ebd;hb=6c0c8bd0e577001d1cc18c6c27d58e62f58a6bff;hp=8fffe15fd88eab00d98ce7cfdcb28c59cf4e64d0;hpb=94e8dc2b306135e7735b2618a54f0f7de7ac7a0c;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.0/cinelerra/mwindow.C b/cinelerra-5.0/cinelerra/mwindow.C index 8fffe15f..cfb2caf0 100644 --- a/cinelerra-5.0/cinelerra/mwindow.C +++ b/cinelerra-5.0/cinelerra/mwindow.C @@ -27,13 +27,14 @@ #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" @@ -41,13 +42,13 @@ #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* 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; ipath; @@ -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; 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());