16cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* -----------------------------------------------------------------------------
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
46cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK© Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
56cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKForschung e.V. All rights reserved.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
86cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
96cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthat implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKscheme for digital audio. This FDK AAC Codec software is intended to be used on
116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKa wide variety of Android devices.
126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKgeneral perceptual audio codecs. AAC-ELD is considered the best-performing
156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfull-bandwidth communications codec by independent studies and is widely
166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKdeployed. AAC has been standardized by ISO and IEC as part of the MPEG
176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKspecifications.
186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKPatent licenses for necessary patent claims for the FDK AAC Codec (including
206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthose of Fraunhofer) may be obtained through Via Licensing
216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK(www.vialicensing.com) or through the respective patent owners individually for
226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe purpose of encoding or decoding bit streams in products that are compliant
236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwith the ISO/IEC MPEG audio standards. Please note that most manufacturers of
246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAndroid devices already license these patent claims through Via Licensing or
256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKdirectly from the patent owners, and therefore FDK AAC Codec software may
266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKalready be covered under those patent licenses when it is used for those
276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKlicensed purposes only.
286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKCommercially-licensed AAC software libraries, including floating-point versions
306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwith enhanced sound quality, are also available from Fraunhofer. Users are
316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKencouraged to check the Fraunhofer website for additional applications
326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKinformation and documentation.
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKRedistribution and use in source and binary forms, with or without modification,
376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKare permitted without payment of copyright license fees provided that you
386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKsatisfy the following conditions:
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou must retain the complete text of this software license in redistributions of
416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe FDK AAC Codec or your modifications thereto in source code form.
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou must retain the complete text of this software license in the documentation
446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKand/or other materials provided with redistributions of the FDK AAC Codec or
456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKyour modifications thereto in binary form. You must make available free of
466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKcharge copies of the complete source code of the FDK AAC Codec and your
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThe name of Fraunhofer may not be used to endorse or promote products derived
506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfrom this library without prior written permission.
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou may not charge copyright license fees for anyone to use, copy or distribute
536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe FDK AAC Codec software or your modifications thereto.
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYour modified versions of the FDK AAC Codec must carry prominent notices stating
566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthat you changed the software and the date of any change. For modified versions
576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKof the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKmust be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAAC Codec Library for Android."
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKlimitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFraunhofer provides no warranty of patent non-infringement with respect to this
666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKsoftware.
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou may use this FDK AAC Codec software or modifications thereto only for
696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKpurposes that are authorized by appropriate patent licenses.
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKholders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKincluding but not limited to the implied warranties of merchantability and
766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKor consequential damages, including but not limited to procurement of substitute
796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKgoods or services; loss of use, data, or profits, or business interruption,
806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKhowever caused and on any theory of liability, whether in contract, strict
816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKliability, or tort (including negligence), arising in any way out of the use of
826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthis software, even if advised of the possibility of such damage.
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK----------------------------------------------------------------------------- */
946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/**************************** AAC encoder library ******************************
966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK   Author(s):   M.Werner
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK   Description: Short block grouping
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK*******************************************************************************/
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "psy_const.h"
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "interface.h"
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
1076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * this routine does not work in-place
1086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/*
1116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Don't use fAddSaturate2() because it looses one bit accuracy which is
1126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * usefull for quality.
1136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */
114381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivistatic inline FIXP_DBL nrgAddSaturate(const FIXP_DBL a, const FIXP_DBL b) {
1156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  return ((a >= (FIXP_DBL)MAXVAL_DBL - b) ? (FIXP_DBL)MAXVAL_DBL : (a + b));
116381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi}
117381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi
1186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKvoid FDKaacEnc_groupShortData(FIXP_DBL *mdctSpectrum,      /* in-out      */
1196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              SFB_THRESHOLD *sfbThreshold, /* in-out */
1206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              SFB_ENERGY *sfbEnergy,       /* in-out       */
1216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              SFB_ENERGY *sfbEnergyMS,     /* in-out     */
1226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              SFB_ENERGY *sfbSpreadEnergy, const INT sfbCnt,
1236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              const INT sfbActive, const INT *sfbOffset,
1246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              const FIXP_DBL *sfbMinSnrLdData,
1256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              INT *groupedSfbOffset, /* out */
1266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              INT *maxSfbPerGroup,   /* out */
1276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              FIXP_DBL *groupedSfbMinSnrLdData,
1286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              const INT noOfGroups, const INT *groupLen,
1296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                              const INT granuleLength) {
1306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  INT i, j;
1316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  INT line;   /* counts through lines              */
1326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  INT sfb;    /* counts through scalefactor bands  */
1336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  INT grp;    /* counts through groups             */
1346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  INT wnd;    /* counts through windows in a group */
1356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  INT offset; /* needed in sfbOffset grouping      */
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT highestSfb;
1376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  INT granuleLength_short = granuleLength / TRANS_FAC;
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  C_ALLOC_SCRATCH_START(tmpSpectrum, FIXP_DBL, (1024))
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* for short blocks: regroup spectrum and */
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* group energies and thresholds according to grouping */
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculate maxSfbPerGroup */
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  highestSfb = 0;
1466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  for (wnd = 0; wnd < TRANS_FAC; wnd++) {
1476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    for (sfb = sfbActive - 1; sfb >= highestSfb; sfb--) {
1486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      for (line = sfbOffset[sfb + 1] - 1; line >= sfbOffset[sfb]; line--) {
1496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        if (mdctSpectrum[wnd * granuleLength_short + line] !=
1506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            FL2FXCONST_SPC(0.0))
1516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          break; /* this band is not completely zero */
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
1536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      if (line >= sfbOffset[sfb]) break; /* this band was not completely zero */
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    highestSfb = fixMax(highestSfb, sfb);
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  highestSfb = highestSfb > 0 ? highestSfb : 0;
1586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  *maxSfbPerGroup = highestSfb + 1;
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculate groupedSfbOffset */
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  i = 0;
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  offset = 0;
1636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  for (grp = 0; grp < noOfGroups; grp++) {
1646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    for (sfb = 0; sfb < sfbActive + 1; sfb++) {
1656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      groupedSfbOffset[i++] = offset + sfbOffset[sfb] * groupLen[grp];
1666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    }
1676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    i += sfbCnt - sfb;
1686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    offset += groupLen[grp] * granuleLength_short;
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  groupedSfbOffset[i++] = granuleLength;
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculate groupedSfbMinSnr */
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  i = 0;
1746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  for (grp = 0; grp < noOfGroups; grp++) {
1756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    for (sfb = 0; sfb < sfbActive; sfb++) {
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      groupedSfbMinSnrLdData[i++] = sfbMinSnrLdData[sfb];
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    i += sfbCnt - sfb;
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* sum up sfbThresholds */
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  wnd = 0;
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  i = 0;
1846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  for (grp = 0; grp < noOfGroups; grp++) {
1856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    for (sfb = 0; sfb < sfbActive; sfb++) {
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL thresh = sfbThreshold->Short[wnd][sfb];
1876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      for (j = 1; j < groupLen[grp]; j++) {
1886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        thresh = nrgAddSaturate(thresh, sfbThreshold->Short[wnd + j][sfb]);
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sfbThreshold->Long[i++] = thresh;
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    i += sfbCnt - sfb;
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    wnd += groupLen[grp];
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* sum up sfbEnergies left/right */
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  wnd = 0;
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  i = 0;
1996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  for (grp = 0; grp < noOfGroups; grp++) {
2006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    for (sfb = 0; sfb < sfbActive; sfb++) {
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL energy = sfbEnergy->Short[wnd][sfb];
2026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      for (j = 1; j < groupLen[grp]; j++) {
2036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        energy = nrgAddSaturate(energy, sfbEnergy->Short[wnd + j][sfb]);
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sfbEnergy->Long[i++] = energy;
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    i += sfbCnt - sfb;
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    wnd += groupLen[grp];
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* sum up sfbEnergies mid/side */
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  wnd = 0;
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  i = 0;
2146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  for (grp = 0; grp < noOfGroups; grp++) {
2156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    for (sfb = 0; sfb < sfbActive; sfb++) {
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL energy = sfbEnergyMS->Short[wnd][sfb];
2176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      for (j = 1; j < groupLen[grp]; j++) {
2186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        energy = nrgAddSaturate(energy, sfbEnergyMS->Short[wnd + j][sfb]);
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sfbEnergyMS->Long[i++] = energy;
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    i += sfbCnt - sfb;
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    wnd += groupLen[grp];
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* sum up sfbSpreadEnergies */
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  wnd = 0;
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  i = 0;
2296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  for (grp = 0; grp < noOfGroups; grp++) {
2306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    for (sfb = 0; sfb < sfbActive; sfb++) {
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL energy = sfbSpreadEnergy->Short[wnd][sfb];
2326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      for (j = 1; j < groupLen[grp]; j++) {
2336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        energy = nrgAddSaturate(energy, sfbSpreadEnergy->Short[wnd + j][sfb]);
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sfbSpreadEnergy->Long[i++] = energy;
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    i += sfbCnt - sfb;
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    wnd += groupLen[grp];
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* re-group spectrum */
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  wnd = 0;
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  i = 0;
2446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  for (grp = 0; grp < noOfGroups; grp++) {
2456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    for (sfb = 0; sfb < sfbActive; sfb++) {
2466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      int width = sfbOffset[sfb + 1] - sfbOffset[sfb];
2476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      FIXP_DBL *pMdctSpectrum =
2486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          &mdctSpectrum[sfbOffset[sfb]] + wnd * granuleLength_short;
2496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      for (j = 0; j < groupLen[grp]; j++) {
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FIXP_DBL *pTmp = pMdctSpectrum;
2516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        for (line = width; line > 0; line--) {
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          tmpSpectrum[i++] = *pTmp++;
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pMdctSpectrum += granuleLength_short;
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    i += (groupLen[grp] * (sfbOffset[sfbCnt] - sfbOffset[sfb]));
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    wnd += groupLen[grp];
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  FDKmemcpy(mdctSpectrum, tmpSpectrum, granuleLength * sizeof(FIXP_DBL));
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(tmpSpectrum, FIXP_DBL, (1024))
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
265