From 5bdaad49f97484195f3da8daec5ab1d8b0de72f4 Mon Sep 17 00:00:00 2001 From: David McPaul Date: Sun, 22 Mar 2009 07:24:44 +0000 Subject: [PATCH] include some bug fixes from libmpg123 git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29647 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../plugins/mp3_decoder/mp3DecoderPlugin.cpp | 23 +++++++++++++++---- .../media/plugins/mp3_decoder/mpglib/layer1.c | 2 +- .../media/plugins/mp3_decoder/mpglib/layer3.c | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.cpp b/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.cpp index 9ac730ed21..f87747cc0b 100644 --- a/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.cpp +++ b/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.cpp @@ -128,8 +128,9 @@ mp3Decoder::Setup(media_format *ioEncodedFormat, const void *infoBuffer, size_t infoSize) { // decode first chunk to initialize mpeg library - if (B_OK != DecodeNextChunk()) { - printf("mp3Decoder::Setup failed, can't decode first chunk\n"); + status_t err = DecodeNextChunk(); + if (B_OK != err) { + printf("mp3Decoder::Setup failed, can't decode first chunk %ld\n",err); return B_ERROR; } @@ -377,10 +378,14 @@ mp3Decoder::GetFrameLength(const void *header) { const uint8 *h = static_cast(header); - if (h[0] != 0xff) + if (h[0] != 0xff) { + TRACE("No 0xff MP3 Header in chunk %x\n",h[0]); return -1; - if ((h[1] & 0xe0) != 0xe0) + } + if ((h[1] & 0xe0) != 0xe0) { + TRACE("No 0xe0 MP3 Header in chunk %x\n",h[1]); return -1; + } int mpeg_version_index = (h[1] >> 3) & 0x03; int layer_index = (h[1] >> 1) & 0x03; @@ -392,8 +397,16 @@ mp3Decoder::GetFrameLength(const void *header) int bitrate = bit_rate_table[mpeg_version_index][layer_index][bitrate_index]; int framerate = frame_rate_table[mpeg_version_index][sampling_rate_index]; - if (!bitrate || !framerate) + TRACE("%s %s, %s crc, bit rate %d, frame rate %d, padding %d", + mpeg_version_index == 0 ? "mpeg 2.5" : (mpeg_version_index == 2 ? "mpeg 2" : "mpeg 1"), + layer_index == 3 ? "layer 1" : (layer_index == 2 ? "layer 2" : "layer 3"), + (h[1] & 0x01) ? "no" : "has", + bitrate, framerate, padding); + + if (!bitrate || !framerate) { + TRACE("Invalid bitrate %d or framerate %d\n",bitrate,framerate); return -1; + } int length; if (layer_index == 3) // layer 1 diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/layer1.c b/src/add-ons/media/plugins/mp3_decoder/mpglib/layer1.c index 0996a4a978..eb144f69eb 100644 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/layer1.c +++ b/src/add-ons/media/plugins/mp3_decoder/mpglib/layer1.c @@ -19,7 +19,7 @@ void I_step_one(struct mpstr *mp, unsigned int balloc[], unsigned int scale_inde unsigned int *ba=balloc; unsigned int *sca = (unsigned int *) scale_index; - if(fr->stereo) { + if(fr->stereo == 2) { int i; int jsbound = fr->jsbound; for (i=0;i