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: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3552>
gst_plugin_is_loaded (GstPlugin * plugin)
{
g_return_val_if_fail (plugin != NULL, FALSE);
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);
GST_DEBUG ("looking up plugin %s in default registry", name);
plugin = gst_registry_find_plugin (gst_registry_get (), 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;