diff options
author | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2012-02-21 18:53:57 +0100 |
---|---|---|
committer | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2012-02-21 18:54:52 +0100 |
commit | 838493c9a7cc199805563299fc3152a0bdf3a77e (patch) | |
tree | c3a3abfda9c90ea7f56841b2c1bca3ce86c0778e | |
parent | 5dead1c4007af753bb2895e9c44b2582b0b3ec3a (diff) |
mad: handle libmad freeform parsing quirk
-rw-r--r-- | ext/mad/gstmad.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/ext/mad/gstmad.c b/ext/mad/gstmad.c index cd3d068e..a24c89dd 100644 --- a/ext/mad/gstmad.c +++ b/ext/mad/gstmad.c @@ -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); |