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: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3552>
This commit is contained in:
Jan Schmidt 2022-12-10 03:54:23 +11:00 committed by GStreamer Marge Bot
parent cbab7ffefb
commit 0791a73a04

View file

@ -1183,8 +1183,16 @@ gboolean
gst_plugin_is_loaded (GstPlugin * plugin) gst_plugin_is_loaded (GstPlugin * plugin)
{ {
g_return_val_if_fail (plugin != NULL, FALSE); g_return_val_if_fail (plugin != NULL, FALSE);
gboolean ret;
return (plugin->module != NULL || plugin->filename == NULL); 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 ret;
} }
/** /**
@ -1406,7 +1414,16 @@ gst_plugin_load_by_name (const gchar * name)
GST_DEBUG ("looking up plugin %s in default registry", name); GST_DEBUG ("looking up plugin %s in default registry", name);
plugin = gst_registry_find_plugin (gst_registry_get (), name); plugin = gst_registry_find_plugin (gst_registry_get (), name);
if (plugin) { if (plugin == NULL) {
GST_DEBUG ("Could not find plugin %s in registry", name);
return NULL;
}
if (gst_plugin_is_loaded (plugin)) {
GST_DEBUG ("plugin %s already loaded", name);
return plugin;
}
GST_DEBUG ("loading plugin %s from file %s", name, plugin->filename); GST_DEBUG ("loading plugin %s from file %s", name, plugin->filename);
newplugin = gst_plugin_load_file (plugin->filename, &error); newplugin = gst_plugin_load_file (plugin->filename, &error);
gst_object_unref (plugin); gst_object_unref (plugin);
@ -1420,10 +1437,6 @@ gst_plugin_load_by_name (const gchar * name)
return newplugin; return newplugin;
} }
GST_DEBUG ("Could not find plugin %s in registry", name);
return NULL;
}
/** /**
* gst_plugin_load: * gst_plugin_load:
* @plugin: (transfer none): plugin to load * @plugin: (transfer none): plugin to load