X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindow.C;h=03e265e6b75525023afea2276c49852e1ce2c89d;hp=09e363cdca62e3fa1ce94625607311dfa96de792;hb=b78b166faf60a1c7357f990b1e2fb0e70be29fee;hpb=39c01b7242f15858ebd8847e8895ac880e464ff2 diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index 09e363cd..03e265e6 100644 --- a/cinelerra-5.1/cinelerra/mwindow.C +++ b/cinelerra-5.1/cinelerra/mwindow.C @@ -27,6 +27,7 @@ #include "awindowgui.h" #include "awindow.h" #include "batchrender.h" +#include "bccmodels.h" #include "bcdisplayinfo.h" #include "bcprogressbox.h" #include "bcsignals.h" @@ -40,9 +41,9 @@ #include "channelinfo.h" #include "clip.h" #include "clipedls.h" -#include "bccmodels.h" #include "commercials.h" #include "confirmsave.h" +#include "convert.h" #include "cplayback.h" #include "ctimebar.h" #include "cwindowgui.h" @@ -225,6 +226,7 @@ MWindow::MWindow() create_bd = 0; create_dvd = 0; batch_render = 0; + convert_render = 0; render = 0; edl = 0; gui = 0; @@ -265,6 +267,7 @@ MWindow::~MWindow() delete create_dvd; create_dvd = 0; delete shuttle; shuttle = 0; delete batch_render; batch_render = 0; + delete convert_render; convert_render = 0; delete render; render = 0; delete mixers_align; mixers_align = 0; commit_commercial(); @@ -361,7 +364,6 @@ MWindow::~MWindow() colormodels.remove_all_objects(); interlace_project_modes.remove_all_objects(); interlace_asset_modes.remove_all_objects(); - interlace_asset_fixmethods.remove_all_objects(); sighandler->terminate(); delete sighandler; delete run_lock; @@ -1182,8 +1184,12 @@ ZWindow *MWindow::get_mixer(Mixer *&mixer) zwindows_lock->lock("MWindow::get_mixer"); if( !mixer ) mixer = edl->mixers.new_mixer(); ZWindow *zwindow = 0; - for( int i=0; !zwindow && iidx < 0 ) zwindow = zwindows[i]; + for( int i=0; !zwindow && irunning() ) continue; + if( zwdw->idx >= 0 ) continue; + zwindow = zwindows[i]; + } if( !zwindow ) zwindows.append(zwindow = new ZWindow(this)); zwindow->idx = mixer->idx; @@ -1313,6 +1319,7 @@ void MWindow::close_mixers(int destroy) for( int i=zwindows.size(); --i>=0; ) { ZWindow *zwindow = zwindows[i]; if( zwindow->idx < 0 ) continue; + zwindow->idx = -1; zwindow->destroy = destroy; ZWindowGUI *zgui = zwindow->zgui; zgui->lock_window("MWindow::select_zwindow 0"); @@ -1332,7 +1339,7 @@ ZWindow *MWindow::create_mixer(Indexable *indexable, double position) ArrayList new_assets; new_assets.append(indexable); Track *track = edl->tracks->last; - load_assets(&new_assets, position, LOADMODE_NEW_TRACKS, 0, 0, 0, 0, 0, 0); + load_assets(&new_assets, position, LOADMODE_NEW_TRACKS, 0, 0, 0, 0, 0, 1); track = !track ? edl->tracks->first : track->next; Mixer *mixer = 0; ZWindow *zwindow = get_mixer(mixer); @@ -1449,7 +1456,7 @@ void MWindow::tile_mixers() int bw = lt + BC_DisplayInfo::get_right_border(); // borders int bh = top + BC_DisplayInfo::get_bottom_border(); int zx = 0, zy = 0; // window origins - int mw = 10+10, mh = 10+10; // canvas margins + int mw = xS(10+10), mh = yS(10+10); // canvas margins int rsz = 0, n = 0, dz = 0; int ow = edl->session->output_w, oh = edl->session->output_h; for( int i=0; i mx ) xx = mx; if( yy > my ) yy = my; - xx += lt + dz; yy += top + dz; + xx += lt + xS(dz); yy += top + yS(dz); zwindow->reposition(xx,yy, ww,hh); if( zwindow->running() ) { ZWindowGUI *gui = (ZWindowGUI *)zwindow->get_gui(); @@ -1526,9 +1533,6 @@ void MWindow::init_menus() #define ILACEASSETMODELISTADD(x) ilacemode_to_text(string, x); \ interlace_asset_modes.append(new InterlacemodeItem(string, x)); -#define ILACEFIXMETHODLISTADD(x) ilacefixmethod_to_text(string, x); \ - interlace_asset_fixmethods.append(new InterlacefixmethodItem(string, x)); - // Interlacing Modes ILACEASSETMODELISTADD(ILACE_MODE_UNDETECTED); // Not included in the list for the project options. @@ -1541,11 +1545,6 @@ void MWindow::init_menus() ILACEASSETMODELISTADD(ILACE_MODE_NOTINTERLACED); ILACEPROJECTMODELISTADD(ILACE_MODE_NOTINTERLACED); - // Interlacing Fixing Methods - ILACEFIXMETHODLISTADD(ILACE_FIXMETHOD_NONE); - ILACEFIXMETHODLISTADD(ILACE_FIXMETHOD_UPONE); - ILACEFIXMETHODLISTADD(ILACE_FIXMETHOD_DOWNONE); - mixers_align = new MixersAlign(this); } @@ -2194,6 +2193,8 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__); edl->local_session->loop_playback = 0; edl->local_session->set_selectionstart(0); edl->local_session->set_selectionend(0); + edl->local_session->unset_inpoint(); + edl->local_session-> unset_outpoint(); set_brender_active(0, 0); fit_selection(); goto_start(); @@ -2277,9 +2278,8 @@ int MWindow::render_proxy(ArrayList &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; + ProxyRender proxy_render(this, format_asset, new_scale); for( int i=0; i &new_idxbls) // 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); + add_proxy(&proxy_render.orig_idxbls, &proxy_render.orig_proxies); } format_asset->remove_user(); return !result ? proxy_render.needed_proxies.size() : -1; @@ -2346,7 +2345,9 @@ int MWindow::to_proxy(Asset *asset, int new_scale, int new_use_scaler) edl->Garbage::add_user(); save_backup(); undo_before(_("proxy"), this); - ProxyRender proxy_render(this, asset); + int asset_scale = new_scale == 1 ? 0 : + !new_use_scaler ? 1 : new_scale; + ProxyRender proxy_render(this, asset, asset_scale); // revert project to original size from current size // remove all session proxy assets at the at the current proxy_scale @@ -2637,7 +2638,7 @@ void MWindow::create_objects(int want_gui, if(debug) printf("MWindow::create_objects %d total_time=%d\n", __LINE__, (int)timer.get_difference()); - plugin_guis = new ArrayList; + plugin_guis = new PluginGUIs(this); dead_plugins = new ArrayList; keyframe_threads = new ArrayList; @@ -2711,7 +2712,9 @@ void MWindow::create_objects(int want_gui, gui->show_window(); gui->raise_window(); gui->unlock_window(); - + cwindow->gui->lock_window("MWindow::create_objects 1"); + cwindow->gui->tool_panel->raise_tool(); + cwindow->gui->unlock_window(); if(debug) PRINT_TRACE if(preferences->use_tipwindow) @@ -2730,6 +2733,12 @@ void MWindow::create_objects(int want_gui, BC_WindowBase::get_resources()->vframe_shm = 1; } +int MWindow::uses_opengl() +{ + if( !playback_3d || !playback_3d->running() ) return 0; + PlaybackConfig *playback_config = edl->session->playback_config; + return playback_config->vconfig->driver == PLAYBACK_X11_GL ? 1 : 0; +} void MWindow::show_splash() { @@ -2983,6 +2992,17 @@ void MWindow::set_auto_keyframes(int value) cwindow->gui->unlock_window(); } +void MWindow::set_span_keyframes(int value) +{ + edl->session->span_keyframes = value; + gui->mbuttons->edit_panel->span_keyframe->update(value); + gui->flush(); + cwindow->gui->lock_window("MWindow::set_span_keyframes"); + cwindow->gui->edit_panel->span_keyframe->update(value); + cwindow->gui->flush(); + cwindow->gui->unlock_window(); +} + void MWindow::set_auto_visibility(Autos *autos, int value) { if( autos->type == Autos::AUTOMATION_TYPE_PLUGIN ) @@ -3154,9 +3174,6 @@ void MWindow::show_keyframe_gui(Plugin *plugin) } - - - void MWindow::show_plugin(Plugin *plugin) { int done = 0; @@ -3206,6 +3223,8 @@ SET_TRACE } } plugin_gui_lock->unlock(); +// update show/gui_id + sync_parameters(CHANGE_PARAMS); //printf("MWindow::show_plugin %d\n", __LINE__); SET_TRACE //sleep(1); @@ -3237,6 +3256,8 @@ void MWindow::hide_plugin(Plugin *plugin, int lock) } } if(lock) plugin_gui_lock->unlock(); +// update show/gui_id + sync_parameters(CHANGE_PARAMS); } void MWindow::delete_plugin(PluginServer *plugin) @@ -3412,7 +3433,6 @@ void MWindow::update_plugin_guis(int do_keyframe_guis) } if(!got_it) plugin->show = 0; - plugin = (Plugin*)plugin->next; } } @@ -3428,45 +3448,34 @@ void MWindow::update_plugin_guis(int do_keyframe_guis) int MWindow::plugin_gui_open(Plugin *plugin) { - int result = 0; + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return 0; plugin_gui_lock->lock("MWindow::plugin_gui_open"); - for(int i = 0; i < plugin_guis->total; i++) - { - if(plugin_guis->get(i)->plugin->identical_location(plugin)) - { - result = 1; - break; - } - } + PluginServer *plugin_server = plugin_guis->gui_server(gui_id); + int result = plugin_server ? 1 : 0; plugin_gui_lock->unlock(); return result; } void MWindow::render_plugin_gui(void *data, Plugin *plugin) { + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return; plugin_gui_lock->lock("MWindow::render_plugin_gui"); - for(int i = 0; i < plugin_guis->total; i++) - { - if(plugin_guis->get(i)->plugin->identical_location(plugin)) - { - plugin_guis->get(i)->render_gui(data); - break; - } - } + PluginServer *plugin_server = plugin_guis->gui_server(gui_id); + if( plugin_server ) + plugin_server->render_gui(data); plugin_gui_lock->unlock(); } void MWindow::render_plugin_gui(void *data, int size, Plugin *plugin) { + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return; plugin_gui_lock->lock("MWindow::render_plugin_gui"); - for(int i = 0; i < plugin_guis->total; i++) - { - if(plugin_guis->get(i)->plugin->identical_location(plugin)) - { - plugin_guis->get(i)->render_gui(data, size); - break; - } - } + PluginServer *plugin_server = plugin_guis->gui_server(gui_id); + if( plugin_server ) + plugin_server->render_gui(data, size); plugin_gui_lock->unlock(); } @@ -3589,6 +3598,7 @@ if(debug) printf("MWindow::asset_to_edl %d\n", __LINE__); //printf("MWindow::asset_to_edl 4 %s\n", string); if(debug) printf("MWindow::asset_to_edl %d\n", __LINE__); + new_edl->local_session->asset2edl = 1; return 0; } @@ -3616,9 +3626,7 @@ void MWindow::update_project(int load_mode) gui->unlock_window(); init_brender(); - cwindow->gui->lock_window("MWindow::update_project 1"); cwindow->update(0, 0, 1, 1, 1); - cwindow->gui->unlock_window(); if(debug) PRINT_TRACE @@ -3655,12 +3663,17 @@ void MWindow::update_project(int load_mode) zwindow->set_title(mixer->title); zwindow->start(); } + cwindow->gui->canvas->set_zoom(edl, 0); } update_vwindow(); if(debug) PRINT_TRACE cwindow->gui->lock_window("MWindow::update_project 2"); cwindow->gui->timebar->update(0); + Track *track = cwindow->calculate_affected_track(); + cwindow->mask_track_id = track ? track->get_id() : -1; + cwindow->gui->tool_panel->raise_tool(); + cwindow->gui->update_canvas(0); cwindow->gui->unlock_window(); if(debug) PRINT_TRACE @@ -3675,6 +3688,26 @@ void MWindow::update_project(int load_mode) if(debug) PRINT_TRACE } +void MWindow::update_preferences(Preferences *prefs) +{ + if( prefs != preferences ) + preferences->copy_from(prefs); + if( cwindow->playback_engine ) + cwindow->playback_engine->preferences->copy_from(prefs); + for(int i = 0; i < vwindows.size(); i++) { + VWindow *vwindow = vwindows[i]; + if( !vwindow->is_running() ) continue; + if( vwindow->playback_engine ) + vwindow->playback_engine->preferences->copy_from(prefs); + } + for(int i = 0; i < zwindows.size(); i++) { + ZWindow *zwindow = zwindows[i]; + if( !zwindow->is_running() ) continue; + if( zwindow->zgui->playback_engine ) + zwindow->zgui->playback_engine->preferences->copy_from(prefs); + } +} + void MWindow::update_vwindow() { for( int i=0; ipath); remove_indexfile(indexable); // Schedule index build - IndexState *index_state = indexable->index_state; - index_state->index_status = INDEX_NOTTESTED; + indexable->index_state->remove_user(); + indexable->index_state = new IndexState; + IndexFile::delete_index_files(preferences, indexable); if( indexable->is_asset ) { Asset *asset = (Asset *)indexable; if( asset->format != FILE_PCM ) { @@ -3720,6 +3754,9 @@ void MWindow::rebuild_indices() } mainindexes->add_next_asset(0, indexable); } +// still in render engine + sync_parameters(CHANGE_ALL); + awindow->gui->async_update_assets(); mainindexes->start_build(); } @@ -4065,47 +4102,60 @@ void MWindow::remove_asset_from_caches(Asset *asset) if( vwindow->playback_engine->video_cache ) vwindow->playback_engine->video_cache->delete_entry(asset); } + for(int i = 0; i < zwindows.size(); i++) { + ZWindow *zwindow = zwindows[i]; + if( !zwindow->is_running() ) continue; + if( zwindow->zgui->playback_engine->audio_cache ) + zwindow->zgui->playback_engine->audio_cache->delete_entry(asset); + if( zwindow->zgui->playback_engine->video_cache ) + zwindow->zgui->playback_engine->video_cache->delete_entry(asset); + } } - -void MWindow::remove_assets_from_project(int push_undo, int redraw, +void MWindow::remove_assets_from_project(int push_undo, int redraw, int delete_indexes, ArrayList *drag_assets, ArrayList *drag_clips) { awindow->gui->close_view_popup(); - for(int i = 0; i < drag_assets->total; i++) { - Indexable *indexable = drag_assets->get(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++) { - VWindow *vwindow = vwindows[j]; - if( !vwindow->is_running() ) continue; - if(session->drag_clips->get(i) == vwindow->get_edl()) { - vwindow->gui->lock_window("MWindow::remove_assets_from_project 1"); - vwindow->delete_source(1, 1); - vwindow->gui->unlock_window(); + if( drag_clips ) { + for(int i = 0; i < drag_clips->total; i++) { + for(int j = 0; j < vwindows.size(); j++) { + VWindow *vwindow = vwindows[j]; + if( !vwindow->is_running() ) continue; + if(drag_clips->get(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 < drag_assets->size(); i++) { - for(int j = 0; j < vwindows.size(); j++) { - VWindow *vwindow = vwindows[j]; - if( !vwindow->is_running() ) continue; - if(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( drag_assets ) { + for(int i = 0; i < drag_assets->size(); i++) { + for(int j = 0; j < vwindows.size(); j++) { + VWindow *vwindow = vwindows[j]; + if( !vwindow->is_running() ) continue; + if(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 < drag_assets->size(); i++) { - Indexable *indexable = drag_assets->get(i); - remove_indexfile(indexable); + for(int i = 0; i < drag_assets->total; i++) { + Indexable *indexable = drag_assets->get(i); + if(indexable->is_asset) remove_asset_from_caches((Asset*)indexable); + } + + if( delete_indexes ) { + for(int i = 0; i < drag_assets->size(); i++) { + Indexable *indexable = drag_assets->get(i); + remove_indexfile(indexable); + } + } } //printf("MWindow::rebuild_indices 1 %s\n", indexable->path); @@ -4130,10 +4180,8 @@ void MWindow::remove_assets_from_project(int push_undo, int redraw, void MWindow::remove_assets_from_disk() { - remove_assets_from_project(1, - 1, - session->drag_assets, - session->drag_clips); + remove_assets_from_project(1, 1, 1, + session->drag_assets, session->drag_clips); // Remove from disk for(int i = 0; i < session->drag_assets->total; i++) @@ -4470,7 +4518,7 @@ void MWindow::resync_guis() lwindow->gui->panel->set_meters(channels, 1); lwindow->gui->flush(); lwindow->gui->unlock_window(); - +#ifdef GLx4 // Warn user if(((edl->session->output_w % 4) || (edl->session->output_h % 4)) && @@ -4480,7 +4528,7 @@ void MWindow::resync_guis() _("This project's dimensions are not multiples of 4 so\n" "it can't be rendered by OpenGL.")); } - +#endif // Flash frame sync_parameters(CHANGE_ALL); @@ -4505,8 +4553,10 @@ int MWindow::select_asset(Asset *asset, int vstream, int astream, int delete_tra double framerate = asset->get_frame_rate(); int width = asset->get_w(); int height = asset->get_h(); +#ifdef GLx4 // must be multiple of 4 for opengl width = (width+3) & ~3; height = (height+3) & ~3; +#endif int driver = session->playback_config->vconfig->driver; int color_model = file->get_best_colormodel(asset, driver); // color_model = BC_CModels::is_yuv(color_model) ?