DeviceProvider: Rename from DeviceMonitor
authorOlivier Crête <olivier.crete@collabora.com>
Thu, 26 Jun 2014 18:28:09 +0000 (14:28 -0400)
committerOlivier Crête <olivier.crete@collabora.com>
Thu, 26 Jun 2014 18:45:30 +0000 (14:45 -0400)
25 files changed:
docs/gst/gstreamer-docs.sgml
docs/gst/gstreamer-sections.txt
docs/plugins/gstreamer-plugins.hierarchy
gst/Makefile.am
gst/gst.h
gst/gst_private.h
gst/gstdevice.c
gst/gstdevicemonitor.c [deleted file]
gst/gstdevicemonitor.h [deleted file]
gst/gstdevicemonitorfactory.c [deleted file]
gst/gstdevicemonitorfactory.h [deleted file]
gst/gstdeviceprovider.c [new file with mode: 0644]
gst/gstdeviceprovider.h [new file with mode: 0644]
gst/gstdeviceproviderfactory.c [new file with mode: 0644]
gst/gstdeviceproviderfactory.h [new file with mode: 0644]
gst/gstglobaldevicemonitor.c
gst/gstglobaldevicemonitor.h
gst/gstmessage.c
gst/gstmessage.h
gst/gstregistry.c
gst/gstregistrybinary.c
gst/gstregistrychunks.c
gst/gstregistrychunks.h
tools/gst-inspect.c
win32/common/libgstreamer.def

index c3b38fbaae348de833b7da28208d78a77454f2c9..e73ac6ed8fe2ce6070c3a9023eb31ab70c39dfcd 100644 (file)
@@ -117,10 +117,10 @@ Windows.  It is released under the GNU Library General Public License
 
   <chapter id="gstreamer-device-probing">
     <title>GStreamer Device Discovery and Device Probing</title>
-    <xi:include href="xml/gstdevice.xml" />
-    <xi:include href="xml/gstdevicemonitor.xml" />
-    <xi:include href="xml/gstdevicemonitorfactory.xml" />
     <xi:include href="xml/gstglobaldevicemonitor.xml" />
+    <xi:include href="xml/gstdevice.xml" />
+    <xi:include href="xml/gstdeviceprovider.xml" />
+    <xi:include href="xml/gstdeviceproviderfactory.xml" />
   </chapter>
 
   <chapter id="gstreamer-support">
index 60f84feea65b7717fd5f4941ec8ff30e2f29de14..f471c3f9953f734f2bc48266e0be0599d286a1d6 100644 (file)
@@ -3353,61 +3353,61 @@ gst_device_get_type
 </SECTION>
 
 <SECTION>
-<FILE>gstdevicemonitor</FILE>
-<TITLE>GstDeviceMonitor</TITLE>
-GstDeviceMonitor
-GstDeviceMonitorClass
-gst_device_monitor_can_monitor
-gst_device_monitor_class_add_metadata
-gst_device_monitor_class_add_static_metadata
-gst_device_monitor_class_get_metadata
-gst_device_monitor_class_set_metadata
-gst_device_monitor_class_set_static_metadata
-gst_device_monitor_device_add
-gst_device_monitor_device_remove
-gst_device_monitor_get_bus
-gst_device_monitor_get_devices
-gst_device_monitor_get_factory
-gst_device_monitor_register
-gst_device_monitor_start
-gst_device_monitor_stop
+<FILE>gstdeviceprovider</FILE>
+<TITLE>GstDeviceProvider</TITLE>
+GstDeviceProvider
+GstDeviceProviderClass
+gst_device_provider_can_monitor
+gst_device_provider_class_add_metadata
+gst_device_provider_class_add_static_metadata
+gst_device_provider_class_get_metadata
+gst_device_provider_class_set_metadata
+gst_device_provider_class_set_static_metadata
+gst_device_provider_device_add
+gst_device_provider_device_remove
+gst_device_provider_get_bus
+gst_device_provider_get_devices
+gst_device_provider_get_factory
+gst_device_provider_register
+gst_device_provider_start
+gst_device_provider_stop
 
 <SUBSECTION Standard>
 GstDevicePrivate
-GST_DEVICE_MONITOR
-GST_DEVICE_MONITOR_CAST
-GST_DEVICE_MONITOR_CLASS
-GST_DEVICE_MONITOR_GET_CLASS
-GST_IS_DEVICE_MONITOR
-GST_IS_DEVICE_MONITOR_CLASS
-GST_TYPE_DEVICE_MONITOR
-gst_device_monitor_get_type
+GST_DEVICE_PROVIDER
+GST_DEVICE_PROVIDER_CAST
+GST_DEVICE_PROVIDER_CLASS
+GST_DEVICE_PROVIDER_GET_CLASS
+GST_IS_DEVICE_PROVIDER
+GST_IS_DEVICE_PROVIDER_CLASS
+GST_TYPE_DEVICE_PROVIDER
+gst_device_provider_get_type
 </SECTION>
 
 <SECTION>
-<FILE>gstdevicemonitorfactory</FILE>
-<TITLE>GstDeviceMonitorFactory</TITLE>
-GstDeviceMonitorFactory
-GstDeviceMonitorFactoryClass
-gst_device_monitor_factory_find
-gst_device_monitor_factory_get
-gst_device_monitor_factory_get_by_name
-gst_device_monitor_factory_get_device_monitor_type
-gst_device_monitor_factory_get_metadata
-gst_device_monitor_factory_get_metadata_keys
-gst_device_monitor_factory_has_classes
-gst_device_monitor_factory_has_classesv
-gst_device_monitor_factory_list_get_device_monitors
+<FILE>gstdeviceproviderfactory</FILE>
+<TITLE>GstDeviceProviderFactory</TITLE>
+GstDeviceProviderFactory
+GstDeviceProviderFactoryClass
+gst_device_provider_factory_find
+gst_device_provider_factory_get
+gst_device_provider_factory_get_by_name
+gst_device_provider_factory_get_device_provider_type
+gst_device_provider_factory_get_metadata
+gst_device_provider_factory_get_metadata_keys
+gst_device_provider_factory_has_classes
+gst_device_provider_factory_has_classesv
+gst_device_provider_factory_list_get_device_providers
 
 <SUBSECTION Standard>
-GstDeviceMonitorPrivate
-GST_DEVICE_MONITOR_FACTORY
-GST_DEVICE_MONITOR_FACTORY_CAST
-GST_DEVICE_MONITOR_FACTORY_CLASS
-GST_TYPE_DEVICE_MONITOR_FACTORY
-GST_IS_DEVICE_MONITOR_FACTORY
-GST_IS_DEVICE_MONITOR_FACTORY_CLASS
-gst_device_monitor_factory_get_type
+GstDeviceProviderPrivate
+GST_DEVICE_PROVIDER_FACTORY
+GST_DEVICE_PROVIDER_FACTORY_CAST
+GST_DEVICE_PROVIDER_FACTORY_CLASS
+GST_TYPE_DEVICE_PROVIDER_FACTORY
+GST_IS_DEVICE_PROVIDER_FACTORY
+GST_IS_DEVICE_PROVIDER_FACTORY_CLASS
+gst_device_provider_factory_get_type
 </SECTION>
 
 <SECTION>
index 9195eb1c8d2548d8f4b2489d97862652c0be9143..c65606ea0586b64e24961e2f1207816ec25c9ea1 100644 (file)
@@ -36,7 +36,7 @@ GObject
       GstPadTemplate
       GstPlugin
       GstPluginFeature
-        GstDeviceMonitorFactory
+        GstDeviceProviderFactory
         GstElementFactory
         GstTypeFindFactory
       GstRegistry
index 86d226e121cc274825f645c71327501a2f9ad32b..ffab2339f24e2bd3554148a61ce78c638e48bb7d 100644 (file)
@@ -72,8 +72,8 @@ libgstreamer_@GST_API_VERSION@_la_SOURCES = \
        gstdatetime.c           \
        gstdebugutils.c         \
        gstdevice.c             \
-       gstdevicemonitor.c      \
-       gstdevicemonitorfactory.c \
+       gstdeviceprovider.c     \
+       gstdeviceproviderfactory.c \
        gstelement.c            \
        gstelementfactory.c     \
        gsterror.c              \
@@ -177,8 +177,8 @@ gst_headers =                       \
        gstelement.h            \
        gstelementmetadata.h    \
        gstdevice.h             \
-       gstdevicemonitor.h      \
-       gstdevicemonitorfactory.h \
+       gstdeviceprovider.h     \
+       gstdeviceproviderfactory.h \
        gstelementfactory.h     \
        gsterror.h              \
        gstevent.h              \
index 9b20ba15d03181abe6143266470539b60e11f37c..07c629117ec1fc366e7575365a56e63528e7f70e 100644 (file)
--- a/gst/gst.h
+++ b/gst/gst.h
@@ -43,7 +43,7 @@
 #include <gst/gstdatetime.h>
 #include <gst/gstdebugutils.h>
 #include <gst/gstdevice.h>
-#include <gst/gstdevicemonitor.h>
+#include <gst/gstdeviceprovider.h>
 #include <gst/gstelement.h>
 #include <gst/gstelementmetadata.h>
 #include <gst/gsterror.h>
index e85d5c5f92efdfb6eb59bfd9578babd19caf65ff..b25707ce16e1c5ba4dbacfef3c5914658e284eec 100644 (file)
@@ -54,8 +54,8 @@ extern const char             g_log_domain_gstreamer[];
 /* for GstElement */
 #include "gstelement.h"
 
-/* for GstDeviceMonitor */
-#include "gstdevicemonitor.h"
+/* for GstDeviceProvider */
+#include "gstdeviceprovider.h"
 
 /* for GstToc */
 #include "gsttoc.h"
@@ -399,19 +399,19 @@ struct _GstElementFactoryClass {
   gpointer _gst_reserved[GST_PADDING];
 };
 
