element: Enforce that elements created by gst_element_factory_create/make() are floating
[platform/upstream/gstreamer.git] / gst / gsttypefindfactory.c
index 6e988b9..fb5c098 100644 (file)
  *
  * 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.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
+
 /**
  * SECTION:gsttypefindfactory
+ * @title: GstTypeFindFactory
  * @short_description: Information about registered typefind functions
  *
- * These functions allow querying informations about registered typefind
+ * These functions allow querying information about registered typefind
  * functions. How to create and register these functions is described in
  * the section <link linkend="gstreamer-Writing-typefind-functions">
  * "Writing typefind functions"</link>.
  *
- * <example>
- *   <title>how to write a simple typefinder</title>
- *   <programlisting>
+ * The following example shows how to write a very simple typefinder that
+ * identifies the given data. You can get quite a bit more complicated than
+ * that though.
+ * |[<!-- language="C" -->
  *   typedef struct {
  *     guint8 *data;
  *     guint size;
@@ -60,7 +63,6 @@
  *     GList *walk, *type_list;
  *     MyTypeFind find = {data, size, 0, NULL};
  *     GstTypeFind gst_find = {my_peek, my_suggest, &amp;find, };
- *
  *     walk = type_list = gst_type_find_factory_get_list ();
  *     while (walk) {
  *       GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (walk->data);
  *     g_list_free (type_list);
  *     return find.caps;
  *   };
- *   </programlisting>
- * </example>
- *
- * The above example shows how to write a very simple typefinder that identifies
- * the given data. You can get quite a bit more complicated than that though.
+ * ]|
  */
 
 #include "gst_private.h"
 #include "gsttypefindfactory.h"
 #include "gstregistry.h"
 
-GST_DEBUG_CATEGORY (gst_type_find_debug);
-#define GST_CAT_DEFAULT gst_type_find_debug
+GST_DEBUG_CATEGORY (type_find_debug);
+#define GST_CAT_DEFAULT type_find_debug
 
-static void gst_type_find_factory_class_init (gpointer g_class,
-    gpointer class_data);
-static void gst_type_find_factory_init (GTypeInstance * instance,
-    gpointer g_class);
 static void gst_type_find_factory_dispose (GObject * object);
 
-static GstPluginFeatureClass *parent_class = NULL;
-
-GType
-gst_type_find_factory_get_type (void)
-{
-  static GType typefind_type = 0;
-
-  if (!typefind_type) {
-    static const GTypeInfo typefind_info = {
-      sizeof (GstTypeFindFactoryClass),
-      NULL,
-      NULL,
-      gst_type_find_factory_class_init,
-      NULL,
-      NULL,
-      sizeof (GstTypeFindFactory),
-      0,
-      gst_type_find_factory_init,
-      NULL
-    };
-
-    typefind_type = g_type_register_static (GST_TYPE_PLUGIN_FEATURE,
-        "GstTypeFindFactory", &typefind_info, 0);
-    GST_DEBUG_CATEGORY_INIT (gst_type_find_debug, "GST_TYPEFIND",
-        GST_DEBUG_FG_GREEN, "typefinding subsystem");
-  }
-
-  return typefind_type;
+#define _do_init \
+{ \
+  GST_DEBUG_CATEGORY_INIT (type_find_debug, "GST_TYPEFIND", \
+      GST_DEBUG_FG_GREEN, "typefinding subsystem"); \
 }
 
+#define gst_type_find_factory_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstTypeFindFactory, gst_type_find_factory,
+    GST_TYPE_PLUGIN_FEATURE, _do_init);
+
 static void
-gst_type_find_factory_class_init (gpointer g_class, gpointer class_data)
+gst_type_find_factory_class_init (GstTypeFindFactoryClass * klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (g_class);
-
-  parent_class = g_type_class_peek_parent (g_class);
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->dispose = gst_type_find_factory_dispose;
 }
 
 static void
-gst_type_find_factory_init (GTypeInstance * instance, gpointer g_class)
+gst_type_find_factory_init (GstTypeFindFactory * factory)
 {
-  GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (instance);
-
   factory->user_data = factory;
+  factory->user_data_notify = NULL;
 }
 
 static void
@@ -153,30 +124,42 @@ gst_type_find_factory_dispose (GObject * object)
     g_strfreev (factory->extensions);
     factory->extensions = NULL;
   }
