diff options
author | Benjamin Otte <otte@gnome.org> | 2002-02-08 08:31:47 +0000 |
---|---|---|
committer | Benjamin Otte <otte@gnome.org> | 2002-02-08 08:31:47 +0000 |
commit | 679a728cc16edfe65035a43ddd8c60a9586aef1b (patch) | |
tree | ae7a155660b8bb2989bb55d8b6b1666edfff2cb5 /gst | |
parent | 7474f54942640daf4cd46c1b8fba914995cdc4b1 (diff) | |
download | gst-plugins-bad-679a728cc16edfe65035a43ddd8c60a9586aef1b.tar.gz gst-plugins-bad-679a728cc16edfe65035a43ddd8c60a9586aef1b.tar.bz2 gst-plugins-bad-679a728cc16edfe65035a43ddd8c60a9586aef1b.zip |
bugfix: allow ID3v2 tags at start of audio
Original commit message from CVS:
bugfix: allow ID3v2 tags at start of audio
Diffstat (limited to 'gst')
-rw-r--r-- | gst/mpegaudioparse/gstmp3types.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/gst/mpegaudioparse/gstmp3types.c b/gst/mpegaudioparse/gstmp3types.c index efb9fd5b..75391a0d 100644 --- a/gst/mpegaudioparse/gstmp3types.c +++ b/gst/mpegaudioparse/gstmp3types.c @@ -19,6 +19,7 @@ //#define DEBUG_ENABLED #include <gst/gst.h> +#include <string.h> /* memcmp */ static GstCaps* mp3_typefind(GstBuffer *buf, gpointer private); @@ -30,10 +31,38 @@ static GstTypeDefinition mp3type_definitions[] = { static GstCaps* mp3_typefind(GstBuffer *buf, gpointer private) { - gulong head = GULONG_FROM_BE(*((gulong *)GST_BUFFER_DATA(buf))); + gchar *data; + gulong head; + + data = GST_BUFFER_DATA(buf); GstCaps *caps; GST_DEBUG (0,"mp3typefind: typefind\n"); + + /* check for ID3 Tag first and forward ID3 length */ + if (!memcmp (data, "ID3", 3)) + { + guint32 skip; + /* ignore next 3 bytes */ + data += 6; + /* if you want that thing faster, do it */ + skip = GUINT32_FROM_BE(*((guint32 *)data)); + skip = (((skip & 0x7f000000) >> 3) | + ((skip & 0x007f0000) >> 2) | + ((skip & 0x00007f00) >> 1) | + ((skip & 0x0000007f) >> 0)) + 4 + GST_DEBUG (0, "mp3typefind: detected ID3 Tag with %u bytes\n", skip + 6); + /* return if buffer is not big enough */ + if (GST_BUFFER_SIZE (buf) < skip + 10) + { + GST_DEBUG (0, "mp3typefind: buffer too small to go on typefinding\n", skip + 6); + return NULL; + } + data += skip; + } + + /* now with the right postion, do typefinding */ + head = GULONG_FROM_BE(*((gulong *)data)); if ((head & 0xffe00000) != 0xffe00000) return NULL; if (!((head >> 17) & 3)) |