X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindow.C;h=39c996433da4473abcbfeea39961dcfe64d6dc64;hp=b3ad59a05d7e1200c1805795771137754d290912;hb=3b4b6f588c4f2643316afcbc486ca6a35c16a431;hpb=620f70a943c1f47880ec68a908aa03bf463e741f diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index b3ad59a0..39c99643 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" @@ -179,7 +180,6 @@ extern "C" } - extern long cin_timezone; ArrayList* MWindow::plugindb = 0; @@ -225,6 +225,7 @@ MWindow::MWindow() create_bd = 0; create_dvd = 0; batch_render = 0; + convert_render = 0; render = 0; edl = 0; gui = 0; @@ -265,6 +266,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(); @@ -1309,7 +1311,7 @@ void MWindow::stop_mixers() } } -void MWindow::close_mixers(int destroy) +void MWindow::close_mixers(int result) { ArrayList closed; zwindows_lock->lock("MWindow::close_mixers"); @@ -1317,10 +1319,9 @@ void MWindow::close_mixers(int destroy) 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"); - zgui->set_done(0); + zgui->set_done(result); zgui->unlock_window(); closed.append(zwindow); } @@ -1453,7 +1454,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(); @@ -2275,9 +2276,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; @@ -2344,7 +2343,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 @@ -2635,7 +2636,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; @@ -3171,9 +3172,6 @@ void MWindow::show_keyframe_gui(Plugin *plugin) } - - - void MWindow::show_plugin(Plugin *plugin) { int done = 0; @@ -3223,6 +3221,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); @@ -3254,6 +3254,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) @@ -3429,7 +3431,6 @@ void MWindow::update_plugin_guis(int do_keyframe_guis) } if(!got_it) plugin->show = 0; - plugin = (Plugin*)plugin->next; } } @@ -3443,50 +3444,85 @@ void MWindow::update_plugin_guis(int do_keyframe_guis) if(do_keyframe_guis) update_keyframe_guis(); } -int MWindow::plugin_gui_open(Plugin *plugin) +void MWindow::stop_plugin_guis() { - int result = 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; +// Send new configuration to plugin GUI's + plugin_gui_lock->lock("MWindow::stop_plugin_guis"); + + for( int i=0; isize(); ++i ) { + PluginServer *ptr = plugin_guis->get(i); + if( edl->tracks->plugin_exists(ptr->plugin) ) { + ptr->render_stop(); } } + plugin_gui_lock->unlock(); +} + +int MWindow::plugin_gui_open(Plugin *plugin) +{ + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return 0; + plugin_gui_lock->lock("MWindow::plugin_gui_open"); + 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) { - 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; - } - } + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return; + plugin_gui_lock->lock("MWindow::render_plugin_gui 0"); + 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) { - 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; - } - } + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return; + plugin_gui_lock->lock("MWindow::render_plugin_gui 1"); + PluginServer *plugin_server = plugin_guis->gui_server(gui_id); + if( plugin_server ) + plugin_server->render_gui(data, size); + plugin_gui_lock->unlock(); +} + +void MWindow::reset_plugin_gui_frames(Plugin *plugin) +{ + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return; + plugin_gui_lock->lock("MWindow::reset_plugin_gui_frames"); + PluginServer *plugin_server = plugin_guis->gui_server(gui_id); + if( plugin_server ) + plugin_server->reset_plugin_gui_frames(); + plugin_gui_lock->unlock(); +} + +void MWindow::render_plugin_gui_frames(PluginClientFrames *frames, Plugin *plugin) +{ + int gui_id = plugin->gui_id; + if( gui_id < 0 ) return; + plugin_gui_lock->lock("MWindow::render_plugin_gui_frames"); + PluginServer *plugin_server = plugin_guis->gui_server(gui_id); + if( plugin_server ) + plugin_server->render_plugin_gui_frames(frames); plugin_gui_lock->unlock(); } +double MWindow::get_tracking_position() +{ + return edl->local_session->get_selectionstart(1); +} + +int MWindow::get_tracking_direction() +{ + return cwindow->playback_engine->get_direction(); +} void MWindow::update_plugin_states() { @@ -3671,6 +3707,7 @@ void MWindow::update_project(int load_mode) zwindow->set_title(mixer->title); zwindow->start(); } + cwindow->gui->canvas->set_zoom(edl, 0); } update_vwindow(); @@ -3680,6 +3717,7 @@ void MWindow::update_project(int load_mode) 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 @@ -3694,6 +3732,145 @@ void MWindow::update_project(int load_mode) if(debug) PRINT_TRACE } +void MWindow::stack_push(EDL *new_edl) +{ +// needs gui lock + gui->lock_window("MWindow::stack_push"); + if( stack.size() < 9 ) { + undo_before(); + StackItem &item = stack.append(); + item.edl = edl; + item.new_edl = new_edl; + item.undo = undo; + edl = new_edl; + edl->add_user(); + strcpy(session->filename, edl->path); + undo = new MainUndo(this); + gui->stack_button->update(); + update_project(LOADMODE_REPLACE); + } + gui->unlock_window(); +} + +void MWindow::stack_pop() +{ + if( !stack.size() ) return; +// writes on config_path/backup%d.xml + save_backup(); +// already have gui lock + forget_nested_edl(edl); + StackItem &item = stack.last(); +// session edl replaced, overwrite and save clip data + if( item.new_edl != edl ) + item.new_edl->overwrite_clip(edl); + edl->remove_user(); + edl = item.edl; + delete undo; + undo = item.undo; + stack.remove(); + strcpy(session->filename, edl->path); + update_project(LOADMODE_REPLACE); + undo_after(_("open edl"), LOAD_ALL); + gui->stack_button->update(); +} + +void MWindow::forget_nested_edl(EDL *nested) +{ + frame_cache->remove_item(nested); + wave_cache->remove_item(nested); + if( gui->render_engine && + gui->render_engine_id == nested->id ) { + delete gui->render_engine; + gui->render_engine = 0; + } + if( gui->resource_thread->render_engine_id == nested->id ) { + gui->resource_thread->render_engine_id = -1; + delete gui->resource_thread->render_engine; + gui->resource_thread->render_engine = 0; + } +} + +void MWindow::clip_to_media() +{ + if( edl->session->proxy_scale != 1 ) { + eprintf("Nesting not allowed when proxy scale != 1"); + return; + } + undo_before(); + int clips_total = session->drag_clips->total; + for( int i=0; idrag_clips->values[i]; + time_t dt; time(&dt); + struct tm dtm; localtime_r(&dt, &dtm); + char path[BCTEXTLEN], *cp = path, *ep = cp+sizeof(path)-1; +// path_basename = "Nested_-