-struct _GstDeviceMonitorFactory {
+struct _GstDeviceProviderFactory {
   GstPluginFeature           feature;
   /* <private> */
 
   GType                      type;              /* unique GType the device factory or 0 if not loaded */
 
-  volatile GstDeviceMonitor *monitor;
+  volatile GstDeviceProvider *provider;
   gpointer                   metadata;
 
   gpointer _gst_reserved[GST_PADDING];
 };
 
-struct _GstDeviceMonitorFactoryClass {
+struct _GstDeviceProviderFactoryClass {
   GstPluginFeatureClass         parent;
   /* <private> */
 
index 9119ba90bb645137a0f2ab2de4e614825c830250..9982509cb066657c328e925c60bff0eff2885bc9 100644 (file)
 /**
  * SECTION:gstdevice
  * @short_description: Object representing a device
- * @see_also: #GstDeviceMonitor
+ * @see_also: #GstDeviceProvider
  *
  * #GstDevice are objects representing a device, they contain
  * relevant metadata about the device, such as its class and the #GstCaps
  * representing the media types it can produce or handle.
  *
- * #GstDevice are created by #GstDeviceMonitor objects which can be
+ * #GstDevice are created by #GstDeviceProvider objects which can be
  * aggregated by #GstGlobalDeviceMonitor objects.
  *
  * Since: 1.4
@@ -239,7 +239,7 @@ gst_device_get_display_name (GstDevice * device)
  *
  * Gets the "class" of a device. This is a "/" separated list of
  * classes that represent this device. They are a subset of the
- * classes of the #GstDeviceMonitor that produced this device.
+ * classes of the #GstDeviceProvider that produced this device.
  *
  * Returns: The device class. Free with g_free() after use.
  *
diff --git a/gst/gstdevicemonitor.c b/gst/gstdevicemonitor.c
deleted file mode 100644 (file)
index 6fabe11..0000000
+++ /dev/null
@@ -1,587 +0,0 @@
-/* GStreamer
- * Copyright (C) 2012 Olivier Crete <olivier.crete@collabora.com>
- *
- * gstdevicemonitor.c: Device probing and monitoring
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/**
- * SECTION:gstdevicemonitor
- * @short_description: A device monitor and prober
- * @see_also: #GstDevice, #GstGlobalDeviceMonitor
- *
- * A #GstDeviceMonitor subclass is provided by a plugin that handles devices
- * if there is a way to programatically list connected devices. It can also
- * optionally provide updates to the list of connected devices.
- *
- * Each #GstDeviceMonitor subclass is a singleton, a plugin should
- * normally provide a single subclass for all devices.
- *
- * Applications would normally use a #GstGlobalDeviceMonitor to monitor devices
- * from all revelant monitors.
- *
- * Since: 1.4
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "gst_private.h"
-
-#include "gstdevicemonitor.h"
-
-#include "gstelementmetadata.h"
-#include "gstquark.h"
-
-struct _GstDeviceMonitorPrivate
-{
-  GstBus *bus;
-
-  GMutex start_lock;
-
-  gboolean started_count;
-};
-
-/* this is used in gstelementfactory.c:gst_element_register() */
-GQuark __gst_devicemonitorclass_factory = 0;
-
-static void gst_device_monitor_class_init (GstDeviceMonitorClass * klass);
-static void gst_device_monitor_init (GstDeviceMonitor * element);
-static void gst_device_monitor_base_class_init (gpointer g_class);
-static void gst_device_monitor_base_class_finalize (gpointer g_class);
-static void gst_device_monitor_dispose (GObject * object);
-static void gst_device_monitor_finalize (GObject * object);
-
-static gpointer gst_device_monitor_parent_class = NULL;
-
-GType
-gst_device_monitor_get_type (void)
-{
-  static volatile gsize gst_device_monitor_type = 0;
-
-  if (g_once_init_enter (&gst_device_monitor_type)) {
-    GType _type;
-    static const GTypeInfo element_info = {
-      sizeof (GstDeviceMonitorClass),
-      gst_device_monitor_base_class_init,
-      gst_device_monitor_base_class_finalize,
-      (GClassInitFunc) gst_device_monitor_class_init,
-      NULL,
-      NULL,
-      sizeof (GstDeviceMonitor),
-      0,
-      (GInstanceInitFunc) gst_device_monitor_init,
-      NULL
-    };
-
-    _type = g_type_register_static (GST_TYPE_OBJECT, "GstDeviceMonitor",
-        &element_info, G_TYPE_FLAG_ABSTRACT);
-
-    __gst_devicemonitorclass_factory =
-        g_quark_from_static_string ("GST_DEVICEMONITORCLASS_FACTORY");
-    g_once_init_leave (&gst_device_monitor_type, _type);
-  }
-  return gst_device_monitor_type;
-}
-
-static void
-gst_device_monitor_base_class_init (gpointer g_class)
-{
-  GstDeviceMonitorClass *klass = GST_DEVICE_MONITOR_CLASS (g_class);
-
-  /* Copy the element details here so elements can inherit the
-   * details from their base class and classes only need to set
-   * the details in class_init instead of base_init */
-  klass->metadata =
-      klass->metadata ? gst_structure_copy (klass->metadata) :
-      gst_structure_new_empty ("metadata");
-
-  klass->factory = g_type_get_qdata (G_TYPE_FROM_CLASS (klass),
-      __gst_devicemonitorclass_factory);
-}
-
-static void
-gst_device_monitor_base_class_finalize (gpointer g_class)
-{
-  GstDeviceMonitorClass *klass = GST_DEVICE_MONITOR_CLASS (g_class);
-
-  gst_structure_free (klass->metadata);
-}
-
-static void
-gst_device_monitor_class_init (GstDeviceMonitorClass * klass)
-{
-  GObjectClass *gobject_class = (GObjectClass *) klass;
-
-  gst_device_monitor_parent_class = g_type_class_peek_parent (klass);
-
-  g_type_class_add_private (klass, sizeof (GstDeviceMonitorPrivate));
-
-  gobject_class->dispose = gst_device_monitor_dispose;
-  gobject_class->finalize = gst_device_monitor_finalize;
-}
-
-static void
-gst_device_monitor_init (GstDeviceMonitor * monitor)
-{
-  monitor->priv = G_TYPE_INSTANCE_GET_PRIVATE (monitor,
-      GST_TYPE_DEVICE_MONITOR, GstDeviceMonitorPrivate);
-
-  g_mutex_init (&monitor->priv->start_lock);
-
-  monitor->priv->bus = gst_bus_new ();
-  gst_bus_set_flushing (monitor->priv->bus, TRUE);
-}
-
-
-static void
-gst_device_monitor_dispose (GObject * object)
-{
-  GstDeviceMonitor *monitor = GST_DEVICE_MONITOR (object);
-
-  gst_object_replace ((GstObject **) & monitor->priv->bus, NULL);
-
-  GST_OBJECT_LOCK (monitor);
-  g_list_free_full (monitor->devices, (GDestroyNotify) gst_object_unparent);
-  monitor->devices = NULL;
-  GST_OBJECT_UNLOCK (monitor);
-
-  G_OBJECT_CLASS (gst_device_monitor_parent_class)->dispose (object);
-}
-
-static void
-gst_device_monitor_finalize (GObject * object)
-{
-  GstDeviceMonitor *monitor = GST_DEVICE_MONITOR (object);
-
-  g_mutex_clear (&monitor->priv->start_lock);
-
-  G_OBJECT_CLASS (gst_device_monitor_parent_class)->finalize (object);
-}
-
-/**
- * gst_device_monitor_class_add_metadata:
- * @klass: class to set metadata for
- * @key: the key to set
- * @value: the value to set
- *
- * Set @key with @value as metadata in @klass.
- */
-void
-gst_device_monitor_class_add_metadata (GstDeviceMonitorClass * klass,
-    const gchar * key, const gchar * value)
-{
-  g_return_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass));
-  g_return_if_fail (key != NULL);
-  g_return_if_fail (value != NULL);
-
-  gst_structure_set ((GstStructure *) klass->metadata,
-      key, G_TYPE_STRING, value, NULL);
-}
-
-/**
- * gst_device_monitor_class_add_static_metadata:
- * @klass: class to set metadata for
- * @key: the key to set
- * @value: the value to set
- *
- * Set @key with @value as metadata in @klass.
- *
- * Same as gst_device_monitor_class_add_metadata(), but @value must be a static string
- * or an inlined string, as it will not be copied. (GStreamer plugins will
- * be made resident once loaded, so this function can be used even from
- * dynamically loaded plugins.)
- *
- * Since: 1.4
- */
-void
-gst_device_monitor_class_add_static_metadata (GstDeviceMonitorClass * klass,
-    const gchar * key, const gchar * value)
-{
-  GValue val = G_VALUE_INIT;
-
-  g_return_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass));
-  g_return_if_fail (key != NULL);
-  g_return_if_fail (value != NULL);
-
-  g_value_init (&val, G_TYPE_STRING);
-  g_value_set_static_string (&val, value);
-  gst_structure_take_value ((GstStructure *) klass->metadata, key, &val);
-}
-
-/**
- * gst_device_monitor_class_set_metadata:
- * @klass: class to set metadata for
- * @longname: The long English name of the device monitor. E.g. "File Sink"
- * @classification: String describing the type of device monitor, as an unordered list
- * separated with slashes ('/'). See draft-klass.txt of the design docs
- * for more details and common types. E.g: "Sink/File"
- * @description: Sentence describing the purpose of the device monitor.
- * E.g: "Write stream to a file"
- * @author: Name and contact details of the author(s). Use \n to separate
- * multiple author metadata. E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
- *
- * Sets the detailed information for a #GstDeviceMonitorClass.
- * <note>This function is for use in _class_init functions only.</note>
- *
- * Since: 1.4
- */
-void
-gst_device_monitor_class_set_metadata (GstDeviceMonitorClass * klass,
-    const gchar * longname, const gchar * classification,
-    const gchar * description, const gchar * author)
-{
-  g_return_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass));
-  g_return_if_fail (longname != NULL && *longname != '\0');
-  g_return_if_fail (classification != NULL && *classification != '\0');
-  g_return_if_fail (description != NULL && *description != '\0');
-  g_return_if_fail (author != NULL && *author != '\0');
-
-  gst_structure_id_set ((GstStructure *) klass->metadata,
-      GST_QUARK (ELEMENT_METADATA_LONGNAME), G_TYPE_STRING, longname,
-      GST_QUARK (ELEMENT_METADATA_KLASS), G_TYPE_STRING, classification,
-      GST_QUARK (ELEMENT_METADATA_DESCRIPTION), G_TYPE_STRING, description,
-      GST_QUARK (ELEMENT_METADATA_AUTHOR), G_TYPE_STRING, author, NULL);
-}
-
-/**
- * gst_device_monitor_class_set_static_metadata:
- * @klass: class to set metadata for
- * @longname: The long English name of the element. E.g. "File Sink"
- * @classification: String describing the type of element, as an unordered list
- * separated with slashes ('/'). See draft-klass.txt of the design docs
- * for more details and common types. E.g: "Sink/File"
- * @description: Sentence describing the purpose of the element.
- * E.g: "Write stream to a file"
- * @author: Name and contact details of the author(s). Use \n to separate
- * multiple author metadata. E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
- *
- * Sets the detailed information for a #GstDeviceMonitorClass.
- * <note>This function is for use in _class_init functions only.</note>
- *
- * Same as gst_device_monitor_class_set_metadata(), but @longname, @classification,
- * @description, and @author must be static strings or inlined strings, as
- * they will not be copied. (GStreamer plugins will be made resident once
- * loaded, so this function can be used even from dynamically loaded plugins.)
- *
- * Since: 1.4
- */
-void
-gst_device_monitor_class_set_static_metadata (GstDeviceMonitorClass * klass,
-    const gchar * longname, const gchar * classification,
-    const gchar * description, const gchar * author)
-{
-  GstStructure *s = (GstStructure *) klass->metadata;
-  GValue val = G_VALUE_INIT;
-
-  g_return_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass));
-  g_return_if_fail (longname != NULL && *longname != '\0');
-  g_return_if_fail (classification != NULL && *classification != '\0');
-  g_return_if_fail (description != NULL && *description != '\0');
-  g_return_if_fail (author != NULL && *author != '\0');
-
-  g_value_init (&val, G_TYPE_STRING);
-
-  g_value_set_static_string (&val, longname);
-  gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_LONGNAME), &val);
-
-  g_value_set_static_string (&val, classification);
-  gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_KLASS), &val);
-
-  g_value_set_static_string (&val, description);
-  gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_DESCRIPTION),
-      &val);
-
-  g_value_set_static_string (&val, author);
-  gst_structure_id_take_value (s, GST_QUARK (ELEMENT_METADATA_AUTHOR), &val);
-}
-
-/**
- * gst_device_monitor_class_get_metadata:
- * @klass: class to get metadata for
- * @key: the key to get
- *
- * Get metadata with @key in @klass.
- *
- * Returns: the metadata for @key.
- *
- * Since: 1.4
- */
-const gchar *
-gst_device_monitor_class_get_metadata (GstDeviceMonitorClass * klass,
-    const gchar * key)
-{
-  g_return_val_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass), NULL);
-  g_return_val_if_fail (key != NULL, NULL);
-
-  return gst_structure_get_string ((GstStructure *) klass->metadata, key);
-}
-
-/**
- * gst_device_monitor_get_devices:
- * @monitor: A #GstDeviceMonitor
- *
- * Gets a list of devices that this monitor understands. This may actually
- * probe the hardware if the monitor is not currently started.
- *
- * Returns: (transfer full) (element-type GstDevice): a #GList of
- *   #GstDevice
- *
- * Since: 1.4
- */
-
-GList *
-gst_device_monitor_get_devices (GstDeviceMonitor * monitor)
-{
-  GstDeviceMonitorClass *klass;
-  GList *devices = NULL;
-  gboolean started;
-  GList *item;
-
-  g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), NULL);
-  klass = GST_DEVICE_MONITOR_GET_CLASS (monitor);
-
-  g_mutex_lock (&monitor->priv->start_lock);
-  started = (monitor->priv->started_count > 0);
-
-  if (started) {
-    GST_OBJECT_LOCK (monitor);
-    for (item = monitor->devices; item; item = item->next)
-      devices = g_list_prepend (devices, gst_object_ref (item->data));
-    GST_OBJECT_UNLOCK (monitor);
-  } else if (klass->probe)
-    devices = klass->probe (monitor);
-
-  g_mutex_unlock (&monitor->priv->start_lock);
-
-  return devices;
-}
-
-/**
- * gst_device_monitor_start:
- * @monitor: A #GstDeviceMonitor
- *
- * Starts monitoring the devices. This will cause #GST_MESSAGE_DEVICE messages
- * to be posted on the monitor's bus when devices are added or removed from
- * the system.
- *
- * Since the #GstDeviceMonitor is a singleton,
- * gst_device_monitor_start() may already have been called by another
- * user of the object, gst_device_monitor_stop() needs to be called the same
- * number of times.
- *
- * Returns: %TRUE if the device monitoring could be started
- *
- * Since: 1.4
- */
-
-gboolean
-gst_device_monitor_start (GstDeviceMonitor * monitor)
-{
-  GstDeviceMonitorClass *klass;
-  gboolean ret = FALSE;
-
-  g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), FALSE);
-  klass = GST_DEVICE_MONITOR_GET_CLASS (monitor);
-
-  g_mutex_lock (&monitor->priv->start_lock);
-
-  if (monitor->priv->started_count > 0) {
-    ret = TRUE;
-    goto started;
-  }
-
-  if (klass->start)
-    ret = klass->start (monitor);
-
-  if (ret) {
-    monitor->priv->started_count++;
-    gst_bus_set_flushing (monitor->priv->bus, FALSE);
-  }
-
-started:
-
-  g_mutex_unlock (&monitor->priv->start_lock);
-
-  return ret;
-}
-
-/**
- * gst_device_monitor_stop:
- * @monitor: A #GstDeviceMonitor
- *
- * Decreases the use-count by one. If the use count reaches zero, this
- * #GstDeviceMonitor will stop monitoring the devices. This needs to be
- * called the same number of times that gst_device_monitor_start() was called.
- *
- * Since: 1.4
- */
-
-void
-gst_device_monitor_stop (GstDeviceMonitor * monitor)
-{
-  GstDeviceMonitorClass *klass;
-
-  g_return_if_fail (GST_IS_DEVICE_MONITOR (monitor));
-  klass = GST_DEVICE_MONITOR_GET_CLASS (monitor);
-
-  g_mutex_lock (&monitor->priv->start_lock);
-
-  if (monitor->priv->started_count == 1) {
-    gst_bus_set_flushing (monitor->priv->bus, TRUE);
-    if (klass->stop)
-      klass->stop (monitor);
-    GST_OBJECT_LOCK (monitor);
-    g_list_free_full (monitor->devices, (GDestroyNotify) gst_object_unparent);
-    monitor->devices = NULL;
-    GST_OBJECT_UNLOCK (monitor);
-  } else if (monitor->priv->started_count < 1) {
-    g_critical ("Trying to stop a GstDeviceMonitor %s which is already stopped",
-        GST_OBJECT_NAME (monitor));
-  }
-
-  monitor->priv->started_count--;
-  g_mutex_unlock (&monitor->priv->start_lock);
-}
-
-
-/**
- * gst_device_monitor_get_factory:
- * @monitor: a #GstDeviceMonitor to request the device monitor factory of.
- *
- * Retrieves the factory that was used to create this device monitor.
- *
- * Returns: (transfer none): the #GstDeviceMonitorFactory used for creating this
- *     device monitor. no refcounting is needed.
- *
- * Since: 1.4
- */
-GstDeviceMonitorFactory *
-gst_device_monitor_get_factory (GstDeviceMonitor * monitor)
-{
-  g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), NULL);
-
-  return GST_DEVICE_MONITOR_GET_CLASS (monitor)->factory;
-}
-
-/**
- * gst_device_monitor_can_monitor:
- * @monitor: a #GstDeviceMonitor
- *
- * If this function returns %TRUE, then the device monitor can monitor if
- * devices are added or removed. Otherwise, it can only do static probing.
- *
- * Returns: %TRUE if the #GstDeviceMonitor support monitoring, %FALSE otherwise
- */
-gboolean
-gst_device_monitor_can_monitor (GstDeviceMonitor * monitor)
-{
-  GstDeviceMonitorClass *klass;
-
-  g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), FALSE);
-  klass = GST_DEVICE_MONITOR_GET_CLASS (monitor);
-
-  if (klass->start)
-    return TRUE;
-  else
-    return FALSE;
-}
-
-/**
- * gst_device_monitor_get_bus:
- * @monitor: a #GstDeviceMonitor
- *
- * Gets the #GstBus of this #GstDeviceMonitor
- *
- * Returns: (transfer full): a #GstBus
- *
- * Since: 1.4
- */
-GstBus *
-gst_device_monitor_get_bus (GstDeviceMonitor * monitor)
-{
-  g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), NULL);
-
-  return gst_object_ref (monitor->priv->bus);
-}
-
-/**
- * gst_device_monitor_device_add:
- * @monitor: a #GstDeviceMonitor
- * @device: (transfer full): a #GstDevice that has been added
- *
- * Posts a message on the monitor's #GstBus to inform applications that
- * a new device has been added.
- *
- * This is for use by subclasses.
- *
- * Since: 1.4
- */
-void
-gst_device_monitor_device_add (GstDeviceMonitor * monitor, GstDevice * device)
-{
-  GstMessage *message;
-
-  if (!gst_object_set_parent (GST_OBJECT (device), GST_OBJECT (monitor))) {
-    GST_WARNING_OBJECT (monitor, "Could not parent device %p to monitor,"
-        " it already has a parent", device);
-    return;
-  }
-
-  GST_OBJECT_LOCK (monitor);
-  monitor->devices = g_list_prepend (monitor->devices, gst_object_ref (device));
-  GST_OBJECT_UNLOCK (monitor);
-
-  message = gst_message_new_device_added (GST_OBJECT (monitor), device);
-  gst_bus_post (monitor->priv->bus, message);
-  gst_object_unref (device);
-}
-
-
-/**
- * gst_device_monitor_device_remove:
- * @monitor: a #GstDeviceMonitor
- * @device: a #GstDevice that has been removed
- *
- * Posts a message on the monitor's #GstBus to inform applications that
- * a device has been removed.
- *
- * This is for use by subclasses.
- *
- * Since: 1.4
- */
-void
-gst_device_monitor_device_remove (GstDeviceMonitor * monitor,
-    GstDevice * device)
-{
-  GstMessage *message;
-  GList *item;
-
-  GST_OBJECT_LOCK (monitor);
-  item = g_list_find (monitor->devices, device);
-  if (item) {
-    monitor->devices = g_list_delete_link (monitor->devices, item);
-  }
-  GST_OBJECT_UNLOCK (monitor);
-
-  message = gst_message_new_device_removed (GST_OBJECT (monitor), device);
-  g_signal_emit_by_name (device, "removed");
-  gst_bus_post (monitor->priv->bus, message);
-  if (item)
-    gst_object_unparent (GST_OBJECT (device));
-}
diff --git a/gst/gstdevicemonitor.h b/gst/gstdevicemonitor.h
deleted file mode 100644 (file)
index f5c3307..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/* GStreamer
- * Copyright (C) 2012 Olivier Crete <olivier.crete@collabora.com>
- *
- * gstdevicemonitor.h: Device probing and monitoring
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <gst/gstdevicemonitorfactory.h>
-
-
-#ifndef __GST_DEVICE_MONITOR_H__
-#define __GST_DEVICE_MONITOR_H__
-
-#include <gst/gstelement.h>
-
-G_BEGIN_DECLS
-
-typedef struct _GstDeviceMonitor GstDeviceMonitor;
-typedef struct _GstDeviceMonitorClass GstDeviceMonitorClass;
-typedef struct _GstDeviceMonitorPrivate GstDeviceMonitorPrivate;
-
-#define GST_TYPE_DEVICE_MONITOR                 (gst_device_monitor_get_type())
-#define GST_IS_DEVICE_MONITOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEVICE_MONITOR))
-#define GST_IS_DEVICE_MONITOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEVICE_MONITOR))
-#define GST_DEVICE_MONITOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEVICE_MONITOR, GstDeviceMonitorClass))
-#define GST_DEVICE_MONITOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEVICE_MONITOR, GstDeviceMonitor))
-#define GST_DEVICE_MONITOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEVICE_MONITOR, GstDeviceMonitorClass))
-#define GST_DEVICE_MONITOR_CAST(obj)            ((GstDeviceMonitor *)(obj))
-
-
-/**
- * GstDeviceMonitor:
- * @parent: The parent #GstObject
- * @devices: a #GList of the #GstDevice objects
- *
- * The structure of the base #GstDeviceMonitor
- *
- * Since: 1.4
- */
-struct _GstDeviceMonitor {
-  GstObject         parent;
-
-  /* Protected by the Object lock */
-  GList *devices;
-
-  /*< private >*/
-
-  GstDeviceMonitorPrivate *priv;
-
-  gpointer _gst_reserved[GST_PADDING];
-};
-
-/**
- * GstDeviceMonitorClass:
- * @parent_class: the parent #GstObjectClass structure
- * @factory: a pointer to the #GstDeviceMonitorFactory that creates this
- *  monitor
- * @probe: Returns a list of devices that are currently available.
- *  This should never block.
- * @start: Starts monitoring for new devices. Only subclasses that can know
- *  that devices have been added or remove need to implement this method.
- * @stop: Stops monitoring for new devices. Only subclasses that implement
- *  the start() method need to implement this method.
- *
- * The structure of the base #GstDeviceMonitorClass
- *
- * Since: 1.4
- */
-
-struct _GstDeviceMonitorClass {
-  GstObjectClass    parent_class;
-
-  GstDeviceMonitorFactory     *factory;
-
-  GList*      (*probe) (GstDeviceMonitor * monitor);
-
-  gboolean    (*start) (GstDeviceMonitor * monitor);
-  void        (*stop)  (GstDeviceMonitor * monitor);
-
-  /*< private >*/
-  gpointer metadata;
-
-  /*< private >*/
-  gpointer _gst_reserved[GST_PADDING];
-};
-
-GType       gst_device_monitor_get_type (void);
-
-
-GList *     gst_device_monitor_get_devices    (GstDeviceMonitor * monitor);
-
-gboolean    gst_device_monitor_start          (GstDeviceMonitor * monitor);
-void        gst_device_monitor_stop           (GstDeviceMonitor * monitor);
-
-gboolean    gst_device_monitor_can_monitor    (GstDeviceMonitor * monitor);
-
-GstBus *    gst_device_monitor_get_bus        (GstDeviceMonitor * monitor);
-
-void        gst_device_monitor_device_add     (GstDeviceMonitor * monitor,
-                                               GstDevice * device);
-void        gst_device_monitor_device_remove  (GstDeviceMonitor * monitor,
-                                               GstDevice * device);
-
-
-/* device monitor class meta data */
-void        gst_device_monitor_class_set_metadata          (GstDeviceMonitorClass *klass,
-                                                            const gchar     *longname,
-                                                            const gchar     *classification,
-                                                            const gchar     *description,
-                                                            const gchar     *author);
-void        gst_device_monitor_class_set_static_metadata   (GstDeviceMonitorClass *klass,
-                                                            const gchar     *longname,
-                                                            const gchar     *classification,
-                                                            const gchar     *description,
-                                                            const gchar     *author);
-void        gst_device_monitor_class_add_metadata          (GstDeviceMonitorClass * klass,
-                                                            const gchar * key, const gchar * value);
-void        gst_device_monitor_class_add_static_metadata   (GstDeviceMonitorClass * klass,
-                                                            const gchar * key, const gchar * value);
-const gchar * gst_device_monitor_class_get_metadata        (GstDeviceMonitorClass * klass,
-                                                              const gchar * key);
-
-/* factory management */
-GstDeviceMonitorFactory * gst_device_monitor_get_factory   (GstDeviceMonitor * monitor);
-
-G_END_DECLS
-
-#endif /* __GST_DEVICE_MONITOR_H__ */
diff --git a/gst/gstdevicemonitorfactory.c b/gst/gstdevicemonitorfactory.c
deleted file mode 100644 (file)
index 4d113a0..0000000
+++ /dev/null
@@ -1,595 +0,0 @@
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- *                    2000 Wim Taymans <wtay@chello.be>
- *                    2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
- *
- * gstdevicemonitorfactory.c: GstDeviceMonitorFactory object, support routines
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/**
- * SECTION:gstdevicemonitorfactory
- * @short_description: Create GstDeviceMonitors from a factory
- * @see_also: #GstDeviceMonitor, #GstPlugin, #GstPluginFeature, #GstPadTemplate.
- *
- * #GstDeviceMonitorFactory is used to create instances of device monitors. A
- * GstDeviceMonitorfactory can be added to a #GstPlugin as it is also a
- * #GstPluginFeature.
- *
- * Use the gst_device_monitor_factory_find() and gst_device_monitor_factory_create()
- * functions to create device monitor instances or use gst_device_monitor_factory_make() as a
- * convenient shortcut.
- *
- * Since: 1.4
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "gst_private.h"
-
-#include "gstdevicemonitorfactory.h"
-#include "gst.h"
-
-#include "glib-compat-private.h"
-
-GST_DEBUG_CATEGORY_STATIC (device_monitor_factory_debug);
-#define GST_CAT_DEFAULT device_monitor_factory_debug
-
-static void gst_device_monitor_factory_finalize (GObject * object);
-static void gst_device_monitor_factory_cleanup (GstDeviceMonitorFactory *
-    factory);
-
-/* static guint gst_device_monitor_factory_signals[LAST_SIGNAL] = { 0 }; */
-
-/* this is defined in gstelement.c */
-extern GQuark __gst_devicemonitorclass_factory;
-
-#define _do_init \
-{ \
-  GST_DEBUG_CATEGORY_INIT (device_monitor_factory_debug, "GST_DEVICE_MONITOR_FACTORY", \
-      GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, \
-      "device monitor factories keep information about installed device monitors"); \
-}
-
-G_DEFINE_TYPE_WITH_CODE (GstDeviceMonitorFactory, gst_device_monitor_factory,
-    GST_TYPE_PLUGIN_FEATURE, _do_init);
-
-static void
-gst_device_monitor_factory_class_init (GstDeviceMonitorFactoryClass * klass)
-{
-  GObjectClass *gobject_class = (GObjectClass *) klass;
-
-  gobject_class->finalize = gst_device_monitor_factory_finalize;
-}
-
-static void
-gst_device_monitor_factory_init (GstDeviceMonitorFactory * factory)
-{
-}
-
-static void
-gst_device_monitor_factory_finalize (GObject * object)
-{
-  GstDeviceMonitorFactory *factory = GST_DEVICE_MONITOR_FACTORY (object);
-  GstDeviceMonitor *monitor;
-
-  gst_device_monitor_factory_cleanup (factory);
-
-  monitor = g_atomic_pointer_get (&factory->monitor);
-  if (monitor)
-    gst_object_unref (monitor);
-
-  G_OBJECT_CLASS (gst_device_monitor_factory_parent_class)->finalize (object);
-}
-
-/**
- * gst_device_monitor_factory_find:
- * @name: name of factory to find
- *
- * Search for an device monitor factory of the given name. Refs the returned
- * device monitor factory; caller is responsible for unreffing.
- *
- * Returns: (transfer full) (nullable): #GstDeviceMonitorFactory if
- * found, %NULL otherwise
- *
- * Since: 1.4
- */
-GstDeviceMonitorFactory *
-gst_device_monitor_factory_find (const gchar * name)
-{
-  GstPluginFeature *feature;
-
-  g_return_val_if_fail (name != NULL, NULL);
-
-  feature = gst_registry_find_feature (gst_registry_get (), name,
-      GST_TYPE_DEVICE_MONITOR_FACTORY);
-  if (feature)
-    return GST_DEVICE_MONITOR_FACTORY (feature);
-
-  /* this isn't an error, for instance when you query if an device monitor factory is
-   * present */
-  GST_LOG ("no such device monitor factory \"%s\"", name);
-
-  return NULL;
-}
-
-static void
-gst_device_monitor_factory_cleanup (GstDeviceMonitorFactory * factory)
-{
-  if (factory->metadata) {
-    gst_structure_free ((GstStructure *) factory->metadata);
-    factory->metadata = NULL;
-  }
-  if (factory->type) {
-    factory->type = G_TYPE_INVALID;
-  }
-}
-
-#define CHECK_METADATA_FIELD(klass, name, key)                                 \
-  G_STMT_START {                                                               \
-    const gchar *metafield = gst_device_monitor_class_get_metadata (klass, key);      \
-    if (G_UNLIKELY (metafield == NULL || *metafield == '\0')) {                \
-      g_warning ("Device monitor factory metadata for '%s' has no valid %s field", name, key);    \
-      goto detailserror;                                                       \
-    } \
-  } G_STMT_END;
-
-/**
- * gst_device_monitor_register:
- * @plugin: (allow-none): #GstPlugin to register the device monitor with, or %NULL for
- *     a static device monitor.
- * @name: name of device monitors of this type
- * @rank: rank of device monitor (higher rank means more importance when autoplugging)
- * @type: GType of device monitor to register
- *
- * Create a new device monitorfactory capable of instantiating objects of the
- * @type and add the factory to @plugin.
- *
- * Returns: %TRUE, if the registering succeeded, %FALSE on error
- *
- * Since: 1.4
- */
-gboolean
-gst_device_monitor_register (GstPlugin * plugin, const gchar * name, guint rank,
-    GType type)
-{
-  GstPluginFeature *existing_feature;
-  GstRegistry *registry;
-  GstDeviceMonitorFactory *factory;
-  GstDeviceMonitorClass *klass;
-
-  g_return_val_if_fail (name != NULL, FALSE);
-  g_return_val_if_fail (g_type_is_a (type, GST_TYPE_DEVICE_MONITOR), FALSE);
-
-  registry = gst_registry_get ();
-
-  /* check if feature already exists, if it exists there is no need to update it
-   * when the registry is getting updated, outdated plugins and all their
-   * features are removed and readded.
-   */
-  existing_feature = gst_registry_lookup_feature (registry, name);
-  if (existing_feature) {
-    GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)",
-        existing_feature, name);
-    factory = GST_DEVICE_MONITOR_FACTORY_CAST (existing_feature);
-    factory->type = type;
-    existing_feature->loaded = TRUE;
-    g_type_set_qdata (type, __gst_devicemonitorclass_factory, factory);
-    gst_object_unref (existing_feature);
-    return TRUE;
-  }
-
-  factory =
-      GST_DEVICE_MONITOR_FACTORY_CAST (g_object_newv
-      (GST_TYPE_DEVICE_MONITOR_FACTORY, 0, NULL));
-  gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name);
-  GST_LOG_OBJECT (factory, "Created new device monitorfactory for type %s",
-      g_type_name (type));
-
-  /* provide info needed during class structure setup */
-  g_type_set_qdata (type, __gst_devicemonitorclass_factory, factory);
-  klass = GST_DEVICE_MONITOR_CLASS (g_type_class_ref (type));
-
-  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_LONGNAME);
-  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_KLASS);
-  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_DESCRIPTION);
-  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_AUTHOR);
-
-  factory->type = type;
-  factory->metadata = gst_structure_copy ((GstStructure *) klass->metadata);
-
-  if (plugin && plugin->desc.name) {
-    GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = plugin->desc.name;
-    GST_PLUGIN_FEATURE_CAST (factory)->plugin = plugin;
-    g_object_add_weak_pointer ((GObject *) plugin,
-        (gpointer *) & GST_PLUGIN_FEATURE_CAST (factory)->plugin);
-  } else {
-    GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = "NULL";
-    GST_PLUGIN_FEATURE_CAST (factory)->plugin = NULL;
-  }
-  gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE_CAST (factory), rank);
-  GST_PLUGIN_FEATURE_CAST (factory)->loaded = TRUE;
-
-  gst_registry_add_feature (registry, GST_PLUGIN_FEATURE_CAST (factory));
-
-  return TRUE;
-
-  /* ERRORS */
-detailserror:
-  {
-    gst_device_monitor_factory_cleanup (factory);
-    return FALSE;
-  }
-}
-
-/**
- * gst_device_monitor_factory_get:
- * @factory: factory to instantiate
- *
- * Returns the device monitor of the type defined by the given device
- * monitorfactory.
- *
- * Returns: (transfer full) (nullable): the #GstDeviceMonitor or %NULL
- * if the device monitor couldn't be created
- *
- * Since: 1.4
- */
-GstDeviceMonitor *
-gst_device_monitor_factory_get (GstDeviceMonitorFactory * factory)
-{
-  GstDeviceMonitor *device_monitor;
-  GstDeviceMonitorClass *oclass;
-  GstDeviceMonitorFactory *newfactory;
-
-  g_return_val_if_fail (factory != NULL, NULL);
-
-  newfactory =
-      GST_DEVICE_MONITOR_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
-          (factory)));
-
-  if (newfactory == NULL)
-    goto load_failed;
-
-  factory = newfactory;
-
-  GST_INFO ("getting device monitor \"%s\"", GST_OBJECT_NAME (factory));
-
-  if (factory->type == 0)
-    goto no_type;
-
-  device_monitor = g_atomic_pointer_get (&newfactory->monitor);
-  if (device_monitor)
-    return gst_object_ref (device_monitor);
-
-  /* create an instance of the device monitor, cast so we don't assert on NULL
-   * also set name as early as we can
-   */
-  device_monitor = GST_DEVICE_MONITOR_CAST (g_object_newv (factory->type, 0,
-          NULL));
-  if (G_UNLIKELY (device_monitor == NULL))
-    goto no_device_monitor;
-
-  /* fill in the pointer to the factory in the device monitor class. The
-   * class will not be unreffed currently.
-   * Be thread safe as there might be 2 threads creating the first instance of
-   * an device monitor at the same moment
-   */
-  oclass = GST_DEVICE_MONITOR_GET_CLASS (device_monitor);
-  if (!g_atomic_pointer_compare_and_exchange (&oclass->factory, NULL, factory))
-    gst_object_unref (factory);
-
-  gst_object_ref_sink (device_monitor);
-
-  /* We use an atomic to make sure we don't create two in parallel */
-  if (!g_atomic_pointer_compare_and_exchange (&newfactory->monitor, NULL,
-          device_monitor)) {
-    gst_object_unref (device_monitor);
-
-    device_monitor = g_atomic_pointer_get (&newfactory->monitor);
-  }
-
-  GST_DEBUG ("created device monitor \"%s\"", GST_OBJECT_NAME (factory));
-
-  return gst_object_ref (device_monitor);
-
-  /* ERRORS */
-load_failed:
-  {
-    GST_WARNING_OBJECT (factory,
-        "loading plugin containing feature %s returned NULL!",
-        GST_OBJECT_NAME (factory));
-    return NULL;
-  }
-no_type:
-  {
-    GST_WARNING_OBJECT (factory, "factory has no type");
-    gst_object_unref (factory);
-    return NULL;
-  }
-no_device_monitor:
-  {
-    GST_WARNING_OBJECT (factory, "could not create device monitor");
-    gst_object_unref (factory);
-    return NULL;
-  }
-}
-
-/**
- * gst_device_monitor_factory_get_by_name:
- * @factoryname: a named factory to instantiate
- *
- * Returns the device monitor of the type defined by the given device
- * monitor factory.
- *
- * Returns: (transfer full) (nullable): a #GstDeviceMonitor or %NULL
- * if unable to create device monitor
- *
- * Since: 1.4
- */
-GstDeviceMonitor *
-gst_device_monitor_factory_get_by_name (const gchar * factoryname)
-{
-  GstDeviceMonitorFactory *factory;
-  GstDeviceMonitor *device_monitor;
-
-  g_return_val_if_fail (factoryname != NULL, NULL);
-  g_return_val_if_fail (gst_is_initialized (), NULL);
-
-  GST_LOG ("gstdevicemonitorfactory: get_by_name \"%s\"", factoryname);
-
-  factory = gst_device_monitor_factory_find (factoryname);
-  if (factory == NULL)
-    goto no_factory;
-
-  GST_LOG_OBJECT (factory, "found factory %p", factory);
-  device_monitor = gst_device_monitor_factory_get (factory);
-  if (device_monitor == NULL)
-    goto create_failed;
-
-  gst_object_unref (factory);
-  return device_monitor;
-
-  /* ERRORS */
-no_factory:
-  {
-    GST_INFO ("no such device monitor factory \"%s\"!", factoryname);
-    return NULL;
-  }
-create_failed:
-  {
-    GST_INFO_OBJECT (factory, "couldn't create instance!");
-    gst_object_unref (factory);
-    return NULL;
-  }
-}
-
-/**
- * gst_device_monitor_factory_get_device_monitor_type:
- * @factory: factory to get managed #GType from
- *
- * Get the #GType for device monitors managed by this factory. The type can
- * only be retrieved if the device monitor factory is loaded, which can be
- * assured with gst_plugin_feature_load().
- *
- * Returns: the #GType for device monitors managed by this factory or 0 if
- * the factory is not loaded.
- *
- * Since: 1.4
- */
-GType
-gst_device_monitor_factory_get_device_monitor_type (GstDeviceMonitorFactory *
-    factory)
-{
-  g_return_val_if_fail (GST_IS_DEVICE_MONITOR_FACTORY (factory), 0);
-
-  return factory->type;
-}
-
-/**
- * gst_device_monitor_factory_get_metadata:
- * @factory: a #GstDeviceMonitorFactory
- * @key: a key
- *
- * Get the metadata on @factory with @key.
- *
- * Returns: (nullable): the metadata with @key on @factory or %NULL
- * when there was no metadata with the given @key.
- *
- * Since: 1.4
- */
-const gchar *
-gst_device_monitor_factory_get_metadata (GstDeviceMonitorFactory * factory,
-    const gchar * key)
-{
-  return gst_structure_get_string ((GstStructure *) factory->metadata, key);
-}
-
-/**
- * gst_device_monitor_factory_get_metadata_keys:
- * @factory: a #GstDeviceMonitorFactory
- *
- * Get the available keys for the metadata on @factory.
- *
- * Returns: (transfer full) (element-type utf8) (array zero-terminated=1) (nullable):
- * a %NULL-terminated array of key strings, or %NULL when there is no
- * metadata. Free with g_strfreev() when no longer needed.
- *
- * Since: 1.4
- */
-gchar **
-gst_device_monitor_factory_get_metadata_keys (GstDeviceMonitorFactory * factory)
-{
-  GstStructure *metadata;
-  gchar **arr;
-  gint i, num;
-
-  g_return_val_if_fail (GST_IS_DEVICE_MONITOR_FACTORY (factory), NULL);
-
-  metadata = (GstStructure *) factory->metadata;
-  if (metadata == NULL)
-    return NULL;
-
-  num = gst_structure_n_fields (metadata);
-  if (num == 0)
-    return NULL;
-
-  arr = g_new (gchar *, num + 1);
-  for (i = 0; i < num; ++i) {
-    arr[i] = g_strdup (gst_structure_nth_field_name (metadata, i));
-  }
-  arr[i] = NULL;
-  return arr;
-}
-
-/**
- * gst_device_monitor_factory_has_classesv:
- * @factory: a #GstDeviceMonitorFactory
- * @classes: (array zero-terminated=1): a %NULL terminated array of
- *   klasses to match, only match if all classes are matched
- *
- * Check if @factory matches all of the given classes
- *
- * Returns: %TRUE if @factory matches.
- *
- * Since: 1.4
- */
-gboolean
-gst_device_monitor_factory_has_classesv (GstDeviceMonitorFactory * factory,
-    gchar ** classes)
-{
-  const gchar *klass;
-
-  g_return_val_if_fail (GST_IS_DEVICE_MONITOR_FACTORY (factory), FALSE);
-
-  klass = gst_device_monitor_factory_get_metadata (factory,
-      GST_ELEMENT_METADATA_KLASS);
-
-  if (klass == NULL) {
-    GST_ERROR_OBJECT (factory,
-        "device monitor factory is missing klass identifiers");
-    return FALSE;
-  }
-
-  for (; classes[0]; classes++) {
-    const gchar *found;
-    guint len;
-
-    if (classes[0] == '\0')
-      continue;
-
-    found = strstr (klass, classes[0]);
-
-    if (!found)
-      return FALSE;
-    if (found != klass && *(found - 1) != '/')
-      return FALSE;
-
-    len = strlen (classes[0]);
-    if (found[len] != 0 && found[len] != '/')
-      return FALSE;
-  }
-
-  return TRUE;
-}
-
-/**
- * gst_device_monitor_factory_has_classes:
- * @factory: a #GstDeviceMonitorFactory
- * @classes: a "/" separate list of klasses to match, only match if all classes
- *  are matched
- *
- * Check if @factory matches all of the given @classes
- *
- * Returns: %TRUE if @factory matches.
- *
- * Since: 1.4
- */
-gboolean
-gst_device_monitor_factory_has_classes (GstDeviceMonitorFactory * factory,
-    const gchar * classes)
-{
-  gchar **classesv;
-  gboolean res;
-
-  classesv = g_strsplit (classes, "/", 0);
-
-  res = gst_device_monitor_factory_has_classesv (factory, classesv);
-
-  g_strfreev (classesv);
-
-  return res;
-}
-
-typedef struct
-{
-  const char *classes;
-  GstRank minrank;
-} FilterData;
-
-static gboolean
-device_monitor_filter (GstPluginFeature * feature, FilterData * data)
-{
-  gboolean res;
-
-  /* we only care about device monitor factories */
-  if (G_UNLIKELY (!GST_IS_DEVICE_MONITOR_FACTORY (feature)))
-    return FALSE;
-
-  res = (gst_plugin_feature_get_rank (feature) >= data->minrank) &&
-      gst_device_monitor_factory_has_classes (GST_DEVICE_MONITOR_FACTORY_CAST
-      (feature), data->classes);
-
-  return res;
-}
-
-/**
- * gst_device_monitor_factory_list_get_device_monitors:
- * @classes: a "/" separate list of klasses to match, only match if all classes
- *  are matched
- * @minrank: Minimum rank
- *
- * Get a list of factories that match all of the given @classes. Only
- * device monitors with a rank greater or equal to @minrank will be
- * returned.  The list of factories is returned by decreasing rank.
- *
- * Returns: (transfer full) (element-type Gst.DeviceMonitorFactory): a #GList of
- *     #GstDeviceMonitorFactory device monitors. Use gst_plugin_feature_list_free() after
- *     usage.
- *
- * Since: 1.4
- */
-GList *gst_device_monitor_factory_list_get_device_monitors
-    (const gchar * classes, GstRank minrank)
-{
-  GList *result;
-  FilterData data;
-
-  /* prepare type */
-  data.classes = classes;
-  data.minrank = minrank;
-
-  /* get the feature list using the filter */
-  result = gst_registry_feature_filter (gst_registry_get (),
-      (GstPluginFeatureFilter) device_monitor_filter, FALSE, &data);
-
-  /* sort on rank and name */
-  result = g_list_sort (result, gst_plugin_feature_rank_compare_func);
-
-  return result;
-}
diff --git a/gst/gstdevicemonitorfactory.h b/gst/gstdevicemonitorfactory.h
deleted file mode 100644 (file)
index 02bf04a..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- *               2000,2004 Wim Taymans <wim@fluendo.com>
- *               2012 Olivier Crete <olivier.crete@collabora.com>
- *
- * gstdevicemonitorfactory.h: Header for GstDeviceMonitorFactory
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-
-#ifndef __GST_DEVICE_MONITOR_FACTORY_H__
-#define __GST_DEVICE_MONITOR_FACTORY_H__
-
-/**
- * GstDeviceMonitorFactory:
- *
- * The opaque #GstDeviceMonitorFactory data structure.
- *
- * Since: 1.4
- */
-
-/**
- * GstDeviceMonitorFactoryClass:
- *
- * The opaque #GstDeviceMonitorFactoryClass data structure.
- *
- * Since: 1.4
- */
-typedef struct _GstDeviceMonitorFactory GstDeviceMonitorFactory;
-typedef struct _GstDeviceMonitorFactoryClass GstDeviceMonitorFactoryClass;
-
-#include <gst/gstconfig.h>
-#include <gst/gstplugin.h>
-#include <gst/gstpluginfeature.h>
-#include <gst/gstdevicemonitor.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_DEVICE_MONITOR_FACTORY            (gst_device_monitor_factory_get_type())
-#define GST_DEVICE_MONITOR_FACTORY(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEVICE_MONITOR_FACTORY,\
-                                                 GstDeviceMonitorFactory))
-#define GST_DEVICE_MONITOR_FACTORY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEVICE_MONITOR_FACTORY,\
-                                                 GstDeviceMonitorFactoryClass))
-#define GST_IS_DEVICE_MONITOR_FACTORY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEVICE_MONITOR_FACTORY))
-#define GST_IS_DEVICE_MONITOR_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEVICE_MONITOR_FACTORY))
-#define GST_DEVICE_MONITOR_FACTORY_CAST(obj)       ((GstDeviceMonitorFactory *)(obj))
-
-GType                   gst_device_monitor_factory_get_type          (void);
-
-GstDeviceMonitorFactory * gst_device_monitor_factory_find            (const gchar *name);
-
-GType                   gst_device_monitor_factory_get_device_monitor_type (GstDeviceMonitorFactory *factory);
-
-const gchar *           gst_device_monitor_factory_get_metadata       (GstDeviceMonitorFactory *factory, const gchar *key);
-gchar **                gst_device_monitor_factory_get_metadata_keys  (GstDeviceMonitorFactory *factory);
-
-GstDeviceMonitor*       gst_device_monitor_factory_get                (GstDeviceMonitorFactory *factory) G_GNUC_MALLOC;
-GstDeviceMonitor*       gst_device_monitor_factory_get_by_name        (const gchar *factoryname) G_GNUC_MALLOC;
-
-gboolean                gst_device_monitor_register                   (GstPlugin *plugin, const gchar *name,
-                                                                       guint rank,
-                                                                       GType type);
-
-gboolean      gst_device_monitor_factory_has_classesv (GstDeviceMonitorFactory * factory,
-                                                       gchar ** classes);
-
-gboolean      gst_device_monitor_factory_has_classes (GstDeviceMonitorFactory *factory,
-                                                      const gchar * classes);
-
-GList *       gst_device_monitor_factory_list_get_device_monitors (const gchar *classes,
-                                                                   GstRank minrank) G_GNUC_MALLOC;
-
-G_END_DECLS
-
-#endif /* __GST_DEVICE_MONITOR_FACTORY_H__ */
diff --git a/gst/gstdeviceprovider.c b/gst/gstdeviceprovider.c
new file mode 100644 (file)
index 0000000..1cf1749
--- /dev/null
@@ -0,0 +1,591 @@
+/* GStreamer
+ * Copyright (C) 2012 Olivier Crete <olivier.crete@collabora.com>
+ *
+ * gstdeviceprovider.c: Device probing and monitoring
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstdeviceprovider
+ * @short_description: A device provider, monitor and prober
+ * @see_also: #GstDevice, #GstGlobalDeviceMonitor
+ *
+ * A #GstDeviceProvider subclass is provided by a plugin that handles devices
+ * if there is a way to programatically list connected devices. It can also
+ * optionally provide updates to the list of connected devices.
+ *
+ * Each #GstDeviceProvider subclass is a singleton, a plugin should
+ * normally provide a single subclass for all devices.
+ *
+ * Applications would normally use a #GstGlobalDeviceMonitor to monitor devices
+ * from all relevant providers.
+ *
+ * Since: 1.4
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gst_private.h"
+
+#include "gstdeviceprovider.h"
+
+#include "gstelementmetadata.h"
+#include "gstquark.h"
+
+struct _GstDeviceProviderPrivate
+{
+  GstBus *bus;
+
+  GMutex start_lock;
+
+  gboolean started_count;
+};
+
+/* this is used in gstelementfactory.c:gst_element_register() */
+GQuark __gst_deviceproviderclass_factory = 0;
+
+static void gst_device_provider_class_init (GstDeviceProviderClass * klass);
+static void gst_device_provider_init (GstDeviceProvider * element);
+static void gst_device_provider_base_class_init (gpointer g_class);
+static void gst_device_provider_base_class_finalize (gpointer g_class);
+static void gst_device_provider_dispose (GObject * object);
+static void gst_device_provider_finalize (GObject * object);
+
+static gpointer gst_device_provider_parent_class = NULL;
+
+GType
+gst_device_provider_get_type (void)
+{
+  static volatile gsize gst_device_provider_type = 0;
+
+  if (g_once_init_enter (&gst_device_provider_type)) {
+    GType _type;
+    static const GTypeInfo element_info = {
+      sizeof (GstDeviceProviderClass),
+      gst_device_provider_base_class_init,
+      gst_device_provider_base_class_finalize,
+      (GClassInitFunc) gst_device_provider_class_init,
+      NULL,
+      NULL,
+      sizeof (GstDeviceProvider),
+      0,
+      (GInstanceInitFunc) gst_device_provider_init,
+      NULL
+    };
+
+    _type = g_type_register_static (GST_TYPE_OBJECT, "GstDeviceProvider",
+        &element_info, G_TYPE_FLAG_ABSTRACT);
+
+    __gst_deviceproviderclass_factory =
+        g_quark_from_static_string ("GST_DEVICEPROVIDERCLASS_FACTORY");
+    g_once_init_leave (&gst_device_provider_type, _type);
+  }
+  return gst_device_provider_type;
+}
+
+static void
+gst_device_provider_base_class_init (gpointer g_class)
+{
+  GstDeviceProviderClass *klass = GST_DEVICE_PROVIDER_CLASS (g_class);
+
+  /* Copy the element details here so elements can inherit the
+   * details from their base class and classes only need to set
+   * the details in class_init instead of base_init */
+  klass->metadata =
+      klass->metadata ? gst_structure_copy (klass->metadata) :
+      gst_structure_new_empty ("metadata");
+
+  klass->factory = g_type_get_qdata (G_TYPE_FROM_CLASS (klass),
+      __gst_deviceproviderclass_factory);
+}
+
+static void
+gst_device_provider_base_class_finalize (gpointer g_class)
+{
+  GstDeviceProviderClass *klass = GST_DEVICE_PROVIDER_CLASS (g_class);
+
+  gst_structure_free (klass->metadata);
+}
+
+static void
+gst_device_provider_class_init (GstDeviceProviderClass * klass)
+{
+  GObjectClass *gobject_class = (GObjectClass *) klass;
+
+  gst_device_provider_parent_class = g_type_class_peek_parent (klass);
+
+  g_type_class_add_private (klass, sizeof (GstDeviceProviderPrivate));
+
+  gobject_class->dispose = gst_device_provider_dispose;
+  gobject_class->finalize = gst_device_provider_finalize;
+}
+
+static void
+gst_device_provider_init (GstDeviceProvider * provider)
+{
+  provider->priv = G_TYPE_INSTANCE_GET_PRIVATE (provider,
+      GST_TYPE_DEVICE_PROVIDER, GstDeviceProviderPrivate);
+
+  g_mutex_init (&provider->priv->start_lock);
+
+  provider->priv->bus = gst_bus_new ();
+  gst_bus_set_flushing (provider->priv->bus, TRUE);
+}
+
+
+static void
+gst_device_provider_dispose (GObject * object)
+{
+  GstDeviceProvider *provider = GST_DEVICE_PROVIDER (object);
+
+  gst_object_replace ((GstObject **) & provider->priv->bus, NULL);
+
+  GST_OBJECT_LOCK (provider);
+  g_list_free_full (provider->devices, (GDestroyNotify) gst_object_unparent);
+  provider->devices = NULL;
+  GST_OBJECT_UNLOCK (provider);
+
+  G_OBJECT_CLASS (gst_device_provider_parent_class)->dispose (object);
+}
+
+static void
+gst_device_provider_finalize (GObject * object)
+{
+  GstDeviceProvider *provider = GST_DEVICE_PROVIDER (object);
+
+  g_mutex_clear (&provider->priv->start_lock);
+
+  G_OBJECT_CLASS (gst_device_provider_parent_class)->finalize (object);
+}
+
+/**
+ * gst_device_provider_class_add_metadata:
+ * @klass: class to set metadata for
+ * @key: the key to set
+ * @value: the value to set
+ *
+ * Set @key with @value as metadata in @klass.
+ */
+void
+gst_device_provider_class_add_metadata (GstDeviceProviderClass * klass,
+    const gchar * key, const gchar * value)
+{
+  g_return_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass));
+  g_return_if_fail (key != NULL);
+  g_return_if_fail (value != NULL);
+
+  gst_structure_set ((GstStructure *) klass->metadata,
+      key, G_TYPE_STRING, value, NULL);
+}
+
+/**
+ * gst_device_provider_class_add_static_metadata:
+ * @klass: class to set metadata for
+ * @key: the key to set
+ * @value: the value to set
+ *
+ * Set @key with @value as metadata in @klass.
+ *
+ * Same as gst_device_provider_class_add_metadata(), but @value must be a static string
+ * or an inlined string, as it will not be copied. (GStreamer plugins will
+ * be made resident once loaded, so this function can be used even from
+ * dynamically loaded plugins.)
+ *
+ * Since: 1.4
+ */
+void
+gst_device_provider_class_add_static_metadata (GstDeviceProviderClass * klass,
+    const gchar * key, const gchar * value)
+{
+  GValue val = G_VALUE_INIT;
+
+  g_return_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass));
+  g_return_if_fail (key != NULL);
+  g_return_if_fail (value != NULL);
+
+  g_value_init (&val, G_TYPE_STRING);
+  g_value_set_static_string (&val, value);
+  gst_structure_take_value ((GstStructure *) klass->metadata, key, &val);
+}
+
+/**
+ * gst_device_provider_class_set_metadata:
+ * @klass: class to set metadata for
+ * @longname: The long English name of the device provider. E.g. "File Sink"
+ * @classification: String describing the type of device provider, as an
+ *  unordered list separated with slashes ('/'). See draft-klass.txt of the
+ *  design docs
+ * for more details and common types. E.g: "Sink/File"
+ * @description: Sentence describing the purpose of the device provider.
+ * E.g: "Write stream to a file"
+ * @author: Name and contact details of the author(s). Use \n to separate
+ * multiple author metadata. E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
+ *
+ * Sets the detailed information for a #GstDeviceProviderClass.
+ * <note>This function is for use in _class_init functions only.</note>
+ *
+ * Since: 1.4
+ */
+void
+gst_device_provider_class_set_metadata (GstDeviceProviderClass * klass,
+    const gchar * longname, const gchar * classification,
+    const gchar * description, const gchar * author)
+{
+  g_return_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass));
+  g_return_if_fail (longname != NULL && *longname != '\0');
+  g_return_if_fail (classification != NULL && *classification != '\0');
+  g_return_if_fail (description != NULL && *description != '\0');
+  g_return_if_fail (author != NULL && *author != '\0');
+
+  gst_structure_id_set ((GstStructure *) klass->metadata,
+      GST_QUARK (ELEMENT_METADATA_LONGNAME), G_TYPE_STRING, longname,
+      GST_QUARK (ELEMENT_METADATA_KLASS), G_TYPE_STRING, classification,
+      GST_QUARK (ELEMENT_METADATA_DESCRIPTION), G_TYPE_STRING, description,
+      GST_QUARK (ELEMENT_METADATA_AUTHOR), G_TYPE_STRING, author, NULL);
+}
+
+/**
+ * gst_device_provider_class_set_static_metadata:
+ * @klass: class to set metadata for
+ * @longname: The long English name of the element. E.g. "File Sink"
+ * @classification: String describing the type of element, as an unordered list
+ * separated with slashes ('/'). See draft-klass.txt of the design docs
+ * for more details and common types. E.g: "Sink/File"
+ * @description: Sentence describing the purpose of the element.
+ * E.g: "Write stream to a file"
+ * @author: Name and contact details of the author(s). Use \n to separate
+ * multiple author metadata. E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
+ *
+ * Sets the detailed information for a #GstDeviceProviderClass.
+ * <note>This function is for use in _class_init functions only.</note>
+ *
+ * Same as gst_device_provider_class_set_metadata(), but @longname, @classification,
+ * @description, and @author must be static strings or inlined strings, as
+ * they will not be copied. (GStreamer plugins will be made resident once
+ * loaded, so this function can be used even from dynamically loaded plugins.)
+ *
+ * Since: 1.4
+ */
+void
+gst_device_provider_class_set_static_metadata (GstDeviceProviderClass * klass,
+    const gchar * longname, const gchar * classification,
+    const gchar * description, const gchar * author)
+{
+  GstStructure *s = (GstStructure *) klass->metadata;
+  GValue val = G_VALUE_INIT;
+
+  g_return_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass));
+  g_return_if_fail (longname != NULL && *longname != '\0');
+  g_return_if_fail (classification != NULL && *classification != '\0');
+  g_return_if_fail (description != NULL && *description != '\0');
+  g_return_if_fail (author != NULL && *author != '\0');
+
+  g_value_init (&val, G_TYPE_STRING);
+
+  g_value_set_static_string (&val, longname);
+  gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_LONGNAME), &val);
+
+  g_value_set_static_string (&val, classification);
+  gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_KLASS), &val);
+
+  g_value_set_static_string (&val, description);
+  gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_DESCRIPTION),
+      &val);
+
+  g_value_set_static_string (&val, author);
+  gst_structure_id_take_value (s, GST_QUARK (ELEMENT_METADATA_AUTHOR), &val);
+}
+
+/**
+ * gst_device_provider_class_get_metadata:
+ * @klass: class to get metadata for
+ * @key: the key to get
+ *
+ * Get metadata with @key in @klass.
+ *
+ * Returns: the metadata for @key.
+ *
+ * Since: 1.4
+ */
+const gchar *
+gst_device_provider_class_get_metadata (GstDeviceProviderClass * klass,
+    const gchar * key)
+{
+  g_return_val_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass), NULL);
+  g_return_val_if_fail (key != NULL, NULL);
+
+  return gst_structure_get_string ((GstStructure *) klass->metadata, key);
+}
+
+/**
+ * gst_device_provider_get_devices:
+ * @provider: A #GstDeviceProvider
+ *
+ * Gets a list of devices that this provider understands. This may actually
+ * probe the hardware if the provider is not currently started.
+ *
+ * Returns: (transfer full) (element-type GstDevice): a #GList of
+ *   #GstDevice
+ *
+ * Since: 1.4
+ */
+
+GList *
+gst_device_provider_get_devices (GstDeviceProvider * provider)
+{
+  GstDeviceProviderClass *klass;
+  GList *devices = NULL;
+  gboolean started;
+  GList *item;
+
+  g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), NULL);
+  klass = GST_DEVICE_PROVIDER_GET_CLASS (provider);
+
+  g_mutex_lock (&provider->priv->start_lock);
+  started = (provider->priv->started_count > 0);
+
+  if (started) {
+    GST_OBJECT_LOCK (provider);
+    for (item = provider->devices; item; item = item->next)
+      devices = g_list_prepend (devices, gst_object_ref (item->data));
+    GST_OBJECT_UNLOCK (provider);
+  } else if (klass->probe)
+    devices = klass->probe (provider);
+
+  g_mutex_unlock (&provider->priv->start_lock);
+
+  return devices;
+}
+
+/**
+ * gst_device_provider_start:
+ * @provider: A #GstDeviceProvider
+ *
+ * Starts providering the devices. This will cause #GST_MESSAGE_DEVICE messages
+ * to be posted on the provider's bus when devices are added or removed from
+ * the system.
+ *
+ * Since the #GstDeviceProvider is a singleton,
+ * gst_device_provider_start() may already have been called by another
+ * user of the object, gst_device_provider_stop() needs to be called the same
+ * number of times.
+ *
+ * Returns: %TRUE if the device providering could be started
+ *
+ * Since: 1.4
+ */
+
+gboolean
+gst_device_provider_start (GstDeviceProvider * provider)
+{
+  GstDeviceProviderClass *klass;
+  gboolean ret = FALSE;
+
+  g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), FALSE);
+  klass = GST_DEVICE_PROVIDER_GET_CLASS (provider);
+
+  g_mutex_lock (&provider->priv->start_lock);
+
+  if (provider->priv->started_count > 0) {
+    ret = TRUE;
+    goto started;
+  }
+
+  if (klass->start)
+    ret = klass->start (provider);
+
+  if (ret) {
+    provider->priv->started_count++;
+    gst_bus_set_flushing (provider->priv->bus, FALSE);
+  }
+
+started:
+
+  g_mutex_unlock (&provider->priv->start_lock);
+
+  return ret;
+}
+
+/**
+ * gst_device_provider_stop:
+ * @provider: A #GstDeviceProvider
+ *
+ * Decreases the use-count by one. If the use count reaches zero, this
+ * #GstDeviceProvider will stop providering the devices. This needs to be
+ * called the same number of times that gst_device_provider_start() was called.
+ *
+ * Since: 1.4
+ */
+
+void
+gst_device_provider_stop (GstDeviceProvider * provider)
+{
+  GstDeviceProviderClass *klass;
+
+  g_return_if_fail (GST_IS_DEVICE_PROVIDER (provider));
+  klass = GST_DEVICE_PROVIDER_GET_CLASS (provider);
+
+  g_mutex_lock (&provider->priv->start_lock);
+
+  if (provider->priv->started_count == 1) {
+    gst_bus_set_flushing (provider->priv->bus, TRUE);
+    if (klass->stop)
+      klass->stop (provider);
+    GST_OBJECT_LOCK (provider);
+    g_list_free_full (provider->devices, (GDestroyNotify) gst_object_unparent);
+    provider->devices = NULL;
+    GST_OBJECT_UNLOCK (provider);
+  } else if (provider->priv->started_count < 1) {
+    g_critical
+        ("Trying to stop a GstDeviceProvider %s which is already stopped",
+        GST_OBJECT_NAME (provider));
+  }
+
+  provider->priv->started_count--;
+  g_mutex_unlock (&provider->priv->start_lock);
+}
+
+
+/**
+ * gst_device_provider_get_factory:
+ * @provider: a #GstDeviceProvider to request the device provider factory of.
+ *
+ * Retrieves the factory that was used to create this device provider.
+ *
+ * Returns: (transfer none): the #GstDeviceProviderFactory used for
+ *     creating this device provider. no refcounting is needed.
+ *
+ * Since: 1.4
+ */
+GstDeviceProviderFactory *
+gst_device_provider_get_factory (GstDeviceProvider * provider)
+{
+  g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), NULL);
+
+  return GST_DEVICE_PROVIDER_GET_CLASS (provider)->factory;
+}
+
+/**
+ * gst_device_provider_can_provider:
+ * @provider: a #GstDeviceProvider
+ *
+ * If this function returns %TRUE, then the device provider can provider if
+ * devices are added or removed. Otherwise, it can only do static probing.
+ *
+ * Returns: %TRUE if the #GstDeviceProvider support providering, %FALSE otherwise
+ */
+gboolean
+gst_device_provider_can_monitor (GstDeviceProvider * provider)
+{
+  GstDeviceProviderClass *klass;
+
+  g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), FALSE);
+  klass = GST_DEVICE_PROVIDER_GET_CLASS (provider);
+
+  if (klass->start)
+    return TRUE;
+  else
+    return FALSE;
+}
+
+/**
+ * gst_device_provider_get_bus:
+ * @provider: a #GstDeviceProvider
+ *
+ * Gets the #GstBus of this #GstDeviceProvider
+ *
+ * Returns: (transfer full): a #GstBus
+ *
+ * Since: 1.4
+ */
+GstBus *
+gst_device_provider_get_bus (GstDeviceProvider * provider)
+{
+  g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), NULL);
+
+  return gst_object_ref (provider->priv->bus);
+}
+
+/**
+ * gst_device_provider_device_add:
+ * @provider: a #GstDeviceProvider
+ * @device: (transfer full): a #GstDevice that has been added
+ *
+ * Posts a message on the provider's #GstBus to inform applications that
+ * a new device has been added.
+ *
+ * This is for use by subclasses.
+ *
+ * Since: 1.4
+ */
+void
+gst_device_provider_device_add (GstDeviceProvider * provider,
+    GstDevice * device)
+{
+  GstMessage *message;
+
+  if (!gst_object_set_parent (GST_OBJECT (device), GST_OBJECT (provider))) {
+    GST_WARNING_OBJECT (provider, "Could not parent device %p to provider,"
+        " it already has a parent", device);
+    return;
+  }
+
+  GST_OBJECT_LOCK (provider);
+  provider->devices = g_list_prepend (provider->devices,
+      gst_object_ref (device));
+  GST_OBJECT_UNLOCK (provider);
+
+  message = gst_message_new_device_added (GST_OBJECT (provider), device);
+  gst_bus_post (provider->priv->bus, message);
+  gst_object_unref (device);
+}
+
+
+/**
+ * gst_device_provider_device_remove:
+ * @provider: a #GstDeviceProvider
+ * @device: a #GstDevice that has been removed
+ *
+ * Posts a message on the provider's #GstBus to inform applications that
+ * a device has been removed.
+ *
+ * This is for use by subclasses.
+ *
+ * Since: 1.4
+ */
+void
+gst_device_provider_device_remove (GstDeviceProvider * provider,
+    GstDevice * device)
+{
+  GstMessage *message;
+  GList *item;
+
+  GST_OBJECT_LOCK (provider);
+  item = g_list_find (provider->devices, device);
+  if (item) {
+    provider->devices = g_list_delete_link (provider->devices, item);
+  }
+  GST_OBJECT_UNLOCK (provider);
+
+  message = gst_message_new_device_removed (GST_OBJECT (provider), device);
+  g_signal_emit_by_name (device, "removed");
+  gst_bus_post (provider->priv->bus, message);
+  if (item)
+    gst_object_unparent (GST_OBJECT (device));
+}
diff --git a/gst/gstdeviceprovider.h b/gst/gstdeviceprovider.h
new file mode 100644 (file)
index 0000000..6370afc
--- /dev/null
@@ -0,0 +1,142 @@
+/* GStreamer
+ * Copyright (C) 2012 Olivier Crete <olivier.crete@collabora.com>
+ *
+ * gstdeviceprovider.h: Device probing and monitoring
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/gstdeviceproviderfactory.h>
+
+
+#ifndef __GST_DEVICE_PROVIDER_H__
+#define __GST_DEVICE_PROVIDER_H__
+
+#include <gst/gstelement.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstDeviceProvider GstDeviceProvider;
+typedef struct _GstDeviceProviderClass GstDeviceProviderClass;
+typedef struct _GstDeviceProviderPrivate GstDeviceProviderPrivate;
+
+#define GST_TYPE_DEVICE_PROVIDER                 (gst_device_provider_get_type())
+#define GST_IS_DEVICE_PROVIDER(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEVICE_PROVIDER))
+#define GST_IS_DEVICE_PROVIDER_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEVICE_PROVIDER))
+#define GST_DEVICE_PROVIDER_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEVICE_PROVIDER, GstDeviceProviderClass))
+#define GST_DEVICE_PROVIDER(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEVICE_PROVIDER, GstDeviceProvider))
+#define GST_DEVICE_PROVIDER_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEVICE_PROVIDER, GstDeviceProviderClass))
+#define GST_DEVICE_PROVIDER_CAST(obj)            ((GstDeviceProvider *)(obj))
+
+
+/**
+ * GstDeviceProvider:
+ * @parent: The parent #GstObject
+ * @devices: a #GList of the #GstDevice objects
+ *
+ * The structure of the base #GstDeviceProvider
+ *
+ * Since: 1.4
+ */
+struct _GstDeviceProvider {
+  GstObject         parent;
+
+  /* Protected by the Object lock */
+  GList *devices;
+
+  /*< private >*/
+
+  GstDeviceProviderPrivate *priv;
+
+  gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstDeviceProviderClass:
+ * @parent_class: the parent #GstObjectClass structure
+ * @factory: a pointer to the #GstDeviceProviderFactory that creates this
+ *  provider
+ * @probe: Returns a list of devices that are currently available.
+ *  This should never block.
+ * @start: Starts monitoring for new devices. Only subclasses that can know
+ *  that devices have been added or remove need to implement this method.
+ * @stop: Stops monitoring for new devices. Only subclasses that implement
+ *  the start() method need to implement this method.
+ *
+ * The structure of the base #GstDeviceProviderClass
+ *
+ * Since: 1.4
+ */
+
+struct _GstDeviceProviderClass {
+  GstObjectClass    parent_class;
+
+  GstDeviceProviderFactory     *factory;
+
+  GList*      (*probe) (GstDeviceProvider * provider);
+
+  gboolean    (*start) (GstDeviceProvider * provider);
+  void        (*stop)  (GstDeviceProvider * provider);
+
+  /*< private >*/
+  gpointer metadata;
+
+  /*< private >*/
+  gpointer _gst_reserved[GST_PADDING];
+};
+
+GType       gst_device_provider_get_type (void);
+
+
+GList *     gst_device_provider_get_devices    (GstDeviceProvider * provider);
+
+gboolean    gst_device_provider_start          (GstDeviceProvider * provider);
+void        gst_device_provider_stop           (GstDeviceProvider * provider);
+
+gboolean    gst_device_provider_can_monitor    (GstDeviceProvider * provider);
+
+GstBus *    gst_device_provider_get_bus        (GstDeviceProvider * provider);
+
+void        gst_device_provider_device_add     (GstDeviceProvider * provider,
+                                               GstDevice * device);
+void        gst_device_provider_device_remove  (GstDeviceProvider * provider,
+                                               GstDevice * device);
+
+
+/* device provider class meta data */
+void        gst_device_provider_class_set_metadata          (GstDeviceProviderClass *klass,
+                                                            const gchar     *longname,
+                                                            const gchar     *classification,
+                                                            const gchar     *description,
+                                                            const gchar     *author);
+void        gst_device_provider_class_set_static_metadata   (GstDeviceProviderClass *klass,
+                                                            const gchar     *longname,
+                                                            const gchar     *classification,
+                                                            const gchar     *description,
+                                                            const gchar     *author);
+void        gst_device_provider_class_add_metadata          (GstDeviceProviderClass * klass,
+                                                            const gchar * key, const gchar * value);
+void        gst_device_provider_class_add_static_metadata   (GstDeviceProviderClass * klass,
+                                                            const gchar * key, const gchar * value);
+const gchar * gst_device_provider_class_get_metadata        (GstDeviceProviderClass * klass,
+                                                              const gchar * key);
+
+/* factory management */
+GstDeviceProviderFactory * gst_device_provider_get_factory   (GstDeviceProvider * provider);
+
+G_END_DECLS
+
+#endif /* __GST_DEVICE_PROVIDER_H__ */
diff --git a/gst/gstdeviceproviderfactory.c b/gst/gstdeviceproviderfactory.c
new file mode 100644 (file)
index 0000000..d0586af
--- /dev/null
@@ -0,0 +1,596 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ *                    2000 Wim Taymans <wtay@chello.be>
+ *                    2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gstdeviceproviderfactory.c: GstDeviceProviderFactory object, support routines
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstdeviceproviderfactory
+ * @short_description: Create GstDeviceProviders from a factory
+ * @see_also: #GstDeviceProvider, #GstPlugin, #GstPluginFeature, #GstPadTemplate.
+ *
+ * #GstDeviceProviderFactory is used to create instances of device providers. A
+ * GstDeviceProviderfactory can be added to a #GstPlugin as it is also a
+ * #GstPluginFeature.
+ *
+ * Use the gst_device_provider_factory_find() and gst_device_provider_factory_create()
+ * functions to create device provider instances or use gst_device_provider_factory_make() as a
+ * convenient shortcut.
+ *
+ * Since: 1.4
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gst_private.h"
+
+#include "gstdeviceproviderfactory.h"
+#include "gst.h"
+
+#include "glib-compat-private.h"
+
+GST_DEBUG_CATEGORY_STATIC (device_provider_factory_debug);
+#define GST_CAT_DEFAULT device_provider_factory_debug
+
+static void gst_device_provider_factory_finalize (GObject * object);
+static void gst_device_provider_factory_cleanup (GstDeviceProviderFactory *
+    factory);
+
+/* static guint gst_device_provider_factory_signals[LAST_SIGNAL] = { 0 }; */
+
+/* this is defined in gstelement.c */
+extern GQuark __gst_deviceproviderclass_factory;
+
+#define _do_init \
+{ \
+  GST_DEBUG_CATEGORY_INIT (device_provider_factory_debug, "GST_DEVICE_PROVIDER_FACTORY", \
+      GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, \
+      "device provider factories keep information about installed device providers"); \
+}
+
+G_DEFINE_TYPE_WITH_CODE (GstDeviceProviderFactory, gst_device_provider_factory,
+    GST_TYPE_PLUGIN_FEATURE, _do_init);
+
+static void
+gst_device_provider_factory_class_init (GstDeviceProviderFactoryClass * klass)
+{
+  GObjectClass *gobject_class = (GObjectClass *) klass;
+
+  gobject_class->finalize = gst_device_provider_factory_finalize;
+}
+
+static void
+gst_device_provider_factory_init (GstDeviceProviderFactory * factory)
+{
+}
+
+static void
+gst_device_provider_factory_finalize (GObject * object)
+{
+  GstDeviceProviderFactory *factory = GST_DEVICE_PROVIDER_FACTORY (object);
+  GstDeviceProvider *provider;
+
+  gst_device_provider_factory_cleanup (factory);
+
+  provider = g_atomic_pointer_get (&factory->provider);
+  if (provider)
+    gst_object_unref (provider);
+
+  G_OBJECT_CLASS (gst_device_provider_factory_parent_class)->finalize (object);
+}
+
+/**
+ * gst_device_provider_factory_find:
+ * @name: name of factory to find
+ *
+ * Search for an device provider factory of the given name. Refs the returned
+ * device provider factory; caller is responsible for unreffing.
+ *
+ * Returns: (transfer full) (nullable): #GstDeviceProviderFactory if
+ * found, %NULL otherwise
+ *
+ * Since: 1.4
+ */
+GstDeviceProviderFactory *
+gst_device_provider_factory_find (const gchar * name)
+{
+  GstPluginFeature *feature;
+
+  g_return_val_if_fail (name != NULL, NULL);
+
+  feature = gst_registry_find_feature (gst_registry_get (), name,
+      GST_TYPE_DEVICE_PROVIDER_FACTORY);
+  if (feature)
+    return GST_DEVICE_PROVIDER_FACTORY (feature);
+
+  /* this isn't an error, for instance when you query if an device provider factory is
+   * present */
+  GST_LOG ("no such device provider factory \"%s\"", name);
+
+  return NULL;
+}
+
+static void
+gst_device_provider_factory_cleanup (GstDeviceProviderFactory * factory)
+{
+  if (factory->metadata) {
+    gst_structure_free ((GstStructure *) factory->metadata);
+    factory->metadata = NULL;
+  }
+  if (factory->type) {
+    factory->type = G_TYPE_INVALID;
+  }
+}
+
+#define CHECK_METADATA_FIELD(klass, name, key)                                 \
+  G_STMT_START {                                                               \
+    const gchar *metafield = gst_device_provider_class_get_metadata (klass, key);      \
+    if (G_UNLIKELY (metafield == NULL || *metafield == '\0')) {                \
+      g_warning ("Device provider factory metadata for '%s' has no valid %s field", name, key);    \
+      goto detailserror;                                                       \
+    } \
+  } G_STMT_END;
+
+/**
+ * gst_device_provider_register:
+ * @plugin: (allow-none): #GstPlugin to register the device provider with, or %NULL for
+ *     a static device provider.
+ * @name: name of device providers of this type
+ * @rank: rank of device provider (higher rank means more importance when autoplugging)
+ * @type: GType of device provider to register
+ *
+ * Create a new device providerfactory capable of instantiating objects of the
+ * @type and add the factory to @plugin.
+ *
+ * Returns: %TRUE, if the registering succeeded, %FALSE on error
+ *
+ * Since: 1.4
+ */
+gboolean
+gst_device_provider_register (GstPlugin * plugin, const gchar * name,
+    guint rank, GType type)
+{
+  GstPluginFeature *existing_feature;
+  GstRegistry *registry;
+  GstDeviceProviderFactory *factory;
+  GstDeviceProviderClass *klass;
+
+  g_return_val_if_fail (name != NULL, FALSE);
+  g_return_val_if_fail (g_type_is_a (type, GST_TYPE_DEVICE_PROVIDER), FALSE);
+
+  registry = gst_registry_get ();
+
+  /* check if feature already exists, if it exists there is no need to update it
+   * when the registry is getting updated, outdated plugins and all their
+   * features are removed and readded.
+   */
+  existing_feature = gst_registry_lookup_feature (registry, name);
+  if (existing_feature) {
+    GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)",
+        existing_feature, name);
+    factory = GST_DEVICE_PROVIDER_FACTORY_CAST (existing_feature);
+    factory->type = type;
+    existing_feature->loaded = TRUE;
+    g_type_set_qdata (type, __gst_deviceproviderclass_factory, factory);
+    gst_object_unref (existing_feature);
+    return TRUE;
+  }
+
+  factory =
+      GST_DEVICE_PROVIDER_FACTORY_CAST (g_object_newv
+      (GST_TYPE_DEVICE_PROVIDER_FACTORY, 0, NULL));
+  gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name);
+  GST_LOG_OBJECT (factory, "Created new device providerfactory for type %s",
+      g_type_name (type));
+
+  /* provide info needed during class structure setup */
+  g_type_set_qdata (type, __gst_deviceproviderclass_factory, factory);
+  klass = GST_DEVICE_PROVIDER_CLASS (g_type_class_ref (type));
+
+  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_LONGNAME);
+  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_KLASS);
+  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_DESCRIPTION);
+  CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_AUTHOR);
+
+  factory->type = type;
+  factory->metadata = gst_structure_copy ((GstStructure *) klass->metadata);
+
+  if (plugin && plugin->desc.name) {
+    GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = plugin->desc.name;
+    GST_PLUGIN_FEATURE_CAST (factory)->plugin = plugin;
+    g_object_add_weak_pointer ((GObject *) plugin,
+        (gpointer *) & GST_PLUGIN_FEATURE_CAST (factory)->plugin);
+  } else {
+    GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = "NULL";
+    GST_PLUGIN_FEATURE_CAST (factory)->plugin = NULL;
+  }
+  gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE_CAST (factory), rank);
+  GST_PLUGIN_FEATURE_CAST (factory)->loaded = TRUE;
+
+  gst_registry_add_feature (registry, GST_PLUGIN_FEATURE_CAST (factory));
+
+  return TRUE;
+
+  /* ERRORS */
+detailserror:
+  {
+    gst_device_provider_factory_cleanup (factory);
+    return FALSE;
+  }
+}
+
+/**
+ * gst_device_provider_factory_get:
+ * @factory: factory to instantiate
+ *
+ * Returns the device provider of the type defined by the given device
+ * providerfactory.
+ *
+ * Returns: (transfer full) (nullable): the #GstDeviceProvider or %NULL
+ * if the device provider couldn't be created
+ *
+ * Since: 1.4
+ */
+GstDeviceProvider *
+gst_device_provider_factory_get (GstDeviceProviderFactory * factory)
+{
+  GstDeviceProvider *device_provider;
+  GstDeviceProviderClass *oclass;
+  GstDeviceProviderFactory *newfactory;
+
+  g_return_val_if_fail (factory != NULL, NULL);
+
+  newfactory =
+      GST_DEVICE_PROVIDER_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
+          (factory)));
+
+  if (newfactory == NULL)
+    goto load_failed;
+
+  factory = newfactory;
+
+  GST_INFO ("getting device provider \"%s\"", GST_OBJECT_NAME (factory));
+
+  if (factory->type == 0)
+    goto no_type;
+
+  device_provider = g_atomic_pointer_get (&newfactory->provider);
+  if (device_provider)
+    return gst_object_ref (device_provider);
+
+  /* create an instance of the device provider, cast so we don't assert on NULL
+   * also set name as early as we can
+   */
+  device_provider = GST_DEVICE_PROVIDER_CAST (g_object_newv (factory->type, 0,
+          NULL));
+  if (G_UNLIKELY (device_provider == NULL))
+    goto no_device_provider;
+
+  /* fill in the pointer to the factory in the device provider class. The
+   * class will not be unreffed currently.
+   * Be thread safe as there might be 2 threads creating the first instance of
+   * an device provider at the same moment
+   */
+  oclass = GST_DEVICE_PROVIDER_GET_CLASS (device_provider);
+  if (!g_atomic_pointer_compare_and_exchange (&oclass->factory, NULL, factory))
+    gst_object_unref (factory);
+
+  gst_object_ref_sink (device_provider);
+
+  /* We use an atomic to make sure we don't create two in parallel */
+  if (!g_atomic_pointer_compare_and_exchange (&newfactory->provider, NULL,
+          device_provider)) {
+    gst_object_unref (device_provider);
+
+    device_provider = g_atomic_pointer_get (&newfactory->provider);
+  }
+
+  GST_DEBUG ("created device provider \"%s\"", GST_OBJECT_NAME (factory));
+
+  return gst_object_ref (device_provider);
+
+  /* ERRORS */
+load_failed:
+  {
+    GST_WARNING_OBJECT (factory,
+        "loading plugin containing feature %s returned NULL!",
+        GST_OBJECT_NAME (factory));
+    return NULL;
+  }
+no_type:
+  {
+    GST_WARNING_OBJECT (factory, "factory has no type");
+    gst_object_unref (factory);
+    return NULL;
+  }
+no_device_provider:
+  {
+    GST_WARNING_OBJECT (factory, "could not create device provider");
+    gst_object_unref (factory);
+    return NULL;
+  }
+}
+
+/**
+ * gst_device_provider_factory_get_by_name:
+ * @factoryname: a named factory to instantiate
+ *
+ * Returns the device provider of the type defined by the given device
+ * provider factory.
+ *
+ * Returns: (transfer full) (nullable): a #GstDeviceProvider or %NULL
+ * if unable to create device provider
+ *
+ * Since: 1.4
+ */
+GstDeviceProvider *
+gst_device_provider_factory_get_by_name (const gchar * factoryname)
+{
+  GstDeviceProviderFactory *factory;
+  GstDeviceProvider *device_provider;
+
+  g_return_val_if_fail (factoryname != NULL, NULL);
+  g_return_val_if_fail (gst_is_initialized (), NULL);
+
+  GST_LOG ("gstdeviceproviderfactory: get_by_name \"%s\"", factoryname);
+
+  factory = gst_device_provider_factory_find (factoryname);
+  if (factory == NULL)
+    goto no_factory;
+
+  GST_LOG_OBJECT (factory, "found factory %p", factory);
+  device_provider = gst_device_provider_factory_get (factory);
+  if (device_provider == NULL)
+    goto create_failed;
+
+  gst_object_unref (factory);
+  return device_provider;
+
+  /* ERRORS */
+no_factory:
+  {
+    GST_INFO ("no such device provider factory \"%s\"!", factoryname);
+    return NULL;
+  }
+create_failed:
+  {
+    GST_INFO_OBJECT (factory, "couldn't create instance!");
+    gst_object_unref (factory);
+    return NULL;
+  }
+}
+
+/**
+ * gst_device_provider_factory_get_device_provider_type:
+ * @factory: factory to get managed #GType from
+ *
+ * Get the #GType for device providers managed by this factory. The type can
+ * only be retrieved if the device provider factory is loaded, which can be
+ * assured with gst_plugin_feature_load().
+ *
+ * Returns: the #GType for device providers managed by this factory or 0 if
+ * the factory is not loaded.
+ *
+ * Since: 1.4
+ */
+GType
+gst_device_provider_factory_get_device_provider_type (GstDeviceProviderFactory *
+    factory)
+{
+  g_return_val_if_fail (GST_IS_DEVICE_PROVIDER_FACTORY (factory), 0);
+
+  return factory->type;
+}
+
+/**
+ * gst_device_provider_factory_get_metadata:
+ * @factory: a #GstDeviceProviderFactory
+ * @key: a key
+ *
+ * Get the metadata on @factory with @key.
+ *
+ * Returns: (nullable): the metadata with @key on @factory or %NULL
+ * when there was no metadata with the given @key.
+ *
+ * Since: 1.4
+ */
+const gchar *
+gst_device_provider_factory_get_metadata (GstDeviceProviderFactory * factory,
+    const gchar * key)
+{
+  return gst_structure_get_string ((GstStructure *) factory->metadata, key);
+}
+
+/**
+ * gst_device_provider_factory_get_metadata_keys:
+ * @factory: a #GstDeviceProviderFactory
+ *
+ * Get the available keys for the metadata on @factory.
+ *
+ * Returns: (transfer full) (element-type utf8) (array zero-terminated=1) (nullable):
+ * a %NULL-terminated array of key strings, or %NULL when there is no
+ * metadata. Free with g_strfreev() when no longer needed.
+ *
+ * Since: 1.4
+ */
+gchar **
+gst_device_provider_factory_get_metadata_keys (GstDeviceProviderFactory *
+    factory)
+{
+  GstStructure *metadata;
+  gchar **arr;
+  gint i, num;
+
+  g_return_val_if_fail (GST_IS_DEVICE_PROVIDER_FACTORY (factory), NULL);
+
+  metadata = (GstStructure *) factory->metadata;
+  if (metadata == NULL)
+    return NULL;
+
+  num = gst_structure_n_fields (metadata);
+  if (num == 0)
+    return NULL;
+
+  arr = g_new (gchar *, num + 1);
+  for (i = 0; i < num; ++i) {
+    arr[i] = g_strdup (gst_structure_nth_field_name (metadata, i));
+  }
+  arr[i] = NULL;
+  return arr;
+}
+
+/**
+ * gst_device_provider_factory_has_classesv:
+ * @factory: a #GstDeviceProviderFactory
+ * @classes: (array zero-terminated=1): a %NULL terminated array of
+ *   klasses to match, only match if all classes are matched
+ *
+ * Check if @factory matches all of the given classes
+ *
+ * Returns: %TRUE if @factory matches.
+ *
+ * Since: 1.4
+ */
+gboolean
+gst_device_provider_factory_has_classesv (GstDeviceProviderFactory * factory,
+    gchar ** classes)
+{
+  const gchar *klass;
+
+  g_return_val_if_fail (GST_IS_DEVICE_PROVIDER_FACTORY (factory), FALSE);
+
+  klass = gst_device_provider_factory_get_metadata (factory,
+      GST_ELEMENT_METADATA_KLASS);
+
+  if (klass == NULL) {
+    GST_ERROR_OBJECT (factory,
+        "device provider factory is missing klass identifiers");
+    return FALSE;
+  }
+
+  for (; classes[0]; classes++) {
+    const gchar *found;
+    guint len;
+
+    if (classes[0] == '\0')
+      continue;
+
+    found = strstr (klass, classes[0]);
+
+    if (!found)
+      return FALSE;
+    if (found != klass && *(found - 1) != '/')
+      return FALSE;
+
+    len = strlen (classes[0]);
+    if (found[len] != 0 && found[len] != '/')
+      return FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
+ * gst_device_provider_factory_has_classes:
+ * @factory: a #GstDeviceProviderFactory
+ * @classes: a "/" separate list of klasses to match, only match if all classes
+ *  are matched
+ *
+ * Check if @factory matches all of the given @classes
+ *
+ * Returns: %TRUE if @factory matches.
+ *
+ * Since: 1.4
+ */
+gboolean
+gst_device_provider_factory_has_classes (GstDeviceProviderFactory * factory,
+    const gchar * classes)
+{
+  gchar **classesv;
+  gboolean res;
+
+  classesv = g_strsplit (classes, "/", 0);
+
+  res = gst_device_provider_factory_has_classesv (factory, classesv);
+
+  g_strfreev (classesv);
+
+  return res;
+}
+
+typedef struct
+{
+  const char *classes;
+  GstRank minrank;
+} FilterData;
+
+static gboolean
+device_provider_filter (GstPluginFeature * feature, FilterData * data)
+{
+  gboolean res;
+
+  /* we only care about device provider factories */
+  if (G_UNLIKELY (!GST_IS_DEVICE_PROVIDER_FACTORY (feature)))
+    return FALSE;
+
+  res = (gst_plugin_feature_get_rank (feature) >= data->minrank) &&
+      gst_device_provider_factory_has_classes (GST_DEVICE_PROVIDER_FACTORY_CAST
+      (feature), data->classes);
+
+  return res;
+}
+
+/**
+ * gst_device_provider_factory_list_get_device_providers:
+ * @classes: a "/" separate list of klasses to match, only match if all classes
+ *  are matched
+ * @minrank: Minimum rank
+ *
+ * Get a list of factories that match all of the given @classes. Only
+ * device providers with a rank greater or equal to @minrank will be
+ * returned.  The list of factories is returned by decreasing rank.
+ *
+ * Returns: (transfer full) (element-type Gst.DeviceProviderFactory): a #GList of
+ *     #GstDeviceProviderFactory device providers. Use gst_plugin_feature_list_free() after
+ *     usage.
+ *
+ * Since: 1.4
+ */
+GList *gst_device_provider_factory_list_get_device_providers
+    (const gchar * classes, GstRank minrank)
+{
+  GList *result;
+  FilterData data;
+
+  /* prepare type */
+  data.classes = classes;
+  data.minrank = minrank;
+
+  /* get the feature list using the filter */
+  result = gst_registry_feature_filter (gst_registry_get (),
+      (GstPluginFeatureFilter) device_provider_filter, FALSE, &data);
+
+  /* sort on rank and name */
+  result = g_list_sort (result, gst_plugin_feature_rank_compare_func);
+
+  return result;
+}
diff --git a/gst/gstdeviceproviderfactory.h b/gst/gstdeviceproviderfactory.h
new file mode 100644 (file)
index 0000000..0d93e2f
--- /dev/null
@@ -0,0 +1,90 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ *               2000,2004 Wim Taymans <wim@fluendo.com>
+ *               2012 Olivier Crete <olivier.crete@collabora.com>
+ *
+ * gstdeviceproviderfactory.h: Header for GstDeviceProviderFactory
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+
+#ifndef __GST_DEVICE_PROVIDER_FACTORY_H__
+#define __GST_DEVICE_PROVIDER_FACTORY_H__
+
+/**
+ * GstDeviceProviderFactory:
+ *
+ * The opaque #GstDeviceProviderFactory data structure.
+ *
+ * Since: 1.4
+ */
+
+/**
+ * GstDeviceProviderFactoryClass:
+ *
+ * The opaque #GstDeviceProviderFactoryClass data structure.
+ *
+ * Since: 1.4
+ */
+typedef struct _GstDeviceProviderFactory GstDeviceProviderFactory;
+typedef struct _GstDeviceProviderFactoryClass GstDeviceProviderFactoryClass;
+
+#include <gst/gstconfig.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpluginfeature.h>
+#include <gst/gstdeviceprovider.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_DEVICE_PROVIDER_FACTORY            (gst_device_provider_factory_get_type())
+#define GST_DEVICE_PROVIDER_FACTORY(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEVICE_PROVIDER_FACTORY,\
+                                                 GstDeviceProviderFactory))
+#define GST_DEVICE_PROVIDER_FACTORY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEVICE_PROVIDER_FACTORY,\
+                                                 GstDeviceProviderFactoryClass))
+#define GST_IS_DEVICE_PROVIDER_FACTORY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEVICE_PROVIDER_FACTORY))
+#define GST_IS_DEVICE_PROVIDER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEVICE_PROVIDER_FACTORY))
+#define GST_DEVICE_PROVIDER_FACTORY_CAST(obj)       ((GstDeviceProviderFactory *)(obj))
+
+GType                   gst_device_provider_factory_get_type          (void);
+
+GstDeviceProviderFactory * gst_device_provider_factory_find            (const gchar *name);
+
+GType                   gst_device_provider_factory_get_device_provider_type (GstDeviceProviderFactory *factory);
+
+const gchar *           gst_device_provider_factory_get_metadata       (GstDeviceProviderFactory *factory, const gchar *key);
+gchar **                gst_device_provider_factory_get_metadata_keys  (GstDeviceProviderFactory *factory);
+
+GstDeviceProvider*       gst_device_provider_factory_get                (GstDeviceProviderFactory *factory) G_GNUC_MALLOC;
+GstDeviceProvider*       gst_device_provider_factory_get_by_name        (const gchar *factoryname) G_GNUC_MALLOC;
+
+gboolean                gst_device_provider_register                   (GstPlugin *plugin, const gchar *name,
+                                                                       guint rank,
+                                                                       GType type);
+
+gboolean      gst_device_provider_factory_has_classesv (GstDeviceProviderFactory * factory,
+                                                       gchar ** classes);
+
+gboolean      gst_device_provider_factory_has_classes (GstDeviceProviderFactory *factory,
+                                                      const gchar * classes);
+
+GList *       gst_device_provider_factory_list_get_device_providers (const gchar *classes,
+                                                                   GstRank minrank) G_GNUC_MALLOC;
+
+G_END_DECLS
+
+#endif /* __GST_DEVICE_PROVIDER_FACTORY_H__ */
index 68900efe959bb32924cf810eac3b557dac2ec491..0c9dda96175374cfdb8a490d6fab7cc874be8490 100644 (file)
 /**
  * SECTION:gstglobaldevicemonitor
  * @short_description: A global device monitor and prober
- * @see_also: #GstDevice, #GstDeviceMonitor
+ * @see_also: #GstDevice, #GstDeviceProvider
  *
  * Applications should create a #GstGlobalDeviceMonitor when they want
  * to probe, list and monitor devices of a specific type. The
  * #GstGlobalDeviceMonitor will create the appropriate
- * #GstDeviceMonitor objects and manage them. It will then post
+ * #GstDeviceProvider objects and manage them. It will then post
  * messages on its #GstBus for devices that have been added and
  * removed.
  *
@@ -48,7 +48,7 @@ struct _GstGlobalDeviceMonitorPrivate
 
   GstBus *bus;
 
-  GPtrArray *monitors;
+  GPtrArray *providers;
   guint cookie;
 
   GstCaps *caps;
@@ -111,28 +111,28 @@ gst_global_device_monitor_init (GstGlobalDeviceMonitor * self)
   self->priv->bus = gst_bus_new ();
   gst_bus_set_flushing (self->priv->bus, TRUE);
 
-  self->priv->monitors = g_ptr_array_new ();
+  self->priv->providers = g_ptr_array_new ();
   self->priv->caps = gst_caps_new_any ();
   self->priv->classes = g_strdup ("");
 
   factories =
-      gst_device_monitor_factory_list_get_device_monitors (self->priv->classes,
-      1);
+      gst_device_provider_factory_list_get_device_providers (self->priv->
+      classes, 1);
 
   while (factories) {
-    GstDeviceMonitorFactory *factory = factories->data;
-    GstDeviceMonitor *monitor;
+    GstDeviceProviderFactory *factory = factories->data;
+    GstDeviceProvider *provider;
 
     factories = g_list_remove (factories, factory);
 
-    monitor = gst_device_monitor_factory_get (factory);
-    if (monitor) {
-      GstBus *bus = gst_device_monitor_get_bus (monitor);
+    provider = gst_device_provider_factory_get (factory);
+    if (provider) {
+      GstBus *bus = gst_device_provider_get_bus (provider);
 
       gst_bus_enable_sync_message_emission (bus);
       g_signal_connect (bus, "sync-message",
           G_CALLBACK (bus_sync_message), self);
-      g_ptr_array_add (self->priv->monitors, monitor);
+      g_ptr_array_add (self->priv->providers, provider);
     }
 
     gst_object_unref (factory);
@@ -143,16 +143,16 @@ gst_global_device_monitor_init (GstGlobalDeviceMonitor * self)
 static void
 gst_global_device_monitor_remove (GstGlobalDeviceMonitor * self, guint i)
 {
-  GstDeviceMonitor *monitor = g_ptr_array_index (self->priv->monitors, i);
+  GstDeviceProvider *provider = g_ptr_array_index (self->priv->providers, i);
   GstBus *bus;
 
-  g_ptr_array_remove_index_fast (self->priv->monitors, i);
+  g_ptr_array_remove_index_fast (self->priv->providers, i);
 
-  bus = gst_device_monitor_get_bus (monitor);
+  bus = gst_device_provider_get_bus (provider);
   g_signal_handlers_disconnect_by_func (bus, bus_sync_message, self);
   gst_object_unref (bus);
 
-  gst_object_unref (monitor);
+  gst_object_unref (provider);
 }
 
 static void
@@ -162,11 +162,11 @@ gst_global_device_monitor_dispose (GObject * object)
 
   g_return_if_fail (self->priv->started == FALSE);
 
-  if (self->priv->monitors) {
-    while (self->priv->monitors->len)
-      gst_global_device_monitor_remove (self, self->priv->monitors->len - 1);
-    g_ptr_array_unref (self->priv->monitors);
-    self->priv->monitors = NULL;
+  if (self->priv->providers) {
+    while (self->priv->providers->len)
+      gst_global_device_monitor_remove (self, self->priv->providers->len - 1);
+    g_ptr_array_unref (self->priv->providers);
+    self->priv->providers = NULL;
   }
 
   gst_caps_replace (&self->priv->caps, NULL);
@@ -178,7 +178,7 @@ gst_global_device_monitor_dispose (GObject * object)
 
 /**
  * gst_global_device_monitor_get_devices:
- * @monitor: A #GstDeviceMonitor
+ * @monitor: A #GstDeviceProvider
  *
  * Gets a list of devices from all of the relevant monitors. This may actually
  * probe the hardware if the global monitor is not currently started.
@@ -207,15 +207,15 @@ again:
 
   cookie = monitor->priv->cookie;
 
-  for (i = 0; i < monitor->priv->monitors->len; i++) {
+  for (i = 0; i < monitor->priv->providers->len; i++) {
     GList *tmpdev;
-    GstDeviceMonitor *device_monitor =
-        gst_object_ref (g_ptr_array_index (monitor->priv->monitors, i));
+    GstDeviceProvider *provider =
+        gst_object_ref (g_ptr_array_index (monitor->priv->providers, i));
     GList *item;
 
     GST_OBJECT_UNLOCK (monitor);
 
-    tmpdev = gst_device_monitor_get_devices (device_monitor);
+    tmpdev = gst_device_provider_get_devices (provider);
 
     for (item = tmpdev; item; item = item->next) {
       GstDevice *dev = GST_DEVICE (item->data);
@@ -228,7 +228,7 @@ again:
     }
 
     g_list_free_full (tmpdev, gst_object_unref);
-    gst_object_unref (device_monitor);
+    gst_object_unref (provider);
 
     GST_OBJECT_LOCK (monitor);
 
@@ -263,20 +263,20 @@ gst_global_device_monitor_start (GstGlobalDeviceMonitor * monitor)
 
   GST_OBJECT_LOCK (monitor);
 
-  if (monitor->priv->monitors->len == 0) {
+  if (monitor->priv->providers->len == 0) {
     GST_OBJECT_UNLOCK (monitor);
     return FALSE;
   }
 
   gst_bus_set_flushing (monitor->priv->bus, FALSE);
 
-  for (i = 0; i < monitor->priv->monitors->len; i++) {
-    if (!gst_device_monitor_start (g_ptr_array_index (monitor->priv->monitors,
+  for (i = 0; i < monitor->priv->providers->len; i++) {
+    if (!gst_device_provider_start (g_ptr_array_index (monitor->priv->providers,
                 i))) {
       gst_bus_set_flushing (monitor->priv->bus, TRUE);
 
       for (; i != 0; i--)
-        gst_device_monitor_stop (g_ptr_array_index (monitor->priv->monitors,
+        gst_device_provider_stop (g_ptr_array_index (monitor->priv->providers,
                 i - 1));
 
       GST_OBJECT_UNLOCK (monitor);
@@ -292,7 +292,7 @@ gst_global_device_monitor_start (GstGlobalDeviceMonitor * monitor)
 
 /**
  * gst_global_device_monitor_stop:
- * @monitor: A #GstDeviceMonitor
+ * @monitor: A #GstDeviceProvider
  *
  * Stops monitoring the devices.
  *
@@ -308,8 +308,8 @@ gst_global_device_monitor_stop (GstGlobalDeviceMonitor * monitor)
   gst_bus_set_flushing (monitor->priv->bus, TRUE);
 
   GST_OBJECT_LOCK (monitor);
-  for (i = 0; i < monitor->priv->monitors->len; i++)
-    gst_device_monitor_stop (g_ptr_array_index (monitor->priv->monitors, i));
+  for (i = 0; i < monitor->priv->providers->len; i++)
+    gst_device_provider_stop (g_ptr_array_index (monitor->priv->providers, i));
   monitor->priv->started = FALSE;
   GST_OBJECT_UNLOCK (monitor);
 
@@ -345,15 +345,16 @@ gst_global_device_monitor_set_classes_filter (GstGlobalDeviceMonitor * monitor,
   g_free (monitor->priv->classes);
   monitor->priv->classes = g_strdup (classes);
 
-  factories = gst_device_monitor_factory_list_get_device_monitors (classes, 1);
+  factories = gst_device_provider_factory_list_get_device_providers (classes,
+      1);
 
-  for (i = 0; i < monitor->priv->monitors->len; i++) {
-    GstDeviceMonitor *dev_monitor;
-    GstDeviceMonitorFactory *f;
+  for (i = 0; i < monitor->priv->providers->len; i++) {
+    GstDeviceProvider *provider;
+    GstDeviceProviderFactory *f;
     GList *item;
 
-    dev_monitor = g_ptr_array_index (monitor->priv->monitors, i);
-    f = gst_device_monitor_get_factory (dev_monitor);
+    provider = g_ptr_array_index (monitor->priv->providers, i);
+    f = gst_device_provider_get_factory (provider);
 
     item = g_list_find (factories, f);
 
@@ -364,7 +365,7 @@ gst_global_device_monitor_set_classes_filter (GstGlobalDeviceMonitor * monitor,
       factories = g_list_remove_link (factories, item);
       gst_object_unref (f);
     } else {
-      /* If it's not in our list, them remove it from the list of monitors.
+      /* If it's not in our list, them remove it from the list of providers.
        */
 
       monitor->priv->cookie++;
