fix segv for plugin render_gui when plugin moved up/dn, opencv build fixes, opts...
authorGood Guy <[email protected]>
Sun, 3 Nov 2019 01:12:12 +0000 (19:12 -0600)
committerGood Guy <[email protected]>
Sun, 3 Nov 2019 01:12:12 +0000 (19:12 -0600)
cinelerra-5.1/cinelerra/mwindow.C
cinelerra-5.1/cinelerra/mwindow.h
cinelerra-5.1/cinelerra/plugin.C
cinelerra-5.1/cinelerra/plugin.h
cinelerra-5.1/cinelerra/pluginserver.C
cinelerra-5.1/cinelerra/pluginserver.h
cinelerra-5.1/cinelerra/pluginserver.inc
cinelerra-5.1/ffmpeg/video/dvd.dvd
cinelerra-5.1/ffmpeg/video/huffyuv_screencapture.mov
cinelerra-5.1/ffmpeg/video/raw.dvd
cinelerra-5.1/opencv_build

index b074950fedebadebe8415114cd2985a2e4593221..e4e6f8370f243202d344d00d6292e37fda23d0ff 100644 (file)
@@ -2635,7 +2635,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<PluginServer*>;
+       plugin_guis = new PluginGUIs(this);
        dead_plugins = new ArrayList<PluginServer*>;
        keyframe_threads = new ArrayList<KeyFrameThread*>;
 
@@ -3171,9 +3171,6 @@ void MWindow::show_keyframe_gui(Plugin *plugin)
 }
 
 
-
-
-
 void MWindow::show_plugin(Plugin *plugin)
 {
        int done = 0;
@@ -3429,7 +3426,6 @@ void MWindow::update_plugin_guis(int do_keyframe_guis)
                                }
 
                                if(!got_it) plugin->show = 0;
-
                                plugin = (Plugin*)plugin->next;
                        }
                }
@@ -3445,45 +3441,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();
 }
 
index 6eb384cec586e71c38afed90a7e20c0767f1f515..564152125313c695853b5bbc1c066867e5674cf9 100644 (file)
@@ -599,7 +599,7 @@ public:
        static ArrayList<PluginServer*> *plugindb;
 // Currently visible plugins
        int64_t plugin_visibility;
-       ArrayList<PluginServer*> *plugin_guis;
+       PluginGUIs *plugin_guis;
 // GUI Plugins to delete
        ArrayList<PluginServer*> *dead_plugins;
 // Keyframe editors
index 5890808b5617010cb93fff45858fb0e2765fcd86..e37e930f9342802d3d678bacc63efdd0482cf5c6 100644 (file)
@@ -49,6 +49,7 @@ Plugin::Plugin(EDL *edl, Track *track, const char *title)
        out = 1;
        show = 0;
        on = 1;
+       gui_id = -1;
        keyframes = new KeyFrames(edl, track);
        keyframes->create_objects();
 }
@@ -66,6 +67,7 @@ Plugin::Plugin(EDL *edl, PluginSet *plugin_set, const char *title)
        out = 1;
        show = 0;
        on = 1;
+       gui_id = -1;
        keyframes = new KeyFrames(edl, track);
        keyframes->create_objects();
 }
@@ -137,6 +139,7 @@ void Plugin::copy_base(Edit *edit)
        this->out = plugin->out;
        this->show = plugin->show;
        this->on = plugin->on;
+       this->gui_id = plugin->gui_id;
 // Should reconfigure this based on where the first track is now.
        this->shared_location = plugin->shared_location;
        strcpy(this->title, plugin->title);
@@ -295,19 +298,6 @@ int Plugin::identical(Plugin *that)
                        ((KeyFrame*)that->keyframes->default_auto)));
 }
 
