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
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
5
6 ---
7  gst/typefind/gsttypefindfunctions.c |   32 ++++++++++++++++++++++++++------
8  1 files changed, 26 insertions(+), 6 deletions(-)
9
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);
17        break;
18 +
19 +      GST_DEBUG ("No next frame found... (should have been at 0x%x)", len);
20 +    } else if (!memcmp (c.data, "ADIF", 4)) {
21 +      /* ADIF header */
22 +      GstCaps *caps = gst_caps_new_simple ("audio/mpeg",
23 +          "framed", G_TYPE_BOOLEAN, FALSE,
24 +          "mpegversion", G_TYPE_INT, 4,
25 +          NULL);
26 +
27 +      gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, caps);
28 +      gst_caps_unref (caps);
29 +      break;
30      }
31  
32    next:
33 @@ -987,7 +999,7 @@ mp3_type_find_at_offset (GstTypeFind * tf, guint64 start_off,
34  {
35    guint8 *data = NULL;
36    guint8 *data_end = NULL;
37 -  guint size;
38 +  guint size, oldsize = 0;
39    guint64 skipped;
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,
43    skipped = 0;
44    while (skipped < GST_MP3_TYPEFIND_TRY_SYNC) {
45      if (size <= 0) {
46 -      size = GST_MP3_TYPEFIND_SYNC_SIZE * 2;
47 +      size = oldsize ? oldsize : GST_MP3_TYPEFIND_SYNC_SIZE * 2;
48        do {
49          size /= 2;
50          data = gst_type_find_peek (tf, skipped + start_off, size);
51        } while (size > 10 && !data);
52        if (!data)
53          break;
54 +      oldsize = size;
55        data_end = data + size;
56      }
57      if (*data == 0xFF) {
58 @@ -1814,14 +1827,16 @@ mpeg_sys_type_find (GstTypeFind * tf, gpointer unused)
59    guint pack_size;
60    guint since_last_sync = 0;
61    guint32 sync_word = 0xffffffff;
62 +  guint offset = 0;
63  
64 +possible:
65    G_STMT_START {
66      gint len;
67  
68 -    len = MPEG2_MAX_PROBE_LENGTH;
69 +    len = MPEG2_MAX_PROBE_LENGTH / 4;
70      do {
71        len = len / 2;
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);
75  
76      if (!data)
77 @@ -1882,9 +1897,8 @@ mpeg_sys_type_find (GstTypeFind * tf, gpointer unused)
78        }
79      }
80  
81 -    sync_word |= data[0];
82 +    sync_word |= *data++;
83      since_last_sync++;
84 -    data++;
85  
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)
90      goto suggest;
91  
92 +  if (pack_headers + pes_headers > 0) {
93 +    offset += data - data0;
94 +    if (offset < MPEG2_MAX_PROBE_LENGTH)
95 +      goto possible;
96 +  }
97 +
98    return;
99  suggest:
100    {