@@ -374,20 +375,20 @@ gst_global_device_monitor_set_classes_filter (GstGlobalDeviceMonitor * monitor,
   }
 
   while (factories) {
-    GstDeviceMonitorFactory *factory = factories->data;
-    GstDeviceMonitor *device_monitor;
+    GstDeviceProviderFactory *factory = factories->data;
+    GstDeviceProvider *provider;
 
     factories = g_list_remove (factories, factory);
 
-    device_monitor = gst_device_monitor_factory_get (factory);
-    if (device_monitor) {
-      GstBus *bus = gst_device_monitor_get_bus (device_monitor);
+    provider = gst_device_provider_factory_get (factory);
+    if (provider) {
+      GstBus *bus = gst_device_provider_get_bus (provider);
 
       gst_bus_enable_sync_message_emission (bus);
       g_signal_connect (bus, "sync-message",
           G_CALLBACK (bus_sync_message), monitor);
       gst_object_unref (bus);
-      g_ptr_array_add (monitor->priv->monitors, device_monitor);
+      g_ptr_array_add (monitor->priv->providers, provider);
       monitor->priv->cookie++;
     }
 
@@ -484,7 +485,7 @@ gst_global_device_monitor_new (void)
 
 /**
  * gst_global_device_monitor_get_bus:
- * @monitor: a #GstDeviceMonitor
+ * @monitor: a #GstDeviceProvider
  *
  * Gets the #GstBus of this #GstGlobalDeviceMonitor
  *
index b92fd4023b79d266440226c6f607169c1e270f2f..c0b623a550b22bb107a280f3bc09bcecbb9636c1 100644 (file)
@@ -25,8 +25,8 @@
 
 #include <gst/gstobject.h>
 #include <gst/gstdevice.h>
-#include <gst/gstdevicemonitor.h>
-#include <gst/gstdevicemonitorfactory.h>
+#include <gst/gstdeviceprovider.h>
+#include <gst/gstdeviceproviderfactory.h>
 
 G_BEGIN_DECLS
 
index 5555fb23709d919573348167bb9988dea34e27e9..9119a003d7542c7dc5591fe7b5d93904092122cf 100644 (file)
@@ -2340,7 +2340,7 @@ gst_message_parse_have_context (GstMessage * message, GstContext ** context)
  * @device: (transfer none): The new #GstDevice
  *
  * Creates a new device-added message. The device-added message is produced by
- * #GstDeviceMonitor or a #GstGlobalDeviceMonitor. They announce the appearance
+ * #GstDeviceProvider or a #GstGlobalDeviceMonitor. They announce the appearance
  * of monitored devices.
  *
  * Returns: a newly allocated #GstMessage
@@ -2370,7 +2370,7 @@ gst_message_new_device_added (GstObject * src, GstDevice * device)
  *  pointer to the new #GstDevice, or %NULL
  * 
  * Parses a device-added message. The device-added message is produced by
- * #GstDeviceMonitor or a #GstGlobalDeviceMonitor. It announces the appearance
+ * #GstDeviceProvider or a #GstGlobalDeviceMonitor. It announces the appearance
  * of monitored devices.
  *
  * Since: 1.4
@@ -2392,7 +2392,7 @@ gst_message_parse_device_added (GstMessage * message, GstDevice ** device)
  * @device: (transfer none): The removed #GstDevice
  *
  * Creates a new device-removed message. The device-removed message is produced
- * by #GstDeviceMonitor or a #GstGlobalDeviceMonitor. They announce the
+ * by #GstDeviceProvider or a #GstGlobalDeviceMonitor. They announce the
  * disappearance of monitored devices.
  *
  * Returns: a newly allocated #GstMessage
@@ -2422,7 +2422,7 @@ gst_message_new_device_removed (GstObject * src, GstDevice * device)
  *  pointer to the removed #GstDevice, or %NULL
  *
  * Parses a device-removed message. The device-removed message is produced by
- * #GstDeviceMonitor or a #GstGlobalDeviceMonitor. It announces the
+ * #GstDeviceProvider or a #GstGlobalDeviceMonitor. It announces the
  * disappearance of monitored devices.
  *
  * Since: 1.4
index 8c8e9a8e39650856313ab59c952f971829655191..7d4282e74a0b50b02e8ca624a4ea5de8d8d9a397 100644 (file)
@@ -105,9 +105,9 @@ typedef struct _GstMessage GstMessage;
  *     filter for GST_MESSAGE_EXTENDED and then check the result for the
  *     specific type. (Since 1.4)
  * @GST_MESSAGE_DEVICE_ADDED: Message indicating a #GstDevice was added to
- *     a #GstDeviceMonitor (Since 1.4)
+ *     a #GstDeviceProvider (Since 1.4)
  * @GST_MESSAGE_DEVICE_REMOVED: Message indicating a #GstDevice was removed
- *     from a #GstDeviceMonitor (Since 1.4)
+ *     from a #GstDeviceProvider (Since 1.4)
  * @GST_MESSAGE_ANY: mask for all of the above messages.
  *
  * The different message types that are available.
index 7d612f83d050df3d2b391f0f1a9fae92a6e23bf1..73fdf0edbe0a7e95e9d02106e009c0890638f4a2 100644 (file)
 #include "gstinfo.h"
 #include "gsterror.h"
 #include "gstregistry.h"
-#include "gstdevicemonitorfactory.h"
+#include "gstdeviceproviderfactory.h"
 
 #include "gstpluginloader.h"
 
@@ -166,7 +166,7 @@ struct _GstRegistryPrivate
   guint32 efl_cookie;
   GList *typefind_factory_list;
   guint32 tfl_cookie;
-  GList *device_monitor_factory_list;
+  GList *device_provider_factory_list;
   guint32 dmfl_cookie;
 };
 
@@ -317,10 +317,10 @@ gst_registry_finalize (GObject * object)
     gst_plugin_feature_list_free (registry->priv->typefind_factory_list);
   }
 
-  if (registry->priv->device_monitor_factory_list) {
+  if (registry->priv->device_provider_factory_list) {
     GST_DEBUG_OBJECT (registry,
-        "Cleaning up cached device monitor factory list");
-    gst_plugin_feature_list_free (registry->priv->device_monitor_factory_list);
+        "Cleaning up cached device provider factory list");
+    gst_plugin_feature_list_free (registry->priv->device_provider_factory_list);
   }
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -789,20 +789,20 @@ gst_registry_get_typefind_factory_list (GstRegistry * registry)
 
 
 static GList *
-gst_registry_get_device_monitor_factory_list (GstRegistry * registry)
+gst_registry_get_device_provider_factory_list (GstRegistry * registry)
 {
   GList *list;
 
   GST_OBJECT_LOCK (registry);
 
   gst_registry_get_feature_list_or_create (registry,
-      &registry->priv->device_monitor_factory_list,
-      &registry->priv->dmfl_cookie, GST_TYPE_DEVICE_MONITOR_FACTORY);
+      &registry->priv->device_provider_factory_list,
+      &registry->priv->dmfl_cookie, GST_TYPE_DEVICE_PROVIDER_FACTORY);
 
   /* Return reffed copy */
   list =
       gst_plugin_feature_list_copy (registry->
-      priv->device_monitor_factory_list);
+      priv->device_provider_factory_list);
 
   GST_OBJECT_UNLOCK (registry);
 
@@ -953,8 +953,8 @@ gst_registry_get_feature_list (GstRegistry * registry, GType type)
     return gst_registry_get_element_factory_list (registry);
   else if (type == GST_TYPE_TYPE_FIND_FACTORY)
     return gst_registry_get_typefind_factory_list (registry);
-  else if (type == GST_TYPE_DEVICE_MONITOR_FACTORY)
-    return gst_registry_get_device_monitor_factory_list (registry);
+  else if (type == GST_TYPE_DEVICE_PROVIDER_FACTORY)
+    return gst_registry_get_device_provider_factory_list (registry);
 
   data.type = type;
   data.name = NULL;
index ee4a7a089da380247f47e50a1ec4d7462eaff149..7b8556e6825486d1eb15d90ee474ed81bc51894f 100644 (file)
@@ -56,7 +56,7 @@
 #include <gst/gstelement.h>
 #include <gst/gsttypefind.h>
 #include <gst/gsttypefindfactory.h>
-#include <gst/gstdevicemonitorfactory.h>
+#include <gst/gstdeviceproviderfactory.h>
 #include <gst/gsturi.h>
 #include <gst/gstinfo.h>
 #include <gst/gstenumtypes.h>
@@ -526,7 +526,7 @@ priv_gst_registry_binary_read_cache (GstRegistry * registry,
   /* make sure these types exist */
   GST_TYPE_ELEMENT_FACTORY;
   GST_TYPE_TYPE_FIND_FACTORY;
-  GST_TYPE_DEVICE_MONITOR_FACTORY;
+  GST_TYPE_DEVICE_PROVIDER_FACTORY;
 
 #ifndef GST_DISABLE_GST_DEBUG
   timer = g_timer_new ();
index fcacd6b6dc00ffe4c447c5286d0d405d70b0a999..f8548654c736be92469492270cc971032be5537e 100644 (file)
@@ -33,7 +33,7 @@
 #include <gst/gstelement.h>
 #include <gst/gsttypefind.h>
 #include <gst/gsttypefindfactory.h>
-#include <gst/gstdevicemonitorfactory.h>
+#include <gst/gstdeviceproviderfactory.h>
 #include <gst/gsturi.h>
 #include <gst/gstinfo.h>
 #include <gst/gstenumtypes.h>
@@ -333,17 +333,17 @@ gst_registry_chunks_save_feature (GList ** list, GstPluginFeature * feature)
     } else {
       gst_registry_chunks_save_const_string (list, "");
     }
-  } else if (GST_IS_DEVICE_MONITOR_FACTORY (feature)) {
-    GstRegistryChunkDeviceMonitorFactory *tff;
-    GstDeviceMonitorFactory *factory = GST_DEVICE_MONITOR_FACTORY (feature);
+  } else if (GST_IS_DEVICE_PROVIDER_FACTORY (feature)) {
+    GstRegistryChunkDeviceProviderFactory *tff;
+    GstDeviceProviderFactory *factory = GST_DEVICE_PROVIDER_FACTORY (feature);
 
     /* Initialize with zeroes because of struct padding and
      * valgrind complaining about copying unitialized memory
      */
-    tff = g_slice_new0 (GstRegistryChunkDeviceMonitorFactory);
+    tff = g_slice_new0 (GstRegistryChunkDeviceProviderFactory);
     chk =
         gst_registry_chunks_make_data (tff,
-        sizeof (GstRegistryChunkDeviceMonitorFactory));
+        sizeof (GstRegistryChunkDeviceProviderFactory));
     pf = (GstRegistryChunkPluginFeature *) tff;
 
 
