From 0791a73a049b6cd531686550a5101bea7835f749 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Sat, 10 Dec 2022 03:54:23 +1100 Subject: [PATCH] gstplugin: Handle static plugins in gst_plugin_load_by_name() gst_plugin_load_by_name() assumed a plugin has a filename, which isn't true for static plugins, leading to criticals. If a plugin is already loaded, just return the loaded plugin, which makes it work for static plugins as well as saving a moment for already-loaded dynamic plugins. Add locking in gst_plugin_is_loaded(), as a plugin may be still being loaded in another thread. Part-of: --- subprojects/gstreamer/gst/gstplugin.c | 41 +++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/subprojects/gstreamer/gst/gstplugin.c b/subprojects/gstreamer/gst/gstplugin.c index ab2d708..ced754c 100644 --- a/subprojects/gstreamer/gst/gstplugin.c +++ b/subprojects/gstreamer/gst/gstplugin.c @@ -1183,8 +1183,16 @@ gboolean gst_plugin_is_loaded (GstPlugin * plugin) { g_return_val_if_fail (plugin != NULL, FALSE); + gboolean ret; + + if (plugin->filename == NULL) + return TRUE; /* Static plugin */ + + g_mutex_lock (&gst_plugin_loading_mutex); + ret = (plugin->module != NULL); + g_mutex_unlock (&gst_plugin_loading_mutex); - return (plugin->module != NULL || plugin->filename == NULL); + return ret; } /** @@ -1406,22 +1414,27 @@ gst_plugin_load_by_name (const gchar * name) GST_DEBUG ("looking up plugin %s in default registry", name); plugin = gst_registry_find_plugin (gst_registry_get (), name); - if (plugin) { - GST_DEBUG ("loading plugin %s from file %s", name, plugin->filename); - newplugin = gst_plugin_load_file (plugin->filename, &error); - gst_object_unref (plugin); + if (plugin == NULL) { + GST_DEBUG ("Could not find plugin %s in registry", name); + return NULL; + } - if (!newplugin) { - GST_WARNING ("load_plugin error: %s", error->message); - g_error_free (error); - return NULL; - } - /* newplugin was reffed by load_file */ - return newplugin; + if (gst_plugin_is_loaded (plugin)) { + GST_DEBUG ("plugin %s already loaded", name); + return plugin; } - GST_DEBUG ("Could not find plugin %s in registry", name); - return NULL; + GST_DEBUG ("loading plugin %s from file %s", name, plugin->filename); + newplugin = gst_plugin_load_file (plugin->filename, &error); + gst_object_unref (plugin); + + if (!newplugin) { + GST_WARNING ("load_plugin error: %s", error->message); + g_error_free (error); + return NULL; + } + /* newplugin was reffed by load_file */ + return newplugin; } /** -- 2.7.4