diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index 7c1aa2906b..694f5c2cc4 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -141,9 +141,7 @@ SYSTEM_ADD_ONS_MEDIA = cortex_audioadapter.media_addon ; SYSTEM_ADD_ONS_MEDIA_PLUGINS = $(GPL_ONLY)ac3_decoder aiff_reader asf_reader au_reader avi_reader $(X86_ONLY)ffmpeg - matroska mov_reader - mp3_decoder mp3_reader - mp4_reader musepack + matroska mov_reader musepack ogg raw_decoder speex $(X86_ONLY)ape_reader # theora diff --git a/src/add-ons/media/plugins/Jamfile b/src/add-ons/media/plugins/Jamfile index 15e6dc4d1c..3e6b93bfae 100644 --- a/src/add-ons/media/plugins/Jamfile +++ b/src/add-ons/media/plugins/Jamfile @@ -10,8 +10,6 @@ SubInclude HAIKU_TOP src add-ons media plugins avi_reader ; SubInclude HAIKU_TOP src add-ons media plugins ffmpeg ; SubInclude HAIKU_TOP src add-ons media plugins matroska ; SubInclude HAIKU_TOP src add-ons media plugins mov_reader ; -SubInclude HAIKU_TOP src add-ons media plugins mp3_decoder ; -SubInclude HAIKU_TOP src add-ons media plugins mp3_reader ; SubInclude HAIKU_TOP src add-ons media plugins mp4_reader ; SubInclude HAIKU_TOP src add-ons media plugins musepack ; SubInclude HAIKU_TOP src add-ons media plugins ogg ; diff --git a/src/add-ons/media/plugins/ffmpeg/CodecTable.cpp b/src/add-ons/media/plugins/ffmpeg/CodecTable.cpp index d26f1dfb17..fd637b6c62 100644 --- a/src/add-ons/media/plugins/ffmpeg/CodecTable.cpp +++ b/src/add-ons/media/plugins/ffmpeg/CodecTable.cpp @@ -35,14 +35,23 @@ const struct codec_table gCodecTable[] = { {CODEC_ID_ADPCM_MS, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x0002, "MS ADPCM"}, {CODEC_ID_ADPCM_IMA_WAV, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 0x6D730011, "IMA ADPCM"}, {CODEC_ID_ADPCM_MS, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 0x6D730002, "MS ADPCM"}, - {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 0x6D730050, "MP Layer2"}, - {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 0x6D730055, "MP Layer3"}, - {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, 0x6D730050, "MP Layer2"}, - {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, 0x6D730055, "MP Layer3"}, -#if 0 - {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x0050, "MPEG Audio Layer 2"}, /* mpeg audio layer 2 */ - {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x0055, "MPEG Audio Layer 3"}, /* mpeg audio layer 3 */ -#endif + + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 0x6D730050, "MP Layer2"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 0x6D730055, "MP Layer3"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, '.mp3', "MPEG Audio Layer 3"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, '3pm.', "MPEG Audio Layer 3"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_AVI_FORMAT_FAMILY, '.mp3', "MPEG Audio Layer 3"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_AVI_FORMAT_FAMILY, '3pm.', "MPEG Audio Layer 3"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, 0x6D730050, "MP Layer2"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, 0x6D730055, "MP Layer3"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, B_MPEG_1_AUDIO_LAYER_2, "MP Layer2"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, B_MPEG_1_AUDIO_LAYER_3, "MP Layer3"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, B_MPEG_2_AUDIO_LAYER_2, "MP Layer2"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, B_MPEG_2_AUDIO_LAYER_3, "MP Layer3"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, B_MPEG_2_5_AUDIO_LAYER_2, "MP Layer2"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_MPEG_FORMAT_FAMILY, B_MPEG_2_5_AUDIO_LAYER_3, "MP Layer3"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x0050, "MPEG Audio Layer 2"}, + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x0055, "MPEG Audio Layer 3"}, {CODEC_ID_ADPCM_IMA_QT, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 'ima4', "Quicktime IMA4"}, {CODEC_ID_ADPCM_IMA_QT, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 'IMA4', "Quicktime IMA4"}, diff --git a/src/add-ons/media/plugins/ffmpeg/DemuxerTable.cpp b/src/add-ons/media/plugins/ffmpeg/DemuxerTable.cpp index e5339d7fab..d21d72c38d 100644 --- a/src/add-ons/media/plugins/ffmpeg/DemuxerTable.cpp +++ b/src/add-ons/media/plugins/ffmpeg/DemuxerTable.cpp @@ -24,8 +24,9 @@ static const DemuxerFormat gDemuxerTable[] = { // B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY // }, // { -// // Tested with a limited amount of streams and works ok, keep using -// // the avi_reader implementation by Marcus Overhagen. +// // Tested with many streams and either works ok, or has inconsistent +// // seeking results for audio, i.e. often audio is not in sync. +// // Keep using the avi_reader implementation by Marcus Overhagen. // "avi", "AVI (Audio Video Interleaved)", "video/x-msvideo", // B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY // }, @@ -42,40 +43,41 @@ static const DemuxerFormat gDemuxerTable[] = { B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY }, // { -// // Tested and appears to work ok with the one clip I have... +// // Tested and appears to work ok with regards to video, +// // audio seems a problem. // "matroska", "Matroska Movie", "video/x-matroska", -// B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY +// B_MISC_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY // }, // { // // Plays the limited amount of files I could test with. // "mov", "Quicktime Movie", "video/x-mov", // B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY // }, -// { -// // Plays the limited amount of files I could test with. -// "mp4", "MPEG-4 Movie", "video/x-mp4", -// B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY -// }, -// { -// // TODO: Broken because of buggy FindKeyFrame() or Seek() support. -// "mp3", "MPEG (Motion Picture Experts Group)", "audio/mpg", -// B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY -// }, + { + // Plays all files I could test with perfectly. + "mp4", "MPEG-4 Movie", "video/x-mp4", + B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY + }, + { + // Works very well with all files I tested. + "mp3", "MPEG-3", "audio/mpg", + B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY + }, { // NOTE: Tested with a couple of files and only audio works ok. // On some files, the duration and time_base is detected incorrectly // by libavformat and those streams don't play at all. - "mpg", "MPEG (Motion Picture Experts Group)", "video/mpeg", + "mpg", "MPEG", "video/mpeg", B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY }, { // NOTE: keep this before "mpeg" so it detects "mpegts" first. - "mpegts", "MPEG (Motion Picture Experts Group)", "video/mpeg", + "mpegts", "MPEG TS", "video/mpeg", B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY }, { // TODO: Also covers "mpegvideo", plus see mpegts. - "mpeg", "MPEG (Motion Picture Experts Group)", "video/mpeg", + "mpeg", "MPEG", "video/mpeg", B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY }, { diff --git a/src/add-ons/media/plugins/mp3_decoder/Jamfile b/src/add-ons/media/plugins/mp3_decoder/Jamfile deleted file mode 100644 index 1d4250d000..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/Jamfile +++ /dev/null @@ -1,18 +0,0 @@ -SubDir HAIKU_TOP src add-ons media plugins mp3_decoder ; - -SetSubDirSupportedPlatformsBeOSCompatible ; - -UsePrivateHeaders media ; - -SubDirHdrs [ FDirName $(SUBDIR) mpglib ] ; - -Addon mp3_decoder : - mp3DecoderPlugin.cpp - : - libmpglib.a - be - libmedia.so - $(TARGET_LIBSUPC++) -; - -SubInclude HAIKU_TOP src add-ons media plugins mp3_decoder mpglib ; diff --git a/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.cpp b/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.cpp deleted file mode 100644 index a8ec71d427..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.cpp +++ /dev/null @@ -1,514 +0,0 @@ -/* - * Copyright (c) 2003-2004, Marcus Overhagen - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include -#include -#include -#include -#include -#include - -#include "mp3DecoderPlugin.h" - -//#define TRACE_MP3_DECODER -#ifdef TRACE_MP3_DECODER - #define TRACE printf -#else - #define TRACE(a...) -#endif - -#define DECODE_BUFFER_SIZE (32 * 1024) - -// reference: -// http://www.mp3-tech.org/programmer/frame_header.html - -inline size_t -AudioBufferSize(const media_raw_audio_format &raf, bigtime_t buffer_duration = 50000 /* 50 ms */) -{ - return (raf.format & 0xf) * (raf.channel_count) - * (size_t)((raf.frame_rate * buffer_duration) / 1000000.0); -} - -// bit_rate_table[mpeg_version_index][layer_index][bitrate_index] -static const int bit_rate_table[4][4][16] = -{ - { // mpeg version 2.5 - { }, // undefined layer - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // layer 3 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // layer 2 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // layer 1 - }, - { // undefined version - { }, - { }, - { }, - { } - }, - { // mpeg version 2 - { }, - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } - }, - { // mpeg version 1 - { }, - { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 }, - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, - { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0} - } -}; - -// frame_rate_table[mpeg_version_index][sampling_rate_index] -static const int frame_rate_table[4][4] = -{ - { 11025, 12000, 8000, 0}, // mpeg version 2.5 - { 0, 0, 0, 0 }, - { 22050, 24000, 16000, 0}, // mpeg version 2 - { 44100, 48000, 32000, 0} // mpeg version 1 -}; - - -mp3Decoder::mp3Decoder() -{ - InitMP3(&fMpgLibPrivate); - fResidualBytes = 0; - fResidualBuffer = 0; - fDecodeBuffer = new uint8 [DECODE_BUFFER_SIZE]; - fStartTime = 0; - fFrameSize = 0; - fFrameRate = 0; - fBitRate = 0; - fChannelCount = 0; - fOutputBufferSize = 0; - fNeedSync = true; // some files start with garbage - fDecodingError = false; - fSampleNo = 0; -} - - -mp3Decoder::~mp3Decoder() -{ - ExitMP3(&fMpgLibPrivate); - delete [] fDecodeBuffer; -} - - -void -mp3Decoder::GetCodecInfo(media_codec_info *info) -{ - strcpy(info->short_name, "mp3"); - strcpy(info->pretty_name, "MPEG audio decoder (mpeg123 mpglib)"); - // ToDo: could alter the above string depending on the real format -} - - -status_t -mp3Decoder::Setup(media_format *ioEncodedFormat, - const void *infoBuffer, size_t infoSize) -{ - // decode first chunk to initialize mpeg library - status_t err = DecodeNextChunk(); - if (B_OK != err) { - printf("mp3Decoder::Setup failed, can't decode first chunk %ld\n",err); - return B_ERROR; - } - - // initialize fBitRate, fFrameRate and fChannelCount from mpg decode library values of first header - extern int tabsel_123[2][3][16]; - extern long freqs[9]; - fBitRate = tabsel_123[fMpgLibPrivate.fr.lsf][fMpgLibPrivate.fr.lay-1][fMpgLibPrivate.fr.bitrate_index] * 1000; - fFrameRate = freqs[fMpgLibPrivate.fr.sampling_frequency]; - fChannelCount = fMpgLibPrivate.fr.stereo; - - printf("mp3Decoder::Setup: channels %d, bitrate %d, framerate %d\n", fChannelCount, fBitRate, fFrameRate); - - // put some more useful info into the media_format describing our input format - ioEncodedFormat->u.encoded_audio.bit_rate = fBitRate; - ioEncodedFormat->u.encoded_audio.output.frame_rate = fFrameRate; - ioEncodedFormat->u.encoded_audio.output.channel_count = fChannelCount; - return B_OK; -} - -status_t -mp3Decoder::NegotiateOutputFormat(media_format *ioDecodedFormat) -{ - // fFrameRate and fChannelCount are already valid here - - // BeBook says: The codec will find and return in ioFormat its best matching format - // => This means, we never return an error, and always change the format values - // that we don't support to something more applicable - - ioDecodedFormat->type = B_MEDIA_RAW_AUDIO; - ioDecodedFormat->u.raw_audio.frame_rate = fFrameRate; - ioDecodedFormat->u.raw_audio.channel_count = fChannelCount; - ioDecodedFormat->u.raw_audio.format = media_raw_audio_format::B_AUDIO_SHORT; - ioDecodedFormat->u.raw_audio.byte_order = B_MEDIA_HOST_ENDIAN; - - fFrameSize = (ioDecodedFormat->u.raw_audio.format & 0xf) * ioDecodedFormat->u.raw_audio.channel_count; - if (ioDecodedFormat->u.raw_audio.buffer_size == 0) - ioDecodedFormat->u.raw_audio.buffer_size = AudioBufferSize(ioDecodedFormat->u.raw_audio); - else - ioDecodedFormat->u.raw_audio.buffer_size = (ioDecodedFormat->u.raw_audio.buffer_size / fFrameSize) * fFrameSize; - - if (ioDecodedFormat->u.raw_audio.channel_mask == 0) - ioDecodedFormat->u.raw_audio.channel_mask = (fChannelCount == 1) ? B_CHANNEL_LEFT : B_CHANNEL_LEFT | B_CHANNEL_RIGHT; - - // setup rest of the needed variables - fOutputBufferSize = ioDecodedFormat->u.raw_audio.buffer_size; - - TRACE("mp3Decoder::NegotiateOutputFormat: BufferSize %d, FrameSize %d\n", fOutputBufferSize, fFrameSize); - - return B_OK; -} - - -status_t -mp3Decoder::Seek(uint32 seekTo, - int64 seekFrame, int64 *frame, - bigtime_t seekTime, bigtime_t *time) -{ - fNeedSync = true; - - if (seekTo == B_MEDIA_SEEK_TO_TIME) { - TRACE("MP3Decoder::Seek by time "); - TRACE("from frame %Ld and time %.6f TO Required Time %.6f. ", fSampleNo, fStartTime / 1000000.0, seekTime / 1000000.0); - - *frame = (int64)(seekTime * fFrameRate / 1000000LL); - *time = seekTime; - } else if (seekTo == B_MEDIA_SEEK_TO_FRAME) { - TRACE("MP3Decoder::Seek by Frame "); - TRACE("from time %.6f and frame %Ld TO Required Frame %Ld. ", fStartTime / 1000000.0, fSampleNo, seekFrame); - - *time = (bigtime_t)(seekFrame * 1000000LL / fFrameRate); - *frame = seekFrame; - } else - return B_BAD_VALUE; - - fSampleNo = *frame; - fStartTime = *time; - TRACE("so new frame is %Ld at time %.6f\n", *frame, *time / 1000000.0); - - return B_OK; -} - - -status_t -mp3Decoder::Decode(void *buffer, int64 *frameCount, - media_header *mediaHeader, media_decode_info *info /* = 0 */) -{ - status_t last_err = B_LAST_BUFFER_ERROR; - uint8 * out_buffer = static_cast(buffer); - int32 out_bytes_needed = fOutputBufferSize; - int32 out_bytes = 0; - - fStartTime = (bigtime_t)(fSampleNo *1000000LL / fFrameRate); - mediaHeader->start_time = fStartTime; - - while (out_bytes_needed > 0) { - - if (fNeedSync) { - TRACE("mp3Decoder::Decode: syncing...\n"); - ExitMP3(&fMpgLibPrivate); - InitMP3(&fMpgLibPrivate); - fDecodingError = false; - fResidualBytes = 0; - // fNeedSync is reset in DecodeNextChunk - } - - if (fDecodingError) - return B_ERROR; - - if (fResidualBytes) { - int32 bytes = min_c(fResidualBytes, out_bytes_needed); - memcpy(out_buffer, fResidualBuffer, bytes); - fResidualBuffer += bytes; - fResidualBytes -= bytes; - out_buffer += bytes; - out_bytes += bytes; - out_bytes_needed -= bytes; - - continue; - } - - last_err = DecodeNextChunk(); - if (last_err != B_OK) { - fDecodingError = true; - break; - } - } - - *frameCount = out_bytes / fFrameSize; - fSampleNo += *frameCount; - - TRACE("framecount %Ld, time %.6f\n", *frameCount, mediaHeader->start_time / 1000000.0); - return (out_bytes > 0) ? B_OK : last_err; -} - -status_t -mp3Decoder::DecodeNextChunk() -{ - const void *chunkBuffer; - size_t chunkSize; - media_header mh; - int outsize; - int result; - status_t err; - - // decode residual data that is still in the decoder first - result = decodeMP3(&fMpgLibPrivate, 0, 0, (char *)fDecodeBuffer, DECODE_BUFFER_SIZE, &outsize); - if (result == MP3_OK) { - fResidualBuffer = fDecodeBuffer; - fResidualBytes = outsize; - return B_OK; - } - - // get another chunk and push it to the decoder - err = GetNextChunk(&chunkBuffer, &chunkSize, &mh); - if (err != B_OK) - return err; - - fStartTime = mh.start_time; -// TRACE("mp3Decoder: fStartTime reset to %.6f\n", fStartTime / 1000000.0); - - // resync after a seek - if (fNeedSync) { - TRACE("mp3Decoder::DecodeNextChunk: Syncing...\n"); - if (chunkSize < 4) { - TRACE("mp3Decoder::DecodeNextChunk: Sync failed, frame too small\n"); - return B_ERROR; - } - int len = GetFrameLength(chunkBuffer); - TRACE("mp3Decoder::DecodeNextChunk: chunkSize %ld, first frame length %d\n", chunkSize, len); - // len == -1 when not at frame start - // len == chunkSize for mp3 reader (delivers single frames) - if (len < (int)chunkSize) { -// FIXME: join a few chunks to create a larger (2k) buffer, and use: -// while (chunkSize > 100) { -// if (IsValidStream((uint8 *)chunkBuffer, chunkSize)) - while (chunkSize >= 4) { - if (GetFrameLength(chunkBuffer) > 0) - break; - chunkBuffer = (uint8 *)chunkBuffer + 1; - chunkSize--; - } -// if (chunkSize <= 100) { - if (chunkSize == 3) { - TRACE("mp3Decoder::DecodeNextChunk: Sync failed\n"); - return B_ERROR; - } - TRACE("mp3Decoder::DecodeNextChunk: new chunkSize %ld, first frame length %d\n", chunkSize, GetFrameLength(chunkBuffer)); - } - fNeedSync = false; - } - - result = decodeMP3(&fMpgLibPrivate, (char *)chunkBuffer, chunkSize, (char *)fDecodeBuffer, DECODE_BUFFER_SIZE, &outsize); - if (result == MP3_NEED_MORE) { - TRACE("mp3Decoder::DecodeNextChunk: decodeMP3 returned MP3_NEED_MORE\n"); - fResidualBuffer = NULL; - fResidualBytes = 0; - return B_OK; - } else if (result != MP3_OK) { - TRACE("mp3Decoder::DecodeNextChunk: decodeMP3 returned error %d\n", result); - return B_ERROR; -// fNeedSync = true; -// fResidualBuffer = NULL; -// fResidualBytes = 0; -// return B_OK; - } - - //printf("mp3Decoder::Decode: decoded %d bytes into %d bytes\n",chunkSize, outsize); - - fResidualBuffer = fDecodeBuffer; - fResidualBytes = outsize; - - return B_OK; -} - -bool -mp3Decoder::IsValidStream(const uint8 *buffer, int size) -{ - // check 3 consecutive frame headers to make sure - // that the length encoded in the header is correct, - // and also that mpeg version and layer do not change - int length1 = GetFrameLength(buffer); - if (length1 < 0 || (length1 + 4) > size) - return false; - int version_index1 = (buffer[1] >> 3) & 0x03; - int layer_index1 = (buffer[1] >> 1) & 0x03; - int length2 = GetFrameLength(buffer + length1); - if (length2 < 0 || (length1 + length2 + 4) > size) - return false; - int version_index2 = (buffer[length1 + 1] >> 3) & 0x03; - int layer_index2 = (buffer[length1 + 1] >> 1) & 0x03; - if (version_index1 != version_index2 || layer_index1 != layer_index2) - return false; - int length3 = GetFrameLength(buffer + length1 + length2); - if (length3 < 0) - return false; - int version_index3 = (buffer[length1 + length2 + 1] >> 3) & 0x03; - int layer_index3 = (buffer[length1 + length2 + 1] >> 1) & 0x03; - if (version_index2 != version_index3 || layer_index2 != layer_index3) - return false; - return true; -} - -int -mp3Decoder::GetFrameLength(const void *header) -{ - const uint8 *h = static_cast(header); - bool lsf = false; - - if (h[0] != 0xff) { - TRACE("No 0xff MP3 Header in chunk %x\n",h[0]); - return -1; - } - 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; - int bitrate_index = (h[2] >> 4) & 0x0f; - int sampling_rate_index = (h[2] >> 2) & 0x03; - int padding = (h[2] >> 1) & 0x01; - /* not interested in the other bits */ - - int bitrate = bit_rate_table[mpeg_version_index][layer_index][bitrate_index]; - int framerate = frame_rate_table[mpeg_version_index][sampling_rate_index]; - lsf = (mpeg_version_index == 0) || (mpeg_version_index == 2); - - TRACE("%s %s, %s crc, bit rate %d, frame rate %d, padding %d\n", - 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 - length = ((12 * 1000 * bitrate) / framerate + padding) * 4; - } else if (layer_index == 2) { // layer 2 - length = ((144 * 1000 * bitrate) / framerate) + padding; - } else if (lsf) { // layer 3 with lsf - length = ((144 * 1000 * bitrate) / (framerate*2)) + padding; - } else { // layer 3 without lsf - length = ((144 * 1000 * bitrate) / framerate) + padding; - } - -#if 0 - TRACE("%s %s, %s crc, bit rate %d, frame rate %d, padding %d, frame length %d\n", - 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, length); -#endif - - return length; -} - - -Decoder * -mp3DecoderPlugin::NewDecoder(uint index) -{ - static BLocker locker; - static bool initdone = false; - locker.Lock(); - if (!initdone) { - InitMpgLib(); - initdone = true; - } - locker.Unlock(); - return new mp3Decoder; -} - - -static media_format mp3_formats[1]; - -status_t -mp3DecoderPlugin::GetSupportedFormats(media_format ** formats, size_t * count) -{ - const mpeg_id ids[] = { - B_MPEG_1_AUDIO_LAYER_1, - B_MPEG_1_AUDIO_LAYER_2, - B_MPEG_1_AUDIO_LAYER_3, // "MP3" - B_MPEG_2_AUDIO_LAYER_1, - B_MPEG_2_AUDIO_LAYER_2, - B_MPEG_2_AUDIO_LAYER_3, - B_MPEG_2_5_AUDIO_LAYER_1, - B_MPEG_2_5_AUDIO_LAYER_2, - B_MPEG_2_5_AUDIO_LAYER_3, - }; - const size_t otherIDs = 6; - const size_t numIDs = otherIDs + sizeof(ids) / sizeof(mpeg_id); - media_format_description descriptions[numIDs]; - descriptions[0].family = B_WAV_FORMAT_FAMILY; - descriptions[0].u.wav.codec = 0x0050; - descriptions[1].family = B_WAV_FORMAT_FAMILY; - descriptions[1].u.wav.codec = 0x0055; - descriptions[2].family = B_QUICKTIME_FORMAT_FAMILY; - descriptions[2].u.quicktime.codec = '.mp3'; - descriptions[3].family = B_QUICKTIME_FORMAT_FAMILY; - descriptions[3].u.quicktime.codec = '3pm.'; - descriptions[4].family = B_AVI_FORMAT_FAMILY; - descriptions[4].u.avi.codec = '.mp3'; - descriptions[5].family = B_AVI_FORMAT_FAMILY; - descriptions[5].u.avi.codec = '3pm.'; - for (size_t i = otherIDs; i < numIDs; i++) { - descriptions[i].family = B_MPEG_FORMAT_FAMILY; - descriptions[i].u.mpeg.id = ids[i-otherIDs]; - } - - media_format format; - format.type = B_MEDIA_ENCODED_AUDIO; - format.u.encoded_audio = media_encoded_audio_format::wildcard; - format.u.encoded_audio.output.format = media_raw_audio_format::B_AUDIO_SHORT; - format.u.encoded_audio.output.byte_order = B_MEDIA_HOST_ENDIAN; - - BMediaFormats mediaFormats; - status_t result = mediaFormats.InitCheck(); - if (result != B_OK) { - return result; - } - result = mediaFormats.MakeFormatFor(descriptions, numIDs, &format); - if (result != B_OK) { - return result; - } - mp3_formats[0] = format; - - *formats = mp3_formats; - *count = 1; - - return result; -} - - -MediaPlugin *instantiate_plugin() -{ - return new mp3DecoderPlugin; -} diff --git a/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.h b/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.h deleted file mode 100644 index 7f48a873f4..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mp3DecoderPlugin.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2003-2004, Marcus Overhagen - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef _MP3_DECODER_PLUGIN_H -#define _MP3_DECODER_PLUGIN_H - -#include "DecoderPlugin.h" -#include "mpglib/mpglib.h" - -class mp3Decoder : public Decoder -{ -public: - mp3Decoder(); - ~mp3Decoder(); - - void GetCodecInfo(media_codec_info *codecInfo); - - status_t Setup(media_format *ioEncodedFormat, - const void *infoBuffer, size_t infoSize); - - status_t NegotiateOutputFormat(media_format *ioDecodedFormat); - - status_t Seek(uint32 seekTo, - int64 seekFrame, int64 *frame, - bigtime_t seekTime, bigtime_t *time); - - - status_t Decode(void *buffer, int64 *frameCount, - media_header *mediaHeader, media_decode_info *info); - -private: - status_t DecodeNextChunk(); - bool IsValidStream(const uint8 *buffer, int size); - int GetFrameLength(const void *header); - -private: - struct mpstr fMpgLibPrivate; - int32 fResidualBytes; - uint8 * fResidualBuffer; - uint8 * fDecodeBuffer; - bigtime_t fStartTime; - int fFrameSize; - int fFrameRate; - int fBitRate; - int fChannelCount; - int fOutputBufferSize; - bool fNeedSync; - bool fDecodingError; - uint64 fSampleNo; -}; - - -class mp3DecoderPlugin : public DecoderPlugin -{ -public: - Decoder * NewDecoder(uint index); - status_t GetSupportedFormats(media_format ** formats, size_t * count); -}; - -#endif diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/CHANGES b/src/add-ons/media/plugins/mp3_decoder/mpglib/CHANGES deleted file mode 100644 index 95d99ff87e..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/CHANGES +++ /dev/null @@ -1,15 +0,0 @@ -14/Oct/1999: - - VBR fix - - Layer2 and Layer1 added - -21/Nov/2003: (by Marcus Overhagen) - - modified for usage with OpenBeOS - - removed global variable struct mpstr *gmp - - moved initialization into separate function - -25/Nov/2003: (by Marcus Overhagen) - - removed global variables bitindex and wordpointer - - cleanup - -29/Nov/2003: (by Marcus Overhagen) - - cleanup diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/Jamfile b/src/add-ons/media/plugins/mp3_decoder/mpglib/Jamfile deleted file mode 100644 index 0ef9bbab1d..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/Jamfile +++ /dev/null @@ -1,14 +0,0 @@ -SubDir HAIKU_TOP src add-ons media plugins mp3_decoder mpglib ; - -SetSubDirSupportedPlatformsBeOSCompatible ; - -StaticLibrary libmpglib.a : - common.c - dct64_i386.c - decode_i386.c - interface.c - layer1.c - layer2.c - layer3.c - tabinit.c -; diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/README b/src/add-ons/media/plugins/mp3_decoder/mpglib/README deleted file mode 100644 index 2465ffaa2c..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/README +++ /dev/null @@ -1,39 +0,0 @@ -MP3 library ------------ -Version 0.2a - -This decoder is a 'light' version (thrown out all unnecessay parts) -from the mpg123 package. I made this for a company. - -Currently only Layer3 is enabled to save some space. Layer1,2 isn't -tested at all. The interface will not change significantly. -A backport to the mpg123 package is planed. - -compiled and tested only on Solaris 2.6 -main.c contains a simple demo application for library. - -COPYING: you may use this source under LGPL terms! - (Yes, I switched to LGPL for the _mpglib_ part!) - -PLEASE NOTE: This software may contain patented algorithms (at least - patented in some countries). It may be not allowed to sell/use products - based on this source code in these countries. Check this out first! - -COPYRIGHT of MP3 music: - Please note, that the duplicating of copyrighted music without explicit - permission violates the rights of the owner. - -SENDING PATCHES: - The current version is under LGPL. Please consider this when sending patches or - changes. I also want to have the freedom to sell the code to companies that - cannot or do not want to use the code under LGPL. So, if you send me - significant patches, I need your explicit permission to do this. Of course, - there will always be the LGPLed open source version of the 100% same code. - In the case you cannot accept this: the code is free, it's your freedom - to distribute your changes again under LGPL. - -FEEDBACK: - I'm interessted to here from you, when you use this package as part - of another project. - - diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/common.c b/src/add-ons/media/plugins/mp3_decoder/mpglib/common.c deleted file mode 100644 index a71b2ab25e..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/common.c +++ /dev/null @@ -1,226 +0,0 @@ -#include -#include -#include - -#include -#include -#include - -#include "mpg123.h" -#include "mpglib.h" - -int tabsel_123[2][3][16] = { - { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, - {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, - {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} }, - - { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, - {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, - {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} } -}; - -long freqs[9] = { 44100, 48000, 32000, - 22050, 24000, 16000 , - 11025 , 12000 , 8000 }; - -#define HDRCMPMASK 0xfffffd00 - -#if 0 -int head_check(unsigned long head) -{ - if( (head & 0xffe00000) != 0xffe00000) - return FALSE; - if(!((head>>17)&3)) - return FALSE; - if( ((head>>12)&0xf) == 0xf) - return FALSE; - if( ((head>>10)&0x3) == 0x3 ) - return FALSE; - return TRUE; -} -#endif - - -/* - * the code a header and write the information - * into the frame structure - */ -int decode_header(struct frame *fr,unsigned long newhead) -{ - if( newhead & (1<<20) ) { - fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1; - fr->mpeg25 = 0; - } - else { - fr->lsf = 1; - fr->mpeg25 = 1; - } - - fr->lay = 4-((newhead>>17)&3); - if( ((newhead>>10)&0x3) == 0x3) { - fprintf(stderr,"Stream error, reserved sampling rate\n"); - return 0; - } - if(fr->mpeg25) { - fr->sampling_frequency = 6 + ((newhead>>10)&0x3); - } - else - fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3); - fr->error_protection = ((newhead>>16)&0x1)^0x1; - - if(fr->mpeg25) /* allow Bitrate change for 2.5 ... */ - fr->bitrate_index = ((newhead>>12)&0xf); - - fr->bitrate_index = ((newhead>>12)&0xf); - fr->padding = ((newhead>>9)&0x1); - fr->extension = ((newhead>>8)&0x1); - fr->mode = ((newhead>>6)&0x3); - fr->mode_ext = ((newhead>>4)&0x3); - fr->copyright = ((newhead>>3)&0x1); - fr->original = ((newhead>>2)&0x1); - fr->emphasis = newhead & 0x3; - - fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; - - if(!fr->bitrate_index) - { - fprintf(stderr, "Stream error, free format bitrate index not supported\n"); - return 0; - } - - switch(fr->lay) - { - case 1: -#if 0 - fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? - (fr->mode_ext<<2)+4 : 32; -#endif - fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000; - fr->framesize /= freqs[fr->sampling_frequency]; - fr->framesize = ((fr->framesize+fr->padding)<<2)-4; - break; - case 2: -#if 0 - fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? - (fr->mode_ext<<2)+4 : fr->II_sblimit; -#endif - fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000; - fr->framesize /= freqs[fr->sampling_frequency]; - fr->framesize += fr->padding - 4; - break; - case 3: -#if 0 - fr->do_layer = do_layer3; - if(fr->lsf) - ssize = (fr->stereo == 1) ? 9 : 17; - else - ssize = (fr->stereo == 1) ? 17 : 32; -#endif - -#if 0 - if(fr->error_protection) - ssize += 2; -#endif - fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000; - fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf); - fr->framesize = fr->framesize + fr->padding - 4; - break; - default: - fprintf(stderr,"Stream error, unknown layer type.\n"); - return (0); - } - return 1; -} - -#if 0 -void print_header(struct frame *fr) -{ - static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" }; - static char *layers[4] = { "Unknown" , "I", "II", "III" }; - - fprintf(stderr,"MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n", - fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), - layers[fr->lay],freqs[fr->sampling_frequency], - modes[fr->mode],fr->mode_ext,fr->framesize+4); - fprintf(stderr,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n", - fr->stereo,fr->copyright?"Yes":"No", - fr->original?"Yes":"No",fr->error_protection?"Yes":"No", - fr->emphasis); - fprintf(stderr,"Bitrate: %d Kbits/s, Extension value: %d\n", - tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],fr->extension); -} - -void print_header_compact(struct frame *fr) -{ - static char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" }; - static char *layers[4] = { "Unknown" , "I", "II", "III" }; - - fprintf(stderr,"MPEG %s layer %s, %d kbit/s, %ld Hz %s\n", - fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), - layers[fr->lay], - tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index], - freqs[fr->sampling_frequency], modes[fr->mode]); -} - -#endif - -unsigned int getbits(struct mpstr *mp, int number_of_bits) -{ - unsigned long rval; - - if(!number_of_bits) - return 0; - - { - rval = mp->wordpointer[0]; - rval <<= 8; - rval |= mp->wordpointer[1]; - rval <<= 8; - rval |= mp->wordpointer[2]; - rval <<= mp->bitindex; - rval &= 0xffffff; - - mp->bitindex += number_of_bits; - - rval >>= (24-number_of_bits); - - mp->wordpointer += (mp->bitindex>>3); - mp->bitindex &= 7; - } - return rval; -} - -unsigned int getbits_fast(struct mpstr *mp, int number_of_bits) -{ - unsigned long rval; - - { - rval = mp->wordpointer[0]; - rval <<= 8; - rval |= mp->wordpointer[1]; - rval <<= mp->bitindex; - rval &= 0xffff; - mp->bitindex += number_of_bits; - - rval >>= (16-number_of_bits); - - mp->wordpointer += (mp->bitindex>>3); - mp->bitindex &= 7; - } - return rval; -} - -unsigned int get1bit(struct mpstr *mp) -{ - unsigned char rval; - rval = *mp->wordpointer << mp->bitindex; - - mp->bitindex++; - mp->wordpointer += (mp->bitindex>>3); - mp->bitindex &= 7; - - return rval>>7; -} - - - diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/dct64_i386.c b/src/add-ons/media/plugins/mp3_decoder/mpglib/dct64_i386.c deleted file mode 100644 index b98b474003..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/dct64_i386.c +++ /dev/null @@ -1,315 +0,0 @@ - -/* - * Discrete Cosine Tansform (DCT) for subband synthesis - * optimized for machines with no auto-increment. - * The performance is highly compiler dependend. Maybe - * the dct64.c version for 'normal' processor may be faster - * even for Intel processors. - */ - -#include "mpg123.h" - -static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples) -{ - - { - register real *costab = pnts[0]; - - b1[0x00] = samples[0x00] + samples[0x1F]; - b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0]; - - b1[0x01] = samples[0x01] + samples[0x1E]; - b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1]; - - b1[0x02] = samples[0x02] + samples[0x1D]; - b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2]; - - b1[0x03] = samples[0x03] + samples[0x1C]; - b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3]; - - b1[0x04] = samples[0x04] + samples[0x1B]; - b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4]; - - b1[0x05] = samples[0x05] + samples[0x1A]; - b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5]; - - b1[0x06] = samples[0x06] + samples[0x19]; - b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6]; - - b1[0x07] = samples[0x07] + samples[0x18]; - b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7]; - - b1[0x08] = samples[0x08] + samples[0x17]; - b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8]; - - b1[0x09] = samples[0x09] + samples[0x16]; - b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9]; - - b1[0x0A] = samples[0x0A] + samples[0x15]; - b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA]; - - b1[0x0B] = samples[0x0B] + samples[0x14]; - b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB]; - - b1[0x0C] = samples[0x0C] + samples[0x13]; - b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC]; - - b1[0x0D] = samples[0x0D] + samples[0x12]; - b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD]; - - b1[0x0E] = samples[0x0E] + samples[0x11]; - b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE]; - - b1[0x0F] = samples[0x0F] + samples[0x10]; - b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF]; - } - - - { - register real *costab = pnts[1]; - - b2[0x00] = b1[0x00] + b1[0x0F]; - b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0]; - b2[0x01] = b1[0x01] + b1[0x0E]; - b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1]; - b2[0x02] = b1[0x02] + b1[0x0D]; - b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2]; - b2[0x03] = b1[0x03] + b1[0x0C]; - b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3]; - b2[0x04] = b1[0x04] + b1[0x0B]; - b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4]; - b2[0x05] = b1[0x05] + b1[0x0A]; - b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5]; - b2[0x06] = b1[0x06] + b1[0x09]; - b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6]; - b2[0x07] = b1[0x07] + b1[0x08]; - b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7]; - - b2[0x10] = b1[0x10] + b1[0x1F]; - b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0]; - b2[0x11] = b1[0x11] + b1[0x1E]; - b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1]; - b2[0x12] = b1[0x12] + b1[0x1D]; - b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2]; - b2[0x13] = b1[0x13] + b1[0x1C]; - b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3]; - b2[0x14] = b1[0x14] + b1[0x1B]; - b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4]; - b2[0x15] = b1[0x15] + b1[0x1A]; - b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5]; - b2[0x16] = b1[0x16] + b1[0x19]; - b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6]; - b2[0x17] = b1[0x17] + b1[0x18]; - b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7]; - } - - { - register real *costab = pnts[2]; - - b1[0x00] = b2[0x00] + b2[0x07]; - b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0]; - b1[0x01] = b2[0x01] + b2[0x06]; - b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1]; - b1[0x02] = b2[0x02] + b2[0x05]; - b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2]; - b1[0x03] = b2[0x03] + b2[0x04]; - b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3]; - - b1[0x08] = b2[0x08] + b2[0x0F]; - b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0]; - b1[0x09] = b2[0x09] + b2[0x0E]; - b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1]; - b1[0x0A] = b2[0x0A] + b2[0x0D]; - b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2]; - b1[0x0B] = b2[0x0B] + b2[0x0C]; - b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3]; - - b1[0x10] = b2[0x10] + b2[0x17]; - b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0]; - b1[0x11] = b2[0x11] + b2[0x16]; - b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1]; - b1[0x12] = b2[0x12] + b2[0x15]; - b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2]; - b1[0x13] = b2[0x13] + b2[0x14]; - b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3]; - - b1[0x18] = b2[0x18] + b2[0x1F]; - b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0]; - b1[0x19] = b2[0x19] + b2[0x1E]; - b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1]; - b1[0x1A] = b2[0x1A] + b2[0x1D]; - b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2]; - b1[0x1B] = b2[0x1B] + b2[0x1C]; - b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3]; - } - - { - register real const cos0 = pnts[3][0]; - register real const cos1 = pnts[3][1]; - - b2[0x00] = b1[0x00] + b1[0x03]; - b2[0x03] = (b1[0x00] - b1[0x03]) * cos0; - b2[0x01] = b1[0x01] + b1[0x02]; - b2[0x02] = (b1[0x01] - b1[0x02]) * cos1; - - b2[0x04] = b1[0x04] + b1[0x07]; - b2[0x07] = (b1[0x07] - b1[0x04]) * cos0; - b2[0x05] = b1[0x05] + b1[0x06]; - b2[0x06] = (b1[0x06] - b1[0x05]) * cos1; - - b2[0x08] = b1[0x08] + b1[0x0B]; - b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0; - b2[0x09] = b1[0x09] + b1[0x0A]; - b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1; - - b2[0x0C] = b1[0x0C] + b1[0x0F]; - b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0; - b2[0x0D] = b1[0x0D] + b1[0x0E]; - b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1; - - b2[0x10] = b1[0x10] + b1[0x13]; - b2[0x13] = (b1[0x10] - b1[0x13]) * cos0; - b2[0x11] = b1[0x11] + b1[0x12]; - b2[0x12] = (b1[0x11] - b1[0x12]) * cos1; - - b2[0x14] = b1[0x14] + b1[0x17]; - b2[0x17] = (b1[0x17] - b1[0x14]) * cos0; - b2[0x15] = b1[0x15] + b1[0x16]; - b2[0x16] = (b1[0x16] - b1[0x15]) * cos1; - - b2[0x18] = b1[0x18] + b1[0x1B]; - b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0; - b2[0x19] = b1[0x19] + b1[0x1A]; - b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1; - - b2[0x1C] = b1[0x1C] + b1[0x1F]; - b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0; - b2[0x1D] = b1[0x1D] + b1[0x1E]; - b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1; - } - - { - register real const cos0 = pnts[4][0]; - - b1[0x00] = b2[0x00] + b2[0x01]; - b1[0x01] = (b2[0x00] - b2[0x01]) * cos0; - b1[0x02] = b2[0x02] + b2[0x03]; - b1[0x03] = (b2[0x03] - b2[0x02]) * cos0; - b1[0x02] += b1[0x03]; - - b1[0x04] = b2[0x04] + b2[0x05]; - b1[0x05] = (b2[0x04] - b2[0x05]) * cos0; - b1[0x06] = b2[0x06] + b2[0x07]; - b1[0x07] = (b2[0x07] - b2[0x06]) * cos0; - b1[0x06] += b1[0x07]; - b1[0x04] += b1[0x06]; - b1[0x06] += b1[0x05]; - b1[0x05] += b1[0x07]; - - b1[0x08] = b2[0x08] + b2[0x09]; - b1[0x09] = (b2[0x08] - b2[0x09]) * cos0; - b1[0x0A] = b2[0x0A] + b2[0x0B]; - b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0; - b1[0x0A] += b1[0x0B]; - - b1[0x0C] = b2[0x0C] + b2[0x0D]; - b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0; - b1[0x0E] = b2[0x0E] + b2[0x0F]; - b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0; - b1[0x0E] += b1[0x0F]; - b1[0x0C] += b1[0x0E]; - b1[0x0E] += b1[0x0D]; - b1[0x0D] += b1[0x0F]; - - b1[0x10] = b2[0x10] + b2[0x11]; - b1[0x11] = (b2[0x10] - b2[0x11]) * cos0; - b1[0x12] = b2[0x12] + b2[0x13]; - b1[0x13] = (b2[0x13] - b2[0x12]) * cos0; - b1[0x12] += b1[0x13]; - - b1[0x14] = b2[0x14] + b2[0x15]; - b1[0x15] = (b2[0x14] - b2[0x15]) * cos0; - b1[0x16] = b2[0x16] + b2[0x17]; - b1[0x17] = (b2[0x17] - b2[0x16]) * cos0; - b1[0x16] += b1[0x17]; - b1[0x14] += b1[0x16]; - b1[0x16] += b1[0x15]; - b1[0x15] += b1[0x17]; - - b1[0x18] = b2[0x18] + b2[0x19]; - b1[0x19] = (b2[0x18] - b2[0x19]) * cos0; - b1[0x1A] = b2[0x1A] + b2[0x1B]; - b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0; - b1[0x1A] += b1[0x1B]; - - b1[0x1C] = b2[0x1C] + b2[0x1D]; - b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0; - b1[0x1E] = b2[0x1E] + b2[0x1F]; - b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0; - b1[0x1E] += b1[0x1F]; - b1[0x1C] += b1[0x1E]; - b1[0x1E] += b1[0x1D]; - b1[0x1D] += b1[0x1F]; - } - - out0[0x10*16] = b1[0x00]; - out0[0x10*12] = b1[0x04]; - out0[0x10* 8] = b1[0x02]; - out0[0x10* 4] = b1[0x06]; - out0[0x10* 0] = b1[0x01]; - out1[0x10* 0] = b1[0x01]; - out1[0x10* 4] = b1[0x05]; - out1[0x10* 8] = b1[0x03]; - out1[0x10*12] = b1[0x07]; - - b1[0x08] += b1[0x0C]; - out0[0x10*14] = b1[0x08]; - b1[0x0C] += b1[0x0a]; - out0[0x10*10] = b1[0x0C]; - b1[0x0A] += b1[0x0E]; - out0[0x10* 6] = b1[0x0A]; - b1[0x0E] += b1[0x09]; - out0[0x10* 2] = b1[0x0E]; - b1[0x09] += b1[0x0D]; - out1[0x10* 2] = b1[0x09]; - b1[0x0D] += b1[0x0B]; - out1[0x10* 6] = b1[0x0D]; - b1[0x0B] += b1[0x0F]; - out1[0x10*10] = b1[0x0B]; - out1[0x10*14] = b1[0x0F]; - - b1[0x18] += b1[0x1C]; - out0[0x10*15] = b1[0x10] + b1[0x18]; - out0[0x10*13] = b1[0x18] + b1[0x14]; - b1[0x1C] += b1[0x1a]; - out0[0x10*11] = b1[0x14] + b1[0x1C]; - out0[0x10* 9] = b1[0x1C] + b1[0x12]; - b1[0x1A] += b1[0x1E]; - out0[0x10* 7] = b1[0x12] + b1[0x1A]; - out0[0x10* 5] = b1[0x1A] + b1[0x16]; - b1[0x1E] += b1[0x19]; - out0[0x10* 3] = b1[0x16] + b1[0x1E]; - out0[0x10* 1] = b1[0x1E] + b1[0x11]; - b1[0x19] += b1[0x1D]; - out1[0x10* 1] = b1[0x11] + b1[0x19]; - out1[0x10* 3] = b1[0x19] + b1[0x15]; - b1[0x1D] += b1[0x1B]; - out1[0x10* 5] = b1[0x15] + b1[0x1D]; - out1[0x10* 7] = b1[0x1D] + b1[0x13]; - b1[0x1B] += b1[0x1F]; - out1[0x10* 9] = b1[0x13] + b1[0x1B]; - out1[0x10*11] = b1[0x1B] + b1[0x17]; - out1[0x10*13] = b1[0x17] + b1[0x1F]; - out1[0x10*15] = b1[0x1F]; -} - -/* - * the call via dct64 is a trick to force GCC to use - * (new) registers for the b1,b2 pointer to the bufs[xx] field - */ -void dct64(real *a,real *b,real *c) -{ - real bufs[0x40]; - dct64_1(a,b,bufs,bufs+0x20,c); -} - diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/decode_i386.c b/src/add-ons/media/plugins/mp3_decoder/mpglib/decode_i386.c deleted file mode 100644 index d1f3a57187..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/decode_i386.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Mpeg Layer-1,2,3 audio decoder - * ------------------------------ - * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved. - * See also 'README' - * - * slighlty optimized for machines without autoincrement/decrement. - * The performance is highly compiler dependend. Maybe - * the decode.c version for 'normal' processor may be faster - * even for Intel processors. - */ - -#include -#include -#include - -#include "mpg123.h" -#include "mpglib.h" - - /* old WRITE_SAMPLE */ -#define WRITE_SAMPLE(samples,sum,clip) \ - if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ - else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ - else { *(samples) = sum; } - -int synth_1to1_mono(struct mpstr *mp, real *bandPtr,unsigned char *samples,int *pnt) -{ - short samples_tmp[64]; - short *tmp1 = samples_tmp; - int i,ret; - int pnt1 = 0; - - ret = synth_1to1(mp, bandPtr,0,(unsigned char *) samples_tmp,&pnt1); - samples += *pnt; - - for(i=0;i<32;i++) { - *( (short *) samples) = *tmp1; - samples += 2; - tmp1 += 2; - } - *pnt += 64; - - return ret; -} - - -int synth_1to1(struct mpstr *mp, real *bandPtr,int channel,unsigned char *out,int *pnt) -{ - static const int step = 2; - int bo; - short *samples = (short *) (out + *pnt); - - real *b0,(*buf)[0x110]; - int clip = 0; - int bo1; - - bo = mp->synth_bo; - - if(!channel) { - bo--; - bo &= 0xf; - buf = mp->synth_buffs[0]; - } - else { - samples++; - buf = mp->synth_buffs[1]; - } - - if(bo & 0x1) { - b0 = buf[0]; - bo1 = bo; - dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr); - } - else { - b0 = buf[1]; - bo1 = bo+1; - dct64(buf[0]+bo,buf[1]+bo+1,bandPtr); - } - - mp->synth_bo = bo; - - { - register int j; - real *window = decwin + 16 - bo1; - - for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step) - { - real sum; - sum = window[0x0] * b0[0x0]; - sum -= window[0x1] * b0[0x1]; - sum += window[0x2] * b0[0x2]; - sum -= window[0x3] * b0[0x3]; - sum += window[0x4] * b0[0x4]; - sum -= window[0x5] * b0[0x5]; - sum += window[0x6] * b0[0x6]; - sum -= window[0x7] * b0[0x7]; - sum += window[0x8] * b0[0x8]; - sum -= window[0x9] * b0[0x9]; - sum += window[0xA] * b0[0xA]; - sum -= window[0xB] * b0[0xB]; - sum += window[0xC] * b0[0xC]; - sum -= window[0xD] * b0[0xD]; - sum += window[0xE] * b0[0xE]; - sum -= window[0xF] * b0[0xF]; - - WRITE_SAMPLE(samples,sum,clip); - } - - { - real sum; - sum = window[0x0] * b0[0x0]; - sum += window[0x2] * b0[0x2]; - sum += window[0x4] * b0[0x4]; - sum += window[0x6] * b0[0x6]; - sum += window[0x8] * b0[0x8]; - sum += window[0xA] * b0[0xA]; - sum += window[0xC] * b0[0xC]; - sum += window[0xE] * b0[0xE]; - WRITE_SAMPLE(samples,sum,clip); - b0-=0x10,window-=0x20,samples+=step; - } - window += bo1<<1; - - for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step) - { - real sum; - sum = -window[-0x1] * b0[0x0]; - sum -= window[-0x2] * b0[0x1]; - sum -= window[-0x3] * b0[0x2]; - sum -= window[-0x4] * b0[0x3]; - sum -= window[-0x5] * b0[0x4]; - sum -= window[-0x6] * b0[0x5]; - sum -= window[-0x7] * b0[0x6]; - sum -= window[-0x8] * b0[0x7]; - sum -= window[-0x9] * b0[0x8]; - sum -= window[-0xA] * b0[0x9]; - sum -= window[-0xB] * b0[0xA]; - sum -= window[-0xC] * b0[0xB]; - sum -= window[-0xD] * b0[0xC]; - sum -= window[-0xE] * b0[0xD]; - sum -= window[-0xF] * b0[0xE]; - sum -= window[-0x0] * b0[0xF]; - - WRITE_SAMPLE(samples,sum,clip); - } - } - *pnt += 128; - - return clip; -} - diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/huffman.h b/src/add-ons/media/plugins/mp3_decoder/mpglib/huffman.h deleted file mode 100644 index 7fec0d589e..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/huffman.h +++ /dev/null @@ -1,332 +0,0 @@ -/* - * huffman tables ... recalcualted to work with my optimzed - * decoder scheme (MH) - * - * probably we could save a few bytes of memory, because the - * smaller tables are often the part of a bigger table - */ - -struct newhuff -{ - unsigned int linbits; - short *table; -}; - -static short tab0[] = -{ - 0 -}; - -static short tab1[] = -{ - -5, -3, -1, 17, 1, 16, 0 -}; - -static short tab2[] = -{ - -15, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 17, -1, 1, - 16, 0 -}; - -static short tab3[] = -{ - -13, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 16, 17, -1, - 1, 0 -}; - -static short tab5[] = -{ - -29, -25, -23, -15, -7, -5, -3, -1, 51, 35, 50, 49, -3, -1, 19, - 3, -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, 17, -1, 1, 16, - 0 -}; - -static short tab6[] = -{ - -25, -19, -13, -9, -5, -3, -1, 51, 3, 35, -1, 50, 48, -1, 19, - 49, -3, -1, 34, 2, 18, -3, -1, 33, 32, 1, -1, 17, -1, 16, - 0 -}; - -static short tab7[] = -{ - -69, -65, -57, -39, -29, -17, -11, -7, -3, -1, 85, 69, -1, 84, 83, - -1, 53, 68, -3, -1, 37, 82, 21, -5, -1, 81, -1, 5, 52, -1, - 80, -1, 67, 51, -5, -3, -1, 36, 66, 20, -1, 65, 64, -11, -7, - -3, -1, 4, 35, -1, 50, 3, -1, 19, 49, -3, -1, 48, 34, 18, - -5, -1, 33, -1, 2, 32, 17, -1, 1, 16, 0 -}; - -static short tab8[] = -{ - -65, -63, -59, -45, -31, -19, -13, -7, -5, -3, -1, 85, 84, 69, 83, - -3, -1, 53, 68, 37, -3, -1, 82, 5, 21, -5, -1, 81, -1, 52, - 67, -3, -1, 80, 51, 36, -5, -3, -1, 66, 20, 65, -3, -1, 4, - 64, -1, 35, 50, -9, -7, -3, -1, 19, 49, -1, 3, 48, 34, -1, - 2, 32, -1, 18, 33, 17, -3, -1, 1, 16, 0 -}; - -static short tab9[] = -{ - -63, -53, -41, -29, -19, -11, -5, -3, -1, 85, 69, 53, -1, 83, -1, - 84, 5, -3, -1, 68, 37, -1, 82, 21, -3, -1, 81, 52, -1, 67, - -1, 80, 4, -7, -3, -1, 36, 66, -1, 51, 64, -1, 20, 65, -5, - -3, -1, 35, 50, 19, -1, 49, -1, 3, 48, -5, -3, -1, 34, 2, - 18, -1, 33, 32, -3, -1, 17, 1, -1, 16, 0 -}; - -static short tab10[] = -{ --125,-121,-111, -83, -55, -35, -21, -13, -7, -3, -1, 119, 103, -1, 118, - 87, -3, -1, 117, 102, 71, -3, -1, 116, 86, -1, 101, 55, -9, -3, - -1, 115, 70, -3, -1, 85, 84, 99, -1, 39, 114, -11, -5, -3, -1, - 100, 7, 112, -1, 98, -1, 69, 53, -5, -1, 6, -1, 83, 68, 23, - -17, -5, -1, 113, -1, 54, 38, -5, -3, -1, 37, 82, 21, -1, 81, - -1, 52, 67, -3, -1, 22, 97, -1, 96, -1, 5, 80, -19, -11, -7, - -3, -1, 36, 66, -1, 51, 4, -1, 20, 65, -3, -1, 64, 35, -1, - 50, 3, -3, -1, 19, 49, -1, 48, 34, -7, -3, -1, 18, 33, -1, - 2, 32, 17, -1, 1, 16, 0 -}; - -static short tab11[] = -{ --121,-113, -89, -59, -43, -27, -17, -7, -3, -1, 119, 103, -1, 118, 117, - -3, -1, 102, 71, -1, 116, -1, 87, 85, -5, -3, -1, 86, 101, 55, - -1, 115, 70, -9, -7, -3, -1, 69, 84, -1, 53, 83, 39, -1, 114, - -1, 100, 7, -5, -1, 113, -1, 23, 112, -3, -1, 54, 99, -1, 96, - -1, 68, 37, -13, -7, -5, -3, -1, 82, 5, 21, 98, -3, -1, 38, - 6, 22, -5, -1, 97, -1, 81, 52, -5, -1, 80, -1, 67, 51, -1, - 36, 66, -15, -11, -7, -3, -1, 20, 65, -1, 4, 64, -1, 35, 50, - -1, 19, 49, -5, -3, -1, 3, 48, 34, 33, -5, -1, 18, -1, 2, - 32, 17, -3, -1, 1, 16, 0 -}; - -static short tab12[] = -{ --115, -99, -73, -45, -27, -17, -9, -5, -3, -1, 119, 103, 118, -1, 87, - 117, -3, -1, 102, 71, -1, 116, 101, -3, -1, 86, 55, -3, -1, 115, - 85, 39, -7, -3, -1, 114, 70, -1, 100, 23, -5, -1, 113, -1, 7, - 112, -1, 54, 99, -13, -9, -3, -1, 69, 84, -1, 68, -1, 6, 5, - -1, 38, 98, -5, -1, 97, -1, 22, 96, -3, -1, 53, 83, -1, 37, - 82, -17, -7, -3, -1, 21, 81, -1, 52, 67, -5, -3, -1, 80, 4, - 36, -1, 66, 20, -3, -1, 51, 65, -1, 35, 50, -11, -7, -5, -3, - -1, 64, 3, 48, 19, -1, 49, 34, -1, 18, 33, -7, -5, -3, -1, - 2, 32, 0, 17, -1, 1, 16 -}; - -static short tab13[] = -{ --509,-503,-475,-405,-333,-265,-205,-153,-115, -83, -53, -35, -21, -13, -9, - -7, -5, -3, -1, 254, 252, 253, 237, 255, -1, 239, 223, -3, -1, 238, - 207, -1, 222, 191, -9, -3, -1, 251, 206, -1, 220, -1, 175, 233, -1, - 236, 221, -9, -5, -3, -1, 250, 205, 190, -1, 235, 159, -3, -1, 249, - 234, -1, 189, 219, -17, -9, -3, -1, 143, 248, -1, 204, -1, 174, 158, - -5, -1, 142, -1, 127, 126, 247, -5, -1, 218, -1, 173, 188, -3, -1, - 203, 246, 111, -15, -7, -3, -1, 232, 95, -1, 157, 217, -3, -1, 245, - 231, -1, 172, 187, -9, -3, -1, 79, 244, -3, -1, 202, 230, 243, -1, - 63, -1, 141, 216, -21, -9, -3, -1, 47, 242, -3, -1, 110, 156, 15, - -5, -3, -1, 201, 94, 171, -3, -1, 125, 215, 78, -11, -5, -3, -1, - 200, 214, 62, -1, 185, -1, 155, 170, -1, 31, 241, -23, -13, -5, -1, - 240, -1, 186, 229, -3, -1, 228, 140, -1, 109, 227, -5, -1, 226, -1, - 46, 14, -1, 30, 225, -15, -7, -3, -1, 224, 93, -1, 213, 124, -3, - -1, 199, 77, -1, 139, 184, -7, -3, -1, 212, 154, -1, 169, 108, -1, - 198, 61, -37, -21, -9, -5, -3, -1, 211, 123, 45, -1, 210, 29, -5, - -1, 183, -1, 92, 197, -3, -1, 153, 122, 195, -7, -5, -3, -1, 167, - 151, 75, 209, -3, -1, 13, 208, -1, 138, 168, -11, -7, -3, -1, 76, - 196, -1, 107, 182, -1, 60, 44, -3, -1, 194, 91, -3, -1, 181, 137, - 28, -43, -23, -11, -5, -1, 193, -1, 152, 12, -1, 192, -1, 180, 106, - -5, -3, -1, 166, 121, 59, -1, 179, -1, 136, 90, -11, -5, -1, 43, - -1, 165, 105, -1, 164, -1, 120, 135, -5, -1, 148, -1, 119, 118, 178, - -11, -3, -1, 27, 177, -3, -1, 11, 176, -1, 150, 74, -7, -3, -1, - 58, 163, -1, 89, 149, -1, 42, 162, -47, -23, -9, -3, -1, 26, 161, - -3, -1, 10, 104, 160, -5, -3, -1, 134, 73, 147, -3, -1, 57, 88, - -1, 133, 103, -9, -3, -1, 41, 146, -3, -1, 87, 117, 56, -5, -1, - 131, -1, 102, 71, -3, -1, 116, 86, -1, 101, 115, -11, -3, -1, 25, - 145, -3, -1, 9, 144, -1, 72, 132, -7, -5, -1, 114, -1, 70, 100, - 40, -1, 130, 24, -41, -27, -11, -5, -3, -1, 55, 39, 23, -1, 113, - -1, 85, 7, -7, -3, -1, 112, 54, -1, 99, 69, -3, -1, 84, 38, - -1, 98, 53, -5, -1, 129, -1, 8, 128, -3, -1, 22, 97, -1, 6, - 96, -13, -9, -5, -3, -1, 83, 68, 37, -1, 82, 5, -1, 21, 81, - -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, -19, -11, - -5, -1, 65, -1, 4, 64, -3, -1, 35, 50, 19, -3, -1, 49, 3, - -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, - 0 -}; - -static short tab15[] = -{ --495,-445,-355,-263,-183,-115, -77, -43, -27, -13, -7, -3, -1, 255, 239, - -1, 254, 223, -1, 238, -1, 253, 207, -7, -3, -1, 252, 222, -1, 237, - 191, -1, 251, -1, 206, 236, -7, -3, -1, 221, 175, -1, 250, 190, -3, - -1, 235, 205, -1, 220, 159, -15, -7, -3, -1, 249, 234, -1, 189, 219, - -3, -1, 143, 248, -1, 204, 158, -7, -3, -1, 233, 127, -1, 247, 173, - -3, -1, 218, 188, -1, 111, -1, 174, 15, -19, -11, -3, -1, 203, 246, - -3, -1, 142, 232, -1, 95, 157, -3, -1, 245, 126, -1, 231, 172, -9, - -3, -1, 202, 187, -3, -1, 217, 141, 79, -3, -1, 244, 63, -1, 243, - 216, -33, -17, -9, -3, -1, 230, 47, -1, 242, -1, 110, 240, -3, -1, - 31, 241, -1, 156, 201, -7, -3, -1, 94, 171, -1, 186, 229, -3, -1, - 125, 215, -1, 78, 228, -15, -7, -3, -1, 140, 200, -1, 62, 109, -3, - -1, 214, 227, -1, 155, 185, -7, -3, -1, 46, 170, -1, 226, 30, -5, - -1, 225, -1, 14, 224, -1, 93, 213, -45, -25, -13, -7, -3, -1, 124, - 199, -1, 77, 139, -1, 212, -1, 184, 154, -7, -3, -1, 169, 108, -1, - 198, 61, -1, 211, 210, -9, -5, -3, -1, 45, 13, 29, -1, 123, 183, - -5, -1, 209, -1, 92, 208, -1, 197, 138, -17, -7, -3, -1, 168, 76, - -1, 196, 107, -5, -1, 182, -1, 153, 12, -1, 60, 195, -9, -3, -1, - 122, 167, -1, 166, -1, 192, 11, -1, 194, -1, 44, 91, -55, -29, -15, - -7, -3, -1, 181, 28, -1, 137, 152, -3, -1, 193, 75, -1, 180, 106, - -5, -3, -1, 59, 121, 179, -3, -1, 151, 136, -1, 43, 90, -11, -5, - -1, 178, -1, 165, 27, -1, 177, -1, 176, 105, -7, -3, -1, 150, 74, - -1, 164, 120, -3, -1, 135, 58, 163, -17, -7, -3, -1, 89, 149, -1, - 42, 162, -3, -1, 26, 161, -3, -1, 10, 160, 104, -7, -3, -1, 134, - 73, -1, 148, 57, -5, -1, 147, -1, 119, 9, -1, 88, 133, -53, -29, - -13, -7, -3, -1, 41, 103, -1, 118, 146, -1, 145, -1, 25, 144, -7, - -3, -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 71, -7, - -3, -1, 40, 130, -1, 24, 129, -7, -3, -1, 116, 8, -1, 128, 86, - -3, -1, 101, 55, -1, 115, 70, -17, -7, -3, -1, 39, 114, -1, 100, - 23, -3, -1, 85, 113, -3, -1, 7, 112, 54, -7, -3, -1, 99, 69, - -1, 84, 38, -3, -1, 98, 22, -3, -1, 6, 96, 53, -33, -19, -9, - -5, -1, 97, -1, 83, 68, -1, 37, 82, -3, -1, 21, 81, -3, -1, - 5, 80, 52, -7, -3, -1, 67, 36, -1, 66, 51, -1, 65, -1, 20, - 4, -9, -3, -1, 35, 50, -3, -1, 64, 3, 19, -3, -1, 49, 48, - 34, -9, -7, -3, -1, 18, 33, -1, 2, 32, 17, -3, -1, 1, 16, - 0 -}; - -static short tab16[] = -{ --509,-503,-461,-323,-103, -37, -27, -15, -7, -3, -1, 239, 254, -1, 223, - 253, -3, -1, 207, 252, -1, 191, 251, -5, -1, 175, -1, 250, 159, -3, - -1, 249, 248, 143, -7, -3, -1, 127, 247, -1, 111, 246, 255, -9, -5, - -3, -1, 95, 245, 79, -1, 244, 243, -53, -1, 240, -1, 63, -29, -19, - -13, -7, -5, -1, 206, -1, 236, 221, 222, -1, 233, -1, 234, 217, -1, - 238, -1, 237, 235, -3, -1, 190, 205, -3, -1, 220, 219, 174, -11, -5, - -1, 204, -1, 173, 218, -3, -1, 126, 172, 202, -5, -3, -1, 201, 125, - 94, 189, 242, -93, -5, -3, -1, 47, 15, 31, -1, 241, -49, -25, -13, - -5, -1, 158, -1, 188, 203, -3, -1, 142, 232, -1, 157, 231, -7, -3, - -1, 187, 141, -1, 216, 110, -1, 230, 156, -13, -7, -3, -1, 171, 186, - -1, 229, 215, -1, 78, -1, 228, 140, -3, -1, 200, 62, -1, 109, -1, - 214, 155, -19, -11, -5, -3, -1, 185, 170, 225, -1, 212, -1, 184, 169, - -5, -1, 123, -1, 183, 208, 227, -7, -3, -1, 14, 224, -1, 93, 213, - -3, -1, 124, 199, -1, 77, 139, -75, -45, -27, -13, -7, -3, -1, 154, - 108, -1, 198, 61, -3, -1, 92, 197, 13, -7, -3, -1, 138, 168, -1, - 153, 76, -3, -1, 182, 122, 60, -11, -5, -3, -1, 91, 137, 28, -1, - 192, -1, 152, 121, -1, 226, -1, 46, 30, -15, -7, -3, -1, 211, 45, - -1, 210, 209, -5, -1, 59, -1, 151, 136, 29, -7, -3, -1, 196, 107, - -1, 195, 167, -1, 44, -1, 194, 181, -23, -13, -7, -3, -1, 193, 12, - -1, 75, 180, -3, -1, 106, 166, 179, -5, -3, -1, 90, 165, 43, -1, - 178, 27, -13, -5, -1, 177, -1, 11, 176, -3, -1, 105, 150, -1, 74, - 164, -5, -3, -1, 120, 135, 163, -3, -1, 58, 89, 42, -97, -57, -33, - -19, -11, -5, -3, -1, 149, 104, 161, -3, -1, 134, 119, 148, -5, -3, - -1, 73, 87, 103, 162, -5, -1, 26, -1, 10, 160, -3, -1, 57, 147, - -1, 88, 133, -9, -3, -1, 41, 146, -3, -1, 118, 9, 25, -5, -1, - 145, -1, 144, 72, -3, -1, 132, 117, -1, 56, 131, -21, -11, -5, -3, - -1, 102, 40, 130, -3, -1, 71, 116, 24, -3, -1, 129, 128, -3, -1, - 8, 86, 55, -9, -5, -1, 115, -1, 101, 70, -1, 39, 114, -5, -3, - -1, 100, 85, 7, 23, -23, -13, -5, -1, 113, -1, 112, 54, -3, -1, - 99, 69, -1, 84, 38, -3, -1, 98, 22, -1, 97, -1, 6, 96, -9, - -5, -1, 83, -1, 53, 68, -1, 37, 82, -1, 81, -1, 21, 5, -33, - -23, -13, -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, - -5, -1, 65, -1, 4, 64, -1, 35, 50, -3, -1, 19, 49, -3, -1, - 3, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, - 0 -}; - -static short tab24[] = -{ --451,-117, -43, -25, -15, -7, -3, -1, 239, 254, -1, 223, 253, -3, -1, - 207, 252, -1, 191, 251, -5, -1, 250, -1, 175, 159, -1, 249, 248, -9, - -5, -3, -1, 143, 127, 247, -1, 111, 246, -3, -1, 95, 245, -1, 79, - 244, -71, -7, -3, -1, 63, 243, -1, 47, 242, -5, -1, 241, -1, 31, - 240, -25, -9, -1, 15, -3, -1, 238, 222, -1, 237, 206, -7, -3, -1, - 236, 221, -1, 190, 235, -3, -1, 205, 220, -1, 174, 234, -15, -7, -3, - -1, 189, 219, -1, 204, 158, -3, -1, 233, 173, -1, 218, 188, -7, -3, - -1, 203, 142, -1, 232, 157, -3, -1, 217, 126, -1, 231, 172, 255,-235, --143, -77, -45, -25, -15, -7, -3, -1, 202, 187, -1, 141, 216, -5, -3, - -1, 14, 224, 13, 230, -5, -3, -1, 110, 156, 201, -1, 94, 186, -9, - -5, -1, 229, -1, 171, 125, -1, 215, 228, -3, -1, 140, 200, -3, -1, - 78, 46, 62, -15, -7, -3, -1, 109, 214, -1, 227, 155, -3, -1, 185, - 170, -1, 226, 30, -7, -3, -1, 225, 93, -1, 213, 124, -3, -1, 199, - 77, -1, 139, 184, -31, -15, -7, -3, -1, 212, 154, -1, 169, 108, -3, - -1, 198, 61, -1, 211, 45, -7, -3, -1, 210, 29, -1, 123, 183, -3, - -1, 209, 92, -1, 197, 138, -17, -7, -3, -1, 168, 153, -1, 76, 196, - -3, -1, 107, 182, -3, -1, 208, 12, 60, -7, -3, -1, 195, 122, -1, - 167, 44, -3, -1, 194, 91, -1, 181, 28, -57, -35, -19, -7, -3, -1, - 137, 152, -1, 193, 75, -5, -3, -1, 192, 11, 59, -3, -1, 176, 10, - 26, -5, -1, 180, -1, 106, 166, -3, -1, 121, 151, -3, -1, 160, 9, - 144, -9, -3, -1, 179, 136, -3, -1, 43, 90, 178, -7, -3, -1, 165, - 27, -1, 177, 105, -1, 150, 164, -17, -9, -5, -3, -1, 74, 120, 135, - -1, 58, 163, -3, -1, 89, 149, -1, 42, 162, -7, -3, -1, 161, 104, - -1, 134, 119, -3, -1, 73, 148, -1, 57, 147, -63, -31, -15, -7, -3, - -1, 88, 133, -1, 41, 103, -3, -1, 118, 146, -1, 25, 145, -7, -3, - -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 40, -17, -7, - -3, -1, 130, 24, -1, 71, 116, -5, -1, 129, -1, 8, 128, -1, 86, - 101, -7, -5, -1, 23, -1, 7, 112, 115, -3, -1, 55, 39, 114, -15, - -7, -3, -1, 70, 100, -1, 85, 113, -3, -1, 54, 99, -1, 69, 84, - -7, -3, -1, 38, 98, -1, 22, 97, -5, -3, -1, 6, 96, 53, -1, - 83, 68, -51, -37, -23, -15, -9, -3, -1, 37, 82, -1, 21, -1, 5, - 80, -1, 81, -1, 52, 67, -3, -1, 36, 66, -1, 51, 20, -9, -5, - -1, 65, -1, 4, 64, -1, 35, 50, -1, 19, 49, -7, -5, -3, -1, - 3, 48, 34, 18, -1, 33, -1, 2, 32, -3, -1, 17, 1, -1, 16, - 0 -}; - -static short tab_c0[] = -{ - -29, -21, -13, -7, -3, -1, 11, 15, -1, 13, 14, -3, -1, 7, 5, - 9, -3, -1, 6, 3, -1, 10, 12, -3, -1, 2, 1, -1, 4, 8, - 0 -}; - -static short tab_c1[] = -{ - -15, -7, -3, -1, 15, 14, -1, 13, 12, -3, -1, 11, 10, -1, 9, - 8, -7, -3, -1, 7, 6, -1, 5, 4, -3, -1, 3, 2, -1, 1, - 0 -}; - - - -static struct newhuff ht[] = -{ - { /* 0 */ 0 , tab0 } , - { /* 2 */ 0 , tab1 } , - { /* 3 */ 0 , tab2 } , - { /* 3 */ 0 , tab3 } , - { /* 0 */ 0 , tab0 } , - { /* 4 */ 0 , tab5 } , - { /* 4 */ 0 , tab6 } , - { /* 6 */ 0 , tab7 } , - { /* 6 */ 0 , tab8 } , - { /* 6 */ 0 , tab9 } , - { /* 8 */ 0 , tab10 } , - { /* 8 */ 0 , tab11 } , - { /* 8 */ 0 , tab12 } , - { /* 16 */ 0 , tab13 } , - { /* 0 */ 0 , tab0 } , - { /* 16 */ 0 , tab15 } , - - { /* 16 */ 1 , tab16 } , - { /* 16 */ 2 , tab16 } , - { /* 16 */ 3 , tab16 } , - { /* 16 */ 4 , tab16 } , - { /* 16 */ 6 , tab16 } , - { /* 16 */ 8 , tab16 } , - { /* 16 */ 10, tab16 } , - { /* 16 */ 13, tab16 } , - { /* 16 */ 4 , tab24 } , - { /* 16 */ 5 , tab24 } , - { /* 16 */ 6 , tab24 } , - { /* 16 */ 7 , tab24 } , - { /* 16 */ 8 , tab24 } , - { /* 16 */ 9 , tab24 } , - { /* 16 */ 11, tab24 } , - { /* 16 */ 13, tab24 } -}; - -static struct newhuff htc[] = -{ - { /* 1 , 1 , */ 0 , tab_c0 } , - { /* 1 , 1 , */ 0 , tab_c1 } -}; - - diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/interface.c b/src/add-ons/media/plugins/mp3_decoder/mpglib/interface.c deleted file mode 100644 index fa29fe09e7..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/interface.c +++ /dev/null @@ -1,222 +0,0 @@ -#include -#include - -#include "mpg123.h" -#include "mpglib.h" - -void InitMpgLib(void) -{ - make_decode_tables(32767); - init_layer2(); - init_layer3(SBLIMIT); -} - -void InitMP3(struct mpstr *mp) -{ - memset(mp,0,sizeof(struct mpstr)); - - mp->framesize = 0; - mp->fsizeold = -1; - mp->bsize = 0; - mp->head = mp->tail = NULL; - mp->fr.single = -1; - mp->bsnum = 0; - mp->synth_bo = 1; - mp->bitindex = 0; - mp->wordpointer = 0; -} - -void ExitMP3(struct mpstr *mp) -{ - struct buf *b,*bn; - - b = mp->tail; - while(b) { - free(b->pnt); - bn = b->next; - free(b); - b = bn; - } -} - -static struct buf *addbuf(struct mpstr *mp,char *buf,int size) -{ - struct buf *nbuf; - - nbuf = malloc( sizeof(struct buf) ); - if(!nbuf) { - fprintf(stderr,"Out of memory!\n"); - return NULL; - } - nbuf->pnt = malloc(size); - if(!nbuf->pnt) { - free(nbuf); - return NULL; - } - nbuf->size = size; - memcpy(nbuf->pnt,buf,size); - nbuf->next = NULL; - nbuf->prev = mp->head; - nbuf->pos = 0; - - if(!mp->tail) { - mp->tail = nbuf; - } - else { - mp->head->next = nbuf; - } - - mp->head = nbuf; - mp->bsize += size; - - return nbuf; -} - -static void remove_buf(struct mpstr *mp) -{ - struct buf *buf = mp->tail; - - mp->tail = buf->next; - if(mp->tail) - mp->tail->prev = NULL; - else { - mp->tail = mp->head = NULL; - } - - free(buf->pnt); - free(buf); - -} - -static int read_buf_byte(struct mpstr *mp) -{ - unsigned int b; - - int pos; - - if(!mp->tail) { - fprintf(stderr,"Fatal error!\n"); - return 0; - } - - pos = mp->tail->pos; - while(pos >= mp->tail->size) { - remove_buf(mp); - if(!mp->tail) { - fprintf(stderr,"Fatal error!\n"); - return 0; - } - pos = mp->tail->pos; - } - - b = mp->tail->pnt[pos]; - mp->bsize--; - mp->tail->pos++; - - - return b; -} - -static void read_head(struct mpstr *mp) -{ - unsigned long head; - - head = read_buf_byte(mp); - head <<= 8; - head |= read_buf_byte(mp); - head <<= 8; - head |= read_buf_byte(mp); - head <<= 8; - head |= read_buf_byte(mp); - - mp->header = head; -} - -int decodeMP3(struct mpstr *mp,char *in,int isize,char *out, - int osize,int *done) -{ - int len; - - if(osize < 4608) { - fprintf(stderr,"To less out space\n"); - return MP3_ERR; - } - - if(in) { - if(addbuf(mp,in,isize) == NULL) { - return MP3_ERR; - } - } - - /* First decode header */ - if(mp->framesize == 0) { - if(mp->bsize < 4) { - return MP3_NEED_MORE; - } - read_head(mp); - if (decode_header(&mp->fr,mp->header) == 0) - return MP3_ERR; - mp->framesize = mp->fr.framesize; - } - - if(mp->fr.framesize > mp->bsize) - return MP3_NEED_MORE; - - mp->wordpointer = mp->bsspace[mp->bsnum] + 512; - mp->bsnum = (mp->bsnum + 1) & 0x1; - mp->bitindex = 0; - - len = 0; - while(len < mp->framesize) { - int nlen; - int blen = mp->tail->size - mp->tail->pos; - if( (mp->framesize - len) <= blen) { - nlen = mp->framesize-len; - } - else { - nlen = blen; - } - memcpy(mp->wordpointer+len,mp->tail->pnt+mp->tail->pos,nlen); - len += nlen; - mp->tail->pos += nlen; - mp->bsize -= nlen; - if(mp->tail->pos == mp->tail->size) { - remove_buf(mp); - } - } - - *done = 0; - if(mp->fr.error_protection) - getbits(mp, 16); - switch(mp->fr.lay) { - case 1: - do_layer1(mp, &mp->fr,(unsigned char *) out,done); - break; - case 2: - do_layer2(mp, &mp->fr,(unsigned char *) out,done); - break; - case 3: - do_layer3(mp, &mp->fr,(unsigned char *) out,done); - break; - } - - mp->fsizeold = mp->framesize; - mp->framesize = 0; - - return MP3_OK; -} - -int set_pointer(struct mpstr *mp, long backstep) -{ - unsigned char *bsbufold; - if(mp->fsizeold < 0 && backstep > 0) { - fprintf(stderr,"Can't step back %ld!\n",backstep); - return MP3_ERR; - } - bsbufold = mp->bsspace[mp->bsnum] + 512; - mp->wordpointer -= backstep; - if (backstep) - memcpy(mp->wordpointer,bsbufold+mp->fsizeold-backstep,backstep); - mp->bitindex = 0; - return MP3_OK; -} diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/l2tables.h b/src/add-ons/media/plugins/mp3_decoder/mpglib/l2tables.h deleted file mode 100644 index 06d21353b7..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/l2tables.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Layer 2 Alloc tables .. - * most other tables are calculated on program start (which is (of course) - * not ISO-conform) .. - * Layer-3 huffman table is in huffman.h - */ - -struct al_table -{ - short bits; - short d; -}; - -struct al_table alloc_0[] = { - {4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511}, - {11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767}, - {4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511}, - {11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767}, - {4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511}, - {11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767} }; - -struct al_table alloc_1[] = { - {4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511}, - {11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767}, - {4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511}, - {11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767}, - {4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511}, - {11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767}, - {2,0},{5,3},{7,5},{16,-32767} }; - -struct al_table alloc_2[] = { - {4,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255}, - {10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383}, - {4,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255}, - {10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63} }; - -struct al_table alloc_3[] = { - {4,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255}, - {10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383}, - {4,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255}, - {10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63} }; - -struct al_table alloc_4[] = { - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191}, - {4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127}, - {9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9}, - {2,0},{5,3},{7,5},{10,9} }; - diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/layer1.c b/src/add-ons/media/plugins/mp3_decoder/mpglib/layer1.c deleted file mode 100644 index eb144f69eb..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/layer1.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Mpeg Layer-1 audio decoder - * -------------------------- - * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README' - * near unoptimzed ... - * - * may have a few bugs after last optimization ... - * - */ - -#include "mpg123.h" - -void I_step_one(struct mpstr *mp, unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],struct frame *fr); -void I_step_two(struct mpstr *mp, real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT], - unsigned int scale_index[2][SBLIMIT],struct frame *fr); - -void I_step_one(struct mpstr *mp, unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],struct frame *fr) -{ - unsigned int *ba=balloc; - unsigned int *sca = (unsigned int *) scale_index; - - if(fr->stereo == 2) { - int i; - int jsbound = fr->jsbound; - for (i=0;istereo) { - int jsbound = fr->jsbound; - register real *f0 = fraction[0]; - register real *f1 = fraction[1]; - ba = balloc; - for (sample=smpb,i=0;istereo; - unsigned int balloc[2*SBLIMIT]; - unsigned int scale_index[2][SBLIMIT]; - real fraction[2][SBLIMIT]; - int single = fr->single; - - fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32; - - if(stereo == 1 || single == 3) - single = 0; - - I_step_one(mp, balloc,scale_index,fr); - - for (i=0;i= 0) { - clip += synth_1to1_mono(mp, (real*)fraction[single],pcm_sample,pcm_point); - } - else { - int p1 = *pcm_point; - clip += synth_1to1(mp, (real*)fraction[0],0,pcm_sample,&p1); - clip += synth_1to1(mp, (real*)fraction[1],1,pcm_sample,pcm_point); - } - } - - return clip; -} - - diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/layer2.c b/src/add-ons/media/plugins/mp3_decoder/mpglib/layer2.c deleted file mode 100644 index 3f5dbc897c..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/layer2.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Mpeg Layer-2 audio decoder - * -------------------------- - * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README' - * - */ - -#include "mpg123.h" -#include "l2tables.h" - -static int grp_3tab[32 * 3] = { 0, }; /* used: 27 */ -static int grp_5tab[128 * 3] = { 0, }; /* used: 125 */ -static int grp_9tab[1024 * 3] = { 0, }; /* used: 729 */ - -real muls[27][64]; /* also used by layer 1 */ - -void II_step_one(struct mpstr *mp, unsigned int *bit_alloc,int *scale,struct frame *fr); -void II_step_two(struct mpstr *mp, unsigned int *bit_alloc,real fraction[2][4][SBLIMIT],int *scale,struct frame *fr,int x1); - -void init_layer2(void) -{ - static double mulmul[27] = { - 0.0 , -2.0/3.0 , 2.0/3.0 , - 2.0/7.0 , 2.0/15.0 , 2.0/31.0, 2.0/63.0 , 2.0/127.0 , 2.0/255.0 , - 2.0/511.0 , 2.0/1023.0 , 2.0/2047.0 , 2.0/4095.0 , 2.0/8191.0 , - 2.0/16383.0 , 2.0/32767.0 , 2.0/65535.0 , - -4.0/5.0 , -2.0/5.0 , 2.0/5.0, 4.0/5.0 , - -8.0/9.0 , -4.0/9.0 , -2.0/9.0 , 2.0/9.0 , 4.0/9.0 , 8.0/9.0 }; - static int base[3][9] = { - { 1 , 0, 2 , } , - { 17, 18, 0 , 19, 20 , } , - { 21, 1, 22, 23, 0, 24, 25, 2, 26 } }; - int i,j,k,l,len; - real *table; - static int tablen[3] = { 3 , 5 , 9 }; - static int *itable,*tables[3] = { grp_3tab , grp_5tab , grp_9tab }; - - for(i=0;i<3;i++) - { - itable = tables[i]; - len = tablen[i]; - for(j=0;jstereo-1; - int sblimit = fr->II_sblimit; - int jsbound = fr->jsbound; - int sblimit2 = fr->II_sblimit<alloc; - int i; - unsigned int scfsi_buf[64]; - unsigned int *scfsi,*bita; - int sc,step; - - bita = bit_alloc; - if(stereo) - { - for (i=jsbound;i;i--,alloc1+=(1<bits); - *bita++ = (char) getbits(mp, step); - } - for (i=sblimit-jsbound;i;i--,alloc1+=(1<bits); - bita[1] = bita[0]; - bita+=2; - } - bita = bit_alloc; - scfsi=scfsi_buf; - for (i=sblimit2;i;i--) - if (*bita++) - *scfsi++ = (char) getbits_fast(mp, 2); - } - else /* mono */ - { - for (i=sblimit;i;i--,alloc1+=(1<bits); - bita = bit_alloc; - scfsi=scfsi_buf; - for (i=sblimit;i;i--) - if (*bita++) - *scfsi++ = (char) getbits_fast(mp, 2); - } - - bita = bit_alloc; - scfsi=scfsi_buf; - for (i=sblimit2;i;i--) - if (*bita++) - switch (*scfsi++) - { - case 0: - *scale++ = getbits_fast(mp, 6); - *scale++ = getbits_fast(mp, 6); - *scale++ = getbits_fast(mp, 6); - break; - case 1 : - *scale++ = sc = getbits_fast(mp, 6); - *scale++ = sc; - *scale++ = getbits_fast(mp, 6); - break; - case 2: - *scale++ = sc = getbits_fast(mp, 6); - *scale++ = sc; - *scale++ = sc; - break; - default: /* case 3 */ - *scale++ = getbits_fast(mp, 6); - *scale++ = sc = getbits_fast(mp, 6); - *scale++ = sc; - break; - } - -} - -void II_step_two(struct mpstr *mp, unsigned int *bit_alloc,real fraction[2][4][SBLIMIT],int *scale,struct frame *fr,int x1) -{ - int i,j,k,ba; - int stereo = fr->stereo; - int sblimit = fr->II_sblimit; - int jsbound = fr->jsbound; - struct al_table *alloc2,*alloc1 = fr->alloc; - unsigned int *bita=bit_alloc; - int d1,step; - - for (i=0;ibits; - for (j=0;jbits; - if( (d1=alloc2->d) < 0) - { - real cm=muls[k][scale[x1]]; - fraction[j][0][i] = ((real) ((int)getbits(mp, k) + d1)) * cm; - fraction[j][1][i] = ((real) ((int)getbits(mp, k) + d1)) * cm; - fraction[j][2][i] = ((real) ((int)getbits(mp, k) + d1)) * cm; - } - else - { - static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab }; - unsigned int idx,*tab,m=scale[x1]; - idx = (unsigned int) getbits(mp, k); - tab = (unsigned int *) (table[d1] + idx + idx + idx); - fraction[j][0][i] = muls[*tab++][m]; - fraction[j][1][i] = muls[*tab++][m]; - fraction[j][2][i] = muls[*tab][m]; - } - scale+=3; - } - else - fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0; - } - } - - for (i=jsbound;ibits; - bita++; /* channel 1 and channel 2 bitalloc are the same */ - if ( (ba=*bita++) ) - { - k=(alloc2 = alloc1+ba)->bits; - if( (d1=alloc2->d) < 0) - { - real cm; - cm=muls[k][scale[x1+3]]; - fraction[1][0][i] = (fraction[0][0][i] = (real) ((int)getbits(mp, k) + d1) ) * cm; - fraction[1][1][i] = (fraction[0][1][i] = (real) ((int)getbits(mp, k) + d1) ) * cm; - fraction[1][2][i] = (fraction[0][2][i] = (real) ((int)getbits(mp, k) + d1) ) * cm; - cm=muls[k][scale[x1]]; - fraction[0][0][i] *= cm; fraction[0][1][i] *= cm; fraction[0][2][i] *= cm; - } - else - { - static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab }; - unsigned int idx,*tab,m1,m2; - m1 = scale[x1]; m2 = scale[x1+3]; - idx = (unsigned int) getbits(mp, k); - tab = (unsigned int *) (table[d1] + idx + idx + idx); - fraction[0][0][i] = muls[*tab][m1]; fraction[1][0][i] = muls[*tab++][m2]; - fraction[0][1][i] = muls[*tab][m1]; fraction[1][1][i] = muls[*tab++][m2]; - fraction[0][2][i] = muls[*tab][m1]; fraction[1][2][i] = muls[*tab][m2]; - } - scale+=6; - } - else { - fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] = - fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0.0; - } -/* - should we use individual scalefac for channel 2 or - is the current way the right one , where we just copy channel 1 to - channel 2 ?? - The current 'strange' thing is, that we throw away the scalefac - values for the second channel ...!! --> changed .. now we use the scalefac values of channel one !! -*/ - } - - for(i=sblimit;ilsf) - table = 4; - else - table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index]; - sblim = sblims[table]; - - fr->alloc = tables[table]; - fr->II_sblimit = sblim; -} - -int do_layer2(struct mpstr *mp, struct frame *fr,unsigned char *pcm_sample,int *pcm_point) -{ - int clip=0; - int i,j; - int stereo = fr->stereo; - real fraction[2][4][SBLIMIT]; /* pick_table clears unused subbands */ - unsigned int bit_alloc[64]; - int scale[192]; - int single = fr->single; - - II_select_table(fr); - fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? - (fr->mode_ext<<2)+4 : fr->II_sblimit; - - if (fr->jsbound > fr->II_sblimit) { - fprintf(stderr, "libmpg123 layer2: Truncating stereo boundary to sideband limit.\n"); - fr->jsbound=fr->II_sblimit; - } - - if(stereo == 1 || single == 3) - single = 0; - - II_step_one(mp, bit_alloc, scale, fr); - - for (i=0;i>2); - for (j=0;j<3;j++) { - if(single >= 0) { - clip += synth_1to1_mono(mp, fraction[0][j],pcm_sample,pcm_point); - } - else { - int p1 = *pcm_point; - clip += synth_1to1(mp, fraction[0][j],0,pcm_sample,&p1); - clip += synth_1to1(mp, fraction[1][j],1,pcm_sample,pcm_point); - } - - } - } - - return clip; -} - - diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/layer3.c b/src/add-ons/media/plugins/mp3_decoder/mpglib/layer3.c deleted file mode 100644 index 2a4d0098e5..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/layer3.c +++ /dev/null @@ -1,1989 +0,0 @@ -/* - * Mpeg Layer-3 audio decoder - * -------------------------- - * copyright (c) 1995,1996,1997 by Michael Hipp. - * All rights reserved. See also 'README' - */ - -#include -#include "mpg123.h" -#include "mpglib.h" -#include "huffman.h" - -static real ispow[8207]; -static real aa_ca[8],aa_cs[8]; -static real COS1[12][6]; -static real win[4][36]; -static real win1[4][36]; -static real gainpow2[256+118+4]; -static real COS9[9]; -static real COS6_1,COS6_2; -static real tfcos36[9]; -static real tfcos12[3]; - -struct bandInfoStruct { - short longIdx[23]; - short longDiff[22]; - short shortIdx[14]; - short shortDiff[13]; -}; - -int longLimit[9][23]; -int shortLimit[9][14]; - -struct bandInfoStruct bandInfo[9] = { - -/* MPEG 1.0 */ - { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576}, - {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158}, - {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3}, - {4,4,4,4,6,8,10,12,14,18,22,30,56} } , - - { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576}, - {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192}, - {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3}, - {4,4,4,4,6,6,10,12,14,16,20,26,66} } , - - { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} , - {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} , - {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} , - {4,4,4,4,6,8,12,16,20,26,34,42,12} } , - -/* MPEG 2.0 */ - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , - {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , - {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , - - { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, - {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36 } , - {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} , - {4,4,4,6,8,10,12,14,18,24,32,44,12 } } , - - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 }, - {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3}, - {4,4,4,6,8,10,12,14,18,24,30,40,18 } } , -/* MPEG 2.5 */ - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, - {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, - {4,4,4,6,8,10,12,14,18,24,30,40,18} }, - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, - {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, - {4,4,4,6,8,10,12,14,18,24,30,40,18} }, - { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}, - {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2}, - {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576}, - {8,8,8,12,16,20,24,28,36,2,2,2,26} } , -}; - -static int mapbuf0[9][152]; -static int mapbuf1[9][156]; -static int mapbuf2[9][44]; -static int *map[9][3]; -static int *mapend[9][3]; - -static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */ -static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */ - -static real tan1_1[16],tan2_1[16],tan1_2[16],tan2_2[16]; -static real pow1_1[2][16],pow2_1[2][16],pow1_2[2][16],pow2_2[2][16]; - -/* - * init tables for layer-3 - */ -void init_layer3(int down_sample_sblimit) -{ - int i,j,k,l; - - for(i=-256;i<118+4;i++) - gainpow2[i+256] = pow((double)2.0,-0.25 * (double) (i+210) ); - - for(i=0;i<8207;i++) - ispow[i] = pow((double)i,(double)4.0/3.0); - - for (i=0;i<8;i++) - { - static double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037}; - double sq=sqrt(1.0+Ci[i]*Ci[i]); - aa_cs[i] = 1.0/sq; - aa_ca[i] = Ci[i]/sq; - } - - for(i=0;i<18;i++) - { - win[0][i] = win[1][i] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+0) +1) ) / cos ( M_PI * (double) (2*(i+0) +19) / 72.0 ); - win[0][i+18] = win[3][i+18] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+18)+1) ) / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 ); - } - for(i=0;i<6;i++) - { - win[1][i+18] = 0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 ); - win[3][i+12] = 0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 ); - win[1][i+24] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 ); - win[1][i+30] = win[3][i] = 0.0; - win[3][i+6 ] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 ); - } - - for(i=0;i<9;i++) - COS9[i] = cos( M_PI / 18.0 * (double) i); - - for(i=0;i<9;i++) - tfcos36[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 36.0 ); - for(i=0;i<3;i++) - tfcos12[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 12.0 ); - - COS6_1 = cos( M_PI / 6.0 * (double) 1); - COS6_2 = cos( M_PI / 6.0 * (double) 2); - - for(i=0;i<12;i++) - { - win[2][i] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 ); - for(j=0;j<6;j++) - COS1[i][j] = cos( M_PI / 24.0 * (double) ((2*i+7)*(2*j+1)) ); - } - - for(j=0;j<4;j++) { - static int len[4] = { 36,36,12,36 }; - for(i=0;i 0) { - if( i & 1 ) - p1 = pow(base,(i+1.0)*0.5); - else - p2 = pow(base,i*0.5); - } - pow1_1[j][i] = p1; - pow2_1[j][i] = p2; - pow1_2[j][i] = M_SQRT2 * p1; - pow2_2[j][i] = M_SQRT2 * p2; - } - } - - for(j=0;j<9;j++) - { - struct bandInfoStruct *bi = &bandInfo[j]; - int *mp; - int cb,lwin; - short *bdf; - - mp = map[j][0] = mapbuf0[j]; - bdf = bi->longDiff; - for(i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++) { - *mp++ = (*bdf) >> 1; - *mp++ = i; - *mp++ = 3; - *mp++ = cb; - } - bdf = bi->shortDiff+3; - for(cb=3;cb<13;cb++) { - int l = (*bdf++) >> 1; - for(lwin=0;lwin<3;lwin++) { - *mp++ = l; - *mp++ = i + lwin; - *mp++ = lwin; - *mp++ = cb; - } - i += 6*l; - } - mapend[j][0] = mp; - - mp = map[j][1] = mapbuf1[j]; - bdf = bi->shortDiff+0; - for(i=0,cb=0;cb<13;cb++) { - int l = (*bdf++) >> 1; - for(lwin=0;lwin<3;lwin++) { - *mp++ = l; - *mp++ = i + lwin; - *mp++ = lwin; - *mp++ = cb; - } - i += 6*l; - } - mapend[j][1] = mp; - - mp = map[j][2] = mapbuf2[j]; - bdf = bi->longDiff; - for(cb = 0; cb < 22 ; cb++) { - *mp++ = (*bdf++) >> 1; - *mp++ = cb; - } - mapend[j][2] = mp; - - } - - for(j=0;j<9;j++) { - for(i=0;i<23;i++) { - longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1; - if(longLimit[j][i] > (down_sample_sblimit) ) - longLimit[j][i] = down_sample_sblimit; - } - for(i=0;i<14;i++) { - shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1; - if(shortLimit[j][i] > (down_sample_sblimit) ) - shortLimit[j][i] = down_sample_sblimit; - } - } - - for(i=0;i<5;i++) { - for(j=0;j<6;j++) { - for(k=0;k<6;k++) { - int n = k + j * 6 + i * 36; - i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12); - } - } - } - for(i=0;i<4;i++) { - for(j=0;j<4;j++) { - for(k=0;k<4;k++) { - int n = k + j * 4 + i * 16; - i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12); - } - } - } - for(i=0;i<4;i++) { - for(j=0;j<3;j++) { - int n = j + i * 3; - i_slen2[n+244] = i|(j<<3) | (5<<12); - n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15); - } - } - - for(i=0;i<5;i++) { - for(j=0;j<5;j++) { - for(k=0;k<4;k++) { - for(l=0;l<4;l++) { - int n = l + k * 4 + j * 16 + i * 80; - n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12); - } - } - } - } - for(i=0;i<5;i++) { - for(j=0;j<5;j++) { - for(k=0;k<4;k++) { - int n = k + j * 4 + i * 20; - n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12); - } - } - } -} - -/* - * read additional side information - */ -static int III_get_side_info_1(struct mpstr *mp, struct III_sideinfo *si, int stereo, - int ms_stereo,long sfreq,int single) -{ - int ch, gr; - int powdiff = (single == 3) ? 4 : 0; - - si->main_data_begin = getbits(mp, 9); - if (stereo == 1) - si->private_bits = getbits_fast(mp, 5); - else - si->private_bits = getbits_fast(mp, 3); - - for (ch=0; chch[ch].gr[0].scfsi = -1; - si->ch[ch].gr[1].scfsi = getbits_fast(mp, 4); - } - - for (gr=0; gr<2; gr++) - { - for (ch=0; chch[ch].gr[gr]); - - gr_info->part2_3_length = getbits(mp, 12); - gr_info->big_values = getbits_fast(mp, 9); - if(gr_info->big_values > 288) { - fprintf(stderr,"big_values too large!\n"); - gr_info->big_values = 288; - } - gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff; - if(ms_stereo) - gr_info->pow2gain += 2; - gr_info->scalefac_compress = getbits_fast(mp, 4); -/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ - if(get1bit(mp)) - { - int i; - gr_info->block_type = getbits_fast(mp, 2); - gr_info->mixed_block_flag = get1bit(mp); - gr_info->table_select[0] = getbits_fast(mp, 5); - gr_info->table_select[1] = getbits_fast(mp, 5); - /* - * table_select[2] not needed, because there is no region2, - * but to satisfy some verifications tools we set it either. - */ - gr_info->table_select[2] = 0; - for(i=0;i<3;i++) - gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3); - - if(gr_info->block_type == 0) { - fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n"); - return 0; - } - /* region_count/start parameters are implicit in this case. */ - gr_info->region1start = 36>>1; - gr_info->region2start = 576>>1; - } - else - { - int i,r0c,r1c; - for (i=0; i<3; i++) - gr_info->table_select[i] = getbits_fast(mp, 5); - r0c = getbits_fast(mp, 4); - r1c = getbits_fast(mp, 3); - gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; - gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; - gr_info->block_type = 0; - gr_info->mixed_block_flag = 0; - } - gr_info->preflag = get1bit(mp); - gr_info->scalefac_scale = get1bit(mp); - gr_info->count1table_select = get1bit(mp); - } - } - return !0; -} - -/* - * Side Info for MPEG 2.0 / LSF - */ -static int III_get_side_info_2(struct mpstr *mp, struct III_sideinfo *si,int stereo, - int ms_stereo,long sfreq,int single) -{ - int ch; - int powdiff = (single == 3) ? 4 : 0; - - si->main_data_begin = getbits(mp, 8); - if (stereo == 1) - si->private_bits = get1bit(mp); - else - si->private_bits = getbits_fast(mp, 2); - - for (ch=0; chch[ch].gr[0]); - - gr_info->part2_3_length = getbits(mp, 12); - gr_info->big_values = getbits_fast(mp, 9); - if(gr_info->big_values > 288) { - fprintf(stderr,"big_values too large!\n"); - gr_info->big_values = 288; - } - gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff; - if(ms_stereo) - gr_info->pow2gain += 2; - gr_info->scalefac_compress = getbits(mp, 9); -/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ - if(get1bit(mp)) - { - int i; - gr_info->block_type = getbits_fast(mp, 2); - gr_info->mixed_block_flag = get1bit(mp); - gr_info->table_select[0] = getbits_fast(mp, 5); - gr_info->table_select[1] = getbits_fast(mp, 5); - /* - * table_select[2] not needed, because there is no region2, - * but to satisfy some verifications tools we set it either. - */ - gr_info->table_select[2] = 0; - for(i=0;i<3;i++) - gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3); - - if(gr_info->block_type == 0) { - fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n"); - return 0; - } - /* region_count/start parameters are implicit in this case. */ -/* check this again! */ - if(gr_info->block_type == 2) - gr_info->region1start = 36>>1; - else if(sfreq == 8) -/* check this for 2.5 and sfreq=8 */ - gr_info->region1start = 108>>1; - else - gr_info->region1start = 54>>1; - gr_info->region2start = 576>>1; - } - else - { - int i,r0c,r1c; - for (i=0; i<3; i++) - gr_info->table_select[i] = getbits_fast(mp, 5); - r0c = getbits_fast(mp, 4); - r1c = getbits_fast(mp, 3); - gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; - gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; - gr_info->block_type = 0; - gr_info->mixed_block_flag = 0; - } - gr_info->scalefac_scale = get1bit(mp); - gr_info->count1table_select = get1bit(mp); - } - return !0; -} - -/* - * read scalefactors - */ -static int III_get_scale_factors_1(struct mpstr *mp, int *scf,struct gr_info_s *gr_info) -{ - static const unsigned char slen[2][16] = { - {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4}, - {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3} - }; - int numbits; - int num0 = slen[0][gr_info->scalefac_compress]; - int num1 = slen[1][gr_info->scalefac_compress]; - - if (gr_info->block_type == 2) { - int i=18; - numbits = (num0 + num1) * 18; - - if (gr_info->mixed_block_flag) { - for (i=8;i;i--) - *scf++ = getbits_fast(mp, num0); - i = 9; - numbits -= num0; /* num0 * 17 + num1 * 18 */ - } - - for (;i;i--) - *scf++ = getbits_fast(mp, num0); - for (i = 18; i; i--) - *scf++ = getbits_fast(mp, num1); - *scf++ = 0; *scf++ = 0; *scf++ = 0; /* short[13][0..2] = 0 */ - } - else { - int i; - int scfsi = gr_info->scfsi; - - if(scfsi < 0) { /* scfsi < 0 => granule == 0 */ - for(i=11;i;i--) - *scf++ = getbits_fast(mp, num0); - for(i=10;i;i--) - *scf++ = getbits_fast(mp, num1); - numbits = (num0 + num1) * 10 + num0; - *scf++ = 0; - } - else { - numbits = 0; - if(!(scfsi & 0x8)) { - for (i=0;i<6;i++) - *scf++ = getbits_fast(mp, num0); - numbits += num0 * 6; - } - else { - scf += 6; - } - - if(!(scfsi & 0x4)) { - for (i=0;i<5;i++) - *scf++ = getbits_fast(mp, num0); - numbits += num0 * 5; - } - else { - scf += 5; - } - - if(!(scfsi & 0x2)) { - for(i=0;i<5;i++) - *scf++ = getbits_fast(mp, num1); - numbits += num1 * 5; - } - else { - scf += 5; - } - - if(!(scfsi & 0x1)) { - for (i=0;i<5;i++) - *scf++ = getbits_fast(mp, num1); - numbits += num1 * 5; - } - else { - scf += 5; - } - *scf++ = 0; /* no l[21] in original sources */ - } - } - return numbits; -} - - -static int III_get_scale_factors_2(struct mpstr *mp, int *scf,struct gr_info_s *gr_info,int i_stereo) -{ - unsigned char *pnt; - int i,j; - unsigned int slen; - int n = 0; - int numbits = 0; - - static unsigned char stab[3][6][4] = { - { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} , - { 7, 7, 7,0 } , { 6, 6, 6,3 } , { 8, 8,5,0} } , - { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} , - {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } , - { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} , - { 6,15,12,0 } , { 6,12, 9,6 } , { 6,18,9,0} } }; - - if(i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */ - slen = i_slen2[gr_info->scalefac_compress>>1]; - else - slen = n_slen2[gr_info->scalefac_compress]; - - gr_info->preflag = (slen>>15) & 0x1; - - n = 0; - if( gr_info->block_type == 2 ) { - n++; - if(gr_info->mixed_block_flag) - n++; - } - - pnt = stab[n][(slen>>12)&0x7]; - - for(i=0;i<4;i++) { - int num = slen & 0x7; - slen >>= 3; - if(num) { - for(j=0;j<(int)(pnt[i]);j++) - *scf++ = getbits_fast(mp, num); - numbits += pnt[i] * num; - } - else { - for(j=0;j<(int)(pnt[i]);j++) - *scf++ = 0; - } - } - - n = (n << 1) + 1; - for(i=0;iscalefac_scale; - real *xrpnt = (real *) xr; - int l[3],l3; - int part2remain = gr_info->part2_3_length - part2bits; - int *me; - - { - int bv = gr_info->big_values; - int region1 = gr_info->region1start; - int region2 = gr_info->region2start; - - l3 = ((576>>1)-bv)>>1; -/* - * we may lose the 'odd' bit here !! - * check this later again - */ - if(bv <= region1) { - l[0] = bv; l[1] = 0; l[2] = 0; - } - else { - l[0] = region1; - if(bv <= region2) { - l[1] = bv - l[0]; l[2] = 0; - } - else { - l[1] = region2 - l[0]; l[2] = bv - region2; - } - } - } - - if(gr_info->block_type == 2) { - /* - * decoding with short or mixed mode BandIndex table - */ - int i,max[4]; - int step=0,lwin=0,cb=0; - register real v = 0.0; - register int *m,mc; - - if(gr_info->mixed_block_flag) { - max[3] = -1; - max[0] = max[1] = max[2] = 2; - m = map[sfreq][0]; - me = mapend[sfreq][0]; - } - else { - max[0] = max[1] = max[2] = max[3] = -1; - /* max[3] not really needed in this case */ - m = map[sfreq][1]; - me = mapend[sfreq][1]; - } - - mc = 0; - for(i=0;i<2;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - for(;lp;lp--,mc--) { - register int x,y; - if( (!mc) ) { - mc = *m++; - xrpnt = ((real *) xr) + (*m++); - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit(mp)) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if(x == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - x += getbits(mp, h->linbits); - if(get1bit(mp)) - *xrpnt = -ispow[x] * v; - else - *xrpnt = ispow[x] * v; - } - else if(x) { - max[lwin] = cb; - if(get1bit(mp)) - *xrpnt = -ispow[x] * v; - else - *xrpnt = ispow[x] * v; - part2remain--; - } - else - *xrpnt = 0.0; - xrpnt += step; - if(y == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - y += getbits(mp, h->linbits); - if(get1bit(mp)) - *xrpnt = -ispow[y] * v; - else - *xrpnt = ispow[y] * v; - } - else if(y) { - max[lwin] = cb; - if(get1bit(mp)) - *xrpnt = -ispow[y] * v; - else - *xrpnt = ispow[y] * v; - part2remain--; - } - else - *xrpnt = 0.0; - xrpnt += step; - } - } - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit(mp)) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr) + (*m++); - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - mc--; - } - if( (a & (0x8>>i)) ) { - max[lwin] = cb; - part2remain--; - if(part2remain < 0) { - part2remain++; - break; - } - if(get1bit(mp)) - *xrpnt = -v; - else - *xrpnt = v; - } - else - *xrpnt = 0.0; - xrpnt += step; - } - } - - while( m < me ) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr) + *m++; - if( (*m++) == 3) - step = 1; - else - step = 3; - m++; /* cb */ - } - mc--; - *xrpnt = 0.0; - xrpnt += step; - *xrpnt = 0.0; - xrpnt += step; -/* we could add a little opt. here: - * if we finished a band for window 3 or a long band - * further bands could copied in a simple loop without a - * special 'map' decoding - */ - } - - gr_info->maxband[0] = max[0]+1; - gr_info->maxband[1] = max[1]+1; - gr_info->maxband[2] = max[2]+1; - gr_info->maxbandl = max[3]+1; - - { - int rmax = max[0] > max[1] ? max[0] : max[1]; - rmax = (rmax > max[2] ? rmax : max[2]) + 1; - gr_info->maxb = rmax ? shortLimit[sfreq][rmax] : longLimit[sfreq][max[3]+1]; - } - - } - else { - /* - * decoding with 'long' BandIndex table (block_type != 2) - */ - int *pretab = gr_info->preflag ? pretab1 : pretab2; - int i,max = -1; - int cb = 0; - register int *m = map[sfreq][2]; - register real v = 0.0; - register int mc = 0; -#if 0 - me = mapend[sfreq][2]; -#endif - - /* - * long hash table values - */ - for(i=0;i<3;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - - for(;lp;lp--,mc--) { - int x,y; - - if(!mc) { - mc = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - cb = *m++; - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit(mp)) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if (x == 15) { - max = cb; - part2remain -= h->linbits+1; - x += getbits(mp, h->linbits); - if(get1bit(mp)) - *xrpnt++ = -ispow[x] * v; - else - *xrpnt++ = ispow[x] * v; - } - else if(x) { - max = cb; - if(get1bit(mp)) - *xrpnt++ = -ispow[x] * v; - else - *xrpnt++ = ispow[x] * v; - part2remain--; - } - else - *xrpnt++ = 0.0; - - if (y == 15) { - max = cb; - part2remain -= h->linbits+1; - y += getbits(mp, h->linbits); - if(get1bit(mp)) - *xrpnt++ = -ispow[y] * v; - else - *xrpnt++ = ispow[y] * v; - } - else if(y) { - max = cb; - if(get1bit(mp)) - *xrpnt++ = -ispow[y] * v; - else - *xrpnt++ = ispow[y] * v; - part2remain--; - } - else - *xrpnt++ = 0.0; - } - } - - /* - * short (count1table) values - */ - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit(mp)) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - cb = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - } - mc--; - } - if ( (a & (0x8>>i)) ) { - max = cb; - part2remain--; - if(part2remain < 0) { - part2remain++; - break; - } - if(get1bit(mp)) - *xrpnt++ = -v; - else - *xrpnt++ = v; - } - else - *xrpnt++ = 0.0; - } - } - - /* - * zero part - */ - for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--) { - *xrpnt++ = 0.0; - *xrpnt++ = 0.0; - } - - gr_info->maxbandl = max+1; - gr_info->maxb = longLimit[sfreq][gr_info->maxbandl]; - } - - while( part2remain > 16 ) { - getbits(mp, 16); /* Dismiss stuffing Bits */ - part2remain -= 16; - } - if(part2remain > 0) - getbits(mp, part2remain); - else if(part2remain < 0) { - fprintf(stderr,"mpg123: Can't rewind stream by %d bits!\n",-part2remain); - return 1; /* -> error */ - } - return 0; -} - -#if 0 -static int III_dequantize_sample_ms(real xr[2][SBLIMIT][SSLIMIT],int *scf, - struct gr_info_s *gr_info,int sfreq,int part2bits) -{ - int shift = 1 + gr_info->scalefac_scale; - real *xrpnt = (real *) xr[1]; - real *xr0pnt = (real *) xr[0]; - int l[3],l3; - int part2remain = gr_info->part2_3_length - part2bits; - int *me; - - { - int bv = gr_info->big_values; - int region1 = gr_info->region1start; - int region2 = gr_info->region2start; - - l3 = ((576>>1)-bv)>>1; -/* - * we may lose the 'odd' bit here !! - * check this later gain - */ - if(bv <= region1) { - l[0] = bv; l[1] = 0; l[2] = 0; - } - else { - l[0] = region1; - if(bv <= region2) { - l[1] = bv - l[0]; l[2] = 0; - } - else { - l[1] = region2 - l[0]; l[2] = bv - region2; - } - } - } - - if(gr_info->block_type == 2) { - int i,max[4]; - int step=0,lwin=0,cb=0; - register real v = 0.0; - register int *m,mc = 0; - - if(gr_info->mixed_block_flag) { - max[3] = -1; - max[0] = max[1] = max[2] = 2; - m = map[sfreq][0]; - me = mapend[sfreq][0]; - } - else { - max[0] = max[1] = max[2] = max[3] = -1; - /* max[3] not really needed in this case */ - m = map[sfreq][1]; - me = mapend[sfreq][1]; - } - - for(i=0;i<2;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - for(;lp;lp--,mc--) { - int x,y; - - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr[1]) + *m; - xr0pnt = ((real *) xr[0]) + *m++; - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit()) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if(x == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - x += getbits(h->linbits); - if(get1bit()) { - real a = ispow[x] * v; - *xrpnt = *xr0pnt + a; - *xr0pnt -= a; - } - else { - real a = ispow[x] * v; - *xrpnt = *xr0pnt - a; - *xr0pnt += a; - } - } - else if(x) { - max[lwin] = cb; - if(get1bit()) { - real a = ispow[x] * v; - *xrpnt = *xr0pnt + a; - *xr0pnt -= a; - } - else { - real a = ispow[x] * v; - *xrpnt = *xr0pnt - a; - *xr0pnt += a; - } - part2remain--; - } - else - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; - - if(y == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - y += getbits(h->linbits); - if(get1bit()) { - real a = ispow[y] * v; - *xrpnt = *xr0pnt + a; - *xr0pnt -= a; - } - else { - real a = ispow[y] * v; - *xrpnt = *xr0pnt - a; - *xr0pnt += a; - } - } - else if(y) { - max[lwin] = cb; - if(get1bit()) { - real a = ispow[y] * v; - *xrpnt = *xr0pnt + a; - *xr0pnt -= a; - } - else { - real a = ispow[y] * v; - *xrpnt = *xr0pnt - a; - *xr0pnt += a; - } - part2remain--; - } - else - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; - } - } - - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit()) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr[1]) + *m; - xr0pnt = ((real *) xr[0]) + *m++; - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - mc--; - } - if( (a & (0x8>>i)) ) { - max[lwin] = cb; - part2remain--; - if(part2remain < 0) { - part2remain++; - break; - } - if(get1bit()) { - *xrpnt = *xr0pnt + v; - *xr0pnt -= v; - } - else { - *xrpnt = *xr0pnt - v; - *xr0pnt += v; - } - } - else - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; - } - } - - while( m < me ) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr[1]) + *m; - xr0pnt = ((real *) xr[0]) + *m++; - if(*m++ == 3) - step = 1; - else - step = 3; - m++; /* cb */ - } - mc--; - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; -/* we could add a little opt. here: - * if we finished a band for window 3 or a long band - * further bands could copied in a simple loop without a - * special 'map' decoding - */ - } - - gr_info->maxband[0] = max[0]+1; - gr_info->maxband[1] = max[1]+1; - gr_info->maxband[2] = max[2]+1; - gr_info->maxbandl = max[3]+1; - - { - int rmax = max[0] > max[1] ? max[0] : max[1]; - rmax = (rmax > max[2] ? rmax : max[2]) + 1; - gr_info->maxb = rmax ? shortLimit[sfreq][rmax] : longLimit[sfreq][max[3]+1]; - } - } - else { - int *pretab = gr_info->preflag ? pretab1 : pretab2; - int i,max = -1; - int cb = 0; - register int mc=0,*m = map[sfreq][2]; - register real v = 0.0; -#if 0 - me = mapend[sfreq][2]; -#endif - - for(i=0;i<3;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - - for(;lp;lp--,mc--) { - int x,y; - if(!mc) { - mc = *m++; - cb = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit()) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if (x == 15) { - max = cb; - part2remain -= h->linbits+1; - x += getbits(h->linbits); - if(get1bit()) { - real a = ispow[x] * v; - *xrpnt++ = *xr0pnt + a; - *xr0pnt++ -= a; - } - else { - real a = ispow[x] * v; - *xrpnt++ = *xr0pnt - a; - *xr0pnt++ += a; - } - } - else if(x) { - max = cb; - if(get1bit()) { - real a = ispow[x] * v; - *xrpnt++ = *xr0pnt + a; - *xr0pnt++ -= a; - } - else { - real a = ispow[x] * v; - *xrpnt++ = *xr0pnt - a; - *xr0pnt++ += a; - } - part2remain--; - } - else - *xrpnt++ = *xr0pnt++; - - if (y == 15) { - max = cb; - part2remain -= h->linbits+1; - y += getbits(h->linbits); - if(get1bit()) { - real a = ispow[y] * v; - *xrpnt++ = *xr0pnt + a; - *xr0pnt++ -= a; - } - else { - real a = ispow[y] * v; - *xrpnt++ = *xr0pnt - a; - *xr0pnt++ += a; - } - } - else if(y) { - max = cb; - if(get1bit()) { - real a = ispow[y] * v; - *xrpnt++ = *xr0pnt + a; - *xr0pnt++ -= a; - } - else { - real a = ispow[y] * v; - *xrpnt++ = *xr0pnt - a; - *xr0pnt++ += a; - } - part2remain--; - } - else - *xrpnt++ = *xr0pnt++; - } - } - - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit()) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - cb = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - } - mc--; - } - if ( (a & (0x8>>i)) ) { - max = cb; - part2remain--; - if(part2remain <= 0) { - part2remain++; - break; - } - if(get1bit()) { - *xrpnt++ = *xr0pnt + v; - *xr0pnt++ -= v; - } - else { - *xrpnt++ = *xr0pnt - v; - *xr0pnt++ += v; - } - } - else - *xrpnt++ = *xr0pnt++; - } - } - for(i=(&xr[1][SBLIMIT][0]-xrpnt)>>1;i;i--) { - *xrpnt++ = *xr0pnt++; - *xrpnt++ = *xr0pnt++; - } - - gr_info->maxbandl = max+1; - gr_info->maxb = longLimit[sfreq][gr_info->maxbandl]; - } - - while ( part2remain > 16 ) { - getbits(16); /* Dismiss stuffing Bits */ - part2remain -= 16; - } - if(part2remain > 0 ) - getbits(part2remain); - else if(part2remain < 0) { - fprintf(stderr,"mpg123_ms: Can't rewind stream by %d bits!\n",-part2remain); - return 1; /* -> error */ - } - return 0; -} -#endif - -/* - * III_stereo: calculate real channel values for Joint-I-Stereo-mode - */ -static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac, - struct gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf) -{ - real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf; - struct bandInfoStruct *bi = &bandInfo[sfreq]; - real *tab1,*tab2; - - if(lsf) { - int p = gr_info->scalefac_compress & 0x1; - if(ms_stereo) { - tab1 = pow1_2[p]; tab2 = pow2_2[p]; - } - else { - tab1 = pow1_1[p]; tab2 = pow2_1[p]; - } - } - else { - if(ms_stereo) { - tab1 = tan1_2; tab2 = tan2_2; - } - else { - tab1 = tan1_1; tab2 = tan2_1; - } - } - - if (gr_info->block_type == 2) - { - int lwin,do_l = 0; - if( gr_info->mixed_block_flag ) - do_l = 1; - - for (lwin=0;lwin<3;lwin++) /* process each window */ - { - /* get first band with zero values */ - int is_p,sb,idx,sfb = gr_info->maxband[lwin]; /* sfb is minimal 3 for mixed mode */ - if(sfb > 3) - do_l = 0; - - for(;sfb<12;sfb++) - { - is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ - if(is_p != 7) { - real t1,t2; - sb = bi->shortDiff[sfb]; - idx = bi->shortIdx[sfb] + lwin; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for (; sb > 0; sb--,idx+=3) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - } - -#if 1 -/* in the original: copy 10 to 11 , here: copy 11 to 12 -maybe still wrong??? (copy 12 to 13?) */ - is_p = scalefac[11*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ - sb = bi->shortDiff[12]; - idx = bi->shortIdx[12] + lwin; -#else - is_p = scalefac[10*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ - sb = bi->shortDiff[11]; - idx = bi->shortIdx[11] + lwin; -#endif - if(is_p != 7) - { - real t1,t2; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for ( ; sb > 0; sb--,idx+=3 ) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - } /* end for(lwin; .. ; . ) */ - - if (do_l) - { -/* also check l-part, if ALL bands in the three windows are 'empty' - * and mode = mixed_mode - */ - int sfb = gr_info->maxbandl; - int idx = bi->longIdx[sfb]; - - for ( ; sfb<8; sfb++ ) - { - int sb = bi->longDiff[sfb]; - int is_p = scalefac[sfb]; /* scale: 0-15 */ - if(is_p != 7) { - real t1,t2; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for ( ; sb > 0; sb--,idx++) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - else - idx += sb; - } - } - } - else /* ((gr_info->block_type != 2)) */ - { - int sfb = gr_info->maxbandl; - int is_p,idx = bi->longIdx[sfb]; - for ( ; sfb<21; sfb++) - { - int sb = bi->longDiff[sfb]; - is_p = scalefac[sfb]; /* scale: 0-15 */ - if(is_p != 7) { - real t1,t2; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for ( ; sb > 0; sb--,idx++) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - else - idx += sb; - } - - is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */ - if(is_p != 7) - { - int sb; - real t1 = tab1[is_p],t2 = tab2[is_p]; - - for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ ) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - } /* ... */ -} - -static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_info) -{ - int sblim; - - if(gr_info->block_type == 2) - { - if(!gr_info->mixed_block_flag) - return; - sblim = 1; - } - else { - sblim = gr_info->maxb-1; - } - - /* 31 alias-reduction operations between each pair of sub-bands */ - /* with 8 butterflies between each pair */ - - { - int sb; - real *xr1=(real *) xr[1]; - - for(sb=sblim;sb;sb--,xr1+=10) - { - int ss; - real *cs=aa_cs,*ca=aa_ca; - real *xr2 = xr1; - - for(ss=7;ss>=0;ss--) - { /* upper and lower butterfly inputs */ - register real bu = *--xr2,bd = *xr1; - *xr2 = (bu * (*cs) ) - (bd * (*ca) ); - *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) ); - } - } - } -} - -/* - DCT insipired by Jeff Tsay's DCT from the maplay package - this is an optimized version with manual unroll. - - References: - [1] S. Winograd: "On Computing the Discrete Fourier Transform", - Mathematics of Computation, Volume 32, Number 141, January 1978, - Pages 175-199 -*/ - -static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf) -{ - { - register real *in = inbuf; - - in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14]; - in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11]; - in[11]+=in[10]; in[10]+=in[9]; in[9] +=in[8]; - in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5]; - in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2]; - in[2] +=in[1]; in[1] +=in[0]; - - in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9]; - in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1]; - - - { - -#define MACRO0(v) { \ - real tmp; \ - out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \ - out2[8-(v)] = tmp * w[26-(v)]; } \ - sum0 -= sum1; \ - ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \ - ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; -#define MACRO1(v) { \ - real sum0,sum1; \ - sum0 = tmp1a + tmp2a; \ - sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \ - MACRO0(v); } -#define MACRO2(v) { \ - real sum0,sum1; \ - sum0 = tmp2a - tmp1a; \ - sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \ - MACRO0(v); } - - register const real *c = COS9; - register real *out2 = o2; - register real *w = wintab; - register real *out1 = o1; - register real *ts = tsbuf; - - real ta33,ta66,tb33,tb66; - - ta33 = in[2*3+0] * c[3]; - ta66 = in[2*6+0] * c[6]; - tb33 = in[2*3+1] * c[3]; - tb66 = in[2*6+1] * c[6]; - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7]; - tmp1b = in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7]; - tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8]; - tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8]; - - MACRO1(0); - MACRO2(8); - } - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3]; - tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3]; - tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0]; - tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1]; - - MACRO1(1); - MACRO2(7); - } - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1]; - tmp1b = in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1]; - tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4]; - tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4]; - - MACRO1(2); - MACRO2(6); - } - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5]; - tmp1b = in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5]; - tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2]; - tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2]; - - MACRO1(3); - MACRO2(5); - } - - { - real sum0,sum1; - sum0 = in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0]; - sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4]; - MACRO0(4); - } - } - - } -} - -/* - * new DCT12 - */ -static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts) -{ -#define DCT12_PART1 \ - in5 = in[5*3]; \ - in5 += (in4 = in[4*3]); \ - in4 += (in3 = in[3*3]); \ - in3 += (in2 = in[2*3]); \ - in2 += (in1 = in[1*3]); \ - in1 += (in0 = in[0*3]); \ - \ - in5 += in3; in3 += in1; \ - \ - in2 *= COS6_1; \ - in3 *= COS6_1; \ - -#define DCT12_PART2 \ - in0 += in4 * COS6_2; \ - \ - in4 = in0 + in2; \ - in0 -= in2; \ - \ - in1 += in5 * COS6_2; \ - \ - in5 = (in1 + in3) * tfcos12[0]; \ - in1 = (in1 - in3) * tfcos12[2]; \ - \ - in3 = in4 + in5; \ - in4 -= in5; \ - \ - in2 = in0 + in1; \ - in0 -= in1; - - - { - real in0,in1,in2,in3,in4,in5; - register real *out1 = rawout1; - ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2]; - ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5]; - - DCT12_PART1 - - { - real tmp0,tmp1 = (in0 - in4); - { - real tmp2 = (in1 - in5) * tfcos12[1]; - tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - } - ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1]; - ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1]; - ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1]; - ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1]; - } - - DCT12_PART2 - - ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0]; - ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0]; - ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2]; - ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2]; - - ts[(6+0)*SBLIMIT] = out1[6+0] + in0 * wi[0]; - ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0]; - ts[(6+2)*SBLIMIT] = out1[6+2] + in4 * wi[2]; - ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2]; - } - - in++; - - { - real in0,in1,in2,in3,in4,in5; - register real *out2 = rawout2; - - DCT12_PART1 - - { - real tmp0,tmp1 = (in0 - in4); - { - real tmp2 = (in1 - in5) * tfcos12[1]; - tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - } - out2[5-1] = tmp0 * wi[11-1]; - out2[0+1] = tmp0 * wi[6+1]; - ts[(12+1)*SBLIMIT] += tmp1 * wi[1]; - ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1]; - } - - DCT12_PART2 - - out2[5-0] = in2 * wi[11-0]; - out2[0+0] = in2 * wi[6+0]; - out2[0+2] = in3 * wi[6+2]; - out2[5-2] = in3 * wi[11-2]; - - ts[(12+0)*SBLIMIT] += in0 * wi[0]; - ts[(17-0)*SBLIMIT] += in0 * wi[5-0]; - ts[(12+2)*SBLIMIT] += in4 * wi[2]; - ts[(17-2)*SBLIMIT] += in4 * wi[5-2]; - } - - in++; - - { - real in0,in1,in2,in3,in4,in5; - register real *out2 = rawout2; - out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0; - - DCT12_PART1 - - { - real tmp0,tmp1 = (in0 - in4); - { - real tmp2 = (in1 - in5) * tfcos12[1]; - tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - } - out2[11-1] = tmp0 * wi[11-1]; - out2[6 +1] = tmp0 * wi[6+1]; - out2[0+1] += tmp1 * wi[1]; - out2[5-1] += tmp1 * wi[5-1]; - } - - DCT12_PART2 - - out2[11-0] = in2 * wi[11-0]; - out2[6 +0] = in2 * wi[6+0]; - out2[6 +2] = in3 * wi[6+2]; - out2[11-2] = in3 * wi[11-2]; - - out2[0+0] += in0 * wi[0]; - out2[5-0] += in0 * wi[5-0]; - out2[0+2] += in4 * wi[2]; - out2[5-2] += in4 * wi[5-2]; - } -} - -/* - * III_hybrid - */ -static void III_hybrid(struct mpstr *mp, real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT], - int ch,struct gr_info_s *gr_info) -{ - real *tspnt = (real *) tsOut; - real (*block)[2][SBLIMIT*SSLIMIT] = mp->hybrid_block; - int *blc = mp->hybrid_blc; - real *rawout1,*rawout2; - int bt; - int sb = 0; - - { - int b = blc[ch]; - rawout1=block[b][ch]; - b=-b+1; - rawout2=block[b][ch]; - blc[ch] = b; - } - - - if(gr_info->mixed_block_flag) { - sb = 2; - dct36(fsIn[0],rawout1,rawout2,win[0],tspnt); - dct36(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1); - rawout1 += 36; rawout2 += 36; tspnt += 2; - } - - bt = gr_info->block_type; - if(bt == 2) { - for (; sb<(int)gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) { - dct12(fsIn[sb],rawout1,rawout2,win[2],tspnt); - dct12(fsIn[sb+1],rawout1+18,rawout2+18,win1[2],tspnt+1); - } - } - else { - for (; sb<(int)gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) { - dct36(fsIn[sb],rawout1,rawout2,win[bt],tspnt); - dct36(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1); - } - } - - for(;sbstereo; - int single = fr->single; - int ms_stereo,i_stereo; - int sfreq = fr->sampling_frequency; - int stereo1,granules; - - if(stereo == 1) { /* stream is mono */ - stereo1 = 1; - single = 0; - } - else if(single >= 0) /* stream is stereo, but force to mono */ - stereo1 = 1; - else - stereo1 = 2; - - if(fr->mode == MPG_MD_JOINT_STEREO) { - ms_stereo = fr->mode_ext & 0x2; - i_stereo = fr->mode_ext & 0x1; - } - else - ms_stereo = i_stereo = 0; - - if(fr->lsf) { - granules = 1; - if(!III_get_side_info_2(mp, &sideinfo,stereo,ms_stereo,sfreq,single)) - return -1; - } - else { - granules = 2; - if(!III_get_side_info_1(mp, &sideinfo,stereo,ms_stereo,sfreq,single)) - return -1; - } - - if(set_pointer(mp, sideinfo.main_data_begin) == MP3_ERR) - return -1; - - for (gr=0;grlsf) - part2bits = III_get_scale_factors_2(mp, scalefacs[0],gr_info,0); - else { - part2bits = III_get_scale_factors_1(mp, scalefacs[0],gr_info); - } - if(III_dequantize_sample(mp, hybridIn[0], scalefacs[0],gr_info,sfreq,part2bits)) - return clip; - } - if(stereo == 2) { - struct gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]); - long part2bits; - if(fr->lsf) - part2bits = III_get_scale_factors_2(mp, scalefacs[1],gr_info,i_stereo); - else { - part2bits = III_get_scale_factors_1(mp, scalefacs[1],gr_info); - } - - if(III_dequantize_sample(mp, hybridIn[1],scalefacs[1],gr_info,sfreq,part2bits)) - return clip; - - if(ms_stereo) { - int i; - for(i=0;ilsf); - - if(ms_stereo || i_stereo || (single == 3) ) { - if(gr_info->maxb > sideinfo.ch[0].gr[gr].maxb) - sideinfo.ch[0].gr[gr].maxb = gr_info->maxb; - else - gr_info->maxb = sideinfo.ch[0].gr[gr].maxb; - } - - switch(single) { - case 3: - { - register int i; - register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1]; - for(i=0;i<(int)(SSLIMIT*gr_info->maxb);i++,in0++) - *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */ - } - break; - case 1: - { - register int i; - register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1]; - for(i=0;i<(int)(SSLIMIT*gr_info->maxb);i++) - *in0++ = *in1++; - } - break; - } - } - - for(ch=0;ch= 0) { - clip += synth_1to1_mono(mp, hybridOut[0][ss],pcm_sample,pcm_point); - } - else { - int p1 = *pcm_point; - clip += synth_1to1(mp, hybridOut[0][ss],0,pcm_sample,&p1); - clip += synth_1to1(mp, hybridOut[1][ss],1,pcm_sample,pcm_point); - } - } - } - - return clip; -} - - diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/mpg123.h b/src/add-ons/media/plugins/mp3_decoder/mpglib/mpg123.h deleted file mode 100644 index 4b5cdc11d9..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/mpg123.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef _MPG123_H -#define _MPG123_H - -#include -#include -#include -#include -#include - -#ifdef REAL_IS_FLOAT -# define real float -#elif defined(REAL_IS_LONG_DOUBLE) -# define real long double -#else -# define real double -#endif - -#ifdef __GNUC__ -#define INLINE inline -#else -#define INLINE -#endif - -/* AUDIOBUFSIZE = n*64 with n=1,2,3 ... */ -#define AUDIOBUFSIZE 16384 - -#define SBLIMIT 32 -#define SSLIMIT 18 - -#define SCALE_BLOCK 12 - -#define MPG_MD_STEREO 0 -#define MPG_MD_JOINT_STEREO 1 -#define MPG_MD_DUAL_CHANNEL 2 -#define MPG_MD_MONO 3 - -#define MAXFRAMESIZE 1792 - -struct mpstr; - -struct frame { - int stereo; - int jsbound; - int single; - int lsf; - int mpeg25; - int header_change; - int lay; - int error_protection; - int bitrate_index; - int sampling_frequency; - int padding; - int extension; - int mode; - int mode_ext; - int copyright; - int original; - int emphasis; - int framesize; /* computed framesize */ - - /* layer2 stuff */ - int II_sblimit; - void *alloc; -}; - -extern unsigned int get1bit(struct mpstr *mp); -extern unsigned int getbits(struct mpstr *mp, int); -extern unsigned int getbits_fast(struct mpstr *mp, int); -extern int set_pointer(struct mpstr *mp, long backstep); - -extern void make_decode_tables(long scaleval); -extern int do_layer3(struct mpstr *mp, struct frame *fr,unsigned char *,int *); -extern int do_layer2(struct mpstr *mp, struct frame *fr,unsigned char *,int *); -extern int do_layer1(struct mpstr *mp, struct frame *fr,unsigned char *,int *); -extern int decode_header(struct frame *fr,unsigned long newhead); - -struct gr_info_s { - int scfsi; - unsigned part2_3_length; - unsigned big_values; - unsigned scalefac_compress; - unsigned block_type; - unsigned mixed_block_flag; - unsigned table_select[3]; - unsigned subblock_gain[3]; - unsigned maxband[3]; - unsigned maxbandl; - unsigned maxb; - unsigned region1start; - unsigned region2start; - unsigned preflag; - unsigned scalefac_scale; - unsigned count1table_select; - real *full_gain[3]; - real *pow2gain; -}; - -struct III_sideinfo -{ - unsigned main_data_begin; - unsigned private_bits; - struct { - struct gr_info_s gr[2]; - } ch[2]; -}; - -extern int synth_1to1 (struct mpstr *mp, real *,int,unsigned char *,int *); -extern int synth_1to1_mono (struct mpstr *mp, real *,unsigned char *,int *); - -extern void init_layer3(int); -extern void init_layer2(void); -extern void make_decode_tables(long scale); -extern void dct64(real *,real *,real *); - -extern long freqs[9]; -extern real muls[27][64]; -extern real decwin[512+32]; -extern real *pnts[5]; - -#endif diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/mpglib.h b/src/add-ons/media/plugins/mp3_decoder/mpglib/mpglib.h deleted file mode 100644 index c3739e3195..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/mpglib.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef _MPGLIB_H -#define _MPGLIB_H - -#include "mpg123.h" - -struct buf { - unsigned char *pnt; - long size; - long pos; - struct buf *next; - struct buf *prev; -}; - -struct framebuf { - struct buf *buf; - long pos; - struct frame *next; - struct frame *prev; -}; - -struct mpstr { - struct buf *head,*tail; - int bsize; - int framesize; - int fsizeold; - struct frame fr; - unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */ - real hybrid_block[2][2][SBLIMIT*SSLIMIT]; - int hybrid_blc[2]; - unsigned long header; - int bsnum; - real synth_buffs[2][2][0x110]; - int synth_bo; - int bitindex; - unsigned char *wordpointer; -}; - -#define MP3_ERR -1 -#define MP3_OK 0 -#define MP3_NEED_MORE 1 - -#ifdef __cplusplus -extern "C" { -#endif - -void InitMpgLib(void); -void InitMP3(struct mpstr *mp); -int decodeMP3(struct mpstr *mp,char *inmemory,int inmemsize, - char *outmemory,int outmemsize,int *done); -void ExitMP3(struct mpstr *mp); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/add-ons/media/plugins/mp3_decoder/mpglib/tabinit.c b/src/add-ons/media/plugins/mp3_decoder/mpglib/tabinit.c deleted file mode 100644 index 2efd2cd048..0000000000 --- a/src/add-ons/media/plugins/mp3_decoder/mpglib/tabinit.c +++ /dev/null @@ -1,80 +0,0 @@ - -#include - -#include "mpg123.h" - -real decwin[512+32]; -static real cos64[16],cos32[8],cos16[4],cos8[2],cos4[1]; -real *pnts[] = { cos64,cos32,cos16,cos8,cos4 }; - -#if 0 -static unsigned char *conv16to8_buf = NULL; -unsigned char *conv16to8; -#endif - -static long intwinbase[] = { - 0, -1, -1, -1, -1, -1, -1, -2, -2, -2, - -2, -3, -3, -4, -4, -5, -5, -6, -7, -7, - -8, -9, -10, -11, -13, -14, -16, -17, -19, -21, - -24, -26, -29, -31, -35, -38, -41, -45, -49, -53, - -58, -63, -68, -73, -79, -85, -91, -97, -104, -111, - -117, -125, -132, -139, -147, -154, -161, -169, -176, -183, - -190, -196, -202, -208, -213, -218, -222, -225, -227, -228, - -228, -227, -224, -221, -215, -208, -200, -189, -177, -163, - -146, -127, -106, -83, -57, -29, 2, 36, 72, 111, - 153, 197, 244, 294, 347, 401, 459, 519, 581, 645, - 711, 779, 848, 919, 991, 1064, 1137, 1210, 1283, 1356, - 1428, 1498, 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962, - 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063, 2037, 2000, - 1952, 1893, 1822, 1739, 1644, 1535, 1414, 1280, 1131, 970, - 794, 605, 402, 185, -45, -288, -545, -814, -1095, -1388, - -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788, - -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209, - -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959, - -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092, - -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082, - -70, 998, 2122, 3300, 4533, 5818, 7154, 8540, 9975, 11455, - 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289, - 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617, - 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684, - 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835, - 73415, 73908, 74313, 74630, 74856, 74992, 75038 }; - -void make_decode_tables(long scaleval) -{ - int i,j,k,kr,divv; - real *table,*costab; - - - for(i=0;i<5;i++) - { - kr=0x10>>i; divv=0x40>>i; - costab = pnts[i]; - for(k=0;k -#include -#include -#include -#include -#include -#include -#include -#include "MP3ReaderPlugin.h" - -//#define TRACE_MP3_READER -#ifdef TRACE_MP3_READER - #define TRACE printf -#else - #define TRACE(a...) -#endif - -/* see - * http://www.dv.co.yu/mpgscript/mpeghdr.htm - * http://www.multiweb.cz/twoinches/MP3inside.htm - * http://www.id3.org/id3v2.3.0.txt - * http://www.id3.org/lyrics3.html - * http://www.id3.org/lyrics3200.html - */ - -// bit_rate_table[mpeg_version_index][layer_index][bitrate_index] -static const int bit_rate_table[4][4][16] = -{ - { // mpeg version 2.5 - { }, // undefined layer - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // layer 3 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // layer 2 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // layer 1 - }, - { // undefined version - { }, - { }, - { }, - { } - }, - { // mpeg version 2 - { }, - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } - }, - { // mpeg version 1 - { }, - { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 }, - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, - { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0} - } -}; - -// b_mpeg_id_table[mpeg_version_index][layer_index] -static const int32 b_mpeg_id_table[4][4] = -{ - { 0, B_MPEG_2_5_AUDIO_LAYER_3, B_MPEG_2_5_AUDIO_LAYER_2, B_MPEG_2_5_AUDIO_LAYER_1 }, - { 0, 0, 0, 0 }, - { 0, B_MPEG_2_AUDIO_LAYER_3, B_MPEG_2_AUDIO_LAYER_2, B_MPEG_2_AUDIO_LAYER_1 }, - { 0, B_MPEG_1_AUDIO_LAYER_3, B_MPEG_1_AUDIO_LAYER_2, B_MPEG_1_AUDIO_LAYER_1 }, -}; - -// frame_rate_table[mpeg_version_index][sampling_rate_index] -static const int frame_rate_table[4][4] = -{ - { 11025, 12000, 8000, 0}, // mpeg version 2.5 - { 0, 0, 0, 0 }, - { 22050, 24000, 16000, 0}, // mpeg version 2 - { 44100, 48000, 32000, 0} // mpeg version 1 -}; - -// name_table[mpeg_version_index][layer_index] -static const char * name_table[4][4] = -{ - { 0, "MPEG 2.5 Audio Layer 3", "MPEG 2.5 Audio Layer 2", "MPEG 2.5 Audio Layer 1" }, - { 0, 0, 0, 0 }, - { 0, "MPEG 2 Audio Layer 3", "MPEG 2 Audio Layer 2", "MPEG 2 Audio Layer 1" }, - { 0, "MPEG 1 Audio Layer 3", "MPEG 1 Audio Layer 2", "MPEG 1 Audio Layer 1" }, -}; - -// frame_sample_count_table[layer_index] -static const int frame_sample_count_table[4] = { 0, 1152, 1152, 384 }; - -static const size_t MAX_CHUNK_SIZE = 5200; - -struct mp3data -{ - int64 position; - char * chunkBuffer; - - int64 duration; // usec - - int32 framesPerFrame; // PCM frames in each mpeg frame - int64 frameCount; // PCM frames - int32 frameRate; - int64 framePosition; - - media_format format; -}; - -struct mp3Reader::xing_vbr_info -{ - int32 frameRate; - int64 encodedFramesCount; - int64 byteCount; - int32 vbrScale; - bool hasSeekpoints; - uint8 seekpoints[100]; - - int64 duration; // usec - int64 frameCount; // PCM frames -}; - -struct mp3Reader::fhg_vbr_info -{ - uint32 SampleRate; - char VbriSignature[4]; - uint16 VbriVersion; - uint16 VbriDelay; - uint16 VbriQuality; // Actually a float, convert on request - uint32 VbriStreamBytes; - uint32 VbriStreamFrames; - uint16 VbriTableSize; - uint16 VbriTableScale; - uint16 VbriEntryBytes; - uint16 VbriEntryFrames; - int *VbriTable; -}; - - -mp3Reader::mp3Reader() - : fXingVbrInfo(0), - fFhgVbrInfo(0) -{ - TRACE("mp3Reader::mp3Reader\n"); -} - - -mp3Reader::~mp3Reader() -{ - delete fXingVbrInfo; - delete fFhgVbrInfo; -} - - -const char * -mp3Reader::Copyright() -{ - return "mp3 reader, " B_UTF8_COPYRIGHT " by Marcus Overhagen"; -} - - -status_t -mp3Reader::Sniff(int32 *streamCount) -{ - TRACE("mp3Reader::Sniff\n"); - - fSeekableSource = dynamic_cast(Reader::Source()); - if (!fSeekableSource) { - TRACE("mp3Reader::Sniff: non seekable sources not supported\n"); - return B_ERROR; - } - - fFileSize = Source()->Seek(0, SEEK_END); - if (fFileSize < 0) { - TRACE("mp3Reader::Sniff: non seekable sources not supported\n"); - return B_ERROR; - } - TRACE("mp3Reader::Sniff: file size is %Ld bytes\n", fFileSize); - - if (!IsMp3File()) { - TRACE("mp3Reader::Sniff: not recognized as mp3 file\n"); - return B_ERROR; - } - - TRACE("mp3Reader::Sniff: looks like an mp3 file\n"); - - if (!ParseFile()) { - TRACE("mp3Reader::Sniff: parsing file failed\n"); - return B_ERROR; - } - - *streamCount = 1; - return B_OK; -} - - -void -mp3Reader::GetFileFormatInfo(media_file_format *mff) -{ - mff->capabilities = media_file_format::B_READABLE - | media_file_format::B_KNOWS_ENCODED_AUDIO - | media_file_format::B_IMPERFECTLY_SEEKABLE; - mff->family = B_MPEG_FORMAT_FAMILY; - mff->version = 100; - strcpy(mff->mime_type, "audio/mpeg"); - strcpy(mff->file_extension, "mp3"); - - uint8 header[4]; - Source()->ReadAt(fDataStart, header, sizeof(header)); - int mpeg_version_index = (header[1] >> 3) & 0x03; - int layer_index = (header[1] >> 1) & 0x03; - strcpy(mff->short_name, name_table[mpeg_version_index][layer_index]); - strcpy(mff->pretty_name, name_table[mpeg_version_index][layer_index]); - - TRACE("mp3Reader: %s\n", name_table[mpeg_version_index][layer_index]); -} - - -status_t -mp3Reader::AllocateCookie(int32 streamNumber, void **cookie) -{ - TRACE("mp3Reader::AllocateCookie\n"); - - mp3data *data = new mp3data; - data->chunkBuffer = new char[MAX_CHUNK_SIZE]; - data->position = 0; - - uint8 header[4]; - Source()->ReadAt(fDataStart, header, sizeof(header)); - int mpeg_version_index = (header[1] >> 3) & 0x03; - int layer_index = (header[1] >> 1) & 0x03; - - int bit_rate; - int frame_size; - - if (fXingVbrInfo && fXingVbrInfo->frameCount != -1 && fXingVbrInfo->duration != -1) { - TRACE("mp3Reader::AllocateCookie: using timing info from Xing VBR header\n"); - bit_rate = (fXingVbrInfo->byteCount * 8 * 1000000) / fXingVbrInfo->duration; // average bit rate - frame_size = fXingVbrInfo->byteCount / fXingVbrInfo->encodedFramesCount; // average frame size - data->duration = fXingVbrInfo->duration; - data->frameCount = fXingVbrInfo->frameCount; - data->frameRate = fXingVbrInfo->frameRate; - } else if (fFhgVbrInfo) { - TRACE("mp3Reader::AllocateCookie: using timing info from Fraunhofer VBR header\n"); - int sampling_rate_index = (header[2] >> 2) & 0x03; - uint32 SamplesPerFrame; - - fFhgVbrInfo->SampleRate = frame_rate_table[mpeg_version_index][sampling_rate_index]; - (fFhgVbrInfo->SampleRate >= 32000) ? (SamplesPerFrame = 1152) : (SamplesPerFrame = 576); - - data->duration = (int64)(((float)fFhgVbrInfo->VbriStreamFrames * (float)SamplesPerFrame) - / (float)fFhgVbrInfo->SampleRate * 1000000.0f); - - bit_rate = (fFhgVbrInfo->VbriStreamBytes * 8 * 1000000) / data->duration; // average bit rate - frame_size = fFhgVbrInfo->VbriStreamBytes / fFhgVbrInfo->VbriStreamFrames; // average frame size - data->frameCount = fFhgVbrInfo->VbriStreamFrames * SamplesPerFrame; - data->frameRate = fFhgVbrInfo->SampleRate; - } else { - TRACE("mp3Reader::AllocateCookie: assuming CBR, calculating timing info from file\n"); - int sampling_rate_index = (header[2] >> 2) & 0x03; - int bitrate_index = (header[2] >> 4) & 0x0f; - int samples_per_chunk = frame_sample_count_table[layer_index]; - bit_rate = 1000 * bit_rate_table[mpeg_version_index][layer_index][bitrate_index]; - frame_size = GetFrameLength(header); - data->frameRate = frame_rate_table[mpeg_version_index][sampling_rate_index]; - data->frameCount = samples_per_chunk * (fDataSize / frame_size); - data->duration = (data->frameCount * 1000000) / data->frameRate; - } - - TRACE("mp3Reader::AllocateCookie: frameRate %ld, frameCount %Ld, duration %.6f\n", - data->frameRate, data->frameCount, data->duration / 1000000.0); - - data->framePosition = 0; - data->framesPerFrame = frame_sample_count_table[layer_index]; - - media_format_description description; - description.family = B_MPEG_FORMAT_FAMILY; - description.u.mpeg.id = b_mpeg_id_table[mpeg_version_index][layer_index]; - - BMediaFormats formats; - status_t result = formats.InitCheck(); - if (result == B_OK) { - result = formats.GetFormatFor(description, &data->format); - } - if (result != B_OK) { - TRACE("mp3Reader::AllocateCookie: Unable to GetFormatFor mpeg description\n"); - // ignore error result, use default format - data->format.type = B_MEDIA_ENCODED_AUDIO; - data->format.user_data_type = B_CODEC_TYPE_INFO; - strncpy((char*)data->format.user_data, "mpeg", 4); - } - - data->format.u.encoded_audio.bit_rate = bit_rate; - data->format.u.encoded_audio.frame_size = frame_size; - - // store the cookie - *cookie = data; - return B_OK; -} - - -status_t -mp3Reader::FreeCookie(void *cookie) -{ - TRACE("mp3Reader::FreeCookie\n"); - mp3data *data = reinterpret_cast(cookie); - delete [] data->chunkBuffer; - delete data; - - return B_OK; -} - - -status_t -mp3Reader::GetStreamInfo(void *cookie, int64 *frameCount, bigtime_t *duration, - media_format *format, const void **infoBuffer, size_t *infoSize) -{ - mp3data *data = reinterpret_cast(cookie); - - *frameCount = data->frameCount; - *duration = data->duration; - *format = data->format; - *infoBuffer = 0; - *infoSize = 0; - return B_OK; -} - - -status_t -mp3Reader::Seek(void *cookie, - uint32 flags, - int64 *frame, bigtime_t *time) -{ - mp3data *data = reinterpret_cast(cookie); - - status_t result = CalculatePosition(cookie, flags, frame, time, &data->position); - - if (result == B_OK) { - data->framePosition = *frame; // this is not exact - TRACE("mp3Reader::Seek: synchronized at position %Ld\n", data->position); - } else { - TRACE("mp3Reader::Seek: failed to seek\n"); - } - - return result; -} - -status_t -mp3Reader::FindKeyFrame(void* cookie, uint32 flags, - int64* frame, bigtime_t* time) -{ - off_t pos; - - return CalculatePosition(cookie, flags, frame, time, &pos); -} - -status_t -mp3Reader::CalculatePosition(void* cookie, uint32 flags, - int64* frame, bigtime_t* time, off_t *position) { - - // Calculate the position within the file for the requested time or frame - if (!fSeekableSource) - return B_ERROR; - - mp3data *data = reinterpret_cast(cookie); - - int64 pos; - - // this isn't very accurate - if (flags & B_MEDIA_SEEK_TO_FRAME) { - pos = fXingVbrInfo ? XingSeekPoint(100.0 * *frame / (float)data->frameCount) : -1; - if (pos < 0) - pos = fFhgVbrInfo ? VBRISeekPoint(100.0 * *frame / (float)data->frameCount) : -1; - if (pos < 0) - pos = (*frame * fDataSize) / data->frameCount; - - *time = (*frame * data->duration) / data->frameCount; - TRACE("mp3Reader::CalculatePosition using frame %Ld gives time %Ld and pos %Ld\n", *frame, *time, pos); - } else if (flags & B_MEDIA_SEEK_TO_TIME) { - pos = fXingVbrInfo ? XingSeekPoint(100.0 * *time / (float)data->duration) : -1; - if (pos < 0) - pos = fFhgVbrInfo ? VBRISeekPoint(100.0 * *time / (float)data->duration) : -1; - if (pos < 0) - pos = (*time * fDataSize) / data->duration; - *frame = (*time * data->frameCount) / data->duration; - TRACE("mp3Reader::CalculatePosition using time %Ld gives frame %Ld and pos %Ld\n", *time, *frame, pos); - } else { - return B_ERROR; - } - - // We ignore B_MEDIA_SEEK_CLOSEST_FORWARD, B_MEDIA_SEEK_CLOSEST_BACKWARD - // Align position to the sync bytes - uint8 buffer[16000]; - if (pos > fDataSize - 16000) - pos = fDataSize - 16000; - if (pos < 0) - pos = 0; - int64 size = fDataSize - pos; - if (size > 16000) - size = 16000; - if (size != Source()->ReadAt(fDataStart + pos, buffer, size)) { - TRACE("mp3Reader::CalculatePosition: unexpected read error\n"); - return B_ERROR; - } - int32 end = size - 4; - int32 ofs; - for (ofs = 0; ofs < end; ofs++) { - if (buffer[ofs] != 0xff) // quick check - continue; - if (IsValidStream(&buffer[ofs], size - ofs)) - break; - } - if (ofs == end) { - printf("mp3Reader::CalculatePosition: couldn't synchronize\n"); - return B_ERROR; - } - - *position = pos + ofs; - - return B_OK; -} - - -status_t -mp3Reader::GetNextChunk(void *cookie, - const void **chunkBuffer, size_t *chunkSize, - media_header *mediaHeader) -{ - // TODO This returns a chunk composed of a single frame - // Would be better to just return chunks of 16K and let the decoder break up the frames. - mp3data *data = reinterpret_cast(cookie); - - int64 maxbytes = fDataSize - data->position; - mediaHeader->file_pos = data->position; - -#if 1 - // TEST CODE to return a chunk of MAX_CHUNK_SIZE - 16 instead of frame size - - if (maxbytes <= 0) { - return B_LAST_BUFFER_ERROR; - } - - size_t size = min_c(MAX_CHUNK_SIZE - 16, maxbytes); - if (size != Source()->ReadAt(fDataStart + data->position, data->chunkBuffer, size)) { - printf("mp3Reader::GetNextChunk: unexpected read error\n"); - return B_ERROR; - } - data->position += size; - *chunkBuffer = data->chunkBuffer; - *chunkSize = size; - - return B_OK; - -#else - if (maxbytes < 4) - return B_LAST_BUFFER_ERROR; - - mediaHeader->start_time = (data->framePosition * 1000000) / data->frameRate; - -retry: - if (4 != Source()->ReadAt(fDataStart + data->position, data->chunkBuffer, 4)) { - printf("mp3Reader::GetNextChunk: unexpected read error\n"); - return B_ERROR; - } - - int size = GetFrameLength(data->chunkBuffer) - 4; - if (size <= 0) { - printf("mp3Reader::GetNextChunk: invalid frame encountered at position %Ld, header %02x %02x %02x %02x \n", - data->position, (uint8)data->chunkBuffer[0], (uint8)data->chunkBuffer[1], (uint8)data->chunkBuffer[2], (uint8)data->chunkBuffer[3]); - if (ResynchronizeStream(data)) { - TRACE("mp3Reader::GetNextChunk: synchronized again at position %Ld\n", data->position); - goto retry; - } else { - printf("mp3Reader::GetNextChunk: synchronization failed\n"); - return B_ERROR; - } - } - - data->position += 4; - maxbytes -= 4; - - if (size > maxbytes) - size = maxbytes; - if (size == 0) - return B_LAST_BUFFER_ERROR; - - // XXX reads one byte more than needed to allow doing the check below - if (size > Source()->ReadAt(fDataStart + data->position, data->chunkBuffer + 4, size + 1)) { - TRACE("mp3Reader::GetNextChunk: unexpected read error\n"); - return B_ERROR; - } - - // XXX I found two files that need this, either they are broken, - // XXX or the GetFrameLength() function is bad - uint8 *d = (uint8 *)data->chunkBuffer; - if (d[4 + size - 1] == 0xff && d[4 + size] != 0xff && ((d[4 + size] & 0xe0) == 0xe0)) { - TRACE("mp3Reader::GetNextChunk: frame at %Ld: reported length %d, real length %d\n", data->position, size + 4, size + 3); - size--; - } - - data->position += size; - - data->framePosition += data->framesPerFrame; - - *chunkBuffer = data->chunkBuffer; - *chunkSize = size + 4; - - if (*chunkSize > MAX_CHUNK_SIZE) { - fprintf(stderr, "mp3Reader: chunk buffer overrun, read %ld bytes into %ld bytes buffer\n", *chunkSize, MAX_CHUNK_SIZE); - exit(1); - } - - return B_OK; -#endif -} - -bool -mp3Reader::ResynchronizeStream(mp3data *data) -{ - // we are at data->position and that's not a valid frame header - - // XXX this is a hack and needs to be improved - - data->position -= 16; - - const int readmax = 16384; - uint8 buffer[readmax]; - - while ((data->position + 100) < fDataSize) { - data->position++; - int bytes = min_c(fDataSize - data->position, readmax); - - if (bytes != Source()->ReadAt(fDataStart + data->position, buffer, bytes)) { - TRACE("mp3Reader::ResynchronizeStream: read error\n"); - return false; - } - if (IsValidStream(buffer, bytes)) - return true; - } - return false; -} - - -bool -mp3Reader::ParseFile() -{ - // Since we already know that this is an mp3 file, - // detect the real (mp3 audio) data start and end - // and find VBR or other headers and tags - - const int32 search_size = 16384; - const int32 padding_size = 128; // Get???Length() functions need some bytes to look into - int64 offset; - int32 size; - uint8 buf[search_size]; - - fDataStart = -1; - - for (offset = 0; offset < fFileSize; ) { - int64 maxsize = fFileSize - offset; - size = (search_size < maxsize) ? search_size : maxsize; - - if (size != Source()->ReadAt(offset, buf, size)) { - TRACE("mp3ReaderPlugin::ParseFile reading %ld bytes at offset %Ld failed\n", size, offset); - return false; - } - - int skip_bytes = 0; - - // since the various Get???Length() functions need to check a few bytes - // (10 for ID3V2, about 40 for VBR), we stop searching before buffer end - int32 end = size - padding_size; - for (int32 pos = 0; pos < end; ) { - int hdr_length; - - // A Xing or Fraunhofer VBR header is embedded into a valid - // mp3 frame that contains silence. We need to first check - // for these headers before we can search for the start of a stream. - - hdr_length = GetXingVbrLength(&buf[pos]); - if (hdr_length > 0) { - TRACE("mp3ReaderPlugin::ParseFile found a Xing VBR header of %d bytes at position %Ld\n", hdr_length, offset + pos); - ParseXingVbrHeader(offset + pos); - goto skip_header; - } - - hdr_length = GetInfoCbrLength(&buf[pos]); - if (hdr_length > 0) { - TRACE("mp3ReaderPlugin::ParseFile found a Info CBR header of %d bytes at position %Ld\n", hdr_length, offset + pos); - goto skip_header; - } - - hdr_length = GetFraunhoferVbrLength(&buf[pos]); - if (hdr_length > 0) { - TRACE("mp3ReaderPlugin::ParseFile found a Fraunhofer VBR header of %d bytes at position %Ld\n", hdr_length, offset + pos); - ParseFraunhoferVbrHeader(offset + pos + 36); - goto skip_header; - } - - hdr_length = GetLameVbrLength(&buf[pos]); - if (hdr_length > 0) { - TRACE("mp3ReaderPlugin::ParseFile found a Lame VBR header of %d bytes at position %Ld\n", hdr_length, offset + pos); - goto skip_header; - } - - hdr_length = GetId3v2Length(&buf[pos]); - if (hdr_length > 0) { - TRACE("mp3ReaderPlugin::ParseFile found a ID3V2 header of %d bytes at position %Ld\n", hdr_length, offset + pos); - goto skip_header; - } - - if (IsValidStream(&buf[pos], size - pos)) { - fDataStart = offset + pos; - break; - } - - pos++; - continue; - - skip_header: - int skip_max = end - pos; - skip_bytes = (skip_max < hdr_length) ? skip_max : hdr_length; - pos += skip_bytes; - skip_bytes = hdr_length - skip_bytes; - } - if (fDataStart != -1) - break; - - if (skip_bytes) { - offset += skip_bytes; - skip_bytes = 0; - } else { - offset += (search_size - padding_size); - } - } - - fDataSize = fFileSize - fDataStart; - - TRACE("found mp3 audio data at file position %Ld, maximum data length is %Ld\n", fDataStart, fDataSize); - - // search for a ID3 V1 tag - offset = fFileSize - 128; - size = 128; - if (offset > 0) { - if (size != Source()->ReadAt(offset, buf, size)) { - TRACE("mp3ReaderPlugin::ParseFile reading %ld bytes at offset %Ld failed\n", size, offset); - return false; - } - if (buf[0] == 'T'&& buf[1] == 'A' && buf[2] == 'G') { - TRACE("mp3ReaderPlugin::ParseFile found a ID3V1 header of 128 bytes at position %Ld\n", offset); - fDataSize -= 128; - } - } - - // search for a lyrics tag - // maximum size is 5100 bytes, and a 128 byte ID3V1 tag is always appended - // starts with "LYRICSBEGIN", end with "LYRICS200" or "LYRICSEND" - offset = fFileSize - 5300; - size = 5300; - if (offset < 0) { - offset = 0; - size = fFileSize; - } - if (size != Source()->ReadAt(offset, buf, size)) { - TRACE("mp3ReaderPlugin::ParseFile reading %ld bytes at offset %Ld failed\n", size, offset); - return false; - } - for (int pos = 0; pos < size; pos++) { - if (buf[pos] != 'L') - continue; - if (0 == memcmp(&buf[pos], "LYRICSBEGIN", 11)) { - TRACE("mp3ReaderPlugin::ParseFile found a Lyrics header at position %Ld\n", offset + pos); - fDataSize = offset + pos + fDataStart; - } - } - - // might search for APE tags, too - - TRACE("found mp3 audio data at file position %Ld, data length is %Ld\n", fDataStart, fDataSize); - - return true; -} - -int -mp3Reader::GetXingVbrLength(uint8 *header) -{ - int h_id = (header[1] >> 3) & 1; - int h_mode = (header[3] >> 6) & 3; - uint8 *xing_header; - - // determine offset of header - if(h_id) // mpeg1 - xing_header = (h_mode != 3) ? (header + 36) : (header + 21); - else // mpeg2 - xing_header = (h_mode != 3) ? (header + 21) : (header + 13); - - if (xing_header[0] != 'X') return -1; - if (xing_header[1] != 'i') return -1; - if (xing_header[2] != 'n') return -1; - if (xing_header[3] != 'g') return -1; - - return GetFrameLength(header); -} - -int -mp3Reader::GetInfoCbrLength(uint8 *header) -{ - int h_id = (header[1] >> 3) & 1; - int h_mode = (header[3] >> 6) & 3; - uint8 *info_header; - - // determine offset of header - if(h_id) // mpeg1 - info_header = (h_mode != 3) ? (header + 36) : (header + 21); - else // mpeg2 - info_header = (h_mode != 3) ? (header + 21) : (header + 13); - - if (info_header[0] != 'I') return -1; - if (info_header[1] != 'n') return -1; - if (info_header[2] != 'f') return -1; - if (info_header[3] != 'o') return -1; - - return GetFrameLength(header); -} - -void -mp3Reader::ParseXingVbrHeader(int64 pos) -{ - static const int sr_table[2][4] = { { 22050, 24000, 16000, 0 }, { 44100, 48000, 32000, 0 } }; - static const int FRAMES_FLAG = 0x0001; - static const int BYTES_FLAG = 0x0002; - static const int TOC_FLAG = 0x0004; - static const int VBR_SCALE_FLAG = 0x0008; - uint8 header[200]; - uint8 *xing_header; - - Source()->ReadAt(pos, header, sizeof(header)); - - int layer_index = (header[1] >> 1) & 3; - int h_id = (header[1] >> 3) & 1; - int h_sr_index = (header[2] >> 2) & 3; - int h_mode = (header[3] >> 6) & 3; - - // determine offset of header - if(h_id) // mpeg1 - xing_header = (h_mode != 3) ? (header + 36) : (header + 21); - else // mpeg2 - xing_header = (h_mode != 3) ? (header + 21) : (header + 13); - - xing_header += 4; // skip ID - - int flags = B_BENDIAN_TO_HOST_INT32(*(uint32 *)xing_header); - xing_header += 4; - - if (fXingVbrInfo) { - TRACE("mp3Reader::ParseXingVbrHeader: Error, already found a header\n"); - return; - } - - fXingVbrInfo = new xing_vbr_info; - - fXingVbrInfo->frameRate = sr_table[h_id][h_sr_index]; - if (flags & FRAMES_FLAG) { - fXingVbrInfo->encodedFramesCount = (int64)(uint32)B_BENDIAN_TO_HOST_INT32(*(uint32 *)xing_header); - xing_header += 4; - } else { - fXingVbrInfo->encodedFramesCount = -1; - } - - if (flags & BYTES_FLAG) { - fXingVbrInfo->byteCount = (int64)(uint32)B_BENDIAN_TO_HOST_INT32(*(uint32 *)xing_header); - xing_header += 4; - } else { - fXingVbrInfo->byteCount = -1; - } - - if (flags & TOC_FLAG) { - fXingVbrInfo->hasSeekpoints = true; - memcpy(fXingVbrInfo->seekpoints, xing_header, 100); - xing_header += 100; - } else { - fXingVbrInfo->hasSeekpoints = false; - } - - if (flags & VBR_SCALE_FLAG) { - fXingVbrInfo->vbrScale = B_BENDIAN_TO_HOST_INT32(*(uint32 *)xing_header); - xing_header += 4; - } else { - fXingVbrInfo->vbrScale = -1; - } - - // mpeg frame (chunk) size is is constant and always 384 samples (frames) for - // Layer I and 1152 samples for Layer II and Layer III - if (fXingVbrInfo->encodedFramesCount != -1) { - fXingVbrInfo->frameCount = fXingVbrInfo->encodedFramesCount * frame_sample_count_table[layer_index]; - fXingVbrInfo->duration = (fXingVbrInfo->frameCount * 1000000) / fXingVbrInfo->frameRate; - } else { - fXingVbrInfo->duration = -1; - fXingVbrInfo->frameCount = -1; - } - - TRACE("mp3Reader::ParseXingVbrHeader: %Ld encoded frames, %Ld bytes, %s seekpoints, vbrscale %ld\n", - fXingVbrInfo->encodedFramesCount, fXingVbrInfo->byteCount, - fXingVbrInfo->hasSeekpoints ? "has" : "no", fXingVbrInfo->vbrScale); - TRACE("mp3Reader::ParseXingVbrHeader: frameRate %ld, frameCount %Ld, duration %.6f\n", - fXingVbrInfo->frameRate, fXingVbrInfo->frameCount, fXingVbrInfo->duration / 1000000.0); -} - -int64 -mp3Reader::XingSeekPoint(float percent) -{ - if (!fXingVbrInfo || !fXingVbrInfo->hasSeekpoints || fXingVbrInfo->byteCount == -1) - return -1; - - int a; - int64 point; - float fa, fb, fx; - - if (percent < 0.0f) - percent = 0.0f; - if (percent > 100.0f) - percent = 100.0f; - - a = (int)percent; - if (a > 99) - a = 99; - fa = fXingVbrInfo->seekpoints[a]; - if (a < 99) - fb = fXingVbrInfo->seekpoints[a + 1]; - else - fb = 256.0f; - - fx = fa + (fb - fa) * (percent - a); - - point = (int64)((1.0f / 256.0f) * fx * fXingVbrInfo->byteCount); - TRACE("mp3Reader::XingSeekPoint for %.8f%% is %Ld\n", percent, point); - return point; -} - -int -mp3Reader::GetLameVbrLength(uint8 *header) -{ - return -1; -} - -int -mp3Reader::GetFraunhoferVbrLength(uint8 *header) -{ - if (header[0] != 0xff) return -1; - if (header[36] != 'V') return -1; - if (header[37] != 'B') return -1; - if (header[38] != 'R') return -1; - if (header[39] != 'I') return -1; - - return GetFrameLength(header); -} - -void -mp3Reader::ParseFraunhoferVbrHeader(int64 pos) -{ - uint32 i, entry; - - fFhgVbrInfo = new fhg_vbr_info; - - Source()->ReadAt(pos, &fFhgVbrInfo->VbriSignature[0], 4); - Source()->ReadAt(pos+4, &fFhgVbrInfo->VbriVersion, 2); - Source()->ReadAt(pos+6, &fFhgVbrInfo->VbriDelay, 2); - Source()->ReadAt(pos+8, &fFhgVbrInfo->VbriQuality, 2); - Source()->ReadAt(pos+10, &fFhgVbrInfo->VbriStreamBytes, 4); - Source()->ReadAt(pos+14, &fFhgVbrInfo->VbriStreamFrames, 4); - Source()->ReadAt(pos+18, &fFhgVbrInfo->VbriTableSize, 2); - Source()->ReadAt(pos+20, &fFhgVbrInfo->VbriTableScale, 2); - Source()->ReadAt(pos+22, &fFhgVbrInfo->VbriEntryBytes, 2); - Source()->ReadAt(pos+24, &fFhgVbrInfo->VbriEntryFrames, 2); - - pos += 26; - - // Double check we are dealing with a VBRI (Fraunhofer) header - if (fFhgVbrInfo->VbriSignature[0] == 'V' && - fFhgVbrInfo->VbriSignature[1] == 'B' && - fFhgVbrInfo->VbriSignature[2] == 'R' && - fFhgVbrInfo->VbriSignature[3] == 'I') { - - fFhgVbrInfo->VbriVersion = B_BENDIAN_TO_HOST_INT16(fFhgVbrInfo->VbriVersion); - fFhgVbrInfo->VbriDelay = B_BENDIAN_TO_HOST_INT16(fFhgVbrInfo->VbriDelay); - fFhgVbrInfo->VbriQuality = B_BENDIAN_TO_HOST_INT16(fFhgVbrInfo->VbriQuality); - - fFhgVbrInfo->VbriStreamBytes = B_BENDIAN_TO_HOST_INT32(fFhgVbrInfo->VbriStreamBytes); - fFhgVbrInfo->VbriStreamFrames = B_BENDIAN_TO_HOST_INT32(fFhgVbrInfo->VbriStreamFrames); - fFhgVbrInfo->VbriTableSize = B_BENDIAN_TO_HOST_INT16(fFhgVbrInfo->VbriTableSize); - fFhgVbrInfo->VbriTableScale = B_BENDIAN_TO_HOST_INT16(fFhgVbrInfo->VbriTableScale); - fFhgVbrInfo->VbriEntryBytes = B_BENDIAN_TO_HOST_INT16(fFhgVbrInfo->VbriEntryBytes); - fFhgVbrInfo->VbriEntryFrames = B_BENDIAN_TO_HOST_INT16(fFhgVbrInfo->VbriEntryFrames); - - fFhgVbrInfo->VbriTable = new int[(const int) fFhgVbrInfo->VbriTableSize + 1] ; - - for ( i = 0 ; i <= fFhgVbrInfo->VbriTableSize ; i++) { - - Source()->ReadAt(pos, &entry, fFhgVbrInfo->VbriEntryBytes); - pos += fFhgVbrInfo->VbriEntryBytes; - - if (fFhgVbrInfo->VbriEntryBytes == 2) { - entry = B_BENDIAN_TO_HOST_INT16(entry); - } else if (fFhgVbrInfo->VbriEntryBytes == 4) { - entry = B_BENDIAN_TO_HOST_INT32(entry); - } - - fFhgVbrInfo->VbriTable[i] = entry * fFhgVbrInfo->VbriTableScale; - } - - TRACE("FraunhoferVbrHeader(Version %d, Delay %d, Quality %f, StreamBytes %ld, StreamFrames %ld, TableSize %d, TableScale %d, EntryBytes %d, EntryFrames %d)\n", - fFhgVbrInfo->VbriVersion, fFhgVbrInfo->VbriDelay, (float)fFhgVbrInfo->VbriQuality, fFhgVbrInfo->VbriStreamBytes, fFhgVbrInfo->VbriStreamFrames, - fFhgVbrInfo->VbriTableSize,fFhgVbrInfo->VbriTableScale,fFhgVbrInfo->VbriEntryBytes,fFhgVbrInfo->VbriEntryFrames); - - } else { - delete fFhgVbrInfo; - fFhgVbrInfo = NULL; - } -} - -int64 -mp3Reader::VBRIseekPointByTime(float EntryTimeInMilliSeconds) { - - unsigned int SamplesPerFrame, i = 0, SeekPoint = 0 , fraction = 0; - - float TotalDuration; - float DurationPerVbriFrames; - float AccumulatedTime = 0.0f; - - (fFhgVbrInfo->SampleRate >= 32000) ? (SamplesPerFrame = 1152) : (SamplesPerFrame = 576); - - TotalDuration = ((float)fFhgVbrInfo->VbriStreamFrames * (float)SamplesPerFrame) - / (float)fFhgVbrInfo->SampleRate * 1000.0f; - DurationPerVbriFrames = (float)TotalDuration / (float)(fFhgVbrInfo->VbriTableSize+1); - - if ( EntryTimeInMilliSeconds > TotalDuration ) EntryTimeInMilliSeconds = TotalDuration; - - while ( AccumulatedTime <= EntryTimeInMilliSeconds ) { - - SeekPoint += fFhgVbrInfo->VbriTable[i]; - AccumulatedTime += DurationPerVbriFrames; - i++; - - } - - // Searched too far; correct result - fraction = ( (int)(((( AccumulatedTime - EntryTimeInMilliSeconds ) / DurationPerVbriFrames ) - + (1.0f / (2.0f * (float)fFhgVbrInfo->VbriEntryFrames))) * (float)fFhgVbrInfo->VbriEntryFrames)); - - - SeekPoint -= (int)((float)fFhgVbrInfo->VbriTable[i-1] * (float)(fraction) - / (float)fFhgVbrInfo->VbriEntryFrames); - - return SeekPoint; - -} - -int64 -mp3Reader::VBRISeekPoint(float percent) -{ - if (!fFhgVbrInfo) - return -1; - - int SamplesPerFrame; - - float TotalDuration; - - if (percent >= 100.0f) percent = 100.0f; - if (percent <= 0.0f) percent = 0.0f; - - (fFhgVbrInfo->SampleRate >= 32000) ? (SamplesPerFrame = 1152) : (SamplesPerFrame = 576); - - TotalDuration = ((float)fFhgVbrInfo->VbriStreamFrames * (float)SamplesPerFrame) - / (float)fFhgVbrInfo->SampleRate; - - return VBRIseekPointByTime( (percent/100.0f) * TotalDuration * 1000.0f ); -} - -int -mp3Reader::GetId3v2Length(uint8 *buffer) -{ - if ((buffer[0] == 'I') && /* magic */ - (buffer[1] == 'D') && - (buffer[2] == '3') && - (buffer[3] != 0xff) && (buffer[4] != 0xff) && /* version */ - /* flags */ - (!(buffer[6] & 0x80)) && (!(buffer[7] & 0x80)) && /* the MSB in each byte in size is 0, to avoid */ - (!(buffer[8] & 0x80)) && (!(buffer[9] & 0x80))) { /* making a buggy mpeg header */ - return ((buffer[6] << 21)|(buffer[7] << 14)|(buffer[8] << 7)|(buffer[9])) + 10; - } - return B_ENTRY_NOT_FOUND; -} - -bool -mp3Reader::IsMp3File() -{ - // avoid detecting mp3 in a container format like AVI or mov - - // To detect an mp3 file, we seek into the middle, - // and search for a valid sequence of 3 frame headers. - // A mp3 frame has a maximum length of 2881 bytes, we - // load a block of 16kB and use it to search. - - const int32 search_size = 16384; - int64 offset; - int32 size; - uint8 buf[search_size]; - - size = 8; - offset = 0; - if (size != Source()->ReadAt(offset, buf, size)) { - TRACE("mp3ReaderPlugin::IsMp3File reading %ld bytes at offset %Ld failed\n", size, offset); - return false; - } - - // avoid reading some common formats that might have an embedded mp3 stream - // RIFF, AVI or WAV - if (buf[0] == 'R' && buf[1] == 'I' && buf[2] == 'F' && buf[3] == 'F') - return false; - // Ogg Vorbis - if (buf[0] == 'O' && buf[1] == 'g' && buf[2] == 'g' && buf[3] == 'S') - return false; - // Real Media - if (buf[0] == '.' && buf[1] == 'R' && buf[2] == 'M' && buf[3] == 'F') - return false; - // Quicktime or MPEG4 (Not really a good way, moov could be anywhere) - if (buf[4] == 'm' && buf[5] == 'o' && buf[6] == 'o' && buf[7] == 'v') - return false; - // On newer quicktime and on MPEG4 files ftyp is likely to be first - if (buf[4] == 'f' && buf[5] == 't' && buf[6] == 'y' && buf[7] == 'p') - return false; - // ASF 1 (first few bytes of GUID) - if (buf[0] == 0x30 && buf[1] == 0x26 && buf[2] == 0xb2 && buf[3] == 0x75 - && buf[4] == 0x8e && buf[5] == 0x66 && buf[6] == 0xcf && buf[7] == 0x11) - return false; - // ASF 2.0 (first few bytes of GUID) - if (buf[0] == 0xd1 && buf[1] == 0x29 && buf[2] == 0xe2 && buf[3] == 0xd6 - && buf[4] == 0xda && buf[5] == 0x35 && buf[6] == 0xd1 && buf[7] == 0x11) - return false; - - // search for a valid mpeg audio frame header - // sequence in the middle of the file - size = search_size; - offset = fFileSize / 2 - search_size / 2; - if (size > fFileSize) { - size = fFileSize; - offset = 0; - } - - TRACE("searching for mp3 frame headers at %Ld in %ld bytes\n", offset, size); - - if (size != Source()->ReadAt(offset, buf, size)) { - TRACE("mp3ReaderPlugin::IsMp3File reading %ld bytes at offset %Ld failed\n", size, offset); - return false; - } - - int32 end = size - 4; - for (int32 pos = 0; pos < end; pos++) { - if (buf[pos] != 0xff) // quick check - continue; - if (IsValidStream(&buf[pos], size - pos)) - return true; - } - return false; -} - -bool -mp3Reader::IsValidStream(uint8 *buffer, int size) -{ - // check 4 consecutive frame headers to make sure - // that the length encoded in the header is correct, - // and also that mpeg version and layer do not change - int length1 = GetFrameLength(buffer); - - if (length1 < 0 || (length1 + 4) > size) - return false; - - int version_index1 = (buffer[1] >> 3) & 0x03; - int layer_index1 = (buffer[1] >> 1) & 0x03; - int length2 = GetFrameLength(buffer + length1); - if (length2 < 0 || (length1 + length2 + 4) > size) - return false; - - int version_index2 = (buffer[length1 + 1] >> 3) & 0x03; - int layer_index2 = (buffer[length1 + 1] >> 1) & 0x03; - if (version_index1 != version_index2 || layer_index1 != layer_index2) - return false; - - int length3 = GetFrameLength(buffer + length1 + length2); - if (length3 < 0) - return false; - int version_index3 = (buffer[length1 + length2 + 1] >> 3) & 0x03; - int layer_index3 = (buffer[length1 + length2 + 1] >> 1) & 0x03; - if (version_index2 != version_index3 || layer_index2 != layer_index3) - return false; - - int length4 = GetFrameLength(buffer + length1 + length2 + length3); - if (length4 < 0) - return false; - - int version_index4 = (buffer[length1 + length2 + length3 + 1] >> 3) & 0x03; - int layer_index4 = (buffer[length1 + length2 + length3 + 1] >> 1) & 0x03; - if (version_index3 != version_index4 || layer_index3 != layer_index4) - return false; - - return true; -} - -int -mp3Reader::GetFrameLength(void *header) -{ - uint8 *h = (uint8 *)header; - bool lsf = false; - - if (h[0] != 0xff) - return -1; - if ((h[1] & 0xe0) != 0xe0) - return -1; - - int mpeg_version_index = (h[1] >> 3) & 0x03; - int layer_index = (h[1] >> 1) & 0x03; - int bitrate_index = (h[2] >> 4) & 0x0f; - int sampling_rate_index = (h[2] >> 2) & 0x03; - int padding = (h[2] >> 1) & 0x01; - - /* not interested in the other bits */ - - lsf = (mpeg_version_index == 0) || (mpeg_version_index == 2); - - 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) - return -1; - - int length; - if (layer_index == 3) { // layer 1 - length = ((12 * 1000 * bitrate) / framerate + padding) * 4; - } else if (layer_index == 2) { // layer 2 - length = ((144 * 1000 * bitrate) / framerate) + padding; - } else if (lsf) { // layer 3 with lsf - length = ((144 * 1000 * bitrate) / (framerate*2)) + padding; - } else { // layer 3 without lsf - length = ((144 * 1000 * bitrate) / framerate) + padding; - } - -#if 0 - printf("%s %s, %s crc, bit rate %d, frame rate %d, padding %d, frame length %d lsf=%s\n", - 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, length, (lsf ? "true" : "false")); -#endif - - return length; -} - -Reader * -mp3ReaderPlugin::NewReader() -{ - return new mp3Reader; -} - - -MediaPlugin * -instantiate_plugin() -{ - return new mp3ReaderPlugin; -} diff --git a/src/add-ons/media/plugins/mp3_reader/MP3ReaderPlugin.h b/src/add-ons/media/plugins/mp3_reader/MP3ReaderPlugin.h deleted file mode 100644 index 575ae10b3d..0000000000 --- a/src/add-ons/media/plugins/mp3_reader/MP3ReaderPlugin.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2003, Marcus Overhagen - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef _MP3_READER_PLUGIN_H -#define _MP3_READER_PLUGIN_H - -#include "ReaderPlugin.h" - -struct mp3data; - -namespace BPrivate { namespace media { - -class mp3Reader : public Reader -{ -public: - mp3Reader(); - ~mp3Reader(); - - const char *Copyright(); - - status_t Sniff(int32 *streamCount); - - void GetFileFormatInfo(media_file_format *mff); - - status_t AllocateCookie(int32 streamNumber, void **cookie); - status_t FreeCookie(void *cookie); - - status_t GetStreamInfo(void *cookie, int64 *frameCount, bigtime_t *duration, - media_format *format, const void **infoBuffer, size_t *infoSize); - - status_t Seek(void *cookie, uint32 flags, - int64 *frame, bigtime_t *time); - - status_t FindKeyFrame(void* cookie, uint32 flags, - int64* frame, bigtime_t* time); - - status_t GetNextChunk(void *cookie, - const void **chunkBuffer, size_t *chunkSize, - media_header *mediaHeader); - - BPositionIO *Source() { return fSeekableSource; } - -private: - bool ParseFile(); - bool IsMp3File(); - - // checks if the buffer contains a valid mp3 stream, length should be - bool IsValidStream(uint8 *buffer, int size); - - int GetFrameLength(void *header); - int GetXingVbrLength(uint8 *header); - int GetFraunhoferVbrLength(uint8 *header); - int GetLameVbrLength(uint8 *header); - int GetId3v2Length(uint8 *header); - int GetInfoCbrLength(uint8 *header); - - bool FindData(); - - void ParseXingVbrHeader(int64 pos); - void ParseFraunhoferVbrHeader(int64 pos); - - int64 XingSeekPoint(float percent); - - int64 VBRIseekPointByTime(float EntryTimeInMilliSeconds); - int64 VBRISeekPoint(float percent); - - bool ResynchronizeStream(mp3data *data); - -private: - - status_t CalculatePosition(void* cookie, uint32 flags, - int64* frame, bigtime_t* time, off_t *position); - bool isVBR() {return (fXingVbrInfo || fFhgVbrInfo);} - - BPositionIO * fSeekableSource; - int64 fFileSize; - - int64 fDataStart; - int64 fDataSize; - - struct xing_vbr_info; - struct fhg_vbr_info; - - xing_vbr_info * fXingVbrInfo; - fhg_vbr_info * fFhgVbrInfo; -}; - - -class mp3ReaderPlugin : public ReaderPlugin -{ -public: - Reader *NewReader(); -}; - -} } // namespace BPrivate::media - -using namespace BPrivate::media; - -#endif