diff options
Diffstat (limited to 'libSBRdec/src/psbitdec.cpp')
-rw-r--r-- | libSBRdec/src/psbitdec.cpp | 499 |
1 files changed, 246 insertions, 253 deletions
diff --git a/libSBRdec/src/psbitdec.cpp b/libSBRdec/src/psbitdec.cpp index 29bddf7..f40a156 100644 --- a/libSBRdec/src/psbitdec.cpp +++ b/libSBRdec/src/psbitdec.cpp @@ -1,74 +1,85 @@ - -/* ----------------------------------------------------------------------------------------------------------- +/* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. - All rights reserved. +© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +Forschung e.V. All rights reserved. 1. INTRODUCTION -The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements -the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. -This FDK AAC Codec software is intended to be used on a wide variety of Android devices. - -AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual -audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by -independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part -of the MPEG specifications. - -Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) -may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners -individually for the purpose of encoding or decoding bit streams in products that are compliant with -the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license -these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec -software may already be covered under those patent licenses when it is used for those licensed purposes only. - -Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, -are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional -applications information and documentation. +The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +scheme for digital audio. This FDK AAC Codec software is intended to be used on +a wide variety of Android devices. + +AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +general perceptual audio codecs. AAC-ELD is considered the best-performing +full-bandwidth communications codec by independent studies and is widely +deployed. AAC has been standardized by ISO and IEC as part of the MPEG +specifications. + +Patent licenses for necessary patent claims for the FDK AAC Codec (including +those of Fraunhofer) may be obtained through Via Licensing +(www.vialicensing.com) or through the respective patent owners individually for +the purpose of encoding or decoding bit streams in products that are compliant +with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +Android devices already license these patent claims through Via Licensing or +directly from the patent owners, and therefore FDK AAC Codec software may +already be covered under those patent licenses when it is used for those +licensed purposes only. + +Commercially-licensed AAC software libraries, including floating-point versions +with enhanced sound quality, are also available from Fraunhofer. Users are +encouraged to check the Fraunhofer website for additional applications +information and documentation. 2. COPYRIGHT LICENSE -Redistribution and use in source and binary forms, with or without modification, are permitted without -payment of copyright license fees provided that you satisfy the following conditions: +Redistribution and use in source and binary forms, with or without modification, +are permitted without payment of copyright license fees provided that you +satisfy the following conditions: -You must retain the complete text of this software license in redistributions of the FDK AAC Codec or -your modifications thereto in source code form. +You must retain the complete text of this software license in redistributions of +the FDK AAC Codec or your modifications thereto in source code form. -You must retain the complete text of this software license in the documentation and/or other materials -provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. -You must make available free of charge copies of the complete source code of the FDK AAC Codec and your +You must retain the complete text of this software license in the documentation +and/or other materials provided with redistributions of the FDK AAC Codec or +your modifications thereto in binary form. You must make available free of +charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. -The name of Fraunhofer may not be used to endorse or promote products derived from this library without -prior written permission. +The name of Fraunhofer may not be used to endorse or promote products derived +from this library without prior written permission. -You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec -software or your modifications thereto. +You may not charge copyright license fees for anyone to use, copy or distribute +the FDK AAC Codec software or your modifications thereto. -Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software -and the date of any change. For modified versions of the FDK AAC Codec, the term -"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term -"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." +Your modified versions of the FDK AAC Codec must carry prominent notices stating +that you changed the software and the date of any change. For modified versions +of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +AAC Codec Library for Android." 3. NO PATENT LICENSE -NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, -ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with -respect to this software. +NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +Fraunhofer provides no warranty of patent non-infringement with respect to this +software. -You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized -by appropriate patent licenses. +You may use this FDK AAC Codec software or modifications thereto only for +purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER -This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors -"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties -of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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), arising in any way out of the use of this software, even if -advised of the possibility of such damage. +This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +including but not limited to the implied warranties of merchantability and +fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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), arising in any way out of the use of +this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION @@ -79,17 +90,23 @@ Am Wolfsmantel 33 www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------------------------------------ */ +----------------------------------------------------------------------------- */ -#include "psbitdec.h" +/**************************** SBR decoder library ****************************** + + Author(s): + + Description: + +*******************************************************************************/ +#include "psbitdec.h" #include "sbr_rom.h" #include "huff_dec.h" /* PS dec privat functions */ SBR_ERROR ResetPsDec(HANDLE_PS_DEC h_ps_d); -void ResetPsDeCor (HANDLE_PS_DEC h_ps_d); /***************************************************************************/ /*! @@ -98,24 +115,24 @@ void ResetPsDeCor (HANDLE_PS_DEC h_ps_d); \return index of huffman codebook table ****************************************************************************/ -static SCHAR -decode_huff_cw (Huffman h, /*!< pointer to huffman codebook table */ - HANDLE_FDK_BITSTREAM hBitBuf, /*!< Handle to Bitbuffer */ - int *length) /*!< length of huffman codeword (or NULL) */ +static SCHAR decode_huff_cw( + Huffman h, /*!< pointer to huffman codebook table */ + HANDLE_FDK_BITSTREAM hBitBuf, /*!< Handle to Bitbuffer */ + int *length) /*!< length of huffman codeword (or NULL) */ { UCHAR bit = 0; SCHAR index = 0; UCHAR bitCount = 0; while (index >= 0) { - bit = FDKreadBits (hBitBuf, 1); + bit = FDKreadBits(hBitBuf, 1); bitCount++; index = h[index][bit]; } if (length) { *length = bitCount; } - return( index+64 ); /* Add offset */ + return (index + 64); /* Add offset */ } /***************************************************************************/ @@ -126,14 +143,10 @@ decode_huff_cw (Huffman h, /*!< pointer to huffman codebook ****************************************************************************/ -static SCHAR -limitMinMax(SCHAR i, - SCHAR min, - SCHAR max) -{ - if (i<min) +static SCHAR limitMinMax(SCHAR i, SCHAR min, SCHAR max) { + if (i < min) return min; - else if (i>max) + else if (i > max) return max; else return i; @@ -150,44 +163,38 @@ limitMinMax(SCHAR i, \return none ****************************************************************************/ -static void -deltaDecodeArray(SCHAR enable, - SCHAR *aIndex, /*!< ICC/IID parameters */ - SCHAR *aPrevFrameIndex, /*!< ICC/IID parameters of previous frame */ - SCHAR DtDf, - UCHAR nrElements, /*!< as conveyed in bitstream */ - /*!< output array size: nrElements*stride */ - UCHAR stride, /*!< 1=dflt, 2=half freq. resolution */ - SCHAR minIdx, - SCHAR maxIdx) -{ +static void deltaDecodeArray( + SCHAR enable, SCHAR *aIndex, /*!< ICC/IID parameters */ + SCHAR *aPrevFrameIndex, /*!< ICC/IID parameters of previous frame */ + SCHAR DtDf, UCHAR nrElements, /*!< as conveyed in bitstream */ + /*!< output array size: nrElements*stride */ + UCHAR stride, /*!< 1=dflt, 2=half freq. resolution */ + SCHAR minIdx, SCHAR maxIdx) { int i; /* Delta decode */ - if ( enable==1 ) { - if (DtDf == 0) { /* Delta coded in freq */ + if (enable == 1) { + if (DtDf == 0) { /* Delta coded in freq */ aIndex[0] = 0 + aIndex[0]; - aIndex[0] = limitMinMax(aIndex[0],minIdx,maxIdx); + aIndex[0] = limitMinMax(aIndex[0], minIdx, maxIdx); for (i = 1; i < nrElements; i++) { - aIndex[i] = aIndex[i-1] + aIndex[i]; - aIndex[i] = limitMinMax(aIndex[i],minIdx,maxIdx); + aIndex[i] = aIndex[i - 1] + aIndex[i]; + aIndex[i] = limitMinMax(aIndex[i], minIdx, maxIdx); } - } - else { /* Delta time */ + } else { /* Delta time */ for (i = 0; i < nrElements; i++) { - aIndex[i] = aPrevFrameIndex[i*stride] + aIndex[i]; - aIndex[i] = limitMinMax(aIndex[i],minIdx,maxIdx); + aIndex[i] = aPrevFrameIndex[i * stride] + aIndex[i]; + aIndex[i] = limitMinMax(aIndex[i], minIdx, maxIdx); } } - } - else { /* No data is sent, set index to zero */ + } else { /* No data is sent, set index to zero */ for (i = 0; i < nrElements; i++) { aIndex[i] = 0; } } - if (stride==2) { - for (i=nrElements*stride-1; i>0; i--) { - aIndex[i] = aIndex[i>>1]; + if (stride == 2) { + for (i = nrElements * stride - 1; i > 0; i--) { + aIndex[i] = aIndex[i >> 1]; } } } @@ -199,33 +206,32 @@ deltaDecodeArray(SCHAR enable, \return none ****************************************************************************/ -static void map34IndexTo20 (SCHAR *aIndex, /*!< decoded ICC/IID parameters */ - UCHAR noBins) /*!< number of stereo bands */ +static void map34IndexTo20(SCHAR *aIndex, /*!< decoded ICC/IID parameters */ + UCHAR noBins) /*!< number of stereo bands */ { - aIndex[0] = (2*aIndex[0]+aIndex[1])/3; - aIndex[1] = (aIndex[1]+2*aIndex[2])/3; - aIndex[2] = (2*aIndex[3]+aIndex[4])/3; - aIndex[3] = (aIndex[4]+2*aIndex[5])/3; - aIndex[4] = (aIndex[6]+aIndex[7])/2; - aIndex[5] = (aIndex[8]+aIndex[9])/2; - aIndex[6] = aIndex[10]; - aIndex[7] = aIndex[11]; - aIndex[8] = (aIndex[12]+aIndex[13])/2; - aIndex[9] = (aIndex[14]+aIndex[15])/2; + aIndex[0] = (2 * aIndex[0] + aIndex[1]) / 3; + aIndex[1] = (aIndex[1] + 2 * aIndex[2]) / 3; + aIndex[2] = (2 * aIndex[3] + aIndex[4]) / 3; + aIndex[3] = (aIndex[4] + 2 * aIndex[5]) / 3; + aIndex[4] = (aIndex[6] + aIndex[7]) / 2; + aIndex[5] = (aIndex[8] + aIndex[9]) / 2; + aIndex[6] = aIndex[10]; + aIndex[7] = aIndex[11]; + aIndex[8] = (aIndex[12] + aIndex[13]) / 2; + aIndex[9] = (aIndex[14] + aIndex[15]) / 2; aIndex[10] = aIndex[16]; /* For IPD/OPD it stops here */ - if (noBins == NO_HI_RES_BINS) - { + if (noBins == NO_HI_RES_BINS) { aIndex[11] = aIndex[17]; aIndex[12] = aIndex[18]; aIndex[13] = aIndex[19]; - aIndex[14] = (aIndex[20]+aIndex[21])/2; - aIndex[15] = (aIndex[22]+aIndex[23])/2; - aIndex[16] = (aIndex[24]+aIndex[25])/2; - aIndex[17] = (aIndex[26]+aIndex[27])/2; - aIndex[18] = (aIndex[28]+aIndex[29]+aIndex[30]+aIndex[31])/4; - aIndex[19] = (aIndex[32]+aIndex[33])/2; + aIndex[14] = (aIndex[20] + aIndex[21]) / 2; + aIndex[15] = (aIndex[22] + aIndex[23]) / 2; + aIndex[16] = (aIndex[24] + aIndex[25]) / 2; + aIndex[17] = (aIndex[26] + aIndex[27]) / 2; + aIndex[18] = (aIndex[28] + aIndex[29] + aIndex[30] + aIndex[31]) / 4; + aIndex[19] = (aIndex[32] + aIndex[33]) / 2; } } @@ -236,24 +242,28 @@ static void map34IndexTo20 (SCHAR *aIndex, /*!< decoded ICC/IID parameters */ \return PS processing flag. If set to 1 ****************************************************************************/ -int -DecodePs( struct PS_DEC *h_ps_d, /*!< PS handle */ - const UCHAR frameError ) /*!< Flag telling that frame had errors */ -{ +int DecodePs(struct PS_DEC *h_ps_d, /*!< PS handle */ + const UCHAR frameError, /*!< Flag telling that frame had errors */ + PS_DEC_COEFFICIENTS *pScratch) { MPEG_PS_BS_DATA *pBsData; UCHAR gr, env; - int bPsHeaderValid, bPsDataAvail; + int bPsHeaderValid, bPsDataAvail; + + /* Assign Scratch */ + h_ps_d->specificTo.mpeg.pCoef = pScratch; /* Shortcuts to avoid deferencing and keep the code readable */ pBsData = &h_ps_d->bsData[h_ps_d->processSlot].mpeg; bPsHeaderValid = pBsData->bPsHeaderValid; - bPsDataAvail = (h_ps_d->bPsDataAvail[h_ps_d->processSlot] == ppt_mpeg) ? 1 : 0; + bPsDataAvail = + (h_ps_d->bPsDataAvail[h_ps_d->processSlot] == ppt_mpeg) ? 1 : 0; - /*************************************************************************************** - * Decide whether to process or to conceal PS data or not. */ + /*************************************************************************************** + * Decide whether to process or to conceal PS data or not. */ - if ( ( h_ps_d->psDecodedPrv && !frameError && !bPsDataAvail) - || (!h_ps_d->psDecodedPrv && (frameError || !bPsDataAvail || !bPsHeaderValid)) ) { + if ((h_ps_d->psDecodedPrv && !frameError && !bPsDataAvail) || + (!h_ps_d->psDecodedPrv && + (frameError || !bPsDataAvail || !bPsHeaderValid))) { /* Don't apply PS processing. * Declare current PS header and bitstream data invalid. */ pBsData->bPsHeaderValid = 0; @@ -261,87 +271,80 @@ DecodePs( struct PS_DEC *h_ps_d, /*!< PS handle */ return (0); } - if (frameError || !bPsHeaderValid) - { /* no new PS data available (e.g. frame loss) */ + if (frameError || + !bPsHeaderValid) { /* no new PS data available (e.g. frame loss) */ /* => keep latest data constant (i.e. FIX with noEnv=0) */ pBsData->noEnv = 0; } - /*************************************************************************************** - * Decode bitstream payload or prepare parameter for concealment: - */ - for (env=0; env<pBsData->noEnv; env++) { + /*************************************************************************************** + * Decode bitstream payload or prepare parameter for concealment: + */ + for (env = 0; env < pBsData->noEnv; env++) { SCHAR *aPrevIidIndex; SCHAR *aPrevIccIndex; - UCHAR noIidSteps = pBsData->bFineIidQ?NO_IID_STEPS_FINE:NO_IID_STEPS; + UCHAR noIidSteps = pBsData->bFineIidQ ? NO_IID_STEPS_FINE : NO_IID_STEPS; - if (env==0) { + if (env == 0) { aPrevIidIndex = h_ps_d->specificTo.mpeg.aIidPrevFrameIndex; aPrevIccIndex = h_ps_d->specificTo.mpeg.aIccPrevFrameIndex; - } - else { - aPrevIidIndex = pBsData->aaIidIndex[env-1]; - aPrevIccIndex = pBsData->aaIccIndex[env-1]; + } else { + aPrevIidIndex = pBsData->aaIidIndex[env - 1]; + aPrevIccIndex = pBsData->aaIccIndex[env - 1]; } - deltaDecodeArray(pBsData->bEnableIid, - pBsData->aaIidIndex[env], - aPrevIidIndex, - pBsData->abIidDtFlag[env], + deltaDecodeArray(pBsData->bEnableIid, pBsData->aaIidIndex[env], + aPrevIidIndex, pBsData->abIidDtFlag[env], FDK_sbrDecoder_aNoIidBins[pBsData->freqResIid], - (pBsData->freqResIid)?1:2, - -noIidSteps, - noIidSteps); - - deltaDecodeArray(pBsData->bEnableIcc, - pBsData->aaIccIndex[env], - aPrevIccIndex, - pBsData->abIccDtFlag[env], + (pBsData->freqResIid) ? 1 : 2, -noIidSteps, noIidSteps); + + deltaDecodeArray(pBsData->bEnableIcc, pBsData->aaIccIndex[env], + aPrevIccIndex, pBsData->abIccDtFlag[env], FDK_sbrDecoder_aNoIccBins[pBsData->freqResIcc], - (pBsData->freqResIcc)?1:2, - 0, - NO_ICC_STEPS-1); - } /* for (env=0; env<pBsData->noEnv; env++) */ + (pBsData->freqResIcc) ? 1 : 2, 0, NO_ICC_STEPS - 1); + } /* for (env=0; env<pBsData->noEnv; env++) */ /* handling of FIX noEnv=0 */ - if (pBsData->noEnv==0) { + if (pBsData->noEnv == 0) { /* set noEnv=1, keep last parameters or force 0 if not enabled */ pBsData->noEnv = 1; if (pBsData->bEnableIid) { + pBsData->bFineIidQ = h_ps_d->specificTo.mpeg.bPrevFrameFineIidQ; for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { - pBsData->aaIidIndex[pBsData->noEnv-1][gr] = - h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr]; + pBsData->aaIidIndex[pBsData->noEnv - 1][gr] = + h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr]; } - } - else { + } else { for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { - pBsData->aaIidIndex[pBsData->noEnv-1][gr] = 0; + pBsData->aaIidIndex[pBsData->noEnv - 1][gr] = 0; } } if (pBsData->bEnableIcc) { for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { - pBsData->aaIccIndex[pBsData->noEnv-1][gr] = - h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr]; + pBsData->aaIccIndex[pBsData->noEnv - 1][gr] = + h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr]; } - } - else { + } else { for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { - pBsData->aaIccIndex[pBsData->noEnv-1][gr] = 0; + pBsData->aaIccIndex[pBsData->noEnv - 1][gr] = 0; } } } + /* Update previous frame Iid quantization */ + h_ps_d->specificTo.mpeg.bPrevFrameFineIidQ = pBsData->bFineIidQ; + /* Update previous frame index buffers */ for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr] = - pBsData->aaIidIndex[pBsData->noEnv-1][gr]; + pBsData->aaIidIndex[pBsData->noEnv - 1][gr]; } for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr] = - pBsData->aaIccIndex[pBsData->noEnv-1][gr]; + pBsData->aaIccIndex[pBsData->noEnv - 1][gr]; } /* PS data from bitstream (if avail) was decoded now */ @@ -351,15 +354,14 @@ DecodePs( struct PS_DEC *h_ps_d, /*!< PS handle */ if (pBsData->bFrameClass == 0) { /* FIX_BORDERS NoEnv=0,1,2,4 */ pBsData->aEnvStartStop[0] = 0; - for (env=1; env<pBsData->noEnv; env++) { + for (env = 1; env < pBsData->noEnv; env++) { pBsData->aEnvStartStop[env] = - (env * h_ps_d->noSubSamples) / pBsData->noEnv; + (env * h_ps_d->noSubSamples) / pBsData->noEnv; } pBsData->aEnvStartStop[pBsData->noEnv] = h_ps_d->noSubSamples; /* 1024 (32 slots) env borders: 0, 8, 16, 24, 32 */ /* 960 (30 slots) env borders: 0, 7, 15, 22, 30 */ - } - else { /* if (h_ps_d->bFrameClass == 0) */ + } else { /* if (h_ps_d->bFrameClass == 0) */ /* VAR_BORDERS NoEnv=1,2,3,4 */ pBsData->aEnvStartStop[0] = 0; @@ -368,55 +370,59 @@ DecodePs( struct PS_DEC *h_ps_d, /*!< PS handle */ if (pBsData->aEnvStartStop[pBsData->noEnv] < h_ps_d->noSubSamples) { for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { pBsData->aaIidIndex[pBsData->noEnv][gr] = - pBsData->aaIidIndex[pBsData->noEnv-1][gr]; + pBsData->aaIidIndex[pBsData->noEnv - 1][gr]; } for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { pBsData->aaIccIndex[pBsData->noEnv][gr] = - pBsData->aaIccIndex[pBsData->noEnv-1][gr]; + pBsData->aaIccIndex[pBsData->noEnv - 1][gr]; } pBsData->noEnv++; pBsData->aEnvStartStop[pBsData->noEnv] = h_ps_d->noSubSamples; } /* enforce strictly monotonic increasing borders */ - for (env=1; env<pBsData->noEnv; env++) { + for (env = 1; env < pBsData->noEnv; env++) { UCHAR thr; thr = (UCHAR)h_ps_d->noSubSamples - (pBsData->noEnv - env); if (pBsData->aEnvStartStop[env] > thr) { pBsData->aEnvStartStop[env] = thr; - } - else { - thr = pBsData->aEnvStartStop[env-1]+1; + } else { + thr = pBsData->aEnvStartStop[env - 1] + 1; if (pBsData->aEnvStartStop[env] < thr) { pBsData->aEnvStartStop[env] = thr; } } } - } /* if (h_ps_d->bFrameClass == 0) ... else */ + } /* if (h_ps_d->bFrameClass == 0) ... else */ /* copy data prior to possible 20<->34 in-place mapping */ - for (env=0; env<pBsData->noEnv; env++) { + for (env = 0; env < pBsData->noEnv; env++) { UCHAR i; - for (i=0; i<NO_HI_RES_IID_BINS; i++) { - h_ps_d->specificTo.mpeg.coef.aaIidIndexMapped[env][i] = pBsData->aaIidIndex[env][i]; + for (i = 0; i < NO_HI_RES_IID_BINS; i++) { + h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][i] = + pBsData->aaIidIndex[env][i]; } - for (i=0; i<NO_HI_RES_ICC_BINS; i++) { - h_ps_d->specificTo.mpeg.coef.aaIccIndexMapped[env][i] = pBsData->aaIccIndex[env][i]; + for (i = 0; i < NO_HI_RES_ICC_BINS; i++) { + h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][i] = + pBsData->aaIccIndex[env][i]; } } - /* MPEG baseline PS */ - /* Baseline version of PS always uses the hybrid filter structure with 20 stereo bands. */ - /* If ICC/IID parameters for 34 stereo bands are decoded they have to be mapped to 20 */ - /* stereo bands. */ - /* Additionaly the IPD/OPD parameters won't be used. */ - - for (env=0; env<pBsData->noEnv; env++) { + /* Baseline version of PS always uses the hybrid filter structure with 20 + * stereo bands. */ + /* If ICC/IID parameters for 34 stereo bands are decoded they have to be + * mapped to 20 */ + /* stereo bands. */ + /* Additionaly the IPD/OPD parameters won't be used. */ + + for (env = 0; env < pBsData->noEnv; env++) { if (pBsData->freqResIid == 2) - map34IndexTo20 (h_ps_d->specificTo.mpeg.coef.aaIidIndexMapped[env], NO_HI_RES_IID_BINS); + map34IndexTo20(h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env], + NO_HI_RES_IID_BINS); if (pBsData->freqResIcc == 2) - map34IndexTo20 (h_ps_d->specificTo.mpeg.coef.aaIccIndexMapped[env], NO_HI_RES_ICC_BINS); + map34IndexTo20(h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env], + NO_HI_RES_ICC_BINS); /* IPD/OPD is disabled in baseline version and thus was removed here */ } @@ -424,7 +430,6 @@ DecodePs( struct PS_DEC *h_ps_d, /*!< PS handle */ return (1); } - /***************************************************************************/ /*! @@ -433,62 +438,60 @@ DecodePs( struct PS_DEC *h_ps_d, /*!< PS handle */ \return ****************************************************************************/ -unsigned int -ReadPsData (HANDLE_PS_DEC h_ps_d, /*!< handle to struct PS_DEC */ - HANDLE_FDK_BITSTREAM hBitBuf, /*!< handle to struct BIT_BUF */ - int nBitsLeft /*!< max number of bits available */ - ) -{ +unsigned int ReadPsData( + HANDLE_PS_DEC h_ps_d, /*!< handle to struct PS_DEC */ + HANDLE_FDK_BITSTREAM hBitBuf, /*!< handle to struct BIT_BUF */ + int nBitsLeft /*!< max number of bits available */ +) { MPEG_PS_BS_DATA *pBsData; - UCHAR gr, env; - SCHAR dtFlag; - INT startbits; - Huffman CurrentTable; - SCHAR bEnableHeader; + UCHAR gr, env; + SCHAR dtFlag; + INT startbits; + Huffman CurrentTable; + SCHAR bEnableHeader; - if (!h_ps_d) - return 0; + if (!h_ps_d) return 0; pBsData = &h_ps_d->bsData[h_ps_d->bsReadSlot].mpeg; if (h_ps_d->bsReadSlot != h_ps_d->bsLastSlot) { /* Copy last header data */ - FDKmemcpy(pBsData, &h_ps_d->bsData[h_ps_d->bsLastSlot].mpeg, sizeof(MPEG_PS_BS_DATA)); + FDKmemcpy(pBsData, &h_ps_d->bsData[h_ps_d->bsLastSlot].mpeg, + sizeof(MPEG_PS_BS_DATA)); } + startbits = (INT)FDKgetValidBits(hBitBuf); - startbits = (INT) FDKgetValidBits(hBitBuf); - - bEnableHeader = (SCHAR) FDKreadBits (hBitBuf, 1); + bEnableHeader = (SCHAR)FDKreadBits(hBitBuf, 1); /* Read header */ if (bEnableHeader) { pBsData->bPsHeaderValid = 1; - pBsData->bEnableIid = (UCHAR) FDKreadBits (hBitBuf, 1); + pBsData->bEnableIid = (UCHAR)FDKreadBits(hBitBuf, 1); if (pBsData->bEnableIid) { - pBsData->modeIid = (UCHAR) FDKreadBits (hBitBuf, 3); + pBsData->modeIid = (UCHAR)FDKreadBits(hBitBuf, 3); } - pBsData->bEnableIcc = (UCHAR) FDKreadBits (hBitBuf, 1); + pBsData->bEnableIcc = (UCHAR)FDKreadBits(hBitBuf, 1); if (pBsData->bEnableIcc) { - pBsData->modeIcc = (UCHAR) FDKreadBits (hBitBuf, 3); + pBsData->modeIcc = (UCHAR)FDKreadBits(hBitBuf, 3); } - pBsData->bEnableExt = (UCHAR) FDKreadBits (hBitBuf, 1); + pBsData->bEnableExt = (UCHAR)FDKreadBits(hBitBuf, 1); } - pBsData->bFrameClass = (UCHAR) FDKreadBits (hBitBuf, 1); + pBsData->bFrameClass = (UCHAR)FDKreadBits(hBitBuf, 1); if (pBsData->bFrameClass == 0) { /* FIX_BORDERS NoEnv=0,1,2,4 */ - pBsData->noEnv = FDK_sbrDecoder_aFixNoEnvDecode[(UCHAR) FDKreadBits (hBitBuf, 2)]; + pBsData->noEnv = + FDK_sbrDecoder_aFixNoEnvDecode[(UCHAR)FDKreadBits(hBitBuf, 2)]; /* all additional handling of env borders is now in DecodePs() */ - } - else { + } else { /* VAR_BORDERS NoEnv=1,2,3,4 */ - pBsData->noEnv = 1+(UCHAR) FDKreadBits (hBitBuf, 2); - for (env=1; env<pBsData->noEnv+1; env++) - pBsData->aEnvStartStop[env] = ((UCHAR) FDKreadBits (hBitBuf, 5)) + 1; + pBsData->noEnv = 1 + (UCHAR)FDKreadBits(hBitBuf, 2); + for (env = 1; env < pBsData->noEnv + 1; env++) + pBsData->aEnvStartStop[env] = ((UCHAR)FDKreadBits(hBitBuf, 5)) + 1; /* all additional handling of env borders is now in DecodePs() */ } @@ -497,77 +500,72 @@ ReadPsData (HANDLE_PS_DEC h_ps_d, /*!< handle to struct PS_DEC */ /* no useful PS data could be read from bitstream */ h_ps_d->bPsDataAvail[h_ps_d->bsReadSlot] = ppt_none; /* discard all remaining bits */ - nBitsLeft -= startbits - FDKgetValidBits(hBitBuf); - while (nBitsLeft) { + nBitsLeft -= startbits - (INT)FDKgetValidBits(hBitBuf); + while (nBitsLeft > 0) { int i = nBitsLeft; - if (i>8) { + if (i > 8) { i = 8; } - FDKreadBits (hBitBuf, i); + FDKreadBits(hBitBuf, i); nBitsLeft -= i; } - return (startbits - FDKgetValidBits(hBitBuf)); + return (UINT)(startbits - (INT)FDKgetValidBits(hBitBuf)); } - if (pBsData->modeIid > 2){ - pBsData->freqResIid = pBsData->modeIid-3; + if (pBsData->modeIid > 2) { + pBsData->freqResIid = pBsData->modeIid - 3; pBsData->bFineIidQ = 1; - } - else{ + } else { pBsData->freqResIid = pBsData->modeIid; pBsData->bFineIidQ = 0; } - if (pBsData->modeIcc > 2){ - pBsData->freqResIcc = pBsData->modeIcc-3; - } - else{ + if (pBsData->modeIcc > 2) { + pBsData->freqResIcc = pBsData->modeIcc - 3; + } else { pBsData->freqResIcc = pBsData->modeIcc; } - /* Extract IID data */ if (pBsData->bEnableIid) { - for (env=0; env<pBsData->noEnv; env++) { - dtFlag = (SCHAR)FDKreadBits (hBitBuf, 1); - if (!dtFlag) - { + for (env = 0; env < pBsData->noEnv; env++) { + dtFlag = (SCHAR)FDKreadBits(hBitBuf, 1); + if (!dtFlag) { if (pBsData->bFineIidQ) CurrentTable = (Huffman)&aBookPsIidFineFreqDecode; else CurrentTable = (Huffman)&aBookPsIidFreqDecode; - } - else - { + } else { if (pBsData->bFineIidQ) - CurrentTable = (Huffman)&aBookPsIidFineTimeDecode; + CurrentTable = (Huffman)&aBookPsIidFineTimeDecode; else CurrentTable = (Huffman)&aBookPsIidTimeDecode; } for (gr = 0; gr < FDK_sbrDecoder_aNoIidBins[pBsData->freqResIid]; gr++) - pBsData->aaIidIndex[env][gr] = decode_huff_cw(CurrentTable,hBitBuf,NULL); + pBsData->aaIidIndex[env][gr] = + decode_huff_cw(CurrentTable, hBitBuf, NULL); pBsData->abIidDtFlag[env] = dtFlag; } } /* Extract ICC data */ if (pBsData->bEnableIcc) { - for (env=0; env<pBsData->noEnv; env++) { - dtFlag = (SCHAR)FDKreadBits (hBitBuf, 1); + for (env = 0; env < pBsData->noEnv; env++) { + dtFlag = (SCHAR)FDKreadBits(hBitBuf, 1); if (!dtFlag) CurrentTable = (Huffman)&aBookPsIccFreqDecode; else CurrentTable = (Huffman)&aBookPsIccTimeDecode; for (gr = 0; gr < FDK_sbrDecoder_aNoIccBins[pBsData->freqResIcc]; gr++) - pBsData->aaIccIndex[env][gr] = decode_huff_cw(CurrentTable,hBitBuf,NULL); + pBsData->aaIccIndex[env][gr] = + decode_huff_cw(CurrentTable, hBitBuf, NULL); pBsData->abIccDtFlag[env] = dtFlag; } } if (pBsData->bEnableExt) { - /*! Decoders that support only the baseline version of the PS tool are allowed to ignore the IPD/OPD data, but according header data has to be parsed. @@ -575,19 +573,14 @@ ReadPsData (HANDLE_PS_DEC h_ps_d, /*!< handle to struct PS_DEC */ */ int cnt = FDKreadBits(hBitBuf, PS_EXTENSION_SIZE_BITS); - if (cnt == (1<<PS_EXTENSION_SIZE_BITS)-1) { + if (cnt == (1 << PS_EXTENSION_SIZE_BITS) - 1) { cnt += FDKreadBits(hBitBuf, PS_EXTENSION_ESC_COUNT_BITS); } - while (cnt--) - FDKreadBits(hBitBuf, 8); + while (cnt--) FDKreadBits(hBitBuf, 8); } - /* new PS data was read from bitstream */ h_ps_d->bPsDataAvail[h_ps_d->bsReadSlot] = ppt_mpeg; - - - return (startbits - FDKgetValidBits(hBitBuf)); + return (startbits - (INT)FDKgetValidBits(hBitBuf)); } - |