mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-12 19:14:16 +00:00
mad: handle libmad freeform parsing quirk
This commit is contained in:
parent
5dead1c400
commit
838493c9a7
1 changed files with 16 additions and 0 deletions
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue