diff options
Diffstat (limited to 'libSBRenc/src/mh_det.cpp')
-rw-r--r-- | libSBRenc/src/mh_det.cpp | 1411 |
1 files changed, 668 insertions, 743 deletions
diff --git a/libSBRenc/src/mh_det.cpp b/libSBRenc/src/mh_det.cpp index bc80a15..2f3b386 100644 --- a/libSBRenc/src/mh_det.cpp +++ b/libSBRenc/src/mh_det.cpp @@ -1,74 +1,85 @@ - -/* ----------------------------------------------------------------------------------------------------------- +/* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2015 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,61 +90,78 @@ Am Wolfsmantel 33 www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------------------------------------ */ +----------------------------------------------------------------------------- */ + +/**************************** SBR encoder library ****************************** + + Author(s): + + Description: + +*******************************************************************************/ #include "mh_det.h" -#include "sbr_ram.h" +#include "sbrenc_ram.h" #include "sbr_misc.h" - #include "genericStds.h" -#define SFM_SHIFT 2 /* Attention: SFM_SCALE depends on SFM_SHIFT */ -#define SFM_SCALE (MAXVAL_DBL >> SFM_SHIFT) /* 1.0 >> SFM_SHIFT */ - +#define SFM_SHIFT 2 /* Attention: SFM_SCALE depends on SFM_SHIFT */ +#define SFM_SCALE (MAXVAL_DBL >> SFM_SHIFT) /* 1.0 >> SFM_SHIFT */ /*!< Detector Parameters for AAC core codec. */ static const DETECTOR_PARAMETERS_MH paramsAac = { -9, /*!< deltaTime */ -{ -FL2FXCONST_DBL(20.0f*RELAXATION_FLOAT), /*!< thresHoldDiff */ -FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< thresHoldDiffGuide */ -FL2FXCONST_DBL(15.0f*RELAXATION_FLOAT), /*!< thresHoldTone */ -FL2FXCONST_DBL((1.0f/15.0f)*RELAXATION_FLOAT), /*!< invThresHoldTone */ -FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< thresHoldToneGuide */ -FL2FXCONST_DBL(0.3f)>>SFM_SHIFT, /*!< sfmThresSbr */ -FL2FXCONST_DBL(0.1f)>>SFM_SHIFT, /*!< sfmThresOrig */ -FL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ -FL2FXCONST_DBL(0.5f), /*!< decayGuideDiff */ -FL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ -FL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ -FL2FXCONST_DBL(-0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< derivThresAboveLD64 */ -}, -50 /*!< maxComp */ + 9, /*!< deltaTime */ + { + FL2FXCONST_DBL(20.0f * RELAXATION_FLOAT), /*!< thresHoldDiff */ + FL2FXCONST_DBL(1.26f * RELAXATION_FLOAT), /*!< thresHoldDiffGuide */ + FL2FXCONST_DBL(15.0f * RELAXATION_FLOAT), /*!< thresHoldTone */ + FL2FXCONST_DBL((1.0f / 15.0f) * + RELAXATION_FLOAT), /*!< invThresHoldTone */ + FL2FXCONST_DBL(1.26f * RELAXATION_FLOAT), /*!< thresHoldToneGuide */ + FL2FXCONST_DBL(0.3f) >> SFM_SHIFT, /*!< sfmThresSbr */ + FL2FXCONST_DBL(0.1f) >> SFM_SHIFT, /*!< sfmThresOrig */ + FL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ + FL2FXCONST_DBL(0.5f), /*!< decayGuideDiff */ + FL2FXCONST_DBL(-0.000112993269), + /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ + FL2FXCONST_DBL(-0.000112993269), + /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ + FL2FXCONST_DBL( + -0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< + derivThresAboveLD64 + */ + }, + 50 /*!< maxComp */ }; /*!< Detector Parameters for AAC LD core codec. */ static const DETECTOR_PARAMETERS_MH paramsAacLd = { -16, /*!< Delta time. */ -{ -FL2FXCONST_DBL(25.0f*RELAXATION_FLOAT), /*!< thresHoldDiff */ -FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< tresHoldDiffGuide */ -FL2FXCONST_DBL(15.0f*RELAXATION_FLOAT), /*!< thresHoldTone */ -FL2FXCONST_DBL((1.0f/15.0f)*RELAXATION_FLOAT), /*!< invThresHoldTone */ -FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< thresHoldToneGuide */ -FL2FXCONST_DBL(0.3f)>>SFM_SHIFT, /*!< sfmThresSbr */ -FL2FXCONST_DBL(0.1f)>>SFM_SHIFT, /*!< sfmThresOrig */ -FL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ -FL2FXCONST_DBL(0.2f), /*!< decayGuideDiff */ -FL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ -FL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ -FL2FXCONST_DBL(-0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< derivThresAboveLD64 */ -}, -50 /*!< maxComp */ + 16, /*!< Delta time. */ + { + FL2FXCONST_DBL(25.0f * RELAXATION_FLOAT), /*!< thresHoldDiff */ + FL2FXCONST_DBL(1.26f * RELAXATION_FLOAT), /*!< tresHoldDiffGuide */ + FL2FXCONST_DBL(15.0f * RELAXATION_FLOAT), /*!< thresHoldTone */ + FL2FXCONST_DBL((1.0f / 15.0f) * + RELAXATION_FLOAT), /*!< invThresHoldTone */ + FL2FXCONST_DBL(1.26f * RELAXATION_FLOAT), /*!< thresHoldToneGuide */ + FL2FXCONST_DBL(0.3f) >> SFM_SHIFT, /*!< sfmThresSbr */ + FL2FXCONST_DBL(0.1f) >> SFM_SHIFT, /*!< sfmThresOrig */ + FL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ + FL2FXCONST_DBL(0.2f), /*!< decayGuideDiff */ + FL2FXCONST_DBL(-0.000112993269), + /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ + FL2FXCONST_DBL(-0.000112993269), + /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ + FL2FXCONST_DBL( + -0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< + derivThresAboveLD64 + */ + }, + 50 /*!< maxComp */ }; - /**************************************************************************/ /*! \brief Calculates the difference in tonality between original and SBR @@ -145,39 +173,36 @@ FL2FXCONST_DBL(-0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< deriv */ /**************************************************************************/ -static void diff(FIXP_DBL *RESTRICT pTonalityOrig, - FIXP_DBL *pDiffMapped2Scfb, - const UCHAR *RESTRICT pFreqBandTable, - INT nScfb, - SCHAR *indexVector) -{ +static void diff(FIXP_DBL *RESTRICT pTonalityOrig, FIXP_DBL *pDiffMapped2Scfb, + const UCHAR *RESTRICT pFreqBandTable, INT nScfb, + SCHAR *indexVector) { UCHAR i, ll, lu, k; FIXP_DBL maxValOrig, maxValSbr, tmp; INT scale; - for(i=0; i < nScfb; i++){ + for (i = 0; i < nScfb; i++) { ll = pFreqBandTable[i]; - lu = pFreqBandTable[i+1]; + lu = pFreqBandTable[i + 1]; maxValOrig = FL2FXCONST_DBL(0.0f); maxValSbr = FL2FXCONST_DBL(0.0f); - for(k=ll;k<lu;k++){ + for (k = ll; k < lu; k++) { maxValOrig = fixMax(maxValOrig, pTonalityOrig[k]); maxValSbr = fixMax(maxValSbr, pTonalityOrig[indexVector[k]]); } if ((maxValSbr >= RELAXATION)) { - tmp = fDivNorm(maxValOrig, maxValSbr, &scale); - pDiffMapped2Scfb[i] = scaleValue(fMult(tmp,RELAXATION_FRACT), fixMax(-(DFRACT_BITS-1),(scale-RELAXATION_SHIFT))); - } - else { - pDiffMapped2Scfb[i] = maxValOrig; + tmp = fDivNorm(maxValOrig, maxValSbr, &scale); + pDiffMapped2Scfb[i] = + scaleValue(fMult(tmp, RELAXATION_FRACT), + fixMax(-(DFRACT_BITS - 1), (scale - RELAXATION_SHIFT))); + } else { + pDiffMapped2Scfb[i] = maxValOrig; } } } - /**************************************************************************/ /*! \brief Calculates a flatness measure of the tonality measures. @@ -199,87 +224,81 @@ static void diff(FIXP_DBL *RESTRICT pTonalityOrig, */ /**************************************************************************/ -static void calculateFlatnessMeasure(FIXP_DBL *pQuotaBuffer, - SCHAR *indexVector, +static void calculateFlatnessMeasure(FIXP_DBL *pQuotaBuffer, SCHAR *indexVector, FIXP_DBL *pSfmOrigVec, FIXP_DBL *pSfmSbrVec, - const UCHAR *pFreqBandTable, - INT nSfb) -{ - INT i,j; - FIXP_DBL invBands,tmp1,tmp2; - INT shiftFac0,shiftFacSum0; - INT shiftFac1,shiftFacSum1; + const UCHAR *pFreqBandTable, INT nSfb) { + INT i, j; + FIXP_DBL invBands, tmp1, tmp2; + INT shiftFac0, shiftFacSum0; + INT shiftFac1, shiftFacSum1; FIXP_DBL accu; - for(i=0;i<nSfb;i++) - { + for (i = 0; i < nSfb; i++) { INT ll = pFreqBandTable[i]; - INT lu = pFreqBandTable[i+1]; - pSfmOrigVec[i] = (FIXP_DBL)(MAXVAL_DBL>>2); - pSfmSbrVec[i] = (FIXP_DBL)(MAXVAL_DBL>>2); + INT lu = pFreqBandTable[i + 1]; + pSfmOrigVec[i] = (FIXP_DBL)(MAXVAL_DBL >> 2); + pSfmSbrVec[i] = (FIXP_DBL)(MAXVAL_DBL >> 2); - if(lu - ll > 1){ - FIXP_DBL amOrig,amTransp,gmOrig,gmTransp,sfmOrig,sfmTransp; - invBands = GetInvInt(lu-ll); + if (lu - ll > 1) { + FIXP_DBL amOrig, amTransp, gmOrig, gmTransp, sfmOrig, sfmTransp; + invBands = GetInvInt(lu - ll); shiftFacSum0 = 0; shiftFacSum1 = 0; amOrig = amTransp = FL2FXCONST_DBL(0.0f); gmOrig = gmTransp = (FIXP_DBL)MAXVAL_DBL; - for(j= ll; j<lu; j++) { - sfmOrig = pQuotaBuffer[j]; + for (j = ll; j < lu; j++) { + sfmOrig = pQuotaBuffer[j]; sfmTransp = pQuotaBuffer[indexVector[j]]; - amOrig += fMult(sfmOrig, invBands); + amOrig += fMult(sfmOrig, invBands); amTransp += fMult(sfmTransp, invBands); shiftFac0 = CountLeadingBits(sfmOrig); shiftFac1 = CountLeadingBits(sfmTransp); - gmOrig = fMult(gmOrig, sfmOrig<<shiftFac0); - gmTransp = fMult(gmTransp, sfmTransp<<shiftFac1); + gmOrig = fMult(gmOrig, sfmOrig << shiftFac0); + gmTransp = fMult(gmTransp, sfmTransp << shiftFac1); shiftFacSum0 += shiftFac0; shiftFacSum1 += shiftFac1; } if (gmOrig > FL2FXCONST_DBL(0.0f)) { - - tmp1 = CalcLdData(gmOrig); /* CalcLd64(x)/64 */ - tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ + tmp1 = CalcLdData(gmOrig); /* CalcLd64(x)/64 */ + tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ /* y*k/64 */ - accu = (FIXP_DBL)-shiftFacSum0 << (DFRACT_BITS-1-8); - tmp2 = fMultDiv2(invBands, accu) << (2+1); + accu = (FIXP_DBL)-shiftFacSum0 << (DFRACT_BITS - 1 - 8); + tmp2 = fMultDiv2(invBands, accu) << (2 + 1); - tmp2 = tmp1 + tmp2; /* y*CalcLd64(x)/64 + y*k/64 */ - gmOrig = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ - } - else { + tmp2 = tmp1 + tmp2; /* y*CalcLd64(x)/64 + y*k/64 */ + gmOrig = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ + } else { gmOrig = FL2FXCONST_DBL(0.0f); } if (gmTransp > FL2FXCONST_DBL(0.0f)) { - - tmp1 = CalcLdData(gmTransp); /* CalcLd64(x)/64 */ - tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ + tmp1 = CalcLdData(gmTransp); /* CalcLd64(x)/64 */ + tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ /* y*k/64 */ - accu = (FIXP_DBL)-shiftFacSum1 << (DFRACT_BITS-1-8); - tmp2 = fMultDiv2(invBands, accu) << (2+1); + accu = (FIXP_DBL)-shiftFacSum1 << (DFRACT_BITS - 1 - 8); + tmp2 = fMultDiv2(invBands, accu) << (2 + 1); tmp2 = tmp1 + tmp2; /* y*CalcLd64(x)/64 + y*k/64 */ gmTransp = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ - } - else { + } else { gmTransp = FL2FXCONST_DBL(0.0f); } - if ( amOrig != FL2FXCONST_DBL(0.0f) ) - pSfmOrigVec[i] = FDKsbrEnc_LSI_divide_scale_fract(gmOrig,amOrig,SFM_SCALE); + if (amOrig != FL2FXCONST_DBL(0.0f)) + pSfmOrigVec[i] = + FDKsbrEnc_LSI_divide_scale_fract(gmOrig, amOrig, SFM_SCALE); - if ( amTransp != FL2FXCONST_DBL(0.0f) ) - pSfmSbrVec[i] = FDKsbrEnc_LSI_divide_scale_fract(gmTransp,amTransp,SFM_SCALE); + if (amTransp != FL2FXCONST_DBL(0.0f)) + pSfmSbrVec[i] = + FDKsbrEnc_LSI_divide_scale_fract(gmTransp, amTransp, SFM_SCALE); } } } @@ -293,39 +312,26 @@ static void calculateFlatnessMeasure(FIXP_DBL *pQuotaBuffer, */ /**************************************************************************/ -static void calculateDetectorInput(FIXP_DBL **RESTRICT pQuotaBuffer, /*!< Pointer to tonality matrix. */ - SCHAR *RESTRICT indexVector, - FIXP_DBL **RESTRICT tonalityDiff, - FIXP_DBL **RESTRICT pSfmOrig, - FIXP_DBL **RESTRICT pSfmSbr, - const UCHAR *freqBandTable, - INT nSfb, - INT noEstPerFrame, - INT move) -{ +static void calculateDetectorInput( + FIXP_DBL **RESTRICT pQuotaBuffer, /*!< Pointer to tonality matrix. */ + SCHAR *RESTRICT indexVector, FIXP_DBL **RESTRICT tonalityDiff, + FIXP_DBL **RESTRICT pSfmOrig, FIXP_DBL **RESTRICT pSfmSbr, + const UCHAR *freqBandTable, INT nSfb, INT noEstPerFrame, INT move) { INT est; /* New estimate. */ - for (est=0; est < noEstPerFrame; est++) { - - diff(pQuotaBuffer[est+move], - tonalityDiff[est+move], - freqBandTable, - nSfb, - indexVector); - - calculateFlatnessMeasure(pQuotaBuffer[est+ move], - indexVector, - pSfmOrig[est + move], - pSfmSbr[est + move], - freqBandTable, - nSfb); + for (est = 0; est < noEstPerFrame; est++) { + diff(pQuotaBuffer[est + move], tonalityDiff[est + move], freqBandTable, + nSfb, indexVector); + + calculateFlatnessMeasure(pQuotaBuffer[est + move], indexVector, + pSfmOrig[est + move], pSfmSbr[est + move], + freqBandTable, nSfb); } } - /**************************************************************************/ /*! \brief Checks that the detection is not due to a LP filter @@ -340,97 +346,97 @@ static void calculateDetectorInput(FIXP_DBL **RESTRICT pQuotaBuffer, /*!< Point /**************************************************************************/ static void removeLowPassDetection(UCHAR *RESTRICT pAddHarmSfb, UCHAR **RESTRICT pDetectionVectors, - INT start, - INT stop, - INT nSfb, + INT start, INT stop, INT nSfb, const UCHAR *RESTRICT pFreqBandTable, FIXP_DBL *RESTRICT pNrgVector, THRES_HOLDS mhThresh) { - INT i,est; + INT i, est; INT maxDerivPos = pFreqBandTable[nSfb]; INT numBands = pFreqBandTable[nSfb]; - FIXP_DBL nrgLow,nrgHigh; - FIXP_DBL nrgLD64,nrgLowLD64,nrgHighLD64,nrgDiffLD64; - FIXP_DBL valLD64,maxValLD64,maxValAboveLD64; + FIXP_DBL nrgLow, nrgHigh; + FIXP_DBL nrgLD64, nrgLowLD64, nrgHighLD64, nrgDiffLD64; + FIXP_DBL valLD64, maxValLD64, maxValAboveLD64; INT bLPsignal = 0; maxValLD64 = FL2FXCONST_DBL(-1.0f); - for(i = numBands - 1 - 2; i > pFreqBandTable[0];i--){ - nrgLow = pNrgVector[i]; + for (i = numBands - 1 - 2; i > pFreqBandTable[0]; i--) { + nrgLow = pNrgVector[i]; nrgHigh = pNrgVector[i + 2]; - if(nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh){ - nrgLowLD64 = CalcLdData(nrgLow>>1); - nrgDiffLD64 = CalcLdData((nrgLow>>1)-(nrgHigh>>1)); - valLD64 = nrgDiffLD64-nrgLowLD64; - if(valLD64 > maxValLD64){ + if (nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh) { + nrgLowLD64 = CalcLdData(nrgLow >> 1); + nrgDiffLD64 = CalcLdData((nrgLow >> 1) - (nrgHigh >> 1)); + valLD64 = nrgDiffLD64 - nrgLowLD64; + if (valLD64 > maxValLD64) { maxDerivPos = i; maxValLD64 = valLD64; } - if(maxValLD64 > mhThresh.derivThresMaxLD64) { + if (maxValLD64 > mhThresh.derivThresMaxLD64) { break; } } } - /* Find the largest "gradient" above. (should be relatively flat, hence we expect a low value - if the signal is LP.*/ + /* Find the largest "gradient" above. (should be relatively flat, hence we + expect a low value if the signal is LP.*/ maxValAboveLD64 = FL2FXCONST_DBL(-1.0f); - for(i = numBands - 1 - 2; i > maxDerivPos + 2;i--){ - nrgLow = pNrgVector[i]; + for (i = numBands - 1 - 2; i > maxDerivPos + 2; i--) { + nrgLow = pNrgVector[i]; nrgHigh = pNrgVector[i + 2]; - if(nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh){ - nrgLowLD64 = CalcLdData(nrgLow>>1); - nrgDiffLD64 = CalcLdData((nrgLow>>1)-(nrgHigh>>1)); - valLD64 = nrgDiffLD64-nrgLowLD64; - if(valLD64 > maxValAboveLD64){ + if (nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh) { + nrgLowLD64 = CalcLdData(nrgLow >> 1); + nrgDiffLD64 = CalcLdData((nrgLow >> 1) - (nrgHigh >> 1)); + valLD64 = nrgDiffLD64 - nrgLowLD64; + if (valLD64 > maxValAboveLD64) { maxValAboveLD64 = valLD64; } - } - else { - if(nrgHigh != FL2FXCONST_DBL(0.0f) && nrgHigh > nrgLow){ - nrgHighLD64 = CalcLdData(nrgHigh>>1); - nrgDiffLD64 = CalcLdData((nrgHigh>>1)-(nrgLow>>1)); - valLD64 = nrgDiffLD64-nrgHighLD64; - if(valLD64 > maxValAboveLD64){ + } else { + if (nrgHigh != FL2FXCONST_DBL(0.0f) && nrgHigh > nrgLow) { + nrgHighLD64 = CalcLdData(nrgHigh >> 1); + nrgDiffLD64 = CalcLdData((nrgHigh >> 1) - (nrgLow >> 1)); + valLD64 = nrgDiffLD64 - nrgHighLD64; + if (valLD64 > maxValAboveLD64) { maxValAboveLD64 = valLD64; } } - } + } } - if(maxValLD64 > mhThresh.derivThresMaxLD64 && maxValAboveLD64 < mhThresh.derivThresAboveLD64){ + if (maxValLD64 > mhThresh.derivThresMaxLD64 && + maxValAboveLD64 < mhThresh.derivThresAboveLD64) { bLPsignal = 1; - for(i = maxDerivPos - 1; i > maxDerivPos - 5 && i >= 0 ; i--){ - if(pNrgVector[i] != FL2FXCONST_DBL(0.0f) && pNrgVector[i] > pNrgVector[maxDerivPos + 2]){ - nrgDiffLD64 = CalcLdData((pNrgVector[i]>>1)-(pNrgVector[maxDerivPos + 2]>>1)); - nrgLD64 = CalcLdData(pNrgVector[i]>>1); - valLD64 = nrgDiffLD64-nrgLD64; - if(valLD64 < mhThresh.derivThresBelowLD64) { + for (i = maxDerivPos - 1; i > maxDerivPos - 5 && i >= 0; i--) { + if (pNrgVector[i] != FL2FXCONST_DBL(0.0f) && + pNrgVector[i] > pNrgVector[maxDerivPos + 2]) { + nrgDiffLD64 = CalcLdData((pNrgVector[i] >> 1) - + (pNrgVector[maxDerivPos + 2] >> 1)); + nrgLD64 = CalcLdData(pNrgVector[i] >> 1); + valLD64 = nrgDiffLD64 - nrgLD64; + if (valLD64 < mhThresh.derivThresBelowLD64) { bLPsignal = 0; break; } - } - else{ + } else { bLPsignal = 0; break; } } } - if(bLPsignal){ - for(i=0;i<nSfb;i++){ - if(maxDerivPos >= pFreqBandTable[i] && maxDerivPos < pFreqBandTable[i+1]) + if (bLPsignal) { + for (i = 0; i < nSfb; i++) { + if (maxDerivPos >= pFreqBandTable[i] && + maxDerivPos < pFreqBandTable[i + 1]) break; } - if(pAddHarmSfb[i]){ + if (pAddHarmSfb[i]) { pAddHarmSfb[i] = 0; - for(est = start; est < stop ; est++){ + for (est = start; est < stop; est++) { pDetectionVectors[est][i] = 0; } } @@ -447,44 +453,37 @@ static void removeLowPassDetection(UCHAR *RESTRICT pAddHarmSfb, */ /**************************************************************************/ -static INT isDetectionOfNewToneAllowed(const SBR_FRAME_INFO *pFrameInfo, - INT *pDetectionStartPos, - INT noEstPerFrame, - INT prevTransientFrame, - INT prevTransientPos, - INT prevTransientFlag, - INT transientPosOffset, - INT transientFlag, - INT transientPos, - INT deltaTime, - HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector) -{ +static INT isDetectionOfNewToneAllowed( + const SBR_FRAME_INFO *pFrameInfo, INT *pDetectionStartPos, + INT noEstPerFrame, INT prevTransientFrame, INT prevTransientPos, + INT prevTransientFlag, INT transientPosOffset, INT transientFlag, + INT transientPos, INT deltaTime, + HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector) { INT transientFrame, newDetectionAllowed; - /* Determine if this is a frame where a transient starts... * If the transient flag was set the previous frame but not the * transient frame flag, the transient frame flag is set in the current frame. *****************************************************************************/ transientFrame = 0; - if(transientFlag){ - if(transientPos + transientPosOffset < pFrameInfo->borders[pFrameInfo->nEnvelopes]) + if (transientFlag) { + if (transientPos + transientPosOffset < + pFrameInfo->borders[pFrameInfo->nEnvelopes]) { transientFrame = 1; - if(noEstPerFrame > 1){ - if(transientPos + transientPosOffset > h_sbrMissingHarmonicsDetector->timeSlots >> 1){ + if (noEstPerFrame > 1) { + if (transientPos + transientPosOffset > + h_sbrMissingHarmonicsDetector->timeSlots >> 1) { *pDetectionStartPos = noEstPerFrame; - } - else{ + } else { *pDetectionStartPos = noEstPerFrame >> 1; } - } - else{ + } else { *pDetectionStartPos = noEstPerFrame; } - } - else{ - if(prevTransientFlag && !prevTransientFrame){ + } + } else { + if (prevTransientFlag && !prevTransientFrame) { transientFrame = 1; *pDetectionStartPos = 0; } @@ -497,25 +496,25 @@ static INT isDetectionOfNewToneAllowed(const SBR_FRAME_INFO *pFrameInfo, * to the start of the current frame. ****************************************************************/ newDetectionAllowed = 0; - if(transientFrame){ + if (transientFrame) { newDetectionAllowed = 1; - } - else { - if(prevTransientFrame && - fixp_abs(pFrameInfo->borders[0] - (prevTransientPos + transientPosOffset - - h_sbrMissingHarmonicsDetector->timeSlots)) < deltaTime) + } else { + if (prevTransientFrame && + fixp_abs(pFrameInfo->borders[0] - + (prevTransientPos + transientPosOffset - + h_sbrMissingHarmonicsDetector->timeSlots)) < deltaTime) { newDetectionAllowed = 1; *pDetectionStartPos = 0; + } } - h_sbrMissingHarmonicsDetector->previousTransientFlag = transientFlag; + h_sbrMissingHarmonicsDetector->previousTransientFlag = transientFlag; h_sbrMissingHarmonicsDetector->previousTransientFrame = transientFrame; - h_sbrMissingHarmonicsDetector->previousTransientPos = transientPos; + h_sbrMissingHarmonicsDetector->previousTransientPos = transientPos; return (newDetectionAllowed); } - /**************************************************************************/ /*! \brief Cleans up the detection after a transient. @@ -525,51 +524,41 @@ static INT isDetectionOfNewToneAllowed(const SBR_FRAME_INFO *pFrameInfo, */ /**************************************************************************/ -static void transientCleanUp(FIXP_DBL **quotaBuffer, - INT nSfb, - UCHAR **detectionVectors, - UCHAR *pAddHarmSfb, - UCHAR *pPrevAddHarmSfb, - INT ** signBuffer, - const UCHAR *pFreqBandTable, - INT start, - INT stop, - INT newDetectionAllowed, - FIXP_DBL *pNrgVector, - THRES_HOLDS mhThresh) -{ - INT i,j,li, ui,est; - - for(est=start; est < stop; est++) { - for(i=0; i<nSfb; i++) { +static void transientCleanUp(FIXP_DBL **quotaBuffer, INT nSfb, + UCHAR **detectionVectors, UCHAR *pAddHarmSfb, + UCHAR *pPrevAddHarmSfb, INT **signBuffer, + const UCHAR *pFreqBandTable, INT start, INT stop, + INT newDetectionAllowed, FIXP_DBL *pNrgVector, + THRES_HOLDS mhThresh) { + INT i, j, est; + + for (est = start; est < stop; est++) { + for (i = 0; i < nSfb; i++) { pAddHarmSfb[i] = pAddHarmSfb[i] || detectionVectors[est][i]; } } - if(newDetectionAllowed == 1){ + if (newDetectionAllowed == 1) { /* * Check for duplication of sines located * on the border of two scf-bands. *************************************************/ - for(i=0;i<nSfb-1;i++) { - li = pFreqBandTable[i]; - ui = pFreqBandTable[i+1]; - + for (i = 0; i < nSfb - 1; i++) { /* detection in adjacent channels.*/ - if(pAddHarmSfb[i] && pAddHarmSfb[i+1]) { + if (pAddHarmSfb[i] && pAddHarmSfb[i + 1]) { FIXP_DBL maxVal1, maxVal2; INT maxPos1, maxPos2, maxPosTime1, maxPosTime2; - li = pFreqBandTable[i]; - ui = pFreqBandTable[i+1]; + INT li = pFreqBandTable[i]; + INT ui = pFreqBandTable[i + 1]; /* Find maximum tonality in the the two scf bands.*/ maxPosTime1 = start; maxPos1 = li; maxVal1 = quotaBuffer[start][li]; - for(est = start; est < stop; est++){ - for(j = li; j<ui; j++){ - if(quotaBuffer[est][j] > maxVal1){ + for (est = start; est < stop; est++) { + for (j = li; j < ui; j++) { + if (quotaBuffer[est][j] > maxVal1) { maxVal1 = quotaBuffer[est][j]; maxPos1 = j; maxPosTime1 = est; @@ -577,16 +566,16 @@ static void transientCleanUp(FIXP_DBL **quotaBuffer, } } - li = pFreqBandTable[i+1]; - ui = pFreqBandTable[i+2]; + li = pFreqBandTable[i + 1]; + ui = pFreqBandTable[i + 2]; /* Find maximum tonality in the the two scf bands.*/ maxPosTime2 = start; maxPos2 = li; maxVal2 = quotaBuffer[start][li]; - for(est = start; est < stop; est++){ - for(j = li; j<ui; j++){ - if(quotaBuffer[est][j] > maxVal2){ + for (est = start; est < stop; est++) { + for (j = li; j < ui; j++) { + if (quotaBuffer[est][j] > maxVal2) { maxVal2 = quotaBuffer[est][j]; maxPos2 = j; maxPosTime2 = est; @@ -596,40 +585,39 @@ static void transientCleanUp(FIXP_DBL **quotaBuffer, /* If the maximum values are in adjacent QMF-channels, we need to remove the lowest of the two.*/ - if(maxPos2-maxPos1 < 2){ - - if(pPrevAddHarmSfb[i] == 1 && pPrevAddHarmSfb[i+1] == 0){ + if (maxPos2 - maxPos1 < 2) { + if (pPrevAddHarmSfb[i] == 1 && pPrevAddHarmSfb[i + 1] == 0) { /* Keep the lower, remove the upper.*/ - pAddHarmSfb[i+1] = 0; - for(est=start; est<stop; est++){ - detectionVectors[est][i+1] = 0; + pAddHarmSfb[i + 1] = 0; + for (est = start; est < stop; est++) { + detectionVectors[est][i + 1] = 0; } - } - else{ - if(pPrevAddHarmSfb[i] == 0 && pPrevAddHarmSfb[i+1] == 1){ + } else { + if (pPrevAddHarmSfb[i] == 0 && pPrevAddHarmSfb[i + 1] == 1) { /* Keep the upper, remove the lower.*/ pAddHarmSfb[i] = 0; - for(est=start; est<stop; est++){ + for (est = start; est < stop; est++) { detectionVectors[est][i] = 0; } - } - else{ - /* If the maximum values are in adjacent QMF-channels, and if the signs indicate that it is the same sine, - we need to remove the lowest of the two.*/ - if(maxVal1 > maxVal2){ - if(signBuffer[maxPosTime1][maxPos2] < 0 && signBuffer[maxPosTime1][maxPos1] > 0){ + } else { + /* If the maximum values are in adjacent QMF-channels, and if the + signs indicate that it is the same sine, we need to remove the + lowest of the two.*/ + if (maxVal1 > maxVal2) { + if (signBuffer[maxPosTime1][maxPos2] < 0 && + signBuffer[maxPosTime1][maxPos1] > 0) { /* Keep the lower, remove the upper.*/ - pAddHarmSfb[i+1] = 0; - for(est=start; est<stop; est++){ - detectionVectors[est][i+1] = 0; + pAddHarmSfb[i + 1] = 0; + for (est = start; est < stop; est++) { + detectionVectors[est][i + 1] = 0; } } - } - else{ - if(signBuffer[maxPosTime2][maxPos2] < 0 && signBuffer[maxPosTime2][maxPos1] > 0){ + } else { + if (signBuffer[maxPosTime2][maxPos2] < 0 && + signBuffer[maxPosTime2][maxPos1] > 0) { /* Keep the upper, remove the lower.*/ pAddHarmSfb[i] = 0; - for(est=start; est<stop; est++){ + for (est = start; est < stop; est++) { detectionVectors[est][i] = 0; } } @@ -641,28 +629,19 @@ static void transientCleanUp(FIXP_DBL **quotaBuffer, } /* Make sure that the detection is not the cut-off of a low pass filter. */ - removeLowPassDetection(pAddHarmSfb, - detectionVectors, - start, - stop, - nSfb, - pFreqBandTable, - pNrgVector, - mhThresh); - } - else { - /* - * If a missing harmonic wasn't missing the previous frame - * the transient-flag needs to be set in order to be allowed to detect it. - *************************************************************************/ - for(i=0;i<nSfb;i++){ - if(pAddHarmSfb[i] - pPrevAddHarmSfb[i] > 0) - pAddHarmSfb[i] = 0; + removeLowPassDetection(pAddHarmSfb, detectionVectors, start, stop, nSfb, + pFreqBandTable, pNrgVector, mhThresh); + } else { + /* + * If a missing harmonic wasn't missing the previous frame + * the transient-flag needs to be set in order to be allowed to detect it. + *************************************************************************/ + for (i = 0; i < nSfb; i++) { + if (pAddHarmSfb[i] - pPrevAddHarmSfb[i] > 0) pAddHarmSfb[i] = 0; } } } - /*****************************************************************************/ /*! \brief Detection for one tonality estimate. @@ -689,42 +668,35 @@ static void transientCleanUp(FIXP_DBL **quotaBuffer, */ /**************************************************************************/ -static void detection(FIXP_DBL *quotaBuffer, - FIXP_DBL *pDiffVecScfb, - INT nSfb, - UCHAR *pHarmVec, - const UCHAR *pFreqBandTable, - FIXP_DBL *sfmOrig, - FIXP_DBL *sfmSbr, - GUIDE_VECTORS guideVectors, - GUIDE_VECTORS newGuideVectors, - THRES_HOLDS mhThresh) -{ - - INT i,j,ll, lu; - FIXP_DBL thresTemp,thresOrig; +static void detection(FIXP_DBL *quotaBuffer, FIXP_DBL *pDiffVecScfb, INT nSfb, + UCHAR *pHarmVec, const UCHAR *pFreqBandTable, + FIXP_DBL *sfmOrig, FIXP_DBL *sfmSbr, + GUIDE_VECTORS guideVectors, GUIDE_VECTORS newGuideVectors, + THRES_HOLDS mhThresh) { + INT i, j, ll, lu; + FIXP_DBL thresTemp, thresOrig; /* * Do detection on the difference vector, i.e. the difference between * the original and the transposed. *********************************************************************/ - for(i=0;i<nSfb;i++){ - + for (i = 0; i < nSfb; i++) { thresTemp = (guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)) - ? fMax(fMult(mhThresh.decayGuideDiff,guideVectors.guideVectorDiff[i]), mhThresh.thresHoldDiffGuide) - : mhThresh.thresHoldDiff; + ? fMax(fMult(mhThresh.decayGuideDiff, + guideVectors.guideVectorDiff[i]), + mhThresh.thresHoldDiffGuide) + : mhThresh.thresHoldDiff; thresTemp = fMin(thresTemp, mhThresh.thresHoldDiff); - if(pDiffVecScfb[i] > thresTemp){ + if (pDiffVecScfb[i] > thresTemp) { pHarmVec[i] = 1; newGuideVectors.guideVectorDiff[i] = pDiffVecScfb[i]; - } - else{ + } else { /* If the guide wasn't zero, but the current level is to low, start tracking the decay on the tone in the original rather than the difference.*/ - if(guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)){ + if (guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)) { guideVectors.guideVectorOrig[i] = mhThresh.thresHoldToneGuide; } } @@ -736,16 +708,18 @@ static void detection(FIXP_DBL *quotaBuffer, * multiple tones in the sbr signal. ****************************************************/ - for(i=0;i<nSfb;i++){ + for (i = 0; i < nSfb; i++) { ll = pFreqBandTable[i]; - lu = pFreqBandTable[i+1]; + lu = pFreqBandTable[i + 1]; - thresOrig = fixMax(fMult(guideVectors.guideVectorOrig[i], mhThresh.decayGuideOrig), mhThresh.thresHoldToneGuide); + thresOrig = + fixMax(fMult(guideVectors.guideVectorOrig[i], mhThresh.decayGuideOrig), + mhThresh.thresHoldToneGuide); thresOrig = fixMin(thresOrig, mhThresh.thresHoldTone); - if(guideVectors.guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)){ - for(j= ll;j<lu;j++){ - if(quotaBuffer[j] > thresOrig){ + if (guideVectors.guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)) { + for (j = ll; j < lu; j++) { + if (quotaBuffer[j] > thresOrig) { pHarmVec[i] = 1; newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; } @@ -759,33 +733,36 @@ static void detection(FIXP_DBL *quotaBuffer, ****************************************************/ thresOrig = mhThresh.thresHoldTone; - for(i=0;i<nSfb;i++){ + for (i = 0; i < nSfb; i++) { ll = pFreqBandTable[i]; - lu = pFreqBandTable[i+1]; - - if(pHarmVec[i] == 0){ - if(lu -ll > 1){ - for(j= ll;j<lu;j++){ - if(quotaBuffer[j] > thresOrig && (sfmSbr[i] > mhThresh.sfmThresSbr && sfmOrig[i] < mhThresh.sfmThresOrig)){ + lu = pFreqBandTable[i + 1]; + + if (pHarmVec[i] == 0) { + if (lu - ll > 1) { + for (j = ll; j < lu; j++) { + if (quotaBuffer[j] > thresOrig && + (sfmSbr[i] > mhThresh.sfmThresSbr && + sfmOrig[i] < mhThresh.sfmThresOrig)) { pHarmVec[i] = 1; newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; } } - } - else{ - if(i < nSfb -1){ + } else { + if (i < nSfb - 1) { ll = pFreqBandTable[i]; - if(i>0){ - if(quotaBuffer[ll] > mhThresh.thresHoldTone && (pDiffVecScfb[i+1] < mhThresh.invThresHoldTone || pDiffVecScfb[i-1] < mhThresh.invThresHoldTone)){ - pHarmVec[i] = 1; - newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; + if (i > 0) { + if (quotaBuffer[ll] > mhThresh.thresHoldTone && + (pDiffVecScfb[i + 1] < mhThresh.invThresHoldTone || + pDiffVecScfb[i - 1] < mhThresh.invThresHoldTone)) { + pHarmVec[i] = 1; + newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; } - } - else{ - if(quotaBuffer[ll] > mhThresh.thresHoldTone && pDiffVecScfb[i+1] < mhThresh.invThresHoldTone){ - pHarmVec[i] = 1; - newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; + } else { + if (quotaBuffer[ll] > mhThresh.thresHoldTone && + pDiffVecScfb[i + 1] < mhThresh.invThresHoldTone) { + pHarmVec[i] = 1; + newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; } } } @@ -794,7 +771,6 @@ static void detection(FIXP_DBL *quotaBuffer, } } - /**************************************************************************/ /*! \brief Do detection for every tonality estimate, using forward prediction. @@ -804,149 +780,116 @@ static void detection(FIXP_DBL *quotaBuffer, */ /**************************************************************************/ -static void detectionWithPrediction(FIXP_DBL **quotaBuffer, - FIXP_DBL **pDiffVecScfb, - INT ** signBuffer, - INT nSfb, - const UCHAR* pFreqBandTable, - FIXP_DBL **sfmOrig, - FIXP_DBL **sfmSbr, - UCHAR **detectionVectors, - UCHAR *pPrevAddHarmSfb, - GUIDE_VECTORS *guideVectors, - INT noEstPerFrame, - INT detectionStart, - INT totNoEst, - INT newDetectionAllowed, - INT *pAddHarmFlag, - UCHAR *pAddHarmSfb, - FIXP_DBL *pNrgVector, - const DETECTOR_PARAMETERS_MH *mhParams) -{ - INT est = 0,i; +static void detectionWithPrediction( + FIXP_DBL **quotaBuffer, FIXP_DBL **pDiffVecScfb, INT **signBuffer, INT nSfb, + const UCHAR *pFreqBandTable, FIXP_DBL **sfmOrig, FIXP_DBL **sfmSbr, + UCHAR **detectionVectors, UCHAR *pPrevAddHarmSfb, + GUIDE_VECTORS *guideVectors, INT noEstPerFrame, INT detectionStart, + INT totNoEst, INT newDetectionAllowed, INT *pAddHarmFlag, + UCHAR *pAddHarmSfb, FIXP_DBL *pNrgVector, + const DETECTOR_PARAMETERS_MH *mhParams) { + INT est = 0, i; INT start; - FDKmemclear(pAddHarmSfb,nSfb*sizeof(UCHAR)); + FDKmemclear(pAddHarmSfb, nSfb * sizeof(UCHAR)); - if(newDetectionAllowed){ - - /* Since we don't want to use the transient region for detection (since the tonality values - tend to be a bit unreliable for this region) the guide-values are copied to the current - starting point. */ - if(totNoEst > 1){ - start = detectionStart+1; + if (newDetectionAllowed) { + /* Since we don't want to use the transient region for detection (since the + tonality values tend to be a bit unreliable for this region) the + guide-values are copied to the current starting point. */ + if (totNoEst > 1) { + start = detectionStart + 1; if (start != 0) { - FDKmemcpy(guideVectors[start].guideVectorDiff,guideVectors[0].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); - FDKmemcpy(guideVectors[start].guideVectorOrig,guideVectors[0].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); - FDKmemclear(guideVectors[start-1].guideVectorDetected,nSfb*sizeof(UCHAR)); + FDKmemcpy(guideVectors[start].guideVectorDiff, + guideVectors[0].guideVectorDiff, nSfb * sizeof(FIXP_DBL)); + FDKmemcpy(guideVectors[start].guideVectorOrig, + guideVectors[0].guideVectorOrig, nSfb * sizeof(FIXP_DBL)); + FDKmemclear(guideVectors[start - 1].guideVectorDetected, + nSfb * sizeof(UCHAR)); } - } - else{ + } else { start = 0; } - } - else{ + } else { start = 0; } - - for(est = start; est < totNoEst; est++){ - + for (est = start; est < totNoEst; est++) { /* - * Do detection on the current frame using - * guide-info from the previous. - *******************************************/ - if(est > 0){ - FDKmemcpy(guideVectors[est].guideVectorDetected,detectionVectors[est-1],nSfb*sizeof(UCHAR)); + * Do detection on the current frame using + * guide-info from the previous. + *******************************************/ + if (est > 0) { + FDKmemcpy(guideVectors[est].guideVectorDetected, + detectionVectors[est - 1], nSfb * sizeof(UCHAR)); } - FDKmemclear(detectionVectors[est], nSfb*sizeof(UCHAR)); - - if(est < totNoEst-1){ - FDKmemclear(guideVectors[est+1].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); - FDKmemclear(guideVectors[est+1].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); - FDKmemclear(guideVectors[est+1].guideVectorDetected,nSfb*sizeof(UCHAR)); - - detection(quotaBuffer[est], - pDiffVecScfb[est], - nSfb, - detectionVectors[est], - pFreqBandTable, - sfmOrig[est], - sfmSbr[est], - guideVectors[est], - guideVectors[est+1], + FDKmemclear(detectionVectors[est], nSfb * sizeof(UCHAR)); + + if (est < totNoEst - 1) { + FDKmemclear(guideVectors[est + 1].guideVectorDiff, + nSfb * sizeof(FIXP_DBL)); + FDKmemclear(guideVectors[est + 1].guideVectorOrig, + nSfb * sizeof(FIXP_DBL)); + FDKmemclear(guideVectors[est + 1].guideVectorDetected, + nSfb * sizeof(UCHAR)); + + detection(quotaBuffer[est], pDiffVecScfb[est], nSfb, + detectionVectors[est], pFreqBandTable, sfmOrig[est], + sfmSbr[est], guideVectors[est], guideVectors[est + 1], mhParams->thresHolds); - } - else{ - FDKmemclear(guideVectors[est].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); - FDKmemclear(guideVectors[est].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); - FDKmemclear(guideVectors[est].guideVectorDetected,nSfb*sizeof(UCHAR)); - - detection(quotaBuffer[est], - pDiffVecScfb[est], - nSfb, - detectionVectors[est], - pFreqBandTable, - sfmOrig[est], - sfmSbr[est], - guideVectors[est], - guideVectors[est], + } else { + FDKmemclear(guideVectors[est].guideVectorDiff, nSfb * sizeof(FIXP_DBL)); + FDKmemclear(guideVectors[est].guideVectorOrig, nSfb * sizeof(FIXP_DBL)); + FDKmemclear(guideVectors[est].guideVectorDetected, nSfb * sizeof(UCHAR)); + + detection(quotaBuffer[est], pDiffVecScfb[est], nSfb, + detectionVectors[est], pFreqBandTable, sfmOrig[est], + sfmSbr[est], guideVectors[est], guideVectors[est], mhParams->thresHolds); } } - /* Clean up the detection.*/ - transientCleanUp(quotaBuffer, - nSfb, - detectionVectors, - pAddHarmSfb, - pPrevAddHarmSfb, - signBuffer, - pFreqBandTable, - start, - totNoEst, - newDetectionAllowed, - pNrgVector, - mhParams->thresHolds); - + transientCleanUp(quotaBuffer, nSfb, detectionVectors, pAddHarmSfb, + pPrevAddHarmSfb, signBuffer, pFreqBandTable, start, totNoEst, + newDetectionAllowed, pNrgVector, mhParams->thresHolds); /* Set flag... */ *pAddHarmFlag = 0; - for(i=0; i<nSfb; i++){ - if(pAddHarmSfb[i]){ + for (i = 0; i < nSfb; i++) { + if (pAddHarmSfb[i]) { *pAddHarmFlag = 1; break; } } - FDKmemcpy(pPrevAddHarmSfb, pAddHarmSfb, nSfb*sizeof(UCHAR)); - FDKmemcpy(guideVectors[0].guideVectorDetected,pAddHarmSfb,nSfb*sizeof(INT)); - - for(i=0; i<nSfb ; i++){ + FDKmemcpy(pPrevAddHarmSfb, pAddHarmSfb, nSfb * sizeof(UCHAR)); + FDKmemcpy(guideVectors[0].guideVectorDetected, pAddHarmSfb, + nSfb * sizeof(INT)); + for (i = 0; i < nSfb; i++) { guideVectors[0].guideVectorDiff[i] = FL2FXCONST_DBL(0.0f); guideVectors[0].guideVectorOrig[i] = FL2FXCONST_DBL(0.0f); - if(pAddHarmSfb[i] == 1){ - /* If we had a detection use the guide-value in the next frame from the last estimate were the detection - was done.*/ - for(est=start; est < totNoEst; est++){ - if(guideVectors[est].guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)){ - guideVectors[0].guideVectorDiff[i] = guideVectors[est].guideVectorDiff[i]; + if (pAddHarmSfb[i] == 1) { + /* If we had a detection use the guide-value in the next frame from the + last estimate were the detection was done.*/ + for (est = start; est < totNoEst; est++) { + if (guideVectors[est].guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)) { + guideVectors[0].guideVectorDiff[i] = + guideVectors[est].guideVectorDiff[i]; } - if(guideVectors[est].guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)){ - guideVectors[0].guideVectorOrig[i] = guideVectors[est].guideVectorOrig[i]; + if (guideVectors[est].guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)) { + guideVectors[0].guideVectorOrig[i] = + guideVectors[est].guideVectorOrig[i]; } } } } - } - /**************************************************************************/ /*! \brief Calculates a compensation vector for the energy data. @@ -963,38 +906,30 @@ static void detectionWithPrediction(FIXP_DBL **quotaBuffer, */ /**************************************************************************/ -static void calculateCompVector(UCHAR *pAddHarmSfb, - FIXP_DBL **pTonalityMatrix, - INT ** pSignMatrix, - UCHAR *pEnvComp, - INT nSfb, - const UCHAR *freqBandTable, - INT totNoEst, - INT maxComp, - UCHAR *pPrevEnvComp, - INT newDetectionAllowed) -{ - - INT scfBand,est,l,ll,lu,maxPosF,maxPosT; +static void calculateCompVector(UCHAR *pAddHarmSfb, FIXP_DBL **pTonalityMatrix, + INT **pSignMatrix, UCHAR *pEnvComp, INT nSfb, + const UCHAR *freqBandTable, INT totNoEst, + INT maxComp, UCHAR *pPrevEnvComp, + INT newDetectionAllowed) { + INT scfBand, est, l, ll, lu, maxPosF, maxPosT; FIXP_DBL maxVal; INT compValue; FIXP_DBL tmp; - FDKmemclear(pEnvComp,nSfb*sizeof(UCHAR)); + FDKmemclear(pEnvComp, nSfb * sizeof(UCHAR)); - for(scfBand=0; scfBand < nSfb; scfBand++){ - - if(pAddHarmSfb[scfBand]){ /* A missing sine was detected */ + for (scfBand = 0; scfBand < nSfb; scfBand++) { + if (pAddHarmSfb[scfBand]) { /* A missing sine was detected */ ll = freqBandTable[scfBand]; - lu = freqBandTable[scfBand+1]; + lu = freqBandTable[scfBand + 1]; - maxPosF = 0; /* First find the maximum*/ + maxPosF = 0; /* First find the maximum*/ maxPosT = 0; maxVal = FL2FXCONST_DBL(0.0f); - for(est=0;est<totNoEst;est++){ - for(l=ll; l<lu; l++){ - if(pTonalityMatrix[est][l] > maxVal){ + for (est = 0; est < totNoEst; est++) { + for (l = ll; l < lu; l++) { + if (pTonalityMatrix[est][l] > maxVal) { maxVal = pTonalityMatrix[est][l]; maxPosF = l; maxPosT = est; @@ -1010,57 +945,63 @@ static void calculateCompVector(UCHAR *pAddHarmSfb, * in the SBR data, which will cause problems in the decoder, when we * add a sine to just one of the channels. *********************************************************************/ - if(maxPosF == ll && scfBand){ - if(!pAddHarmSfb[scfBand - 1]) { /* No detection below*/ - if (pSignMatrix[maxPosT][maxPosF - 1] > 0 && pSignMatrix[maxPosT][maxPosF] < 0) { - /* The comp value is calulated as the tonallity value, i.e we want to - reduce the envelope data for this channel with as much as the tonality - that is spread from the channel above. (ld64(RELAXATION) = 0.31143075889) */ - tmp = fixp_abs((FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF - 1]) + RELAXATION_LD64); - tmp = (tmp >> (DFRACT_BITS-1-LD_DATA_SHIFT-1)) + (FIXP_DBL)1; /* shift one bit less for rounding */ + if (maxPosF == ll && scfBand) { + if (!pAddHarmSfb[scfBand - 1]) { /* No detection below*/ + if (pSignMatrix[maxPosT][maxPosF - 1] > 0 && + pSignMatrix[maxPosT][maxPosF] < 0) { + /* The comp value is calulated as the tonallity value, i.e we want + to reduce the envelope data for this channel with as much as the + tonality that is spread from the channel above. (ld64(RELAXATION) + = 0.31143075889) */ + tmp = fixp_abs( + (FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF - 1]) + + RELAXATION_LD64); + tmp = (tmp >> (DFRACT_BITS - 1 - LD_DATA_SHIFT - 1)) + + (FIXP_DBL)1; /* shift one bit less for rounding */ compValue = ((INT)(LONG)tmp) >> 1; - /* limit the comp-value*/ - if (compValue > maxComp) - compValue = maxComp; + /* limit the comp-value*/ + if (compValue > maxComp) compValue = maxComp; - pEnvComp[scfBand-1] = compValue; - } - } + pEnvComp[scfBand - 1] = compValue; + } + } } /* * Same as above, but for the upper end of the scalefactor-band. ***************************************************************/ - if(maxPosF == lu-1 && scfBand+1 < nSfb){ /* Upper border*/ - if(!pAddHarmSfb[scfBand + 1]) { - if (pSignMatrix[maxPosT][maxPosF] > 0 && pSignMatrix[maxPosT][maxPosF + 1] < 0) { - tmp = fixp_abs((FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF + 1]) + RELAXATION_LD64); - tmp = (tmp >> (DFRACT_BITS-1-LD_DATA_SHIFT-1)) + (FIXP_DBL)1; /* shift one bit less for rounding */ + if (maxPosF == lu - 1 && scfBand + 1 < nSfb) { /* Upper border*/ + if (!pAddHarmSfb[scfBand + 1]) { + if (pSignMatrix[maxPosT][maxPosF] > 0 && + pSignMatrix[maxPosT][maxPosF + 1] < 0) { + tmp = fixp_abs( + (FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF + 1]) + + RELAXATION_LD64); + tmp = (tmp >> (DFRACT_BITS - 1 - LD_DATA_SHIFT - 1)) + + (FIXP_DBL)1; /* shift one bit less for rounding */ compValue = ((INT)(LONG)tmp) >> 1; - if (compValue > maxComp) - compValue = maxComp; + if (compValue > maxComp) compValue = maxComp; - pEnvComp[scfBand+1] = compValue; - } - } + pEnvComp[scfBand + 1] = compValue; + } + } } - } - } + } + } - if(newDetectionAllowed == 0){ - for(scfBand=0;scfBand<nSfb;scfBand++){ - if(pEnvComp[scfBand] != 0 && pPrevEnvComp[scfBand] == 0) + if (newDetectionAllowed == 0) { + for (scfBand = 0; scfBand < nSfb; scfBand++) { + if (pEnvComp[scfBand] != 0 && pPrevEnvComp[scfBand] == 0) pEnvComp[scfBand] = 0; } } /* remember the value for the next frame.*/ - FDKmemcpy(pPrevEnvComp,pEnvComp,nSfb*sizeof(UCHAR)); + FDKmemcpy(pPrevEnvComp, pEnvComp, nSfb * sizeof(UCHAR)); } - /**************************************************************************/ /*! \brief Detects where strong tonal components will be missing after @@ -1071,34 +1012,26 @@ static void calculateCompVector(UCHAR *pAddHarmSfb, */ /**************************************************************************/ -void -FDKsbrEnc_SbrMissingHarmonicsDetectorQmf(HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMHDet, - FIXP_DBL ** pQuotaBuffer, - INT ** pSignBuffer, - SCHAR* indexVector, - const SBR_FRAME_INFO *pFrameInfo, - const UCHAR* pTranInfo, - INT* pAddHarmonicsFlag, - UCHAR* pAddHarmonicsScaleFactorBands, - const UCHAR* freqBandTable, - INT nSfb, - UCHAR* envelopeCompensation, - FIXP_DBL *pNrgVector) -{ +void FDKsbrEnc_SbrMissingHarmonicsDetectorQmf( + HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMHDet, FIXP_DBL **pQuotaBuffer, + INT **pSignBuffer, SCHAR *indexVector, const SBR_FRAME_INFO *pFrameInfo, + const UCHAR *pTranInfo, INT *pAddHarmonicsFlag, + UCHAR *pAddHarmonicsScaleFactorBands, const UCHAR *freqBandTable, INT nSfb, + UCHAR *envelopeCompensation, FIXP_DBL *pNrgVector) { INT transientFlag = pTranInfo[1]; - INT transientPos = pTranInfo[0]; + INT transientPos = pTranInfo[0]; INT newDetectionAllowed; INT transientDetStart = 0; - UCHAR ** detectionVectors = h_sbrMHDet->detectionVectors; - INT move = h_sbrMHDet->move; - INT noEstPerFrame = h_sbrMHDet->noEstPerFrame; - INT totNoEst = h_sbrMHDet->totNoEst; - INT prevTransientFlag = h_sbrMHDet->previousTransientFlag; - INT prevTransientFrame = h_sbrMHDet->previousTransientFrame; - INT transientPosOffset = h_sbrMHDet->transientPosOffset; - INT prevTransientPos = h_sbrMHDet->previousTransientPos; - GUIDE_VECTORS* guideVectors = h_sbrMHDet->guideVectors; + UCHAR **detectionVectors = h_sbrMHDet->detectionVectors; + INT move = h_sbrMHDet->move; + INT noEstPerFrame = h_sbrMHDet->noEstPerFrame; + INT totNoEst = h_sbrMHDet->totNoEst; + INT prevTransientFlag = h_sbrMHDet->previousTransientFlag; + INT prevTransientFrame = h_sbrMHDet->previousTransientFrame; + INT transientPosOffset = h_sbrMHDet->transientPosOffset; + INT prevTransientPos = h_sbrMHDet->previousTransientPos; + GUIDE_VECTORS *guideVectors = h_sbrMHDet->guideVectors; INT deltaTime = h_sbrMHDet->mhParams->deltaTime; INT maxComp = h_sbrMHDet->mhParams->maxComp; @@ -1107,96 +1040,70 @@ FDKsbrEnc_SbrMissingHarmonicsDetectorQmf(HANDLE_SBR_MISSING_HARMONICS_DETECTOR h /* Buffer values. */ - FDK_ASSERT(move<=(MAX_NO_OF_ESTIMATES>>1)); - FDK_ASSERT(noEstPerFrame<=(MAX_NO_OF_ESTIMATES>>1)); + FDK_ASSERT(move <= (MAX_NO_OF_ESTIMATES >> 1)); + FDK_ASSERT(noEstPerFrame <= (MAX_NO_OF_ESTIMATES >> 1)); FIXP_DBL *sfmSbr[MAX_NO_OF_ESTIMATES]; FIXP_DBL *sfmOrig[MAX_NO_OF_ESTIMATES]; FIXP_DBL *tonalityDiff[MAX_NO_OF_ESTIMATES]; - for (est=0; est < MAX_NO_OF_ESTIMATES/2; est++) { - sfmSbr[est] = h_sbrMHDet->sfmSbr[est]; - sfmOrig[est] = h_sbrMHDet->sfmOrig[est]; + for (est = 0; est < MAX_NO_OF_ESTIMATES / 2; est++) { + sfmSbr[est] = h_sbrMHDet->sfmSbr[est]; + sfmOrig[est] = h_sbrMHDet->sfmOrig[est]; tonalityDiff[est] = h_sbrMHDet->tonalityDiff[est]; } - C_ALLOC_SCRATCH_START(scratch_mem, FIXP_DBL, (3*MAX_NO_OF_ESTIMATES/2*MAX_FREQ_COEFFS)); - FIXP_DBL *scratch = scratch_mem; + C_ALLOC_SCRATCH_START(_scratch, FIXP_DBL, + 3 * MAX_NO_OF_ESTIMATES / 2 * MAX_FREQ_COEFFS) + FIXP_DBL *scratch = _scratch; for (; est < MAX_NO_OF_ESTIMATES; est++) { - sfmSbr[est] = scratch; scratch+=MAX_FREQ_COEFFS; - sfmOrig[est] = scratch; scratch+=MAX_FREQ_COEFFS; - tonalityDiff[est] = scratch; scratch+=MAX_FREQ_COEFFS; + sfmSbr[est] = scratch; + scratch += MAX_FREQ_COEFFS; + sfmOrig[est] = scratch; + scratch += MAX_FREQ_COEFFS; + tonalityDiff[est] = scratch; + scratch += MAX_FREQ_COEFFS; } + /* Determine if we're allowed to detect "missing harmonics" that wasn't + detected before. In order to be allowed to do new detection, there must be + a transient in the current frame, or a transient in the previous frame + sufficiently close to the current frame. */ + newDetectionAllowed = isDetectionOfNewToneAllowed( + pFrameInfo, &transientDetStart, noEstPerFrame, prevTransientFrame, + prevTransientPos, prevTransientFlag, transientPosOffset, transientFlag, + transientPos, deltaTime, h_sbrMHDet); - - /* Determine if we're allowed to detect "missing harmonics" that wasn't detected before. - In order to be allowed to do new detection, there must be a transient in the current - frame, or a transient in the previous frame sufficiently close to the current frame. */ - newDetectionAllowed = isDetectionOfNewToneAllowed(pFrameInfo, - &transientDetStart, - noEstPerFrame, - prevTransientFrame, - prevTransientPos, - prevTransientFlag, - transientPosOffset, - transientFlag, - transientPos, - deltaTime, - h_sbrMHDet); - - /* Calulate the variables that will be used subsequently for the actual detection */ - calculateDetectorInput(pQuotaBuffer, - indexVector, - tonalityDiff, - sfmOrig, - sfmSbr, - freqBandTable, - nSfb, - noEstPerFrame, - move); + /* Calulate the variables that will be used subsequently for the actual + * detection */ + calculateDetectorInput(pQuotaBuffer, indexVector, tonalityDiff, sfmOrig, + sfmSbr, freqBandTable, nSfb, noEstPerFrame, move); /* Do the actual detection using information from previous detections */ - detectionWithPrediction(pQuotaBuffer, - tonalityDiff, - pSignBuffer, - nSfb, - freqBandTable, - sfmOrig, - sfmSbr, - detectionVectors, - h_sbrMHDet->guideScfb, - guideVectors, - noEstPerFrame, - transientDetStart, - totNoEst, - newDetectionAllowed, - pAddHarmonicsFlag, - pAddHarmonicsScaleFactorBands, - pNrgVector, - h_sbrMHDet->mhParams); + detectionWithPrediction(pQuotaBuffer, tonalityDiff, pSignBuffer, nSfb, + freqBandTable, sfmOrig, sfmSbr, detectionVectors, + h_sbrMHDet->guideScfb, guideVectors, noEstPerFrame, + transientDetStart, totNoEst, newDetectionAllowed, + pAddHarmonicsFlag, pAddHarmonicsScaleFactorBands, + pNrgVector, h_sbrMHDet->mhParams); /* Calculate the comp vector, so that the energy can be compensated for a sine between two QMF-bands. */ - calculateCompVector(pAddHarmonicsScaleFactorBands, - pQuotaBuffer, - pSignBuffer, - envelopeCompensation, - nSfb, - freqBandTable, - totNoEst, - maxComp, - h_sbrMHDet->prevEnvelopeCompensation, + calculateCompVector(pAddHarmonicsScaleFactorBands, pQuotaBuffer, pSignBuffer, + envelopeCompensation, nSfb, freqBandTable, totNoEst, + maxComp, h_sbrMHDet->prevEnvelopeCompensation, newDetectionAllowed); - for (est=0; est < move; est++) { - FDKmemcpy(tonalityDiff[est], tonalityDiff[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); - FDKmemcpy(sfmOrig[est], sfmOrig[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); - FDKmemcpy(sfmSbr[est], sfmSbr[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); + for (est = 0; est < move; est++) { + FDKmemcpy(tonalityDiff[est], tonalityDiff[est + noEstPerFrame], + sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); + FDKmemcpy(sfmOrig[est], sfmOrig[est + noEstPerFrame], + sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); + FDKmemcpy(sfmSbr[est], sfmSbr[est + noEstPerFrame], + sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); } - C_ALLOC_SCRATCH_END(scratch, FIXP_DBL, (3*MAX_NO_OF_ESTIMATES/2*MAX_FREQ_COEFFS)); - - + C_ALLOC_SCRATCH_END(_scratch, FIXP_DBL, + 3 * MAX_NO_OF_ESTIMATES / 2 * MAX_FREQ_COEFFS) } /**************************************************************************/ @@ -1208,34 +1115,48 @@ FDKsbrEnc_SbrMissingHarmonicsDetectorQmf(HANDLE_SBR_MISSING_HARMONICS_DETECTOR h */ /**************************************************************************/ -INT -FDKsbrEnc_CreateSbrMissingHarmonicsDetector ( - HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, - INT chan) -{ +INT FDKsbrEnc_CreateSbrMissingHarmonicsDetector( + HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, INT chan) { HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; INT i; - UCHAR* detectionVectors = GetRam_Sbr_detectionVectors(chan); - UCHAR* guideVectorDetected = GetRam_Sbr_guideVectorDetected(chan); - FIXP_DBL* guideVectorDiff = GetRam_Sbr_guideVectorDiff(chan); - FIXP_DBL* guideVectorOrig = GetRam_Sbr_guideVectorOrig(chan); + UCHAR *detectionVectors = GetRam_Sbr_detectionVectors(chan); + UCHAR *guideVectorDetected = GetRam_Sbr_guideVectorDetected(chan); + FIXP_DBL *guideVectorDiff = GetRam_Sbr_guideVectorDiff(chan); + FIXP_DBL *guideVectorOrig = GetRam_Sbr_guideVectorOrig(chan); - FDKmemclear (hs,sizeof(SBR_MISSING_HARMONICS_DETECTOR)); + FDKmemclear(hs, sizeof(SBR_MISSING_HARMONICS_DETECTOR)); hs->prevEnvelopeCompensation = GetRam_Sbr_prevEnvelopeCompensation(chan); - hs->guideScfb = GetRam_Sbr_guideScfb(chan); + hs->guideScfb = GetRam_Sbr_guideScfb(chan); + + if ((NULL == detectionVectors) || (NULL == guideVectorDetected) || + (NULL == guideVectorDiff) || (NULL == guideVectorOrig) || + (NULL == hs->prevEnvelopeCompensation) || (NULL == hs->guideScfb)) { + goto bail; + } - for(i=0; i<MAX_NO_OF_ESTIMATES; i++) { - hs->guideVectors[i].guideVectorDiff = guideVectorDiff + (i*MAX_FREQ_COEFFS); - hs->guideVectors[i].guideVectorOrig = guideVectorOrig + (i*MAX_FREQ_COEFFS); - hs->detectionVectors[i] = detectionVectors + (i*MAX_FREQ_COEFFS); - hs->guideVectors[i].guideVectorDetected = guideVectorDetected + (i*MAX_FREQ_COEFFS); + for (i = 0; i < MAX_NO_OF_ESTIMATES; i++) { + hs->guideVectors[i].guideVectorDiff = + guideVectorDiff + (i * MAX_FREQ_COEFFS); + hs->guideVectors[i].guideVectorOrig = + guideVectorOrig + (i * MAX_FREQ_COEFFS); + hs->detectionVectors[i] = detectionVectors + (i * MAX_FREQ_COEFFS); + hs->guideVectors[i].guideVectorDetected = + guideVectorDetected + (i * MAX_FREQ_COEFFS); } return 0; -} +bail: + hs->guideVectors[0].guideVectorDiff = guideVectorDiff; + hs->guideVectors[0].guideVectorOrig = guideVectorOrig; + hs->detectionVectors[0] = detectionVectors; + hs->guideVectors[0].guideVectorDetected = guideVectorDetected; + + FDKsbrEnc_DeleteSbrMissingHarmonicsDetector(hs); + return -1; +} /**************************************************************************/ /*! @@ -1246,54 +1167,43 @@ FDKsbrEnc_CreateSbrMissingHarmonicsDetector ( */ /**************************************************************************/ -INT -FDKsbrEnc_InitSbrMissingHarmonicsDetector ( - HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, - INT sampleFreq, - INT frameSize, - INT nSfb, - INT qmfNoChannels, - INT totNoEst, - INT move, - INT noEstPerFrame, - UINT sbrSyntaxFlags - ) -{ +INT FDKsbrEnc_InitSbrMissingHarmonicsDetector( + HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, INT sampleFreq, + INT frameSize, INT nSfb, INT qmfNoChannels, INT totNoEst, INT move, + INT noEstPerFrame, UINT sbrSyntaxFlags) { HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; int i; FDK_ASSERT(totNoEst <= MAX_NO_OF_ESTIMATES); - if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) - { - switch(frameSize){ - case 1024: - case 512: + if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { + switch (frameSize) { + case 1024: + case 512: hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; - hs->timeSlots = 16; + hs->timeSlots = 16; break; - case 960: - case 480: + case 960: + case 480: hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; - hs->timeSlots = 15; + hs->timeSlots = 15; break; - default: + default: return -1; } - } else - { - switch(frameSize){ - case 2048: - case 1024: + } else { + switch (frameSize) { + case 2048: + case 1024: hs->transientPosOffset = FRAME_MIDDLE_SLOT_2048; - hs->timeSlots = NUMBER_TIME_SLOTS_2048; + hs->timeSlots = NUMBER_TIME_SLOTS_2048; break; - case 1920: - case 960: + case 1920: + case 960: hs->transientPosOffset = FRAME_MIDDLE_SLOT_1920; - hs->timeSlots = NUMBER_TIME_SLOTS_1920; + hs->timeSlots = NUMBER_TIME_SLOTS_1920; break; - default: + default: return -1; } } @@ -1301,7 +1211,7 @@ FDKsbrEnc_InitSbrMissingHarmonicsDetector ( if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { hs->mhParams = ¶msAacLd; } else - hs->mhParams = ¶msAac; + hs->mhParams = ¶msAac; hs->qmfNoChannels = qmfNoChannels; hs->sampleFreq = sampleFreq; @@ -1311,22 +1221,25 @@ FDKsbrEnc_InitSbrMissingHarmonicsDetector ( hs->move = move; hs->noEstPerFrame = noEstPerFrame; - for(i=0; i<totNoEst; i++) { - FDKmemclear (hs->guideVectors[i].guideVectorDiff,sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); - FDKmemclear (hs->guideVectors[i].guideVectorOrig,sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); - FDKmemclear (hs->detectionVectors[i],sizeof(UCHAR)*MAX_FREQ_COEFFS); - FDKmemclear (hs->guideVectors[i].guideVectorDetected,sizeof(UCHAR)*MAX_FREQ_COEFFS); + for (i = 0; i < totNoEst; i++) { + FDKmemclear(hs->guideVectors[i].guideVectorDiff, + sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); + FDKmemclear(hs->guideVectors[i].guideVectorOrig, + sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); + FDKmemclear(hs->detectionVectors[i], sizeof(UCHAR) * MAX_FREQ_COEFFS); + FDKmemclear(hs->guideVectors[i].guideVectorDetected, + sizeof(UCHAR) * MAX_FREQ_COEFFS); } - //for(i=0; i<totNoEst/2; i++) { - for(i=0; i<MAX_NO_OF_ESTIMATES/2; i++) { - FDKmemclear (hs->tonalityDiff[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); - FDKmemclear (hs->sfmOrig[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); - FDKmemclear (hs->sfmSbr[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); + // for(i=0; i<totNoEst/2; i++) { + for (i = 0; i < MAX_NO_OF_ESTIMATES / 2; i++) { + FDKmemclear(hs->tonalityDiff[i], sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); + FDKmemclear(hs->sfmOrig[i], sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); + FDKmemclear(hs->sfmSbr[i], sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); } - FDKmemclear ( hs->prevEnvelopeCompensation, sizeof(UCHAR)*MAX_FREQ_COEFFS); - FDKmemclear ( hs->guideScfb, sizeof(UCHAR)*MAX_FREQ_COEFFS); + FDKmemclear(hs->prevEnvelopeCompensation, sizeof(UCHAR) * MAX_FREQ_COEFFS); + FDKmemclear(hs->guideScfb, sizeof(UCHAR) * MAX_FREQ_COEFFS); hs->previousTransientFlag = 0; hs->previousTransientFrame = 0; @@ -1344,9 +1257,8 @@ FDKsbrEnc_InitSbrMissingHarmonicsDetector ( */ /**************************************************************************/ -void -FDKsbrEnc_DeleteSbrMissingHarmonicsDetector(HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet) -{ +void FDKsbrEnc_DeleteSbrMissingHarmonicsDetector( + HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet) { if (hSbrMHDet) { HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; @@ -1356,7 +1268,6 @@ FDKsbrEnc_DeleteSbrMissingHarmonicsDetector(HANDLE_SBR_MISSING_HARMONICS_DETECTO FreeRam_Sbr_guideVectorOrig(&hs->guideVectors[0].guideVectorOrig); FreeRam_Sbr_prevEnvelopeCompensation(&hs->prevEnvelopeCompensation); FreeRam_Sbr_guideScfb(&hs->guideScfb); - } } @@ -1369,10 +1280,9 @@ FDKsbrEnc_DeleteSbrMissingHarmonicsDetector(HANDLE_SBR_MISSING_HARMONICS_DETECTO */ /**************************************************************************/ -INT -FDKsbrEnc_ResetSbrMissingHarmonicsDetector (HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMissingHarmonicsDetector, - INT nSfb) -{ +INT FDKsbrEnc_ResetSbrMissingHarmonicsDetector( + HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMissingHarmonicsDetector, + INT nSfb) { int i; FIXP_DBL tempGuide[MAX_FREQ_COEFFS]; UCHAR tempGuideInt[MAX_FREQ_COEFFS]; @@ -1381,91 +1291,106 @@ FDKsbrEnc_ResetSbrMissingHarmonicsDetector (HANDLE_SBR_MISSING_HARMONICS_DETECTO nSfbPrev = hSbrMissingHarmonicsDetector->nSfb; hSbrMissingHarmonicsDetector->nSfb = nSfb; - FDKmemcpy( tempGuideInt, hSbrMissingHarmonicsDetector->guideScfb, nSfbPrev * sizeof(UCHAR) ); + FDKmemcpy(tempGuideInt, hSbrMissingHarmonicsDetector->guideScfb, + nSfbPrev * sizeof(UCHAR)); - if ( nSfb > nSfbPrev ) { - for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { + if (nSfb > nSfbPrev) { + for (i = 0; i < (nSfb - nSfbPrev); i++) { hSbrMissingHarmonicsDetector->guideScfb[i] = 0; } - for ( i = 0; i < nSfbPrev; i++ ) { - hSbrMissingHarmonicsDetector->guideScfb[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; + for (i = 0; i < nSfbPrev; i++) { + hSbrMissingHarmonicsDetector->guideScfb[i + (nSfb - nSfbPrev)] = + tempGuideInt[i]; } - } - else { - for ( i = 0; i < nSfb; i++ ) { - hSbrMissingHarmonicsDetector->guideScfb[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; + } else { + for (i = 0; i < nSfb; i++) { + hSbrMissingHarmonicsDetector->guideScfb[i] = + tempGuideInt[i + (nSfbPrev - nSfb)]; } } - FDKmemcpy ( tempGuide, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff, nSfbPrev * sizeof(FIXP_DBL) ); + FDKmemcpy(tempGuide, + hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff, + nSfbPrev * sizeof(FIXP_DBL)); - if (nSfb > nSfbPrev ) { - for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { - hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = FL2FXCONST_DBL(0.0f); + if (nSfb > nSfbPrev) { + for (i = 0; i < (nSfb - nSfbPrev); i++) { + hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = + FL2FXCONST_DBL(0.0f); } - for ( i = 0; i < nSfbPrev; i++ ) { - hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i + (nSfb - nSfbPrev)] = tempGuide[i]; + for (i = 0; i < nSfbPrev; i++) { + hSbrMissingHarmonicsDetector->guideVectors[0] + .guideVectorDiff[i + (nSfb - nSfbPrev)] = tempGuide[i]; } - } - else { - for ( i = 0; i < nSfb; i++ ) { - hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = tempGuide[i + (nSfbPrev-nSfb)]; + } else { + for (i = 0; i < nSfb; i++) { + hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = + tempGuide[i + (nSfbPrev - nSfb)]; } } - FDKmemcpy ( tempGuide, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig, nSfbPrev * sizeof(FIXP_DBL) ); + FDKmemcpy(tempGuide, + hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig, + nSfbPrev * sizeof(FIXP_DBL)); - if ( nSfb > nSfbPrev ) { - for ( i = 0; i< (nSfb - nSfbPrev); i++ ) { - hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = FL2FXCONST_DBL(0.0f); + if (nSfb > nSfbPrev) { + for (i = 0; i < (nSfb - nSfbPrev); i++) { + hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = + FL2FXCONST_DBL(0.0f); } - for ( i = 0; i < nSfbPrev; i++ ) { - hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i + (nSfb - nSfbPrev)] = tempGuide[i]; + for (i = 0; i < nSfbPrev; i++) { + hSbrMissingHarmonicsDetector->guideVectors[0] + .guideVectorOrig[i + (nSfb - nSfbPrev)] = tempGuide[i]; } - } - else { - for ( i = 0; i < nSfb; i++ ) { - hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = tempGuide[i + (nSfbPrev-nSfb)]; + } else { + for (i = 0; i < nSfb; i++) { + hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = + tempGuide[i + (nSfbPrev - nSfb)]; } } - FDKmemcpy ( tempGuideInt, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected, nSfbPrev * sizeof(UCHAR) ); + FDKmemcpy(tempGuideInt, + hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected, + nSfbPrev * sizeof(UCHAR)); - if ( nSfb > nSfbPrev ) { - for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { + if (nSfb > nSfbPrev) { + for (i = 0; i < (nSfb - nSfbPrev); i++) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = 0; } - for ( i = 0; i < nSfbPrev; i++ ) { - hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; + for (i = 0; i < nSfbPrev; i++) { + hSbrMissingHarmonicsDetector->guideVectors[0] + .guideVectorDetected[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; } - } - else { - for ( i = 0; i < nSfb; i++ ) { - hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; + } else { + for (i = 0; i < nSfb; i++) { + hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = + tempGuideInt[i + (nSfbPrev - nSfb)]; } } - FDKmemcpy ( tempGuideInt, hSbrMissingHarmonicsDetector->prevEnvelopeCompensation, nSfbPrev * sizeof(UCHAR) ); + FDKmemcpy(tempGuideInt, + hSbrMissingHarmonicsDetector->prevEnvelopeCompensation, + nSfbPrev * sizeof(UCHAR)); - if ( nSfb > nSfbPrev ) { - for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { + if (nSfb > nSfbPrev) { + for (i = 0; i < (nSfb - nSfbPrev); i++) { hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = 0; } - for ( i = 0; i < nSfbPrev; i++ ) { - hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; + for (i = 0; i < nSfbPrev; i++) { + hSbrMissingHarmonicsDetector + ->prevEnvelopeCompensation[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; } - } - else { - for ( i = 0; i < nSfb; i++ ) { - hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; + } else { + for (i = 0; i < nSfb; i++) { + hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = + tempGuideInt[i + (nSfbPrev - nSfb)]; } } return 0; } - |