From 667ff598ae2a94f48c7056aee1d77d7cde39066b Mon Sep 17 00:00:00 2001 From: Good Guy Date: Sun, 19 Nov 2017 14:08:33 -0700 Subject: [PATCH] sams last ladspa icons, libopus/vp9, mixer fixer, plugin resets, fmt frmsz, shm fixes --- cinelerra-5.1/cinelerra/assetpopup.C | 11 +- cinelerra-5.1/cinelerra/automation.C | 1 + cinelerra-5.1/cinelerra/cwindow.C | 16 ++- cinelerra-5.1/cinelerra/cwindow.h | 3 + cinelerra-5.1/cinelerra/cwindowgui.C | 10 +- cinelerra-5.1/cinelerra/cwindowtool.C | 9 +- cinelerra-5.1/cinelerra/ffmpeg.C | 1 + cinelerra-5.1/cinelerra/mainmenu.C | 14 +++ cinelerra-5.1/cinelerra/mainmenu.h | 8 ++ cinelerra-5.1/cinelerra/mwindow.C | 109 ++++++++++++++---- cinelerra-5.1/cinelerra/mwindow.h | 3 + cinelerra-5.1/cinelerra/mwindowedit.C | 57 +++------ cinelerra-5.1/cinelerra/mwindowmove.C | 16 ++- cinelerra-5.1/cinelerra/new.C | 2 +- cinelerra-5.1/cinelerra/playbackengine.C | 5 + cinelerra-5.1/cinelerra/playbackengine.h | 1 + cinelerra-5.1/cinelerra/preferencesthread.C | 5 +- cinelerra-5.1/cinelerra/theme.C | 54 ++++++--- cinelerra-5.1/cinelerra/vwindow.C | 5 +- cinelerra-5.1/cinelerra/zwindow.C | 12 +- cinelerra-5.1/cinelerra/zwindowgui.C | 9 +- cinelerra-5.1/configure.ac | 11 ++ cinelerra-5.1/guicast/vframe.C | 6 +- cinelerra-5.1/guicast/vframe.h | 2 +- cinelerra-5.1/picon/cinfinity/sc3_1427.png | Bin 17131 -> 17890 bytes cinelerra-5.1/plugins/chromakey/chromakey.C | 39 +++++-- cinelerra-5.1/plugins/chromakey/chromakey.h | 13 ++- .../plugins/chromakeyhsv/chromakey.C | 52 +++++++-- .../plugins/chromakeyhsv/chromakey.h | 14 ++- .../thirdparty/src/ffmpeg-3.3.4.patch1 | 9 ++ 30 files changed, 353 insertions(+), 144 deletions(-) diff --git a/cinelerra-5.1/cinelerra/assetpopup.C b/cinelerra-5.1/cinelerra/assetpopup.C index 175494b5..47cc7f2a 100644 --- a/cinelerra-5.1/cinelerra/assetpopup.C +++ b/cinelerra-5.1/cinelerra/assetpopup.C @@ -271,6 +271,8 @@ AssetPopupMixer::~AssetPopupMixer() int AssetPopupMixer::handle_event() { + ArrayListnew_mixers; + mwindow->select_zwindow(0); for( int i=0; isession->drag_assets->total; ++i ) { Indexable *indexable = mwindow->session->drag_assets->values[i]; @@ -293,9 +295,14 @@ int AssetPopupMixer::handle_event() char *tp = strrchr(path, '/'); if( !tp ) tp = path; else ++tp; zwindow->set_title(tp); - zwindow->start(); + new_mixers.append(zwindow); } - mwindow->queue_mixers(mwindow->edl,CURRENT_FRAME,0,0,1,0); + + mwindow->tile_mixers(); + for( int i=0; istart(); + + mwindow->refresh_mixers(); mwindow->resync_guis(); return 1; } diff --git a/cinelerra-5.1/cinelerra/automation.C b/cinelerra-5.1/cinelerra/automation.C index 2a21dd4d..a407a489 100644 --- a/cinelerra-5.1/cinelerra/automation.C +++ b/cinelerra-5.1/cinelerra/automation.C @@ -41,6 +41,7 @@ int Automation::autogrouptypes_fixedrange[] = 0, 0, 0, + 0, 1 }; diff --git a/cinelerra-5.1/cinelerra/cwindow.C b/cinelerra-5.1/cinelerra/cwindow.C index c292d66d..7152f5a6 100644 --- a/cinelerra-5.1/cinelerra/cwindow.C +++ b/cinelerra-5.1/cinelerra/cwindow.C @@ -234,11 +234,7 @@ void CWindow::update(int position, if(position) { - mwindow->queue_mixers(mwindow->edl, CURRENT_FRAME,1,0,1,0); - playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_NONE, - mwindow->edl, - 1); + refresh_frame(CHANGE_NONE); } gui->lock_window("CWindow::update 2"); @@ -309,8 +305,16 @@ int CWindow::update_position(double position) return 1; } +void CWindow::refresh_frame(int change_type, EDL *edl) +{ + mwindow->refresh_mixers(); + playback_engine->refresh_frame(change_type, edl); +} - +void CWindow::refresh_frame(int change_type) +{ + refresh_frame(change_type, mwindow->edl); +} CWindowRemoteHandler:: CWindowRemoteHandler(RemoteControl *remote_control) diff --git a/cinelerra-5.1/cinelerra/cwindow.h b/cinelerra-5.1/cinelerra/cwindow.h index 33c43a1d..04845095 100644 --- a/cinelerra-5.1/cinelerra/cwindow.h +++ b/cinelerra-5.1/cinelerra/cwindow.h @@ -27,6 +27,7 @@ #include "cplayback.inc" #include "ctracking.inc" #include "cwindowgui.inc" +#include "edl.inc" #include "floatauto.inc" #include "mwindow.inc" #include "remotecontrol.h" @@ -70,6 +71,8 @@ public: void hide_window(); int update_position(double position); void stop_playback(int wait); + void refresh_frame(int change_type); + void refresh_frame(int change_type, EDL *edl); int destination; MWindow *mwindow; diff --git a/cinelerra-5.1/cinelerra/cwindowgui.C b/cinelerra-5.1/cinelerra/cwindowgui.C index cb2dbac9..21e8e90f 100644 --- a/cinelerra-5.1/cinelerra/cwindowgui.C +++ b/cinelerra-5.1/cinelerra/cwindowgui.C @@ -3178,10 +3178,7 @@ int CWindowCanvas::cursor_motion_event() gui->unlock_window(); mwindow->restart_brender(); mwindow->sync_parameters(CHANGE_PARAMS); - gui->cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_NONE, - mwindow->edl, - 1); + mwindow->cwindow->refresh_frame(CHANGE_NONE); if(!redraw) gui->update_tool(); gui->lock_window("CWindowCanvas::cursor_motion_event 2"); } @@ -3270,10 +3267,7 @@ int CWindowCanvas::button_press_event() mwindow->restart_brender(); mwindow->sync_parameters(CHANGE_PARAMS); - gui->cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_NONE, - mwindow->edl, - 1); + mwindow->cwindow->refresh_frame(CHANGE_NONE); if(!redraw) gui->update_tool(); gui->lock_window("CWindowCanvas::button_press_event 2"); } diff --git a/cinelerra-5.1/cinelerra/cwindowtool.C b/cinelerra-5.1/cinelerra/cwindowtool.C index f3266356..bfb78560 100644 --- a/cinelerra-5.1/cinelerra/cwindowtool.C +++ b/cinelerra-5.1/cinelerra/cwindowtool.C @@ -794,8 +794,7 @@ void CWindowCameraGUI::update_preview() mwindow->gui->draw_overlays(1); mwindow->sync_parameters(CHANGE_PARAMS); mwindow->gui->unlock_window(); - mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_NONE, mwindow->edl, 1); + mwindow->cwindow->refresh_frame(CHANGE_NONE); mwindow->cwindow->gui->lock_window("CWindowCameraGUI::update_preview"); mwindow->cwindow->gui->canvas->draw_refresh(); mwindow->cwindow->gui->unlock_window(); @@ -1239,8 +1238,7 @@ void CWindowProjectorGUI::update_preview() mwindow->sync_parameters(CHANGE_PARAMS); mwindow->gui->draw_overlays(1); mwindow->gui->unlock_window(); - mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_NONE, mwindow->edl, 1); + mwindow->cwindow->refresh_frame(CHANGE_NONE); mwindow->cwindow->gui->lock_window("CWindowProjectorGUI::update_preview"); mwindow->cwindow->gui->canvas->draw_refresh(); mwindow->cwindow->gui->unlock_window(); @@ -2263,8 +2261,7 @@ void CWindowMaskGUI::update_preview() mwindow->sync_parameters(CHANGE_PARAMS); mwindow->gui->draw_overlays(1); mwindow->gui->unlock_window(); - mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_NONE, mwindow->edl, 1); + mwindow->cwindow->refresh_frame(CHANGE_NONE); mwindow->cwindow->gui->lock_window("CWindowMaskGUI::update_preview"); mwindow->cwindow->gui->canvas->draw_refresh(); mwindow->cwindow->gui->unlock_window(); diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C index 1b4e100d..c536a265 100644 --- a/cinelerra-5.1/cinelerra/ffmpeg.C +++ b/cinelerra-5.1/cinelerra/ffmpeg.C @@ -690,6 +690,7 @@ int FFAudioStream::decode_frame(AVFrame *frame) int FFAudioStream::encode_activate() { if( writing >= 0 ) return writing; + if( !avctx->codec ) return writing = 0; frame_sz = avctx->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE ? 10000 : avctx->frame_size; return FFStream::encode_activate(); diff --git a/cinelerra-5.1/cinelerra/mainmenu.C b/cinelerra-5.1/cinelerra/mainmenu.C index 0bf2973d..d85ef6ba 100644 --- a/cinelerra-5.1/cinelerra/mainmenu.C +++ b/cinelerra-5.1/cinelerra/mainmenu.C @@ -257,6 +257,7 @@ void MainMenu::create_objects() windowmenu->add_item(split_x = new SplitX(mwindow)); windowmenu->add_item(split_y = new SplitY(mwindow)); windowmenu->add_item(mixer_viewer = new MixerViewer(mwindow)); + windowmenu->add_item(new TileMixers(mwindow)); windowmenu->add_item(new TileWindows(mwindow,_("Default positions"),-1,_("Ctrl-P"),'p')); windowmenu->add_item(new TileWindows(mwindow,_("Tile left"),0)); windowmenu->add_item(new TileWindows(mwindow,_("Tile right"),1)); @@ -1540,3 +1541,16 @@ int MixerViewer::handle_event() return 1; } +TileMixers::TileMixers(MWindow *mwindow) + : BC_MenuItem(_("Tile mixers"), "Alt-t", 't') +{ + this->mwindow = mwindow; + set_alt(); +} + +int TileMixers::handle_event() +{ + mwindow->tile_mixers(); + return 1; +} + diff --git a/cinelerra-5.1/cinelerra/mainmenu.h b/cinelerra-5.1/cinelerra/mainmenu.h index 8300bcb4..9baf2a3b 100644 --- a/cinelerra-5.1/cinelerra/mainmenu.h +++ b/cinelerra-5.1/cinelerra/mainmenu.h @@ -408,6 +408,14 @@ public: MWindow *mwindow; }; +class TileMixers : public BC_MenuItem +{ +public: + TileMixers(MWindow *mwindow); + int handle_event(); + MWindow *mwindow; +}; + // ======================================== audio class AddAudioTrack : public BC_MenuItem diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index ae471267..426421c3 100644 --- a/cinelerra-5.1/cinelerra/mwindow.C +++ b/cinelerra-5.1/cinelerra/mwindow.C @@ -250,6 +250,7 @@ MWindow::~MWindow() delete render; render = 0; commit_commercial(); if( commercials && !commercials->remove_user() ) commercials = 0; + close_mixers(); // Save defaults for open plugins plugin_gui_lock->lock("MWindow::~MWindow"); @@ -1129,7 +1130,7 @@ ZWindow *MWindow::get_mixer(Mixer *&mixer) if( !mixer ) mixer = edl->mixers.new_mixer(); ZWindow *zwindow = 0; for( int i=0; !zwindow && iis_running() ) zwindow = zwindows[i]; + if( zwindows[i]->idx < 0 ) zwindow = zwindows[i]; if( !zwindow ) zwindows.append(zwindow = new ZWindow(this)); zwindow->idx = mixer->idx; @@ -1175,7 +1176,7 @@ void MWindow::start_mixer() zwindow->set_title(title); zwindow->start(); - queue_mixers(edl,CURRENT_FRAME,0,0,1,0); + refresh_mixers(); } int MWindow::mixer_track_active(Track *track) @@ -1206,7 +1207,7 @@ void MWindow::queue_mixers(EDL *edl, int command, int wait_tracking, zwindows_lock->lock("MWindow::queue_mixers"); for( int vidx=0; vidxrunning() ) continue; + if( zwindow->idx < 0 ) continue; Mixer *mixer = edl->mixers.get_mixer(zwindow->idx); if( !mixer || !mixer->mixer_ids.size() ) continue; int k = -1; @@ -1238,15 +1239,39 @@ void MWindow::queue_mixers(EDL *edl, int command, int wait_tracking, zwindows_lock->unlock(); } +void MWindow::refresh_mixers() +{ + queue_mixers(edl,CURRENT_FRAME,0,0,1,0); +} + void MWindow::stop_mixers() { for( int vidx=0; vidxrunning() ) continue; + if( zwindow->idx < 0 ) continue; zwindow->issue_command(STOP, 0, 0, 0, 0); } } +void MWindow::close_mixers() +{ + zwindows_lock->lock("MWindow::close_mixers"); + for( int i=0; iidx < 0 ) continue; + ZWindowGUI *zgui = zwindow->zgui; + zgui->lock_window("MWindow::select_zwindow 0"); + zgui->set_done(0); + zgui->unlock_window(); + } + zwindows_lock->unlock(); + for( int i=0; iidx < 0 ) continue; + zwindow->close_window(); + } +} + int MWindow::select_zwindow(ZWindow *zwindow) { int ret = 0, n = zwindows.number_of(zwindow); @@ -1254,7 +1279,7 @@ int MWindow::select_zwindow(ZWindow *zwindow) session->selected_zwindow = n; for( int i=0; irunning() ) continue; + if( zwindow->idx < 0 ) continue; ZWindowGUI *zgui = zwindow->zgui; zgui->lock_window("MWindow::select_zwindow 0"); zwindow->highlighted = i == n ? 1 : 0; @@ -1270,6 +1295,61 @@ int MWindow::select_zwindow(ZWindow *zwindow) return ret; } +void MWindow::tile_mixers() +{ + int nz = 0; + for( int i=0; iidx < 0 ) continue; + ++nz; + } + if( !nz ) return; + int zn = ceil(sqrt(nz)); + int x1 = 1 + gui->get_x(), x2 = cwindow->gui->get_x(); + int y1 = 1, y2 = gui->get_y(); + int rw = gui->get_root_w(0), rh = gui->get_root_h(0); + if( x1 < 0 ) x1 = 0; + if( y1 < 0 ) y1 = 0; + if( x2 > rw ) x2 = rw; + if( y2 > rh ) y2 = rh; + int dx = x2 - x1, dy = y2 - y1; + int zw = dx / zn; + int lt = BC_DisplayInfo::get_left_border(); + int top = BC_DisplayInfo::get_top_border(); + 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 rsz = 0, n = 0, dz = 0; + int ow = edl->session->output_w, oh = edl->session->output_h; + for( int i=0; iidx < 0 ) continue; + int ww = zw - bw, hh = (ww - mw) * oh / ow + mh, zh = hh + bh; + if( rsz < hh ) rsz = hh; + int xx = zx + x1, yy = zy + y1; + int mx = x2 - zw, my = y2 - zh; + if( xx > mx ) xx = mx; + if( yy > my ) yy = my; + xx += lt + dz; yy += top + dz; + zwindow->reposition(xx,yy, ww,hh); + if( zwindow->running() ) { + ZWindowGUI *gui = (ZWindowGUI *)zwindow->get_gui(); + gui->lock_window("MWindow::tile_mixers"); + gui->BC_WindowBase::reposition_window(xx,yy, ww,hh); + gui->unlock_window(); + } + if( ++n >= zn ) { + n = 0; rsz += bh; + if( (zy += rsz) > (dy - rsz) ) dz += 10; + rsz = 0; + zx = 0; + } + else + zx += zw; + } +} + void MWindow::init_cache() { @@ -1572,7 +1652,7 @@ void MWindow::stop_playback(int wait) } for(int i = 0; i < zwindows.size(); i++) { ZWindow *zwindow = zwindows[i]; - if( !zwindow->is_running() ) continue; + if( zwindow->idx < 0 ) continue; zwindow->stop_playback(wait); } } @@ -2662,11 +2742,7 @@ void MWindow::sync_parameters(int change_type) } else { - queue_mixers(edl,CURRENT_FRAME,0,0,1,0); - cwindow->playback_engine->que->send_command(CURRENT_FRAME, - change_type, - edl, - 1); + cwindow->refresh_frame(change_type); } } @@ -3201,11 +3277,7 @@ void MWindow::update_project(int load_mode) } if(debug) PRINT_TRACE select_zwindow(0); - for( int i=0; iis_running() ) continue; - zwindow->close_window(); - } + close_mixers(); for( int i=0; imixers.size(); ++i ) { Mixer *mixer = edl->mixers[i]; @@ -3231,10 +3303,7 @@ void MWindow::update_project(int load_mode) cwindow->gui->unlock_window(); if(debug) PRINT_TRACE - cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_ALL, - edl, - 1); + cwindow->refresh_frame(CHANGE_ALL); awindow->gui->async_update_assets(); if(debug) PRINT_TRACE diff --git a/cinelerra-5.1/cinelerra/mwindow.h b/cinelerra-5.1/cinelerra/mwindow.h index f15081b6..271a4f89 100644 --- a/cinelerra-5.1/cinelerra/mwindow.h +++ b/cinelerra-5.1/cinelerra/mwindow.h @@ -206,13 +206,16 @@ public: void queue_mixers(EDL *edl, int command, int wait_tracking, int use_inout, int update_refresh, int toggle_audio); + void refresh_mixers(); void stop_mixers(); + void close_mixers(); ZWindow *get_mixer(Mixer *&mixer); void del_mixer(ZWindow *zwindow); int mixer_track_active(Track *track); void update_mixer_tracks(); void start_mixer(); int select_zwindow(ZWindow *zwindow); + void tile_mixers(); int load_filenames(ArrayList *filenames, int load_mode = LOADMODE_REPLACE, diff --git a/cinelerra-5.1/cinelerra/mwindowedit.C b/cinelerra-5.1/cinelerra/mwindowedit.C index e128a19b..84232955 100644 --- a/cinelerra-5.1/cinelerra/mwindowedit.C +++ b/cinelerra-5.1/cinelerra/mwindowedit.C @@ -96,8 +96,7 @@ void MWindow::add_audio_track_entry(int above, Track *dst) // gui->cursor->draw(1); // gui->canvas->flash(); // gui->canvas->activate(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::add_video_track_entry(Track *dst) @@ -116,8 +115,7 @@ void MWindow::add_video_track_entry(Track *dst) // gui->cursor->draw(1); // gui->canvas->flash(); // gui->canvas->activate(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); save_backup(); } @@ -137,8 +135,7 @@ void MWindow::add_subttl_track_entry(Track *dst) // gui->cursor->draw(1); // gui->canvas->flash(); // gui->canvas->activate(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); save_backup(); } @@ -311,8 +308,7 @@ void MWindow::clear_entry() update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::clear(int clear_handle) @@ -408,8 +404,7 @@ void MWindow::concatenate_tracks() restart_brender(); gui->update(1, 1, 0, 0, 1, 0, 0); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } @@ -505,8 +500,7 @@ void MWindow::crop_video() undo->update_undo_after(_("crop"), LOAD_ALL); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_ALL, edl, 1); + cwindow->refresh_frame(CHANGE_ALL); save_backup(); } @@ -532,8 +526,7 @@ void MWindow::blade(double position) gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); awindow->gui->async_update_assets(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::cut(double start, double end, double new_position) @@ -557,8 +550,7 @@ void MWindow::cut(double start, double end, double new_position) gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); awindow->gui->async_update_assets(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::snap_left_edit() @@ -668,8 +660,7 @@ void MWindow::delete_tracks() update_plugin_states(); gui->update(1, 1, 1, 0, 1, 0, 0); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::delete_track(Track *track) @@ -682,8 +673,7 @@ void MWindow::delete_track(Track *track) update_plugin_states(); gui->update(1, 1, 1, 0, 1, 0, 0); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); save_backup(); } @@ -941,8 +931,7 @@ void MWindow::move_edits(ArrayList *edits, undo->update_undo_after(_("move edit"), LOAD_ALL); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); update_plugin_guis(); gui->update(1, 1, // 1 for incremental drawing. 2 for full refresh @@ -957,8 +946,7 @@ void MWindow::move_effect(Plugin *plugin, Track *track, int64_t position) undo->update_undo_after(_("paste effect"), LOAD_ALL); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); update_plugin_guis(); gui->update(1, 1, // 1 for incremental drawing. 2 for full refresh 0, 0, 0, 0, 0); @@ -972,8 +960,7 @@ void MWindow::move_effect(Plugin *plugin, PluginSet *plugin_set, int64_t positio undo->update_undo_after(_("move effect"), LOAD_ALL); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); update_plugin_guis(); gui->update(1, 1, // 1 for incremental drawing. 2 for full refresh 0, 0, 0, 0, 0); @@ -1078,8 +1065,7 @@ void MWindow::mute_selection() restart_brender(); update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 0); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } } @@ -1643,8 +1629,7 @@ void MWindow::paste_silence() restart_brender(); gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } void MWindow::detach_transition(Transition *transition) @@ -1924,8 +1909,7 @@ void MWindow::redo_entry(BC_WindowBase *calling_window_gui) } } - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_ALL, edl, 1); + cwindow->refresh_frame(CHANGE_ALL); } @@ -2168,8 +2152,7 @@ void MWindow::trim_selection() cwindow->update(1, 0, 0, 0, 1); awindow->gui->async_update_assets(); restart_brender(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } @@ -2213,8 +2196,7 @@ void MWindow::undo_entry(BC_WindowBase *calling_window_gui) awindow->gui->async_update_assets(); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_ALL, edl, 1); + cwindow->refresh_frame(CHANGE_ALL); calling_window_gui->lock_window("MWindow::undo_entry 4"); } @@ -2426,8 +2408,7 @@ void MWindow::cut_commercials() update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); - cwindow->playback_engine->que-> - send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1); + cwindow->refresh_frame(CHANGE_EDL); } diff --git a/cinelerra-5.1/cinelerra/mwindowmove.C b/cinelerra-5.1/cinelerra/mwindowmove.C index 06fb11cc..0cd6e455 100644 --- a/cinelerra-5.1/cinelerra/mwindowmove.C +++ b/cinelerra-5.1/cinelerra/mwindowmove.C @@ -178,10 +178,17 @@ void MWindow::fit_autos(int doall) switch (i) { case AUTOGROUPTYPE_AUDIO_FADE: + if (range < 1) { + min = MIN(min, edl->local_session->automation_mins[i]); + max = MAX(max, edl->local_session->automation_maxs[i]); + if( min >= max-0.1 ) { min = -80.0; min = 6.0; } + } + break; case AUTOGROUPTYPE_VIDEO_FADE: - if (range < 0.1) { + if (range < 1) { min = MIN(min, edl->local_session->automation_mins[i]); max = MAX(max, edl->local_session->automation_maxs[i]); + if( min >= max-0.1 ) { min = 0.0; min = 100.0; } } break; case AUTOGROUPTYPE_ZOOM: @@ -198,9 +205,10 @@ void MWindow::fit_autos(int doall) break; case AUTOGROUPTYPE_X: case AUTOGROUPTYPE_Y: - if (range < 5) { - min = floor((min+max)/2) - 50; - max = floor((min+max)/2) + 50; + if (range < 1) { + float scale = bmin(edl->session->output_w, edl->session->output_h); + min = floor((min+max)/2) - 0.5*scale; + max = floor((min+max)/2) + 0.5*scale; } break; } diff --git a/cinelerra-5.1/cinelerra/new.C b/cinelerra-5.1/cinelerra/new.C index d157d58a..9d7dea8e 100644 --- a/cinelerra-5.1/cinelerra/new.C +++ b/cinelerra-5.1/cinelerra/new.C @@ -601,7 +601,7 @@ int FrameRatePulldown::handle_event() FrameSizePulldown::FrameSizePulldown(Theme *theme, BC_TextBox *output_w, BC_TextBox *output_h, int x, int y) - : BC_ListBox(x, y, 150, 250, LISTBOX_TEXT, + : BC_ListBox(x, y, 180, 250, LISTBOX_TEXT, &theme->frame_sizes, 0, 0, 1, 0, 1) { this->theme = theme; diff --git a/cinelerra-5.1/cinelerra/playbackengine.C b/cinelerra-5.1/cinelerra/playbackengine.C index 2842377a..1d3a4115 100644 --- a/cinelerra-5.1/cinelerra/playbackengine.C +++ b/cinelerra-5.1/cinelerra/playbackengine.C @@ -490,3 +490,8 @@ void PlaybackEngine::issue_command(EDL *edl, int command, int wait_tracking, } } +void PlaybackEngine::refresh_frame(int change_type, EDL *edl) +{ + que->send_command(CURRENT_FRAME, change_type, edl, 1); +} + diff --git a/cinelerra-5.1/cinelerra/playbackengine.h b/cinelerra-5.1/cinelerra/playbackengine.h index 5d915877..2fd07167 100644 --- a/cinelerra-5.1/cinelerra/playbackengine.h +++ b/cinelerra-5.1/cinelerra/playbackengine.h @@ -84,6 +84,7 @@ public: void stop_playback(int wait); void issue_command(EDL *edl, int command, int wait_tracking, int use_inout, int update_refresh, int toggle_audio); + void refresh_frame(int change_type, EDL *edl); // Maintain caches through console changes CICache *audio_cache, *video_cache; diff --git a/cinelerra-5.1/cinelerra/preferencesthread.C b/cinelerra-5.1/cinelerra/preferencesthread.C index 3e4ac56f..9cca7fa5 100644 --- a/cinelerra-5.1/cinelerra/preferencesthread.C +++ b/cinelerra-5.1/cinelerra/preferencesthread.C @@ -317,10 +317,7 @@ int PreferencesThread::apply_settings() //printf("PreferencesThread::apply_settings 1\n"); // This doesn't stop and restart, only reloads the assets before // the next play command. - mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_ALL, - mwindow->edl, - 1); + mwindow->cwindow->refresh_frame(CHANGE_ALL, mwindow->edl); //printf("PreferencesThread::apply_settings 10\n"); } diff --git a/cinelerra-5.1/cinelerra/theme.C b/cinelerra-5.1/cinelerra/theme.C index a04d01fe..9ed31959 100644 --- a/cinelerra-5.1/cinelerra/theme.C +++ b/cinelerra-5.1/cinelerra/theme.C @@ -265,22 +265,44 @@ void Theme::build_menus() aspect_ratios.append(new BC_ListBoxItem("2.35:1")); aspect_ratios.append(new BC_ListBoxItem("2.66:1")); - frame_sizes.append(new BC_ListBoxItem("128x96")); - frame_sizes.append(new BC_ListBoxItem("160x120")); - frame_sizes.append(new BC_ListBoxItem("320x240")); - frame_sizes.append(new BC_ListBoxItem("360x240")); - frame_sizes.append(new BC_ListBoxItem("400x300")); - frame_sizes.append(new BC_ListBoxItem("640x400")); - frame_sizes.append(new BC_ListBoxItem("640x480")); - frame_sizes.append(new BC_ListBoxItem("720x480")); - frame_sizes.append(new BC_ListBoxItem("800x600")); - frame_sizes.append(new BC_ListBoxItem("1024x768")); - frame_sizes.append(new BC_ListBoxItem("1280x720")); - frame_sizes.append(new BC_ListBoxItem("1280x1024")); - frame_sizes.append(new BC_ListBoxItem("1600x1200")); - frame_sizes.append(new BC_ListBoxItem("1920x1080")); - frame_sizes.append(new BC_ListBoxItem("3840x2160")); - frame_sizes.append(new BC_ListBoxItem("4096x1720")); + frame_sizes.append(new BC_ListBoxItem("128x96 ")); + frame_sizes.append(new BC_ListBoxItem("160x120 ")); + frame_sizes.append(new BC_ListBoxItem("320x240 ")); + frame_sizes.append(new BC_ListBoxItem("360x240 ")); + frame_sizes.append(new BC_ListBoxItem("400x300 ")); + frame_sizes.append(new BC_ListBoxItem("640x360 nHD")); + frame_sizes.append(new BC_ListBoxItem("640x400 ")); + frame_sizes.append(new BC_ListBoxItem("640x480 VGA")); + frame_sizes.append(new BC_ListBoxItem("720x480 NTSC")); + frame_sizes.append(new BC_ListBoxItem("720x576 PAL")); + frame_sizes.append(new BC_ListBoxItem("768x432 ")); + frame_sizes.append(new BC_ListBoxItem("800x450 ")); + frame_sizes.append(new BC_ListBoxItem("800x600 SVGA")); + frame_sizes.append(new BC_ListBoxItem("896x504 ")); + frame_sizes.append(new BC_ListBoxItem("960x540 qHD")); + frame_sizes.append(new BC_ListBoxItem("1024x576 ")); + frame_sizes.append(new BC_ListBoxItem("1024x768 XGA")); + frame_sizes.append(new BC_ListBoxItem("1152x648 ")); + frame_sizes.append(new BC_ListBoxItem("1280x720 HD")); + frame_sizes.append(new BC_ListBoxItem("1280x1024 SXGA")); + frame_sizes.append(new BC_ListBoxItem("1366x768 WXGA")); + frame_sizes.append(new BC_ListBoxItem("1600x900 HD+")); + frame_sizes.append(new BC_ListBoxItem("1600x1200 UXGA")); + frame_sizes.append(new BC_ListBoxItem("1920x1080 Full HD")); + frame_sizes.append(new BC_ListBoxItem("2048x1152 ")); + frame_sizes.append(new BC_ListBoxItem("2304x1296 ")); + frame_sizes.append(new BC_ListBoxItem("2560x1440 QHD")); + frame_sizes.append(new BC_ListBoxItem("2880x1620 ")); + frame_sizes.append(new BC_ListBoxItem("3200x1800 QHD+")); + frame_sizes.append(new BC_ListBoxItem("3520x1980 ")); + frame_sizes.append(new BC_ListBoxItem("3840x2160 4K UHD")); + frame_sizes.append(new BC_ListBoxItem("4096x2304 Full 4K UHD")); + frame_sizes.append(new BC_ListBoxItem("4480x2520 ")); + frame_sizes.append(new BC_ListBoxItem("5120x2880 5K UHD")); + frame_sizes.append(new BC_ListBoxItem("5760x3240 ")); + frame_sizes.append(new BC_ListBoxItem("6400x3600 ")); + frame_sizes.append(new BC_ListBoxItem("7040x3960 ")); + frame_sizes.append(new BC_ListBoxItem("7680x4320 8K UHD")); sample_rates.append(new BC_ListBoxItem("8000")); sample_rates.append(new BC_ListBoxItem("16000")); diff --git a/cinelerra-5.1/cinelerra/vwindow.C b/cinelerra-5.1/cinelerra/vwindow.C index 717972a1..897f21ec 100644 --- a/cinelerra-5.1/cinelerra/vwindow.C +++ b/cinelerra-5.1/cinelerra/vwindow.C @@ -328,10 +328,7 @@ void VWindow::update_position(int change_type, { //printf("VWindow::update_position %d\n", __LINE__); //edl->dump(); - playback_engine->que->send_command(CURRENT_FRAME, - change_type, - edl, - 1); + playback_engine->refresh_frame(change_type, edl); double position = edl->local_session->get_selectionstart(1); if(lock_window) gui->lock_window("VWindow::update_position"); diff --git a/cinelerra-5.1/cinelerra/zwindow.C b/cinelerra-5.1/cinelerra/zwindow.C index 46e00a91..c970f22f 100644 --- a/cinelerra-5.1/cinelerra/zwindow.C +++ b/cinelerra-5.1/cinelerra/zwindow.C @@ -206,6 +206,7 @@ BC_Window* ZWindow::new_gui() void ZWindow::handle_done_event(int result) { + mwindow->del_mixer(this); } void ZWindow::handle_close_event(int result) { @@ -218,7 +219,7 @@ void ZWindow::change_source(EDL *edl) this->edl->remove_user(); this->edl = edl; if( edl != 0 ) { - zgui->playback_engine->que->send_command(CURRENT_FRAME, CHANGE_ALL, edl, 1); + zgui->playback_engine->refresh_frame(CHANGE_ALL, edl); } } @@ -252,17 +253,18 @@ void ZWindow::update_mixer_ids() void ZWindow::set_title(const char *tp) { + Mixer *mixer = mwindow->edl->mixers.get_mixer(idx); + if( mixer ) mixer->set_title(tp); char *cp = title, *ep = cp + sizeof(title)-1; cp += snprintf(title, ep-cp, _("Mixer %d"), idx); if( tp ) cp += snprintf(cp, ep-cp, ": %s", tp); - else tp = title; - Mixer *mixer = mwindow->edl->mixers.get_mixer(idx); - if( mixer ) mixer->set_title(title); + *cp = 0; } void ZWindow::reposition(int x, int y, int w, int h) { Mixer *mixer = mwindow->edl->mixers.get_mixer(idx); - if( mixer ) mixer->reposition(x, y, w, h); + if( !mixer ) return; + mixer->reposition(x, y, w, h); } diff --git a/cinelerra-5.1/cinelerra/zwindowgui.C b/cinelerra-5.1/cinelerra/zwindowgui.C index b374c2de..d28e3e9e 100644 --- a/cinelerra-5.1/cinelerra/zwindowgui.C +++ b/cinelerra-5.1/cinelerra/zwindowgui.C @@ -38,8 +38,8 @@ #include "zwindowgui.h" ZWindowGUI::ZWindowGUI(MWindow *mwindow, ZWindow *zwindow, Mixer *mixer) - : BC_Window(mixer->title, mixer->x, mixer->y, mixer->w, mixer->h, - 100, 100, 1, 1, 0) + : BC_Window(zwindow->title, mixer->x, mixer->y, mixer->w, mixer->h, + 100, 75, 1, 1, 0) { this->mwindow = mwindow; this->zwindow = zwindow; @@ -76,16 +76,13 @@ int ZWindowGUI::resize_event(int w, int h) BC_WindowBase::resize_event(w, h); return 1; } - int ZWindowGUI::translation_event() { - zwindow->reposition(get_x(), get_y(), get_w(), get_h()); - return 0; + return resize_event(get_w(),get_h()); } int ZWindowGUI::close_event() { - mwindow->del_mixer(zwindow); set_done(0); return 1; } diff --git a/cinelerra-5.1/configure.ac b/cinelerra-5.1/configure.ac index 3ec19dfd..4fe5c0f0 100644 --- a/cinelerra-5.1/configure.ac +++ b/cinelerra-5.1/configure.ac @@ -453,6 +453,8 @@ CHECK_LIB([fdk], [fdk-aac], [faacDecInit]) CHECK_HEADERS([fdk], [fdk headers], [fdk-aac/genericStds.h]) CHECK_LIB([jbig], [jbig], [jbg_dec_init]) CHECK_LIB([vdpau], [vdpau], [vdp_device_create_x11]) +CHECK_LIB([opus], [opus], [opus_multistream_decoder_create]) +CHECK_HEADERS([opus], [libopus headers], [opus/opus_multistream.h]) #if test "x$HAVE_mjpegtools" = "xyes"; then #CFG_CFLAGS+=" -I/usr/include/mjpegtools" @@ -710,6 +712,12 @@ if test "x$HAVE_DL" = "xyes"; then EXTRA_LIBS+=' -ldl' FFMPEG_EXTRA_CFG+=' --extra-ldflags="-ldl"' fi +if test "x$HAVE_opus" = "xyes"; then + EXTRA_LIBS+=' -lopus' + CFG_CFLAGS+=' -I/usr/include/opus' + FFMPEG_EXTRA_CFG+=' --enable-libopus' +fi + AC_SUBST(EXTRA_LIBS) AC_SUBST(FFMPEG_EXTRA_CFG) AC_SUBST(WANT_X264_HIDEPTH) @@ -836,3 +844,6 @@ fi if test "x$WANT_GIT_FFMPEG" != "xno"; then echo "ffmpeg.git := $WANT_GIT_FFMPEG" fi +if test "x$HAVE_opus" = "xyes"; then +echo 'ffmpeg.cflags+=" -I/usr/include/opus"' +fi diff --git a/cinelerra-5.1/guicast/vframe.C b/cinelerra-5.1/guicast/vframe.C index 1cfeb58b..eaa1f078 100644 --- a/cinelerra-5.1/guicast/vframe.C +++ b/cinelerra-5.1/guicast/vframe.C @@ -131,6 +131,7 @@ VFrame::VFrame(VFrame &frame) { reset_parameters(1); params = new BC_Hash; + use_shm = frame.use_shm; allocate_data(0, -1, 0, 0, 0, frame.w, frame.h, frame.color_model, frame.bytes_per_line); copy_from(&frame); @@ -504,7 +505,8 @@ int VFrame::allocate_data(unsigned char *data, int shmid, this->data = 0; int size = calculate_data_size(this->w, this->h, this->bytes_per_line, this->color_model); - if(BC_WindowBase::get_resources()->use_vframe_shm() && use_shm) { + if( use_shm && size >= SHM_MIN_SIZE && + BC_WindowBase::get_resources()->use_vframe_shm() ) { this->shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | 0777); if( this->shmid >= 0 ) { this->data = (unsigned char*)shmat(this->shmid, NULL, 0); @@ -520,7 +522,7 @@ int VFrame::allocate_data(unsigned char *data, int shmid, } } // Have to use malloc for libpng - if( !data ) { + if( !this->data ) { this->data = (unsigned char *)malloc(size); this->shmid = -1; } diff --git a/cinelerra-5.1/guicast/vframe.h b/cinelerra-5.1/guicast/vframe.h index 951e0364..45dbe11f 100644 --- a/cinelerra-5.1/guicast/vframe.h +++ b/cinelerra-5.1/guicast/vframe.h @@ -34,7 +34,7 @@ // Maximum number of prev or next effects to be pushed onto the stacks. #define MAX_STACK_ELEMENTS 255 - +#define SHM_MIN_SIZE 2048 // Scene graph for 3D models // Defined by the subclass diff --git a/cinelerra-5.1/picon/cinfinity/sc3_1427.png b/cinelerra-5.1/picon/cinfinity/sc3_1427.png index 4f31af97659f28e631c9bef3cf7c236a577bbba8..2866c7065a3411f76c1e62a101ed71461584d33b 100644 GIT binary patch delta 14136 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

