gstelementfactory: Fix missing features in case a feature moves to another filename

In case a plugin filename was renamed with the plugin being in the registry cache
the features were not loaded after the rename:

1) Cache of old/gone filename was loaded, features added
2) New filename was loaded, features where not added because
   they were already found in the registry.
3) In the end stale cache entries for files which are no longer there
   are removed, including the wanted features.
4) The cache gets updated without the features.

Fix this by also checking at (2) that the found feature is from the loaded plugin
and not from some stale cache entry.

This affected directsoundsink where libgstdirectsoundsink.dll was renamed
to libgstdirectsound.dll, losing the directsoundsink element in the process.

Fixes #290

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/102>
This commit is contained in:
Christoph Reiter 2018-05-02 13:05:21 +02:00 committed by GStreamer Merge Bot
parent b1a171f912
commit 3cfda6d6eb

View file

@ -219,7 +219,7 @@ gst_element_register (GstPlugin * plugin, const gchar * name, guint rank,
* features are removed and readded. * features are removed and readded.
*/ */
existing_feature = gst_registry_lookup_feature (registry, name); existing_feature = gst_registry_lookup_feature (registry, name);
if (existing_feature) { if (existing_feature && existing_feature->plugin == plugin) {
GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)", GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)",
existing_feature, name); existing_feature, name);
factory = GST_ELEMENT_FACTORY_CAST (existing_feature); factory = GST_ELEMENT_FACTORY_CAST (existing_feature);
@ -228,6 +228,8 @@ gst_element_register (GstPlugin * plugin, const gchar * name, guint rank,
g_type_set_qdata (type, __gst_elementclass_factory, factory); g_type_set_qdata (type, __gst_elementclass_factory, factory);
gst_object_unref (existing_feature); gst_object_unref (existing_feature);
return TRUE; return TRUE;
} else if (existing_feature) {
gst_object_unref (existing_feature);
} }
factory = g_object_new (GST_TYPE_ELEMENT_FACTORY, NULL); factory = g_object_new (GST_TYPE_ELEMENT_FACTORY, NULL);