summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac3
-rw-r--r--ext/Makefile.am5
-rw-r--r--ext/audiofile/gstafparse.c3
-rw-r--r--ext/audiofile/gstafparse.h2
-rw-r--r--ext/ivorbis/vorbis.c6
-rw-r--r--ext/ivorbis/vorbisfile.c2
-rw-r--r--ext/jack/gstjack.h2
-rw-r--r--ext/ladspa/gstladspa.c3
-rw-r--r--ext/ladspa/gstladspa.h2
-rw-r--r--ext/mplex/gstmplex.h2
-rw-r--r--gst/cdxaparse/gstcdxaparse.c35
-rw-r--r--gst/cdxaparse/gstcdxaparse.h2
-rw-r--r--gst/festival/gstfestival.c36
-rw-r--r--gst/flx/gstflxdec.c38
-rw-r--r--gst/flx/gstflxdec.h2
-rw-r--r--gst/mixmatrix/mixmatrix.c6
-rw-r--r--gst/modplug/gstmodplug.cc56
-rw-r--r--gst/modplug/gstmodplug.h2
-rw-r--r--gst/mpegaudioparse/Makefile.am10
-rw-r--r--gst/mpegaudioparse/gstmp3types.c251
-rw-r--r--gst/mpegaudioparse/gstmpegaudioparse.c288
-rw-r--r--gst/qtdemux/qtdemux.c40
-rw-r--r--gst/qtdemux/qtdemux.h2
23 files changed, 373 insertions, 425 deletions
diff --git a/configure.ac b/configure.ac
index bf0338ee..5bcb93ac 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 2b1ab6ec..66346eac 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/audiofile/gstafparse.c b/ext/audiofile/gstafparse.c
index 255247e8..183f5147 100644
--- a/ext/audiofile/gstafparse.c
+++ b/ext/audiofile/gstafparse.c
@@ -337,8 +337,7 @@ gst_afparse_plugin_init (GModule *module, GstPlugin *plugin)
/* load audio support library */
if (!gst_library_load ("gstaudio"))
return FALSE;
- if (!gst_library_load ("gstbytestream"))
- return FALSE;
+
return TRUE;
}
diff --git a/ext/audiofile/gstafparse.h b/ext/audiofile/gstafparse.h
index 9483f248..1cf7b1e1 100644
--- a/ext/audiofile/gstafparse.h
+++ b/ext/audiofile/gstafparse.h
@@ -27,7 +27,7 @@
#include <config.h>
#include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
#include <audiofile.h> /* what else are we to do */
#include <af_vfs.h>
diff --git a/ext/ivorbis/vorbis.c b/ext/ivorbis/vorbis.c
index 65ef4b06..35919059 100644
--- a/ext/ivorbis/vorbis.c
+++ b/ext/ivorbis/vorbis.c
@@ -21,7 +21,7 @@
#include <gst/gst.h>
#include <tremor/ivorbiscodec.h>
#include <tremor/ivorbisfile.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
extern GType ivorbisfile_get_type(void);
@@ -132,10 +132,6 @@ plugin_init (GModule *module, GstPlugin *plugin)
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (file));
- /* this filter needs the bytestream package */
- if (!gst_library_load ("gstbytestream"))
- return FALSE;
-
type = gst_type_factory_new (&vorbisdefinition);
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (type));
diff --git a/ext/ivorbis/vorbisfile.c b/ext/ivorbis/vorbisfile.c
index 86c7baf2..5b270fb9 100644
--- a/ext/ivorbis/vorbisfile.c
+++ b/ext/ivorbis/vorbisfile.c
@@ -24,7 +24,7 @@
#include <gst/gst.h>
#include <tremor/ivorbiscodec.h>
#include <tremor/ivorbisfile.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
#define GST_TYPE_IVORBISFILE \
(ivorbisfile_get_type())
diff --git a/ext/jack/gstjack.h b/ext/jack/gstjack.h
index 87d7d611..80fd2b63 100644
--- a/ext/jack/gstjack.h
+++ b/ext/jack/gstjack.h
@@ -22,7 +22,7 @@
#include <jack/jack.h>
#include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
//#define JACK_DEBUG(str, a...) g_message (str, ##a)
#define JACK_DEBUG(str, a...)
diff --git a/ext/ladspa/gstladspa.c b/ext/ladspa/gstladspa.c
index 460bdf12..5f16dbf5 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 89a039e9..85348a95 100644
--- a/ext/ladspa/gstladspa.h
+++ b/ext/ladspa/gstladspa.h
@@ -26,7 +26,7 @@
#include <config.h>
#include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
#include "ladspa.h"
diff --git a/ext/mplex/gstmplex.h b/ext/mplex/gstmplex.h
index 98b19aca..8b108ed1 100644
--- a/ext/mplex/gstmplex.h
+++ b/ext/mplex/gstmplex.h
@@ -26,7 +26,7 @@
#include <stdlib.h>
#include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
#include "outputstream.hh"
#include "bits.hh"
diff --git a/gst/cdxaparse/gstcdxaparse.c b/gst/cdxaparse/gstcdxaparse.c
index 5af9bd81..bfe3c8ac 100644
--- a/gst/cdxaparse/gstcdxaparse.c
+++ b/gst/cdxaparse/gstcdxaparse.c
@@ -50,7 +50,7 @@ static GstElementDetails gst_cdxa_parse_details = {
"(C) 2002",
};
-static GstCaps* cdxa_type_find (GstBuffer *buf, gpointer private);
+static GstCaps* cdxa_type_find (GstByteStream *bs, gpointer private);
/* typefactory for 'cdxa' */
static GstTypeDefinition cdxadefinition = {
@@ -159,25 +159,28 @@ gst_cdxa_parse_init (GstCDXAParse *cdxa_parse)
}
static GstCaps*
-cdxa_type_find (GstBuffer *buf,
- gpointer private)
+cdxa_type_find (GstByteStream *bs,
+ gpointer private)
{
- gchar *data = GST_BUFFER_DATA (buf);
- GstCaps *new;
+ GstBuffer *buf = NULL;
+ GstCaps *new = NULL;
GST_DEBUG ("cdxa_parse: 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_CDXA)
- return NULL;
+ if (head1 == GST_RIFF_TAG_RIFF && head2 == GST_RIFF_RIFF_CDXA) {
+ new = GST_CAPS_NEW ("cdxa_type_find",
+ "video/x-cdxa",
+ NULL);
+ }
+ }
- new = GST_CAPS_NEW ("cdxa_type_find",
- "video/x-cdxa",
- NULL);
+ if (buf != NULL) {
+ gst_buffer_unref (buf);
+ }
return new;
}
@@ -342,10 +345,6 @@ plugin_init (GModule *module, GstPlugin *plugin)
GstElementFactory *factory;
GstTypeFactory *type;
- /* this filter needs the riff parser */
- if (!gst_library_load ("gstbytestream"))
- return FALSE;
-
/* create an elementfactory for the cdxa_parse element */
factory = gst_element_factory_new ("cdxaparse", GST_TYPE_CDXA_PARSE,
&gst_cdxa_parse_details);
diff --git a/gst/cdxaparse/gstcdxaparse.h b/gst/cdxaparse/gstcdxaparse.h
index fcf77107..c46df149 100644
--- a/gst/cdxaparse/gstcdxaparse.h
+++ b/gst/cdxaparse/gstcdxaparse.h
@@ -24,7 +24,7 @@
#include <config.h>
#include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
#ifdef __cplusplus
extern "C" {
diff --git a/gst/festival/gstfestival.c b/gst/festival/gstfestival.c
index 87416184..4113410a 100644
--- a/gst/festival/gstfestival.c
+++ b/gst/festival/gstfestival.c
@@ -80,7 +80,7 @@
static void gst_festival_class_init (GstFestivalClass *klass);
static void gst_festival_init (GstFestival *festival);
-static GstCaps* text_type_find (GstBuffer *buf, gpointer private);
+static GstCaps* text_type_find (GstByteStream *bs, gpointer private);
static void gst_festival_chain (GstPad *pad, GstBuffer *buf);
static GstElementStateReturn
@@ -198,21 +198,35 @@ gst_festival_init (GstFestival *festival)
}
static GstCaps*
-text_type_find (GstBuffer *buf, gpointer private)
+text_type_find (GstByteStream *bs, gpointer private)
{
- gchar *data = GST_BUFFER_DATA (buf);
- gint i;
+ GstBuffer *buf = NULL;
+ GstCaps *new = NULL;
- /* 20 is arbitrary. 4 is definitely too small. */
- if (GST_BUFFER_SIZE (buf) < 20)
- return NULL;
+#define TEXT_SIZE 32
- for (i=0; i<GST_BUFFER_SIZE (buf); i++) {
- if (!isprint(data[i]) && data[i]!='\n')
- return NULL;
+ /* read arbitrary number and see if it's textual */
+ if (gst_bytestream_peek (bs, &buf, TEXT_SIZE) == TEXT_SIZE) {
+ gchar *data = GST_BUFFER_DATA (buf);
+ gint i;
+
+ for (i = 0; i < TEXT_SIZE; i++) {
+ if (!isprint (data[i]) && data[i] != '\n') {
+ break;
+ }
+ }
+
+ /* well, we found something that looks like text... */
+ new = gst_caps_new ("text_type_find",
+ "text/plain",
+ NULL);
+ }
+
+ if (buf != NULL) {
+ gst_buffer_unref (buf);
}
- return gst_caps_new ("text_type_find", "text/plain", NULL);
+ return new;
}
diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c
index c20327a7..1f55b7d9 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 c7d6f386..0ee4b1c5 100644
--- a/gst/flx/gstflxdec.h
+++ b/gst/flx/gstflxdec.h
@@ -23,7 +23,7 @@
#include <gst/gst.h>
#include "flx_color.h"
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
#ifdef __cplusplus
diff --git a/gst/mixmatrix/mixmatrix.c b/gst/mixmatrix/mixmatrix.c
index 0e9e832a..9e7c7ac8 100644
--- a/gst/mixmatrix/mixmatrix.c
+++ b/gst/mixmatrix/mixmatrix.c
@@ -22,7 +22,7 @@
#endif
#include <config.h>
#include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
#include <gst/audio/audio.h>
#include <string.h>
@@ -500,10 +500,6 @@ plugin_init (GModule *module, GstPlugin *plugin)
{
GstElementFactory *factory;
- /* this filter needs the bytestream package */
- if (!gst_library_load ("gstbytestream"))
- return FALSE;
-
factory = gst_element_factory_new ("mixmatrix", GST_TYPE_MIXMATRIX,
&mixmatrix_details);
g_return_val_if_fail (factory != NULL, FALSE);
diff --git a/gst/modplug/gstmodplug.cc b/gst/modplug/gstmodplug.cc
index 2fa602f7..07a09a1c 100644
--- a/gst/modplug/gstmodplug.cc
+++ b/gst/modplug/gstmodplug.cc
@@ -130,31 +130,39 @@ static GstElementStateReturn
static GstElementClass *parent_class = NULL;
static GstCaps*
-modplug_type_find (GstBuffer *buf, gpointer priv)
-{
- if (GST_BUFFER_SIZE (buf) < 75)
- return NULL;
-
- if (MOD_CheckType (buf) ||
- Mod_669_CheckType (buf) ||
- Amf_CheckType (buf) ||
- Dsm_CheckType (buf) ||
- Fam_CheckType (buf) ||
- Gdm_CheckType (buf) ||
- Imf_CheckType (buf) ||
- It_CheckType (buf) ||
- M15_CheckType (buf) ||
- /*Med_CheckType (buf) || <- FIXME */
- Mtm_CheckType (buf) ||
- Okt_CheckType (buf) ||
- S3m_CheckType (buf) ||
- Xm_CheckType (buf)) {
- return gst_caps_new ("modplug_type_find",
- "audio/x-mod",
- NULL);
+modplug_type_find (GstByteStream *bs, gpointer priv)
+{
+ GstBuffer *buf = NULL;
+ GstCaps *newc = NULL;
+
+ if (gst_bytestream_peek (bs, &buf, 75) == 75) {
+ if (MOD_CheckType (buf) ||
+ Mod_669_CheckType (buf) ||
+ Amf_CheckType (buf) ||
+ Dsm_CheckType (buf) ||
+ Fam_CheckType (buf) ||
+ Gdm_CheckType (buf) ||
+ Imf_CheckType (buf) ||
+ It_CheckType (buf) ||
+ M15_CheckType (buf) ||
+#if 0
+ Med_CheckType (buf) || /* FIXME */
+#endif
+ Mtm_CheckType (buf) ||
+ Okt_CheckType (buf) ||
+ S3m_CheckType (buf) ||
+ Xm_CheckType (buf)) {
+ newc = GST_CAPS_NEW ("modplug_type_find",
+ "audio/x-mod",
+ NULL);
+ }
}
-
- return NULL;
+
+ if (buf != NULL) {
+ gst_buffer_unref (buf);
+ }
+
+ return newc;
}
static GstTypeDefinition modplug_definitions[] = {
diff --git a/gst/modplug/gstmodplug.h b/gst/modplug/gstmodplug.h
index 97d6d00e..dcdbf062 100644
--- a/gst/modplug/gstmodplug.h
+++ b/gst/modplug/gstmodplug.h
@@ -28,7 +28,7 @@ extern "C" {
#endif /* __cplusplus */
#include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/gstbytestream.h>
#include "modplug_types.h"
diff --git a/gst/mpegaudioparse/Makefile.am b/gst/mpegaudioparse/Makefile.am
index ee22c43e..cb06727f 100644
--- a/gst/mpegaudioparse/Makefile.am
+++ b/gst/mpegaudioparse/Makefile.am
@@ -1,17 +1,9 @@
-#FIXME clean me up a bit
-
-plugin_LTLIBRARIES = libgstmpegaudioparse.la libgstmp3types.la
+plugin_LTLIBRARIES = libgstmpegaudioparse.la
libgstmpegaudioparse_la_SOURCES = gstmpegaudioparse.c
libgstmpegaudioparse_la_CFLAGS = $(GST_CFLAGS)
libgstmpegaudioparse_la_LIBADD =
libgstmpegaudioparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstmp3types_la_SOURCES = gstmp3types.c
-libgstmp3types_la_CFLAGS = $(GST_CFLAGS)
-libgstmp3types_la_LIBADD =
-libgstmp3types_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-
noinst_HEADERS = gstmpegaudioparse.h
EXTRA_DIST = README
-
diff --git a/gst/mpegaudioparse/gstmp3types.c b/gst/mpegaudioparse/gstmp3types.c
deleted file mode 100644
index cf5e860f..00000000
--- a/gst/mpegaudioparse/gstmp3types.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* GStreamer
- * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
- *
- * 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.
- */
-
-/*#define DEBUG_ENABLED */
-#include <gst/gst.h>
-#include <string.h> /* memcmp */
-
-static GstCaps* mp3_type_find(GstBuffer *buf, gpointer private);
-static GstCaps* mp3_type_find_stream(GstBuffer *buf, gpointer private);
-
-static GstTypeDefinition mp3type_definitions[] = {
- { "mp3types_audio/mpeg", "audio/mpeg", ".mp3 .mp2 .mp1 .mpga", mp3_type_find },
- { "mp3types_stream_audio/mpeg", "audio/mpeg", ".mp3 .mp2 .mp1 .mpga", mp3_type_find_stream },
- { NULL, NULL, NULL, NULL },
-};
-
-static GstCaps*
-mp3_type_find(GstBuffer *buf, gpointer private)
-{
- guint8 *data;
- gint size, layer;
- guint32 head;
- GstCaps *caps;
-
- data = GST_BUFFER_DATA (buf);
- size = GST_BUFFER_SIZE (buf);
-
- GST_DEBUG ("mp3typefind: typefind");
-
- /* gracefully ripped from libid3 */
- if (size >= 3 &&
- data[0] == 'T' && data[1] == 'A' && data[2] == 'G') {
- /* ID V1 tags */
- data += 128;
- size -= 128;
-
- GST_DEBUG ("mp3typefind: detected ID3 Tag V1");
- } else if (size >= 10 &&
- (data[0] == 'I' && data[1] == 'D' && data[2] == '3') &&
- data[3] < 0xff && data[4] < 0xff &&
- data[6] < 0x80 && data[7] < 0x80 && data[8] < 0x80 && data[9] < 0x80)
- {
- guint32 skip = 0;
-
- skip = (skip << 7) | (data[6] & 0x7f);
- skip = (skip << 7) | (data[7] & 0x7f);
- skip = (skip << 7) | (data[8] & 0x7f);
- skip = (skip << 7) | (data[9] & 0x7f);
-
- /* include size of header */
- skip += 10;
- /* footer present? (only available since version 4) */
- if (data[3] > 3 && (data[5] & 0x10))
- skip += 10;
-
- GST_DEBUG ("mp3typefind: detected ID3 Tag V2 with %u bytes", skip);
- size -= skip;
- data += skip;
- }
-
- if (size < 4)
- return NULL;
-
- /* now with the right postion, do typefinding */
- head = GUINT32_FROM_BE(*((guint32 *)data));
- if ((head & 0xffe00000) != 0xffe00000)
- return NULL;
- if (!(layer = ((head >> 17) & 3)))
- return NULL;
- layer = 4 - layer;
- if (((head >> 12) & 0xf) == 0xf)
- return NULL;
- if (!((head >> 12) & 0xf))
- return NULL;
- if (((head >> 10) & 0x3) == 0x3)
- return NULL;
-
- caps = GST_CAPS_NEW ("mp3_type_find", "audio/mpeg", "layer", GST_PROPS_INT (layer));
-
- return caps;
-}
-static guint mp3types_bitrates[2][3][16] =
-{ { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, },
- {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, },
- {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, } },
- { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, },
- {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, },
- {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, } },
-};
-static guint mp3types_freqs[3][3] =
-{ {44100, 48000, 32000},
- {22050, 24000, 16000},
- {11025, 12000, 8000}};
-static inline guint
-mp3_type_frame_length_from_header (guint32 header, guint *put_layer)
-{
- guint length;
- gulong samplerate, bitrate, layer, version;
-
- /* we don't need extension, mode, copyright, original or emphasis for the frame length */
- header >>= 9;
- /* padding */
- length = header & 0x1;
- header >>= 1;
- /* sampling frequency */
- samplerate = header & 0x3;
- if (samplerate == 3)
- return 0;
- header >>= 2;
- /* bitrate index */
- bitrate = header & 0xF;
- if (bitrate == 15 || bitrate == 0)
- return 0;
- /* ignore error correction, too */
- header >>= 5;
- /* layer */
- layer = 4 - (header & 0x3);
- if (layer == 4)
- return 0;
- header >>= 2;
- /* version */
- version = header & 0x3;
- if (version == 1)
- return 0;
- /* lookup */
- bitrate = mp3types_bitrates[version == 3 ? 0 : 1][layer - 1][bitrate];
- samplerate = mp3types_freqs[version > 0 ? version - 1 : 0][samplerate];
- /* calculating */
- if (layer == 1) {
- length = ((12000 * bitrate / samplerate) + length) * 4;
- } else {
- length += ((layer == 3 && version == 0) ? 144000 : 72000) * bitrate / samplerate;
- }
-
- GST_DEBUG ("Calculated mad frame length of %u bytes", length);
- GST_DEBUG ("samplerate = %lu - bitrate = %lu - layer = %lu - version = %lu", samplerate, bitrate, layer, version);
- if (put_layer)
- *put_layer = layer;
- return length;
-}
-/* increase this value when this function finds too many false positives */
-/**
- * The chance that random data is identified as a valid mp3 header is 63 / 2^18
- * (0.024%) per try. This makes the function for calculating false positives
- * 1 - (1 - ((63 / 2 ^18) ^ GST_MP3_TYPEFIND_MIN_HEADERS)) ^ buffersize)
- * This has the following probabilities of false positives:
- * bufsize MIN_HEADERS
- * (bytes) 1 2 3 4
- * 4096 62.6% 0.02% 0% 0%
- * 16384 98% 0.09% 0% 0%
- * 1 MiB 100% 5.88% 0% 0%
- * 1 GiB 100% 100% 1.44% 0%
- * 1 TiB 100% 100% 100% 0.35%
- * This means that the current choice (3 headers by most of the time 4096 byte
- * buffers is pretty safe for now.
- * It is however important to note that in a worst case example a buffer of size
- * 1440 * GST_MP3_TYPEFIND_MIN_HEADERS + 3
- * bytes is needed to reliable find the mp3 stream in a buffer when scanning
- * starts at a random position. This is currently (4323 bytes) slightly above
- * the default buffer size. But you rarely hit the worst case - average mp3
- * frames are in the 500 bytes range.
- */
-#define GST_MP3_TYPEFIND_MIN_HEADERS 3
-static GstCaps*
-mp3_type_find_stream (GstBuffer *buf, gpointer private)
-{
- guint8 *data;
- guint size;
- guint32 head;
- gint layer = 0;
-
- data = GST_BUFFER_DATA (buf);
- size = GST_BUFFER_SIZE (buf);
-
- while (size >= 4) {
- head = GUINT32_FROM_BE(*((guint32 *)data));
- if ((head & 0xffe00000) == 0xffe00000) {
- guint length;
- guint prev_layer = 0;
- guint found = 0; /* number of valid headers found */
- guint pos = 0;
- do {
- if ((length = mp3_type_frame_length_from_header (head, &layer))) {
- if (prev_layer && prev_layer != layer)
- break;
- prev_layer = layer;
- pos += length;
- found++;
- if (pos + 4 >= size) {
- if (found >= GST_MP3_TYPEFIND_MIN_HEADERS)
- goto success;
- }
- head = GUINT32_FROM_BE(*((guint32 *) &(data[pos])));
- if ((head & 0xffe00000) != 0xffe00000)
- break;
- } else {
- break;
- }
- } while (TRUE);
- }
- data++;
- size--;
- }
-
- return NULL;
-
-success:
- g_assert (layer);
- return GST_CAPS_NEW ("mp3_type_find", "audio/mpeg", "layer", GST_PROPS_INT (layer));
-}
-
-static gboolean
-plugin_init (GModule *module, GstPlugin *plugin)
-{
- gint i=0;
-
- while (mp3type_definitions[i].name) {
- GstTypeFactory *type;
-
- type = gst_type_factory_new (&mp3type_definitions[i]);
- gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (type));
- i++;
- }
-
- /* gst_info("gsttypes: loaded %d mp3 types\n",i); */
-
- return TRUE;
-}
-
-GstPluginDesc plugin_desc = {
- GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "mp3types",
- plugin_init
-};
diff --git a/gst/mpegaudioparse/gstmpegaudioparse.c b/gst/mpegaudioparse/gstmpegaudioparse.c
index ba207c0e..920ab22c 100644
--- a/gst/mpegaudioparse/gstmpegaudioparse.c
+++ b/gst/mpegaudioparse/gstmpegaudioparse.c
@@ -35,6 +35,15 @@ static GstElementDetails mp3parse_details = {
"(C) 1999",
};
+static GstCaps * mp3_type_find (GstByteStream *bs, gpointer data);
+
+static GstTypeDefinition mp3type_definition = {
+ "mp3_audio/mpeg",
+ "audio/mpeg",
+ ".mp3 .mp2 .mp1 .mpga",
+ mp3_type_find,
+};
+
static GstPadTemplate*
mp3_src_factory (void)
{
@@ -115,11 +124,221 @@ gst_mp3parse_get_type(void) {
0,
(GInstanceInitFunc)gst_mp3parse_init,
};
- mp3parse_type = g_type_register_static(GST_TYPE_ELEMENT, "GstMPEGAudioParse", &mp3parse_info, 0);
+ mp3parse_type = g_type_register_static (GST_TYPE_ELEMENT,
+ "GstMPEGAudioParse",
+ &mp3parse_info, 0);
}
return mp3parse_type;
}
+static guint mp3types_bitrates[2][3][16] =
+{ { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, },
+ {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, },
+ {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, } },
+ { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, },
+ {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, },
+ {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, } },
+};
+
+static guint mp3types_freqs[3][3] =
+{ {44100, 48000, 32000},
+ {22050, 24000, 16000},
+ {11025, 12000, 8000}};
+
+static inline guint
+mp3_type_frame_length_from_header (guint32 header, guint *put_layer,
+ guint *put_channels, guint *put_bitrate,
+ guint *put_samplerate)
+{
+ guint length;
+ gulong mode, samplerate, bitrate, layer, version, channels;
+
+ /* we don't need extension, copyright, original or
+ * emphasis for the frame length */
+ header >>= 6;
+
+ /* mode */
+ mode = header & 0x3;
+ header >>= 3;
+
+ /* padding */
+ length = header & 0x1;
+ header >>= 1;
+
+ /* sampling frequency */
+ samplerate = header & 0x3;
+ if (samplerate == 3)
+ return 0;
+ header >>= 2;
+
+ /* bitrate index */
+ bitrate = header & 0xF;
+ if (bitrate == 15 || bitrate == 0)
+ return 0;
+
+ /* ignore error correction, too */
+ header >>= 5;
+
+ /* layer */
+ layer = 4 - (header & 0x3);
+ if (layer == 4)
+ return 0;
+ header >>= 2;
+
+ /* version */
+ version = header & 0x3;
+ if (version == 1)
+ return 0;
+
+ /* lookup */
+ channels = (mode == 3) ? 1 : 2;
+ bitrate = mp3types_bitrates[version == 3 ? 0 : 1][layer - 1][bitrate];
+ samplerate = mp3types_freqs[version > 0 ? version - 1 : 0][samplerate];
+
+ /* calculating */
+ if (layer == 1) {
+ length = ((12000 * bitrate / samplerate) + length) * 4;
+ } else {
+ length += ((layer == 3 && version == 0) ? 144000 : 72000) * bitrate / samplerate;
+ }
+
+ GST_DEBUG ("Calculated mp3 frame length of %u bytes", length);
+ GST_DEBUG ("samplerate = %lu - bitrate = %lu - layer = %lu - version = %lu"
+ " - channels = %lu",
+ samplerate, bitrate, layer, version, channels);
+
+ if (put_layer)
+ *put_layer = layer;
+ if (put_channels)
+ *put_channels = channels;
+ if (put_bitrate)
+ *put_bitrate = bitrate;
+ if (put_samplerate)
+ *put_samplerate = samplerate;
+
+ return length;
+}
+
+/**
+ * The chance that random data is identified as a valid mp3 header is 63 / 2^18
+ * (0.024%) per try. This makes the function for calculating false positives
+ * 1 - (1 - ((63 / 2 ^18) ^ GST_MP3_TYPEFIND_MIN_HEADERS)) ^ buffersize)
+ * This has the following probabilities of false positives:
+ * bufsize MIN_HEADERS
+ * (bytes) 1 2 3 4
+ * 4096 62.6% 0.02% 0% 0%
+ * 16384 98% 0.09% 0% 0%
+ * 1 MiB 100% 5.88% 0% 0%
+ * 1 GiB 100% 100% 1.44% 0%
+ * 1 TiB 100% 100% 100% 0.35%
+ * This means that the current choice (3 headers by most of the time 4096 byte
+ * buffers is pretty safe for now.
+ *
+ * The max. size of each frame is 1440 bytes, which means that for N frames
+ * to be detected, we need 1440 * GST_MP3_TYPEFIND_MIN_HEADERS + 3 of data.
+ * Assuming we step into the stream right after the frame header, this
+ * means we need 1440 * (GST_MP3_TYPEFIND_MIN_HEADERS + 1) - 1 + 3 bytes
+ * of data (5762) to always detect any mp3.
+ */
+
+/* increase this value when this function finds too many false positives */
+#define GST_MP3_TYPEFIND_MIN_HEADERS 3
+#define GST_MP3_TYPEFIND_MIN_DATA (1440 * (GST_MP3_TYPEFIND_MIN_HEADERS + 1) - 1 + 3)
+
+static GstCaps *
+mp3_caps_create (guint layer, guint channels,
+ guint bitrate, guint samplerate)
+{
+ GstCaps *new;
+
+ g_assert (layer);
+ g_assert (samplerate);
+ g_assert (bitrate);
+ g_assert (channels);
+
+ new = GST_CAPS_NEW ("mp3_type_find",
+ "audio/mpeg",
+ "mpegversion", GST_PROPS_INT (1),
+ "layer", GST_PROPS_INT (layer),
+ /*"bitrate", GST_PROPS_INT (bitrate),*/
+ "rate", GST_PROPS_INT (samplerate),
+ "channels", GST_PROPS_INT (channels));
+
+ return new;
+}
+
+static GstCaps *
+mp3_type_find (GstByteStream *bs, gpointer private)
+{
+ GstBuffer *buf = NULL;
+ GstCaps *new = NULL;
+ guint8 *data;
+ guint size;
+ guint32 head;
+ guint layer = 0, bitrate = 0, samplerate = 0, channels = 0;
+
+ /* note that even if we don't get the requested size,
+ * it might still be a (very small) mp3 */
+ gst_bytestream_peek (bs, &buf, GST_MP3_TYPEFIND_MIN_DATA);
+ if (!buf) {
+ goto done;
+ }
+
+ data = GST_BUFFER_DATA (buf);
+ size = GST_BUFFER_SIZE (buf);
+
+ while (size >= 4) {
+ head = GUINT32_FROM_BE(*((guint32 *)data));
+ if ((head & 0xffe00000) == 0xffe00000) {
+ guint length;
+ guint prev_layer = 0, prev_bitrate = 0,
+ prev_channels = 0, prev_samplerate = 0;
+ guint found = 0; /* number of valid headers found */
+ guint pos = 0;
+
+ do {
+ if (!(length = mp3_type_frame_length_from_header (head, &layer,
+ &channels, &bitrate,
+ &samplerate))) {
+ break;
+ }
+ if ((prev_layer && prev_layer != layer) || !layer ||
+ (prev_bitrate && prev_bitrate != bitrate) || !bitrate ||
+ (prev_samplerate && prev_samplerate != samplerate) || !samplerate ||
+ (prev_channels && prev_channels != channels) || !channels) {
+ /* this means an invalid property, or a change, which likely
+ * indicates that this is not a mp3 but just a random bytestream */
+ break;
+ }
+ prev_layer = layer;
+ prev_bitrate = bitrate;
+ prev_channels = channels;
+ prev_samplerate = samplerate;
+ pos += length;
+ if (++found >= GST_MP3_TYPEFIND_MIN_HEADERS) {
+ /* we're pretty sure that this is mp3 now */
+ new = mp3_caps_create (layer, channels, bitrate, samplerate);
+ goto done;
+ }
+
+ /* and now, find a new head */
+ head = GUINT32_FROM_BE(*((guint32 *) &(data[pos])));
+ if ((head & 0xffe00000) != 0xffe00000)
+ break;
+ } while (TRUE);
+ }
+ data++;
+ size--;
+ }
+
+done:
+ if (buf != NULL) {
+ gst_buffer_unref (buf);
+ }
+
+ return new;
+}
+
static void
gst_mp3parse_class_init (GstMPEGAudioParseClass *klass)
{
@@ -247,7 +466,10 @@ gst_mp3parse_chain (GstPad *pad, GstBuffer *buf)
header2 = GUINT32_FROM_BE(*((guint32 *)(data+offset+bpf)));
GST_DEBUG ("mp3parse: header=%08X, header2=%08X, bpf=%d", (unsigned int)header, (unsigned int)header2, bpf );
- #define HDRMASK ~( (0xF<<12)/*bitrate*/ | (1<<9)/*padding*/ | (3<<4)/*mode extension*/ ) /* mask the bits which are allowed to differ between frames */
+/* mask the bits which are allowed to differ between frames */
+#define HDRMASK ~((0xF << 12) /* bitrate */ | \
+ (0x1 << 9) /* padding */ | \
+ (0x3 << 4)) /*mode extension*/
if ( (header2&HDRMASK) != (header&HDRMASK) ) { /* require 2 matching headers in a row */
GST_DEBUG ("mp3parse: next header doesn't match (header=%08X, header2=%08X, bpf=%d)", (unsigned int)header, (unsigned int)header2, bpf );
@@ -309,56 +531,23 @@ gst_mp3parse_chain (GstPad *pad, GstBuffer *buf)
}
}
-static int mp3parse_tabsel[2][3][16] =
-{ { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, },
- {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, },
- {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, } },
- { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, },
- {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, },
- {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, } },
-};
-
-static long mp3parse_freqs[9] =
-{44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000};
-
-
static long
bpf_from_header (GstMPEGAudioParse *parse, unsigned long header)
{
- int layer_index,layer,lsf,samplerate_index,padding,mode;
- long bpf;
- gint channels, rate;
-
- /*mpegver = (header >> 19) & 0x3; // don't need this for bpf */
- layer_index = (header >> 17) & 0x3;
- layer = 4 - layer_index;
- lsf = (header & (1 << 20)) ? ((header & (1 << 19)) ? 0 : 1) : 1;
- parse->bit_rate = mp3parse_tabsel[lsf][layer - 1][((header >> 12) & 0xf)];
- samplerate_index = (header >> 10) & 0x3;
- padding = (header >> 9) & 0x1;
- mode = (header >> 6) & 0x3;
+ guint bitrate, layer, rate, channels, length;
- if (layer == 1) {
- bpf = parse->bit_rate * 12000;
- bpf /= mp3parse_freqs[samplerate_index];
- bpf = ((bpf + padding) << 2);
- } else {
- bpf = parse->bit_rate * 144000;
- bpf /= mp3parse_freqs[samplerate_index];
- bpf += padding;
+ if (!(length = mp3_type_frame_length_from_header (header, &layer,
+ &channels,
+ &bitrate, &rate))) {
+ return 0;
}
- channels = (mode == 3) ? 1 : 2;
- rate = mp3parse_freqs[samplerate_index];
if (channels != parse->channels ||
rate != parse->rate ||
- layer != parse->layer) {
- GstCaps *caps = GST_CAPS_NEW ("mp3parse_src",
- "audio/mpeg",
- "mpegversion", GST_PROPS_INT (1),
- "layer", GST_PROPS_INT (layer),
- "channels", GST_PROPS_INT (channels),
- "rate", GST_PROPS_INT (rate));
+ layer != parse->layer ||
+ bitrate != parse->bit_rate) {
+ GstCaps *caps = mp3_caps_create (layer, channels, bitrate, rate);
+
if (gst_pad_try_set_caps(parse->srcpad, caps) <= 0) {
gst_element_error (GST_ELEMENT (parse),
"mp3parse: failed to negotiate format with next element");
@@ -367,12 +556,10 @@ bpf_from_header (GstMPEGAudioParse *parse, unsigned long header)
parse->channels = channels;
parse->layer = layer;
parse->rate = rate;
+ parse->bit_rate = bitrate;
}
- /*g_print("%08x: layer %d lsf %d bitrate %d samplerate_index %d padding %d - bpf %d\n", */
-/*header,layer,lsf,bitrate,samplerate_index,padding,bpf); */
-
- return bpf;
+ return length;
}
static gboolean
@@ -470,6 +657,7 @@ static gboolean
plugin_init (GModule *module, GstPlugin *plugin)
{
GstElementFactory *factory;
+ GstTypeFactory *type;
/* create an elementfactory for the mp3parse element */
factory = gst_element_factory_new ("mp3parse",
@@ -485,6 +673,10 @@ plugin_init (GModule *module, GstPlugin *plugin)
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
+ /* type finding */
+ type = gst_type_factory_new (&mp3type_definition);
+ gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (type));
+
return TRUE;
}
diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c
index 3358db33..f5a95c03 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);
-
- 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);
diff --git a/gst/qtdemux/qtdemux.h b/gst/qtdemux/qtdemux.h
index 108faab1..46684be8 100644
--- a/gst/qtdemux/qtdemux.h
+++ b/gst/qtdemux/qtdemux.h
@@ -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" {