mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 14:26:43 +00:00
763e6a7d89
Original commit message from CVS: * gst/gstelementfactory.c: (gst_element_factory_make): Unref the factory after it was used the last time, not before. * gst/gstindexfactory.c: (gst_index_factory_make): Improve debugging a bit and don't leak a ref to the index factory with each call.
237 lines
5.7 KiB
C
237 lines
5.7 KiB
C
/* GStreamer
|
|
* Copyright (C) 2001 RidgeRun (http://www.ridgerun.com/)
|
|
* Written by Erik Walthinsen <omega@ridgerun.com>
|
|
*
|
|
* gstindexfactory.c: Index for mappings and other data
|
|
*
|
|
* 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:gstindexfactory
|
|
* @short_description: Create GstIndexes from a factory
|
|
* @see_also: #GstIndex
|
|
*
|
|
* GstIndexFactory is used to dynamically create GstIndex implementations.
|
|
*/
|
|
|
|
|
|
#include "gst_private.h"
|
|
|
|
#include "gstinfo.h"
|
|
#include "gstindex.h"
|
|
#include "gstindexfactory.h"
|
|
#include "gstmarshal.h"
|
|
#include "gstregistry.h"
|
|
|
|
static void gst_index_factory_class_init (GstIndexFactoryClass * klass);
|
|
static void gst_index_factory_finalize (GObject * object);
|
|
|
|
static GstPluginFeatureClass *factory_parent_class = NULL;
|
|
|
|
/* static guint gst_index_factory_signals[LAST_SIGNAL] = { 0 }; */
|
|
|
|
GType
|
|
gst_index_factory_get_type (void)
|
|
{
|
|
static GType indexfactory_type = 0;
|
|
|
|
if (G_UNLIKELY (indexfactory_type == 0)) {
|
|
static const GTypeInfo indexfactory_info = {
|
|
sizeof (GstIndexFactoryClass),
|
|
NULL,
|
|
NULL,
|
|
(GClassInitFunc) gst_index_factory_class_init,
|
|
NULL,
|
|
NULL,
|
|
sizeof (GstIndexFactory),
|
|
0,
|
|
NULL,
|
|
NULL
|
|
};
|
|
|
|
indexfactory_type = g_type_register_static (GST_TYPE_PLUGIN_FEATURE,
|
|
"GstIndexFactory", &indexfactory_info, 0);
|
|
}
|
|
return indexfactory_type;
|
|
}
|
|
|
|
static void
|
|
gst_index_factory_class_init (GstIndexFactoryClass * klass)
|
|
{
|
|
GObjectClass *gobject_class;
|
|
GstObjectClass *gstobject_class;
|
|
GstPluginFeatureClass *gstpluginfeature_class;
|
|
|
|
gobject_class = (GObjectClass *) klass;
|
|
gstobject_class = (GstObjectClass *) klass;
|
|
gstpluginfeature_class = (GstPluginFeatureClass *) klass;
|
|
|
|
factory_parent_class = g_type_class_peek_parent (klass);
|
|
|
|
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_index_factory_finalize);
|
|
}
|
|
|
|
static void
|
|
gst_index_factory_finalize (GObject * object)
|
|
{
|
|
GstIndexFactory *factory = GST_INDEX_FACTORY (object);
|
|
|
|
g_free (factory->longdesc);
|
|
|
|
G_OBJECT_CLASS (factory_parent_class)->finalize (object);
|
|
|
|
}
|
|
|
|
/**
|
|
* gst_index_factory_new:
|
|
* @name: name of indexfactory to create
|
|
* @longdesc: long description of indexfactory to create
|
|
* @type: the GType of the GstIndex element of this factory
|
|
*
|
|
* Create a new indexfactory with the given parameters
|
|
*
|
|
* Returns: a new #GstIndexFactory.
|
|
*/
|
|
GstIndexFactory *
|
|
gst_index_factory_new (const gchar * name, const gchar * longdesc, GType type)
|
|
{
|
|
GstIndexFactory *factory;
|
|
|
|
g_return_val_if_fail (name != NULL, NULL);
|
|
factory = GST_INDEX_FACTORY (g_object_new (GST_TYPE_INDEX_FACTORY, NULL));
|
|
|
|
GST_PLUGIN_FEATURE_NAME (factory) = g_strdup (name);
|
|
if (factory->longdesc)
|
|
g_free (factory->longdesc);
|
|
factory->longdesc = g_strdup (longdesc);
|
|
factory->type = type;
|
|
|
|
return factory;
|
|
}
|
|
|
|
/**
|
|
* gst_index_factory_destroy:
|
|
* @factory: factory to destroy
|
|
*
|
|
* Removes the index from the global list.
|
|
*/
|
|
void
|
|
gst_index_factory_destroy (GstIndexFactory * factory)
|
|
{
|
|
g_return_if_fail (factory != NULL);
|
|
|
|
/* we don't free the struct bacause someone might have a handle to it.. */
|
|
}
|
|
|
|
/**
|
|
* gst_index_factory_find:
|
|
* @name: name of indexfactory to find
|
|
*
|
|
* Search for an indexfactory of the given name.
|
|
*
|
|
* Returns: #GstIndexFactory if found, NULL otherwise
|
|
*/
|
|
GstIndexFactory *
|
|
gst_index_factory_find (const gchar * name)
|
|
{
|
|
GstPluginFeature *feature;
|
|
|
|
g_return_val_if_fail (name != NULL, NULL);
|
|
|
|
GST_DEBUG ("gstindex: find \"%s\"", name);
|
|
|
|
feature = gst_registry_find_feature (gst_registry_get_default (), name,
|
|
GST_TYPE_INDEX_FACTORY);
|
|
if (feature)
|
|
return GST_INDEX_FACTORY (feature);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/**
|
|
* gst_index_factory_create:
|
|
* @factory: the factory used to create the instance
|
|
*
|
|
* Create a new #GstIndex instance from the
|
|
* given indexfactory.
|
|
*
|
|
* Returns: A new #GstIndex instance.
|
|
*/
|
|
GstIndex *
|
|
gst_index_factory_create (GstIndexFactory * factory)
|
|
{
|
|
GstIndexFactory *newfactory;
|
|
GstIndex *new = NULL;
|
|
|
|
g_return_val_if_fail (factory != NULL, NULL);
|
|
|
|
newfactory =
|
|
GST_INDEX_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
|
|
(factory)));
|
|
if (newfactory == NULL)
|
|
return NULL;
|
|
|
|
new = GST_INDEX (g_object_new (newfactory->type, NULL));
|
|
|
|
gst_object_unref (newfactory);
|
|
|
|
return new;
|
|
}
|
|
|
|
/**
|
|
* gst_index_factory_make:
|
|
* @name: the name of the factory used to create the instance
|
|
*
|
|
* Create a new #GstIndex instance from the
|
|
* indexfactory with the given name.
|
|
*
|
|
* Returns: A new #GstIndex instance.
|
|
*/
|
|
GstIndex *
|
|
gst_index_factory_make (const gchar * name)
|
|
{
|
|
GstIndexFactory *factory;
|
|
GstIndex *index;
|
|
|
|
g_return_val_if_fail (name != NULL, NULL);
|
|
|
|
factory = gst_index_factory_find (name);
|
|
|
|
if (factory == NULL)
|
|
goto no_factory;
|
|
|
|
index = gst_index_factory_create (factory);
|
|
|
|
if (index == NULL)
|
|
goto create_failed;
|
|
|
|
gst_object_unref (factory);
|
|
return index;
|
|
|
|
/* ERRORS */
|
|
no_factory:
|
|
{
|
|
GST_INFO ("no such index factory \"%s\"!", name);
|
|
return NULL;
|
|
}
|
|
create_failed:
|
|
{
|
|
GST_INFO_OBJECT (factory, "couldn't create instance!");
|
|
gst_object_unref (factory);
|
|
return NULL;
|
|
}
|
|
}
|