-int Plugin::identical_location(Plugin *that)
-{
-       if(!plugin_set || !plugin_set->track) return 0;
-       if(!that->plugin_set || !that->plugin_set->track) return 0;
-
-       if(plugin_set->track->number_of() == that->plugin_set->track->number_of() &&
-               plugin_set->get_number() == that->plugin_set->get_number() &&
-               startproject == that->startproject) return 1;
-
-       return 0;
-
-}
-
 int Plugin::keyframe_exists(KeyFrame *ptr)
 {
        for(KeyFrame *current = (KeyFrame*)keyframes->first;
@@ -594,8 +584,8 @@ void Plugin::shift(int64_t difference)
 
 void Plugin::dump(FILE *fp)
 {
-       fprintf(fp,"    PLUGIN: type=%d title=\"%s\" on=%d track=%d plugin=%d\n",
-               plugin_type, title, on, shared_location.module, shared_location.plugin);
+       fprintf(fp,"    PLUGIN: type=%d title=\"%s\" on=%d track=%d plugin=%d gui_id=%d\n",
+               plugin_type, title, on, shared_location.module, shared_location.plugin, gui_id);
        fprintf(fp,"    startproject %jd length %jd\n", startproject, length);
 
        keyframes->dump(fp);
index 279a7de68f72df3e9200f752b33427e381123a22..2a5e696cf5c525e9c9dadaf40c52b41d27ba9b01 100644 (file)
@@ -84,9 +84,6 @@ public:
 // Called by == operators, Edit::equivalent output
 // to test title and keyframe of transition.
        virtual int identical(Plugin *that);
-// Called by render_gui.  Only need the track, position, and pluginset
-// to determine a corresponding GUI.
-       int identical_location(Plugin *that);
        virtual void synchronize_params(Edit *edit);
 // Used by Edits::insert_edits and Plugin::shift to shift plugin keyframes
        void shift_keyframes(int64_t position);
@@ -140,7 +137,7 @@ public:
        int plugin_type;
 // In and out aren't used anymore.
        int in, out;
-       int show, on;
+       int show, on, gui_id;
        PluginSet *plugin_set;
 
 // Data for the plugin is stored here.  Default keyframe always exists.
index f3240ceae49dd877b15dba5f045bfb40b450dd80..68724f278e669cddf0c483984ec568be29e21885 100644 (file)
@@ -80,6 +80,7 @@ void PluginServer::init()
        modules = new ArrayList<Module*>;
        nodes = new ArrayList<VirtualNode*>;
        tip = 0;
+       gui_id = -1;
 }
 
 PluginServer::PluginServer()
@@ -641,6 +642,32 @@ void PluginServer::process_buffer(Samples **buffer,
 }
 
 
+PluginGUIs::PluginGUIs(MWindow *mwindow)
+{
+       this->mwindow = mwindow;
+       this->next_id = 0;
+}
+PluginGUIs::~PluginGUIs()
+{
+}
+
+void PluginGUIs::append(PluginServer *server)
+{
+       server->gui_id = next_id++;
+       ArrayList<PluginServer*>::append(server);
+}
+
+PluginServer *PluginGUIs::gui_server(int gui_id)
+{
+       for( int i=0; i<size(); ++i ) {
+               PluginServer *plugin_server = get(i);
+               if( plugin_server->gui_id == gui_id )
+                       return plugin_server;
+       }
+       return 0;
+}
+
+
 void PluginServer::send_render_gui(void *data)
 {
 //printf("PluginServer::send_render_gui 1 %p\n", attachmentpoint);
@@ -929,8 +956,11 @@ void PluginServer::raise_window()
 void PluginServer::show_gui()
 {
        if(!plugin_open) return;
-       if(plugin) client->total_len = plugin->length;
-       if(plugin) client->source_start = plugin->startproject;
+       if( plugin ) {
+               plugin->gui_id = gui_id;
+               client->total_len = plugin->length;
+               client->source_start = plugin->startproject;
+       }
        if(video)
        {
                client->source_position = Units::to_int64(
@@ -952,6 +982,7 @@ void PluginServer::show_gui()
 void PluginServer::hide_gui()
 {
        if(!plugin_open) return;
+       if( plugin ) plugin->gui_id = -1;
        if(client->defaults) client->save_defaults();
        client->hide_gui();
 }
index 862e22eb41fe86ab388221c46cdad7428c3bfa12..5be37a4bd7fa750ab9b4f730550fcd26611e4a88 100644 (file)
@@ -74,6 +74,18 @@ public:
        ~PluginObj() { if( dlobj ) unload(dlobj); }
 };
 
+class PluginGUIs : public ArrayList<PluginServer*>
+{
+       int next_id;
+       MWindow *mwindow;
+public:
+       PluginGUIs(MWindow *mwindow);
+       ~PluginGUIs();
+
+       void append(PluginServer *server);
+       PluginServer *gui_server(int gui_id);
+};
+
 class PluginServer
 {
        PluginObj *plugin_obj;
@@ -419,7 +431,7 @@ public:
        EDL *edl;
        Preferences *preferences;
        MenuEffectPrompt *prompt;
-       int gui_on;
+       int gui_on, gui_id;
 
        VFrame *temp_frame;
 
index 8a93cca0e45ed737c4a5cba6f90881b458b77876..a0613770f1b3699410666c583749ce4a3a9288e9 100644 (file)
@@ -23,6 +23,7 @@
 #define PLUGINSERVER_INC
 
 class PluginObj;
+class PluginGUIs;
 class PluginServer;
 
 #define PLUGIN_FFMPEG_ID 0
index a5a9ceec80b43b4e45f060e10b12679c94103f28..c0296bff6216c9788d92b93925865513b77ffe70 100644 (file)
Binary files a/cinelerra-5.1/ffmpeg/video/dvd.dvd and b/cinelerra-5.1/ffmpeg/video/dvd.dvd differ
index b0f201d79318052981f9ab4cc2c9030d501d3cf4..ec4951c78b2bfd6ced169bf14fbd71d155af038e 100644 (file)
@@ -1,5 +1,4 @@
 mov huffyuv
 #probesize=100M
 #thread_queue_size=512
-#pix_fmt=bgra
 pixel_format=bgra
index a86f0769a606fcb1c16a045574eaa59190c41fd7..f5eeca9567d6ca6052085aa0b4988e6948bb9f38 100644 (file)
Binary files a/cinelerra-5.1/ffmpeg/video/raw.dvd and b/cinelerra-5.1/ffmpeg/video/raw.dvd differ
index 20d6ea167b53de0cdb662ad71481fe9543ee71c8..68771bc60f7160d576bdc3521a35fa58ee3ac8b0 100644 (file)
@@ -47,7 +47,7 @@ cpus:=$(shell grep -c "^proc" /proc/cpuinfo)
 jobs:=-j$(shell echo $$(($(cpus) + $(cpus)/2 +2)))
 
 #opencv4 breaks SIFT/SURF findobj
-#CFLAGS += -I$(opencv_prefix)/include/opencv4
+CFLAGS += -I$(opencv_prefix)/include/opencv4
 CFLAGS += -I$(opencv_prefix)/include
 
 ifeq ($(src),git)
@@ -87,7 +87,7 @@ $(opencv)/build: $(opencv).src
 LFLAGS += -Wl,--start-group
 LFLAGS += $(shell find $(opencv_prefix)/lib* -name "libopencv_*.a" 2> /dev/null)
 #opencv4 breaks SIFT/SURF findobj
-#LFLAGS += $(shell find $(opencv_prefix)/lib64/opencv4/3rdparty/lib* -name "lib*.a" 2> /dev/null)
+LFLAGS += $(shell find $(opencv_prefix)/lib64/opencv4/3rdparty/lib* -name "lib*.a" 2> /dev/null)
 LFLAGS += $(shell find $(opencv_prefix)/share/OpenCV/3rdparty/lib* -name "lib*.a" 2> /dev/null)
 LFLAGS += -Wl,--end-group
 else ifeq ($(bld),dyn)
@@ -106,7 +106,7 @@ $(opencv)/build: $(opencv).src
   -DOPENCV_EXTRA_MODULES_PATH="$(opencv)_contrib/modules/"
 
 SYSLIB := $(lastword $(wildcard /usr/lib /usrlib32 /usr/lib64))
-CVLIBS := $(dir (shell find $(opencv_prefix) -name libopencv_core.a))
+CVLIBS := $(dir $(shell find $(opencv_prefix) -name libopencv_core.so))
 LFLAGS += -L$(CVLIBS) $(patsubst $(CVLIBS)/lib%.so,-l%,$(wildcard $(CVLIBS)/libopencv_*.so))
 LFLAGS += $(patsubst $(SYSLIB)/lib%.so,-l%,$(wildcard $(SYSLIB)/lib{Half,Imath,Ilm,Iex}*.so))
 static_libs :=
@@ -119,6 +119,7 @@ LFLAGS += $(patsubst $(SYSLIB)/lib%.so,-l%,$(wildcard $(SYSLIB)/libopencv_*.so))
 LFLAGS += $(patsubst $(SYSLIB)/lib%.so,-l%,$(wildcard $(SYSLIB)/lib{Half,Imath,Ilm,Iex}*.so))
 static_libs :=
 static_incs :=
+CFLAGS += -I/usr/include/opencv4
 else
 $(error bld not sta/dyn/sys)
 endif