From 38946080fd20c3b73154685b10c29aa22fac69c3 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Wed, 1 Oct 2003 13:14:52 +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 | 3 ++- ext/Makefile.am | 5 +++-- ext/dv/gstdvdec.c | 41 +++++++++++++++++----------------- ext/dv/gstdvdec.h | 2 +- ext/flac/gstflac.c | 45 +++++++++++++------------------------- ext/flac/gstflacdec.h | 2 +- ext/ladspa/gstladspa.c | 3 --- ext/ladspa/gstladspa.h | 2 +- gst/auparse/gstauparse.c | 19 +++++++++++----- gst/avi/gstavidemux.c | 36 +++++++++++++++--------------- gst/avi/gstavidemux.h | 2 +- gst/flx/gstflxdec.c | 38 +++++++++++++++++--------------- gst/flx/gstflxdec.h | 2 +- gst/qtdemux/qtdemux.c | 38 +++++++++++++++++--------------- gst/qtdemux/qtdemux.h | 2 +- gst/wavparse/gstwavparse.c | 27 +++++++++++++++++------ 16 files changed, 138 insertions(+), 129 deletions(-) diff --git a/configure.ac b/configure.ac index bf0338ee8c..5bcb93ac67 100644 --- a/configure.ac +++ b/configure.ac @@ -262,7 +262,7 @@ GST_PLUGINS_ALL="\ ac3parse adder audioscale auparse avi \ asfdemux audioconvert cdxaparse chart \ cutter debug deinterlace effectv festival \ - filter flx goom intfloat law level median mixmatrix \ + filter flx goom id3 intfloat law level median mixmatrix \ mpeg1sys mpeg1videoparse mpeg2enc mpeg2sub \ mpegaudio mpegaudioparse mpegstream mpegtypes \ monoscope oneton overlay passthrough playondemand qtdemux \ @@ -1180,6 +1180,7 @@ gst/festival/Makefile gst/filter/Makefile gst/flx/Makefile gst/goom/Makefile +gst/id3/Makefile gst/intfloat/Makefile gst/law/Makefile gst/level/Makefile diff --git a/ext/Makefile.am b/ext/Makefile.am index 2b1ab6eca2..66346eaceb 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -278,8 +278,9 @@ SUBDIRS=$(A52DEC_DIR) $(AALIB_DIR) $(ALSA_DIR) \ $(ARTS_DIR) $(ARTSC_DIR) $(AUDIOFILE_DIR) \ $(CDPARANOIA_DIR) $(DIVX_DIR) \ $(DVDREAD_DIR) $(DVDNAV_DIR) $(ESD_DIR) $(MAS_DIR) \ - $(FFMPEG_DIR) $(FLAC_DIR) $(GDK_PIXBUF_DIR) $(GNOMEVFS_DIR) $(GSM_DIR) \ - $(HERMES_DIR) $(JACK_DIR) $(JPEG_DIR) \ + $(FFMPEG_DIR) $(FLAC_DIR) $(GDK_PIXBUF_DIR) \ + $(GNOMEVFS_DIR) $(GSM_DIR) $(HERMES_DIR) \ + $(JACK_DIR) $(JPEG_DIR) \ $(LADSPA_DIR) $(LAME_DIR) $(LCS_DIR) \ $(LIBDV_DIR) $(LIBFAME_DIR) $(LIBPNG_DIR) \ $(MAD_DIR) $(MATROSKA_DIR) $(MIKMOD_DIR) \ diff --git a/ext/dv/gstdvdec.c b/ext/dv/gstdvdec.c index e28f8362fb..27283f69c2 100644 --- a/ext/dv/gstdvdec.c +++ b/ext/dv/gstdvdec.c @@ -159,30 +159,34 @@ GST_PAD_TEMPLATE_FACTORY ( audio_src_temp, /* typefind stuff */ static GstCaps* -dv_type_find (GstBuffer *buf, gpointer private) +dv_type_find (GstByteStream *bs, gpointer private) { - guint32 head; + GstBuffer *buf = NULL; GstCaps *new = NULL; - if (GST_BUFFER_SIZE (buf) < 5) - return NULL; + if (gst_bytestream_peek (bs, &buf, 5) == 5) { + guint32 head = GUINT32_FROM_BE (*((guint32 *) GST_BUFFER_DATA (buf))); - head = GUINT32_FROM_BE(*((guint32 *)GST_BUFFER_DATA(buf))); + /* check for DIF and DV flag */ + if ((head & 0xffffff00) == 0x1f070000 && + !(GST_BUFFER_DATA (buf)[4] & 0x01)) { + gchar *format; - /* check for DIF and DV flag */ - if ((head & 0xffffff00) == 0x1f070000 && !(GST_BUFFER_DATA(buf)[4] & 0x01)) { - gchar *format; - - if ((head & 0x000000ff) & 0x80) - format = "PAL"; - else - format = "NTSC"; + if ((head & 0x000000ff) & 0x80) + format = "PAL"; + else + format = "NTSC"; - new = GST_CAPS_NEW ("dv_type_find", - "video/x-dv", - "systemstream", GST_PROPS_BOOLEAN (TRUE) - ); + new = GST_CAPS_NEW ("dv_type_find", + "video/x-dv", + "systemstream", GST_PROPS_BOOLEAN (TRUE)); + } } + + if (buf != NULL) { + gst_buffer_unref (buf); + } + return new; } @@ -1002,9 +1006,6 @@ plugin_init (GModule *module, GstPlugin *plugin) GstElementFactory *factory; GstTypeFactory *type; - if (!gst_library_load ("gstbytestream")) - 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. diff --git a/ext/dv/gstdvdec.h b/ext/dv/gstdvdec.h index 0ac9c49a16..cced0803f8 100644 --- a/ext/dv/gstdvdec.h +++ b/ext/dv/gstdvdec.h @@ -29,7 +29,7 @@ extern "C" { #include -#include +#include /* This is the definition of the element's object structure. */ diff --git a/ext/flac/gstflac.c b/ext/flac/gstflac.c index 2c30df32d5..2fe8f419e3 100644 --- a/ext/flac/gstflac.c +++ b/ext/flac/gstflac.c @@ -26,7 +26,7 @@ extern GstElementDetails flacenc_details; extern GstElementDetails flacdec_details; -static GstCaps* flac_type_find (GstBuffer *buf, gpointer private); +static GstCaps* flac_type_find (GstByteStream *bs, gpointer private); GstPadTemplate *gst_flacdec_src_template, *gst_flacdec_sink_template; GstPadTemplate *gst_flacenc_src_template, *gst_flacenc_sink_template; @@ -70,37 +70,26 @@ static GstTypeDefinition flacdefinition = { static GstCaps* -flac_type_find (GstBuffer *buf, gpointer private) +flac_type_find (GstByteStream *bs, gpointer private) { - gint offset; - guint8 *data; - gint size; - guint32 head; - - if (GST_BUFFER_SIZE (buf) < 4) - return NULL; + GstBuffer *buf = NULL; + GstCaps *new = NULL; - data = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); - - head = GUINT32_FROM_BE (*((guint32 *)GST_BUFFER_DATA (buf))); + if (gst_bytestream_peek (bs, &buf, 4) == 4) { + guint32 head = GUINT32_FROM_BE (*((guint32 *) GST_BUFFER_DATA (buf))); - if (head == 0x664C6143) - return gst_caps_new ("flac_type_find", "application/x-flac", NULL); - else { - /* checks for existance of flac identification header in case - * there's an ID3 tag */ - for (offset = 0; offset < size-4; offset++) { - if (data[offset] == 'f' && - data[offset+1] == 'L' && - data[offset+2] == 'a' && - data[offset+3] == 'C' ) { - return gst_caps_new ("flac_type_find", "application/x-flac", NULL); - } + if (head == 0x664C6143) { + new = GST_CAPS_NEW ("flac_type_find", + "application/x-flac", + NULL); } } - return NULL; + if (buf != NULL) { + gst_buffer_unref (buf); + } + + return new; } @@ -111,10 +100,6 @@ plugin_init (GModule *module, GstPlugin *plugin) GstTypeFactory *type; GstCaps *raw_caps, *flac_caps; - /* this filter needs the bytestream package */ - if (!gst_library_load ("gstbytestream")) - return FALSE; - gst_plugin_set_longname (plugin, "The FLAC Lossless compressor Codec"); /* create an elementfactory for the flacenc element */ diff --git a/ext/flac/gstflacdec.h b/ext/flac/gstflacdec.h index 67742ac6dd..0b37444009 100644 --- a/ext/flac/gstflacdec.h +++ b/ext/flac/gstflacdec.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include diff --git a/ext/ladspa/gstladspa.c b/ext/ladspa/gstladspa.c index 460bdf1288..5f16dbf547 100644 --- a/ext/ladspa/gstladspa.c +++ b/ext/ladspa/gstladspa.c @@ -993,9 +993,6 @@ plugin_init (GModule *module, GstPlugin *plugin) LADSPAPluginSearch(ladspa_describe_plugin); - if (! gst_library_load ("gstbytestream")) - return FALSE; - /* initialize dparam support library */ gst_control_init(NULL,NULL); diff --git a/ext/ladspa/gstladspa.h b/ext/ladspa/gstladspa.h index 89a039e9c4..85348a9555 100644 --- a/ext/ladspa/gstladspa.h +++ b/ext/ladspa/gstladspa.h @@ -26,7 +26,7 @@ #include #include -#include +#include #include "ladspa.h" diff --git a/gst/auparse/gstauparse.c b/gst/auparse/gstauparse.c index 422ee1bab9..f2ce8c8594 100644 --- a/gst/auparse/gstauparse.c +++ b/gst/auparse/gstauparse.c @@ -42,16 +42,23 @@ static GstElementDetails gst_auparse_details = { }; static GstCaps* -au_type_find (GstBuffer *buf, gpointer private) +au_type_find (GstByteStream *bs, gpointer private) { + GstBuffer *buf = NULL; GstCaps *new = NULL; - gulong *head = (gulong *) GST_BUFFER_DATA (buf); - if (GST_BUFFER_SIZE (buf) < 4) - return NULL; + if (gst_bytestream_peek (bs, &buf, 4) == 4) { + guint32 head = * (guint32 *) GST_BUFFER_DATA (buf); + if (head == 0x2e736e64 || head == 0x646e732e) { + new = gst_caps_new ("au_type_find", + "audio/x-au", + NULL); + } + } - if (*head == 0x2e736e64 || *head == 0x646e732e) - new = gst_caps_new ("au_type_find", "audio/x-au", NULL); + if (buf != NULL) { + gst_buffer_unref (buf); + } return new; } diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c index ed605935a3..701703091b 100644 --- a/gst/avi/gstavidemux.c +++ b/gst/avi/gstavidemux.c @@ -38,7 +38,7 @@ static GstElementDetails gst_avi_demux_details = { "(C) 1999", }; -static GstCaps* avi_type_find (GstBuffer *buf, gpointer private); +static GstCaps* avi_type_find (GstByteStream *bs, gpointer private); /* typefactory for 'avi' */ static GstTypeDefinition avidefinition = { @@ -173,25 +173,29 @@ gst_avi_demux_init (GstAviDemux *avi_demux) } static GstCaps* -avi_type_find (GstBuffer *buf, - gpointer private) +avi_type_find (GstByteStream *bs, + gpointer private) { - gchar *data = GST_BUFFER_DATA (buf); - GstCaps *new; + GstBuffer *buf = NULL; + GstCaps *new = NULL; GST_DEBUG ("avi_demux: typefind"); - if (GST_BUFFER_SIZE (buf) < 12) - return NULL; + if (gst_bytestream_peek (bs, &buf, 12) == 12) { + guint32 head1 = GUINT32_FROM_LE (((guint32 *) GST_BUFFER_DATA (buf))[0]), + head2 = GUINT32_FROM_LE (((guint32 *) GST_BUFFER_DATA (buf))[2]); - if (GUINT32_FROM_LE (((guint32 *)data)[0]) != GST_RIFF_TAG_RIFF) - return NULL; - if (GUINT32_FROM_LE (((guint32 *)data)[2]) != GST_RIFF_RIFF_AVI) - return NULL; + if (head1 == GST_RIFF_TAG_RIFF && head2 == GST_RIFF_RIFF_AVI) { + new = GST_CAPS_NEW ("avi_type_find", + "video/avi", + NULL); + } + } + + if (buf != NULL) { + gst_buffer_unref (buf); + } - new = GST_CAPS_NEW ("avi_type_find", - "video/avi", - NULL); return new; } @@ -1961,10 +1965,6 @@ plugin_init (GModule *module, GstPlugin *plugin) -1 /* end */ }; - /* this filter needs the riff parser */ - if (!gst_library_load ("gstbytestream")) - return FALSE; - if (!gst_library_load ("gstriff")) return FALSE; diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h index d1c1d5829d..9a719a6706 100644 --- a/gst/avi/gstavidemux.h +++ b/gst/avi/gstavidemux.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include #ifdef __cplusplus diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c index c20327a704..1f55b7d950 100644 --- a/gst/flx/gstflxdec.c +++ b/gst/flx/gstflxdec.c @@ -28,7 +28,7 @@ #define JIFFIE (GST_SECOND/70) -static GstCaps* flxdec_type_find(GstBuffer *buf, gpointer private); +static GstCaps* flxdec_type_find (GstByteStream *bs, gpointer private); /* flx element information */ static GstElementDetails flxdec_details = { @@ -113,27 +113,33 @@ static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); static GstElementClass *parent_class = NULL; static GstCaps* -flxdec_type_find (GstBuffer *buf, gpointer private) +flxdec_type_find (GstByteStream *bs, gpointer private) { - guchar *data = GST_BUFFER_DATA(buf); - GstCaps *new; + GstBuffer *buf = NULL; + GstCaps *new = NULL; - if (GST_BUFFER_SIZE(buf) < 134){ - return NULL; - } + if (gst_bytestream_peek (bs, &buf, 134) == 134) { + guint8 *data = GST_BUFFER_DATA (buf); - /* check magic */ - if ((data[4] == 0x11 || data[4] == 0x12 - || data[4] == 0x30 || data[4] == 0x44) && data[5] == 0xaf) { + /* check magic */ + if ((data[4] == 0x11 || data[4] == 0x12 || + data[4] == 0x30 || data[4] == 0x44) && + data[5] == 0xaf) { /* check the frame type of the first frame */ if ((data[132] == 0x00 || data[132] == 0xfa) && data[133] == 0xf1) { GST_DEBUG ("GstFlxDec: found supported flx format"); - new = gst_caps_new("flxdec_type_find","video/x-fli", NULL); - return new; + new = gst_caps_new ("flxdec_type_find", + "video/x-fli", + NULL); } + } } - - return NULL; + + if (buf != NULL) { + gst_buffer_unref (buf); + } + + return new; } @@ -684,10 +690,6 @@ plugin_init (GModule *module, GstPlugin *plugin) GstElementFactory *factory; GstTypeFactory *type; - /* this filter needs the bytestream package */ - if (!gst_library_load ("gstbytestream")) - return FALSE; - factory = gst_element_factory_new("flxdec", GST_TYPE_FLXDEC, &flxdec_details); g_return_val_if_fail(factory != NULL, FALSE); gst_element_factory_set_rank (factory, GST_ELEMENT_RANK_PRIMARY); diff --git a/gst/flx/gstflxdec.h b/gst/flx/gstflxdec.h index c7d6f3864c..0ee4b1c5ba 100644 --- a/gst/flx/gstflxdec.h +++ b/gst/flx/gstflxdec.h @@ -23,7 +23,7 @@ #include #include "flx_color.h" -#include +#include #ifdef __cplusplus diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 3358db334b..f5a95c0344 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -104,7 +104,7 @@ gst_qtdemux_details = "(C) 2003", }; -static GstCaps* quicktime_type_find (GstBuffer *buf, gpointer private); +static GstCaps* quicktime_type_find (GstByteStream *bs, gpointer private); static GstTypeDefinition quicktimedefinition = { "qtdemux_video/quicktime", @@ -187,24 +187,29 @@ gst_qtdemux_init (GstQTDemux *qtdemux) } static GstCaps* -quicktime_type_find (GstBuffer *buf, gpointer private) +quicktime_type_find (GstByteStream *bs, gpointer private) { - gchar *data = GST_BUFFER_DATA (buf); + GstBuffer *buf = NULL; + GstCaps *new = NULL; - g_return_val_if_fail (data != NULL, NULL); - - if(GST_BUFFER_SIZE(buf) < 8){ - return NULL; + if (gst_bytestream_peek (bs, &buf, 8) == 8) { + gchar *data = GST_BUFFER_DATA (buf); + + if (!strncmp (&data[4], "wide", 4) || + !strncmp (&data[4], "moov", 4) || + !strncmp (&data[4], "mdat", 4) || + !strncmp (&data[4], "free", 4)) { + new = GST_CAPS_NEW ("quicktime_type_find", + "video/quicktime", + NULL); + } } - if (strncmp (&data[4], "wide", 4)==0 || - strncmp (&data[4], "moov", 4)==0 || - strncmp (&data[4], "mdat", 4)==0 || - strncmp (&data[4], "free", 4)==0) { - return gst_caps_new ("quicktime_type_find", - "video/quicktime", - NULL); + + if (buf != NULL) { + gst_buffer_unref (buf); } - return NULL; + + return new; } static gboolean @@ -222,9 +227,6 @@ plugin_init (GModule *module, GstPlugin *plugin) }; gint i; - if (!gst_library_load ("gstbytestream")) - return FALSE; - factory = gst_element_factory_new ("qtdemux", GST_TYPE_QTDEMUX, &gst_qtdemux_details); g_return_val_if_fail(factory != NULL, FALSE); diff --git a/gst/qtdemux/qtdemux.h b/gst/qtdemux/qtdemux.h index 108faab196..46684be89f 100644 --- a/gst/qtdemux/qtdemux.h +++ b/gst/qtdemux/qtdemux.h @@ -22,7 +22,7 @@ #define __GST_QTDEMUX_H__ #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c index c2e6063cc8..67d7fa19b1 100644 --- a/gst/wavparse/gstwavparse.c +++ b/gst/wavparse/gstwavparse.c @@ -31,7 +31,8 @@ static void gst_wavparse_init (GstWavParse *wavparse); static GstElementStateReturn gst_wavparse_change_state (GstElement *element); -static GstCaps* wav_type_find (GstBuffer *buf, gpointer private); +static GstCaps* wav_type_find (GstByteStream *bs, + gpointer private); static const GstFormat* gst_wavparse_get_formats (GstPad *pad); static const GstQueryType * @@ -213,15 +214,27 @@ gst_wavparse_init (GstWavParse *wavparse) } static GstCaps* -wav_type_find (GstBuffer *buf, gpointer private) +wav_type_find (GstByteStream *bs, gpointer private) { - gchar *data = GST_BUFFER_DATA (buf); + GstCaps *new = NULL; + GstBuffer *buf = NULL; - if (GST_BUFFER_SIZE (buf) < 12) return NULL; - if (strncmp (&data[0], "RIFF", 4)) return NULL; - if (strncmp (&data[8], "WAVE", 4)) return NULL; + if (gst_bytestream_peek (bs, &buf, 12) == 12) { + gchar *data = GST_BUFFER_DATA (buf); - return gst_caps_new ("wav_type_find", "audio/x-wav", NULL); + if (!strncmp (&data[0], "RIFF", 4) && + !strncmp (&data[8], "WAVE", 4)) { + new = GST_CAPS_NEW ("wav_type_find", + "audio/x-wav", + NULL); + } + } + + if (buf != NULL) { + gst_buffer_unref (buf); + } + + return new; } static void wav_new_chunk_callback(GstRiffChunk *chunk, gpointer data)