mad: handle libmad freeform parsing quirk
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Tue, 21 Feb 2012 17:53:57 +0000 (18:53 +0100)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Tue, 21 Feb 2012 17:54:52 +0000 (18:54 +0100)
ext/mad/gstmad.c

index cd3d068..a24c89d 100644 (file)
@@ -339,6 +339,22 @@ gst_mad_parse (GstAudioDecoder * dec, GstAdapter * adapter,
 
       GST_LOG_OBJECT (mad, "decoding the header now");
       if (mad_header_decode (&mad->frame.header, &mad->stream) == -1) {
+        /* HACK it seems mad reports wrong error when it is trying to determine
+         * free bitrate and scanning for next header */
+        if (mad->stream.error == MAD_ERROR_LOSTSYNC) {
+          const guint8 *ptr = mad->stream.this_frame;
+          guint32 header;
+
+          if (ptr >= data && ptr < data + av) {
+            header = GST_READ_UINT32_BE (ptr);
+            /* looks like possible freeform header with not much data */
+            if (((header & 0xFFE00000) == 0xFFE00000) &&
+                (((header >> 12) & 0xF) == 0x0) && (av < 4096)) {
+              GST_DEBUG_OBJECT (mad, "overriding freeform LOST_SYNC to BUFLEN");
+              mad->stream.error = MAD_ERROR_BUFLEN;
+            }
+          }
+        }
         if (mad->stream.error == MAD_ERROR_BUFLEN) {
           GST_LOG_OBJECT (mad,
               "not enough data in tempbuffer (%d), breaking to get more", size);