device: Enforce that elements created by gst_device_create_element() are floating
authorSebastian Dröge <sebastian@centricular.com>
Thu, 12 Sep 2019 07:08:39 +0000 (10:08 +0300)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 14 Sep 2019 23:26:54 +0000 (00:26 +0100)
Bindings might have a hard time making sure that the reference is indeed
still floating after returning here.

See https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/444

gst/gstdevice.c

index 6040782..64f5ba5 100644 (file)
@@ -205,13 +205,20 @@ GstElement *
 gst_device_create_element (GstDevice * device, const gchar * name)
 {
   GstDeviceClass *klass = GST_DEVICE_GET_CLASS (device);
+  GstElement *element = NULL;
 
   g_return_val_if_fail (GST_IS_DEVICE (device), NULL);
 
   if (klass->create_element)
-    return klass->create_element (device, name);
-  else
-    return NULL;
+    element = klass->create_element (device, name);
+
+  /* Ensure that the reference is floating. Bindings might have a hard time
+   * making sure that the reference is indeed still floating after returning
+   * here */
+  if (element)
+    g_object_force_floating ((GObject *) element);
+
+  return element;
 }
 
 /**