Author: agrundman
Date: Wed May 26 19:09:46 2010
New Revision: 8827
URL: http://svn.slimdevices.com/jive?rev=8827&view=rev
Log:
Fixed bug 16233, handle mp3 streams with invalid Xing frame count
Modified:
7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c
Modified: 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c
URL:
http://svn.slimdevices.com/jive/7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c?rev=8827&r1=8826&r2=8827&view=diff
==============================================================================
--- 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c
(original)
+++ 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c Wed May
26 19:09:46 2010
@@ -1,7 +1,7 @@
/*
** Copyright 2007-2008 Logitech. All Rights Reserved.
**
-** This file is licensed under BSD. Please see the LICENSE file for details.
+** This file is licensed under BSD. Please see the LICENSE file for details.
*/
#include "common.h"
@@ -36,7 +36,9 @@
u32_t packets;
u32_t encoder_delay;
u32_t encoder_padding;
- u64_t frame_cnt;
+ u64_t lame_samples;
+ u64_t lame_samples_remain;
+ u64_t decoded_samples;
enum {
MAD_STATE_OK = 0,
@@ -89,15 +91,19 @@
// skip traditional xing vbr tag data
if (flags & XING_FRAMES) {
- LOG_DEBUG(log_audio_codec, "reading xing frames");
if (bitlen < 32) {
return;
}
frames = mad_bit_read(&ptr, 32);
bitlen -= 32;
- }
+ LOG_DEBUG(log_audio_codec, "xing frames: %d", frames);
+ }
+ else {
+ LOG_DEBUG(log_audio_codec, "no xing frames available");
+ return;
+ }
+
if (flags & XING_BYTES) {
- LOG_DEBUG(log_audio_codec, "reading xing bytes");
if (bitlen < 32) {
return;
}
@@ -105,7 +111,6 @@
bitlen -= 32;
}
if (flags & XING_TOC) {
- LOG_DEBUG(log_audio_codec, "reading xing toc");
if (bitlen < 800) {
return;
}
@@ -113,7 +118,6 @@
bitlen -= 800;
}
if (flags & XING_SCALE) {
- LOG_DEBUG(log_audio_codec, "reading xing scale");
if (bitlen < 32) {
return;
}
@@ -151,11 +155,12 @@
else {
self->encoder_padding = 0;
}
-
- self->frame_cnt = (frames * 1152UL) - self->encoder_delay -
self->encoder_padding;
+
+ self->lame_samples = frames * 1152UL;
+ self->lame_samples_remain = self->lame_samples - self->encoder_delay -
self->encoder_padding;
LOG_DEBUG(log_audio_codec, "encoder delay=%d padding=%d",
self->encoder_delay, self->encoder_padding);
- LOG_DEBUG(log_audio_codec, "total frames %ld", self->frame_cnt);
+ LOG_DEBUG(log_audio_codec, "total LAME samples %ld",
self->lame_samples);
}
@@ -383,16 +388,27 @@
left += offset;
right += offset;
}
-
+
+ /* Track the total number of samples we have decoded */
+ self->decoded_samples += pcm->length;
+
/* Remove encoder padding. Only do this if we are streaming a file,
* some radio stations seem to incorrectly include a xing header in
* the stream.
*/
if (self->encoder_padding && !streambuf_is_icy()) {
- if (pcm->length > self->frame_cnt ) {
- LOG_DEBUG(log_audio_codec, "Remove encoder padding=%d
frames=%ld", self->encoder_padding, self->frame_cnt);
-
- pcm->length = self->frame_cnt;
+ if (pcm->length > self->lame_samples_remain) {
+ LOG_DEBUG(log_audio_codec, "Removing encoder padding,
lame_samples_remain=%ld", self->lame_samples_remain);
+
+ pcm->length = self->lame_samples_remain;
+ }
+
+ /* Bug 16233, if total decoded samples gets beyond lame_samples
+ 1152, assume we were given
+ * an invalid Xing header and should stop treating samples as
encoder padding
+ */
+ if (self->decoded_samples > self->lame_samples + 1152) {
+ LOG_DEBUG(log_audio_codec, "Decoded more samples (%ld)
than expected (%ld), assuming invalid LAME header and ignoring padding",
self->decoded_samples, self->lame_samples);
+ self->encoder_padding = 0;
}
}
@@ -403,7 +419,9 @@
if (buf == buf_end) {
nsamples = (buf - self->output_buffer) / 2;
decode_output_samples(self->output_buffer, nsamples,
self->sample_rate);
- self->frame_cnt -= nsamples;
+
+ if (self->encoder_padding)
+ self->lame_samples_remain -= nsamples;
buf = self->output_buffer;
}
@@ -412,7 +430,9 @@
nsamples = (buf - self->output_buffer) / 2;
if (nsamples) {
decode_output_samples(self->output_buffer, nsamples,
self->sample_rate);
- self->frame_cnt -= (buf - self->output_buffer) / 2;
+
+ if (self->encoder_padding)
+ self->lame_samples_remain -= nsamples;
}
/* If we've come to the guard pointer, we're done */
_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/jive-checkins