2 * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
4 * gsttypefindfactory.c: typefinding subsystem
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
23 * SECTION:gsttypefindfactory
24 * @short_description: Information about registered typefind functions
26 * These functions allow querying informations about registered typefind
27 * functions. How to create and register these functions is described in
28 * the section <link linkend="gstreamer-Writing-typefind-functions">
29 * "Writing typefind functions"</link>.
32 * <title>how to write a simple typefinder</title>
41 * my_peek (gpointer data, gint64 offset, guint size)
43 * MyTypeFind *find = (MyTypeFind *) data;
44 * if (offset >= 0 && offset + size <= find->size) {
45 * return find->data + offset;
50 * my_suggest (gpointer data, guint probability, GstCaps *caps)
52 * MyTypeFind *find = (MyTypeFind *) data;
53 * if (probability > find->probability) {
54 * find->probability = probability;
55 * gst_caps_replace (&find->caps, caps);
59 * find_type (guint8 *data, guint size)
61 * GList *walk, *type_list;
62 * MyTypeFind find = {data, size, 0, NULL};
63 * GstTypeFind gst_find = {my_peek, my_suggest, &find, };
64 * walk = type_list = gst_type_find_factory_get_list ();
66 * GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (walk->data);
67 * walk = g_list_next (walk)
68 * gst_type_find_factory_call_function (factory, &gst_find);
70 * g_list_free (type_list);
76 * The above example shows how to write a very simple typefinder that
77 * identifies the given data. You can get quite a bit more complicated than
80 * Last reviewed on 2005-11-09 (0.9.4)
83 #include "gst_private.h"
85 #include "gsttypefind.h"
86 #include "gsttypefindfactory.h"
87 #include "gstregistry.h"
89 GST_DEBUG_CATEGORY (type_find_debug);
90 #define GST_CAT_DEFAULT type_find_debug
92 static void gst_type_find_factory_dispose (GObject * object);
96 GST_DEBUG_CATEGORY_INIT (type_find_debug, "GST_TYPEFIND", \
97 GST_DEBUG_FG_GREEN, "typefinding subsystem"); \
100 #define gst_type_find_factory_parent_class parent_class
101 G_DEFINE_TYPE_WITH_CODE (GstTypeFindFactory, gst_type_find_factory,
102 GST_TYPE_PLUGIN_FEATURE, _do_init);
105 gst_type_find_factory_class_init (GstTypeFindFactoryClass * klass)
107 GObjectClass *object_class = G_OBJECT_CLASS (klass);
109 object_class->dispose = gst_type_find_factory_dispose;
113 gst_type_find_factory_init (GstTypeFindFactory * factory)
115 factory->user_data = factory;
116 factory->user_data_notify = NULL;
120 gst_type_find_factory_dispose (GObject * object)
122 GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (object);
125 gst_caps_unref (factory->caps);
126 factory->caps = NULL;
128 if (factory->extensions) {
129 g_strfreev (factory->extensions);
130 factory->extensions = NULL;
132 if (factory->user_data_notify && factory->user_data) {
133 factory->user_data_notify (factory->user_data);
134 factory->user_data = NULL;
137 G_OBJECT_CLASS (parent_class)->dispose (object);
141 * gst_type_find_factory_get_list:
143 * Gets the list of all registered typefind factories. You must free the
144 * list using gst_plugin_feature_list_free().
146 * The returned factories are sorted by highest rank first, and then by
149 * Free-function: gst_plugin_feature_list_free
151 * Returns: (transfer full) (element-type Gst.TypeFindFactory): the list of all
152 * registered #GstTypeFindFactory.
155 gst_type_find_factory_get_list (void)
157 return gst_registry_get_feature_list (gst_registry_get (),
158 GST_TYPE_TYPE_FIND_FACTORY);
162 * gst_type_find_factory_get_caps:
163 * @factory: A #GstTypeFindFactory
165 * Gets the #GstCaps associated with a typefind factory.
167 * Returns: (transfer none): the #GstCaps associated with this factory
170 gst_type_find_factory_get_caps (GstTypeFindFactory * factory)
172 g_return_val_if_fail (GST_IS_TYPE_FIND_FACTORY (factory), NULL);
174 return factory->caps;
178 * gst_type_find_factory_get_extensions:
179 * @factory: A #GstTypeFindFactory
181 * Gets the extensions associated with a #GstTypeFindFactory. The returned
182 * array should not be changed. If you need to change stuff in it, you should
183 * copy it using g_strdupv(). This function may return NULL to indicate
186 * Returns: (transfer none) (array zero-terminated=1) (element-type utf8): a
187 * NULL-terminated array of extensions associated with this factory
190 gst_type_find_factory_get_extensions (GstTypeFindFactory * factory)
192 g_return_val_if_fail (GST_IS_TYPE_FIND_FACTORY (factory), NULL);
194 return (const gchar * const *) factory->extensions;
198 * gst_type_find_factory_call_function:
199 * @factory: A #GstTypeFindFactory
200 * @find: (transfer none): a properly setup #GstTypeFind entry. The get_data
201 * and suggest_type members must be set.
203 * Calls the #GstTypeFindFunction associated with this factory.
206 gst_type_find_factory_call_function (GstTypeFindFactory * factory,
209 GstTypeFindFactory *new_factory;
211 g_return_if_fail (GST_IS_TYPE_FIND_FACTORY (factory));
212 g_return_if_fail (find != NULL);
213 g_return_if_fail (find->peek != NULL);
214 g_return_if_fail (find->suggest != NULL);
217 GST_TYPE_FIND_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
220 if (new_factory->function)
221 new_factory->function (find, new_factory->user_data);
222 gst_object_unref (new_factory);
227 * gst_type_find_factory_has_function:
228 * @factory: A #GstTypeFindFactory
230 * Check whether the factory has a typefind function. Typefind factories
231 * without typefind functions are a last-effort fallback mechanism to
232 * e.g. assume a certain media type based on the file extension.
234 * Returns: TRUE if the factory has a typefind functions set, otherwise FALSE
237 gst_type_find_factory_has_function (GstTypeFindFactory * factory)
239 g_return_val_if_fail (GST_IS_TYPE_FIND_FACTORY (factory), FALSE);
241 return (factory->function != NULL);