@@ -668,16 +668,16 @@ gst_registry_chunks_load_feature (GstRegistry * registry, gchar ** in,
         factory->extensions[i - 1] = str;
       }
     }
-  } else if (GST_IS_DEVICE_MONITOR_FACTORY (feature)) {
-    GstRegistryChunkDeviceMonitorFactory *dmf;
-    GstDeviceMonitorFactory *factory = GST_DEVICE_MONITOR_FACTORY (feature);
+  } else if (GST_IS_DEVICE_PROVIDER_FACTORY (feature)) {
+    GstRegistryChunkDeviceProviderFactory *dmf;
+    GstDeviceProviderFactory *factory = GST_DEVICE_PROVIDER_FACTORY (feature);
     const gchar *meta_data_str;
 
     align (*in);
     GST_DEBUG
         ("Reading/casting for GstRegistryChunkPluginFeature at address %p",
         *in);
-    unpack_element (*in, dmf, GstRegistryChunkDeviceMonitorFactory, end, fail);
+    unpack_element (*in, dmf, GstRegistryChunkDeviceProviderFactory, end, fail);
 
     pf = (GstRegistryChunkPluginFeature *) dmf;
 
index e2c86baaa0d65a58a99973fd6786a755b2cc78c2..57ced703f21844e0f27b7820f9bcbeb8292c8f5f 100644 (file)
@@ -132,15 +132,15 @@ typedef struct _GstRegistryChunkTypeFindFactory
 } GstRegistryChunkTypeFindFactory;
 
 /*
- * GstRegistryChunkDeviceMonitorFactory:
+ * GstRegistryChunkDeviceProviderFactory:
  *
- * A structure containing the device monitor factory fields
+ * A structure containing the device provider factory fields
  */