u#2u@ 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 diff --git a/cinelerra-5.1/plugins/chromakey/chromakey.C b/cinelerra-5.1/plugins/chromakey/chromakey.C index 90934f3e..4eb39787 100644 --- a/cinelerra-5.1/plugins/chromakey/chromakey.C +++ b/cinelerra-5.1/plugins/chromakey/chromakey.C @@ -39,9 +39,13 @@ +ChromaKeyConfig::ChromaKeyConfig() +{ + reset(); +} +void ChromaKeyConfig::reset() -ChromaKeyConfig::ChromaKeyConfig() { red = 0.0; green = 0.0; @@ -147,6 +151,9 @@ void ChromaKeyWindow::create_objects() y += 30; add_subwindow(use_colorpicker = new ChromaKeyUseColorPicker(plugin, this, x1, y)); + y += use_colorpicker->get_h() + 10; + add_subwindow(new ChromaKeyReset(plugin, this, x, y)); + color_thread = new ChromaKeyColorThread(plugin, this); update_sample(); @@ -246,7 +253,6 @@ int ChromaKeySlope::handle_event() return 1; } - ChromaKeyUseValue::ChromaKeyUseValue(ChromaKey *plugin, int x, int y) : BC_CheckBox(x, y, plugin->config.use_value, _("Use value")) { @@ -259,6 +265,20 @@ int ChromaKeyUseValue::handle_event() return 1; } +ChromaKeyReset::ChromaKeyReset(ChromaKey *plugin, ChromaKeyWindow *gui, int x, int y) + : BC_GenericButton(x, y, _("Reset")) +{ + this->plugin = plugin; + this->gui = gui; +} + +int ChromaKeyReset::handle_event() +{ + plugin->config.reset(); + gui->update_gui(); + plugin->send_configure_change(); + return 1; +} ChromaKeyUseColorPicker::ChromaKeyUseColorPicker(ChromaKey *plugin, ChromaKeyWindow *gui, @@ -630,15 +650,20 @@ void ChromaKey::update_gui() { load_configuration(); thread->window->lock_window(); - ((ChromaKeyWindow*)thread->window)->threshold->update(config.threshold); - ((ChromaKeyWindow*)thread->window)->slope->update(config.slope); - ((ChromaKeyWindow*)thread->window)->use_value->update(config.use_value); - ((ChromaKeyWindow*)thread->window)->update_sample(); - + ((ChromaKeyWindow *)(thread->window))->update_gui(); thread->window->unlock_window(); } } +void ChromaKeyWindow::update_gui() +{ + ChromaKeyConfig &config = plugin->config; + threshold->update(config.threshold); + slope->update(config.slope); + use_value->update(config.use_value); + update_sample(); +} + int ChromaKey::handle_opengl() { #ifdef HAVE_GL diff --git a/cinelerra-5.1/plugins/chromakey/chromakey.h b/cinelerra-5.1/plugins/chromakey/chromakey.h index 8e1a1aaf..f282554f 100644 --- a/cinelerra-5.1/plugins/chromakey/chromakey.h +++ b/cinelerra-5.1/plugins/chromakey/chromakey.h @@ -39,7 +39,7 @@ class ChromaKeyConfig { public: ChromaKeyConfig(); - + void reset(); void copy_from(ChromaKeyConfig &src); int equivalent(ChromaKeyConfig &src); void interpolate(ChromaKeyConfig &prev, @@ -93,6 +93,15 @@ public: ChromaKey *plugin; }; +class ChromaKeyReset : public BC_GenericButton +{ +public: + ChromaKeyReset(ChromaKey *plugin, ChromaKeyWindow *gui, int x, int y); + int handle_event(); + ChromaKey *plugin; + ChromaKeyWindow *gui; +}; + class ChromaKeyUseColorPicker : public BC_GenericButton { public: @@ -120,6 +129,7 @@ public: ~ChromaKeyWindow(); void create_objects(); + void update_gui(); void update_sample(); void done_event(int result); @@ -128,6 +138,7 @@ public: ChromaKeyUseValue *use_value; ChromaKeyUseColorPicker *use_colorpicker; ChromaKeySlope *slope; + ChromaKeyReset *reset; BC_SubWindow *sample; ChromaKey *plugin; ChromaKeyColorThread *color_thread; diff --git a/cinelerra-5.1/plugins/chromakeyhsv/chromakey.C b/cinelerra-5.1/plugins/chromakeyhsv/chromakey.C index 5558606b..b0a09757 100644 --- a/cinelerra-5.1/plugins/chromakeyhsv/chromakey.C +++ b/cinelerra-5.1/plugins/chromakeyhsv/chromakey.C @@ -41,6 +41,12 @@ ChromaKeyConfig::ChromaKeyConfig () +{ + reset(); +} + +void ChromaKeyConfig::reset() + { red = 0.0; green = 1.0; @@ -187,6 +193,8 @@ ChromaKeyWindow::create_objects () add_subwindow (use_colorpicker = new ChromaKeyUseColorPicker (plugin, this, x, y)); y += use_colorpicker->get_h() + 10; + + add_subwindow (new ChromaKeyReset (plugin, this, x2+240, y)); add_subwindow (show_mask = new ChromaKeyShowMask (plugin, x2, y)); y += show_mask->get_h() + 5; @@ -465,6 +473,21 @@ ChromaKeyShowMask::handle_event () return 1; } +ChromaKeyReset::ChromaKeyReset (ChromaKeyHSV *plugin, ChromaKeyWindow *gui, int x, int y) + :BC_GenericButton(x, y, _("Reset")) +{ + this->plugin = plugin; + this->gui = gui; +} + +int ChromaKeyReset::handle_event () +{ + plugin->config.reset(); + gui->update_gui(); + plugin->send_configure_change(); + return 1; +} + ChromaKeyUseColorPicker::ChromaKeyUseColorPicker (ChromaKeyHSV * plugin, ChromaKeyWindow * gui, int x, int y) : BC_GenericButton (x, y, _ @@ -1003,22 +1026,27 @@ void ChromaKeyHSV::update_gui() load_configuration(); ChromaKeyWindow *window = (ChromaKeyWindow*)thread->window; window->lock_window(); - window->min_brightness->update(config.min_brightness); - window->max_brightness->update(config.max_brightness); - window->saturation->update(config.saturation); - window->min_saturation->update(config.min_saturation); - window->tolerance->update(config.tolerance); - window->in_slope->update(config.in_slope); - window->out_slope->update(config.out_slope); - window->alpha_offset->update(config.alpha_offset); - window->spill_threshold->update(config.spill_threshold); - window->spill_amount->update(config.spill_amount); - window->show_mask->update(config.show_mask); - window->update_sample(); + window->update_gui(); window->unlock_window(); } } +void ChromaKeyWindow::update_gui() +{ + ChromaKeyConfig &config = plugin->config; + min_brightness->update(config.min_brightness); + max_brightness->update(config.max_brightness); + saturation->update(config.saturation); + min_saturation->update(config.min_saturation); + tolerance->update(config.tolerance); + in_slope->update(config.in_slope); + out_slope->update(config.out_slope); + alpha_offset->update(config.alpha_offset); + spill_threshold->update(config.spill_threshold); + spill_amount->update(config.spill_amount); + show_mask->update(config.show_mask); + update_sample(); +} diff --git a/cinelerra-5.1/plugins/chromakeyhsv/chromakey.h b/cinelerra-5.1/plugins/chromakeyhsv/chromakey.h index 68fd8b3b..51bcbcf7 100644 --- a/cinelerra-5.1/plugins/chromakeyhsv/chromakey.h +++ b/cinelerra-5.1/plugins/chromakeyhsv/chromakey.h @@ -45,7 +45,7 @@ class ChromaKeyConfig { public: ChromaKeyConfig(); - + void reset(); void copy_from(ChromaKeyConfig &src); int equivalent(ChromaKeyConfig &src); void interpolate(ChromaKeyConfig &prev, @@ -90,6 +90,16 @@ public: ChromaKeyWindow *gui; }; +class ChromaKeyReset : public BC_GenericButton +{ +public: + ChromaKeyReset(ChromaKeyHSV *plugin, ChromaKeyWindow *gui, int x, int y); + int handle_event(); + ChromaKeyHSV *plugin; + ChromaKeyWindow *gui; +}; + + class ChromaKeyMinBrightness : public BC_FSlider { @@ -209,6 +219,7 @@ public: void create_objects(); void update_sample(); + void update_gui(); void done_event(int result); ChromaKeyColor *color; @@ -224,6 +235,7 @@ public: ChromaKeySpillThreshold *spill_threshold; ChromaKeySpillAmount *spill_amount; ChromaKeyShowMask *show_mask; + ChromaKeyReset *reset; BC_SubWindow *sample; ChromaKeyHSV *plugin; ChromaKeyColorThread *color_thread; diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-3.3.4.patch1 b/cinelerra-5.1/thirdparty/src/ffmpeg-3.3.4.patch1 index 295779d2..40d7eddc 100644 --- a/cinelerra-5.1/thirdparty/src/ffmpeg-3.3.4.patch1 +++ b/cinelerra-5.1/thirdparty/src/ffmpeg-3.3.4.patch1 @@ -1,6 +1,15 @@ diff -urN a/configure b/configure --- a/configure 2017-04-12 19:55:54.000000000 -0600 +++ b/configure 2017-04-16 16:12:23.518837543 -0600 +@@ -5812,7 +5812,7 @@ + { check_lib openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } || + die "ERROR: libopenjpeg not found"; } + enabled libopenmpt && require_pkg_config "libopenmpt >= 0.2.6557" libopenmpt/libopenmpt.h openmpt_module_create +-enabled libopus && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create ++enabled libopus && use_pkg_config opus opus_multistream.h opus_multistream_decoder_create + enabled libpulse && require_pkg_config libpulse pulse/pulseaudio.h pa_context_new + enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket + enabled librubberband && require_pkg_config "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new @@ -5871,7 +5871,9 @@ die "ERROR: libx264 must be installed and version must be >= 0.118."; } && { check_cpp_condition x264.h "X264_MPEG2" && -- 2.26.2