Added gst-plugins-base-subtitles0.10-0.10.34 for Meego Harmattan 1.2
[mafwsubrenderer] / gst-plugins-base-subtitles0.10 / debian / patches / 0009-typefind-optimize-MP3-and-MPEG_SYS-typefinding.patch
diff --git a/gst-plugins-base-subtitles0.10/debian/patches/0009-typefind-optimize-MP3-and-MPEG_SYS-typefinding.patch b/gst-plugins-base-subtitles0.10/debian/patches/0009-typefind-optimize-MP3-and-MPEG_SYS-typefinding.patch
new file mode 100644 (file)
index 0000000..5d78171
--- /dev/null
@@ -0,0 +1,100 @@
+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:
+   {