New typefind system: bytestream is now part of the core all plugins have been modifie...
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Wed, 1 Oct 2003 13:14:52 +0000 (13:14 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Wed, 1 Oct 2003 13:14:52 +0000 (13:14 +0000)
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

16 files changed:
configure.ac
ext/Makefile.am
ext/dv/gstdvdec.c
ext/dv/gstdvdec.h
ext/flac/gstflac.c
ext/flac/gstflacdec.h
ext/ladspa/gstladspa.c
ext/ladspa/gstladspa.h
gst/auparse/gstauparse.c
gst/avi/gstavidemux.c
gst/avi/gstavidemux.h
gst/flx/gstflxdec.c
gst/flx/gstflxdec.h
gst/qtdemux/qtdemux.c
gst/qtdemux/qtdemux.h
gst/wavparse/gstwavparse.c

index bf0338e..5bcb93a 100644 (file)
@@ -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
index 2b1ab6e..66346ea 100644 (file)
@@ -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) \
index e28f836..27283f6 100644 (file)
@@ -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.
index 0ac9c49..cced080 100644 (file)
@@ -29,7 +29,7 @@ extern "C" {
 
 
 #include <libdv/dv.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
 
 
 /* This is the definition of the element's object structure. */
index 2c30df3..2fe8f41 100644 (file)
@@ -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 (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 (gst_bytestream_peek (bs, &buf, 4) == 4) {
+    guint32 head = GUINT32_FROM_BE (*((guint32 *) GST_BUFFER_DATA (buf)));
+
+    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 */
index 67742ac..0b37444 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <config.h>
 #include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
 
 #include <FLAC/all.h>
 
index 460bdf1..5f16dbf 100644 (file)
@@ -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);
   
index 89a039e..85348a9 100644 (file)
@@ -26,7 +26,7 @@
 
 #include <config.h>
 #include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
 
 #include "ladspa.h"
 
index 422ee1b..f2ce8c8 100644 (file)
@@ -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;
 }
index ed60593..7017030 100644 (file)
@@ -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;
 
index d1c1d58..9a719a6 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <config.h>
 #include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
 #include <gst/riff/riff.h>
 
 #ifdef __cplusplus
index c20327a..1f55b7d 100644 (file)
@@ -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);
index c7d6f38..0ee4b1c 100644 (file)
@@ -23,7 +23,7 @@
 #include <gst/gst.h>
 
 #include "flx_color.h"
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
 
 
 #ifdef __cplusplus
index 3358db3..f5a95c0 100644 (file)
@@ -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);
-
-  g_return_val_if_fail (data != NULL, NULL);
-  
-  if(GST_BUFFER_SIZE(buf) < 8){
-    return NULL;
+  GstBuffer *buf = NULL;
+  GstCaps *new = 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);
index 108faab..46684be 100644 (file)
@@ -22,7 +22,7 @@
 #define __GST_QTDEMUX_H__
 
 #include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
 
 #ifdef __cplusplus
 extern "C" {
index c2e6063..67d7fa1 100644 (file)
@@ -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)