+  if (factory->user_data_notify && factory->user_data) {
+    factory->user_data_notify (factory->user_data);
+    factory->user_data = NULL;
+  }
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
 /**
  * gst_type_find_factory_get_list:
  *
  * Gets the list of all registered typefind factories. You must free the
- * list using g_list_free.
+ * list using gst_plugin_feature_list_free().
  *
- * Returns: the list of all registered typefind factories
+ * The returned factories are sorted by highest rank first, and then by
+ * factory name.
+ *
+ * Free-function: gst_plugin_feature_list_free
+ *
+ * Returns: (transfer full) (element-type Gst.TypeFindFactory): the list of all
+ *     registered #GstTypeFindFactory.
  */
 GList *
 gst_type_find_factory_get_list (void)
 {
-  return gst_registry_get_feature_list (gst_registry_get_default (),
+  return gst_registry_get_feature_list (gst_registry_get (),
       GST_TYPE_TYPE_FIND_FACTORY);
 }
 
 /**
  * gst_type_find_factory_get_caps:
- * @factory: a factory
+ * @factory: A #GstTypeFindFactory
  *
- * Gets the caps associated with a typefind factory.
+ * Gets the #GstCaps associated with a typefind factory.
  *
- * Returns: the #GstCaps associated with this factory
+ * Returns: (transfer none): the #GstCaps associated with this factory
  */
 GstCaps *
 gst_type_find_factory_get_caps (GstTypeFindFactory * factory)
@@ -188,30 +171,31 @@ gst_type_find_factory_get_caps (GstTypeFindFactory * factory)
 
 /**
  * gst_type_find_factory_get_extensions:
- * @factory: a factory
+ * @factory: A #GstTypeFindFactory
  *
- * Gets the extensions associated with a typefind factory. The returned
+ * Gets the extensions associated with a #GstTypeFindFactory. The returned
  * array should not be changed. If you need to change stuff in it, you should
- * copy it using g_stdupv().  This function may return NULL to indicate
+ * copy it using g_strdupv().  This function may return %NULL to indicate
  * a 0-length list.
  *
- * Returns: a NULL-terminated array of extensions associated with this factory
+ * Returns: (transfer none) (array zero-terminated=1) (element-type utf8) (nullable):
+ *     a %NULL-terminated array of extensions associated with this factory
  */
-gchar **
+const gchar *const *
 gst_type_find_factory_get_extensions (GstTypeFindFactory * factory)
 {
   g_return_val_if_fail (GST_IS_TYPE_FIND_FACTORY (factory), NULL);
 
-  return factory->extensions;
+  return (const gchar * const *) factory->extensions;
 }
 
 /**
  * gst_type_find_factory_call_function:
- * @factory: a factory
- * @find: a properly setup #GstTypeFind entry. The get_data and suggest_type
- *        members must be set.
+ * @factory: A #GstTypeFindFactory
+ * @find: (transfer none): a properly setup #GstTypeFind entry. The get_data
+ *     and suggest_type members must be set.
  *
- * Calls the typefinding function associated with this factory.
+ * Calls the #GstTypeFindFunction associated with this factory.
  */
 void
 gst_type_find_factory_call_function (GstTypeFindFactory * factory,
@@ -228,9 +212,26 @@ gst_type_find_factory_call_function (GstTypeFindFactory * factory,
       GST_TYPE_FIND_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
           (factory)));
   if (new_factory) {
-    g_assert (new_factory->function != NULL);
-
-    new_factory->function (find, new_factory->user_data);
+    if (new_factory->function)
+      new_factory->function (find, new_factory->user_data);
     gst_object_unref (new_factory);
   }
 }
+
+/**
+ * gst_type_find_factory_has_function:
+ * @factory: A #GstTypeFindFactory
+ *
+ * Check whether the factory has a typefind function. Typefind factories
+ * without typefind functions are a last-effort fallback mechanism to
+ * e.g. assume a certain media type based on the file extension.
+ *
+ * Returns: %TRUE if the factory has a typefind functions set, otherwise %FALSE
+ */
+gboolean
+gst_type_find_factory_has_function (GstTypeFindFactory * factory)
+{
+  g_return_val_if_fail (GST_IS_TYPE_FIND_FACTORY (factory), FALSE);
+
+  return (factory->function != NULL);
+}