mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
cvs can't merge - these should have been dead since typefind merge
Original commit message from CVS: cvs can't merge - these should have been dead since typefind merge
This commit is contained in:
parent
993764011c
commit
37d3d6ec99
2 changed files with 0 additions and 444 deletions
336
gst/gsttype.c
336
gst/gsttype.c
|
@ -1,336 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
* 2000 Wim Taymans <wtay@chello.be>
|
|
||||||
*
|
|
||||||
* gsttype.c: Media-type management functions
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* TODO:
|
|
||||||
* probably should set up a hash table for the type id's, since currently
|
|
||||||
* it's a rather pathetic linear search. Eventually there may be dozens
|
|
||||||
* of id's, but in reality there are only so many instances of lookup, so
|
|
||||||
* I'm not overly worried yet...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "gst_private.h"
|
|
||||||
|
|
||||||
#include "gstbytestream.h"
|
|
||||||
#include "gsttype.h"
|
|
||||||
#include "gstregistrypool.h"
|
|
||||||
#include "gstobject.h"
|
|
||||||
#include "gstinfo.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* global list of registered types */
|
|
||||||
static GList *_gst_types;
|
|
||||||
static guint16 _gst_maxtype;
|
|
||||||
|
|
||||||
static void gst_type_factory_class_init (GstTypeFactoryClass *klass);
|
|
||||||
static void gst_type_factory_init (GstTypeFactory *factory);
|
|
||||||
|
|
||||||
static void gst_type_factory_unload_thyself (GstPluginFeature *feature);
|
|
||||||
|
|
||||||
static GstPluginFeatureClass *parent_class = NULL;
|
|
||||||
/* static guint gst_type_factory_signals[LAST_SIGNAL] = { 0 }; */
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_type_factory_get_type (void)
|
|
||||||
{
|
|
||||||
static GType typefactory_type = 0;
|
|
||||||
|
|
||||||
if (!typefactory_type) {
|
|
||||||
static const GTypeInfo typefactory_info = {
|
|
||||||
sizeof (GstTypeFactoryClass),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(GClassInitFunc) gst_type_factory_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof(GstTypeFactory),
|
|
||||||
0,
|
|
||||||
(GInstanceInitFunc) gst_type_factory_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
typefactory_type = g_type_register_static (GST_TYPE_PLUGIN_FEATURE,
|
|
||||||
"GstTypeFactory", &typefactory_info, 0);
|
|
||||||
}
|
|
||||||
return typefactory_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_type_factory_class_init (GstTypeFactoryClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *gobject_class;
|
|
||||||
GstObjectClass *gstobject_class;
|
|
||||||
GstPluginFeatureClass *gstpluginfeature_class;
|
|
||||||
|
|
||||||
gobject_class = (GObjectClass*)klass;
|
|
||||||
gstobject_class = (GstObjectClass*)klass;
|
|
||||||
gstpluginfeature_class = (GstPluginFeatureClass*) klass;
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_PLUGIN_FEATURE);
|
|
||||||
|
|
||||||
gstpluginfeature_class->unload_thyself = GST_DEBUG_FUNCPTR (gst_type_factory_unload_thyself);
|
|
||||||
|
|
||||||
_gst_types = NULL;
|
|
||||||
_gst_maxtype = 1; /* type 0 is undefined */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_type_factory_init (GstTypeFactory *factory)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_type_factory_new:
|
|
||||||
* @definition: the definition to use
|
|
||||||
*
|
|
||||||
* Creata a new typefactory from the given definition.
|
|
||||||
*
|
|
||||||
* Returns: the new typefactory
|
|
||||||
*/
|
|
||||||
GstTypeFactory*
|
|
||||||
gst_type_factory_new (GstTypeDefinition *definition)
|
|
||||||
{
|
|
||||||
GstTypeFactory *factory;
|
|
||||||
|
|
||||||
g_return_val_if_fail (definition != NULL, NULL);
|
|
||||||
g_return_val_if_fail (definition->name != NULL, NULL);
|
|
||||||
g_return_val_if_fail (definition->mime != NULL, NULL);
|
|
||||||
|
|
||||||
factory = gst_type_factory_find (definition->name);
|
|
||||||
|
|
||||||
if (!factory) {
|
|
||||||
factory = GST_TYPE_FACTORY (g_object_new (GST_TYPE_TYPE_FACTORY, NULL));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
GST_PLUGIN_FEATURE_NAME (factory) = g_strdup (definition->name);
|
|
||||||
factory->mime = g_strdup (definition->mime);
|
|
||||||
factory->exts = g_strdup (definition->exts);
|
|
||||||
factory->typefindfunc = definition->typefindfunc;
|
|
||||||
|
|
||||||
return factory;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_type_register:
|
|
||||||
* @factory: the type factory to register
|
|
||||||
*
|
|
||||||
* Register a new type factory to the system.
|
|
||||||
*
|
|
||||||
* Returns: the new type id
|
|
||||||
*/
|
|
||||||
guint16
|
|
||||||
gst_type_register (GstTypeFactory *factory)
|
|
||||||
{
|
|
||||||
guint16 id;
|
|
||||||
GstType *type;
|
|
||||||
|
|
||||||
g_return_val_if_fail (factory != NULL, 0);
|
|
||||||
|
|
||||||
/* GST_CAT_INFO (GST_CAT_TYPES,"type register %s", factory->mime); */
|
|
||||||
id = gst_type_find_by_mime (factory->mime);
|
|
||||||
|
|
||||||
if (!id) {
|
|
||||||
type = g_new0 (GstType, 1);
|
|
||||||
|
|
||||||
type->id = _gst_maxtype++;
|
|
||||||
type->mime = factory->mime;
|
|
||||||
type->exts = factory->exts;
|
|
||||||
type->factories = NULL;
|
|
||||||
_gst_types = g_list_prepend (_gst_types, type);
|
|
||||||
|
|
||||||
id = type->id;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
type = gst_type_find_by_id (id);
|
|
||||||
/* now we want to try to merge the types and return the original */
|
|
||||||
|
|
||||||
/* FIXME: do extension merging here, not that easy */
|
|
||||||
|
|
||||||
/* if there is no existing typefind function, try to use new one */
|
|
||||||
}
|
|
||||||
GST_CAT_DEBUG (GST_CAT_TYPES,"gsttype: %s(%p) gave new mime type '%s', id %d",
|
|
||||||
GST_OBJECT_NAME (factory), factory, type->mime, type->id);
|
|
||||||
type->factories = g_slist_prepend (type->factories, factory);
|
|
||||||
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static guint16
|
|
||||||
gst_type_find_by_mime_func (const gchar *mime)
|
|
||||||
{
|
|
||||||
GList *walk;
|
|
||||||
GstType *type;
|
|
||||||
gint typelen,mimelen;
|
|
||||||
gchar *search, *found;
|
|
||||||
|
|
||||||
g_return_val_if_fail (mime != NULL, 0);
|
|
||||||
|
|
||||||
walk = _gst_types;
|
|
||||||
/* GST_CAT_DEBUG (GST_CAT_TYPES,"searching for '%s'",mime); */
|
|
||||||
mimelen = strlen (mime);
|
|
||||||
while (walk) {
|
|
||||||
type = (GstType *)walk->data;
|
|
||||||
search = type->mime;
|
|
||||||
/* GST_CAT_DEBUG (GST_CAT_TYPES,"checking against '%s'",search); */
|
|
||||||
typelen = strlen (search);
|
|
||||||
while ((search - type->mime) < typelen) {
|
|
||||||
found = strstr (search, mime);
|
|
||||||
/* if the requested mime is in the list */
|
|
||||||
if (found) {
|
|
||||||
if ((*(found + mimelen) == ' ') ||
|
|
||||||
(*(found + mimelen) == ',') ||
|
|
||||||
(*(found + mimelen) == '\0')) {
|
|
||||||
return type->id;
|
|
||||||
} else {
|
|
||||||
search = found + mimelen;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
search += mimelen;
|
|
||||||
}
|
|
||||||
walk = g_list_next (walk);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_type_find_by_mime:
|
|
||||||
* @mime: the mime type to find
|
|
||||||
*
|
|
||||||
* Find the type id of a given mime type.
|
|
||||||
*
|
|
||||||
* Returns: the type id
|
|
||||||
*/
|
|
||||||
guint16
|
|
||||||
gst_type_find_by_mime (const gchar *mime)
|
|
||||||
{
|
|
||||||
return gst_type_find_by_mime_func (mime);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_type_find_by_ext:
|
|
||||||
* @ext: the extension to find
|
|
||||||
*
|
|
||||||
* Find the type id of a given extention.
|
|
||||||
*
|
|
||||||
* Returns: the type id
|
|
||||||
*/
|
|
||||||
guint16
|
|
||||||
gst_type_find_by_ext (const gchar *ext)
|
|
||||||
{
|
|
||||||
/* FIXME */
|
|
||||||
g_warning ("gsttype: find_by_ext not implemented");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_type_find_by_id:
|
|
||||||
* @id: the type id to lookup
|
|
||||||
*
|
|
||||||
* Find the type of a given type id.
|
|
||||||
*
|
|
||||||
* Returns: the type
|
|
||||||
*/
|
|
||||||
GstType*
|
|
||||||
gst_type_find_by_id (guint16 id)
|
|
||||||
{
|
|
||||||
GList *walk = _gst_types;
|
|
||||||
GstType *type;
|
|
||||||
|
|
||||||
while (walk) {
|
|
||||||
type = (GstType *)walk->data;
|
|
||||||
if (type->id == id)
|
|
||||||
return type;
|
|
||||||
walk = g_list_next (walk);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_type_get_list:
|
|
||||||
*
|
|
||||||
* Return a list of all registered types.
|
|
||||||
*
|
|
||||||
* Returns: a list of GstTypes
|
|
||||||
*/
|
|
||||||
const GList*
|
|
||||||
gst_type_get_list (void)
|
|
||||||
{
|
|
||||||
return _gst_types;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_type_factory_find:
|
|
||||||
* @name: the name of the typefactory to find
|
|
||||||
*
|
|
||||||
* Return the TypeFactory with the given name.
|
|
||||||
*
|
|
||||||
* Returns: a GstTypeFactory with the given name;
|
|
||||||
*/
|
|
||||||
GstTypeFactory*
|
|
||||||
gst_type_factory_find (const gchar *name)
|
|
||||||
{
|
|
||||||
GstPluginFeature *feature;
|
|
||||||
|
|
||||||
g_return_val_if_fail (name != NULL, NULL);
|
|
||||||
|
|
||||||
feature = gst_registry_pool_find_feature (name, GST_TYPE_TYPE_FACTORY);
|
|
||||||
if (feature)
|
|
||||||
return GST_TYPE_FACTORY (feature);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_type_factory_unload_thyself (GstPluginFeature *feature)
|
|
||||||
{
|
|
||||||
GstTypeFactory *factory;
|
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_TYPE_FACTORY (feature));
|
|
||||||
|
|
||||||
factory = GST_TYPE_FACTORY (feature);
|
|
||||||
|
|
||||||
if (factory->typefindfunc)
|
|
||||||
factory->typefindfunc = gst_type_type_find_dummy;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstCaps*
|
|
||||||
gst_type_type_find_dummy (GstByteStream *bs, gpointer priv)
|
|
||||||
{
|
|
||||||
GstCaps *res = NULL;
|
|
||||||
GstTypeFactory *factory = (GstTypeFactory *)priv;
|
|
||||||
|
|
||||||
GST_CAT_DEBUG (GST_CAT_TYPES,"gsttype: need to load typefind function for %s", factory->mime);
|
|
||||||
|
|
||||||
if (gst_plugin_feature_ensure_loaded (GST_PLUGIN_FEATURE (factory))) {
|
|
||||||
if (factory->typefindfunc == gst_type_type_find_dummy) {
|
|
||||||
/* looks like we didn't get a real typefind function */
|
|
||||||
g_warning ("could not load valid typefind function for %s\n", factory->mime);
|
|
||||||
}
|
|
||||||
else if (factory->typefindfunc) {
|
|
||||||
res = factory->typefindfunc (bs, priv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
108
gst/gsttype.h
108
gst/gsttype.h
|
@ -1,108 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
* 2000 Wim Taymans <wtay@chello.be>
|
|
||||||
*
|
|
||||||
* gsttype.h: Header for type management
|
|
||||||
*
|
|
||||||
* 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_TYPE_H__
|
|
||||||
#define __GST_TYPE_H__
|
|
||||||
|
|
||||||
#include <gst/gstcaps.h>
|
|
||||||
#include <gst/gstpluginfeature.h>
|
|
||||||
#include <gst/gstbytestream.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
/* type of function used to check a stream for equality with type */
|
|
||||||
typedef GstCaps* (*GstTypeFindFunc) (GstByteStream *bs, gpointer priv);
|
|
||||||
|
|
||||||
typedef struct _GstType GstType;
|
|
||||||
typedef struct _GstTypeDefinition GstTypeDefinition;
|
|
||||||
typedef struct _GstTypeFactory GstTypeFactory;
|
|
||||||
typedef struct _GstTypeFactoryClass GstTypeFactoryClass;
|
|
||||||
|
|
||||||
struct _GstType {
|
|
||||||
guint16 id; /* type id (assigned) */
|
|
||||||
|
|
||||||
gchar *mime; /* MIME type */
|
|
||||||
gchar *exts; /* space-delimited list of extensions */
|
|
||||||
|
|
||||||
GSList *factories; /* factories providing this type */
|
|
||||||
|
|
||||||
GST_STRUCT_PADDING
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstTypeDefinition {
|
|
||||||
gchar *name;
|
|
||||||
gchar *mime;
|
|
||||||
gchar *exts;
|
|
||||||
GstTypeFindFunc typefindfunc;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define GST_TYPE_TYPE_FACTORY (gst_type_factory_get_type ())
|
|
||||||
#define GST_TYPE_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TYPE_FACTORY, GstTypeFactory))
|
|
||||||
#define GST_IS_TYPE_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TYPE_FACTORY))
|
|
||||||
#define GST_TYPE_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TYPE_FACTORY, GstTypeFactoryClass))
|
|
||||||
#define GST_IS_TYPE_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TYPE_FACTORY))
|
|
||||||
#define GST_TYPE_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TYPE_FACTORY, GstTypeFactoryClass))
|
|
||||||
|
|
||||||
struct _GstTypeFactory {
|
|
||||||
GstPluginFeature feature;
|
|
||||||
|
|
||||||
gchar *mime;
|
|
||||||
gchar *exts;
|
|
||||||
GstTypeFindFunc typefindfunc;
|
|
||||||
|
|
||||||
GST_OBJECT_PADDING
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstTypeFactoryClass {
|
|
||||||
GstPluginFeatureClass parent;
|
|
||||||
|
|
||||||
GST_CLASS_PADDING
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
GType gst_type_factory_get_type (void);
|
|
||||||
|
|
||||||
GstTypeFactory* gst_type_factory_new (GstTypeDefinition *definition);
|
|
||||||
|
|
||||||
GstTypeFactory* gst_type_factory_find (const gchar *name);
|
|
||||||
|
|
||||||
|
|
||||||
/* create a new type, or find/merge an existing one */
|
|
||||||
guint16 gst_type_register (GstTypeFactory *factory);
|
|
||||||
|
|
||||||
/* look up a type by mime or extension */
|
|
||||||
guint16 gst_type_find_by_mime (const gchar *mime);
|
|
||||||
guint16 gst_type_find_by_ext (const gchar *ext);
|
|
||||||
|
|
||||||
/* get GstType by id */
|
|
||||||
GstType* gst_type_find_by_id (guint16 id);
|
|
||||||
|
|
||||||
/* get the list of registered types (returns list of GstType!) */
|
|
||||||
const GList* gst_type_get_list (void);
|
|
||||||
|
|
||||||
/* dummy typefind function */
|
|
||||||
GstCaps* gst_type_type_find_dummy (GstByteStream *bs, gpointer priv);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_TYPE_H__ */
|
|
Loading…
Reference in a new issue