--- /dev/null
+From 68507fbfe3c266c51f4b674b8b635a7b63ee7e60 Mon Sep 17 00:00:00 2001
+From: Maemo Multimedia <multimedia@maemo.org>
+Date: Thu, 22 Jan 2009 08:57:50 +0200
+Subject: [PATCH] typefind: optimize MP3 and MPEG_SYS typefinding
+
+---
+ gst/typefind/gsttypefindfunctions.c | 32 ++++++++++++++++++++++++++------
+ 1 files changed, 26 insertions(+), 6 deletions(-)
+
+diff --git a/gst/typefind/gsttypefindfunctions.c b/gst/typefind/gsttypefindfunctions.c
+index 98dbade..2a3a733 100644
+--- a/gst/typefind/gsttypefindfunctions.c
++++ b/gst/typefind/gsttypefindfunctions.c
+@@ -826,6 +826,18 @@ aac_type_find (GstTypeFind * tf, gpointer unused)
+ "framed", G_TYPE_BOOLEAN, FALSE, "mpegversion", G_TYPE_INT, 4,
+ "stream-format", G_TYPE_STRING, "adif", NULL);
+ break;
++
++ GST_DEBUG ("No next frame found... (should have been at 0x%x)", len);
++ } else if (!memcmp (c.data, "ADIF", 4)) {
++ /* ADIF header */
++ GstCaps *caps = gst_caps_new_simple ("audio/mpeg",
++ "framed", G_TYPE_BOOLEAN, FALSE,
++ "mpegversion", G_TYPE_INT, 4,
++ NULL);
++
++ gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, caps);
++ gst_caps_unref (caps);
++ break;
+ }
+
+ next:
+@@ -987,7 +999,7 @@ mp3_type_find_at_offset (GstTypeFind * tf, guint64 start_off,
+ {
+ guint8 *data = NULL;
+ guint8 *data_end = NULL;
+- guint size;
++ guint size, oldsize = 0;
+ guint64 skipped;
+ gint last_free_offset = -1;
+ gint last_free_framelen = -1;
+@@ -1000,13 +1012,14 @@ mp3_type_find_at_offset (GstTypeFind * tf, guint64 start_off,
+ skipped = 0;
+ while (skipped < GST_MP3_TYPEFIND_TRY_SYNC) {
+ if (size <= 0) {
+- size = GST_MP3_TYPEFIND_SYNC_SIZE * 2;
++ size = oldsize ? oldsize : GST_MP3_TYPEFIND_SYNC_SIZE * 2;
+ do {
+ size /= 2;
+ data = gst_type_find_peek (tf, skipped + start_off, size);
+ } while (size > 10 && !data);
+ if (!data)
+ break;
++ oldsize = size;
+ data_end = data + size;
+ }
+ if (*data == 0xFF) {
+@@ -1814,14 +1827,16 @@ mpeg_sys_type_find (GstTypeFind * tf, gpointer unused)
+ guint pack_size;
+ guint since_last_sync = 0;
+ guint32 sync_word = 0xffffffff;
++ guint offset = 0;
+
++possible:
+ G_STMT_START {
+ gint len;
+
+- len = MPEG2_MAX_PROBE_LENGTH;
++ len = MPEG2_MAX_PROBE_LENGTH / 4;
+ do {
+ len = len / 2;
+- data = gst_type_find_peek (tf, 0, 5 + len);
++ data = gst_type_find_peek (tf, offset, 5 + len);
+ } while (data == NULL && len >= 32);
+
+ if (!data)
+@@ -1882,9 +1897,8 @@ mpeg_sys_type_find (GstTypeFind * tf, gpointer unused)
+ }
+ }
+
+- sync_word |= data[0];
++ sync_word |= *data++;
+ since_last_sync++;
+- data++;
+
+ /* If we have found MAX headers, and *some* were pes headers (pack headers
+ * are optional in an mpeg system stream) then return our high-probability
+@@ -1899,6 +1913,12 @@ mpeg_sys_type_find (GstTypeFind * tf, gpointer unused)
+ if (pes_headers > 0 && (pack_headers + pes_headers) > MPEG2_MIN_SYS_HEADERS)
+ goto suggest;
+
++ if (pack_headers + pes_headers > 0) {
++ offset += data - data0;
++ if (offset < MPEG2_MAX_PROBE_LENGTH)
++ goto possible;
++ }
++
+ return;
+ suggest:
+ {