-typedef struct _GstRegistryChunkDeviceMonitorFactory
+typedef struct _GstRegistryChunkDeviceProviderFactory
 {
   GstRegistryChunkPluginFeature plugin_feature;
 
-} GstRegistryChunkDeviceMonitorFactory;
+} GstRegistryChunkDeviceProviderFactory;
 
 /*
  * GstRegistryChunkPadTemplate:
index 543bd1ac464047d7f0b9a11fa3c4eb6c1d0ebd4f..992f4ffc5fef35e71e3f617ddf768ccc29ba3c42 100644 (file)
@@ -1139,7 +1139,7 @@ print_plugin_features (GstPlugin * plugin)
   gint num_features = 0;
   gint num_elements = 0;
   gint num_typefinders = 0;
-  gint num_devmonitors = 0;
+  gint num_devproviders = 0;
   gint num_other = 0;
 
   origlist = features =
@@ -1180,14 +1180,14 @@ print_plugin_features (GstPlugin * plugin)
             gst_plugin_feature_get_name (feature));
 
       num_typefinders++;
-    } else if (GST_IS_DEVICE_MONITOR_FACTORY (feature)) {
-      GstDeviceMonitorFactory *factory;
+    } else if (GST_IS_DEVICE_PROVIDER_FACTORY (feature)) {
+      GstDeviceProviderFactory *factory;
 
-      factory = GST_DEVICE_MONITOR_FACTORY (feature);
+      factory = GST_DEVICE_PROVIDER_FACTORY (feature);
       n_print ("  %s: %s\n", GST_OBJECT_NAME (factory),
-          gst_device_monitor_factory_get_metadata (factory,
+          gst_device_provider_factory_get_metadata (factory,
               GST_ELEMENT_METADATA_LONGNAME));
-      num_devmonitors++;
+      num_devproviders++;
     } else if (feature) {
       n_print ("  %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)),
           g_type_name (G_OBJECT_TYPE (feature)));
@@ -1205,8 +1205,8 @@ print_plugin_features (GstPlugin * plugin)
     n_print ("  +-- %d elements\n", num_elements);
   if (num_typefinders > 0)
     n_print ("  +-- %d typefinders\n", num_typefinders);
-  if (num_devmonitors > 0)
-    n_print ("  +-- %d device monitors\n", num_devmonitors);
+  if (num_devproviders > 0)
+    n_print ("  +-- %d device providers\n", num_devproviders);
   if (num_other > 0)
     n_print ("  +-- %d other objects\n", num_other);
 
index fc74f2f57ab9020bdb52efffabdf40715f22d4aa..8579962af4f2c20630ba774cf05a1a8d41dafc3f 100644 (file)
@@ -415,31 +415,31 @@ EXPORTS
        gst_device_get_type
        gst_device_has_classes
        gst_device_has_classesv
-       gst_device_monitor_can_monitor
-       gst_device_monitor_class_add_metadata
-       gst_device_monitor_class_add_static_metadata
-       gst_device_monitor_class_get_metadata
-       gst_device_monitor_class_set_metadata
-       gst_device_monitor_class_set_static_metadata
-       gst_device_monitor_device_add
-       gst_device_monitor_device_remove
-       gst_device_monitor_factory_find
-       gst_device_monitor_factory_get
-       gst_device_monitor_factory_get_by_name
-       gst_device_monitor_factory_get_device_monitor_type
-       gst_device_monitor_factory_get_metadata
-       gst_device_monitor_factory_get_metadata_keys
-       gst_device_monitor_factory_get_type
-       gst_device_monitor_factory_has_classes
-       gst_device_monitor_factory_has_classesv
-       gst_device_monitor_factory_list_get_device_monitors
-       gst_device_monitor_get_bus
-       gst_device_monitor_get_devices
-       gst_device_monitor_get_factory
-       gst_device_monitor_get_type
-       gst_device_monitor_register
-       gst_device_monitor_start
-       gst_device_monitor_stop
+       gst_device_provider_can_monitor
+       gst_device_provider_class_add_metadata
+       gst_device_provider_class_add_static_metadata
+       gst_device_provider_class_get_metadata
+       gst_device_provider_class_set_metadata
+       gst_device_provider_class_set_static_metadata
+       gst_device_provider_device_add
+       gst_device_provider_device_remove
+       gst_device_provider_factory_find
+       gst_device_provider_factory_get
+       gst_device_provider_factory_get_by_name
+       gst_device_provider_factory_get_device_provider_type
+       gst_device_provider_factory_get_metadata
+       gst_device_provider_factory_get_metadata_keys
+       gst_device_provider_factory_get_type
+       gst_device_provider_factory_has_classes
+       gst_device_provider_factory_has_classesv
+       gst_device_provider_factory_list_get_device_providers
+       gst_device_provider_get_bus
+       gst_device_provider_get_devices
+       gst_device_provider_get_factory
+       gst_device_provider_get_type
+       gst_device_provider_register
+       gst_device_provider_start
+       gst_device_provider_stop
        gst_device_reconfigure_element
        gst_double_range_get_type
        gst_element_abort_state