mirror of
https://github.com/m5stack/CoreS3-Box.git
synced 2026-05-20 10:59:43 -07:00
Merge branch 'feature/PR_audio_component' into 'master'
audio: adopt customer's PR about audio, and resolve issues found by testing See merge request ae_group/esp-box!45
This commit is contained in:
@@ -1,6 +1,3 @@
|
||||
[submodule "components/lvgl/lv_demos"]
|
||||
path = components/lvgl/lv_demos
|
||||
url = https://github.com/lvgl/lv_demos.git
|
||||
[submodule "components/lvgl/lvgl"]
|
||||
path = components/lvgl/lvgl
|
||||
url = https://github.com/lvgl/lvgl.git
|
||||
|
||||
@@ -75,6 +75,17 @@ esp_err_t bsp_codec_set_voice_gain(uint8_t channel_mask, uint8_t volume);
|
||||
*/
|
||||
esp_err_t bsp_codec_set_fmt(audio_hal_iface_format_t fmt);
|
||||
|
||||
/**
|
||||
* @brief Configure DAC mute or not. Basically you can use this function to mute the output or unmute
|
||||
*
|
||||
* @param enable enable(1) or disable(0)
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - ESP_FAIL: Fail
|
||||
* - ESP_ERR_NOT_FOUND: Codec not detected on I2C bus
|
||||
*/
|
||||
esp_err_t bsp_codec_set_mute(bool enable);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -193,3 +193,13 @@ esp_err_t bsp_codec_set_voice_gain(uint8_t channel_mask, uint8_t volume)
|
||||
}
|
||||
return ESP_ERR_NOT_FOUND;
|
||||
}
|
||||
|
||||
esp_err_t bsp_codec_set_mute(bool enable)
|
||||
{
|
||||
if (bsp_codec_has_dev(CODEC_DEV_ES8311)) {
|
||||
return es8311_set_voice_mute(enable);
|
||||
} else if (bsp_codec_has_dev(CODEC_DEV_ES8156)) {
|
||||
return es8156_codec_set_voice_mute(enable);
|
||||
}
|
||||
return ESP_ERR_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
idf_component_register(
|
||||
SRC_DIRS
|
||||
"."
|
||||
"real"
|
||||
INCLUDE_DIRS
|
||||
"pub"
|
||||
PRIV_INCLUDE_DIRS
|
||||
"real")
|
||||
|
||||
# Some of warinings from LVGL. Block them.
|
||||
target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-unused-but-set-variable)
|
||||
@@ -1,30 +0,0 @@
|
||||
Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
|
||||
|
||||
The contents of this directory, and (except where otherwise
|
||||
indicated) the directories included within this directory, are
|
||||
subject to the current version of the RealNetworks Public Source
|
||||
License (the "RPSL") available at RPSL.txt in this directory, unless
|
||||
you have licensed the directory under the current version of the
|
||||
RealNetworks Community Source License (the "RCSL") available at
|
||||
RCSL.txt in this directory, in which case the RCSL will apply. You
|
||||
may also obtain the license terms directly from RealNetworks. You
|
||||
may not use the files in this directory except in compliance with the
|
||||
RPSL or, if you have a valid RCSL with RealNetworks applicable to
|
||||
this directory, the RCSL. Please see the applicable RPSL or RCSL for
|
||||
the rights, obligations and limitations governing use of the contents
|
||||
of the directory.
|
||||
|
||||
This directory is part of the Helix DNA Technology. RealNetworks is
|
||||
the developer of the Original Code and owns the copyrights in the
|
||||
portions it created.
|
||||
|
||||
This directory, and the directories included with this directory, are
|
||||
distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY
|
||||
DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY
|
||||
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||||
|
||||
Technology Compatibility Kit Test Suite(s) Location:
|
||||
http://www.helixcommunity.org/content/tck
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,80 +0,0 @@
|
||||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: RCSL 1.0/RPSL 1.0
|
||||
#
|
||||
# Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
|
||||
#
|
||||
# The contents of this file, and the files included with this file, are
|
||||
# subject to the current version of the RealNetworks Public Source License
|
||||
# Version 1.0 (the "RPSL") available at
|
||||
# http://www.helixcommunity.org/content/rpsl unless you have licensed
|
||||
# the file under the RealNetworks Community Source License Version 1.0
|
||||
# (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
|
||||
# in which case the RCSL will apply. You may also obtain the license terms
|
||||
# directly from RealNetworks. You may not use this file except in
|
||||
# compliance with the RPSL or, if you have a valid RCSL with RealNetworks
|
||||
# applicable to this file, the RCSL. Please see the applicable RPSL or
|
||||
# RCSL for the rights, obligations and limitations governing use of the
|
||||
# contents of the file.
|
||||
#
|
||||
# This file is part of the Helix DNA Technology. RealNetworks is the
|
||||
# developer of the Original Code and owns the copyrights in the portions
|
||||
# it created.
|
||||
#
|
||||
# This file, and the files included with this file, is distributed and made
|
||||
# available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||
# EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
||||
# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
# FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||||
#
|
||||
# Technology Compatibility Kit Test Suite(s) Location:
|
||||
# http://www.helixcommunity.org/content/tck
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
#
|
||||
|
||||
UmakefileVersion(2,1)
|
||||
|
||||
# old C++ shim layer for backwards compatibility with Player
|
||||
# if you don't want to use this, just use the public C api
|
||||
# in mp3dec.c/.h
|
||||
project.AddSources("mpadecobj.cpp")
|
||||
|
||||
project.AddSources("mp3dec.c", "mp3tabs.c")
|
||||
|
||||
if (sysinfo.arch == 'arm') and project.IsDefined('HELIX_FEATURE_USE_IPP4'):
|
||||
project.AddDefines('USE_IPP_MP3')
|
||||
|
||||
if ('USE_IPP_MP3' in project.defines):
|
||||
project.AddSources("ipp/bitstream.c", "ipp/buffers.c", "ipp/dequant.c",
|
||||
"ipp/huffman.c", "ipp/imdct.c", "ipp/subband.c")
|
||||
if('_LINUX' in project.defines):
|
||||
project.AddIncludes('%s/include/' % GetSDKPath("ipp_mp3_tools"))
|
||||
else:
|
||||
project.AddIncludes('\"%s\include\"' % GetSDKPath("ipp_mp3_tools"))
|
||||
|
||||
else:
|
||||
project.AddSources("real/bitstream.c", "real/buffers.c", "real/dct32.c",
|
||||
"real/dequant.c", "real/dqchan.c", "real/huffman.c", "real/hufftabs.c",
|
||||
"real/imdct.c", "real/scalfact.c",
|
||||
"real/stproc.c", "real/subband.c", "real/trigtabs.c")
|
||||
if ('ARM_ADS' in project.defines):
|
||||
project.AddSources("real/arm/asmpoly.s")
|
||||
elif ('_WINCE' in project.defines and '_ARM' in project.defines):
|
||||
project.AddSources("real/arm/asmpoly.s", "real/arm/asmmisc.s")
|
||||
elif (('_SYMBIAN' in project.defines or '_LINUX' in project.defines ) and
|
||||
'ARM' in project.defines):
|
||||
project.AddSources("real/arm/asmpoly_gcc.s")
|
||||
else:
|
||||
project.AddSources("real/polyphase.c")
|
||||
|
||||
project.AddIncludes("./pub")
|
||||
project.AddModuleIncludes("common/include")
|
||||
project.AddModuleIncludes("common/runtime/pub")
|
||||
|
||||
LibraryTarget("mp3codecfixpt")
|
||||
|
||||
DependTarget()
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
|
||||
|
||||
The contents of this directory, and (except where otherwise
|
||||
indicated) the directories included within this directory, are
|
||||
subject to the current version of the RealNetworks Public Source
|
||||
License (the "RPSL") available at RPSL.txt in this directory, unless
|
||||
you have licensed the directory under the current version of the
|
||||
RealNetworks Community Source License (the "RCSL") available at
|
||||
RCSL.txt in this directory, in which case the RCSL will apply. You
|
||||
may also obtain the license terms directly from RealNetworks. You
|
||||
may not use the files in this directory except in compliance with the
|
||||
RPSL or, if you have a valid RCSL with RealNetworks applicable to
|
||||
this directory, the RCSL. Please see the applicable RPSL or RCSL for
|
||||
the rights, obligations and limitations governing use of the contents
|
||||
of the directory.
|
||||
|
||||
This directory is part of the Helix DNA Technology. RealNetworks is
|
||||
the developer of the Original Code and owns the copyrights in the
|
||||
portions it created.
|
||||
|
||||
This directory, and the directories included with this directory, are
|
||||
distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY
|
||||
DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY
|
||||
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||||
|
||||
Technology Compatibility Kit Test Suite(s) Location:
|
||||
http://www.helixcommunity.org/content/tck
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -1,484 +0,0 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: RCSL 1.0/RPSL 1.0
|
||||
*
|
||||
* Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
|
||||
*
|
||||
* The contents of this file, and the files included with this file, are
|
||||
* subject to the current version of the RealNetworks Public Source License
|
||||
* Version 1.0 (the "RPSL") available at
|
||||
* http://www.helixcommunity.org/content/rpsl unless you have licensed
|
||||
* the file under the RealNetworks Community Source License Version 1.0
|
||||
* (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
|
||||
* in which case the RCSL will apply. You may also obtain the license terms
|
||||
* directly from RealNetworks. You may not use this file except in
|
||||
* compliance with the RPSL or, if you have a valid RCSL with RealNetworks
|
||||
* applicable to this file, the RCSL. Please see the applicable RPSL or
|
||||
* RCSL for the rights, obligations and limitations governing use of the
|
||||
* contents of the file.
|
||||
*
|
||||
* This file is part of the Helix DNA Technology. RealNetworks is the
|
||||
* developer of the Original Code and owns the copyrights in the portions
|
||||
* it created.
|
||||
*
|
||||
* This file, and the files included with this file, is distributed and made
|
||||
* available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||
* EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
||||
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||||
*
|
||||
* Technology Compatibility Kit Test Suite(s) Location:
|
||||
* http://www.helixcommunity.org/content/tck
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/**************************************************************************************
|
||||
* Fixed-point MP3 decoder
|
||||
* Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com)
|
||||
* June 2003
|
||||
*
|
||||
* mp3dec.c - platform-independent top level MP3 decoder API
|
||||
**************************************************************************************/
|
||||
|
||||
#include "string.h"
|
||||
//#include "hlxclib/string.h" /* for memmove, memcpy (can replace with different implementations if desired) */
|
||||
#include "mp3common.h" /* includes mp3dec.h (public API) and internal, platform-independent API */
|
||||
|
||||
|
||||
//#define PROFILE
|
||||
#ifdef PROFILE
|
||||
#include "systime.h"
|
||||
#endif
|
||||
|
||||
/**************************************************************************************
|
||||
* Function: MP3InitDecoder
|
||||
*
|
||||
* Description: allocate memory for platform-specific data
|
||||
* clear all the user-accessible fields
|
||||
*
|
||||
* Inputs: none
|
||||
*
|
||||
* Outputs: none
|
||||
*
|
||||
* Return: handle to mp3 decoder instance, 0 if malloc fails
|
||||
**************************************************************************************/
|
||||
HMP3Decoder MP3InitDecoder(void)
|
||||
{
|
||||
MP3DecInfo *mp3DecInfo;
|
||||
|
||||
mp3DecInfo = AllocateBuffers();
|
||||
|
||||
return (HMP3Decoder)mp3DecInfo;
|
||||
}
|
||||
|
||||
/**************************************************************************************
|
||||
* Function: MP3FreeDecoder
|
||||
*
|
||||
* Description: free platform-specific data allocated by InitMP3Decoder
|
||||
* zero out the contents of MP3DecInfo struct
|
||||
*
|
||||
* Inputs: valid MP3 decoder instance pointer (HMP3Decoder)
|
||||
*
|
||||
* Outputs: none
|
||||
*
|
||||
* Return: none
|
||||
**************************************************************************************/
|
||||
void MP3FreeDecoder(HMP3Decoder hMP3Decoder)
|
||||
{
|
||||
MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder;
|
||||
|
||||
if (!mp3DecInfo)
|
||||
return;
|
||||
|
||||
FreeBuffers(mp3DecInfo);
|
||||
}
|
||||
|
||||
/**************************************************************************************
|
||||
* Function: MP3FindSyncWord
|
||||
*
|
||||
* Description: locate the next byte-alinged sync word in the raw mp3 stream
|
||||
*
|
||||
* Inputs: buffer to search for sync word
|
||||
* max number of bytes to search in buffer
|
||||
*
|
||||
* Outputs: none
|
||||
*
|
||||
* Return: offset to first sync word (bytes from start of buf)
|
||||
* -1 if sync not found after searching nBytes
|
||||
**************************************************************************************/
|
||||
int MP3FindSyncWord(unsigned char *buf, int nBytes)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* find byte-aligned syncword - need 12 (MPEG 1,2) or 11 (MPEG 2.5) matching bits */
|
||||
for (i = 0; i < nBytes - 1; i++) {
|
||||
if ( (buf[i+0] & SYNCWORDH) == SYNCWORDH && (buf[i+1] & SYNCWORDL) == SYNCWORDL )
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**************************************************************************************
|
||||
* Function: MP3FindFreeSync
|
||||
*
|
||||
* Description: figure out number of bytes between adjacent sync words in "free" mode
|
||||
*
|
||||
* Inputs: buffer to search for next sync word
|
||||
* the 4-byte frame header starting at the current sync word
|
||||
* max number of bytes to search in buffer
|
||||
*
|
||||
* Outputs: none
|
||||
*
|
||||
* Return: offset to next sync word, minus any pad byte (i.e. nSlots)
|
||||
* -1 if sync not found after searching nBytes
|
||||
*
|
||||
* Notes: this checks that the first 22 bits of the next frame header are the
|
||||
* same as the current frame header, but it's still not foolproof
|
||||
* (could accidentally find a sequence in the bitstream which
|
||||
* appears to match but is not actually the next frame header)
|
||||
* this could be made more error-resilient by checking several frames
|
||||
* in a row and verifying that nSlots is the same in each case
|
||||
* since free mode requires CBR (see spec) we generally only call
|
||||
* this function once (first frame) then store the result (nSlots)
|
||||
* and just use it from then on
|
||||
**************************************************************************************/
|
||||
static int MP3FindFreeSync(unsigned char *buf, unsigned char firstFH[4], int nBytes)
|
||||
{
|
||||
int offset = 0;
|
||||
unsigned char *bufPtr = buf;
|
||||
|
||||
/* loop until we either:
|
||||
* - run out of nBytes (FindMP3SyncWord() returns -1)
|
||||
* - find the next valid frame header (sync word, version, layer, CRC flag, bitrate, and sample rate
|
||||
* in next header must match current header)
|
||||
*/
|
||||
while (1) {
|
||||
offset = MP3FindSyncWord(bufPtr, nBytes);
|
||||
bufPtr += offset;
|
||||
if (offset < 0) {
|
||||
return -1;
|
||||
} else if ( (bufPtr[0] == firstFH[0]) && (bufPtr[1] == firstFH[1]) && ((bufPtr[2] & 0xfc) == (firstFH[2] & 0xfc)) ) {
|
||||
/* want to return number of bytes per frame, NOT counting the padding byte, so subtract one if padFlag == 1 */
|
||||
if ((firstFH[2] >> 1) & 0x01)
|
||||
bufPtr--;
|
||||
return bufPtr - buf;
|
||||
}
|
||||
bufPtr += 3;
|
||||
nBytes -= (offset + 3);
|
||||
};
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**************************************************************************************
|
||||
* Function: MP3GetLastFrameInfo
|
||||
*
|
||||
* Description: get info about last MP3 frame decoded (number of sampled decoded,
|
||||
* sample rate, bitrate, etc.)
|
||||
*
|
||||
* Inputs: valid MP3 decoder instance pointer (HMP3Decoder)
|
||||
* pointer to MP3FrameInfo struct
|
||||
*
|
||||
* Outputs: filled-in MP3FrameInfo struct
|
||||
*
|
||||
* Return: none
|
||||
*
|
||||
* Notes: call this right after calling MP3Decode
|
||||
**************************************************************************************/
|
||||
void MP3GetLastFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo)
|
||||
{
|
||||
MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder;
|
||||
|
||||
if (!mp3DecInfo || mp3DecInfo->layer != 3) {
|
||||
mp3FrameInfo->bitrate = 0;
|
||||
mp3FrameInfo->nChans = 0;
|
||||
mp3FrameInfo->samprate = 0;
|
||||
mp3FrameInfo->bitsPerSample = 0;
|
||||
mp3FrameInfo->outputSamps = 0;
|
||||
mp3FrameInfo->layer = 0;
|
||||
mp3FrameInfo->version = 0;
|
||||
} else {
|
||||
mp3FrameInfo->bitrate = mp3DecInfo->bitrate;
|
||||
mp3FrameInfo->nChans = mp3DecInfo->nChans;
|
||||
mp3FrameInfo->samprate = mp3DecInfo->samprate;
|
||||
mp3FrameInfo->bitsPerSample = 16;
|
||||
mp3FrameInfo->outputSamps = mp3DecInfo->nChans * (int)samplesPerFrameTab[mp3DecInfo->version][mp3DecInfo->layer - 1];
|
||||
mp3FrameInfo->layer = mp3DecInfo->layer;
|
||||
mp3FrameInfo->version = mp3DecInfo->version;
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************************
|
||||
* Function: MP3GetNextFrameInfo
|
||||
*
|
||||
* Description: parse MP3 frame header
|
||||
*
|
||||
* Inputs: valid MP3 decoder instance pointer (HMP3Decoder)
|
||||
* pointer to MP3FrameInfo struct
|
||||
* pointer to buffer containing valid MP3 frame header (located using
|
||||
* MP3FindSyncWord(), above)
|
||||
*
|
||||
* Outputs: filled-in MP3FrameInfo struct
|
||||
*
|
||||
* Return: error code, defined in mp3dec.h (0 means no error, < 0 means error)
|
||||
**************************************************************************************/
|
||||
int MP3GetNextFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo, unsigned char *buf)
|
||||
{
|
||||
MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder;
|
||||
|
||||
if (!mp3DecInfo)
|
||||
return ERR_MP3_NULL_POINTER;
|
||||
|
||||
if (UnpackFrameHeader(mp3DecInfo, buf) == -1 || mp3DecInfo->layer != 3)
|
||||
return ERR_MP3_INVALID_FRAMEHEADER;
|
||||
|
||||
MP3GetLastFrameInfo(mp3DecInfo, mp3FrameInfo);
|
||||
|
||||
return ERR_MP3_NONE;
|
||||
}
|
||||
|
||||
/**************************************************************************************
|
||||
* Function: MP3ClearBadFrame
|
||||
*
|
||||
* Description: zero out pcm buffer if error decoding MP3 frame
|
||||
*
|
||||
* Inputs: mp3DecInfo struct with correct frame size parameters filled in
|
||||
* pointer pcm output buffer
|
||||
*
|
||||
* Outputs: zeroed out pcm buffer
|
||||
*
|
||||
* Return: none
|
||||
**************************************************************************************/
|
||||
static void MP3ClearBadFrame(MP3DecInfo *mp3DecInfo, short *outbuf)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!mp3DecInfo)
|
||||
return;
|
||||
|
||||
for (i = 0; i < mp3DecInfo->nGrans * mp3DecInfo->nGranSamps * mp3DecInfo->nChans; i++)
|
||||
outbuf[i] = 0;
|
||||
}
|
||||
|
||||
/**************************************************************************************
|
||||
* Function: MP3Decode
|
||||
*
|
||||
* Description: decode one frame of MP3 data
|
||||
*
|
||||
* Inputs: valid MP3 decoder instance pointer (HMP3Decoder)
|
||||
* double pointer to buffer of MP3 data (containing headers + mainData)
|
||||
* number of valid bytes remaining in inbuf
|
||||
* pointer to outbuf, big enough to hold one frame of decoded PCM samples
|
||||
* flag indicating whether MP3 data is normal MPEG format (useSize = 0)
|
||||
* or reformatted as "self-contained" frames (useSize = 1)
|
||||
*
|
||||
* Outputs: PCM data in outbuf, interleaved LRLRLR... if stereo
|
||||
* number of output samples = nGrans * nGranSamps * nChans
|
||||
* updated inbuf pointer, updated bytesLeft
|
||||
*
|
||||
* Return: error code, defined in mp3dec.h (0 means no error, < 0 means error)
|
||||
*
|
||||
* Notes: switching useSize on and off between frames in the same stream
|
||||
* is not supported (bit reservoir is not maintained if useSize on)
|
||||
**************************************************************************************/
|
||||
int MP3Decode(HMP3Decoder hMP3Decoder, unsigned char **inbuf, int *bytesLeft, short *outbuf, int useSize)
|
||||
{
|
||||
int offset, bitOffset, mainBits, gr, ch, fhBytes, siBytes, freeFrameBytes;
|
||||
int prevBitOffset, sfBlockBits, huffBlockBits;
|
||||
unsigned char *mainPtr;
|
||||
MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder;
|
||||
|
||||
#ifdef PROFILE
|
||||
long time;
|
||||
#endif
|
||||
|
||||
if (!mp3DecInfo)
|
||||
return ERR_MP3_NULL_POINTER;
|
||||
|
||||
/* unpack frame header */
|
||||
fhBytes = UnpackFrameHeader(mp3DecInfo, *inbuf);
|
||||
if (fhBytes < 0)
|
||||
return ERR_MP3_INVALID_FRAMEHEADER; /* don't clear outbuf since we don't know size (failed to parse header) */
|
||||
*inbuf += fhBytes;
|
||||
|
||||
#ifdef PROFILE
|
||||
time = systime_get();
|
||||
#endif
|
||||
/* unpack side info */
|
||||
siBytes = UnpackSideInfo(mp3DecInfo, *inbuf);
|
||||
if (siBytes < 0) {
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_INVALID_SIDEINFO;
|
||||
}
|
||||
*inbuf += siBytes;
|
||||
*bytesLeft -= (fhBytes + siBytes);
|
||||
#ifdef PROFILE
|
||||
time = systime_get() - time;
|
||||
printf("UnpackSideInfo: %i ms\n", time);
|
||||
#endif
|
||||
|
||||
|
||||
/* if free mode, need to calculate bitrate and nSlots manually, based on frame size */
|
||||
if (mp3DecInfo->bitrate == 0 || mp3DecInfo->freeBitrateFlag) {
|
||||
if (!mp3DecInfo->freeBitrateFlag) {
|
||||
/* first time through, need to scan for next sync word and figure out frame size */
|
||||
mp3DecInfo->freeBitrateFlag = 1;
|
||||
mp3DecInfo->freeBitrateSlots = MP3FindFreeSync(*inbuf, *inbuf - fhBytes - siBytes, *bytesLeft);
|
||||
if (mp3DecInfo->freeBitrateSlots < 0) {
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_FREE_BITRATE_SYNC;
|
||||
}
|
||||
freeFrameBytes = mp3DecInfo->freeBitrateSlots + fhBytes + siBytes;
|
||||
mp3DecInfo->bitrate = (freeFrameBytes * mp3DecInfo->samprate * 8) / (mp3DecInfo->nGrans * mp3DecInfo->nGranSamps);
|
||||
}
|
||||
mp3DecInfo->nSlots = mp3DecInfo->freeBitrateSlots + CheckPadBit(mp3DecInfo); /* add pad byte, if required */
|
||||
}
|
||||
|
||||
/* useSize != 0 means we're getting reformatted (RTP) packets (see RFC 3119)
|
||||
* - calling function assembles "self-contained" MP3 frames by shifting any main_data
|
||||
* from the bit reservoir (in previous frames) to AFTER the sync word and side info
|
||||
* - calling function should set mainDataBegin to 0, and tell us exactly how large this
|
||||
* frame is (in bytesLeft)
|
||||
*/
|
||||
if (useSize) {
|
||||
mp3DecInfo->nSlots = *bytesLeft;
|
||||
if (mp3DecInfo->mainDataBegin != 0 || mp3DecInfo->nSlots <= 0) {
|
||||
/* error - non self-contained frame, or missing frame (size <= 0), could do loss concealment here */
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_INVALID_FRAMEHEADER;
|
||||
}
|
||||
|
||||
/* can operate in-place on reformatted frames */
|
||||
mp3DecInfo->mainDataBytes = mp3DecInfo->nSlots;
|
||||
mainPtr = *inbuf;
|
||||
*inbuf += mp3DecInfo->nSlots;
|
||||
*bytesLeft -= (mp3DecInfo->nSlots);
|
||||
} else {
|
||||
/* out of data - assume last or truncated frame */
|
||||
if (mp3DecInfo->nSlots > *bytesLeft) {
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_INDATA_UNDERFLOW;
|
||||
}
|
||||
|
||||
#ifdef PROFILE
|
||||
time = systime_get();
|
||||
#endif
|
||||
/* fill main data buffer with enough new data for this frame */
|
||||
if (mp3DecInfo->mainDataBytes >= mp3DecInfo->mainDataBegin) {
|
||||
/* adequate "old" main data available (i.e. bit reservoir) */
|
||||
memmove(mp3DecInfo->mainBuf, mp3DecInfo->mainBuf + mp3DecInfo->mainDataBytes - mp3DecInfo->mainDataBegin, mp3DecInfo->mainDataBegin);
|
||||
memcpy(mp3DecInfo->mainBuf + mp3DecInfo->mainDataBegin, *inbuf, mp3DecInfo->nSlots);
|
||||
|
||||
mp3DecInfo->mainDataBytes = mp3DecInfo->mainDataBegin + mp3DecInfo->nSlots;
|
||||
*inbuf += mp3DecInfo->nSlots;
|
||||
*bytesLeft -= (mp3DecInfo->nSlots);
|
||||
mainPtr = mp3DecInfo->mainBuf;
|
||||
} else {
|
||||
/* not enough data in bit reservoir from previous frames (perhaps starting in middle of file) */
|
||||
memcpy(mp3DecInfo->mainBuf + mp3DecInfo->mainDataBytes, *inbuf, mp3DecInfo->nSlots);
|
||||
mp3DecInfo->mainDataBytes += mp3DecInfo->nSlots;
|
||||
*inbuf += mp3DecInfo->nSlots;
|
||||
*bytesLeft -= (mp3DecInfo->nSlots);
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_MAINDATA_UNDERFLOW;
|
||||
}
|
||||
#ifdef PROFILE
|
||||
time = systime_get() - time;
|
||||
printf("data buffer filling: %i ms\n", time);
|
||||
#endif
|
||||
|
||||
}
|
||||
bitOffset = 0;
|
||||
mainBits = mp3DecInfo->mainDataBytes * 8;
|
||||
|
||||
/* decode one complete frame */
|
||||
for (gr = 0; gr < mp3DecInfo->nGrans; gr++) {
|
||||
for (ch = 0; ch < mp3DecInfo->nChans; ch++) {
|
||||
|
||||
#ifdef PROFILE
|
||||
time = systime_get();
|
||||
#endif
|
||||
/* unpack scale factors and compute size of scale factor block */
|
||||
prevBitOffset = bitOffset;
|
||||
offset = UnpackScaleFactors(mp3DecInfo, mainPtr, &bitOffset, mainBits, gr, ch);
|
||||
#ifdef PROFILE
|
||||
time = systime_get() - time;
|
||||
printf("UnpackScaleFactors: %i ms\n", time);
|
||||
#endif
|
||||
|
||||
sfBlockBits = 8*offset - prevBitOffset + bitOffset;
|
||||
huffBlockBits = mp3DecInfo->part23Length[gr][ch] - sfBlockBits;
|
||||
mainPtr += offset;
|
||||
mainBits -= sfBlockBits;
|
||||
|
||||
if (offset < 0 || mainBits < huffBlockBits) {
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_INVALID_SCALEFACT;
|
||||
}
|
||||
|
||||
#ifdef PROFILE
|
||||
time = systime_get();
|
||||
#endif
|
||||
/* decode Huffman code words */
|
||||
prevBitOffset = bitOffset;
|
||||
offset = DecodeHuffman(mp3DecInfo, mainPtr, &bitOffset, huffBlockBits, gr, ch);
|
||||
if (offset < 0) {
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_INVALID_HUFFCODES;
|
||||
}
|
||||
#ifdef PROFILE
|
||||
time = systime_get() - time;
|
||||
printf("Huffman: %i ms\n", time);
|
||||
#endif
|
||||
|
||||
mainPtr += offset;
|
||||
mainBits -= (8*offset - prevBitOffset + bitOffset);
|
||||
}
|
||||
|
||||
#ifdef PROFILE
|
||||
time = systime_get();
|
||||
#endif
|
||||
/* dequantize coefficients, decode stereo, reorder short blocks */
|
||||
if (Dequantize(mp3DecInfo, gr) < 0) {
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_INVALID_DEQUANTIZE;
|
||||
}
|
||||
#ifdef PROFILE
|
||||
time = systime_get() - time;
|
||||
printf("Dequantize: %i ms\n", time);
|
||||
#endif
|
||||
|
||||
/* alias reduction, inverse MDCT, overlap-add, frequency inversion */
|
||||
for (ch = 0; ch < mp3DecInfo->nChans; ch++)
|
||||
{
|
||||
#ifdef PROFILE
|
||||
time = systime_get();
|
||||
#endif
|
||||
if (IMDCT(mp3DecInfo, gr, ch) < 0) {
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_INVALID_IMDCT;
|
||||
}
|
||||
#ifdef PROFILE
|
||||
time = systime_get() - time;
|
||||
printf("IMDCT: %i ms\n", time);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef PROFILE
|
||||
time = systime_get();
|
||||
#endif
|
||||
/* subband transform - if stereo, interleaves pcm LRLRLR */
|
||||
if (Subband(mp3DecInfo, outbuf + gr*mp3DecInfo->nGranSamps*mp3DecInfo->nChans) < 0) {
|
||||
MP3ClearBadFrame(mp3DecInfo, outbuf);
|
||||
return ERR_MP3_INVALID_SUBBAND;
|
||||
}
|
||||
#ifdef PROFILE
|
||||
time = systime_get() - time;
|
||||
printf("Subband: %i ms\n", time);
|
||||
#endif
|
||||
|
||||
}
|
||||
return ERR_MP3_NONE;
|
||||
}
|
||||
@@ -1,181 +0,0 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: RCSL 1.0/RPSL 1.0
|
||||
*
|
||||
* Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
|
||||
*
|
||||
* The contents of this file, and the files included with this file, are
|
||||
* subject to the current version of the RealNetworks Public Source License
|
||||
* Version 1.0 (the "RPSL") available at
|
||||
* http://www.helixcommunity.org/content/rpsl unless you have licensed
|
||||
* the file under the RealNetworks Community Source License Version 1.0
|
||||
* (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
|
||||
* in which case the RCSL will apply. You may also obtain the license terms
|
||||
* directly from RealNetworks. You may not use this file except in
|
||||
* compliance with the RPSL or, if you have a valid RCSL with RealNetworks
|
||||
* applicable to this file, the RCSL. Please see the applicable RPSL or
|
||||
* RCSL for the rights, obligations and limitations governing use of the
|
||||
* contents of the file.
|
||||
*
|
||||
* This file is part of the Helix DNA Technology. RealNetworks is the
|
||||
* developer of the Original Code and owns the copyrights in the portions
|
||||
* it created.
|
||||
*
|
||||
* This file, and the files included with this file, is distributed and made
|
||||
* available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||
* EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
||||
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||||
*
|
||||
* Technology Compatibility Kit Test Suite(s) Location:
|
||||
* http://www.helixcommunity.org/content/tck
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/**************************************************************************************
|
||||
* Fixed-point MP3 decoder
|
||||
* Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com)
|
||||
* June 2003
|
||||
*
|
||||
* mp3tabs.c - platform-independent tables for MP3 decoder (global, read-only)
|
||||
**************************************************************************************/
|
||||
|
||||
#include "mp3common.h"
|
||||
|
||||
/* indexing = [version][samplerate index]
|
||||
* sample rate of frame (Hz)
|
||||
*/
|
||||
const int samplerateTab[3][3] = {
|
||||
{44100, 48000, 32000}, /* MPEG-1 */
|
||||
{22050, 24000, 16000}, /* MPEG-2 */
|
||||
{11025, 12000, 8000}, /* MPEG-2.5 */
|
||||
};
|
||||
|
||||
/* indexing = [version][layer][bitrate index]
|
||||
* bitrate (kbps) of frame
|
||||
* - bitrate index == 0 is "free" mode (bitrate determined on the fly by
|
||||
* counting bits between successive sync words)
|
||||
*/
|
||||
const short bitrateTab[3][3][15] = {
|
||||
{
|
||||
/* MPEG-1 */
|
||||
{ 0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448}, /* Layer 1 */
|
||||
{ 0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384}, /* Layer 2 */
|
||||
{ 0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320}, /* Layer 3 */
|
||||
},
|
||||
{
|
||||
/* MPEG-2 */
|
||||
{ 0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256}, /* Layer 1 */
|
||||
{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 2 */
|
||||
{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 3 */
|
||||
},
|
||||
{
|
||||
/* MPEG-2.5 */
|
||||
{ 0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256}, /* Layer 1 */
|
||||
{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 2 */
|
||||
{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 3 */
|
||||
},
|
||||
};
|
||||
|
||||
/* indexing = [version][layer]
|
||||
* number of samples in one frame (per channel)
|
||||
*/
|
||||
const short samplesPerFrameTab[3][3] = {
|
||||
{384, 1152, 1152 }, /* MPEG1 */
|
||||
{384, 1152, 576 }, /* MPEG2 */
|
||||
{384, 1152, 576 }, /* MPEG2.5 */
|
||||
};
|
||||
|
||||
/* layers 1, 2, 3 */
|
||||
const short bitsPerSlotTab[3] = {32, 8, 8};
|
||||
|
||||
/* indexing = [version][mono/stereo]
|
||||
* number of bytes in side info section of bitstream
|
||||
*/
|
||||
const short sideBytesTab[3][2] = {
|
||||
{17, 32}, /* MPEG-1: mono, stereo */
|
||||
{ 9, 17}, /* MPEG-2: mono, stereo */
|
||||
{ 9, 17}, /* MPEG-2.5: mono, stereo */
|
||||
};
|
||||
|
||||
/* indexing = [version][sampleRate][bitRate]
|
||||
* for layer3, nSlots = floor(samps/frame * bitRate / sampleRate / 8)
|
||||
* - add one pad slot if necessary
|
||||
*/
|
||||
const short slotTab[3][3][15] = {
|
||||
{
|
||||
/* MPEG-1 */
|
||||
{ 0, 104, 130, 156, 182, 208, 261, 313, 365, 417, 522, 626, 731, 835,1044 }, /* 44 kHz */
|
||||
{ 0, 96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960 }, /* 48 kHz */
|
||||
{ 0, 144, 180, 216, 252, 288, 360, 432, 504, 576, 720, 864,1008,1152,1440 }, /* 32 kHz */
|
||||
},
|
||||
{
|
||||
/* MPEG-2 */
|
||||
{ 0, 26, 52, 78, 104, 130, 156, 182, 208, 261, 313, 365, 417, 470, 522 }, /* 22 kHz */
|
||||
{ 0, 24, 48, 72, 96, 120, 144, 168, 192, 240, 288, 336, 384, 432, 480 }, /* 24 kHz */
|
||||
{ 0, 36, 72, 108, 144, 180, 216, 252, 288, 360, 432, 504, 576, 648, 720 }, /* 16 kHz */
|
||||
},
|
||||
{
|
||||
/* MPEG-2.5 */
|
||||
{ 0, 52, 104, 156, 208, 261, 313, 365, 417, 522, 626, 731, 835, 940,1044 }, /* 11 kHz */
|
||||
{ 0, 48, 96, 144, 192, 240, 288, 336, 384, 480, 576, 672, 768, 864, 960 }, /* 12 kHz */
|
||||
{ 0, 72, 144, 216, 288, 360, 432, 504, 576, 720, 864,1008,1152,1296,1440 }, /* 8 kHz */
|
||||
},
|
||||
};
|
||||
|
||||
/* indexing = [version][sampleRate][long (.l) or short (.s) block]
|
||||
* sfBandTable[v][s].l[cb] = index of first bin in critical band cb (long blocks)
|
||||
* sfBandTable[v][s].s[cb] = index of first bin in critical band cb (short blocks)
|
||||
*/
|
||||
const SFBandTable sfBandTable[3][3] = {
|
||||
{
|
||||
/* MPEG-1 (44, 48, 32 kHz) */
|
||||
{
|
||||
{ 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90,110,134,162,196,238,288,342,418,576 },
|
||||
{ 0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84,106,136,192 }
|
||||
},
|
||||
{
|
||||
{ 0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88,106,128,156,190,230,276,330,384,576 },
|
||||
{ 0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80,100,126,192 }
|
||||
},
|
||||
{
|
||||
{ 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82,102,126,156,194,240,296,364,448,550,576 },
|
||||
{ 0, 4, 8, 12, 16, 22, 30, 42, 58, 78,104,138,180,192 }
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
/* MPEG-2 (22, 24, 16 kHz) */
|
||||
{
|
||||
{ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 },
|
||||
{ 0, 4, 8, 12, 18, 24, 32, 42, 56, 74,100,132,174,192 }
|
||||
},
|
||||
{
|
||||
{ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,114,136,162,194,232,278,332,394,464,540,576 },
|
||||
{ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,136,180,192 }
|
||||
},
|
||||
{
|
||||
{ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 },
|
||||
{ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,134,174,192 }
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
/* MPEG-2.5 (11, 12, 8 kHz) */
|
||||
{
|
||||
{ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 },
|
||||
{ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,134,174,192 }
|
||||
},
|
||||
{
|
||||
{ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 },
|
||||
{ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,134,174,192 }
|
||||
},
|
||||
{
|
||||
{ 0, 12, 24, 36, 48, 60, 72, 88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576 },
|
||||
{ 0, 8, 16, 24, 36, 52, 72, 96,124,160,162,164,166,192 }
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
|
||||
|
||||
The contents of this directory, and (except where otherwise
|
||||
indicated) the directories included within this directory, are
|
||||
subject to the current version of the RealNetworks Public Source
|
||||
License (the "RPSL") available at RPSL.txt in this directory, unless
|
||||
you have licensed the directory under the current version of the
|
||||
RealNetworks Community Source License (the "RCSL") available at
|
||||
RCSL.txt in this directory, in which case the RCSL will apply. You
|
||||
may also obtain the license terms directly from RealNetworks. You
|
||||
may not use the files in this directory except in compliance with the
|
||||
RPSL or, if you have a valid RCSL with RealNetworks applicable to
|
||||
this directory, the RCSL. Please see the applicable RPSL or RCSL for
|
||||
the rights, obligations and limitations governing use of the contents
|
||||
of the directory.
|
||||
|
||||
This directory is part of the Helix DNA Technology. RealNetworks is
|
||||
the developer of the Original Code and owns the copyrights in the
|
||||
portions it created.
|
||||
|
||||
This directory, and the directories included with this directory, are
|
||||
distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY
|
||||
DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY
|
||||
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||||
|
||||
Technology Compatibility Kit Test Suite(s) Location:
|
||||
http://www.helixcommunity.org/content/tck
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,124 +0,0 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: RCSL 1.0/RPSL 1.0
|
||||
*
|
||||
* Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
|
||||
*
|
||||
* The contents of this file, and the files included with this file, are
|
||||
* subject to the current version of the RealNetworks Public Source License
|
||||
* Version 1.0 (the "RPSL") available at
|
||||
* http://www.helixcommunity.org/content/rpsl unless you have licensed
|
||||
* the file under the RealNetworks Community Source License Version 1.0
|
||||
* (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
|
||||
* in which case the RCSL will apply. You may also obtain the license terms
|
||||
* directly from RealNetworks. You may not use this file except in
|
||||
* compliance with the RPSL or, if you have a valid RCSL with RealNetworks
|
||||
* applicable to this file, the RCSL. Please see the applicable RPSL or
|
||||
* RCSL for the rights, obligations and limitations governing use of the
|
||||
* contents of the file.
|
||||
*
|
||||
* This file is part of the Helix DNA Technology. RealNetworks is the
|
||||
* developer of the Original Code and owns the copyrights in the portions
|
||||
* it created.
|
||||
*
|
||||
* This file, and the files included with this file, is distributed and made
|
||||
* available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||
* EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
||||
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||||
*
|
||||
* Technology Compatibility Kit Test Suite(s) Location:
|
||||
* http://www.helixcommunity.org/content/tck
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/**************************************************************************************
|
||||
* Fixed-point MP3 decoder
|
||||
* Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com)
|
||||
* June 2003
|
||||
*
|
||||
* mp3common.h - implementation-independent API's, datatypes, and definitions
|
||||
**************************************************************************************/
|
||||
|
||||
#ifndef _MP3COMMON_H
|
||||
#define _MP3COMMON_H
|
||||
|
||||
#include "mp3dec.h"
|
||||
#include "statname.h" /* do name-mangling for static linking */
|
||||
|
||||
#define MAX_SCFBD 4 /* max scalefactor bands per channel */
|
||||
#define NGRANS_MPEG1 2
|
||||
#define NGRANS_MPEG2 1
|
||||
|
||||
/* 11-bit syncword if MPEG 2.5 extensions are enabled */
|
||||
/*
|
||||
#define SYNCWORDH 0xff
|
||||
#define SYNCWORDL 0xe0
|
||||
*/
|
||||
|
||||
/* 12-bit syncword if MPEG 1,2 only are supported */
|
||||
#define SYNCWORDH 0xff
|
||||
#define SYNCWORDL 0xf0
|
||||
|
||||
typedef struct _MP3DecInfo {
|
||||
/* pointers to platform-specific data structures */
|
||||
void *FrameHeaderPS;
|
||||
void *SideInfoPS;
|
||||
void *ScaleFactorInfoPS;
|
||||
void *HuffmanInfoPS;
|
||||
void *DequantInfoPS;
|
||||
void *IMDCTInfoPS;
|
||||
void *SubbandInfoPS;
|
||||
|
||||
/* buffer which must be large enough to hold largest possible main_data section */
|
||||
unsigned char mainBuf[MAINBUF_SIZE];
|
||||
|
||||
/* special info for "free" bitrate files */
|
||||
int freeBitrateFlag;
|
||||
int freeBitrateSlots;
|
||||
|
||||
/* user-accessible info */
|
||||
int bitrate;
|
||||
int nChans;
|
||||
int samprate;
|
||||
int nGrans; /* granules per frame */
|
||||
int nGranSamps; /* samples per granule */
|
||||
int nSlots;
|
||||
int layer;
|
||||
MPEGVersion version;
|
||||
|
||||
int mainDataBegin;
|
||||
int mainDataBytes;
|
||||
|
||||
int part23Length[MAX_NGRAN][MAX_NCHAN];
|
||||
|
||||
} MP3DecInfo;
|
||||
|
||||
typedef struct _SFBandTable {
|
||||
short l[23];
|
||||
short s[14];
|
||||
} SFBandTable;
|
||||
|
||||
/* decoder functions which must be implemented for each platform */
|
||||
MP3DecInfo *AllocateBuffers(void);
|
||||
void FreeBuffers(MP3DecInfo *mp3DecInfo);
|
||||
int CheckPadBit(MP3DecInfo *mp3DecInfo);
|
||||
int UnpackFrameHeader(MP3DecInfo *mp3DecInfo, unsigned char *buf);
|
||||
int UnpackSideInfo(MP3DecInfo *mp3DecInfo, unsigned char *buf);
|
||||
int DecodeHuffman(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int huffBlockBits, int gr, int ch);
|
||||
int Dequantize(MP3DecInfo *mp3DecInfo, int gr);
|
||||
int IMDCT(MP3DecInfo *mp3DecInfo, int gr, int ch);
|
||||
int UnpackScaleFactors(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int bitsAvail, int gr, int ch);
|
||||
int Subband(MP3DecInfo *mp3DecInfo, short *pcmBuf);
|
||||
|
||||
/* mp3tabs.c - global ROM tables */
|
||||
extern const int samplerateTab[3][3];
|
||||
extern const short bitrateTab[3][3][15];
|
||||
extern const short samplesPerFrameTab[3][3];
|
||||
extern const short bitsPerSlotTab[3];
|
||||
extern const short sideBytesTab[3][2];
|
||||
extern const short slotTab[3][3][15];
|
||||
extern const SFBandTable sfBandTable[3][3];
|
||||
|
||||
#endif /* _MP3COMMON_H */
|
||||
@@ -1,132 +0,0 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: RCSL 1.0/RPSL 1.0
|
||||
*
|
||||
* Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
|
||||
*
|
||||
* The contents of this file, and the files included with this file, are
|
||||
* subject to the current version of the RealNetworks Public Source License
|
||||
* Version 1.0 (the "RPSL") available at
|
||||
* http://www.helixcommunity.org/content/rpsl unless you have licensed
|
||||
* the file under the RealNetworks Community Source License Version 1.0
|
||||
* (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
|
||||
* in which case the RCSL will apply. You may also obtain the license terms
|
||||
* directly from RealNetworks. You may not use this file except in
|
||||
* compliance with the RPSL or, if you have a valid RCSL with RealNetworks
|
||||
* applicable to this file, the RCSL. Please see the applicable RPSL or
|
||||
* RCSL for the rights, obligations and limitations governing use of the
|
||||
* contents of the file.
|
||||
*
|
||||
* This file is part of the Helix DNA Technology. RealNetworks is the
|
||||
* developer of the Original Code and owns the copyrights in the portions
|
||||
* it created.
|
||||
*
|
||||
* This file, and the files included with this file, is distributed and made
|
||||
* available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||
* EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
||||
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||||
*
|
||||
* Technology Compatibility Kit Test Suite(s) Location:
|
||||
* http://www.helixcommunity.org/content/tck
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/**************************************************************************************
|
||||
* Fixed-point MP3 decoder
|
||||
* Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com)
|
||||
* June 2003
|
||||
*
|
||||
* mp3dec.h - public C API for MP3 decoder
|
||||
**************************************************************************************/
|
||||
|
||||
#ifndef _MP3DEC_H
|
||||
#define _MP3DEC_H
|
||||
|
||||
#if defined(_WIN32) && !defined(_WIN32_WCE)
|
||||
#
|
||||
#elif defined(_WIN32) && defined(_WIN32_WCE) && defined(ARM)
|
||||
#
|
||||
#elif defined(_WIN32) && defined(WINCE_EMULATOR)
|
||||
#
|
||||
#elif defined(ARM_ADS)
|
||||
#
|
||||
#elif defined(_SYMBIAN) && defined(__WINS__) /* Symbian emulator for Ix86 */
|
||||
#
|
||||
#elif defined(__GNUC__) && defined(ARM)
|
||||
#
|
||||
#elif defined(__GNUC__) && defined(__i386__)
|
||||
#
|
||||
#elif defined(_OPENWAVE_SIMULATOR) || defined(_OPENWAVE_ARMULATOR)
|
||||
#
|
||||
#else
|
||||
//#error No platform defined. See valid options in mp3dec.h
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* determining MAINBUF_SIZE:
|
||||
* max mainDataBegin = (2^9 - 1) bytes (since 9-bit offset) = 511
|
||||
* max nSlots (concatenated with mainDataBegin bytes from before) = 1440 - 9 - 4 + 1 = 1428
|
||||
* 511 + 1428 = 1939, round up to 1940 (4-byte align)
|
||||
*/
|
||||
#define MAINBUF_SIZE 1940
|
||||
|
||||
#define MAX_NGRAN 2 /* max granules */
|
||||
#define MAX_NCHAN 2 /* max channels */
|
||||
#define MAX_NSAMP 576 /* max samples per channel, per granule */
|
||||
|
||||
/* map to 0,1,2 to make table indexing easier */
|
||||
typedef enum {
|
||||
MPEG1 = 0,
|
||||
MPEG2 = 1,
|
||||
MPEG25 = 2
|
||||
} MPEGVersion;
|
||||
|
||||
typedef void *HMP3Decoder;
|
||||
|
||||
enum {
|
||||
ERR_MP3_NONE = 0,
|
||||
ERR_MP3_INDATA_UNDERFLOW = -1,
|
||||
ERR_MP3_MAINDATA_UNDERFLOW = -2,
|
||||
ERR_MP3_FREE_BITRATE_SYNC = -3,
|
||||
ERR_MP3_OUT_OF_MEMORY = -4,
|
||||
ERR_MP3_NULL_POINTER = -5,
|
||||
ERR_MP3_INVALID_FRAMEHEADER = -6,
|
||||
ERR_MP3_INVALID_SIDEINFO = -7,
|
||||
ERR_MP3_INVALID_SCALEFACT = -8,
|
||||
ERR_MP3_INVALID_HUFFCODES = -9,
|
||||
ERR_MP3_INVALID_DEQUANTIZE = -10,
|
||||
ERR_MP3_INVALID_IMDCT = -11,
|
||||
ERR_MP3_INVALID_SUBBAND = -12,
|
||||
|
||||
ERR_UNKNOWN = -9999
|
||||
};
|
||||
|
||||
typedef struct _MP3FrameInfo {
|
||||
int bitrate;
|
||||
int nChans;
|
||||
int samprate;
|
||||
int bitsPerSample;
|
||||
int outputSamps;
|
||||
int layer;
|
||||
int version;
|
||||
} MP3FrameInfo;
|
||||
|
||||
/* public API */
|
||||
HMP3Decoder MP3InitDecoder(void);
|
||||
void MP3FreeDecoder(HMP3Decoder hMP3Decoder);
|
||||
int MP3Decode(HMP3Decoder hMP3Decoder, unsigned char **inbuf, int *bytesLeft, short *outbuf, int useSize);
|
||||
|
||||
void MP3GetLastFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo);
|
||||
int MP3GetNextFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo, unsigned char *buf);
|
||||
int MP3FindSyncWord(unsigned char *buf, int nBytes);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _MP3DEC_H */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user