mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 16:08:51 +00:00
gst/gstregistrybinary.*: Refactor so that we can implement multiple features. Add support for
Original commit message from CVS: * gst/gstregistrybinary.c: (gst_registry_binary_save_feature), (gst_registry_binary_load_feature): * gst/gstregistrybinary.h: Refactor so that we can implement multiple features. Add support for TypeFindFactory features.
This commit is contained in:
parent
ce9abb4d52
commit
577034f170
3 changed files with 133 additions and 46 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2007-04-25 Stefan Kost <ensonic@users.sf.net>
|
||||||
|
|
||||||
|
* gst/gstregistrybinary.c: (gst_registry_binary_save_feature),
|
||||||
|
(gst_registry_binary_load_feature):
|
||||||
|
* gst/gstregistrybinary.h:
|
||||||
|
Refactor so that we can implement multiple features. Add support for
|
||||||
|
TypeFindFactory features.
|
||||||
|
|
||||||
2007-04-24 Stefan Kost <ensonic@users.sf.net>
|
2007-04-24 Stefan Kost <ensonic@users.sf.net>
|
||||||
|
|
||||||
Patch by: Peter Kjellerstedt <Peter.Kjellerstedt@axis.com>
|
Patch by: Peter Kjellerstedt <Peter.Kjellerstedt@axis.com>
|
||||||
|
|
|
@ -217,8 +217,8 @@ static gboolean
|
||||||
gst_registry_binary_save_feature (GList ** list, GstPluginFeature * feature)
|
gst_registry_binary_save_feature (GList ** list, GstPluginFeature * feature)
|
||||||
{
|
{
|
||||||
const gchar *type_name = g_type_name (G_OBJECT_TYPE (feature));
|
const gchar *type_name = g_type_name (G_OBJECT_TYPE (feature));
|
||||||
GstBinaryPluginFeature *pf;
|
GstBinaryPluginFeature *pf = NULL;
|
||||||
GstBinaryChunk *chk;
|
GstBinaryChunk *chk = NULL;
|
||||||
GList *walk;
|
GList *walk;
|
||||||
|
|
||||||
if (!type_name) {
|
if (!type_name) {
|
||||||
|
@ -226,21 +226,21 @@ gst_registry_binary_save_feature (GList ** list, GstPluginFeature * feature)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
pf = g_malloc (sizeof (GstBinaryPluginFeature));
|
|
||||||
chk = gst_registry_binary_make_data (pf, sizeof (GstBinaryPluginFeature));
|
|
||||||
|
|
||||||
pf->rank = feature->rank;
|
|
||||||
pf->npadtemplates = pf->ninterfaces = pf->nuriprotocols = 0;
|
|
||||||
|
|
||||||
if (GST_IS_ELEMENT_FACTORY (feature)) {
|
if (GST_IS_ELEMENT_FACTORY (feature)) {
|
||||||
|
GstBinaryElementFactory *ef;
|
||||||
GstElementFactory *factory = GST_ELEMENT_FACTORY (feature);
|
GstElementFactory *factory = GST_ELEMENT_FACTORY (feature);
|
||||||
|
|
||||||
|
ef = g_malloc (sizeof (GstBinaryElementFactory));
|
||||||
|
chk = gst_registry_binary_make_data (ef, sizeof (GstBinaryElementFactory));
|
||||||
|
ef->npadtemplates = ef->ninterfaces = ef->nuriprotocols = 0;
|
||||||
|
pf = (GstBinaryPluginFeature *) ef;
|
||||||
|
|
||||||
/* save interfaces */
|
/* save interfaces */
|
||||||
for (walk = factory->interfaces; walk;
|
for (walk = factory->interfaces; walk;
|
||||||
walk = g_list_next (walk), pf->ninterfaces++) {
|
walk = g_list_next (walk), ef->ninterfaces++) {
|
||||||
gst_registry_binary_save_string (list, (gchar *) walk->data);
|
gst_registry_binary_save_string (list, (gchar *) walk->data);
|
||||||
}
|
}
|
||||||
GST_DEBUG ("Saved %d Interfaces", pf->ninterfaces);
|
GST_DEBUG ("Saved %d Interfaces", ef->ninterfaces);
|
||||||
/* save uritypes */
|
/* save uritypes */
|
||||||
if (GST_URI_TYPE_IS_VALID (factory->uri_type)) {
|
if (GST_URI_TYPE_IS_VALID (factory->uri_type)) {
|
||||||
if (factory->uri_protocols) {
|
if (factory->uri_protocols) {
|
||||||
|
@ -255,10 +255,10 @@ gst_registry_binary_save_feature (GList ** list, GstPluginFeature * feature)
|
||||||
protocol = factory->uri_protocols;
|
protocol = factory->uri_protocols;
|
||||||
while (*protocol) {
|
while (*protocol) {
|
||||||
gst_registry_binary_save_string (list, *protocol++);
|
gst_registry_binary_save_string (list, *protocol++);
|
||||||
pf->nuriprotocols++;
|
ef->nuriprotocols++;
|
||||||
}
|
}
|
||||||
*list = g_list_prepend (*list, subchk);
|
*list = g_list_prepend (*list, subchk);
|
||||||
GST_DEBUG ("Saved %d UriTypes", pf->nuriprotocols);
|
GST_DEBUG ("Saved %d UriTypes", ef->nuriprotocols);
|
||||||
} else {
|
} else {
|
||||||
g_warning ("GStreamer feature '%s' is URI handler but does not provide"
|
g_warning ("GStreamer feature '%s' is URI handler but does not provide"
|
||||||
" any protocols it can handle", feature->name);
|
" any protocols it can handle", feature->name);
|
||||||
|
@ -267,7 +267,7 @@ gst_registry_binary_save_feature (GList ** list, GstPluginFeature * feature)
|
||||||
|
|
||||||
/* save pad-templates */
|
/* save pad-templates */
|
||||||
for (walk = factory->staticpadtemplates; walk;
|
for (walk = factory->staticpadtemplates; walk;
|
||||||
walk = g_list_next (walk), pf->npadtemplates++) {
|
walk = g_list_next (walk), ef->npadtemplates++) {
|
||||||
GstStaticPadTemplate *template = walk->data;
|
GstStaticPadTemplate *template = walk->data;
|
||||||
|
|
||||||
if (!gst_registry_binary_save_pad_template (list, template)) {
|
if (!gst_registry_binary_save_pad_template (list, template)) {
|
||||||
|
@ -282,20 +282,59 @@ gst_registry_binary_save_feature (GList ** list, GstPluginFeature * feature)
|
||||||
gst_registry_binary_save_string (list, factory->details.klass);
|
gst_registry_binary_save_string (list, factory->details.klass);
|
||||||
gst_registry_binary_save_string (list, factory->details.longname);
|
gst_registry_binary_save_string (list, factory->details.longname);
|
||||||
} else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
|
} else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
|
||||||
/* FIXME: save typefind */
|
GstBinaryTypeFindFactory *tff;
|
||||||
|
GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (feature);
|
||||||
|
gchar *str;
|
||||||
|
|
||||||
|
/* we copy the caps here so we can simplify them before saving. This is a lot
|
||||||
|
* faster when loading them later on */
|
||||||
|
GstCaps *copy = gst_caps_copy (factory->caps);
|
||||||
|
|
||||||
|
tff = g_malloc (sizeof (GstBinaryTypeFindFactory));
|
||||||
|
chk =
|
||||||
|
gst_registry_binary_make_data (tff, sizeof (GstBinaryTypeFindFactory));
|
||||||
|
tff->nextensions = 0;
|
||||||
|
pf = (GstBinaryPluginFeature *) tff;
|
||||||
|
|
||||||
|
/* save extensions */
|
||||||
|
if (factory->extensions) {
|
||||||
|
while (factory->extensions[tff->nextensions]) {
|
||||||
|
gst_registry_binary_save_string (list,
|
||||||
|
factory->extensions[tff->nextensions++]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* save caps */
|
||||||
|
gst_caps_do_simplify (copy);
|
||||||
|
str = gst_caps_to_string (copy);
|
||||||
|
gst_caps_unref (copy);
|
||||||
|
gst_registry_binary_save_string (list, str);
|
||||||
}
|
}
|
||||||
#ifndef GST_DISABLE_INDEX
|
#ifndef GST_DISABLE_INDEX
|
||||||
else if (GST_IS_INDEX_FACTORY (feature)) {
|
else if (GST_IS_INDEX_FACTORY (feature)) {
|
||||||
/* FIXME: save indexers */
|
GstIndexFactory *factory = GST_INDEX_FACTORY (feature);
|
||||||
|
|
||||||
|
pf = g_malloc (sizeof (GstBinaryPluginFeature));
|
||||||
|
chk = gst_registry_binary_make_data (pf, sizeof (GstBinaryPluginFeature));
|
||||||
|
pf->rank = feature->rank;
|
||||||
|
|
||||||
|
/* pack element factory strings */
|
||||||
|
gst_registry_binary_save_string (list, factory->longdesc);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
else {
|
||||||
|
GST_WARNING ("unhandled feature type '%s'", type_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pf) {
|
||||||
|
pf->rank = feature->rank;
|
||||||
|
*list = g_list_prepend (*list, chk);
|
||||||
|
|
||||||
/* pack plugin feature strings */
|
/* pack plugin feature strings */
|
||||||
gst_registry_binary_save_string (list, feature->name);
|
gst_registry_binary_save_string (list, feature->name);
|
||||||
gst_registry_binary_save_string (list, (gchar *) type_name);
|
gst_registry_binary_save_string (list, (gchar *) type_name);
|
||||||
|
|
||||||
*list = g_list_prepend (*list, chk);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Errors */
|
/* Errors */
|
||||||
fail:
|
fail:
|
||||||
|
@ -558,7 +597,7 @@ gst_registry_binary_load_pad_template (GstElementFactory * factory, gchar ** in)
|
||||||
/*
|
/*
|
||||||
* gst_registry_binary_load_feature:
|
* gst_registry_binary_load_feature:
|
||||||
*
|
*
|
||||||
* Make a new GstPluginFeature from current GstBinaryPluginFeature structure
|
* Make a new GstPluginFeature from current binary plugin feature structure
|
||||||
*
|
*
|
||||||
* Returns: new GstPluginFeature
|
* Returns: new GstPluginFeature
|
||||||
*/
|
*/
|
||||||
|
@ -566,16 +605,12 @@ static gboolean
|
||||||
gst_registry_binary_load_feature (GstRegistry * registry, gchar ** in,
|
gst_registry_binary_load_feature (GstRegistry * registry, gchar ** in,
|
||||||
gchar * plugin_name)
|
gchar * plugin_name)
|
||||||
{
|
{
|
||||||
GstBinaryPluginFeature *pf;
|
GstBinaryPluginFeature *pf = NULL;
|
||||||
GstPluginFeature *feature;
|
GstPluginFeature *feature;
|
||||||
gchar *type_name = NULL, *str;
|
gchar *type_name = NULL, *str;
|
||||||
GType type;
|
GType type;
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
align32 (*in);
|
|
||||||
GST_DEBUG ("Reading/casting for GstBinaryPluginFeature at address %p", *in);
|
|
||||||
unpack_element (*in, pf, GstBinaryPluginFeature);
|
|
||||||
|
|
||||||
/* unpack plugin feature strings */
|
/* unpack plugin feature strings */
|
||||||
unpack_string (*in, type_name);
|
unpack_string (*in, type_name);
|
||||||
|
|
||||||
|
@ -599,25 +634,29 @@ gst_registry_binary_load_feature (GstRegistry * registry, gchar ** in,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
feature->rank = pf->rank;
|
|
||||||
feature->plugin_name = plugin_name;
|
|
||||||
|
|
||||||
/* unpack more plugin feature strings */
|
/* unpack more plugin feature strings */
|
||||||
unpack_string (*in, feature->name);
|
unpack_string (*in, feature->name);
|
||||||
|
|
||||||
if (GST_IS_ELEMENT_FACTORY (feature)) {
|
if (GST_IS_ELEMENT_FACTORY (feature)) {
|
||||||
|
GstBinaryElementFactory *ef;
|
||||||
GstElementFactory *factory = GST_ELEMENT_FACTORY (feature);
|
GstElementFactory *factory = GST_ELEMENT_FACTORY (feature);
|
||||||
|
|
||||||
|
align32 (*in);
|
||||||
|
GST_DEBUG ("Reading/casting for GstBinaryElementFactory at address %p",
|
||||||
|
*in);
|
||||||
|
unpack_element (*in, ef, GstBinaryElementFactory);
|
||||||
|
pf = (GstBinaryPluginFeature *) ef;
|
||||||
|
|
||||||
/* unpack element factory strings */
|
/* unpack element factory strings */
|
||||||
unpack_string (*in, factory->details.longname);
|
unpack_string (*in, factory->details.longname);
|
||||||
unpack_string (*in, factory->details.klass);
|
unpack_string (*in, factory->details.klass);
|
||||||
unpack_string (*in, factory->details.description);
|
unpack_string (*in, factory->details.description);
|
||||||
unpack_string (*in, factory->details.author);
|
unpack_string (*in, factory->details.author);
|
||||||
GST_DEBUG ("Element factory : '%s' with npadtemplates=%d",
|
GST_DEBUG ("Element factory : '%s' with npadtemplates=%d",
|
||||||
factory->details.longname, pf->npadtemplates);
|
factory->details.longname, ef->npadtemplates);
|
||||||
|
|
||||||
/* load pad templates */
|
/* load pad templates */
|
||||||
for (i = 0; i < pf->npadtemplates; i++) {
|
for (i = 0; i < ef->npadtemplates; i++) {
|
||||||
if (!gst_registry_binary_load_pad_template (factory, in)) {
|
if (!gst_registry_binary_load_pad_template (factory, in)) {
|
||||||
GST_ERROR ("Error while loading binary pad template");
|
GST_ERROR ("Error while loading binary pad template");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -625,36 +664,67 @@ gst_registry_binary_load_feature (GstRegistry * registry, gchar ** in,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* load uritypes */
|
/* load uritypes */
|
||||||
if (pf->nuriprotocols) {
|
if (ef->nuriprotocols) {
|
||||||
GST_DEBUG ("Reading %d UriTypes at address %p", pf->nuriprotocols, *in);
|
GST_DEBUG ("Reading %d UriTypes at address %p", ef->nuriprotocols, *in);
|
||||||
|
|
||||||
align32 (*in);
|
align32 (*in);
|
||||||
factory->uri_type = *((guint *) * in);
|
factory->uri_type = *((guint *) * in);
|
||||||
*in += sizeof (factory->uri_type);
|
*in += sizeof (factory->uri_type);
|
||||||
//unpack_element(*in, &factory->uri_type, factory->uri_type);
|
//unpack_element(*in, &factory->uri_type, factory->uri_type);
|
||||||
|
|
||||||
factory->uri_protocols = g_new0 (gchar *, pf->nuriprotocols + 1);
|
factory->uri_protocols = g_new0 (gchar *, ef->nuriprotocols + 1);
|
||||||
for (i = 0; i < pf->nuriprotocols; i++) {
|
for (i = 0; i < ef->nuriprotocols; i++) {
|
||||||
unpack_string (*in, str);
|
unpack_string (*in, str);
|
||||||
factory->uri_protocols[i] = str;
|
factory->uri_protocols[i] = str;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* load interfaces */
|
/* load interfaces */
|
||||||
GST_DEBUG ("Reading %d Interfaces at address %p", pf->ninterfaces, *in);
|
GST_DEBUG ("Reading %d Interfaces at address %p", ef->ninterfaces, *in);
|
||||||
for (i = 0; i < pf->ninterfaces; i++) {
|
for (i = 0; i < ef->ninterfaces; i++) {
|
||||||
unpack_string (*in, str);
|
unpack_string (*in, str);
|
||||||
__gst_element_factory_add_interface (factory, str);
|
__gst_element_factory_add_interface (factory, str);
|
||||||
g_free (str);
|
g_free (str);
|
||||||
}
|
}
|
||||||
} else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
|
} else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
|
||||||
/* FIXME: load typefind */
|
GstBinaryTypeFindFactory *tff;
|
||||||
|
GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (feature);
|
||||||
|
|
||||||
|
align32 (*in);
|
||||||
|
GST_DEBUG ("Reading/casting for GstBinaryPluginFeature at address %p", *in);
|
||||||
|
unpack_element (*in, tff, GstBinaryTypeFindFactory);
|
||||||
|
pf = (GstBinaryPluginFeature *) tff;
|
||||||
|
|
||||||
|
/* load caps */
|
||||||
|
unpack_string (*in, str);
|
||||||
|
factory->caps = gst_caps_from_string (str);
|
||||||
|
g_free (str);
|
||||||
|
/* load extensions */
|
||||||
|
if (tff->nextensions) {
|
||||||
|
GST_DEBUG ("Reading %d Typefind extensions at address %p",
|
||||||
|
tff->nextensions, *in);
|
||||||
|
factory->extensions = g_new0 (gchar *, tff->nextensions + 1);
|
||||||
|
for (i = 0; i < tff->nextensions; i++) {
|
||||||
|
unpack_string (*in, str);
|
||||||
|
factory->extensions[i] = str;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifndef GST_DISABLE_INDEX
|
#ifndef GST_DISABLE_INDEX
|
||||||
else if (GST_IS_INDEX_FACTORY (feature)) {
|
else if (GST_IS_INDEX_FACTORY (feature)) {
|
||||||
/* FIXME: load indexers */
|
GstIndexFactory *factory = GST_INDEX_FACTORY (feature);
|
||||||
|
|
||||||
|
align32 (*in);
|
||||||
|
GST_DEBUG ("Reading/casting for GstBinaryPluginFeature at address %p", *in);
|
||||||
|
unpack_element (*in, pf, GstBinaryPluginFeature);
|
||||||
|
|
||||||
|
/* unpack index factory strings */
|
||||||
|
unpack_string (*in, factory->longdesc);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
feature->rank = pf->rank;
|
||||||
|
feature->plugin_name = plugin_name;
|
||||||
|
|
||||||
gst_registry_add_feature (registry, feature);
|
gst_registry_add_feature (registry, feature);
|
||||||
GST_DEBUG ("Added feature %s", feature->name);
|
GST_DEBUG ("Added feature %s", feature->name);
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ typedef struct _GstBinaryChunk
|
||||||
/*
|
/*
|
||||||
* GstBinaryPluginElement:
|
* GstBinaryPluginElement:
|
||||||
*
|
*
|
||||||
* @nfeatures: says how many GstBinaryPluginFeature structures we will have
|
* @nfeatures: says how many binary plugin feature structures we will have
|
||||||
* right after the structure itself.
|
* right after the structure itself.
|
||||||
*
|
*
|
||||||
* A structure containing (staticely) every information needed for a plugin
|
* A structure containing (staticely) every information needed for a plugin
|
||||||
|
@ -111,12 +111,21 @@ typedef struct _GstBinaryPluginElement
|
||||||
typedef struct _GstBinaryPluginFeature
|
typedef struct _GstBinaryPluginFeature
|
||||||
{
|
{
|
||||||
gulong rank;
|
gulong rank;
|
||||||
|
} GstBinaryPluginFeature;
|
||||||
|
|
||||||
|
typedef struct _GstBinaryElementFactory {
|
||||||
|
GstBinaryPluginFeature plugin_feature;
|
||||||
|
|
||||||
guint npadtemplates;
|
guint npadtemplates;
|
||||||
guint ninterfaces;
|
guint ninterfaces;
|
||||||
guint nuriprotocols;
|
guint nuriprotocols;
|
||||||
} GstBinaryPluginFeature;
|
} GstBinaryElementFactory;
|
||||||
|
|
||||||
|
typedef struct _GstBinaryTypeFindFactory {
|
||||||
|
GstBinaryPluginFeature plugin_feature;
|
||||||
|
|
||||||
|
guint nextensions;
|
||||||
|
} GstBinaryTypeFindFactory;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GstBinaryPadTemplate:
|
* GstBinaryPadTemplate:
|
||||||
|
|
Loading…
Reference in a new issue