12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* -----------------------------------------------------------------------------------------------------------
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
52228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project� Copyright  1995 - 2012 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/******************************** MPEG Audio Encoder **************************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    Initial author:       M. Werner
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    contents/description: Threshold compensation
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "common_fix.h"
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "adj_thr_data.h"
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "adj_thr.h"
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "qc_data.h"
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sf_estim.h"
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacEnc_ram.h"
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define INV_INT_TAB_SIZE  (8)
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL invInt[INV_INT_TAB_SIZE] =
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  0x7fffffff, 0x7fffffff, 0x40000000, 0x2aaaaaaa, 0x20000000, 0x19999999, 0x15555555, 0x12492492
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define INV_SQRT4_TAB_SIZE  (8)
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL invSqrt4[INV_SQRT4_TAB_SIZE] =
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  0x7fffffff, 0x7fffffff, 0x6ba27e65, 0x61424bb5, 0x5a827999, 0x55994845, 0x51c8e33c, 0x4eb160d1
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*static const INT      invRedExp = 4;*/
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL  SnrLdMin1 = (FIXP_DBL)0xfcad0ddf; /*FL2FXCONST_DBL(FDKlog(0.316)/FDKlog(2.0)/LD_DATA_SCALING);*/
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL  SnrLdMin2 = (FIXP_DBL)0x0351e1a2; /*FL2FXCONST_DBL(FDKlog(3.16) /FDKlog(2.0)/LD_DATA_SCALING);*/
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL  SnrLdFac  = (FIXP_DBL)0xff5b2c3e; /*FL2FXCONST_DBL(FDKlog(0.8)  /FDKlog(2.0)/LD_DATA_SCALING);*/
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL  SnrLdMin3 = (FIXP_DBL)0xfe000000; /*FL2FXCONST_DBL(FDKlog(0.5)  /FDKlog(2.0)/LD_DATA_SCALING);*/
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL  SnrLdMin4 = (FIXP_DBL)0x02000000; /*FL2FXCONST_DBL(FDKlog(2.0)  /FDKlog(2.0)/LD_DATA_SCALING);*/
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL  SnrLdMin5 = (FIXP_DBL)0xfc000000; /*FL2FXCONST_DBL(FDKlog(0.25) /FDKlog(2.0)/LD_DATA_SCALING);*/
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* values for avoid hole flag */
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectenum _avoid_hole_state {
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    NO_AH              =0,
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AH_INACTIVE        =1,
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AH_ACTIVE          =2
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*  Q format definitions */
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define Q_BITFAC    (24)   /* Q scaling used in FDKaacEnc_bitresCalcBitFac() calculation */
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define Q_AVGBITS   (17)   /* scale bit values */
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT FDKaacEnc_bits2pe2(
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 bits,
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const FIXP_DBL            factor_m,
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 factor_e
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   return (INT)(fMult(factor_m, (FIXP_DBL)(bits<<Q_AVGBITS)) >> (Q_AVGBITS-factor_e));
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_calcThreshExp
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  loudness calculation (threshold to the power of redExp)
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_calcThreshExp(FIXP_DBL thrExp[(2)][MAX_GROUPED_SFB],
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          QC_OUT_CHANNEL*  qcOutChannel[(2)],
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          PSY_OUT_CHANNEL*  psyOutChannel[(2)],
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const INT nChannels)
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch, sfb, sfbGrp;
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL thrExpLdData;
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for (ch=0; ch<nChannels; ch++) {
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for(sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup) {
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         thrExpLdData = psyOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb]>>2 ;
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         thrExp[ch][sfbGrp+sfb] = CalcInvLdData(thrExpLdData);
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_adaptMinSnr
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  reduce minSnr requirements for bands with relative low energies
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_adaptMinSnr(QC_OUT_CHANNEL     *qcOutChannel[(2)],
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  PSY_OUT_CHANNEL    *psyOutChannel[(2)],
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  MINSNR_ADAPT_PARAM *msaParam,
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  const INT           nChannels)
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT ch, sfb, sfbGrp, nSfb;
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL avgEnLD64, dbRatio, minSnrRed;
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL minSnrLimitLD64 = FL2FXCONST_DBL(-0.00503012648262f); /* ld64(0.8f) */
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL nSfbLD64;
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL accu;
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (ch=0; ch<nChannels; ch++) {
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* calc average energy per scalefactor band */
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    nSfb = 0;
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    accu = FL2FXCONST_DBL(0.0f);
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        accu += psyOutChannel[ch]->sfbEnergy[sfbGrp+sfb]>>6;
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project				 nSfb++;
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project			 }
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((accu == FL2FXCONST_DBL(0.0f)) || (nSfb == 0)) {
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      avgEnLD64 = FL2FXCONST_DBL(-1.0f);
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      nSfbLD64  = CalcLdInt(nSfb);
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      avgEnLD64 = CalcLdData(accu);
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      avgEnLD64 = avgEnLD64 + FL2FXCONST_DBL(0.09375f) - nSfbLD64;  /* 0.09375f: compensate shift with 6 */
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (msaParam->startRatio + qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb]) < avgEnLD64 ) {
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          dbRatio = fMult((avgEnLD64 - qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb]),FL2FXCONST_DBL(0.3010299956f)); /* scaled by (1.0f/(10.0f*64.0f)) */
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          minSnrRed = msaParam->redOffs + fMult(msaParam->redRatioFac,dbRatio); /* scaled by 1.0f/64.0f*/
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          minSnrRed = fixMax(minSnrRed, msaParam->maxRed); /* scaled by 1.0f/64.0f*/
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb] = (fMult(qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb],minSnrRed)) << 6;
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(minSnrLimitLD64, qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb]);
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_initAvoidHoleFlag
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  determine bands where avoid hole is not necessary resp. possible
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_initAvoidHoleFlag(QC_OUT_CHANNEL  *qcOutChannel[(2)],
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              PSY_OUT_CHANNEL *psyOutChannel[(2)],
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              struct TOOLSINFO *toolsInfo,
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              const INT nChannels,
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              const PE_DATA *peData,
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              AH_PARAM *ahParam)
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch, sfb, sfbGrp;
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbEn, sfbEnm1;
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbEnLdData;
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL avgEnLdData;
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* decrease spread energy by 3dB for long blocks, resp. 2dB for shorts
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (avoid more holes in long blocks) */
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for (ch=0; ch<nChannels; ch++) {
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT sfbGrp, sfb;
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL*  qcOutChan  = qcOutChannel[ch];
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (psyOutChannel[ch]->lastWindowSequence != SHORT_WINDOW) {
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup)
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++)
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              qcOutChan->sfbSpreadEnergy[sfbGrp+sfb] >>= 1 ;
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup)
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++)
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              qcOutChan->sfbSpreadEnergy[sfbGrp+sfb] =
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   fMult(FL2FXCONST_DBL(0.63f),
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         qcOutChan->sfbSpreadEnergy[sfbGrp+sfb]) ;
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* increase minSnr for local peaks, decrease it for valleys */
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if (ahParam->modifyMinSnr) {
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(ch=0; ch<nChannels; ch++) {
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         QC_OUT_CHANNEL*  qcOutChan  = qcOutChannel[ch];
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for(sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup){
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               FIXP_DBL sfbEnp1, avgEn;
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               if (sfb > 0)
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sfbEnm1 = qcOutChan->sfbEnergy[sfbGrp+sfb-1];
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               else
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sfbEnm1 = qcOutChan->sfbEnergy[sfbGrp+sfb];
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               if (sfb < psyOutChannel[ch]->maxSfbPerGroup-1)
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sfbEnp1 = qcOutChan->sfbEnergy[sfbGrp+sfb+1];
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               else
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sfbEnp1 = qcOutChan->sfbEnergy[sfbGrp+sfb];
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               avgEn = (sfbEnm1>>1) + (sfbEnp1>>1);
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               avgEnLdData = CalcLdData(avgEn);
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbEn = qcOutChan->sfbEnergy[sfbGrp+sfb];
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbEnLdData = qcOutChan->sfbEnergyLdData[sfbGrp+sfb];
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               /* peak ? */
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               if (sfbEn > avgEn) {
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  FIXP_DBL tmpMinSnrLdData;
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if (psyOutChannel[ch]->lastWindowSequence==LONG_WINDOW)
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     tmpMinSnrLdData = fixMax( SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), (FIXP_DBL)SnrLdMin1 ) ;
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  else
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     tmpMinSnrLdData = fixMax( SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), (FIXP_DBL)SnrLdMin3 ) ;
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] =
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     fixMin(qcOutChan->sfbMinSnrLdData[sfbGrp+sfb], tmpMinSnrLdData);
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               }
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               /* valley ? */
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               if ( ((sfbEnLdData+(FIXP_DBL)SnrLdMin4) < (FIXP_DBL)avgEnLdData) && (sfbEn > FL2FXCONST_DBL(0.0)) ) {
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  FIXP_DBL tmpMinSnrLdData = avgEnLdData - sfbEnLdData -(FIXP_DBL)SnrLdMin4 + qcOutChan->sfbMinSnrLdData[sfbGrp+sfb];
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  tmpMinSnrLdData = fixMin((FIXP_DBL)SnrLdFac, tmpMinSnrLdData);
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(tmpMinSnrLdData,
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        (FIXP_DBL)(qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + SnrLdMin2 ));
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               }
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         }
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* stereo: adapt the minimum requirements sfbMinSnr of mid and
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      side channels to avoid spending unnoticable bits */
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if (nChannels == 2) {
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL*  qcOutChanM  = qcOutChannel[0];
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL*  qcOutChanS  = qcOutChannel[1];
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PSY_OUT_CHANNEL*  psyOutChanM  = psyOutChannel[0];
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(sfbGrp = 0;sfbGrp < psyOutChanM->sfbCnt;sfbGrp+= psyOutChanM->sfbPerGroup){
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfb=0; sfb<psyOutChanM->maxSfbPerGroup; sfb++) {
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (toolsInfo->msMask[sfbGrp+sfb]) {
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL maxSfbEnLd = fixMax(qcOutChanM->sfbEnergyLdData[sfbGrp+sfb],qcOutChanS->sfbEnergyLdData[sfbGrp+sfb]);
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL maxThrLd, sfbMinSnrTmpLd;
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if ( ((SnrLdMin5>>1) + (maxSfbEnLd>>1) + (qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb]>>1)) <= FL2FXCONST_DBL(-0.5f))
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               maxThrLd = FL2FXCONST_DBL(-1.0f) ;
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               maxThrLd = SnrLdMin5 + maxSfbEnLd + qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb];
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanM->sfbEnergy[sfbGrp+sfb] > FL2FXCONST_DBL(0.0f))
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbMinSnrTmpLd = maxThrLd - qcOutChanM->sfbEnergyLdData[sfbGrp+sfb];
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbMinSnrTmpLd = FL2FXCONST_DBL(0.0f);
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb] = fixMax(qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb],sfbMinSnrTmpLd);
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb] <= FL2FXCONST_DBL(0.0f))
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb], (FIXP_DBL)SnrLdFac);
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanS->sfbEnergy[sfbGrp+sfb] > FL2FXCONST_DBL(0.0f))
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbMinSnrTmpLd = maxThrLd - qcOutChanS->sfbEnergyLdData[sfbGrp+sfb];
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbMinSnrTmpLd = FL2FXCONST_DBL(0.0f);
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb] = fixMax(qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb],sfbMinSnrTmpLd);
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb] <= FL2FXCONST_DBL(0.0f))
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb],(FIXP_DBL)SnrLdFac);
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanM->sfbEnergy[sfbGrp+sfb]>qcOutChanM->sfbSpreadEnergy[sfbGrp+sfb])
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChanS->sfbSpreadEnergy[sfbGrp+sfb] =
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   fMult(qcOutChanS->sfbEnergy[sfbGrp+sfb], FL2FXCONST_DBL(0.9f));
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanS->sfbEnergy[sfbGrp+sfb]>qcOutChanS->sfbSpreadEnergy[sfbGrp+sfb])
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChanM->sfbSpreadEnergy[sfbGrp+sfb] =
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   fMult(qcOutChanM->sfbEnergy[sfbGrp+sfb], FL2FXCONST_DBL(0.9f));
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(ch=0; ch<nChannels; ch++) {
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL  *qcOutChan  = qcOutChannel[ch];
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PSY_OUT_CHANNEL  *psyOutChan  = psyOutChannel[ch];
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ((qcOutChan->sfbSpreadEnergy[sfbGrp+sfb] > qcOutChan->sfbEnergy[sfbGrp+sfb])
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              || (qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] > FL2FXCONST_DBL(0.0f))) {
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             ahFlag[ch][sfbGrp+sfb] = NO_AH;
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          else {
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             ahFlag[ch][sfbGrp+sfb] = AH_INACTIVE;
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief  Calculate constants that do not change during successive pe calculations.
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param peData                Pointer to structure containing PE data of current element.
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param psyOutChannel         Pointer to PSY_OUT_CHANNEL struct holding nChannels elements.
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param qcOutChannel          Pointer to QC_OUT_CHANNEL struct holding nChannels elements.
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param nChannels             Number of channels in element.
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param peOffset              Fixed PE offset defined while FDKaacEnc_AdjThrInit() depending on bitrate.
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return  void
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_preparePe(PE_DATA *peData,
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               PSY_OUT_CHANNEL* psyOutChannel[(2)],
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               QC_OUT_CHANNEL* qcOutChannel[(2)],
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               const INT nChannels,
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               const INT peOffset)
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT ch;
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(ch=0; ch<nChannels; ch++) {
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        PSY_OUT_CHANNEL *psyOutChan = psyOutChannel[ch];
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKaacEnc_prepareSfbPe(&peData->peChannelData[ch],
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbEnergyLdData,
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbThresholdLdData,
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            qcOutChannel[ch]->sfbFormFactorLdData,
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbOffsets,
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbCnt,
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbPerGroup,
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->maxSfbPerGroup);
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    peData->offset = peOffset;
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief  Calculate weighting factor for threshold adjustment.
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Calculate weighting factor to be applied at energies and thresholds in ld64 format.
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param peData,               Pointer to PE data in current element.
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param psyOutChannel         Pointer to PSY_OUT_CHANNEL struct holding nChannels elements.
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param qcOutChannel          Pointer to QC_OUT_CHANNEL struct holding nChannels elements.
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param toolsInfo             Pointer to tools info struct of current element.
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param adjThrStateElement    Pointer to ATS_ELEMENT holding enFacPatch states.
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param nChannels             Number of channels in element.
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param usePatchTool          Apply the weighting tool 0 (no) else (yes).
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return  void
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_calcWeighting(PE_DATA *peData,
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               PSY_OUT_CHANNEL* psyOutChannel[(2)],
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               QC_OUT_CHANNEL* qcOutChannel[(2)],
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               struct TOOLSINFO *toolsInfo,
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               ATS_ELEMENT* adjThrStateElement,
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               const INT nChannels,
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               const INT usePatchTool)
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch, noShortWindowInFrame = TRUE;
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT exePatchM = 0;
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch=0; ch<nChannels; ch++) {
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (psyOutChannel[ch]->lastWindowSequence == SHORT_WINDOW) {
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            noShortWindowInFrame = FALSE;
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(qcOutChannel[ch]->sfbEnFacLd, MAX_GROUPED_SFB*sizeof(FIXP_DBL));
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (usePatchTool==0) {
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return; /* tool is disabled */
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch=0; ch<nChannels; ch++) {
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        PSY_OUT_CHANNEL *psyOutChan = psyOutChannel[ch];
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (noShortWindowInFrame) { /* retain energy ratio between blocks of different length */
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FIXP_DBL nrgSum14, nrgSum12, nrgSum34, nrgTotal;
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FIXP_DBL nrgFacLd_14, nrgFacLd_12, nrgFacLd_34;
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT usePatch, exePatch;
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            int sfb, nLinesSum = 0;
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgSum14 = nrgSum12 = nrgSum34 = nrgTotal = FL2FXCONST_DBL(0.f);
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* calculate flatness of audible spectrum, i.e. spectrum above masking threshold. */
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb = 0; sfb < psyOutChan->sfbCnt; sfb++) {
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                FIXP_DBL nrgFac12 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfb]>>1);   /* nrg^(1/2) */
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                FIXP_DBL nrgFac14 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfb]>>2);   /* nrg^(1/4) */
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* maximal number of bands is 64, results scaling factor 6 */
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                nLinesSum += peData->peChannelData[ch].sfbNLines[sfb];                    /* relevant lines */
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                nrgTotal  += ( psyOutChan->sfbEnergy[sfb] >> 6 );                         /* sum up nrg */
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                nrgSum12  += ( nrgFac12 >> 6 );                                           /* sum up nrg^(2/4) */
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                nrgSum14  += ( nrgFac14 >> 6 );                                           /* sum up nrg^(1/4) */
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                nrgSum34  += ( fMult(nrgFac14, nrgFac12) >> 6 );                          /* sum up nrg^(3/4) */
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgTotal = CalcLdData(nrgTotal);                                              /* get ld64 of total nrg */
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgFacLd_14 = CalcLdData(nrgSum14) - nrgTotal;                                /* ld64(nrgSum14/nrgTotal) */
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgFacLd_12 = CalcLdData(nrgSum12) - nrgTotal;                                /* ld64(nrgSum12/nrgTotal) */
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgFacLd_34 = CalcLdData(nrgSum34) - nrgTotal;                                /* ld64(nrgSum34/nrgTotal) */
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            adjThrStateElement->chaosMeasureEnFac[ch] = FDKmax( FL2FXCONST_DBL(0.1875f), fDivNorm(nLinesSum,psyOutChan->sfbOffsets[psyOutChan->sfbCnt]) );
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            usePatch = (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.78125f));
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            exePatch = ((usePatch) && (adjThrStateElement->lastEnFacPatch[ch]));
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb = 0; sfb < psyOutChan->sfbCnt; sfb++) {
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                INT sfbExePatch;
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* for MS coupled SFBs, also execute patch in side channel if done in mid channel */
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if ((ch == 1) && (toolsInfo->msMask[sfb])) {
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbExePatch = exePatchM;
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                else {
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbExePatch = exePatch;
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if ( (sfbExePatch) && (psyOutChan->sfbEnergy[sfb]>FL2FXCONST_DBL(0.f)) )
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                {
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* execute patch based on spectral flatness calculated above */
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    if (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.8125f)) {
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        qcOutChannel[ch]->sfbEnFacLd[sfb] = ( (nrgFacLd_14 + (psyOutChan->sfbEnergyLdData[sfb]+(psyOutChan->sfbEnergyLdData[sfb]>>1)))>>1 ); /* sfbEnergy^(3/4) */
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    else if (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.796875f)) {
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        qcOutChannel[ch]->sfbEnFacLd[sfb] = ( (nrgFacLd_12 + psyOutChan->sfbEnergyLdData[sfb])>>1 );          /* sfbEnergy^(2/4) */
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    else {
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        qcOutChannel[ch]->sfbEnFacLd[sfb] = ( (nrgFacLd_34 + (psyOutChan->sfbEnergyLdData[sfb]>>1))>>1 );     /* sfbEnergy^(1/4) */
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    qcOutChannel[ch]->sfbEnFacLd[sfb] = fixMin(qcOutChannel[ch]->sfbEnFacLd[sfb],(FIXP_DBL)0);
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* sfb loop */
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            adjThrStateElement->lastEnFacPatch[ch] = usePatch;
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            exePatchM = exePatch;
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* !noShortWindowInFrame */
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            adjThrStateElement->chaosMeasureEnFac[ch] = FL2FXCONST_DBL(0.75f);
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            adjThrStateElement->lastEnFacPatch[ch] = TRUE; /* allow use of sfbEnFac patch in upcoming frame */
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* ch loop */
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_calcPe
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  calculate pe for both channels
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_calcPe(PSY_OUT_CHANNEL* psyOutChannel[(2)],
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            QC_OUT_CHANNEL* qcOutChannel[(2)],
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            PE_DATA *peData,
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            const INT nChannels)
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch;
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   peData->pe = peData->offset;
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   peData->constPart = 0;
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   peData->nActiveLines = 0;
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(ch=0; ch<nChannels; ch++) {
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKaacEnc_calcSfbPe(&peData->peChannelData[ch],
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChannel[ch]->sfbWeightedEnergyLdData,
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChannel[ch]->sfbThresholdLdData,
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->sfbCnt,
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->sfbPerGroup,
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->maxSfbPerGroup,
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->isBook,
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->isScale);
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      peData->pe += peChanData->pe;
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      peData->constPart += peChanData->constPart;
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      peData->nActiveLines += peChanData->nActiveLines;
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_peCalculation(PE_DATA *peData,
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             PSY_OUT_CHANNEL* psyOutChannel[(2)],
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             QC_OUT_CHANNEL* qcOutChannel[(2)],
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             struct TOOLSINFO *toolsInfo,
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             ATS_ELEMENT* adjThrStateElement,
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             const INT nChannels)
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* constants that will not change during successive pe calculations */
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_preparePe(peData, psyOutChannel, qcOutChannel, nChannels, adjThrStateElement->peOffset);
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculate weighting factor for threshold adjustment */
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_calcWeighting(peData, psyOutChannel, qcOutChannel, toolsInfo, adjThrStateElement, nChannels, 1);
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* no weighting of threholds and energies for mlout */
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* weight energies and thresholds */
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch;
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch=0; ch<nChannels; ch++) {
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int sfb, sfbGrp;
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        QC_OUT_CHANNEL* pQcOutCh = qcOutChannel[ch];
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pQcOutCh->sfbWeightedEnergyLdData[sfb+sfbGrp] = pQcOutCh->sfbEnergyLdData[sfb+sfbGrp] - pQcOutCh->sfbEnFacLd[sfb+sfbGrp];
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pQcOutCh->sfbThresholdLdData[sfb+sfbGrp]     -= pQcOutCh->sfbEnFacLd[sfb+sfbGrp];
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* pe without reduction */
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_calcPe(psyOutChannel, qcOutChannel, peData, nChannels);
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_FDKaacEnc_calcPeNoAH
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  sum the pe data only for bands where avoid hole is inactive
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_FDKaacEnc_calcPeNoAH(INT *pe,
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       INT *constPart,
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       INT    *nActiveLines,
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       PE_DATA *peData,
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       PSY_OUT_CHANNEL* psyOutChannel[(2)],
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       const INT nChannels)
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT ch, sfb,sfbGrp;
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT pe_tmp = peData->offset;
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT constPart_tmp = 0;
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT nActiveLines_tmp = 0;
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(ch=0; ch<nChannels; ch++) {
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for(sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup){
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if(ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) {
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    pe_tmp += peChanData->sfbPe[sfbGrp+sfb];
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    constPart_tmp += peChanData->sfbConstPart[sfbGrp+sfb];
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    nActiveLines_tmp += peChanData->sfbNActiveLines[sfbGrp+sfb];
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* correct scaled pe and constPart values */
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pe = pe_tmp >> PE_CONSTPART_SHIFT;
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *constPart = constPart_tmp >> PE_CONSTPART_SHIFT;
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project	*nActiveLines = nActiveLines_tmp;
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_reduceThresholdsCBR
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  apply reduction formula
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL limitThrReducedLdData = (FIXP_DBL)0x00008000; /*FL2FXCONST_DBL(FDKpow(2.0,-LD_DATA_SCALING/4.0));*/
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_reduceThresholdsCBR(QC_OUT_CHANNEL*  qcOutChannel[(2)],
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                PSY_OUT_CHANNEL* psyOutChannel[(2)],
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                FIXP_DBL thrExp[(2)][MAX_GROUPED_SFB],
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT nChannels,
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const FIXP_DBL redVal,
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const SCHAR redValScaling)
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch, sfb, sfbGrp;
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrReducedLdData;
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbThrExp;
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(ch=0; ch<nChannels; ch++) {
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL *qcOutChan = qcOutChannel[ch];
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(sfbGrp = 0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+= psyOutChannel[ch]->sfbPerGroup){
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbEnLdData  = qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb];
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbThrLdData = qcOutChan->sfbThresholdLdData[sfbGrp+sfb];
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbThrExp    = thrExp[ch][sfbGrp+sfb];
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         if ((sfbEnLdData > sfbThrLdData) && (ahFlag[ch][sfbGrp+sfb] != AH_ACTIVE)) {
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* threshold reduction formula:
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             float tmp = thrExp[ch][sfb]+redVal;
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             tmp *= tmp;
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             sfbThrReduced = tmp*tmp;
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            */
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            int minScale = fixMin(CountLeadingBits(sfbThrExp), CountLeadingBits(redVal) - (DFRACT_BITS-1-redValScaling) )-1;
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* 4*log( sfbThrExp + redVal ) */
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrReducedLdData = CalcLdData(fAbs(scaleValue(sfbThrExp, minScale) + scaleValue(redVal,(DFRACT_BITS-1-redValScaling)+minScale)))
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             - (FIXP_DBL)(minScale<<(DFRACT_BITS-1-LD_DATA_SHIFT));
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrReducedLdData <<= 2;
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* avoid holes */
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( ((sfbThrReducedLdData - sfbEnLdData) > qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] )
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    && (ahFlag[ch][sfbGrp+sfb] != NO_AH) )
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]  > (FL2FXCONST_DBL(-1.0f) - sfbEnLdData) ){
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   sfbThrReducedLdData = fixMax((qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + sfbEnLdData), sfbThrLdData);
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              else sfbThrReducedLdData = sfbThrLdData;
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* minimum of 29 dB Ratio for Thresholds */
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ((sfbEnLdData+(FIXP_DBL)MAXVAL_DBL) > FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING)){
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                sfbThrReducedLdData = fixMax(sfbThrReducedLdData, (sfbEnLdData - FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING)));
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = sfbThrReducedLdData;
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         }
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* similar to prepareSfbPe1() */
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL FDKaacEnc_calcChaosMeasure(PSY_OUT_CHANNEL *psyOutChannel,
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 const FIXP_DBL  *sfbFormFactorLdData)
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_FORM_FAC     (4)    /* (SCALE_FORM_FAC+FORM_FAC_SHIFT) >= ld(FRAME_LENGTH)*/
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_NRGS         (8)
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_NLINES      (16)
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_NRGS_SQRT4   (2)    /* 0.25 * SCALE_NRGS */
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_NLINES_P34  (12)    /* 0.75 * SCALE_NLINES */
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT   sfbGrp, sfb;
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chaosMeasure;
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT frameNLines = 0;
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL frameFormFactor = FL2FXCONST_DBL(0.f);
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL frameEnergy = FL2FXCONST_DBL(0.f);
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (sfbGrp=0; sfbGrp<psyOutChannel->sfbCnt; sfbGrp+=psyOutChannel->sfbPerGroup) {
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfb=0; sfb<psyOutChannel->maxSfbPerGroup; sfb++){
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (psyOutChannel->sfbEnergyLdData[sfbGrp+sfb] > psyOutChannel->sfbThresholdLdData[sfbGrp+sfb]) {
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        frameFormFactor += (CalcInvLdData(sfbFormFactorLdData[sfbGrp+sfb])>>SCALE_FORM_FAC);
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        frameNLines     += (psyOutChannel->sfbOffsets[sfbGrp+sfb+1] - psyOutChannel->sfbOffsets[sfbGrp+sfb]);
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        frameEnergy     += (psyOutChannel->sfbEnergy[sfbGrp+sfb]>>SCALE_NRGS);
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(frameNLines > 0){
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*  frameNActiveLines = frameFormFactor*2^FORM_FAC_SHIFT * ((frameEnergy *2^SCALE_NRGS)/frameNLines)^-0.25
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        chaosMeasure      = frameNActiveLines / frameNLines */
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure =
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           CalcInvLdData( (((CalcLdData(frameFormFactor)>>1) -
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            (CalcLdData(frameEnergy)>>(2+1))) -
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           (fMultDiv2(FL2FXCONST_DBL(0.75f),CalcLdData((FIXP_DBL)frameNLines<<(DFRACT_BITS-1-SCALE_NLINES))) -
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            (((FIXP_DBL)(SCALE_FORM_FAC-SCALE_NRGS_SQRT4+FORM_FAC_SHIFT-(SCALE_NLINES_P34))<<(DFRACT_BITS-1-LD_DATA_SHIFT))>>1))
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          )<<1 );
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* assuming total chaos, if no sfb is above thresholds */
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure = FL2FXCONST_DBL(1.f);
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return chaosMeasure;
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* apply reduction formula for VBR-mode */
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_reduceThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)],
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                PSY_OUT_CHANNEL* psyOutChannel[(2)],
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                FIXP_DBL thrExp[(2)][MAX_GROUPED_SFB],
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT nChannels,
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const FIXP_DBL  vbrQualFactor,
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                FIXP_DBL* chaosMeasureOld)
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT ch, sfbGrp, sfb;
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chGroupEnergy[TRANS_FAC][2];/*energy for each group and channel*/
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chChaosMeasure[2];
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL frameEnergy = FL2FXCONST_DBL(1e-10f);
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chaosMeasure = FL2FXCONST_DBL(0.f);
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrExp;
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL sfbThrReducedLdData;
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chaosMeasureAvg;
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT groupCnt; /* loop counter */
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL redVal[TRANS_FAC]; /* reduction values; in short-block case one redVal for each group */
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  QC_OUT_CHANNEL  *qcOutChan  = NULL;
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  PSY_OUT_CHANNEL  *psyOutChan  = NULL;
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SCALE_GROUP_ENERGY   (8)
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define CONST_CHAOS_MEAS_AVG_FAC_0  (FL2FXCONST_DBL(0.25f))
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define CONST_CHAOS_MEAS_AVG_FAC_1  (FL2FXCONST_DBL(1.f-0.25f))
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define MIN_LDTHRESH                (FL2FXCONST_DBL(-0.515625f))
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(ch=0; ch<nChannels; ch++){
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOutChan  = qcOutChannel[ch];
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    psyOutChan  = psyOutChannel[ch];
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* adding up energy for each channel and each group separately */
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL chEnergy = FL2FXCONST_DBL(0.f);
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    groupCnt=0;
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup, groupCnt++) {
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      chGroupEnergy[groupCnt][ch] = FL2FXCONST_DBL(0.f);
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++){
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        chGroupEnergy[groupCnt][ch] += (psyOutChan->sfbEnergy[sfbGrp+sfb]>>SCALE_GROUP_ENERGY);
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      chEnergy += chGroupEnergy[groupCnt][ch];
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    frameEnergy += chEnergy;
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* chaosMeasure */
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (psyOutChannel[0]->lastWindowSequence == SHORT_WINDOW) {
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      chChaosMeasure[ch] = FL2FXCONST_DBL(0.5f); /* assume a constant chaos measure of 0.5f for short blocks */
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      chChaosMeasure[ch] = FDKaacEnc_calcChaosMeasure(psyOutChannel[ch], qcOutChannel[ch]->sfbFormFactorLdData);
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure += fMult(chChaosMeasure[ch], chEnergy);
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(frameEnergy > chaosMeasure) {
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT scale = CntLeadingZeros(frameEnergy) - 1;
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL num   = chaosMeasure<<scale;
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL denum = frameEnergy<<scale;
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure   = schur_div(num,denum,16);
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure = FL2FXCONST_DBL(1.f);
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  chaosMeasureAvg = fMult(CONST_CHAOS_MEAS_AVG_FAC_0, chaosMeasure) +
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    fMult(CONST_CHAOS_MEAS_AVG_FAC_1, *chaosMeasureOld);      /* averaging chaos measure */
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *chaosMeasureOld = chaosMeasure = (fixMin(chaosMeasure, chaosMeasureAvg));  /* use min-value, safe for next frame */
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* characteristic curve
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     chaosMeasure = 0.2f + 0.7f/0.3f * (chaosMeasure - 0.2f);
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     chaosMeasure = fixMin(1.0f, fixMax(0.1f, chaosMeasure));
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     constants scaled by 4.f
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  chaosMeasure = ((FL2FXCONST_DBL(0.2f)>>2) + fMult(FL2FXCONST_DBL(0.7f/(4.f*0.3f)), (chaosMeasure - FL2FXCONST_DBL(0.2f))));
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  chaosMeasure = (fixMin((FIXP_DBL)(FL2FXCONST_DBL(1.0f)>>2), fixMax((FIXP_DBL)(FL2FXCONST_DBL(0.1f)>>2), chaosMeasure)))<<2;
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculation of reduction value */
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (psyOutChannel[0]->lastWindowSequence == SHORT_WINDOW){ /* short-blocks */
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_ASSERT(TRANS_FAC==8);
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    #define   WIN_TYPE_SCALE   (3)
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT sfbGrp, groupCnt=0;
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup,groupCnt++) {
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL groupEnergy = FL2FXCONST_DBL(0.f);
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(ch=0;ch<nChannels;ch++){
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        groupEnergy += chGroupEnergy[groupCnt][ch];   /* adding up the channels groupEnergy */
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDK_ASSERT(psyOutChannel[0]->groupLen[groupCnt]<=INV_INT_TAB_SIZE);
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      groupEnergy = fMult(groupEnergy,invInt[psyOutChannel[0]->groupLen[groupCnt]]);  /* correction of group energy */
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      groupEnergy = fixMin(groupEnergy, frameEnergy>>WIN_TYPE_SCALE);                 /* do not allow an higher redVal as calculated framewise */
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      groupEnergy>>=2; /* 2*WIN_TYPE_SCALE = 6 => 6+2 = 8 ==> 8/4 = int number */
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      redVal[groupCnt] = fMult(fMult(vbrQualFactor,chaosMeasure),
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               CalcInvLdData(CalcLdData(groupEnergy)>>2) )
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         << (int)( ( 2 + (2*WIN_TYPE_SCALE) + SCALE_GROUP_ENERGY )>>2 ) ;
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else { /* long-block */
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    redVal[0] = fMult( fMult(vbrQualFactor,chaosMeasure),
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       CalcInvLdData(CalcLdData(frameEnergy)>>2) )
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                << (int)( SCALE_GROUP_ENERGY>>2 ) ;
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(ch=0; ch<nChannels; ch++) {
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOutChan  = qcOutChannel[ch];
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    psyOutChan  = psyOutChannel[ch];
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++){
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfbEnLdData  = (qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb]);
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfbThrLdData = (qcOutChan->sfbThresholdLdData[sfbGrp+sfb]);
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfbThrExp    = thrExp[ch][sfbGrp+sfb];
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (sfbThrLdData>=MIN_LDTHRESH) && (sfbEnLdData > sfbThrLdData) && (ahFlag[ch][sfbGrp+sfb] != AH_ACTIVE)) {
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Short-Window */
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (psyOutChannel[ch]->lastWindowSequence == SHORT_WINDOW) {
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            const int groupNumber = (int) sfb/psyOutChan->sfbPerGroup;
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDK_ASSERT(INV_SQRT4_TAB_SIZE>psyOutChan->groupLen[groupNumber]);
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrExp = fMult(sfbThrExp, fMult( FL2FXCONST_DBL(2.82f/4.f), invSqrt4[psyOutChan->groupLen[groupNumber]]))<<2 ;
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( sfbThrExp <= (limitThrReducedLdData-redVal[groupNumber]) ) {
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                sfbThrReducedLdData = FL2FXCONST_DBL(-1.0f);
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else {
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if ((FIXP_DBL)redVal[groupNumber] >= FL2FXCONST_DBL(1.0f)-sfbThrExp)
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbThrReducedLdData = FL2FXCONST_DBL(0.0f);
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                else {
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* threshold reduction formula */
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbThrReducedLdData = CalcLdData(sfbThrExp + redVal[groupNumber]);
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbThrReducedLdData <<= 2;
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrReducedLdData += ( CalcLdInt(psyOutChan->groupLen[groupNumber]) -
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     ((FIXP_DBL)6<<(DFRACT_BITS-1-LD_DATA_SHIFT)) );
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Long-Window */
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          else {
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ((FIXP_DBL)redVal[0] >= FL2FXCONST_DBL(1.0f)-sfbThrExp) {
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfbThrReducedLdData = FL2FXCONST_DBL(0.0f);
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else {
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* threshold reduction formula */
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfbThrReducedLdData = CalcLdData(sfbThrExp + redVal[0]);
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfbThrReducedLdData <<= 2;
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* avoid holes */
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ( ((sfbThrReducedLdData - sfbEnLdData) > qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] )
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  && (ahFlag[ch][sfbGrp+sfb] != NO_AH) )
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]  > (FL2FXCONST_DBL(-1.0f) - sfbEnLdData) ){
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 sfbThrReducedLdData = fixMax((qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + sfbEnLdData), sfbThrLdData);
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else sfbThrReducedLdData = sfbThrLdData;
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (sfbThrReducedLdData<FL2FXCONST_DBL(-0.5f))
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbThrReducedLdData = FL2FXCONST_DBL(-1.f);
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* minimum of 29 dB Ratio for Thresholds */
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ((sfbEnLdData+FL2FXCONST_DBL(1.0f)) > FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING)){
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrReducedLdData = fixMax(sfbThrReducedLdData, sfbEnLdData - FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING));
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfbThrReducedLdData = fixMax(MIN_LDTHRESH,sfbThrReducedLdData);
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = sfbThrReducedLdData;
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_correctThresh
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  if pe difference deltaPe between desired pe and real pe is small enough,
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe difference can be distributed among the scale factor bands.
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNew thresholds can be derived from this pe-difference
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_correctThresh(CHANNEL_MAPPING* cm,
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          QC_OUT_ELEMENT*  qcElement[(6)],
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          PSY_OUT_ELEMENT* psyOutElement[(6)],
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          UCHAR            ahFlag[(6)][(2)][MAX_GROUPED_SFB],
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          FIXP_DBL         thrExp[(6)][(2)][MAX_GROUPED_SFB],
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const            FIXP_DBL redVal[(6)],
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const            SCHAR redValScaling[(6)],
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const            INT deltaPe,
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const            INT processElements,
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const            INT elementOffset)
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch, sfb, sfbGrp;
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   QC_OUT_CHANNEL *qcOutChan;
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   PSY_OUT_CHANNEL *psyOutChan;
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   PE_CHANNEL_DATA *peChanData;
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL thrFactorLdData;
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrReducedLdData;
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL *sfbPeFactorsLdData[(6)][(2)];
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbNActiveLinesLdData[(2)][MAX_GROUPED_SFB];
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT      normFactorInt;
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL normFactorLdData;
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT nElements = elementOffset+processElements;
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT elementId;
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* scratch is empty; use temporal memory from quantSpec in QC_OUT_CHANNEL */
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(elementId=elementOffset;elementId<nElements;elementId++) {
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       SHORT* ptr = qcElement[elementId]->qcOutChannel[ch]->quantSpec;
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       sfbPeFactorsLdData[elementId][ch] = (FIXP_DBL*)ptr;
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* for each sfb calc relative factors for pe changes */
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   normFactorInt = 0;
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(elementId=elementOffset;elementId<nElements;elementId++) {
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChan = qcElement[elementId]->qcOutChannel[ch];
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          psyOutChan = psyOutElement[elementId]->psyOutChannel[ch];
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          peChanData = &qcElement[elementId]->peData.peChannelData[ch];
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup){
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if ( peChanData->sfbNActiveLines[sfbGrp+sfb] == 0 ) {
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                sfbNActiveLinesLdData[ch][sfbGrp+sfb] = FL2FXCONST_DBL(-1.0f);
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             }
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else {
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* Both CalcLdInt and CalcLdData can be used!
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 * No offset has to be subtracted, because sfbNActiveLinesLdData
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 * is shorted while thrFactor calculation */
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                sfbNActiveLinesLdData[ch][sfbGrp+sfb] = CalcLdInt(peChanData->sfbNActiveLines[sfbGrp+sfb]);
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             }
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if ( ((ahFlag[elementId][ch][sfbGrp+sfb] < AH_ACTIVE) || (deltaPe > 0)) &&
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   peChanData->sfbNActiveLines[sfbGrp+sfb] != 0 )
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             {
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (thrExp[elementId][ch][sfbGrp+sfb] > -redVal[elementId]) {
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   /* sfbPeFactors[ch][sfbGrp+sfb] = peChanData->sfbNActiveLines[sfbGrp+sfb] /
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     (thrExp[elementId][ch][sfbGrp+sfb] + redVal[elementId]); */
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   int minScale = fixMin(CountLeadingBits(thrExp[elementId][ch][sfbGrp+sfb]), CountLeadingBits(redVal[elementId]) - (DFRACT_BITS-1-redValScaling[elementId]) ) - 1;
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   /* sumld = ld64( sfbThrExp + redVal ) */
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   FIXP_DBL sumLd = CalcLdData(scaleValue(thrExp[elementId][ch][sfbGrp+sfb], minScale) + scaleValue(redVal[elementId], (DFRACT_BITS-1-redValScaling[elementId])+minScale))
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               - (FIXP_DBL)(minScale<<(DFRACT_BITS-1-LD_DATA_SHIFT));
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   if (sumLd < FL2FXCONST_DBL(0.f)) {
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[ch][sfbGrp+sfb] - sumLd;
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   else {
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     if ( sfbNActiveLinesLdData[ch][sfbGrp+sfb] > (FL2FXCONST_DBL(-1.f) + sumLd) ) {
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[ch][sfbGrp+sfb] - sumLd;
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     }
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     else {
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[ch][sfbGrp+sfb];
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     }
10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   normFactorInt += (INT)CalcInvLdData(sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb]);
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                else sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = FL2FXCONST_DBL(1.0f);
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             }
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = FL2FXCONST_DBL(-1.0f);
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* normFactorLdData = ld64(deltaPe/normFactorInt) */
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   normFactorLdData = CalcLdData((FIXP_DBL)((deltaPe<0) ? (-deltaPe) : (deltaPe))) - CalcLdData((FIXP_DBL)normFactorInt);
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* distribute the pe difference to the scalefactors
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      and calculate the according thresholds */
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(elementId=elementOffset;elementId<nElements;elementId++) {
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChan = qcElement[elementId]->qcOutChannel[ch];
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          psyOutChan = psyOutElement[elementId]->psyOutChannel[ch];
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          peChanData = &qcElement[elementId]->peData.peChannelData[ch];
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (peChanData->sfbNActiveLines[sfbGrp+sfb] > 0) {
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 /* pe difference for this sfb */
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 if ( (sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb]==FL2FXCONST_DBL(-1.0f)) ||
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      (deltaPe==0) )
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 {
10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   thrFactorLdData = FL2FXCONST_DBL(0.f);
10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 else {
10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   /* new threshold */
10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   FIXP_DBL tmp = CalcInvLdData(sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] + normFactorLdData - sfbNActiveLinesLdData[ch][sfbGrp+sfb] - FL2FXCONST_DBL((float)LD_DATA_SHIFT/LD_DATA_SCALING));
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   /* limit thrFactor to 60dB */
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   tmp = (deltaPe<0) ? tmp : (-tmp);
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   thrFactorLdData = FDKmin(tmp, FL2FXCONST_DBL(20.f/LD_DATA_SCALING));
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 /* new threshold */
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 sfbThrLdData = qcOutChan->sfbThresholdLdData[sfbGrp+sfb];
10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 sfbEnLdData  = qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb];
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 if (thrFactorLdData < FL2FXCONST_DBL(0.f)) {
10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   if( sfbThrLdData > (FL2FXCONST_DBL(-1.f)-thrFactorLdData) ) {
10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     sfbThrReducedLdData = sfbThrLdData + thrFactorLdData;
10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   else {
10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     sfbThrReducedLdData = FL2FXCONST_DBL(-1.f);
10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 else{
10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbThrReducedLdData = sfbThrLdData + thrFactorLdData;
10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 /* avoid hole */
10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 if ( (sfbThrReducedLdData - sfbEnLdData > qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]) &&
10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      (ahFlag[elementId][ch][sfbGrp+sfb] == AH_INACTIVE) )
10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 {
10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* sfbThrReduced = max(psyOutChan[ch]->sfbMinSnr[i] * sfbEn, sfbThr); */
10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    if ( sfbEnLdData > (sfbThrLdData-qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]) ) {
10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        sfbThrReducedLdData = qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + sfbEnLdData;
10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    else {
10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        sfbThrReducedLdData = sfbThrLdData;
10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    ahFlag[elementId][ch][sfbGrp+sfb] = AH_ACTIVE;
10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = sfbThrReducedLdData;
10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_reduceMinSnr
11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  if the desired pe can not be reached, reduce pe by
11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  reducing minSnr
11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_reduceMinSnr(CHANNEL_MAPPING* cm,
11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            QC_OUT_ELEMENT*  qcElement[(6)],
11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            PSY_OUT_ELEMENT* psyOutElement[(6)],
11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            UCHAR            ahFlag[(6)][(2)][MAX_GROUPED_SFB],
11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            const            INT desiredPe,
11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            INT*             redPeGlobal,
11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            const            INT processElements,
11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            const            INT elementOffset)
11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT elementId;
11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT nElements = elementOffset+processElements;
11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT newGlobalPe = *redPeGlobal;
11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(elementId=elementOffset;elementId<nElements;elementId++) {
11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT ch;
11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT maxSfbPerGroup[2];
11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT sfbCnt[2];
11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT sfbPerGroup[2];
11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         maxSfbPerGroup[ch] = psyOutElement[elementId]->psyOutChannel[ch]->maxSfbPerGroup-1;
11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbCnt[ch]         = psyOutElement[elementId]->psyOutChannel[ch]->sfbCnt;
11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbPerGroup[ch]    = psyOutElement[elementId]->psyOutChannel[ch]->sfbPerGroup;
11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       PE_DATA *peData = &qcElement[elementId]->peData;
11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       do
11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       {
11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT sfb, sfbGrp;
11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            QC_OUT_CHANNEL  *qcOutChan = qcElement[elementId]->qcOutChannel[ch];
11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT noReduction = 1;
11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (maxSfbPerGroup[ch]>=0) {  /* sfb in next channel */
11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              INT deltaPe = 0;
11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfb = maxSfbPerGroup[ch]--;
11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              noReduction = 0;
11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              for (sfbGrp = 0; sfbGrp < sfbCnt[ch]; sfbGrp += sfbPerGroup[ch]) {
11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (ahFlag[elementId][ch][sfbGrp+sfb] != NO_AH &&
11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] < SnrLdFac)
11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                {
11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* increase threshold to new minSnr of 1dB */
11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] = SnrLdFac;
11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* sfbThrReduced = max(psyOutChan[ch]->sfbMinSnr[i] * sfbEn, sfbThr); */
11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if ( qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb] >= qcOutChan->sfbThresholdLdData[sfbGrp+sfb] - qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] ) {
11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb] + qcOutChan->sfbMinSnrLdData[sfbGrp+sfb];
11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     /* calc new pe */
11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     /* C2 + C3*ld(1/0.8) = 1.5 */
11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     deltaPe -= (peData->peChannelData[ch].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT);
11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     /* sfbPe = 1.5 * sfbNLines */
11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     peData->peChannelData[ch].sfbPe[sfbGrp+sfb] = (3*peData->peChannelData[ch].sfbNLines[sfbGrp+sfb]) << (PE_CONSTPART_SHIFT-1);
11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     deltaPe += (peData->peChannelData[ch].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT);
11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              } /* sfbGrp loop */
11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              peData->pe += deltaPe;
11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              peData->peChannelData[ch].pe += deltaPe;
11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              newGlobalPe += deltaPe;
11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* stop if enough has been saved */
11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (peData->pe <= desiredPe) {
11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                goto bail;
11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* sfb > 0 */
11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( (ch==(cm->elInfo[elementId].nChannelsInEl-1)) && noReduction ) {
11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              goto bail;
11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         } /* ch loop */
11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } while ( peData->pe > desiredPe);
11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* != ID_DSE */
11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   } /* element loop */
11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* update global PE */
11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   *redPeGlobal = newGlobalPe;
11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_allowMoreHoles
12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  if the desired pe can not be reached, some more scalefactor
12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  bands have to be quantized to zero
12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_allowMoreHoles(CHANNEL_MAPPING* cm,
12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           QC_OUT_ELEMENT*  qcElement[(6)],
12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           PSY_OUT_ELEMENT* psyOutElement[(6)],
12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           ATS_ELEMENT*     AdjThrStateElement[(6)],
12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           UCHAR            ahFlag[(6)][(2)][MAX_GROUPED_SFB],
12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           const INT        desiredPe,
12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           const INT        currentPe,
12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           const int        processElements,
12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           const int        elementOffset)
12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT elementId;
12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT nElements = elementOffset+processElements;
12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT actPe = currentPe;
12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (actPe <= desiredPe) {
12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return; /* nothing to do */
12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (elementId = elementOffset;elementId<nElements;elementId++) {
12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (cm->elInfo[elementId].elType != ID_DSE) {
12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT ch, sfb, sfbGrp;
12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PE_DATA *peData = &qcElement[elementId]->peData;
12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      const INT nChannels = cm->elInfo[elementId].nChannelsInEl;
12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL*  qcOutChannel[(2)] = {NULL};
12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PSY_OUT_CHANNEL* psyOutChannel[(2)] = {NULL};
12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch=0; ch<nChannels; ch++) {
12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* init pointers */
12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        qcOutChannel[ch] = qcElement[elementId]->qcOutChannel[ch];
12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        psyOutChannel[ch] = psyOutElement[elementId]->psyOutChannel[ch];
12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for(sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+= psyOutChannel[ch]->sfbPerGroup) {
12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (sfb=psyOutChannel[ch]->maxSfbPerGroup; sfb<psyOutChannel[ch]->sfbPerGroup; sfb++) {
12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            peData->peChannelData[ch].sfbPe[sfbGrp+sfb] = 0;
12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* for MS allow hole in the channel with less energy */
12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( nChannels==2 && psyOutChannel[0]->lastWindowSequence==psyOutChannel[1]->lastWindowSequence ) {
12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfb=0; sfb<psyOutChannel[0]->maxSfbPerGroup; sfb++) {
12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for(sfbGrp=0; sfbGrp < psyOutChannel[0]->sfbCnt; sfbGrp+=psyOutChannel[0]->sfbPerGroup) {
12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (psyOutElement[elementId]->toolsInfo.msMask[sfbGrp+sfb]) {
12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              FIXP_DBL EnergyLd_L = qcOutChannel[0]->sfbWeightedEnergyLdData[sfbGrp+sfb];
12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              FIXP_DBL EnergyLd_R = qcOutChannel[1]->sfbWeightedEnergyLdData[sfbGrp+sfb];
12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* allow hole in side channel ? */
12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if ( (ahFlag[elementId][1][sfbGrp+sfb] != NO_AH) &&
12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   (((FL2FXCONST_DBL(-0.02065512648f)>>1) + (qcOutChannel[0]->sfbMinSnrLdData[sfbGrp+sfb]>>1))
12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        > ((EnergyLd_R>>1) - (EnergyLd_L>>1))) )
12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  ahFlag[elementId][1][sfbGrp+sfb] = NO_AH;
12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChannel[1]->sfbThresholdLdData[sfbGrp+sfb] = FL2FXCONST_DBL(0.015625f) + EnergyLd_R;
12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  actPe -= peData->peChannelData[1].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT;
12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* allow hole in mid channel ? */
12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              else if ( (ahFlag[elementId][0][sfbGrp+sfb] != NO_AH) &&
12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        (((FL2FXCONST_DBL(-0.02065512648f)>>1) + (qcOutChannel[1]->sfbMinSnrLdData[sfbGrp+sfb]>>1))
12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             > ((EnergyLd_L>>1) - (EnergyLd_R>>1))) )
12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  ahFlag[elementId][0][sfbGrp+sfb] = NO_AH;
12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChannel[0]->sfbThresholdLdData[sfbGrp+sfb] = FL2FXCONST_DBL(0.015625f) + EnergyLd_L;
12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  actPe -= peData->peChannelData[0].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT;
12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              } /* if (ahFlag) */
12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* if MS */
12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          } /* sfbGrp */
12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (actPe <= desiredPe) {
12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return; /* stop if enough has been saved */
12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } /* sfb */
12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* MS possible ? */
12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* more holes necessary? subsequently erase bands
12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         starting with low energies */
12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT startSfb[2];
12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL avgEnLD64,minEnLD64;
12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT ahCnt;
12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL ahCntLD64;
12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT enIdx;
12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL enLD64[4];
12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL avgEn;
12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* do not go below startSfb */
12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch=0; ch<nChannels; ch++) {
12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (psyOutChannel[ch]->lastWindowSequence != SHORT_WINDOW)
12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          startSfb[ch] = AdjThrStateElement[elementId]->ahParam.startSfbL;
12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else
12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          startSfb[ch] = AdjThrStateElement[elementId]->ahParam.startSfbS;
12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* calc avg and min energies of bands that avoid holes */
13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      avgEn = FL2FXCONST_DBL(0.0f);
13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      minEnLD64 = FL2FXCONST_DBL(0.0f);
13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ahCnt = 0;
13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch=0; ch<nChannels; ch++) {
13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfbGrp=0;
13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfb=startSfb[ch];
13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        do {
13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ((ahFlag[elementId][ch][sfbGrp+sfb]!=NO_AH) &&
13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                (qcOutChannel[ch]->sfbWeightedEnergyLdData[sfbGrp+sfb] > qcOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb])){
13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              minEnLD64 = fixMin(minEnLD64,qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb]);
13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              avgEn += qcOutChannel[ch]->sfbEnergy[sfbGrp+sfb] >> 6;
13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              ahCnt++;
13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfbGrp += psyOutChannel[ch]->sfbPerGroup;
13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfb=0;
13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } while (sfbGrp < psyOutChannel[ch]->sfbCnt);
13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (avgEn == FL2FXCONST_DBL(0.0f)) || (ahCnt == 0) ) {
13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        avgEnLD64 = FL2FXCONST_DBL(0.0f);
13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        avgEnLD64 = CalcLdData(avgEn);
13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ahCntLD64 = CalcLdInt(ahCnt);
13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        avgEnLD64 = avgEnLD64 + FL2FXCONST_DBL(0.09375f) - ahCntLD64; /* compensate shift with 6 */
13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* calc some energy borders between minEn and avgEn */
13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* for (enIdx=0; enIdx<4; enIdx++) */
13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* en[enIdx] = minEn * (float)FDKpow(avgEn/(minEn+FLT_MIN), (2*enIdx+1)/7.0f); */
13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      enLD64[0] = minEnLD64 + fMult((avgEnLD64-minEnLD64),FL2FXCONST_DBL(0.14285714285f));
13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      enLD64[1] = minEnLD64 + fMult((avgEnLD64-minEnLD64),FL2FXCONST_DBL(0.42857142857f));
13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      enLD64[2] = minEnLD64 + fMult((avgEnLD64-minEnLD64),FL2FXCONST_DBL(0.71428571428f));
13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      enLD64[3] = minEnLD64 + (avgEnLD64-minEnLD64);
13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (enIdx=0; enIdx<4; enIdx++) {
13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT noReduction = 1;
13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT maxSfbPerGroup[2];
13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT sfbCnt[2];
13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT sfbPerGroup[2];
13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          maxSfbPerGroup[ch] = psyOutElement[elementId]->psyOutChannel[ch]->maxSfbPerGroup-1;
13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfbCnt[ch]         = psyOutElement[elementId]->psyOutChannel[ch]->sfbCnt;
13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfbPerGroup[ch]    = psyOutElement[elementId]->psyOutChannel[ch]->sfbPerGroup;
13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        do {
13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          noReduction = 1;
13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT sfb, sfbGrp;
13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* start with lowest energy border at highest sfb */
13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (maxSfbPerGroup[ch]>=startSfb[ch]) {  /* sfb in next channel */
13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfb = maxSfbPerGroup[ch]--;
13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              noReduction = 0;
13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              for (sfbGrp = 0; sfbGrp < sfbCnt[ch]; sfbGrp += sfbPerGroup[ch]) {
13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* sfb energy below border ? */
13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (ahFlag[elementId][ch][sfbGrp+sfb] != NO_AH && qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb] < enLD64[enIdx]) {
13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* allow hole */
13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  ahFlag[elementId][ch][sfbGrp+sfb] = NO_AH;
13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb] = FL2FXCONST_DBL(0.015625f) + qcOutChannel[ch]->sfbWeightedEnergyLdData[sfbGrp+sfb];
13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  actPe -= peData->peChannelData[ch].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT;
13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              } /* sfbGrp  */
13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (actPe <= desiredPe) {
13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                return; /* stop if enough has been saved */
13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* sfb > 0 */
13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          } /* ch loop */
13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } while( (noReduction == 0) && (actPe > desiredPe) );
13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (actPe <= desiredPe) {
13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return; /* stop if enough has been saved */
13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* enIdx loop */
13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* EOF DSE-suppression */
13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* EOF for all elements... */
13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* reset avoid hole flags from AH_ACTIVE to AH_INACTIVE  */
14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_resetAHFlags( UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const int nChannels,
14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          PSY_OUT_CHANNEL  *psyOutChannel[(2)])
14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int ch, sfb, sfbGrp;
14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(ch=0; ch<nChannels; ch++) {
14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( ahFlag[ch][sfbGrp+sfb] == AH_ACTIVE) {
14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ahFlag[ch][sfbGrp+sfb] = AH_INACTIVE;
14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL CalcRedValPower(FIXP_DBL num,
14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                FIXP_DBL denum,
14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT*     scaling )
14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL value = FL2FXCONST_DBL(0.f);
14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (num>=FL2FXCONST_DBL(0.f)) {
14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      value = fDivNorm( num, denum, scaling);
14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      value = -fDivNorm( -num, denum, scaling);
14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    value = f2Pow(value, *scaling, scaling);
14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *scaling = DFRACT_BITS-1-*scaling;
14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return value;
14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_adaptThresholdsToPe
14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  two guesses for the reduction value and one final correction of the thresholds
14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_adaptThresholdsToPe(CHANNEL_MAPPING*  cm,
14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                ATS_ELEMENT*      AdjThrStateElement[(6)],
14432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                QC_OUT_ELEMENT*   qcElement[(6)],
14442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                PSY_OUT_ELEMENT*  psyOutElement[(6)],
14452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT         desiredPe,
14462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT         processElements,
14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT         elementOffset)
14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL redValue[(6)];
14502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   SCHAR    redValScaling[(6)];
14512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   UCHAR    pAhFlag[(6)][(2)][MAX_GROUPED_SFB];
14522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL pThrExp[(6)][(2)][MAX_GROUPED_SFB];
14532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   int iter;
14542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT constPartGlobal, noRedPeGlobal, nActiveLinesGlobal, redPeGlobal;
14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   constPartGlobal = noRedPeGlobal = nActiveLinesGlobal = redPeGlobal = 0;
14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   int elementId;
14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   int nElements = elementOffset+processElements;
14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if(nElements > cm->nElements) {
14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     nElements = cm->nElements;
14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ------------------------------------------------------- */
14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Part I: Initialize data structures and variables... */
14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ------------------------------------------------------- */
14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for (elementId = elementOffset;elementId<nElements;elementId++) {
14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT nChannels = cm->elInfo[elementId].nChannelsInEl;
14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       PE_DATA *peData    = &qcElement[elementId]->peData;
14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* thresholds to the power of redExp */
14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_calcThreshExp(pThrExp[elementId], qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, nChannels);
14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* lower the minSnr requirements for low energies compared to the average
14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          energy in this frame */
14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_adaptMinSnr(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, &AdjThrStateElement[elementId]->minSnrAdaptParam, nChannels);
14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */
14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_initAvoidHoleFlag(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, pAhFlag[elementId], &psyOutElement[elementId]->toolsInfo, nChannels, peData, &AdjThrStateElement[elementId]->ahParam);
14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* sum up */
14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       constPartGlobal    += peData->constPart;
14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       noRedPeGlobal      += peData->pe;
14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       nActiveLinesGlobal += fixMax((INT)peData->nActiveLines, 1);
14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF DSE-suppression */
14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   } /* EOF for all elements... */
14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ----------------------------------------------------------------------- */
14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Part II: Calculate bit consumption of initial bit constraints setup */
14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ----------------------------------------------------------------------- */
14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for (elementId = elementOffset;elementId<nElements;elementId++) {
14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /*
14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       redVal = ( 2 ^ ( (constPartGlobal-desiredPe) / (invRedExp*nActiveLinesGlobal) )
14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                - 2 ^ ( (constPartGlobal-noRedPeGlobal) / (invRedExp*nActiveLinesGlobal) ) )
15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       */
15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT nChannels = cm->elInfo[elementId].nChannelsInEl;
15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       PE_DATA *peData    = &qcElement[elementId]->peData;
15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* first guess of reduction value */
15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       int scale0=0, scale1=0;
15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FIXP_DBL tmp0 = CalcRedValPower( constPartGlobal-desiredPe, 4*nActiveLinesGlobal, &scale0 );
15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FIXP_DBL tmp1 = CalcRedValPower( constPartGlobal-noRedPeGlobal, 4*nActiveLinesGlobal, &scale1 );
15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       int scalMin = FDKmin(scale0, scale1)-1;
15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       redValue[elementId]  = scaleValue(tmp0,(scalMin-scale0)) - scaleValue(tmp1,(scalMin-scale1));
15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       redValScaling[elementId] = scalMin;
15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* reduce thresholds */
15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_reduceThresholdsCBR(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, pAhFlag[elementId], pThrExp[elementId], nChannels, redValue[elementId], redValScaling[elementId]);
15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* pe after first guess */
15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_calcPe(psyOutElement[elementId]->psyOutChannel, qcElement[elementId]->qcOutChannel, peData, nChannels);
15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       redPeGlobal += peData->pe;
15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF DSE-suppression */
15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   } /* EOF for all elements... */
15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* -------------------------------------------------- */
15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Part III: Iterate until bit constraints are met */
15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* -------------------------------------------------- */
15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   iter = 0;
15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   while ((fixp_abs(redPeGlobal - desiredPe) > fMultI(FL2FXCONST_DBL(0.05f),desiredPe)) && (iter < 1)) {
15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     INT desiredPeNoAHGlobal;
15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     INT redPeNoAHGlobal = 0;
15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     INT constPartNoAHGlobal = 0;
15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     INT nActiveLinesNoAHGlobal = 0;
15362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for (elementId = elementOffset;elementId<nElements;elementId++) {
15382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (cm->elInfo[elementId].elType != ID_DSE) {
15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         INT redPeNoAH, constPartNoAH, nActiveLinesNoAH;
15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         INT nChannels = cm->elInfo[elementId].nChannelsInEl;
15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         PE_DATA *peData    = &qcElement[elementId]->peData;
15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* pe for bands where avoid hole is inactive */
15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FDKaacEnc_FDKaacEnc_calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH,
15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    peData, pAhFlag[elementId], psyOutElement[elementId]->psyOutChannel, nChannels);
15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         redPeNoAHGlobal += redPeNoAH;
15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         constPartNoAHGlobal += constPartNoAH;
15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         nActiveLinesNoAHGlobal += nActiveLinesNoAH;
15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } /* EOF DSE-suppression */
15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF for all elements... */
15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* Calculate new redVal ... */
15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if(desiredPe < redPeGlobal) {
15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* new desired pe without bands where avoid hole is active */
15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       desiredPeNoAHGlobal = desiredPe - (redPeGlobal - redPeNoAHGlobal);
15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* limit desiredPeNoAH to positive values, as the PE can not become negative */
15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       desiredPeNoAHGlobal = FDKmax(0,desiredPeNoAHGlobal);
15622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* second guess (only if there are bands left where avoid hole is inactive)*/
15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (nActiveLinesNoAHGlobal > 0) {
15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for (elementId = elementOffset;elementId<nElements;elementId++) {
15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           if (cm->elInfo[elementId].elType != ID_DSE) {
15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             /*
15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             redVal += ( 2 ^ ( (constPartNoAHGlobal-desiredPeNoAHGlobal) / (invRedExp*nActiveLinesNoAHGlobal) )
15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       - 2 ^ ( (constPartNoAHGlobal-redPeNoAHGlobal) / (invRedExp*nActiveLinesNoAHGlobal) ) )
15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             */
15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             int scale0 = 0;
15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             int scale1 = 0;
15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL tmp0 = CalcRedValPower( constPartNoAHGlobal-desiredPeNoAHGlobal, 4*nActiveLinesNoAHGlobal, &scale0 );
15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL tmp1 = CalcRedValPower( constPartNoAHGlobal-redPeNoAHGlobal, 4*nActiveLinesNoAHGlobal, &scale1 );
15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             int scalMin = FDKmin(scale0, scale1)-1;
15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             tmp0 = scaleValue(tmp0,(scalMin-scale0)) - scaleValue(tmp1,(scalMin-scale1));
15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             scale0 = scalMin;
15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             /* old reduction value */
15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             tmp1 = redValue[elementId];
15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             scale1 = redValScaling[elementId];
15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             scalMin = fixMin(scale0,scale1)-1;
15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             /* sum up old and new reduction value */
15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             redValue[elementId] = scaleValue(tmp0,(scalMin-scale0)) + scaleValue(tmp1,(scalMin-scale1));
15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             redValScaling[elementId] = scalMin;
15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           } /* EOF DSE-suppression */
15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         } /* EOF for all elements... */
15942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } /* nActiveLinesNoAHGlobal > 0 */
15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     else {
15972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* desiredPe >= redPeGlobal */
15982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (elementId = elementOffset;elementId<nElements;elementId++) {
15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (cm->elInfo[elementId].elType != ID_DSE) {
16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT redVal_scale = 0;
16022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FIXP_DBL tmp = fDivNorm((FIXP_DBL)redPeGlobal, (FIXP_DBL)desiredPe, &redVal_scale);
16032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* redVal *= redPeGlobal/desiredPe; */
16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            redValue[elementId] = fMult(redValue[elementId], tmp);
16062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            redValScaling[elementId] -= redVal_scale;
16072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDKaacEnc_resetAHFlags(pAhFlag[elementId], cm->elInfo[elementId].nChannelsInEl, psyOutElement[elementId]->psyOutChannel);
16092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          } /* EOF DSE-suppression */
16102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } /* EOF for all elements... */
16112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
16122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     redPeGlobal = 0;
16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* Calculate new redVal's PE... */
16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for (elementId = elementOffset;elementId<nElements;elementId++) {
16162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (cm->elInfo[elementId].elType != ID_DSE) {
16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         INT nChannels = cm->elInfo[elementId].nChannelsInEl;
16192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         PE_DATA *peData    = &qcElement[elementId]->peData;
16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* reduce thresholds */
16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FDKaacEnc_reduceThresholdsCBR(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, pAhFlag[elementId], pThrExp[elementId], nChannels, redValue[elementId], redValScaling[elementId]);
16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* pe after second guess */
16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FDKaacEnc_calcPe(psyOutElement[elementId]->psyOutChannel, qcElement[elementId]->qcOutChannel, peData, nChannels);
16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         redPeGlobal += peData->pe;
16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } /* EOF DSE-suppression */
16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF for all elements... */
16302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     iter++;
16322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   } /* EOF while */
16332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ------------------------------------------------------- */
16362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Part IV: if still required, further reduce constraints  */
16372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ------------------------------------------------------- */
16382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /*                  1.0*        1.15*       1.20*
16392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *               desiredPe   desiredPe   desiredPe
16402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *                   |           |           |
16412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * ...XXXXXXXXXXXXXXXXXXXXXXXXXXX|           |
16422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *                   |           |           |XXXXXXXXXXX...
16432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *                   |           |XXXXXXXXXXX|
16442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *            --- A ---          | --- B --- | --- C ---
16452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *
16462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * (X): redPeGlobal
16472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * (A): FDKaacEnc_correctThresh()
16482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * (B): FDKaacEnc_allowMoreHoles()
16492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * (C): FDKaacEnc_reduceMinSnr()
16502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   */
16512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* correct thresholds to get closer to the desired pe */
16532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if ( redPeGlobal > desiredPe ) {
16542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     FDKaacEnc_correctThresh(cm, qcElement, psyOutElement, pAhFlag, pThrExp, redValue, redValScaling,
16552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   desiredPe - redPeGlobal, processElements, elementOffset);
16562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* update PE */
16582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     redPeGlobal = 0;
16592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for(elementId=elementOffset;elementId<nElements;elementId++) {
16602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (cm->elInfo[elementId].elType != ID_DSE) {
16612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         INT nChannels = cm->elInfo[elementId].nChannelsInEl;
16632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         PE_DATA *peData    = &qcElement[elementId]->peData;
16642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* pe after correctThresh */
16662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FDKaacEnc_calcPe(psyOutElement[elementId]->psyOutChannel, qcElement[elementId]->qcOutChannel, peData, nChannels);
16672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         redPeGlobal += peData->pe;
16682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } /* EOF DSE-suppression */
16702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF for all elements... */
16712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
16722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if ( redPeGlobal > desiredPe ) {
16742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* reduce pe by reducing minSnr requirements */
16752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     FDKaacEnc_reduceMinSnr(cm, qcElement, psyOutElement, pAhFlag,
16762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            (fMultI(FL2FXCONST_DBL(0.15f),desiredPe) + desiredPe),
16772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            &redPeGlobal, processElements, elementOffset);
16782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* reduce pe by allowing additional spectral holes */
16802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     FDKaacEnc_allowMoreHoles(cm, qcElement, psyOutElement, AdjThrStateElement, pAhFlag,
16812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    desiredPe, redPeGlobal, processElements, elementOffset);
16822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
16832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
16852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* similar to FDKaacEnc_adaptThresholdsToPe(), for  VBR-mode */
16882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_AdaptThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)],
16892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               PSY_OUT_CHANNEL* psyOutChannel[(2)],
16902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               ATS_ELEMENT* AdjThrStateElement,
16912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               struct TOOLSINFO *toolsInfo,
16922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               PE_DATA *peData,
16932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               const INT nChannels)
16942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
16952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   UCHAR    pAhFlag[(2)][MAX_GROUPED_SFB];
16962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL pThrExp[(2)][MAX_GROUPED_SFB];
16972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* thresholds to the power of redExp */
16992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FDKaacEnc_calcThreshExp(pThrExp, qcOutChannel, psyOutChannel, nChannels);
17002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* lower the minSnr requirements for low energies compared to the average
17022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      energy in this frame */
17032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FDKaacEnc_adaptMinSnr(qcOutChannel, psyOutChannel, &AdjThrStateElement->minSnrAdaptParam, nChannels);
17042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */
17062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FDKaacEnc_initAvoidHoleFlag(qcOutChannel, psyOutChannel, pAhFlag, toolsInfo,
17072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     nChannels, peData, &AdjThrStateElement->ahParam);
17082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* reduce thresholds */
17102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FDKaacEnc_reduceThresholdsVBR(qcOutChannel, psyOutChannel, pAhFlag, pThrExp, nChannels,
17112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       AdjThrStateElement->vbrQualFactor,
17122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       &AdjThrStateElement->chaosMeasureOld);
17132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
17152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
17182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  functionname: FDKaacEnc_calcBitSave
17202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  description:  Calculates percentage of bit save, see figure below
17212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  returns:
17222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  input:        parameters and bitres-fullness
17232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  output:       percentage of bit save
17242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
17262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
17272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitsave
17282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    maxBitSave(%)|   clipLow
17292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |---\
17302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |    \
17312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |     \
17322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |      \
17332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |       \
17342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |--------\--------------> bitres
17352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |         \
17362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    minBitSave(%)|          \------------
17372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          clipHigh      maxBitres
17382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
17392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL FDKaacEnc_calcBitSave(FIXP_DBL fillLevel,
17402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL clipLow,
17412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL clipHigh,
17422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL minBitSave,
17432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL maxBitSave,
17442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL bitsave_slope)
17452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
17462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitsave;
17472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fillLevel = fixMax(fillLevel, clipLow);
17492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fillLevel = fixMin(fillLevel, clipHigh);
17502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitsave = maxBitSave - fMult((fillLevel-clipLow), bitsave_slope);
17522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return (bitsave);
17542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
17552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
17572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  functionname: FDKaacEnc_calcBitSpend
17592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  description:  Calculates percentage of bit spend, see figure below
17602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  returns:
17612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  input:        parameters and bitres-fullness
17622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  output:       percentage of bit spend
17632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
17652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
17662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              bitspend      clipHigh
17672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   maxBitSpend(%)|          /-----------maxBitres
17682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |         /
17692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |        /
17702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |       /
17712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |      /
17722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |     /
17732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |----/-----------------> bitres
17742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |   /
17752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   minBitSpend(%)|--/
17762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   clipLow
17772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
17782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL FDKaacEnc_calcBitSpend(FIXP_DBL fillLevel,
17792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL clipLow,
17802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL clipHigh,
17812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL minBitSpend,
17822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL maxBitSpend,
17832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL bitspend_slope)
17842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
17852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitspend;
17862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fillLevel = fixMax(fillLevel, clipLow);
17882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fillLevel = fixMin(fillLevel, clipHigh);
17892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitspend = minBitSpend + fMult(fillLevel-clipLow, bitspend_slope);
17912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return (bitspend);
17932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
17942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
17972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  functionname: FDKaacEnc_adjustPeMinMax()
17992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  description:  adjusts peMin and peMax parameters over time
18002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  returns:
18012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  input:        current pe, peMin, peMax, bitres size
18022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  output:       adjusted peMin/peMax
18032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
18052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_adjustPeMinMax(const INT currPe,
18062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT      *peMin,
18072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT      *peMax)
18082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
18092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL minFacHi = FL2FXCONST_DBL(0.3f), maxFacHi = (FIXP_DBL)MAXVAL_DBL, minFacLo = FL2FXCONST_DBL(0.14f), maxFacLo = FL2FXCONST_DBL(0.07f);
18102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT diff;
18112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT minDiff_fix = fMultI(FL2FXCONST_DBL(0.1666666667f), currPe);
18132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (currPe > *peMax)
18152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
18162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        diff = (currPe-*peMax) ;
18172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMin += fMultI(minFacHi,diff);
18182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMax += fMultI(maxFacHi,diff);
18192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
18202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (currPe < *peMin)
18212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
18222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        diff = (*peMin-currPe) ;
18232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMin -= fMultI(minFacLo,diff);
18242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMax -= fMultI(maxFacLo,diff);
18252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
18262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
18272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
18282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMin += fMultI(minFacHi, (currPe - *peMin));
18292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMax -= fMultI(maxFacLo, (*peMax - currPe));
18302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
18312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((*peMax - *peMin) < minDiff_fix)
18332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
18342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT peMax_fix = *peMax, peMin_fix = *peMin;
18352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FIXP_DBL partLo_fix, partHi_fix;
18362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        partLo_fix = (FIXP_DBL)fixMax(0, currPe - peMin_fix);
18382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        partHi_fix = (FIXP_DBL)fixMax(0, peMax_fix - currPe);
18392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        peMax_fix = (INT)(currPe + fMultI(fDivNorm(partHi_fix, (partLo_fix+partHi_fix)), minDiff_fix));
18412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        peMin_fix = (INT)(currPe - fMultI(fDivNorm(partLo_fix, (partLo_fix+partHi_fix)), minDiff_fix));
18422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        peMin_fix = fixMax(0, peMin_fix);
18432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMax = peMax_fix;
18452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMin = peMin_fix;
18462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
18472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
18482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
18522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  functionname: BitresCalcBitFac
18542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  description:  calculates factor of spending bits for one frame
18552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  1.0 : take all frame dynpart bits
18562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  >1.0 : take all frame dynpart bits + bitres
18572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <1.0 : put bits in bitreservoir
18582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  returns:      BitFac
18592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  input:        bitres-fullness, pe, blockType, parameter-settings
18602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  output:
18612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
18632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
18642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     bitfac(%)            pemax
18652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   bitspend(%)   |          /-----------maxBitres
18662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |         /
18672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |        /
18682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |       /
18692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |      /
18702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |     /
18712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |----/-----------------> pe
18722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |   /
18732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   bitsave(%)    |--/
18742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    pemin
18752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
18762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL FDKaacEnc_bitresCalcBitFac(const INT       bitresBits,
18782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT        maxBitresBits,
18792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT        pe,
18802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT        lastWindowSequence,
18812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT        avgBits,
18822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL   maxBitFac,
18832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ADJ_THR_STATE   *AdjThr,
18842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ATS_ELEMENT     *adjThrChan)
18852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
18862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    BRES_PARAM *bresParam;
18872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT pex;
18882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT qmin, qbr, qbres, qmbr;
18902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitSave, bitSpend;
18912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitresFac_fix, tmp_cst, tmp_fix;
18932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL pe_pers, bits_ratio, maxBrVal;
18942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitsave_slope, bitspend_slope, maxBitFac_tmp;
18952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL fillLevel_fix = (FIXP_DBL)0x7fffffff;
18962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL UNITY = (FIXP_DBL)0x7fffffff;
18972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL POINT7 = (FIXP_DBL)0x5999999A;
18982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (maxBitresBits > bitresBits) {
19002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      fillLevel_fix = fDivNorm(bitresBits, maxBitresBits);
19012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
19022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (lastWindowSequence != SHORT_WINDOW)
19042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
19052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam = &(AdjThr->bresParamLong);
19062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitsave_slope = (FIXP_DBL)0x3BBBBBBC;
19072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitspend_slope = (FIXP_DBL)0x55555555;
19082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
19092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
19102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
19112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam = &(AdjThr->bresParamShort);
19122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitsave_slope = (FIXP_DBL)0x2E8BA2E9;
19132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitspend_slope = (FIXP_DBL)0x7fffffff;
19142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
19152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pex = fixMax(pe, adjThrChan->peMin);
19172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pex = fixMin(pex, adjThrChan->peMax);
19182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitSave = FDKaacEnc_calcBitSave(fillLevel_fix,
19202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam->clipSaveLow, bresParam->clipSaveHigh,
19212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam->minBitSave, bresParam->maxBitSave, bitsave_slope);
19222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitSpend = FDKaacEnc_calcBitSpend(fillLevel_fix,
19242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam->clipSpendLow, bresParam->clipSpendHigh,
19252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam->minBitSpend, bresParam->maxBitSpend, bitspend_slope);
19262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pe_pers = fDivNorm(pex - adjThrChan->peMin, adjThrChan->peMax - adjThrChan->peMin);
19282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tmp_fix = fMult(((FIXP_DBL)bitSpend + (FIXP_DBL)bitSave), pe_pers);
19292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitresFac_fix = (UNITY>>1) - ((FIXP_DBL)bitSave>>1) + (tmp_fix>>1); qbres = (DFRACT_BITS-2);
19302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* (float)bitresBits/(float)avgBits */
19322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bits_ratio = fDivNorm(bitresBits, avgBits, &qbr);
19332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qbr = DFRACT_BITS-1-qbr;
19342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Add 0.7 in q31 to bits_ratio in qbr */
19362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* 0.7f + (float)bitresBits/(float)avgBits */
19372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qmin = fixMin(qbr, (DFRACT_BITS-1));
19382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bits_ratio = bits_ratio >> (qbr - qmin);
19392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tmp_cst = POINT7 >> ((DFRACT_BITS-1) - qmin);
19402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    maxBrVal = (bits_ratio>>1) + (tmp_cst>>1); qmbr = qmin - 1;
19412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* bitresFac_fix = fixMin(bitresFac_fix, 0.7 + bitresBits/avgBits); */
19432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitresFac_fix = bitresFac_fix >> (qbres - qmbr); qbres = qmbr;
19442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitresFac_fix = fixMin(bitresFac_fix, maxBrVal);
19452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Compare with maxBitFac */
19472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qmin = fixMin(Q_BITFAC, qbres);
19482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitresFac_fix = bitresFac_fix >> (qbres - qmin);
19492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    maxBitFac_tmp = maxBitFac >> (Q_BITFAC - qmin);
19502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if(maxBitFac_tmp < bitresFac_fix)
19512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
19522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitresFac_fix = maxBitFac;
19532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
19542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
19552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
19562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if(qmin < Q_BITFAC)
19572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
19582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            bitresFac_fix = bitresFac_fix << (Q_BITFAC-qmin);
19592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else
19612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
19622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            bitresFac_fix = bitresFac_fix >> (qmin-Q_BITFAC);
19632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
19652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKaacEnc_adjustPeMinMax(pe, &adjThrChan->peMin, &adjThrChan->peMax);
19672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return bitresFac_fix;
19692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
19702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
19732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_AdjThrNew
19742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  allocate ADJ_THR_STATE
19752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
19762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT FDKaacEnc_AdjThrNew(ADJ_THR_STATE** phAdjThr,
19772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        INT             nElements)
19782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
19792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT err = 0;
19802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i;
19812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ADJ_THR_STATE* hAdjThr = GetRam_aacEnc_AdjustThreshold();
19822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAdjThr==NULL) {
19832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = 1;
19842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
19852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
19862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<nElements; i++) {
19882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAdjThr->adjThrStateElem[i] =  GetRam_aacEnc_AdjThrStateElement(i);
19892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAdjThr->adjThrStateElem[i]==NULL) {
19902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = 1;
19912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          goto bail;
19922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
19942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
19962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *phAdjThr = hAdjThr;
19972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
19982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
19992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
20022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_AdjThrInit
20032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  initialize ADJ_THR_STATE
20042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
20052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_AdjThrInit(ADJ_THR_STATE   *hAdjThr,
20062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT       meanPe,
20072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ELEMENT_BITS    *elBits[(6)],
20082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT             nElements,
20092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL        vbrQualFactor)
20102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
20112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i;
20122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL POINT8 = FL2FXCONST_DBL(0.8f);
20142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL POINT6 = FL2FXCONST_DBL(0.6f);
20152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* common for all elements: */
20172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* parameters for bitres control */
20182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamLong.clipSaveLow   = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */
20192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamLong.clipSaveHigh  = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */
20202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamLong.minBitSave    = (FIXP_DBL)0xf999999a; /* FL2FXCONST_DBL(-0.05f); */
20212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamLong.maxBitSave    = (FIXP_DBL)0x26666666; /* FL2FXCONST_DBL(0.3f); */
20222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamLong.clipSpendLow  = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */
20232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamLong.clipSpendHigh = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */
20242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamLong.minBitSpend   = (FIXP_DBL)0xf3333333; /* FL2FXCONST_DBL(-0.10f); */
20252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamLong.maxBitSpend   = (FIXP_DBL)0x33333333; /* FL2FXCONST_DBL(0.4f); */
20262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamShort.clipSaveLow   = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
20282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamShort.clipSaveHigh  = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */
20292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamShort.minBitSave    = (FIXP_DBL)0x00000000; /* FL2FXCONST_DBL(0.0f); */
20302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamShort.maxBitSave    = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
20312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamShort.clipSpendLow  = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
20322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamShort.clipSpendHigh = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */
20332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamShort.minBitSpend   = (FIXP_DBL)0xf9999998; /* FL2FXCONST_DBL(-0.05f); */
20342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAdjThr->bresParamShort.maxBitSpend   = (FIXP_DBL)0x40000000; /* FL2FXCONST_DBL(0.5f); */
20352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* specific for each element: */
20372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<nElements; i++) {
20382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ATS_ELEMENT* atsElem = hAdjThr->adjThrStateElem[i];
20392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        MINSNR_ADAPT_PARAM *msaParam = &atsElem->minSnrAdaptParam;
20402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT chBitrate = elBits[i]->chBitrateEl;
20412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* parameters for bitres control */
20432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->peMin = fMultI(POINT8, meanPe) >> 1;
20442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->peMax = fMultI(POINT6, meanPe);
20452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* for use in FDKaacEnc_reduceThresholdsVBR */
20472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->chaosMeasureOld = FL2FXCONST_DBL(0.3f);
20482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* additional pe offset to correct pe2bits for low bitrates */
20502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->peOffset = 0;
20512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* vbr initialisation */
20532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->vbrQualFactor = vbrQualFactor;
20542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (chBitrate < 32000)
20552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
20562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            atsElem->peOffset = fixMax(50, 100-fMultI((FIXP_DBL)0x666667, chBitrate));
20572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
20582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* avoid hole parameters */
20602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (chBitrate > 20000) {
20612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            atsElem->ahParam.modifyMinSnr = TRUE;
20622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            atsElem->ahParam.startSfbL = 15;
20632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            atsElem->ahParam.startSfbS = 3;
20642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
20652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
20662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            atsElem->ahParam.modifyMinSnr = FALSE;
20672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            atsElem->ahParam.startSfbL = 0;
20682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            atsElem->ahParam.startSfbS = 0;
20692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
20702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    		  /* minSnr adaptation */
20722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        msaParam->maxRed = FL2FXCONST_DBL(0.00390625f); /* 0.25f/64.0f */
20732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* start adaptation of minSnr for avgEn/sfbEn > startRatio */
20742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        msaParam->startRatio = FL2FXCONST_DBL(0.05190512648f); /* ld64(10.0f) */
20752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* maximum minSnr reduction to minSnr^maxRed is reached for
20762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           avgEn/sfbEn >= maxRatio */
20772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* msaParam->maxRatio = 1000.0f; */
20782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*msaParam->redRatioFac = ((float)1.0f - msaParam->maxRed) / ((float)10.0f*log10(msaParam->startRatio/msaParam->maxRatio)/log10(2.0f)*(float)0.3010299956f);*/
20792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        msaParam->redRatioFac = FL2FXCONST_DBL(-0.375f); /* -0.0375f * 10.0f */
20802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*msaParam->redOffs = (float)1.0f - msaParam->redRatioFac * (float)10.0f * log10(msaParam->startRatio)/log10(2.0f) * (float)0.3010299956f;*/
20812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        msaParam->redOffs = FL2FXCONST_DBL(0.021484375); /* 1.375f/64.0f */
20822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* init pe correction */
20842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->peCorrectionFactor_m = FL2FXCONST_DBL(0.5f); /* 1.0 */
20852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->peCorrectionFactor_e = 1;
20862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->dynBitsLast = -1;
20882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->peLast = 0;
20892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* init bits to pe factor */
20912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->bits2PeFactor_m = FL2FXCONST_DBL(1.18f/(1<<(1)));
20922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        atsElem->bits2PeFactor_e = 1;
20932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
20942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
20952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
20982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_FDKaacEnc_calcPeCorrection
20992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  calc desired pe
21002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
21012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_FDKaacEnc_calcPeCorrection(
21022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FIXP_DBL *const           correctionFac_m,
21032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT *const                correctionFac_e,
21042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 peAct,
21052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 peLast,
21062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 bitsLast,
21072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const FIXP_DBL            bits2PeFactor_m,
21082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 bits2PeFactor_e
21092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
21102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
21112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (bitsLast > 0) && (peAct < 1.5f*peLast) && (peAct > 0.7f*peLast) &&
21122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       (FDKaacEnc_bits2pe2(bitsLast, fMult(FL2FXCONST_DBL(1.2f/2.f), bits2PeFactor_m), bits2PeFactor_e+1) > peLast) &&
21132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       (FDKaacEnc_bits2pe2(bitsLast, fMult(FL2FXCONST_DBL(0.65f),    bits2PeFactor_m), bits2PeFactor_e  ) < peLast) )
21142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
21152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL corrFac = *correctionFac_m;
21162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int scaling = 0;
21182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL denum = (FIXP_DBL)FDKaacEnc_bits2pe2(bitsLast, bits2PeFactor_m, bits2PeFactor_e);
21192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL newFac = fDivNorm((FIXP_DBL)peLast, denum, &scaling);
21202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* dead zone, newFac and corrFac are scaled by 0.5 */
21222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((FIXP_DBL)peLast <= denum) { /* ratio <= 1.f */
21232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      newFac = fixMax(scaleValue(fixMin( fMult(FL2FXCONST_DBL(1.1f/2.f), newFac), scaleValue(FL2FXCONST_DBL(  1.f/2.f), -scaling)), scaling), FL2FXCONST_DBL(0.85f/2.f) );
21242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else { /* ratio < 1.f */
21262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     newFac = fixMax( fixMin( scaleValue(fMult(FL2FXCONST_DBL(0.9f/2.f), newFac), scaling), FL2FXCONST_DBL(1.15f/2.f) ), FL2FXCONST_DBL(   1.f/2.f) );
21272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (   ((newFac > FL2FXCONST_DBL(1.f/2.f)) && (corrFac < FL2FXCONST_DBL(1.f/2.f)))
21302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        || ((newFac < FL2FXCONST_DBL(1.f/2.f)) && (corrFac > FL2FXCONST_DBL(1.f/2.f))))
21312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
21322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      corrFac = FL2FXCONST_DBL(1.f/2.f);
21332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* faster adaptation towards 1.0, slower in the other direction */
21362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (corrFac < FL2FXCONST_DBL(1.f/2.f) && newFac < corrFac)
21372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || (corrFac > FL2FXCONST_DBL(1.f/2.f) && newFac > corrFac) )
21382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
21392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      corrFac = fMult(FL2FXCONST_DBL(0.85f), corrFac) + fMult(FL2FXCONST_DBL(0.15f), newFac);
21402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
21422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      corrFac = fMult(FL2FXCONST_DBL(0.7f), corrFac) + fMult(FL2FXCONST_DBL(0.3f), newFac);
21432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    corrFac = fixMax( fixMin( corrFac, FL2FXCONST_DBL(1.15f/2.f) ), FL2FXCONST_DBL(0.85/2.f) );
21462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *correctionFac_m = corrFac;
21482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *correctionFac_e = 1;
21492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
21502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
21512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *correctionFac_m = FL2FXCONST_DBL(1.f/2.f);
21522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *correctionFac_e = 1;
21532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
21542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
21552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_DistributeBits(ADJ_THR_STATE *adjThrState,
21582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ATS_ELEMENT       *AdjThrStateElement,
21592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    PSY_OUT_CHANNEL   *psyOutChannel[(2)],
21602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    PE_DATA           *peData,
21612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT               *grantedPe,
21622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT               *grantedPeCorr,
21632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         nChannels,
21642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         commonWindow,
21652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         grantedDynBits,
21662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         bitresBits,
21672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         maxBitresBits,
21682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL    maxBitFac,
21692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         bitDistributenMode)
21702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
21712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL bitFactor;
21722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT noRedPe = peData->pe;
21732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* prefer short windows for calculation of bitFactor */
21752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT curWindowSequence = LONG_WINDOW;
21762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (nChannels==2) {
21772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((psyOutChannel[0]->lastWindowSequence == SHORT_WINDOW) ||
21782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        (psyOutChannel[1]->lastWindowSequence == SHORT_WINDOW)) {
21792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        curWindowSequence = SHORT_WINDOW;
21802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
21822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
21832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    curWindowSequence = psyOutChannel[0]->lastWindowSequence;
21842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
21852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (grantedDynBits >= 1) {
21872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (bitDistributenMode!=0) {
21882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *grantedPe = FDKaacEnc_bits2pe2(grantedDynBits, AdjThrStateElement->bits2PeFactor_m, AdjThrStateElement->bits2PeFactor_e);
21892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
21912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
21922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* factor dependend on current fill level and pe */
21932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitFactor = FDKaacEnc_bitresCalcBitFac(bitresBits, maxBitresBits, noRedPe,
21942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 curWindowSequence, grantedDynBits, maxBitFac,
21952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 adjThrState,
21962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 AdjThrStateElement
21972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 );
21982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* desired pe for actual frame */
22002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Worst case max of grantedDynBits is = 1024 * 5.27 * 2 */
22012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *grantedPe = FDKaacEnc_bits2pe2(grantedDynBits,
22022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     fMult(bitFactor, AdjThrStateElement->bits2PeFactor_m), AdjThrStateElement->bits2PeFactor_e+(DFRACT_BITS-1-Q_BITFAC)
22032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     );
22042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
22052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
22062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
22072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *grantedPe = 0; /* prevent divsion by 0 */
22082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
22092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* correction of pe value */
22112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
22122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKaacEnc_FDKaacEnc_calcPeCorrection(
22132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       &AdjThrStateElement->peCorrectionFactor_m,
22142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       &AdjThrStateElement->peCorrectionFactor_e,
22152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fixMin(*grantedPe, noRedPe),
22162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AdjThrStateElement->peLast,
22172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AdjThrStateElement->dynBitsLast,
22182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AdjThrStateElement->bits2PeFactor_m,
22192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AdjThrStateElement->bits2PeFactor_e
22202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
22212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
22222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *grantedPeCorr = (INT)(fMult((FIXP_DBL)(*grantedPe<<Q_AVGBITS), AdjThrStateElement->peCorrectionFactor_m) >> (Q_AVGBITS-AdjThrStateElement->peCorrectionFactor_e));
22242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* update last pe */
22262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AdjThrStateElement->peLast = *grantedPe;
22272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AdjThrStateElement->dynBitsLast = -1;
22282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
22302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
22322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_AdjustThresholds
22332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  adjust thresholds
22342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
22352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_AdjustThresholds(ATS_ELEMENT*        AdjThrStateElement[(6)],
22362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                QC_OUT_ELEMENT*     qcElement[(6)],
22372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                QC_OUT*             qcOut,
22382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                PSY_OUT_ELEMENT*    psyOutElement[(6)],
22392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT                 CBRbitrateMode,
22402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                CHANNEL_MAPPING*    cm)
22412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
22422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int i;
22432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (CBRbitrateMode)
22442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
22452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* In case, no bits must be shifted between different elements, */
22462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* an element-wise execution of the pe-dependent threshold- */
22472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* adaption becomes necessary... */
22482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (i=0; i<cm->nElements; i++)
22492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
22502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                ELEMENT_INFO elInfo = cm->elInfo[i];
22512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
22532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    (elInfo.elType == ID_LFE))
22542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                {
22552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* qcElement[i]->grantedPe = 2000; */  /* Use this only for debugging */
22562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    //if (totalGrantedPeCorr < totalNoRedPe) {
22572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    if (qcElement[i]->grantedPe < qcElement[i]->peData.pe)
22582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    {
22592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        /* calc threshold necessary for desired pe */
22602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        FDKaacEnc_adaptThresholdsToPe(cm,
22612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            AdjThrStateElement,
22622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            qcElement,
22632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            psyOutElement,
22642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            qcElement[i]->grantedPeCorr,
22652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            1,         /* Process only 1 element */
22662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            i);        /* Process exactly THIS element */
22672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
22692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
22712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }  /* -end- element loop */
22732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
22742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
22752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i=0; i<cm->nElements; i++)
22762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
22772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ELEMENT_INFO elInfo = cm->elInfo[i];
22782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
22802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                (elInfo.elType == ID_LFE))
22812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
22822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* for VBR-mode */
22832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  FDKaacEnc_AdaptThresholdsVBR(qcElement[i]->qcOutChannel,
22842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            psyOutElement[i]->psyOutChannel,
22852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            AdjThrStateElement[i],
22862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            &psyOutElement[i]->toolsInfo,
22872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            &qcElement[i]->peData,
22882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            cm->elInfo[i].nChannelsInEl);
22892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
22902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }  /* -end- element loop */
22922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
22942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i=0; i<cm->nElements; i++) {
22952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            int ch,sfb,sfbGrp;
22962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* no weighting of threholds and energies for mlout */
22972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* weight energies and thresholds */
22982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (ch=0; ch<cm->elInfo[i].nChannelsInEl; ch++) {
22992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                QC_OUT_CHANNEL* pQcOutCh = qcElement[i]->qcOutChannel[ch];
23002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                for (sfbGrp = 0;sfbGrp < psyOutElement[i]->psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutElement[i]->psyOutChannel[ch]->sfbPerGroup) {
23012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    for (sfb=0; sfb<psyOutElement[i]->psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
23022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        pQcOutCh->sfbThresholdLdData[sfb+sfbGrp] += pQcOutCh->sfbEnFacLd[sfb+sfbGrp];
23032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
23042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
23052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
23062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
23072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
23092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_AdjThrClose(ADJ_THR_STATE** phAdjThr)
23112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
23122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i;
23132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ADJ_THR_STATE* hAdjThr = *phAdjThr;
23142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAdjThr!=NULL) {
23162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i=0; i<(6); i++) {
23172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAdjThr->adjThrStateElem[i]!=NULL) {
23182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FreeRam_aacEnc_AdjThrStateElement(&hAdjThr->adjThrStateElem[i]);
23192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
23202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
23212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FreeRam_aacEnc_AdjustThreshold(phAdjThr);
23222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
23232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
23242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2325