1 From 68507fbfe3c266c51f4b674b8b635a7b63ee7e60 Mon Sep 17 00:00:00 2001
2 From: Maemo Multimedia <multimedia@maemo.org>
3 Date: Thu, 22 Jan 2009 08:57:50 +0200
4 Subject: [PATCH] typefind: optimize MP3 and MPEG_SYS typefinding
7 gst/typefind/gsttypefindfunctions.c | 32 ++++++++++++++++++++++++++------
8 1 files changed, 26 insertions(+), 6 deletions(-)
10 diff --git a/gst/typefind/gsttypefindfunctions.c b/gst/typefind/gsttypefindfunctions.c
11 index 98dbade..2a3a733 100644
12 --- a/gst/typefind/gsttypefindfunctions.c
13 +++ b/gst/typefind/gsttypefindfunctions.c
14 @@ -826,6 +826,18 @@ aac_type_find (GstTypeFind * tf, gpointer unused)
15 "framed", G_TYPE_BOOLEAN, FALSE, "mpegversion", G_TYPE_INT, 4,
16 "stream-format", G_TYPE_STRING, "adif", NULL);
19 + GST_DEBUG ("No next frame found... (should have been at 0x%x)", len);
20 + } else if (!memcmp (c.data, "ADIF", 4)) {
22 + GstCaps *caps = gst_caps_new_simple ("audio/mpeg",
23 + "framed", G_TYPE_BOOLEAN, FALSE,
24 + "mpegversion", G_TYPE_INT, 4,
27 + gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, caps);
28 + gst_caps_unref (caps);
33 @@ -987,7 +999,7 @@ mp3_type_find_at_offset (GstTypeFind * tf, guint64 start_off,
36 guint8 *data_end = NULL;
38 + guint size, oldsize = 0;
40 gint last_free_offset = -1;
41 gint last_free_framelen = -1;
42 @@ -1000,13 +1012,14 @@ mp3_type_find_at_offset (GstTypeFind * tf, guint64 start_off,
44 while (skipped < GST_MP3_TYPEFIND_TRY_SYNC) {
46 - size = GST_MP3_TYPEFIND_SYNC_SIZE * 2;
47 + size = oldsize ? oldsize : GST_MP3_TYPEFIND_SYNC_SIZE * 2;
50 data = gst_type_find_peek (tf, skipped + start_off, size);
51 } while (size > 10 && !data);
55 data_end = data + size;
58 @@ -1814,14 +1827,16 @@ mpeg_sys_type_find (GstTypeFind * tf, gpointer unused)
60 guint since_last_sync = 0;
61 guint32 sync_word = 0xffffffff;
68 - len = MPEG2_MAX_PROBE_LENGTH;
69 + len = MPEG2_MAX_PROBE_LENGTH / 4;
72 - data = gst_type_find_peek (tf, 0, 5 + len);
73 + data = gst_type_find_peek (tf, offset, 5 + len);
74 } while (data == NULL && len >= 32);
77 @@ -1882,9 +1897,8 @@ mpeg_sys_type_find (GstTypeFind * tf, gpointer unused)
81 - sync_word |= data[0];
82 + sync_word |= *data++;
86 /* If we have found MAX headers, and *some* were pes headers (pack headers
87 * are optional in an mpeg system stream) then return our high-probability
88 @@ -1899,6 +1913,12 @@ mpeg_sys_type_find (GstTypeFind * tf, gpointer unused)
89 if (pes_headers > 0 && (pack_headers + pes_headers) > MPEG2_MIN_SYS_HEADERS)
92 + if (pack_headers + pes_headers > 0) {
93 + offset += data - data0;
94 + if (offset < MPEG2_MAX_PROBE_LENGTH)