From 648f48ce3b0685260f4c578b5eccd0d1b7471046 Mon Sep 17 00:00:00 2001 From: Warren Dukes Date: Tue, 3 Oct 2006 00:58:20 +0000 Subject: [PATCH] handle invalid xing tags better. git-svn-id: https://svn.musicpd.org/mpd/trunk@4866 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/inputPlugins/mp3_plugin.c | 44 +++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/inputPlugins/mp3_plugin.c b/src/inputPlugins/mp3_plugin.c index f0744f22c..5275dcf9b 100644 --- a/src/inputPlugins/mp3_plugin.c +++ b/src/inputPlugins/mp3_plugin.c @@ -648,6 +648,29 @@ static int decodeFirstFrame(mp3DecodeData * data, DecoderControl * dc, ptr = data->stream.anc_ptr; bitlen = data->stream.anc_bitlen; + /* + * Attempt to calulcate the length of the song from filesize + */ + size_t offset = data->inStream->offset; + mad_timer_t duration = data->frame.header.duration; + float frameTime = ((float)mad_timer_count(duration, MAD_UNITS_MILLISECONDS)) / 1000; + + if (data->stream.this_frame != NULL) + offset -= data->stream.bufend - data->stream.this_frame; + else + offset -= data->stream.bufend - data->stream.buffer; + + if (data->inStream->size >= offset) { + data->totalTime = ((data->inStream->size - offset) * 8.0) / (data->frame).header.bitrate; + data->maxFrames = data->totalTime / frameTime + FRAMES_CUSHION; + } else { + data->maxFrames = FRAMES_CUSHION; + data->totalTime = 0; + } + + /* + * if an xing tag exists, use that! + */ if (parse_xing(&xing, &ptr, &bitlen)) { data->foundXing = 1; data->muteFrame = MUTEFRAME_SKIP; @@ -657,31 +680,16 @@ static int decodeFirstFrame(mp3DecodeData * data, DecoderControl * dc, data->dropSamplesAtEnd = lame.encoderPadding; } - if (xing.flags & XING_FRAMES) { + if ((xing.flags & XING_FRAMES) && xing.frames) { mad_timer_t duration = data->frame.header.duration; mad_timer_multiply(&duration, xing.frames); data->totalTime = ((float)mad_timer_count(duration, MAD_UNITS_MILLISECONDS)) / 1000; data->maxFrames = xing.frames; } - } else { - size_t offset = data->inStream->offset; - mad_timer_t duration = data->frame.header.duration; - float frameTime = ((float)mad_timer_count(duration, MAD_UNITS_MILLISECONDS)) / 1000; - - if (data->stream.this_frame != NULL) - offset -= data->stream.bufend - data->stream.this_frame; - else - offset -= data->stream.bufend - data->stream.buffer; - - if (data->inStream->size >= offset) { - data->totalTime = ((data->inStream->size - offset) * 8.0) / (data->frame).header.bitrate; - data->maxFrames = data->totalTime / frameTime + FRAMES_CUSHION; - } else { - data->maxFrames = FRAMES_CUSHION; - data->totalTime = 0; - } } + if (!data->maxFrames) return -1; + data->frameOffset = xmalloc(sizeof(long) * data->maxFrames); data->times = xmalloc(sizeof(mad_timer_t) * data->maxFrames);