From 6fbff1c1062102cb6bf48c43160009143c8abe83 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Wed, 1 Oct 2003 13:11:45 +0000 Subject: [PATCH] New typefind system: bytestream is now part of the core all plugins have been modified to use this new typefind syste... Original commit message from CVS: New typefind system: * bytestream is now part of the core * all plugins have been modified to use this new typefind system * asf typefinding added * mpeg video stream typefiding removed because it's broken * duplicate typefind entries removed * extra id3 typefinding added, because we've seen 4 types of files (riff/wav, flac, vorbis, mp3) with id3 headers and each of these needs to work. Instead, I've added an id3 element and let it redo typefiding after the id3 header. this needs a hack because spider only typefinds once. We can remove this hack once spider supports multiple typefinds. * with all this, mp3 typefinding is semi-rewritten * id3 typefinding in flac/vorbis is removed, it's no longer needed * fixed spider and gst-typefind to use this, too. * Other general cleanups --- configure.ac | 1 - docs/random/interfaces | 18 +- gst/Makefile.am | 8 +- gst/autoplug/Makefile.am | 6 +- gst/autoplug/gstsearchfuncs.c | 4 +- gst/autoplug/gstspideridentity.c | 70 +--- .../bytestream.c => gst/gstbytestream.c | 17 +- .../bytestream.h => gst/gstbytestream.h | 4 +- gst/gsttype.c | 11 +- gst/gsttype.h | 9 +- gst/gsttypefind.c | 91 +++--- gst/gsttypefind.h | 5 +- gst/registries/gstxmlregistry.c | 23 -- libs/gst/Makefile.am | 4 +- libs/gst/bytestream/Makefile.am | 14 - libs/gst/bytestream/bstest.c | 304 ------------------ 16 files changed, 89 insertions(+), 500 deletions(-) rename libs/gst/bytestream/bytestream.c => gst/gstbytestream.c (98%) rename libs/gst/bytestream/bytestream.h => gst/gstbytestream.h (97%) delete mode 100644 libs/gst/bytestream/Makefile.am delete mode 100644 libs/gst/bytestream/bstest.c diff --git a/configure.ac b/configure.ac index d9fc0ba2a0..c3630f6f5a 100644 --- a/configure.ac +++ b/configure.ac @@ -568,7 +568,6 @@ gst/types/Makefile gst/registries/Makefile libs/Makefile libs/gst/Makefile -libs/gst/bytestream/Makefile libs/gst/getbits/Makefile libs/gst/control/Makefile libs/ext/Makefile diff --git a/docs/random/interfaces b/docs/random/interfaces index 5632c5d3a2..7d6515fa42 100644 --- a/docs/random/interfaces +++ b/docs/random/interfaces @@ -210,17 +210,6 @@ macros GST_IS_MIXER () and GST_MIXER () would then look like this: So the application would just tread it with the known macro, and everything would look extremely simple to the end user. -Also some convenience function to set the element: - -void -gst_interface_set_element (GstInterface *iface, - GstElement *element) -{ - g_return_if_fail (GST_IS_INTERFACE (iface)); - - iface->element = element; -} - 4a) mixer --------- A mixer is a way of controlling volume and input/output channels. @@ -317,7 +306,7 @@ typedef struct _GstOverlayClass { XID xid); } GstOverlayClass; -That's all! +That's all! It would look similar for FB & co. 4c) user input -------------- @@ -335,8 +324,9 @@ input-from-application APIs. 5) Status of this document ========================== -This is a proposal, nothing more. Nothing is implemented. Target -release is 0.8.0 or any 0.7.x version. +The interfaces are implemented, more (for metadata, framebuffer- +overlay, video balancing (brightness), user input etc. are all +pending. 6) Copyright and blabla ======================= diff --git a/gst/Makefile.am b/gst/Makefile.am index 5024fb92a7..f5082115e9 100644 --- a/gst/Makefile.am +++ b/gst/Makefile.am @@ -16,13 +16,13 @@ GST_LOADSAVE_SRC = gstxml.c endif if GST_DISABLE_TYPEFIND -GST_TYPEFIND_SRC = +GST_TYPEFIND_SRC = else GST_TYPEFIND_SRC = gsttypefind.c endif if GST_DISABLE_AUTOPLUG -GST_AUTOPLUG_SRC = +GST_AUTOPLUG_SRC = GST_AUTOPLUG_DIRS = else GST_AUTOPLUG_SRC = gstautoplug.c @@ -91,11 +91,12 @@ libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \ gstmarshal.c \ $(GST_ENUMTYPES_SRC) \ gstobject.c \ - $(GST_AUTOPLUG_SRC) \ gstatomic.c \ + $(GST_AUTOPLUG_SRC) \ gstbin.c \ gstbuffer.c \ gstbufferpool-default.c \ + gstbytestream.c \ gstcaps.c \ gstclock.c \ gstcpu.c \ @@ -157,6 +158,7 @@ gst_headers = \ gstbin.h \ gstbuffer.h \ gstbufferpool-default.h \ + gstbytestream.h \ gstcaps.h \ gstclock.h \ gstcompat.h \ diff --git a/gst/autoplug/Makefile.am b/gst/autoplug/Makefile.am index 3f17a4f4be..15af40920d 100644 --- a/gst/autoplug/Makefile.am +++ b/gst/autoplug/Makefile.am @@ -27,13 +27,15 @@ libgstautoplugger_la_CFLAGS = $(GST_CFLAGS) libgstautoplugger_la_LIBADD = libgstautoplugger_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -libgstspider_la_SOURCES = gstspider.c gstspideridentity.c gstsearchfuncs.c +libgstspider_la_SOURCES = \ + gstspider.c gstspideridentity.c \ + gstsearchfuncs.c libgstspider_la_CFLAGS = $(GST_CFLAGS) libgstspider_la_LIBADD = libgstspider_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = gststaticautoplug.h gststaticautoplugrender.h \ - gstspider.h gstspideridentity.h gstsearchfuncs.h + gstspider.h gstspideridentity.h gstsearchfuncs.h noinst_PROGRAMS = autoplugtest spidertest diff --git a/gst/autoplug/gstsearchfuncs.c b/gst/autoplug/gstsearchfuncs.c index 2602c212f4..4fd5bdb1b2 100644 --- a/gst/autoplug/gstsearchfuncs.c +++ b/gst/autoplug/gstsearchfuncs.c @@ -250,11 +250,12 @@ gst_autoplug_factories_filters_with_sink_caps (GList *factories) GList *ret = NULL; GstElementFactory *factory; GList *templs; - + while (factories) { factory = (GstElementFactory *) factories->data; templs = factory->padtemplates; + if (GST_PLUGIN_FEATURE (factory)->rank > 0){ gboolean have_src = FALSE; gboolean have_sink = FALSE; @@ -341,6 +342,7 @@ gst_autoplug_sp (GstCaps *srccaps, GstCaps *sinkcaps, GList *factories) GST_INFO ("attempting to autoplug via shortest path from %s to %s", gst_caps_get_mime (srccaps), gst_caps_get_mime (sinkcaps)); + gst_caps_debug (srccaps, "source caps"); gst_caps_debug (sinkcaps, "sink caps"); /* wrap all factories as GstAutoplugNode diff --git a/gst/autoplug/gstspideridentity.c b/gst/autoplug/gstspideridentity.c index 6b3de77e86..c54cb1a437 100644 --- a/gst/autoplug/gstspideridentity.c +++ b/gst/autoplug/gstspideridentity.c @@ -413,61 +413,22 @@ gst_spider_identity_src_loop (GstSpiderIdentity *ident) static void gst_spider_identity_sink_loop_type_finding (GstSpiderIdentity *ident) { - GstBuffer *buf=NULL; - GstBuffer *typefindbuf = NULL; - gboolean getmorebuf = TRUE; + GstBuffer *buf = NULL; GList *type_list; GstCaps *caps; + GstByteStream *bs; - /* this should possibly be a property */ - guint bufsizelimit = 4096; - g_return_if_fail (GST_IS_SPIDER_IDENTITY (ident)); - while (getmorebuf){ - - /* check if our buffer is big enough to do a typefind */ - if (typefindbuf && GST_BUFFER_SIZE(typefindbuf) >= bufsizelimit){ - getmorebuf = FALSE; - break; - } - buf = gst_pad_pull (ident->sink); - - /* if it's an event... */ - while (GST_IS_EVENT (buf)) { - switch (GST_EVENT_TYPE (GST_EVENT (buf))){ - case GST_EVENT_EOS: - getmorebuf = FALSE; - /* FIXME Notify the srcs that EOS has happened */ - gst_pad_event_default (ident->sink, GST_EVENT (buf)); - break; - default: - gst_pad_event_default (ident->sink, GST_EVENT (buf)); - buf = gst_pad_pull (ident->sink); - break; - } - /* handle DISCONT events, please */ - } - - typefindbuf = buf; - getmorebuf = FALSE; - /* FIXME merging doesn't work for some reason so - * we'll just typefind with the first element - if (!typefindbuf){ - typefindbuf = buf; - gst_buffer_ref(buf); - } - else { - GstBuffer *oldbuf = typefindbuf; - typefindbuf = gst_buffer_merge(typefindbuf, buf); - gst_buffer_unref(oldbuf); - gst_buffer_unref(buf); - } - */ - } - - if (!typefindbuf){ + /* get a bytestream object */ + bs = gst_bytestream_new (ident->sink); + if (gst_bytestream_peek (bs, &buf, 1) != 1 || !buf) { + buf = NULL; + g_warning ("Failed to read fake buffer - serious idiocy going on here"); goto end; + } else { + gst_buffer_unref (buf); + buf = NULL; } /* maybe there are already valid caps now? */ @@ -487,7 +448,7 @@ gst_spider_identity_sink_loop_type_finding (GstSpiderIdentity *ident) GstTypeFindFunc typefindfunc = (GstTypeFindFunc)factory->typefindfunc; GST_DEBUG ("trying typefind function %s", GST_PLUGIN_FEATURE_NAME (factory)); - if (typefindfunc && (caps = typefindfunc (buf, factory))) { + if (typefindfunc && (caps = typefindfunc (bs, factory))) { GST_INFO ("typefind function %s found caps", GST_PLUGIN_FEATURE_NAME (factory)); if (gst_pad_try_set_caps (ident->src, caps) <= 0) { g_warning ("typefind: found type but peer didn't accept it"); @@ -501,7 +462,6 @@ gst_spider_identity_sink_loop_type_finding (GstSpiderIdentity *ident) type_list = g_list_next (type_list); } gst_element_error(GST_ELEMENT(ident), "Could not find media type", NULL); - gst_buffer_unref(buf); buf = GST_BUFFER (gst_event_new (GST_EVENT_EOS)); end: @@ -512,15 +472,19 @@ end: /* push the buffer */ gst_spider_identity_chain (ident->sink, buf); + + /* bytestream no longer needed */ + gst_bytestream_destroy (bs); return; plug: - gst_caps_debug (caps, "spider starting caps"); gst_caps_sink (caps); - gst_spider_identity_plug (ident); + gst_spider_identity_plug (ident); + + gst_bytestream_read (bs, &buf, bs->listavail); goto end; } diff --git a/libs/gst/bytestream/bytestream.c b/gst/gstbytestream.c similarity index 98% rename from libs/gst/bytestream/bytestream.c rename to gst/gstbytestream.c index 9e0f2c9797..fc3c3a4e1c 100644 --- a/libs/gst/bytestream/bytestream.c +++ b/gst/gstbytestream.c @@ -28,7 +28,7 @@ #include #include -#include "bytestream.h" +#include GST_DEBUG_CATEGORY_STATIC(debug_bs); #define GST_CAT_DEFAULT debug_bs @@ -744,18 +744,3 @@ gst_bytestream_print_status (GstByteStream * bs) GST_BUFFER_OFFSET (buf), GST_BUFFER_SIZE (buf)); } } - - -static gboolean -plugin_init (GModule *module, GstPlugin *plugin) -{ - gst_plugin_set_longname (plugin, "GstByteStream: a byte-oriented layer on top of buffer-passing"); - return TRUE; -} - -GstPluginDesc plugin_desc = { - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "gstbytestream", - plugin_init -}; diff --git a/libs/gst/bytestream/bytestream.h b/gst/gstbytestream.h similarity index 97% rename from libs/gst/bytestream/bytestream.h rename to gst/gstbytestream.h index 28869de82a..3191d08cf9 100644 --- a/libs/gst/bytestream/bytestream.h +++ b/gst/gstbytestream.h @@ -20,7 +20,9 @@ #ifndef __GST_BYTESTREAM_H__ #define __GST_BYTESTREAM_H__ -#include +#include +#include +#include G_BEGIN_DECLS diff --git a/gst/gsttype.c b/gst/gsttype.c index 26d86abfe4..d24e81abd7 100644 --- a/gst/gsttype.c +++ b/gst/gsttype.c @@ -29,6 +29,7 @@ #include "gst_private.h" +#include "gstbytestream.h" #include "gsttype.h" #include "gstregistrypool.h" #include "gstobject.h" @@ -42,9 +43,7 @@ static guint16 _gst_maxtype; static void gst_type_factory_class_init (GstTypeFactoryClass *klass); static void gst_type_factory_init (GstTypeFactory *factory); -static GstCaps* gst_type_type_find_dummy (GstBuffer *buffer, gpointer priv); - -static void gst_type_factory_unload_thyself (GstPluginFeature *feature); +static void gst_type_factory_unload_thyself (GstPluginFeature *feature); static GstPluginFeatureClass *parent_class = NULL; /* static guint gst_type_factory_signals[LAST_SIGNAL] = { 0 }; */ @@ -315,8 +314,8 @@ gst_type_factory_unload_thyself (GstPluginFeature *feature) factory->typefindfunc = gst_type_type_find_dummy; } -static GstCaps* -gst_type_type_find_dummy (GstBuffer *buffer, gpointer priv) +GstCaps* +gst_type_type_find_dummy (GstByteStream *bs, gpointer priv) { GstCaps *res = NULL; GstTypeFactory *factory = (GstTypeFactory *)priv; @@ -329,7 +328,7 @@ gst_type_type_find_dummy (GstBuffer *buffer, gpointer priv) g_warning ("could not load valid typefind function for %s\n", factory->mime); } else if (factory->typefindfunc) { - res = factory->typefindfunc (buffer, factory); + res = factory->typefindfunc (bs, priv); } } diff --git a/gst/gsttype.h b/gst/gsttype.h index 9cd150de53..9a3365a7b9 100644 --- a/gst/gsttype.h +++ b/gst/gsttype.h @@ -24,14 +24,14 @@ #ifndef __GST_TYPE_H__ #define __GST_TYPE_H__ -#include #include #include +#include G_BEGIN_DECLS /* type of function used to check a stream for equality with type */ -typedef GstCaps* (*GstTypeFindFunc) (GstBuffer *buf, gpointer priv); +typedef GstCaps* (*GstTypeFindFunc) (GstByteStream *bs, gpointer priv); typedef struct _GstType GstType; typedef struct _GstTypeDefinition GstTypeDefinition; @@ -74,7 +74,7 @@ struct _GstTypeFactory { struct _GstTypeFactoryClass { GstPluginFeatureClass parent; - gpointer dummy[8]; + gpointer dummy[8]; }; @@ -98,6 +98,9 @@ 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__ */ diff --git a/gst/gsttypefind.c b/gst/gsttypefind.c index 11768efa39..19a2f10044 100644 --- a/gst/gsttypefind.c +++ b/gst/gsttypefind.c @@ -26,8 +26,6 @@ #include "gstinfo.h" #include "gsttypefind.h" -#define DEFAULT_MAX_BUFFERS 1 - GstElementDetails gst_type_find_details = { "TypeFind", "Generic", @@ -39,6 +37,13 @@ GstElementDetails gst_type_find_details = { "(C) 1999", }; +/* generic templates */ +GST_PAD_TEMPLATE_FACTORY (type_find_sink_factory, + "sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + NULL +); /* TypeFind signals and args */ enum { @@ -49,7 +54,6 @@ enum { enum { ARG_0, ARG_CAPS, - ARG_MAX_BUFFERS, }; @@ -63,7 +67,7 @@ static void gst_type_find_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void gst_type_find_chain (GstPad *pad, GstBuffer *buf); +static void gst_type_find_loopfunc (GstElement *element); static GstElementStateReturn gst_type_find_change_state (GstElement *element); @@ -88,7 +92,9 @@ gst_type_find_get_type (void) (GInstanceInitFunc)gst_type_find_init, NULL }; - typefind_type = g_type_register_static (GST_TYPE_ELEMENT, "GstTypeFind", &typefind_info, 0); + typefind_type = g_type_register_static (GST_TYPE_ELEMENT, + "GstTypeFind", + &typefind_info, 0); } return typefind_type; } @@ -106,11 +112,6 @@ gst_type_find_class_init (GstTypeFindClass *klass) g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CAPS, g_param_spec_pointer ("caps", "Caps", "Found capabilities", G_PARAM_READABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MAX_BUFFERS, - g_param_spec_int ("max_buffers", - "Max Buffers", - "Maximal amount of buffers before giving en error (0 == unlimited)", - 0, G_MAXINT, DEFAULT_MAX_BUFFERS, G_PARAM_READWRITE)); gst_type_find_signals[HAVE_TYPE] = g_signal_new ("have_type", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, @@ -127,12 +128,13 @@ gst_type_find_class_init (GstTypeFindClass *klass) static void gst_type_find_init (GstTypeFind *typefind) { - typefind->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + typefind->sinkpad = gst_pad_new_from_template ( + GST_PAD_TEMPLATE_GET (type_find_sink_factory), "sink"); gst_element_add_pad (GST_ELEMENT (typefind), typefind->sinkpad); - gst_pad_set_chain_function (typefind->sinkpad, gst_type_find_chain); - typefind->num_buffer = 0; - typefind->max_buffers = DEFAULT_MAX_BUFFERS; + gst_element_set_loop_function (GST_ELEMENT (typefind), + gst_type_find_loopfunc); + typefind->caps = NULL; } @@ -147,9 +149,6 @@ gst_type_find_set_property (GObject *object, guint prop_id, typefind = GST_TYPE_FIND (object); switch (prop_id) { - case ARG_MAX_BUFFERS: - typefind->max_buffers = g_value_get_int (value); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -170,9 +169,6 @@ gst_type_find_get_property (GObject *object, guint prop_id, case ARG_CAPS: g_value_set_pointer (value, typefind->caps); break; - case ARG_MAX_BUFFERS: - g_value_set_int (value, typefind->max_buffers); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -180,18 +176,16 @@ gst_type_find_get_property (GObject *object, guint prop_id, } static void -gst_type_find_chain (GstPad *pad, GstBuffer *buf) +gst_type_find_loopfunc (GstElement *element) { GstTypeFind *typefind; const GList *type_list; GstType *type; - g_return_if_fail (GST_IS_PAD (pad)); + typefind = GST_TYPE_FIND (element); - typefind = GST_TYPE_FIND (GST_OBJECT_PARENT (pad)); - - GST_DEBUG ("got buffer of %d bytes in '%s'", - GST_BUFFER_SIZE (buf), GST_OBJECT_NAME (typefind)); + GST_DEBUG ("Started typefinding loop in '%s'", + GST_OBJECT_NAME (typefind)); type_list = gst_type_get_list (); @@ -203,42 +197,34 @@ gst_type_find_chain (GstPad *pad, GstBuffer *buf) while (factories) { GstTypeFactory *factory = GST_TYPE_FACTORY (factories->data); - GstTypeFindFunc typefindfunc = (GstTypeFindFunc)factory->typefindfunc; + GstTypeFindFunc typefindfunc = (GstTypeFindFunc) factory->typefindfunc; GstCaps *caps; GST_CAT_DEBUG (GST_CAT_TYPES, "try type (%p) :%d \"%s\" %p", factory, type->id, type->mime, typefindfunc); - if (typefindfunc && (caps = typefindfunc (buf, factory))) { + if (typefindfunc && (caps = typefindfunc (typefind->bs, factory))) { GST_CAT_DEBUG (GST_CAT_TYPES, "found type: %d \"%s\" \"%s\"", caps->id, type->mime, gst_caps_get_name (caps)); - typefind->caps = caps; + gst_caps_replace (&typefind->caps, caps); - if (gst_pad_try_set_caps (pad, caps) <= 0) { + if (gst_pad_try_set_caps (typefind->sinkpad, caps) <= 0) { g_warning ("typefind: found type but peer didn't accept it"); } - { - gst_object_ref (GST_OBJECT (typefind)); - g_signal_emit (G_OBJECT (typefind), gst_type_find_signals[HAVE_TYPE], 0, - typefind->caps); - gst_object_unref (GST_OBJECT (typefind)); - goto end; - } + gst_object_ref (GST_OBJECT (typefind)); + g_signal_emit (G_OBJECT (typefind), gst_type_find_signals[HAVE_TYPE], + 0, typefind->caps); + gst_object_unref (GST_OBJECT (typefind)); + return; } factories = g_slist_next (factories); } type_list = g_list_next (type_list); } - typefind->num_buffer++; - -end: - gst_buffer_unref (buf); - - if (typefind->max_buffers && typefind->num_buffer >= typefind->max_buffers) { - gst_element_error (GST_ELEMENT (typefind), - "typefind could not determine type after %d buffers", typefind->num_buffer); - } + /* if we get here, nothing worked... :'(. */ + gst_element_error (GST_ELEMENT (typefind), + "media type could not be detected"); } static GstElementStateReturn @@ -250,17 +236,14 @@ gst_type_find_change_state (GstElement *element) typefind = GST_TYPE_FIND (element); switch (GST_STATE_TRANSITION (element)) { - case GST_STATE_NULL_TO_READY: - break; case GST_STATE_READY_TO_PAUSED: - typefind->num_buffer = 0; - gst_caps_unref (typefind->caps); - typefind->caps = NULL; + typefind->bs = gst_bytestream_new (typefind->sinkpad); break; - case GST_STATE_PAUSED_TO_PLAYING: - case GST_STATE_PLAYING_TO_PAUSED: case GST_STATE_PAUSED_TO_READY: - case GST_STATE_READY_TO_NULL: + gst_bytestream_destroy (typefind->bs); + gst_caps_replace (&typefind->caps, NULL); + break; + default: break; } diff --git a/gst/gsttypefind.h b/gst/gsttypefind.h index ea072da00e..9067138b4e 100644 --- a/gst/gsttypefind.h +++ b/gst/gsttypefind.h @@ -27,6 +27,7 @@ #ifndef GST_DISABLE_TYPE_FIND #include +#include G_BEGIN_DECLS @@ -46,11 +47,9 @@ struct _GstTypeFind { GstElement element; GstPad *sinkpad; + GstByteStream *bs; GstCaps *caps; - - gint num_buffer; - gint max_buffers; }; struct _GstTypeFindClass { diff --git a/gst/registries/gstxmlregistry.c b/gst/registries/gstxmlregistry.c index 36aea6fbd4..e7043bd619 100644 --- a/gst/registries/gstxmlregistry.c +++ b/gst/registries/gstxmlregistry.c @@ -711,29 +711,6 @@ gst_xml_registry_parse_element_factory (GMarkupParseContext *context, const gcha return TRUE; } -static GstCaps* -gst_type_type_find_dummy (GstBuffer *buffer, gpointer priv) -{ - 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) { - if (factory->typefindfunc == gst_type_type_find_dummy) { - GST_CAT_WARNING (GST_CAT_TYPES, "GstTypeFactory %s for mime %s exts %s does not install a valid typefindfunc", - factory->feature.name, factory->mime, factory->exts); - } else { - GstCaps *res = factory->typefindfunc (buffer, factory); - if (res) - return res; - } - } - } - return NULL; -} - - static gboolean gst_xml_registry_parse_type_factory (GMarkupParseContext *context, const gchar *tag, const gchar *text, gsize text_len, GstXMLRegistry *registry, GError **error) diff --git a/libs/gst/Makefile.am b/libs/gst/Makefile.am index f4d1e346b6..97d3e58050 100644 --- a/libs/gst/Makefile.am +++ b/libs/gst/Makefile.am @@ -1,3 +1,3 @@ -SUBDIRS = bytestream control getbits +SUBDIRS = control getbits -DIST_SUBDIRS = bytestream control getbits +DIST_SUBDIRS = control getbits diff --git a/libs/gst/bytestream/Makefile.am b/libs/gst/bytestream/Makefile.am deleted file mode 100644 index e083bba7f0..0000000000 --- a/libs/gst/bytestream/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -librarydir = $(libdir)/gstreamer-@GST_MAJORMINOR@ - -library_LTLIBRARIES = libgstbytestream.la -noinst_LTLIBRARIES = libgstbstest.la - -libgstbytestreamincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/bytestream -libgstbytestreaminclude_HEADERS = bytestream.h - -libgstbytestream_la_SOURCES = bytestream.c -libgstbytestream_la_CFLAGS = $(GST_CFLAGS) -libgstbytestream_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) - -libgstbstest_la_SOURCES = bstest.c -libgstbstest_la_CFLAGS = $(GST_CFLAGS) diff --git a/libs/gst/bytestream/bstest.c b/libs/gst/bytestream/bstest.c deleted file mode 100644 index b04598f296..0000000000 --- a/libs/gst/bytestream/bstest.c +++ /dev/null @@ -1,304 +0,0 @@ -/* GStreamer - * Copyright (C) 1999,2000 Erik Walthinsen - * 2000 Wim Taymans - * - * gstidentity.c: - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include "bytestream.h" - -#define GST_TYPE_IDENTITY \ - (gst_identity_get_type()) -#define GST_IDENTITY(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IDENTITY,GstIdentity)) -#define GST_IDENTITY_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IDENTITY,GstIdentityClass)) -#define GST_IS_IDENTITY(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IDENTITY)) -#define GST_IS_IDENTITY_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IDENTITY)) - -typedef struct _GstIdentity GstIdentity; -typedef struct _GstIdentityClass GstIdentityClass; - -struct _GstIdentity { - GstElement element; - - GstPad *sinkpad; - GstPad *srcpad; - - GstByteStream *bs; - gint byte_size; - gint count; -}; - -struct _GstIdentityClass { - GstElementClass parent_class; -}; - -GType gst_identity_get_type(void); - - -GstElementDetails gst_identity_details = { - "ByteStreamTest", - "Filter", - "Test for the GstByteStream code", - VERSION, - "Erik Walthinsen ", - "(C) 2001", -}; - - -/* Identity signals and args */ -enum { - /* FILL ME */ - LAST_SIGNAL -}; - -enum { - ARG_0, - ARG_BYTE_SIZE, - ARG_COUNT, -}; - - -static void gst_identity_class_init (GstIdentityClass *klass); -static void gst_identity_init (GstIdentity *identity); - -static void gst_identity_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_identity_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - -static void gst_identity_loop (GstElement *element); - -static GstElementClass *parent_class = NULL; -/* static guint gst_identity_signals[LAST_SIGNAL] = { 0 }; */ - -GType -gst_identity_get_type (void) -{ - static GType identity_type = 0; - - if (!identity_type) { - static const GTypeInfo identity_info = { - sizeof(GstIdentityClass), NULL, - NULL, - (GClassInitFunc)gst_identity_class_init, - NULL, - NULL, - sizeof(GstIdentity), - 0, - (GInstanceInitFunc)gst_identity_init, - }; - identity_type = g_type_register_static (GST_TYPE_ELEMENT, "GstBSTest", &identity_info, 0); - } - return identity_type; -} - -static void -gst_identity_class_init (GstIdentityClass *klass) -{ - GObjectClass *gobject_class; - - gobject_class = (GObjectClass*)klass; - - parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BYTE_SIZE, - g_param_spec_uint ("byte_size", "byte_size", "byte_size", - 0, G_MAXUINT, 0, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_COUNT, - g_param_spec_uint ("count", "count", "count", - 0, G_MAXUINT, 0, G_PARAM_READWRITE)); - - gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_identity_set_property); - gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_identity_get_property); -} - -/* -static GstPadNegotiateReturn -gst_identity_negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data) -{ - GstIdentity *identity; - - identity = GST_IDENTITY (gst_pad_get_parent (pad)); - - return gst_pad_negotiate_proxy (pad, identity->sinkpad, caps); -} - -static GstPadNegotiateReturn -gst_identity_negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data) -{ - GstIdentity *identity; - - identity = GST_IDENTITY (gst_pad_get_parent (pad)); - - return gst_pad_negotiate_proxy (pad, identity->srcpad, caps); -} -*/ - -static void -gst_identity_init (GstIdentity *identity) -{ - identity->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); - gst_element_add_pad (GST_ELEMENT (identity), identity->sinkpad); - /*gst_pad_set_negotiate_function (identity->sinkpad, gst_identity_negotiate_sink); */ - - identity->srcpad = gst_pad_new ("src", GST_PAD_SRC); - gst_element_add_pad (GST_ELEMENT (identity), identity->srcpad); - /*gst_pad_set_negotiate_function (identity->srcpad, gst_identity_negotiate_src); */ - - gst_element_set_loop_function (GST_ELEMENT (identity), gst_identity_loop); - - identity->byte_size = 384; - identity->count = 5; - - identity->bs = gst_bytestream_new(identity->sinkpad); -} - -static void -gst_identity_loop (GstElement *element) -{ - GstIdentity *identity; - GstBuffer *buf; - int i; - - g_return_if_fail (element != NULL); - g_return_if_fail (GST_IS_IDENTITY (element)); - - identity = GST_IDENTITY (element); - -/* THIS IS THE BUFFER BASED ONE - do { -* g_print("\n"); * - - for (i=0;icount;i++) { -* g_print("bstest: getting a buffer of %d bytes\n",identity->byte_size); * - buf = gst_bytestream_read(identity->bs,identity->byte_size); - if (!buf) g_print("BUFFER IS BOGUS\n"); -* g_print("pushing the buffer, %d bytes at %d\n",GST_BUFFER_SIZE(buf),GST_BUFFER_OFFSET(buf)); * - gst_pad_push(identity->srcpad,buf); -* g_print("\n"); * - gst_bytestream_print_status(identity->bs); -* g_print("\n\n"); * - } - - exit(1); - } while (!GST_ELEMENT_IS_COTHREAD_STOPPING(element)); -*/ - -/* THIS IS THE BYTE BASED ONE*/ - do { - for (i=0;icount;i++) { - guint8 *data; - buf = gst_buffer_new(); - /* note that this is dangerous, as it does *NOT* refcount the data, it can go away!!! */ - GST_BUFFER_SIZE(buf) = gst_bytestream_peek_bytes(identity->bs, &data, identity->byte_size); - GST_BUFFER_DATA(buf) = data; - GST_BUFFER_FLAG_SET(buf,GST_BUFFER_DONTFREE); - gst_pad_push(identity->srcpad,buf); - gst_bytestream_flush(identity->bs,identity->byte_size); - } - - exit(1); - /* implicit declaration of function `GST_ELEMENT_IS_COTHREAD_STOPPING' */ - #define GST_ELEMENT_IS_COTHREAD_STOPPING(element) GST_FLAG_IS_SET((element), GST_ELEMENT_SCHEDULER_PRIVATE1) - } while (!GST_ELEMENT_IS_COTHREAD_STOPPING(element)); -/**/ -} - -static void -gst_identity_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - GstIdentity *identity; - - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail (GST_IS_IDENTITY (object)); - - identity = GST_IDENTITY (object); - - switch (prop_id) { - case ARG_BYTE_SIZE: - identity->byte_size = g_value_get_uint (value); - break; - case ARG_COUNT: - identity->count = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void gst_identity_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - GstIdentity *identity; - - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail (GST_IS_IDENTITY (object)); - - identity = GST_IDENTITY (object); - - switch (prop_id) { - case ARG_BYTE_SIZE: - g_value_set_uint (value, identity->byte_size); - break; - case ARG_COUNT: - g_value_set_uint (value, identity->count); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static gboolean -plugin_init (GModule *module, GstPlugin *plugin) -{ - GstElementFactory *factory; - - /* we need gstbytestream */ - if (!gst_library_load ("gstbytestream")) { - g_print("can't load bytestream\n"); - return FALSE; - } - - /* We need to create an ElementFactory for each element we provide. - * This consists of the name of the element, the GType identifier, - * and a pointer to the details structure at the top of the file. - */ - factory = gst_element_factory_new("gstbstest", GST_TYPE_IDENTITY, &gst_identity_details); - g_return_val_if_fail(factory != NULL, FALSE); - - /* The very last thing is to register the elementfactory with the plugin. */ - gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); - - return TRUE; -} - -GstPluginDesc plugin_desc = { - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "gstbstest", - plugin_init -}; -