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
54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi� Copyright  1995 - 2013 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
1267ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi/*
1277ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel TriviThe bits2Pe factors are choosen for the case that some times
1287ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivithe crash recovery strategy will be activated once.
1297ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi*/
1307ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
1317ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivitypedef struct {
1327ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  INT                 bitrate;
1337ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  LONG                bits2PeFactor_mono;
1347ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  LONG                bits2PeFactor_mono_slope;
1357ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  LONG                bits2PeFactor_stereo;
1367ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  LONG                bits2PeFactor_stereo_slope;
1377ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  LONG                bits2PeFactor_mono_scfOpt;
1387ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  LONG                bits2PeFactor_mono_scfOpt_slope;
1397ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  LONG                bits2PeFactor_stereo_scfOpt;
1407ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  LONG                bits2PeFactor_stereo_scfOpt_slope;
1417ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
1427ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi} BIT_PE_SFAC;
1437ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
1447ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivitypedef struct {
1457ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  const INT           sampleRate;
1467ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  const BIT_PE_SFAC * pPeTab;
1477ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  const INT           nEntries;
1487ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
1497ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi} BITS2PE_CFG_TAB;
1507ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
1517ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivistatic const BIT_PE_SFAC S_Bits2PeTab16000[] = {
1527ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 10000, 0x228F5C29, 0x02FEF55D, 0x1D70A3D7, 0x09BC9D6D, 0x228F5C29, 0x02FEF55D, 0x1C28F5C3, 0x0CBB92CA},
1537ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 24000, 0x23D70A3D, 0x029F16B1, 0x2199999A, 0x07DD4413, 0x23D70A3D, 0x029F16B1, 0x2199999A, 0x07DD4413},
1547ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 32000, 0x247AE148, 0x11B1D92B, 0x23851EB8, 0x01F75105, 0x247AE148, 0x110A137F, 0x23851EB8, 0x01F75105},
1557ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 48000, 0x2D1EB852, 0x6833C600, 0x247AE148, 0x014F8B59, 0x2CCCCCCD, 0x68DB8BAC, 0x247AE148, 0x01F75105},
1567ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 64000, 0x60000000, 0x00000000, 0x251EB852, 0x154C985F, 0x60000000, 0x00000000, 0x2570A3D7, 0x154C985F},
1577ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 96000, 0x60000000, 0x00000000, 0x39EB851F, 0x088509C0, 0x60000000, 0x00000000, 0x3A3D70A4, 0x088509C0},
1587ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {128000, 0x60000000, 0x00000000, 0x423D70A4, 0x18A43BB4, 0x60000000, 0x00000000, 0x428F5C29, 0x181E03F7},
1597ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {148000, 0x60000000, 0x00000000, 0x5147AE14, 0x00000000, 0x60000000, 0x00000000, 0x5147AE14, 0x00000000}
1607ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi};
1617ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
1627ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivistatic const BIT_PE_SFAC S_Bits2PeTab22050[] = {
1637ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 16000, 0x1a8f5c29, 0x1797cc3a, 0x128f5c29, 0x18e75793, 0x175c28f6, 0x221426fe, 0x00000000, 0x5a708ede},
1647ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 24000, 0x2051eb85, 0x092ccf6c, 0x18a3d70a, 0x13a92a30, 0x1fae147b, 0xbcbe61d,  0x16147ae1, 0x18e75793},
1657ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 32000, 0x228f5c29, 0x029f16b1, 0x1d70a3d7, 0x088509c0, 0x228f5c29, 0x29f16b1,  0x1c28f5c3, 0x0b242071},
1667ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 48000, 0x23d70a3d, 0x014f8b59, 0x2199999a, 0x03eea20a, 0x23d70a3d, 0x14f8b59,  0x2199999a, 0x03eea20a},
1677ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 64000, 0x247ae148, 0x08d8ec96, 0x23851eb8, 0x00fba882, 0x247ae148, 0x88509c0,  0x23851eb8, 0x00fba882},
1687ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 96000, 0x2d1eb852, 0x3419e300, 0x247ae148, 0x00a7c5ac, 0x2ccccccd, 0x346dc5d6, 0x247ae148, 0x00fba882},
1697ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {128000, 0x60000000, 0x00000000, 0x251eb852, 0x029f16b1, 0x60000000, 0x00000000, 0x2570a3d7, 0x009f16b1},
1707ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {148000, 0x60000000, 0x00000000, 0x26b851ec, 0x00000000, 0x60000000, 0x00000000, 0x270a3d71, 0x00000000}
1717ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi};
1727ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
1737ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivistatic const BIT_PE_SFAC S_Bits2PeTab24000[] = {
1747ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 16000, 0x19eb851f, 0x13a92a30, 0x1147ae14, 0x164840e1, 0x1999999a, 0x12599ed8, 0x00000000, 0x46c764ae},
1757ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 24000, 0x1eb851ec, 0x0d1b7176, 0x16b851ec, 0x18e75793, 0x1e147ae1, 0x0fba8827, 0x1147ae14, 0x2c9081c3},
1767ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 32000, 0x21eb851f, 0x049667b6, 0x1ccccccd, 0x07357e67, 0x21eb851f, 0x03eea20a, 0x1c28f5c3, 0x07357e67},
1777ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 48000, 0x2428f5c3, 0x014f8b59, 0x2051eb85, 0x053e2d62, 0x23d70a3d, 0x01f75105, 0x1fae147b, 0x07357e67},
1787ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 64000, 0x24cccccd, 0x05e5f30e, 0x22e147ae, 0x01a36e2f, 0x24cccccd, 0x05e5f30e, 0x23333333, 0x014f8b59},
1797ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 96000, 0x2a8f5c29, 0x24b33db0, 0x247ae148, 0x00fba882, 0x2a8f5c29, 0x26fe718b, 0x247ae148, 0x00fba882},
1807ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {128000, 0x4e666666, 0x1cd5f99c, 0x2570a3d7, 0x010c6f7a, 0x50a3d70a, 0x192a7371, 0x2570a3d7, 0x010c6f7a},
1817ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {148000, 0x60000000, 0x00000000, 0x26147ae1, 0x00000000, 0x60000000, 0x00000000, 0x26147ae1, 0x00000000}
1827ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi};
1837ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
1847ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivistatic const BIT_PE_SFAC S_Bits2PeTab32000[] = {
1857ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 16000, 0x1199999a, 0x20c49ba6, 0x00000000, 0x4577d955, 0x00000000, 0x60fe4799, 0x00000000, 0x00000000},
1867ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 24000, 0x1999999a, 0x0fba8827, 0x10f5c28f, 0x1b866e44, 0x17ae147b, 0x0fba8827, 0x00000000, 0x4d551d69},
1877ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 32000, 0x1d70a3d7, 0x07357e67, 0x17ae147b, 0x09d49518, 0x1b851eb8, 0x0a7c5ac4, 0x12e147ae, 0x110a137f},
1887ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 48000, 0x20f5c28f, 0x049667b6, 0x1c7ae148, 0x053e2d62, 0x20a3d70a, 0x053e2d62, 0x1b333333, 0x05e5f30e},
1897ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 64000, 0x23333333, 0x029f16b1, 0x1f0a3d71, 0x02f2f987, 0x23333333, 0x029f16b1, 0x1e147ae1, 0x03eea20a},
1907ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 96000, 0x25c28f5c, 0x2c3c9eed, 0x21eb851f, 0x01f75105, 0x25c28f5c, 0x0a7c5ac4, 0x21eb851f, 0x01a36e2f},
1917ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {128000, 0x50f5c28f, 0x18a43bb4, 0x23d70a3d, 0x010c6f7a, 0x30000000, 0x168b5cc0, 0x23851eb8, 0x0192a737},
1927ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {148000, 0x60000000, 0x00000000, 0x247ae148, 0x00dfb23b, 0x3dc28f5c, 0x300f4aaf, 0x247ae148, 0x01bf6476},
1937ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {160000, 0x60000000, 0xb15b5740, 0x24cccccd, 0x053e2d62, 0x4f5c28f6, 0xbefd0072, 0x251eb852, 0x04fb1184},
1947ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {200000, 0x00000000, 0x00000000, 0x2b333333, 0x0836be91, 0x00000000, 0x00000000, 0x2b333333, 0x0890390f},
1957ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {320000, 0x00000000, 0x00000000, 0x4947ae14, 0x00000000, 0x00000000, 0x00000000, 0x4a8f5c29, 0x00000000}
1967ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi};
1977ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
1987ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivistatic const BIT_PE_SFAC S_Bits2PeTab44100[] = {
1997ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 16000, 0x10a3d70a, 0x1797cc3a, 0x00000000, 0x00000000, 0x00000000, 0x59210386, 0x00000000, 0x00000000},
2007ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 24000, 0x16666666, 0x1797cc3a, 0x00000000, 0x639d5e4a, 0x15c28f5c, 0x12599ed8, 0x00000000, 0x5bc01a37},
2017ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 32000, 0x1c28f5c3, 0x049667b6, 0x1851eb85, 0x049667b6, 0x1a3d70a4, 0x088509c0, 0x16666666, 0x053e2d62},
2027ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 48000, 0x1e666666, 0x05e5f30e, 0x1a8f5c29, 0x049667b6, 0x1e666666, 0x05e5f30e, 0x18f5c28f, 0x05e5f30e},
2037ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 64000, 0x2147ae14, 0x0346dc5d, 0x1ccccccd, 0x02f2f987, 0x2147ae14, 0x02f2f987, 0x1bd70a3d, 0x039abf34},
2047ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 96000, 0x247ae148, 0x068db8bb, 0x1fae147b, 0x029f16b1, 0x2428f5c3, 0x0639d5e5, 0x1f5c28f6, 0x029f16b1},
2057ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {128000, 0x2ae147ae, 0x1b435265, 0x223d70a4, 0x0192a737, 0x2a3d70a4, 0x1040bfe4, 0x21eb851f, 0x0192a737},
2067ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {148000, 0x3b851eb8, 0x2832069c, 0x23333333, 0x00dfb23b, 0x3428f5c3, 0x2054c288, 0x22e147ae, 0x00dfb23b},
2077ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {160000, 0x4a3d70a4, 0xc32ebe5a, 0x23851eb8, 0x01d5c316, 0x40000000, 0xcb923a2b, 0x23333333, 0x01d5c316},
2087ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {200000, 0x00000000, 0x00000000, 0x25c28f5c, 0x0713f078, 0x00000000, 0x00000000, 0x2570a3d7, 0x072a4f17},
2097ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {320000, 0x00000000, 0x00000000, 0x3fae147b, 0x00000000, 0x00000000, 0x00000000, 0x3fae147b, 0x00000000}
2107ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi};
2117ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2127ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivistatic const BIT_PE_SFAC S_Bits2PeTab48000[] = {
2137ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 16000, 0x0f5c28f6, 0x31ceaf25, 0x00000000, 0x00000000, 0x00000000, 0x74a771c9, 0x00000000, 0x00000000},
2147ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 24000, 0x1b851eb8, 0x029f16b1, 0x00000000, 0x663c74fb, 0x1c7ae148, 0xe47991bd, 0x00000000, 0x49667b5f},
2157ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 32000, 0x1c28f5c3, 0x029f16b1, 0x18f5c28f, 0x07357e67, 0x15c28f5c, 0x0f12c27a, 0x11eb851f, 0x13016484},
2167ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 48000, 0x1d70a3d7, 0x053e2d62, 0x1c7ae148, 0xfe08aefc, 0x1d1eb852, 0x068db8bb, 0x1b333333, 0xfeb074a8},
2177ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 64000, 0x20000000, 0x03eea20a, 0x1b851eb8, 0x0346dc5d, 0x2051eb85, 0x0346dc5d, 0x1a8f5c29, 0x039abf34},
2187ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 96000, 0x23d70a3d, 0x053e2d62, 0x1eb851ec, 0x029f16b1, 0x23851eb8, 0x04ea4a8c, 0x1e147ae1, 0x02f2f987},
2197ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {128000, 0x28f5c28f, 0x14727dcc, 0x2147ae14, 0x0218def4, 0x2851eb85, 0x0e27e0f0, 0x20f5c28f, 0x0218def4},
2207ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {148000, 0x3570a3d7, 0x1cd5f99c, 0x228f5c29, 0x01bf6476, 0x30f5c28f, 0x18777e75, 0x223d70a4, 0x01bf6476},
2217ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {160000, 0x40000000, 0xcb923a2b, 0x23333333, 0x0192a737, 0x39eb851f, 0xd08d4bae, 0x22e147ae, 0x0192a737},
2227ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {200000, 0x00000000, 0x00000000, 0x251eb852, 0x06775a1b, 0x00000000, 0x00000000, 0x24cccccd, 0x06a4175a},
2237ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  {320000, 0x00000000, 0x00000000, 0x3ccccccd, 0x00000000, 0x00000000, 0x00000000, 0x3d1eb852, 0x00000000}
2247ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi};
2257ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2267ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivistatic const BITS2PE_CFG_TAB bits2PeConfigTab[] = {
2277ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 16000, S_Bits2PeTab16000, sizeof(S_Bits2PeTab16000)/sizeof(BIT_PE_SFAC) },
2287ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 22050, S_Bits2PeTab22050, sizeof(S_Bits2PeTab22050)/sizeof(BIT_PE_SFAC) },
2297ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 24000, S_Bits2PeTab24000, sizeof(S_Bits2PeTab24000)/sizeof(BIT_PE_SFAC) },
2307ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 32000, S_Bits2PeTab32000, sizeof(S_Bits2PeTab32000)/sizeof(BIT_PE_SFAC) },
2317ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 44100, S_Bits2PeTab44100, sizeof(S_Bits2PeTab44100)/sizeof(BIT_PE_SFAC) },
2327ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  { 48000, S_Bits2PeTab48000, sizeof(S_Bits2PeTab48000)/sizeof(BIT_PE_SFAC) }
2337ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi};
2347ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2357ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2367ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* values for avoid hole flag */
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectenum _avoid_hole_state {
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    NO_AH              =0,
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AH_INACTIVE        =1,
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AH_ACTIVE          =2
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*  Q format definitions */
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define Q_BITFAC    (24)   /* Q scaling used in FDKaacEnc_bitresCalcBitFac() calculation */
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define Q_AVGBITS   (17)   /* scale bit values */
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2497ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2507ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi/*****************************************************************************
2517ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    functionname: FDKaacEnc_InitBits2PeFactor
2527ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    description:  retrieve bits2PeFactor from table
2537ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi*****************************************************************************/
2547ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivistatic void FDKaacEnc_InitBits2PeFactor(
2557ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        FIXP_DBL *bits2PeFactor_m,
2567ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        INT *bits2PeFactor_e,
2577ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT bitRate,
2587ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT nChannels,
2597ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT sampleRate,
2607ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT advancedBitsToPe,
2617ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT invQuant
2627ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        )
2637ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi{
2647ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  /* default bits2pe factor */
2657ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  FIXP_DBL bit2PE_m = FL2FXCONST_DBL(1.18f/(1<<(1)));
2667ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  INT      bit2PE_e = 1;
2677ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2687ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  /* make use of advanced bits to pe factor table */
2697ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  if (advancedBitsToPe) {
2707ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2717ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    int i;
2727ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    const BIT_PE_SFAC *peTab = NULL;
2737ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    INT size = 0;
2747ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2757ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2767ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* Get correct table entry */
2777ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    for (i=0; i<(INT)(sizeof(bits2PeConfigTab)/sizeof(BITS2PE_CFG_TAB)); i++) {
2787ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      if (sampleRate >= bits2PeConfigTab[i].sampleRate) {
2797ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        peTab = bits2PeConfigTab[i].pPeTab;
2807ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        size  = bits2PeConfigTab[i].nEntries;
2817ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      }
2827ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    }
2837ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2847ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    if ( (peTab!=NULL) && (size!=0) ) {
2857ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2867ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      INT startB      = -1;
2877ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      LONG startPF    = 0;
2887ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      LONG peSlope    = 0;
2897ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
2907ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      /* stereo or mono mode and invQuant used or not */
2917ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      for (i=0; i<size-1; i++)
2927ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      {
2937ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        if ((peTab[i].bitrate<=bitRate) && ((peTab[i+1].bitrate>bitRate) || ((i==size-2)) ))
2947ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        {
2957ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          if (nChannels==1)
2967ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          {
2977ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            startPF = (!invQuant) ? peTab[i].bits2PeFactor_mono   : peTab[i].bits2PeFactor_mono_scfOpt;
2987ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            peSlope = (!invQuant) ? peTab[i].bits2PeFactor_mono_slope : peTab[i].bits2PeFactor_mono_scfOpt_slope;
2997ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            /*endPF   = (!invQuant) ? peTab[i+1].bits2PeFactor_mono : peTab[i+1].bits2PeFactor_mono_scfOpt;
3007ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            endB=peTab[i+1].bitrate;*/
3017ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            startB=peTab[i].bitrate;
3027ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            break;
3037ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          }
3047ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          else
3057ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          {
3067ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            startPF = (!invQuant) ? peTab[i].bits2PeFactor_stereo   : peTab[i].bits2PeFactor_stereo_scfOpt;
3077ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            peSlope = (!invQuant) ? peTab[i].bits2PeFactor_stereo_slope : peTab[i].bits2PeFactor_stereo_scfOpt_slope;
3087ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            /*endPF   = (!invQuant) ? peTab[i+1].bits2PeFactor_stereo : peTab[i+1].bits2PeFactor_stereo_scfOpt;
3097ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            endB=peTab[i+1].bitrate;*/
3107ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            startB=peTab[i].bitrate;
3117ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            break;
3127ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          }
3137ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        }
3147ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      } /* for i */
3157ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
3167ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      /* if a configuration is available */
3177ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      if (startB!=-1) {
3187ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        /* linear interpolate to actual PEfactor */
3197ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        FIXP_DBL peFac = fMult((FIXP_DBL)(bitRate-startB)<<14, (FIXP_DBL)peSlope) << 2;
3207ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        FIXP_DBL bit2PE = peFac + (FIXP_DBL)startPF; /* startPF_float = startPF << 2 */
3217ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
3227ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        /* sanity check if bits2pe value is high enough */
3237ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        if ( bit2PE >= (FL2FXCONST_DBL(0.35f) >> 2) ) {
3247ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          bit2PE_m = bit2PE;
3257ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          bit2PE_e = 2; /*  table is fixed scaled */
3267ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        }
3277ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      } /* br */
3287ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    } /* sr */
3297ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  } /* advancedBitsToPe */
3307ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
3317ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
3327ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  /* return bits2pe factor */
3337ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  *bits2PeFactor_m = bit2PE_m;
3347ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  *bits2PeFactor_e = bit2PE_e;
3357ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi}
3367ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
3377ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
3387ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi/*****************************************************************************
3397ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivifunctionname: FDKaacEnc_bits2pe2
3407ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trividescription:  convert from bits to pe
3417ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi*****************************************************************************/
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT FDKaacEnc_bits2pe2(
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 bits,
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const FIXP_DBL            factor_m,
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 factor_e
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   return (INT)(fMult(factor_m, (FIXP_DBL)(bits<<Q_AVGBITS)) >> (Q_AVGBITS-factor_e));
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_calcThreshExp
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  loudness calculation (threshold to the power of redExp)
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_calcThreshExp(FIXP_DBL thrExp[(2)][MAX_GROUPED_SFB],
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          QC_OUT_CHANNEL*  qcOutChannel[(2)],
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          PSY_OUT_CHANNEL*  psyOutChannel[(2)],
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const INT nChannels)
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch, sfb, sfbGrp;
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL thrExpLdData;
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for (ch=0; ch<nChannels; ch++) {
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for(sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup) {
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         thrExpLdData = psyOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb]>>2 ;
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         thrExp[ch][sfbGrp+sfb] = CalcInvLdData(thrExpLdData);
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
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_adaptMinSnr
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  reduce minSnr requirements for bands with relative low energies
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_adaptMinSnr(QC_OUT_CHANNEL     *qcOutChannel[(2)],
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  PSY_OUT_CHANNEL    *psyOutChannel[(2)],
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  MINSNR_ADAPT_PARAM *msaParam,
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  const INT           nChannels)
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT ch, sfb, sfbGrp, nSfb;
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL avgEnLD64, dbRatio, minSnrRed;
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL minSnrLimitLD64 = FL2FXCONST_DBL(-0.00503012648262f); /* ld64(0.8f) */
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL nSfbLD64;
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL accu;
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (ch=0; ch<nChannels; ch++) {
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* calc average energy per scalefactor band */
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    nSfb = 0;
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    accu = FL2FXCONST_DBL(0.0f);
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        accu += psyOutChannel[ch]->sfbEnergy[sfbGrp+sfb]>>6;
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project				 nSfb++;
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project			 }
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((accu == FL2FXCONST_DBL(0.0f)) || (nSfb == 0)) {
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      avgEnLD64 = FL2FXCONST_DBL(-1.0f);
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      nSfbLD64  = CalcLdInt(nSfb);
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      avgEnLD64 = CalcLdData(accu);
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      avgEnLD64 = avgEnLD64 + FL2FXCONST_DBL(0.09375f) - nSfbLD64;  /* 0.09375f: compensate shift with 6 */
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (msaParam->startRatio + qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb]) < avgEnLD64 ) {
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          dbRatio = fMult((avgEnLD64 - qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb]),FL2FXCONST_DBL(0.3010299956f)); /* scaled by (1.0f/(10.0f*64.0f)) */
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          minSnrRed = msaParam->redOffs + fMult(msaParam->redRatioFac,dbRatio); /* scaled by 1.0f/64.0f*/
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          minSnrRed = fixMax(minSnrRed, msaParam->maxRed); /* scaled by 1.0f/64.0f*/
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb] = (fMult(qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb],minSnrRed)) << 6;
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(minSnrLimitLD64, qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb]);
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_initAvoidHoleFlag
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  determine bands where avoid hole is not necessary resp. possible
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_initAvoidHoleFlag(QC_OUT_CHANNEL  *qcOutChannel[(2)],
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              PSY_OUT_CHANNEL *psyOutChannel[(2)],
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              struct TOOLSINFO *toolsInfo,
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              const INT nChannels,
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              const PE_DATA *peData,
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              AH_PARAM *ahParam)
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch, sfb, sfbGrp;
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbEn, sfbEnm1;
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbEnLdData;
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL avgEnLdData;
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* decrease spread energy by 3dB for long blocks, resp. 2dB for shorts
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (avoid more holes in long blocks) */
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for (ch=0; ch<nChannels; ch++) {
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT sfbGrp, sfb;
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL*  qcOutChan  = qcOutChannel[ch];
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (psyOutChannel[ch]->lastWindowSequence != SHORT_WINDOW) {
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup)
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++)
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              qcOutChan->sfbSpreadEnergy[sfbGrp+sfb] >>= 1 ;
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup)
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++)
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              qcOutChan->sfbSpreadEnergy[sfbGrp+sfb] =
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   fMult(FL2FXCONST_DBL(0.63f),
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         qcOutChan->sfbSpreadEnergy[sfbGrp+sfb]) ;
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* increase minSnr for local peaks, decrease it for valleys */
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if (ahParam->modifyMinSnr) {
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(ch=0; ch<nChannels; ch++) {
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         QC_OUT_CHANNEL*  qcOutChan  = qcOutChannel[ch];
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for(sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup){
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               FIXP_DBL sfbEnp1, avgEn;
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               if (sfb > 0)
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sfbEnm1 = qcOutChan->sfbEnergy[sfbGrp+sfb-1];
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               else
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sfbEnm1 = qcOutChan->sfbEnergy[sfbGrp+sfb];
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               if (sfb < psyOutChannel[ch]->maxSfbPerGroup-1)
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sfbEnp1 = qcOutChan->sfbEnergy[sfbGrp+sfb+1];
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               else
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sfbEnp1 = qcOutChan->sfbEnergy[sfbGrp+sfb];
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               avgEn = (sfbEnm1>>1) + (sfbEnp1>>1);
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               avgEnLdData = CalcLdData(avgEn);
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbEn = qcOutChan->sfbEnergy[sfbGrp+sfb];
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbEnLdData = qcOutChan->sfbEnergyLdData[sfbGrp+sfb];
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               /* peak ? */
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               if (sfbEn > avgEn) {
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  FIXP_DBL tmpMinSnrLdData;
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if (psyOutChannel[ch]->lastWindowSequence==LONG_WINDOW)
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     tmpMinSnrLdData = fixMax( SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), (FIXP_DBL)SnrLdMin1 ) ;
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  else
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     tmpMinSnrLdData = fixMax( SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), (FIXP_DBL)SnrLdMin3 ) ;
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] =
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     fixMin(qcOutChan->sfbMinSnrLdData[sfbGrp+sfb], tmpMinSnrLdData);
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               }
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               /* valley ? */
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               if ( ((sfbEnLdData+(FIXP_DBL)SnrLdMin4) < (FIXP_DBL)avgEnLdData) && (sfbEn > FL2FXCONST_DBL(0.0)) ) {
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  FIXP_DBL tmpMinSnrLdData = avgEnLdData - sfbEnLdData -(FIXP_DBL)SnrLdMin4 + qcOutChan->sfbMinSnrLdData[sfbGrp+sfb];
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  tmpMinSnrLdData = fixMin((FIXP_DBL)SnrLdFac, tmpMinSnrLdData);
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(tmpMinSnrLdData,
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        (FIXP_DBL)(qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + SnrLdMin2 ));
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               }
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         }
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* stereo: adapt the minimum requirements sfbMinSnr of mid and
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      side channels to avoid spending unnoticable bits */
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if (nChannels == 2) {
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL*  qcOutChanM  = qcOutChannel[0];
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL*  qcOutChanS  = qcOutChannel[1];
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PSY_OUT_CHANNEL*  psyOutChanM  = psyOutChannel[0];
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(sfbGrp = 0;sfbGrp < psyOutChanM->sfbCnt;sfbGrp+= psyOutChanM->sfbPerGroup){
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfb=0; sfb<psyOutChanM->maxSfbPerGroup; sfb++) {
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (toolsInfo->msMask[sfbGrp+sfb]) {
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL maxSfbEnLd = fixMax(qcOutChanM->sfbEnergyLdData[sfbGrp+sfb],qcOutChanS->sfbEnergyLdData[sfbGrp+sfb]);
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL maxThrLd, sfbMinSnrTmpLd;
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if ( ((SnrLdMin5>>1) + (maxSfbEnLd>>1) + (qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb]>>1)) <= FL2FXCONST_DBL(-0.5f))
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               maxThrLd = FL2FXCONST_DBL(-1.0f) ;
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               maxThrLd = SnrLdMin5 + maxSfbEnLd + qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb];
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanM->sfbEnergy[sfbGrp+sfb] > FL2FXCONST_DBL(0.0f))
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbMinSnrTmpLd = maxThrLd - qcOutChanM->sfbEnergyLdData[sfbGrp+sfb];
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbMinSnrTmpLd = FL2FXCONST_DBL(0.0f);
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb] = fixMax(qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb],sfbMinSnrTmpLd);
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb] <= FL2FXCONST_DBL(0.0f))
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb], (FIXP_DBL)SnrLdFac);
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanS->sfbEnergy[sfbGrp+sfb] > FL2FXCONST_DBL(0.0f))
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbMinSnrTmpLd = maxThrLd - qcOutChanS->sfbEnergyLdData[sfbGrp+sfb];
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbMinSnrTmpLd = FL2FXCONST_DBL(0.0f);
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb] = fixMax(qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb],sfbMinSnrTmpLd);
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb] <= FL2FXCONST_DBL(0.0f))
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb],(FIXP_DBL)SnrLdFac);
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanM->sfbEnergy[sfbGrp+sfb]>qcOutChanM->sfbSpreadEnergy[sfbGrp+sfb])
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChanS->sfbSpreadEnergy[sfbGrp+sfb] =
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   fMult(qcOutChanS->sfbEnergy[sfbGrp+sfb], FL2FXCONST_DBL(0.9f));
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if (qcOutChanS->sfbEnergy[sfbGrp+sfb]>qcOutChanS->sfbSpreadEnergy[sfbGrp+sfb])
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChanM->sfbSpreadEnergy[sfbGrp+sfb] =
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   fMult(qcOutChanM->sfbEnergy[sfbGrp+sfb], FL2FXCONST_DBL(0.9f));
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(ch=0; ch<nChannels; ch++) {
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL  *qcOutChan  = qcOutChannel[ch];
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PSY_OUT_CHANNEL  *psyOutChan  = psyOutChannel[ch];
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ((qcOutChan->sfbSpreadEnergy[sfbGrp+sfb] > qcOutChan->sfbEnergy[sfbGrp+sfb])
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              || (qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] > FL2FXCONST_DBL(0.0f))) {
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             ahFlag[ch][sfbGrp+sfb] = NO_AH;
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          else {
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             ahFlag[ch][sfbGrp+sfb] = AH_INACTIVE;
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief  Calculate constants that do not change during successive pe calculations.
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param peData                Pointer to structure containing PE data of current element.
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param psyOutChannel         Pointer to PSY_OUT_CHANNEL struct holding nChannels elements.
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param qcOutChannel          Pointer to QC_OUT_CHANNEL struct holding nChannels elements.
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param nChannels             Number of channels in element.
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param peOffset              Fixed PE offset defined while FDKaacEnc_AdjThrInit() depending on bitrate.
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return  void
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_preparePe(PE_DATA *peData,
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               PSY_OUT_CHANNEL* psyOutChannel[(2)],
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               QC_OUT_CHANNEL* qcOutChannel[(2)],
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               const INT nChannels,
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               const INT peOffset)
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT ch;
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(ch=0; ch<nChannels; ch++) {
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        PSY_OUT_CHANNEL *psyOutChan = psyOutChannel[ch];
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKaacEnc_prepareSfbPe(&peData->peChannelData[ch],
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbEnergyLdData,
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbThresholdLdData,
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            qcOutChannel[ch]->sfbFormFactorLdData,
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbOffsets,
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbCnt,
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->sfbPerGroup,
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            psyOutChan->maxSfbPerGroup);
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    peData->offset = peOffset;
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief  Calculate weighting factor for threshold adjustment.
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Calculate weighting factor to be applied at energies and thresholds in ld64 format.
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param peData,               Pointer to PE data in current element.
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param psyOutChannel         Pointer to PSY_OUT_CHANNEL struct holding nChannels elements.
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param qcOutChannel          Pointer to QC_OUT_CHANNEL struct holding nChannels elements.
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param toolsInfo             Pointer to tools info struct of current element.
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param adjThrStateElement    Pointer to ATS_ELEMENT holding enFacPatch states.
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param nChannels             Number of channels in element.
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param usePatchTool          Apply the weighting tool 0 (no) else (yes).
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return  void
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_calcWeighting(PE_DATA *peData,
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               PSY_OUT_CHANNEL* psyOutChannel[(2)],
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               QC_OUT_CHANNEL* qcOutChannel[(2)],
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               struct TOOLSINFO *toolsInfo,
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               ATS_ELEMENT* adjThrStateElement,
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               const INT nChannels,
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               const INT usePatchTool)
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch, noShortWindowInFrame = TRUE;
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT exePatchM = 0;
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch=0; ch<nChannels; ch++) {
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (psyOutChannel[ch]->lastWindowSequence == SHORT_WINDOW) {
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            noShortWindowInFrame = FALSE;
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(qcOutChannel[ch]->sfbEnFacLd, MAX_GROUPED_SFB*sizeof(FIXP_DBL));
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (usePatchTool==0) {
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return; /* tool is disabled */
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch=0; ch<nChannels; ch++) {
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        PSY_OUT_CHANNEL *psyOutChan = psyOutChannel[ch];
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (noShortWindowInFrame) { /* retain energy ratio between blocks of different length */
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FIXP_DBL nrgSum14, nrgSum12, nrgSum34, nrgTotal;
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FIXP_DBL nrgFacLd_14, nrgFacLd_12, nrgFacLd_34;
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT usePatch, exePatch;
6577ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            int sfb, sfbGrp, nLinesSum = 0;
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgSum14 = nrgSum12 = nrgSum34 = nrgTotal = FL2FXCONST_DBL(0.f);
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* calculate flatness of audible spectrum, i.e. spectrum above masking threshold. */
6627ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
6637ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
6647ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                FIXP_DBL nrgFac12 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>1); /* nrg^(1/2) */
6657ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                FIXP_DBL nrgFac14 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>2); /* nrg^(1/4) */
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* maximal number of bands is 64, results scaling factor 6 */
6687ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                nLinesSum += peData->peChannelData[ch].sfbNLines[sfbGrp+sfb];             /* relevant lines */
6697ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                nrgTotal  += ( psyOutChan->sfbEnergy[sfbGrp+sfb] >> 6 );                  /* sum up nrg */
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                nrgSum12  += ( nrgFac12 >> 6 );                                           /* sum up nrg^(2/4) */
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                nrgSum14  += ( nrgFac14 >> 6 );                                           /* sum up nrg^(1/4) */
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                nrgSum34  += ( fMult(nrgFac14, nrgFac12) >> 6 );                          /* sum up nrg^(3/4) */
6737ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              }
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgTotal = CalcLdData(nrgTotal);                                              /* get ld64 of total nrg */
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgFacLd_14 = CalcLdData(nrgSum14) - nrgTotal;                                /* ld64(nrgSum14/nrgTotal) */
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgFacLd_12 = CalcLdData(nrgSum12) - nrgTotal;                                /* ld64(nrgSum12/nrgTotal) */
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nrgFacLd_34 = CalcLdData(nrgSum34) - nrgTotal;                                /* ld64(nrgSum34/nrgTotal) */
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            adjThrStateElement->chaosMeasureEnFac[ch] = FDKmax( FL2FXCONST_DBL(0.1875f), fDivNorm(nLinesSum,psyOutChan->sfbOffsets[psyOutChan->sfbCnt]) );
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            usePatch = (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.78125f));
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            exePatch = ((usePatch) && (adjThrStateElement->lastEnFacPatch[ch]));
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6877ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
6887ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
6897ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                INT sfbExePatch;
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* for MS coupled SFBs, also execute patch in side channel if done in mid channel */
6937ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                if ((ch == 1) && (toolsInfo->msMask[sfbGrp+sfb])) {
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbExePatch = exePatchM;
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                else {
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbExePatch = exePatch;
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7007ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                if ( (sfbExePatch) && (psyOutChan->sfbEnergy[sfbGrp+sfb]>FL2FXCONST_DBL(0.f)) )
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                {
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* execute patch based on spectral flatness calculated above */
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    if (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.8125f)) {
7047ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                        qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = ( (nrgFacLd_14 + (psyOutChan->sfbEnergyLdData[sfbGrp+sfb]+(psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>1)))>>1 ); /* sfbEnergy^(3/4) */
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    else if (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.796875f)) {
7077ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                        qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = ( (nrgFacLd_12 + psyOutChan->sfbEnergyLdData[sfbGrp+sfb])>>1 );          /* sfbEnergy^(2/4) */
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    else {
7107ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                        qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = ( (nrgFacLd_34 + (psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>1))>>1 );     /* sfbEnergy^(1/4) */
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
7127ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                    qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = fixMin(qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb],(FIXP_DBL)0);
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
7157ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              }
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* sfb loop */
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            adjThrStateElement->lastEnFacPatch[ch] = usePatch;
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            exePatchM = exePatch;
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* !noShortWindowInFrame */
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            adjThrStateElement->chaosMeasureEnFac[ch] = FL2FXCONST_DBL(0.75f);
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            adjThrStateElement->lastEnFacPatch[ch] = TRUE; /* allow use of sfbEnFac patch in upcoming frame */
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* ch loop */
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_calcPe
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  calculate pe for both channels
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_calcPe(PSY_OUT_CHANNEL* psyOutChannel[(2)],
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            QC_OUT_CHANNEL* qcOutChannel[(2)],
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            PE_DATA *peData,
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            const INT nChannels)
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch;
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   peData->pe = peData->offset;
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   peData->constPart = 0;
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   peData->nActiveLines = 0;
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(ch=0; ch<nChannels; ch++) {
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKaacEnc_calcSfbPe(&peData->peChannelData[ch],
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChannel[ch]->sfbWeightedEnergyLdData,
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOutChannel[ch]->sfbThresholdLdData,
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->sfbCnt,
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->sfbPerGroup,
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->maxSfbPerGroup,
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->isBook,
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChannel[ch]->isScale);
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      peData->pe += peChanData->pe;
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      peData->constPart += peChanData->constPart;
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      peData->nActiveLines += peChanData->nActiveLines;
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_peCalculation(PE_DATA *peData,
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             PSY_OUT_CHANNEL* psyOutChannel[(2)],
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             QC_OUT_CHANNEL* qcOutChannel[(2)],
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             struct TOOLSINFO *toolsInfo,
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             ATS_ELEMENT* adjThrStateElement,
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             const INT nChannels)
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* constants that will not change during successive pe calculations */
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_preparePe(peData, psyOutChannel, qcOutChannel, nChannels, adjThrStateElement->peOffset);
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculate weighting factor for threshold adjustment */
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_calcWeighting(peData, psyOutChannel, qcOutChannel, toolsInfo, adjThrStateElement, nChannels, 1);
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* no weighting of threholds and energies for mlout */
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* weight energies and thresholds */
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch;
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch=0; ch<nChannels; ch++) {
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int sfb, sfbGrp;
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        QC_OUT_CHANNEL* pQcOutCh = qcOutChannel[ch];
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pQcOutCh->sfbWeightedEnergyLdData[sfb+sfbGrp] = pQcOutCh->sfbEnergyLdData[sfb+sfbGrp] - pQcOutCh->sfbEnFacLd[sfb+sfbGrp];
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pQcOutCh->sfbThresholdLdData[sfb+sfbGrp]     -= pQcOutCh->sfbEnFacLd[sfb+sfbGrp];
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* pe without reduction */
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_calcPe(psyOutChannel, qcOutChannel, peData, nChannels);
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_FDKaacEnc_calcPeNoAH
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  sum the pe data only for bands where avoid hole is inactive
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_FDKaacEnc_calcPeNoAH(INT *pe,
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       INT *constPart,
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       INT    *nActiveLines,
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       PE_DATA *peData,
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       PSY_OUT_CHANNEL* psyOutChannel[(2)],
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       const INT nChannels)
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT ch, sfb,sfbGrp;
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT pe_tmp = peData->offset;
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT constPart_tmp = 0;
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT nActiveLines_tmp = 0;
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(ch=0; ch<nChannels; ch++) {
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for(sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup){
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if(ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) {
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    pe_tmp += peChanData->sfbPe[sfbGrp+sfb];
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    constPart_tmp += peChanData->sfbConstPart[sfbGrp+sfb];
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    nActiveLines_tmp += peChanData->sfbNActiveLines[sfbGrp+sfb];
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* correct scaled pe and constPart values */
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pe = pe_tmp >> PE_CONSTPART_SHIFT;
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *constPart = constPart_tmp >> PE_CONSTPART_SHIFT;
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project	*nActiveLines = nActiveLines_tmp;
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_reduceThresholdsCBR
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  apply reduction formula
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL limitThrReducedLdData = (FIXP_DBL)0x00008000; /*FL2FXCONST_DBL(FDKpow(2.0,-LD_DATA_SCALING/4.0));*/
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_reduceThresholdsCBR(QC_OUT_CHANNEL*  qcOutChannel[(2)],
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                PSY_OUT_CHANNEL* psyOutChannel[(2)],
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                FIXP_DBL thrExp[(2)][MAX_GROUPED_SFB],
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT nChannels,
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const FIXP_DBL redVal,
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const SCHAR redValScaling)
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch, sfb, sfbGrp;
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrReducedLdData;
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbThrExp;
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(ch=0; ch<nChannels; ch++) {
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL *qcOutChan = qcOutChannel[ch];
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(sfbGrp = 0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+= psyOutChannel[ch]->sfbPerGroup){
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbEnLdData  = qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb];
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbThrLdData = qcOutChan->sfbThresholdLdData[sfbGrp+sfb];
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbThrExp    = thrExp[ch][sfbGrp+sfb];
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         if ((sfbEnLdData > sfbThrLdData) && (ahFlag[ch][sfbGrp+sfb] != AH_ACTIVE)) {
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* threshold reduction formula:
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             float tmp = thrExp[ch][sfb]+redVal;
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             tmp *= tmp;
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             sfbThrReduced = tmp*tmp;
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            */
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            int minScale = fixMin(CountLeadingBits(sfbThrExp), CountLeadingBits(redVal) - (DFRACT_BITS-1-redValScaling) )-1;
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* 4*log( sfbThrExp + redVal ) */
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrReducedLdData = CalcLdData(fAbs(scaleValue(sfbThrExp, minScale) + scaleValue(redVal,(DFRACT_BITS-1-redValScaling)+minScale)))
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             - (FIXP_DBL)(minScale<<(DFRACT_BITS-1-LD_DATA_SHIFT));
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrReducedLdData <<= 2;
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* avoid holes */
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( ((sfbThrReducedLdData - sfbEnLdData) > qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] )
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    && (ahFlag[ch][sfbGrp+sfb] != NO_AH) )
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]  > (FL2FXCONST_DBL(-1.0f) - sfbEnLdData) ){
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   sfbThrReducedLdData = fixMax((qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + sfbEnLdData), sfbThrLdData);
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              else sfbThrReducedLdData = sfbThrLdData;
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* minimum of 29 dB Ratio for Thresholds */
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ((sfbEnLdData+(FIXP_DBL)MAXVAL_DBL) > FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING)){
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                sfbThrReducedLdData = fixMax(sfbThrReducedLdData, (sfbEnLdData - FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING)));
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = sfbThrReducedLdData;
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         }
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* similar to prepareSfbPe1() */
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL FDKaacEnc_calcChaosMeasure(PSY_OUT_CHANNEL *psyOutChannel,
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 const FIXP_DBL  *sfbFormFactorLdData)
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_FORM_FAC     (4)    /* (SCALE_FORM_FAC+FORM_FAC_SHIFT) >= ld(FRAME_LENGTH)*/
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_NRGS         (8)
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_NLINES      (16)
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_NRGS_SQRT4   (2)    /* 0.25 * SCALE_NRGS */
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #define SCALE_NLINES_P34  (12)    /* 0.75 * SCALE_NLINES */
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT   sfbGrp, sfb;
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chaosMeasure;
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT frameNLines = 0;
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL frameFormFactor = FL2FXCONST_DBL(0.f);
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL frameEnergy = FL2FXCONST_DBL(0.f);
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (sfbGrp=0; sfbGrp<psyOutChannel->sfbCnt; sfbGrp+=psyOutChannel->sfbPerGroup) {
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfb=0; sfb<psyOutChannel->maxSfbPerGroup; sfb++){
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (psyOutChannel->sfbEnergyLdData[sfbGrp+sfb] > psyOutChannel->sfbThresholdLdData[sfbGrp+sfb]) {
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        frameFormFactor += (CalcInvLdData(sfbFormFactorLdData[sfbGrp+sfb])>>SCALE_FORM_FAC);
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        frameNLines     += (psyOutChannel->sfbOffsets[sfbGrp+sfb+1] - psyOutChannel->sfbOffsets[sfbGrp+sfb]);
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        frameEnergy     += (psyOutChannel->sfbEnergy[sfbGrp+sfb]>>SCALE_NRGS);
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  if(frameNLines > 0){
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*  frameNActiveLines = frameFormFactor*2^FORM_FAC_SHIFT * ((frameEnergy *2^SCALE_NRGS)/frameNLines)^-0.25
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        chaosMeasure      = frameNActiveLines / frameNLines */
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure =
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           CalcInvLdData( (((CalcLdData(frameFormFactor)>>1) -
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            (CalcLdData(frameEnergy)>>(2+1))) -
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           (fMultDiv2(FL2FXCONST_DBL(0.75f),CalcLdData((FIXP_DBL)frameNLines<<(DFRACT_BITS-1-SCALE_NLINES))) -
9352228e360595641dd906bf1773307f43d304f5b2The 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))
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          )<<1 );
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* assuming total chaos, if no sfb is above thresholds */
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure = FL2FXCONST_DBL(1.f);
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return chaosMeasure;
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* apply reduction formula for VBR-mode */
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_reduceThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)],
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                PSY_OUT_CHANNEL* psyOutChannel[(2)],
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                FIXP_DBL thrExp[(2)][MAX_GROUPED_SFB],
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT nChannels,
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const FIXP_DBL  vbrQualFactor,
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                FIXP_DBL* chaosMeasureOld)
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT ch, sfbGrp, sfb;
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chGroupEnergy[TRANS_FAC][2];/*energy for each group and channel*/
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chChaosMeasure[2];
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL frameEnergy = FL2FXCONST_DBL(1e-10f);
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chaosMeasure = FL2FXCONST_DBL(0.f);
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrExp;
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL sfbThrReducedLdData;
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL chaosMeasureAvg;
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT groupCnt; /* loop counter */
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL redVal[TRANS_FAC]; /* reduction values; in short-block case one redVal for each group */
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  QC_OUT_CHANNEL  *qcOutChan  = NULL;
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  PSY_OUT_CHANNEL  *psyOutChan  = NULL;
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SCALE_GROUP_ENERGY   (8)
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define CONST_CHAOS_MEAS_AVG_FAC_0  (FL2FXCONST_DBL(0.25f))
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define CONST_CHAOS_MEAS_AVG_FAC_1  (FL2FXCONST_DBL(1.f-0.25f))
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define MIN_LDTHRESH                (FL2FXCONST_DBL(-0.515625f))
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(ch=0; ch<nChannels; ch++){
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOutChan  = qcOutChannel[ch];
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    psyOutChan  = psyOutChannel[ch];
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* adding up energy for each channel and each group separately */
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL chEnergy = FL2FXCONST_DBL(0.f);
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    groupCnt=0;
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup, groupCnt++) {
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      chGroupEnergy[groupCnt][ch] = FL2FXCONST_DBL(0.f);
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++){
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        chGroupEnergy[groupCnt][ch] += (psyOutChan->sfbEnergy[sfbGrp+sfb]>>SCALE_GROUP_ENERGY);
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      chEnergy += chGroupEnergy[groupCnt][ch];
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    frameEnergy += chEnergy;
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* chaosMeasure */
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (psyOutChannel[0]->lastWindowSequence == SHORT_WINDOW) {
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      chChaosMeasure[ch] = FL2FXCONST_DBL(0.5f); /* assume a constant chaos measure of 0.5f for short blocks */
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      chChaosMeasure[ch] = FDKaacEnc_calcChaosMeasure(psyOutChannel[ch], qcOutChannel[ch]->sfbFormFactorLdData);
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure += fMult(chChaosMeasure[ch], chEnergy);
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(frameEnergy > chaosMeasure) {
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT scale = CntLeadingZeros(frameEnergy) - 1;
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL num   = chaosMeasure<<scale;
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL denum = frameEnergy<<scale;
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure   = schur_div(num,denum,16);
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    chaosMeasure = FL2FXCONST_DBL(1.f);
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  chaosMeasureAvg = fMult(CONST_CHAOS_MEAS_AVG_FAC_0, chaosMeasure) +
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    fMult(CONST_CHAOS_MEAS_AVG_FAC_1, *chaosMeasureOld);      /* averaging chaos measure */
10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *chaosMeasureOld = chaosMeasure = (fixMin(chaosMeasure, chaosMeasureAvg));  /* use min-value, safe for next frame */
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* characteristic curve
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     chaosMeasure = 0.2f + 0.7f/0.3f * (chaosMeasure - 0.2f);
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     chaosMeasure = fixMin(1.0f, fixMax(0.1f, chaosMeasure));
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     constants scaled by 4.f
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  chaosMeasure = ((FL2FXCONST_DBL(0.2f)>>2) + fMult(FL2FXCONST_DBL(0.7f/(4.f*0.3f)), (chaosMeasure - FL2FXCONST_DBL(0.2f))));
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  chaosMeasure = (fixMin((FIXP_DBL)(FL2FXCONST_DBL(1.0f)>>2), fixMax((FIXP_DBL)(FL2FXCONST_DBL(0.1f)>>2), chaosMeasure)))<<2;
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculation of reduction value */
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (psyOutChannel[0]->lastWindowSequence == SHORT_WINDOW){ /* short-blocks */
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_ASSERT(TRANS_FAC==8);
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    #define   WIN_TYPE_SCALE   (3)
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT sfbGrp, groupCnt=0;
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup,groupCnt++) {
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL groupEnergy = FL2FXCONST_DBL(0.f);
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(ch=0;ch<nChannels;ch++){
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        groupEnergy += chGroupEnergy[groupCnt][ch];   /* adding up the channels groupEnergy */
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDK_ASSERT(psyOutChannel[0]->groupLen[groupCnt]<=INV_INT_TAB_SIZE);
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      groupEnergy = fMult(groupEnergy,invInt[psyOutChannel[0]->groupLen[groupCnt]]);  /* correction of group energy */
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      groupEnergy = fixMin(groupEnergy, frameEnergy>>WIN_TYPE_SCALE);                 /* do not allow an higher redVal as calculated framewise */
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      groupEnergy>>=2; /* 2*WIN_TYPE_SCALE = 6 => 6+2 = 8 ==> 8/4 = int number */
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      redVal[groupCnt] = fMult(fMult(vbrQualFactor,chaosMeasure),
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               CalcInvLdData(CalcLdData(groupEnergy)>>2) )
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         << (int)( ( 2 + (2*WIN_TYPE_SCALE) + SCALE_GROUP_ENERGY )>>2 ) ;
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else { /* long-block */
10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    redVal[0] = fMult( fMult(vbrQualFactor,chaosMeasure),
10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       CalcInvLdData(CalcLdData(frameEnergy)>>2) )
10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                << (int)( SCALE_GROUP_ENERGY>>2 ) ;
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(ch=0; ch<nChannels; ch++) {
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOutChan  = qcOutChannel[ch];
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    psyOutChan  = psyOutChannel[ch];
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++){
10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfbEnLdData  = (qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb]);
10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfbThrLdData = (qcOutChan->sfbThresholdLdData[sfbGrp+sfb]);
10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfbThrExp    = thrExp[ch][sfbGrp+sfb];
10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (sfbThrLdData>=MIN_LDTHRESH) && (sfbEnLdData > sfbThrLdData) && (ahFlag[ch][sfbGrp+sfb] != AH_ACTIVE)) {
10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Short-Window */
10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (psyOutChannel[ch]->lastWindowSequence == SHORT_WINDOW) {
10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            const int groupNumber = (int) sfb/psyOutChan->sfbPerGroup;
10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDK_ASSERT(INV_SQRT4_TAB_SIZE>psyOutChan->groupLen[groupNumber]);
10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrExp = fMult(sfbThrExp, fMult( FL2FXCONST_DBL(2.82f/4.f), invSqrt4[psyOutChan->groupLen[groupNumber]]))<<2 ;
10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( sfbThrExp <= (limitThrReducedLdData-redVal[groupNumber]) ) {
10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                sfbThrReducedLdData = FL2FXCONST_DBL(-1.0f);
10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else {
10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if ((FIXP_DBL)redVal[groupNumber] >= FL2FXCONST_DBL(1.0f)-sfbThrExp)
10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbThrReducedLdData = FL2FXCONST_DBL(0.0f);
10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                else {
10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* threshold reduction formula */
10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbThrReducedLdData = CalcLdData(sfbThrExp + redVal[groupNumber]);
10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbThrReducedLdData <<= 2;
10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrReducedLdData += ( CalcLdInt(psyOutChan->groupLen[groupNumber]) -
10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     ((FIXP_DBL)6<<(DFRACT_BITS-1-LD_DATA_SHIFT)) );
10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Long-Window */
10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          else {
10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ((FIXP_DBL)redVal[0] >= FL2FXCONST_DBL(1.0f)-sfbThrExp) {
10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfbThrReducedLdData = FL2FXCONST_DBL(0.0f);
10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else {
10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* threshold reduction formula */
11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfbThrReducedLdData = CalcLdData(sfbThrExp + redVal[0]);
11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfbThrReducedLdData <<= 2;
11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* avoid holes */
11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ( ((sfbThrReducedLdData - sfbEnLdData) > qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] )
11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  && (ahFlag[ch][sfbGrp+sfb] != NO_AH) )
11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]  > (FL2FXCONST_DBL(-1.0f) - sfbEnLdData) ){
11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 sfbThrReducedLdData = fixMax((qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + sfbEnLdData), sfbThrLdData);
11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else sfbThrReducedLdData = sfbThrLdData;
11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (sfbThrReducedLdData<FL2FXCONST_DBL(-0.5f))
11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               sfbThrReducedLdData = FL2FXCONST_DBL(-1.f);
11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* minimum of 29 dB Ratio for Thresholds */
11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ((sfbEnLdData+FL2FXCONST_DBL(1.0f)) > FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING)){
11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sfbThrReducedLdData = fixMax(sfbThrReducedLdData, sfbEnLdData - FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING));
11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfbThrReducedLdData = fixMax(MIN_LDTHRESH,sfbThrReducedLdData);
11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = sfbThrReducedLdData;
11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_correctThresh
11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  if pe difference deltaPe between desired pe and real pe is small enough,
11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe difference can be distributed among the scale factor bands.
11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNew thresholds can be derived from this pe-difference
11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_correctThresh(CHANNEL_MAPPING* cm,
1140fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                          QC_OUT_ELEMENT*  qcElement[(8)],
1141fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                          PSY_OUT_ELEMENT* psyOutElement[(8)],
1142fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                          UCHAR            ahFlag[(8)][(2)][MAX_GROUPED_SFB],
1143fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                          FIXP_DBL         thrExp[(8)][(2)][MAX_GROUPED_SFB],
1144fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                          const            FIXP_DBL redVal[(8)],
1145fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                          const            SCHAR redValScaling[(8)],
11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const            INT deltaPe,
11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const            INT processElements,
11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const            INT elementOffset)
11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT ch, sfb, sfbGrp;
11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   QC_OUT_CHANNEL *qcOutChan;
11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   PSY_OUT_CHANNEL *psyOutChan;
11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   PE_CHANNEL_DATA *peChanData;
11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL thrFactorLdData;
11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrReducedLdData;
1156fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi   FIXP_DBL *sfbPeFactorsLdData[(8)][(2)];
1157fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi   FIXP_DBL sfbNActiveLinesLdData[(8)][(2)][MAX_GROUPED_SFB];
11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT      normFactorInt;
11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FIXP_DBL normFactorLdData;
11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT nElements = elementOffset+processElements;
11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT elementId;
11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* scratch is empty; use temporal memory from quantSpec in QC_OUT_CHANNEL */
11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(elementId=elementOffset;elementId<nElements;elementId++) {
11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       SHORT* ptr = qcElement[elementId]->qcOutChannel[ch]->quantSpec;
11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       sfbPeFactorsLdData[elementId][ch] = (FIXP_DBL*)ptr;
11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* for each sfb calc relative factors for pe changes */
11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   normFactorInt = 0;
11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(elementId=elementOffset;elementId<nElements;elementId++) {
11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChan = qcElement[elementId]->qcOutChannel[ch];
11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          psyOutChan = psyOutElement[elementId]->psyOutChannel[ch];
11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          peChanData = &qcElement[elementId]->peData.peChannelData[ch];
11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup){
11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if ( peChanData->sfbNActiveLines[sfbGrp+sfb] == 0 ) {
11887ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] = FL2FXCONST_DBL(-1.0f);
11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             }
11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else {
11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* Both CalcLdInt and CalcLdData can be used!
11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 * No offset has to be subtracted, because sfbNActiveLinesLdData
11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 * is shorted while thrFactor calculation */
11947ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] = CalcLdInt(peChanData->sfbNActiveLines[sfbGrp+sfb]);
11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             }
11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             if ( ((ahFlag[elementId][ch][sfbGrp+sfb] < AH_ACTIVE) || (deltaPe > 0)) &&
11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   peChanData->sfbNActiveLines[sfbGrp+sfb] != 0 )
11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             {
11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (thrExp[elementId][ch][sfbGrp+sfb] > -redVal[elementId]) {
12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   /* sfbPeFactors[ch][sfbGrp+sfb] = peChanData->sfbNActiveLines[sfbGrp+sfb] /
12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     (thrExp[elementId][ch][sfbGrp+sfb] + redVal[elementId]); */
12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   int minScale = fixMin(CountLeadingBits(thrExp[elementId][ch][sfbGrp+sfb]), CountLeadingBits(redVal[elementId]) - (DFRACT_BITS-1-redValScaling[elementId]) ) - 1;
12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   /* sumld = ld64( sfbThrExp + redVal ) */
12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   FIXP_DBL sumLd = CalcLdData(scaleValue(thrExp[elementId][ch][sfbGrp+sfb], minScale) + scaleValue(redVal[elementId], (DFRACT_BITS-1-redValScaling[elementId])+minScale))
12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               - (FIXP_DBL)(minScale<<(DFRACT_BITS-1-LD_DATA_SHIFT));
12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   if (sumLd < FL2FXCONST_DBL(0.f)) {
12117ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                      sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] - sumLd;
12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   else {
12147ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                     if ( sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] > (FL2FXCONST_DBL(-1.f) + sumLd) ) {
12157ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                       sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] - sumLd;
12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     }
12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     else {
12187ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                      sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb];
12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     }
12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   normFactorInt += (INT)CalcInvLdData(sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb]);
12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                else sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = FL2FXCONST_DBL(1.0f);
12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             }
12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             else sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = FL2FXCONST_DBL(-1.0f);
12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* normFactorLdData = ld64(deltaPe/normFactorInt) */
12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   normFactorLdData = CalcLdData((FIXP_DBL)((deltaPe<0) ? (-deltaPe) : (deltaPe))) - CalcLdData((FIXP_DBL)normFactorInt);
12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* distribute the pe difference to the scalefactors
12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      and calculate the according thresholds */
12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(elementId=elementOffset;elementId<nElements;elementId++) {
12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutChan = qcElement[elementId]->qcOutChannel[ch];
12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          psyOutChan = psyOutElement[elementId]->psyOutChannel[ch];
12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          peChanData = &qcElement[elementId]->peData.peChannelData[ch];
12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (peChanData->sfbNActiveLines[sfbGrp+sfb] > 0) {
12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 /* pe difference for this sfb */
12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 if ( (sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb]==FL2FXCONST_DBL(-1.0f)) ||
12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      (deltaPe==0) )
12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 {
12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   thrFactorLdData = FL2FXCONST_DBL(0.f);
12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 else {
12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   /* new threshold */
12597ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                   FIXP_DBL tmp = CalcInvLdData(sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] + normFactorLdData - sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] - FL2FXCONST_DBL((float)LD_DATA_SHIFT/LD_DATA_SCALING));
12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   /* limit thrFactor to 60dB */
12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   tmp = (deltaPe<0) ? tmp : (-tmp);
12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   thrFactorLdData = FDKmin(tmp, FL2FXCONST_DBL(20.f/LD_DATA_SCALING));
12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 /* new threshold */
12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 sfbThrLdData = qcOutChan->sfbThresholdLdData[sfbGrp+sfb];
12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 sfbEnLdData  = qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb];
12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 if (thrFactorLdData < FL2FXCONST_DBL(0.f)) {
12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   if( sfbThrLdData > (FL2FXCONST_DBL(-1.f)-thrFactorLdData) ) {
12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     sfbThrReducedLdData = sfbThrLdData + thrFactorLdData;
12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   else {
12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     sfbThrReducedLdData = FL2FXCONST_DBL(-1.f);
12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 else{
12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sfbThrReducedLdData = sfbThrLdData + thrFactorLdData;
12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 /* avoid hole */
12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 if ( (sfbThrReducedLdData - sfbEnLdData > qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]) &&
12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      (ahFlag[elementId][ch][sfbGrp+sfb] == AH_INACTIVE) )
12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 {
12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* sfbThrReduced = max(psyOutChan[ch]->sfbMinSnr[i] * sfbEn, sfbThr); */
12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    if ( sfbEnLdData > (sfbThrLdData-qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]) ) {
12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        sfbThrReducedLdData = qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + sfbEnLdData;
12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    else {
12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        sfbThrReducedLdData = sfbThrLdData;
12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    ahFlag[elementId][ch][sfbGrp+sfb] = AH_ACTIVE;
12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 }
12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = sfbThrReducedLdData;
12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_reduceMinSnr
13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  if the desired pe can not be reached, reduce pe by
13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  reducing minSnr
13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_reduceMinSnr(CHANNEL_MAPPING* cm,
1311fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                            QC_OUT_ELEMENT*  qcElement[(8)],
1312fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                            PSY_OUT_ELEMENT* psyOutElement[(8)],
1313fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                            UCHAR            ahFlag[(8)][(2)][MAX_GROUPED_SFB],
13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            const            INT desiredPe,
13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            INT*             redPeGlobal,
13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            const            INT processElements,
13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            const            INT elementOffset)
13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT elementId;
13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT nElements = elementOffset+processElements;
13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT newGlobalPe = *redPeGlobal;
13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for(elementId=elementOffset;elementId<nElements;elementId++) {
13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT ch;
13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT maxSfbPerGroup[2];
13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT sfbCnt[2];
13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT sfbPerGroup[2];
13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         maxSfbPerGroup[ch] = psyOutElement[elementId]->psyOutChannel[ch]->maxSfbPerGroup-1;
13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbCnt[ch]         = psyOutElement[elementId]->psyOutChannel[ch]->sfbCnt;
13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         sfbPerGroup[ch]    = psyOutElement[elementId]->psyOutChannel[ch]->sfbPerGroup;
13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       PE_DATA *peData = &qcElement[elementId]->peData;
13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       do
13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       {
13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT sfb, sfbGrp;
13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            QC_OUT_CHANNEL  *qcOutChan = qcElement[elementId]->qcOutChannel[ch];
13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT noReduction = 1;
13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (maxSfbPerGroup[ch]>=0) {  /* sfb in next channel */
13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              INT deltaPe = 0;
13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfb = maxSfbPerGroup[ch]--;
13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              noReduction = 0;
13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              for (sfbGrp = 0; sfbGrp < sfbCnt[ch]; sfbGrp += sfbPerGroup[ch]) {
13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (ahFlag[elementId][ch][sfbGrp+sfb] != NO_AH &&
13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] < SnrLdFac)
13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                {
13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* increase threshold to new minSnr of 1dB */
13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] = SnrLdFac;
13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* sfbThrReduced = max(psyOutChan[ch]->sfbMinSnr[i] * sfbEn, sfbThr); */
13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if ( qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb] >= qcOutChan->sfbThresholdLdData[sfbGrp+sfb] - qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] ) {
13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb] + qcOutChan->sfbMinSnrLdData[sfbGrp+sfb];
13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     /* calc new pe */
13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     /* C2 + C3*ld(1/0.8) = 1.5 */
13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     deltaPe -= (peData->peChannelData[ch].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT);
13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     /* sfbPe = 1.5 * sfbNLines */
13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     peData->peChannelData[ch].sfbPe[sfbGrp+sfb] = (3*peData->peChannelData[ch].sfbNLines[sfbGrp+sfb]) << (PE_CONSTPART_SHIFT-1);
13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     deltaPe += (peData->peChannelData[ch].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT);
13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   }
13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              } /* sfbGrp loop */
13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              peData->pe += deltaPe;
13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              peData->peChannelData[ch].pe += deltaPe;
13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              newGlobalPe += deltaPe;
13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* stop if enough has been saved */
13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (peData->pe <= desiredPe) {
13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                goto bail;
13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* sfb > 0 */
13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( (ch==(cm->elInfo[elementId].nChannelsInEl-1)) && noReduction ) {
13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              goto bail;
13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         } /* ch loop */
13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } while ( peData->pe > desiredPe);
13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* != ID_DSE */
13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   } /* element loop */
13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* update global PE */
14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   *redPeGlobal = newGlobalPe;
14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_allowMoreHoles
14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  if the desired pe can not be reached, some more scalefactor
14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  bands have to be quantized to zero
14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_allowMoreHoles(CHANNEL_MAPPING* cm,
1413fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                           QC_OUT_ELEMENT*  qcElement[(8)],
1414fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                           PSY_OUT_ELEMENT* psyOutElement[(8)],
1415fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                           ATS_ELEMENT*     AdjThrStateElement[(8)],
1416fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                           UCHAR            ahFlag[(8)][(2)][MAX_GROUPED_SFB],
14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           const INT        desiredPe,
14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           const INT        currentPe,
14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           const int        processElements,
14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           const int        elementOffset)
14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT elementId;
14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT nElements = elementOffset+processElements;
14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT actPe = currentPe;
14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (actPe <= desiredPe) {
14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return; /* nothing to do */
14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (elementId = elementOffset;elementId<nElements;elementId++) {
14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (cm->elInfo[elementId].elType != ID_DSE) {
14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT ch, sfb, sfbGrp;
14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PE_DATA *peData = &qcElement[elementId]->peData;
14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      const INT nChannels = cm->elInfo[elementId].nChannelsInEl;
14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_OUT_CHANNEL*  qcOutChannel[(2)] = {NULL};
14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PSY_OUT_CHANNEL* psyOutChannel[(2)] = {NULL};
14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch=0; ch<nChannels; ch++) {
14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* init pointers */
14442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        qcOutChannel[ch] = qcElement[elementId]->qcOutChannel[ch];
14452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        psyOutChannel[ch] = psyOutElement[elementId]->psyOutChannel[ch];
14462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for(sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+= psyOutChannel[ch]->sfbPerGroup) {
14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (sfb=psyOutChannel[ch]->maxSfbPerGroup; sfb<psyOutChannel[ch]->sfbPerGroup; sfb++) {
14492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            peData->peChannelData[ch].sfbPe[sfbGrp+sfb] = 0;
14502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
14512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
14532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* for MS allow hole in the channel with less energy */
14552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( nChannels==2 && psyOutChannel[0]->lastWindowSequence==psyOutChannel[1]->lastWindowSequence ) {
14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (sfb=0; sfb<psyOutChannel[0]->maxSfbPerGroup; sfb++) {
14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for(sfbGrp=0; sfbGrp < psyOutChannel[0]->sfbCnt; sfbGrp+=psyOutChannel[0]->sfbPerGroup) {
14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (psyOutElement[elementId]->toolsInfo.msMask[sfbGrp+sfb]) {
14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              FIXP_DBL EnergyLd_L = qcOutChannel[0]->sfbWeightedEnergyLdData[sfbGrp+sfb];
14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              FIXP_DBL EnergyLd_R = qcOutChannel[1]->sfbWeightedEnergyLdData[sfbGrp+sfb];
14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* allow hole in side channel ? */
14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if ( (ahFlag[elementId][1][sfbGrp+sfb] != NO_AH) &&
14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   (((FL2FXCONST_DBL(-0.02065512648f)>>1) + (qcOutChannel[0]->sfbMinSnrLdData[sfbGrp+sfb]>>1))
14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        > ((EnergyLd_R>>1) - (EnergyLd_L>>1))) )
14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  ahFlag[elementId][1][sfbGrp+sfb] = NO_AH;
14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChannel[1]->sfbThresholdLdData[sfbGrp+sfb] = FL2FXCONST_DBL(0.015625f) + EnergyLd_R;
14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  actPe -= peData->peChannelData[1].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT;
14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* allow hole in mid channel ? */
14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              else if ( (ahFlag[elementId][0][sfbGrp+sfb] != NO_AH) &&
14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        (((FL2FXCONST_DBL(-0.02065512648f)>>1) + (qcOutChannel[1]->sfbMinSnrLdData[sfbGrp+sfb]>>1))
14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             > ((EnergyLd_L>>1) - (EnergyLd_R>>1))) )
14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  ahFlag[elementId][0][sfbGrp+sfb] = NO_AH;
14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChannel[0]->sfbThresholdLdData[sfbGrp+sfb] = FL2FXCONST_DBL(0.015625f) + EnergyLd_L;
14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  actPe -= peData->peChannelData[0].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT;
14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              } /* if (ahFlag) */
14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* if MS */
14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          } /* sfbGrp */
14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (actPe <= desiredPe) {
14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return; /* stop if enough has been saved */
14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } /* sfb */
14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* MS possible ? */
14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* more holes necessary? subsequently erase bands
14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         starting with low energies */
14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT startSfb[2];
14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL avgEnLD64,minEnLD64;
14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT ahCnt;
14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL ahCntLD64;
14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT enIdx;
14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL enLD64[4];
14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL avgEn;
14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* do not go below startSfb */
15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch=0; ch<nChannels; ch++) {
15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (psyOutChannel[ch]->lastWindowSequence != SHORT_WINDOW)
15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          startSfb[ch] = AdjThrStateElement[elementId]->ahParam.startSfbL;
15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else
15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          startSfb[ch] = AdjThrStateElement[elementId]->ahParam.startSfbS;
15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* calc avg and min energies of bands that avoid holes */
15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      avgEn = FL2FXCONST_DBL(0.0f);
15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      minEnLD64 = FL2FXCONST_DBL(0.0f);
15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ahCnt = 0;
15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch=0; ch<nChannels; ch++) {
15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfbGrp=0;
15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sfb=startSfb[ch];
15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        do {
15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ((ahFlag[elementId][ch][sfbGrp+sfb]!=NO_AH) &&
15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                (qcOutChannel[ch]->sfbWeightedEnergyLdData[sfbGrp+sfb] > qcOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb])){
15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              minEnLD64 = fixMin(minEnLD64,qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb]);
15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              avgEn += qcOutChannel[ch]->sfbEnergy[sfbGrp+sfb] >> 6;
15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              ahCnt++;
15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfbGrp += psyOutChannel[ch]->sfbPerGroup;
15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfb=0;
15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } while (sfbGrp < psyOutChannel[ch]->sfbCnt);
15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (avgEn == FL2FXCONST_DBL(0.0f)) || (ahCnt == 0) ) {
15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        avgEnLD64 = FL2FXCONST_DBL(0.0f);
15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
15372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        avgEnLD64 = CalcLdData(avgEn);
15382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ahCntLD64 = CalcLdInt(ahCnt);
15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        avgEnLD64 = avgEnLD64 + FL2FXCONST_DBL(0.09375f) - ahCntLD64; /* compensate shift with 6 */
15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* calc some energy borders between minEn and avgEn */
15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* for (enIdx=0; enIdx<4; enIdx++) */
15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* en[enIdx] = minEn * (float)FDKpow(avgEn/(minEn+FLT_MIN), (2*enIdx+1)/7.0f); */
15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      enLD64[0] = minEnLD64 + fMult((avgEnLD64-minEnLD64),FL2FXCONST_DBL(0.14285714285f));
15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      enLD64[1] = minEnLD64 + fMult((avgEnLD64-minEnLD64),FL2FXCONST_DBL(0.42857142857f));
15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      enLD64[2] = minEnLD64 + fMult((avgEnLD64-minEnLD64),FL2FXCONST_DBL(0.71428571428f));
15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      enLD64[3] = minEnLD64 + (avgEnLD64-minEnLD64);
15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (enIdx=0; enIdx<4; enIdx++) {
15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT noReduction = 1;
15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT maxSfbPerGroup[2];
15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT sfbCnt[2];
15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT sfbPerGroup[2];
15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          maxSfbPerGroup[ch] = psyOutElement[elementId]->psyOutChannel[ch]->maxSfbPerGroup-1;
15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfbCnt[ch]         = psyOutElement[elementId]->psyOutChannel[ch]->sfbCnt;
15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sfbPerGroup[ch]    = psyOutElement[elementId]->psyOutChannel[ch]->sfbPerGroup;
15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        do {
15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          noReduction = 1;
15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for(ch=0; ch<cm->elInfo[elementId].nChannelsInEl; ch++) {
15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT sfb, sfbGrp;
15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* start with lowest energy border at highest sfb */
15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (maxSfbPerGroup[ch]>=startSfb[ch]) {  /* sfb in next channel */
15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sfb = maxSfbPerGroup[ch]--;
15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              noReduction = 0;
15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              for (sfbGrp = 0; sfbGrp < sfbCnt[ch]; sfbGrp += sfbPerGroup[ch]) {
15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* sfb energy below border ? */
15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (ahFlag[elementId][ch][sfbGrp+sfb] != NO_AH && qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb] < enLD64[enIdx]) {
15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* allow hole */
15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  ahFlag[elementId][ch][sfbGrp+sfb] = NO_AH;
15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  qcOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb] = FL2FXCONST_DBL(0.015625f) + qcOutChannel[ch]->sfbWeightedEnergyLdData[sfbGrp+sfb];
15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  actPe -= peData->peChannelData[ch].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT;
15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              } /* sfbGrp  */
15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (actPe <= desiredPe) {
15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                return; /* stop if enough has been saved */
15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* sfb > 0 */
15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          } /* ch loop */
15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } while( (noReduction == 0) && (actPe > desiredPe) );
15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (actPe <= desiredPe) {
15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return; /* stop if enough has been saved */
15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* enIdx loop */
15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* EOF DSE-suppression */
16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* EOF for all elements... */
16022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
16042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* reset avoid hole flags from AH_ACTIVE to AH_INACTIVE  */
16062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_resetAHFlags( UCHAR ahFlag[(2)][MAX_GROUPED_SFB],
16072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const int nChannels,
16082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          PSY_OUT_CHANNEL  *psyOutChannel[(2)])
16092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
16102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int ch, sfb, sfbGrp;
16112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(ch=0; ch<nChannels; ch++) {
16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( ahFlag[ch][sfbGrp+sfb] == AH_ACTIVE) {
16162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ahFlag[ch][sfbGrp+sfb] = AH_INACTIVE;
16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
16192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL CalcRedValPower(FIXP_DBL num,
16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                FIXP_DBL denum,
16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT*     scaling )
16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
16282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL value = FL2FXCONST_DBL(0.f);
16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (num>=FL2FXCONST_DBL(0.f)) {
16312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      value = fDivNorm( num, denum, scaling);
16322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
16342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      value = -fDivNorm( -num, denum, scaling);
16352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    value = f2Pow(value, *scaling, scaling);
16372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *scaling = DFRACT_BITS-1-*scaling;
16382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return value;
16402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
16412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
16442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_adaptThresholdsToPe
16452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  two guesses for the reduction value and one final correction of the thresholds
16462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
16472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_adaptThresholdsToPe(CHANNEL_MAPPING*  cm,
1648fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                ATS_ELEMENT*      AdjThrStateElement[(8)],
1649fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                QC_OUT_ELEMENT*   qcElement[(8)],
1650fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                PSY_OUT_ELEMENT*  psyOutElement[(8)],
16512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT         desiredPe,
16522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT         processElements,
16532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                const INT         elementOffset)
16542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1655fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi   FIXP_DBL redValue[(8)];
1656fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi   SCHAR    redValScaling[(8)];
1657fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi   UCHAR    pAhFlag[(8)][(2)][MAX_GROUPED_SFB];
1658fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi   FIXP_DBL pThrExp[(8)][(2)][MAX_GROUPED_SFB];
16592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   int iter;
16602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT constPartGlobal, noRedPeGlobal, nActiveLinesGlobal, redPeGlobal;
16622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   constPartGlobal = noRedPeGlobal = nActiveLinesGlobal = redPeGlobal = 0;
16632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   int elementId;
16652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   int nElements = elementOffset+processElements;
16672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if(nElements > cm->nElements) {
16682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     nElements = cm->nElements;
16692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
16702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ------------------------------------------------------- */
16722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Part I: Initialize data structures and variables... */
16732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ------------------------------------------------------- */
16742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for (elementId = elementOffset;elementId<nElements;elementId++) {
16752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
16762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT nChannels = cm->elInfo[elementId].nChannelsInEl;
16782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       PE_DATA *peData    = &qcElement[elementId]->peData;
16792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* thresholds to the power of redExp */
16812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_calcThreshExp(pThrExp[elementId], qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, nChannels);
16822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* lower the minSnr requirements for low energies compared to the average
16842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          energy in this frame */
16852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_adaptMinSnr(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, &AdjThrStateElement[elementId]->minSnrAdaptParam, nChannels);
16862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */
16882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_initAvoidHoleFlag(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, pAhFlag[elementId], &psyOutElement[elementId]->toolsInfo, nChannels, peData, &AdjThrStateElement[elementId]->ahParam);
16892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* sum up */
16912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       constPartGlobal    += peData->constPart;
16922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       noRedPeGlobal      += peData->pe;
16932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       nActiveLinesGlobal += fixMax((INT)peData->nActiveLines, 1);
16942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF DSE-suppression */
16962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   } /* EOF for all elements... */
16972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ----------------------------------------------------------------------- */
16992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Part II: Calculate bit consumption of initial bit constraints setup */
17002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ----------------------------------------------------------------------- */
17012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   for (elementId = elementOffset;elementId<nElements;elementId++) {
17022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (cm->elInfo[elementId].elType != ID_DSE) {
17032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /*
17042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       redVal = ( 2 ^ ( (constPartGlobal-desiredPe) / (invRedExp*nActiveLinesGlobal) )
17052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                - 2 ^ ( (constPartGlobal-noRedPeGlobal) / (invRedExp*nActiveLinesGlobal) ) )
17062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       */
17072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       INT nChannels = cm->elInfo[elementId].nChannelsInEl;
17102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       PE_DATA *peData    = &qcElement[elementId]->peData;
17112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* first guess of reduction value */
17132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       int scale0=0, scale1=0;
17142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FIXP_DBL tmp0 = CalcRedValPower( constPartGlobal-desiredPe, 4*nActiveLinesGlobal, &scale0 );
17152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FIXP_DBL tmp1 = CalcRedValPower( constPartGlobal-noRedPeGlobal, 4*nActiveLinesGlobal, &scale1 );
17162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       int scalMin = FDKmin(scale0, scale1)-1;
17182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       redValue[elementId]  = scaleValue(tmp0,(scalMin-scale0)) - scaleValue(tmp1,(scalMin-scale1));
17202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       redValScaling[elementId] = scalMin;
17212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* reduce thresholds */
17232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_reduceThresholdsCBR(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, pAhFlag[elementId], pThrExp[elementId], nChannels, redValue[elementId], redValScaling[elementId]);
17242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* pe after first guess */
17262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FDKaacEnc_calcPe(psyOutElement[elementId]->psyOutChannel, qcElement[elementId]->qcOutChannel, peData, nChannels);
17272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       redPeGlobal += peData->pe;
17292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF DSE-suppression */
17302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   } /* EOF for all elements... */
17312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* -------------------------------------------------- */
17332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Part III: Iterate until bit constraints are met */
17342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* -------------------------------------------------- */
17352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   iter = 0;
17362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   while ((fixp_abs(redPeGlobal - desiredPe) > fMultI(FL2FXCONST_DBL(0.05f),desiredPe)) && (iter < 1)) {
17372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     INT desiredPeNoAHGlobal;
17392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     INT redPeNoAHGlobal = 0;
17402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     INT constPartNoAHGlobal = 0;
17412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     INT nActiveLinesNoAHGlobal = 0;
17422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for (elementId = elementOffset;elementId<nElements;elementId++) {
17442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (cm->elInfo[elementId].elType != ID_DSE) {
17452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         INT redPeNoAH, constPartNoAH, nActiveLinesNoAH;
17472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         INT nChannels = cm->elInfo[elementId].nChannelsInEl;
17482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         PE_DATA *peData    = &qcElement[elementId]->peData;
17492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* pe for bands where avoid hole is inactive */
17512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FDKaacEnc_FDKaacEnc_calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH,
17522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    peData, pAhFlag[elementId], psyOutElement[elementId]->psyOutChannel, nChannels);
17532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         redPeNoAHGlobal += redPeNoAH;
17552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         constPartNoAHGlobal += constPartNoAH;
17562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         nActiveLinesNoAHGlobal += nActiveLinesNoAH;
17572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } /* EOF DSE-suppression */
17582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF for all elements... */
17592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* Calculate new redVal ... */
17612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if(desiredPe < redPeGlobal) {
17622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* new desired pe without bands where avoid hole is active */
17642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       desiredPeNoAHGlobal = desiredPe - (redPeGlobal - redPeNoAHGlobal);
17652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* limit desiredPeNoAH to positive values, as the PE can not become negative */
17672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       desiredPeNoAHGlobal = FDKmax(0,desiredPeNoAHGlobal);
17682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* second guess (only if there are bands left where avoid hole is inactive)*/
17702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (nActiveLinesNoAHGlobal > 0) {
17712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         for (elementId = elementOffset;elementId<nElements;elementId++) {
17722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           if (cm->elInfo[elementId].elType != ID_DSE) {
17732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             /*
17742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             redVal += ( 2 ^ ( (constPartNoAHGlobal-desiredPeNoAHGlobal) / (invRedExp*nActiveLinesNoAHGlobal) )
17752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       - 2 ^ ( (constPartNoAHGlobal-redPeNoAHGlobal) / (invRedExp*nActiveLinesNoAHGlobal) ) )
17762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             */
17772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             int scale0 = 0;
17782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             int scale1 = 0;
17792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL tmp0 = CalcRedValPower( constPartNoAHGlobal-desiredPeNoAHGlobal, 4*nActiveLinesNoAHGlobal, &scale0 );
17812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             FIXP_DBL tmp1 = CalcRedValPower( constPartNoAHGlobal-redPeNoAHGlobal, 4*nActiveLinesNoAHGlobal, &scale1 );
17822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             int scalMin = FDKmin(scale0, scale1)-1;
17842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             tmp0 = scaleValue(tmp0,(scalMin-scale0)) - scaleValue(tmp1,(scalMin-scale1));
17862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             scale0 = scalMin;
17872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             /* old reduction value */
17892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             tmp1 = redValue[elementId];
17902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             scale1 = redValScaling[elementId];
17912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             scalMin = fixMin(scale0,scale1)-1;
17932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             /* sum up old and new reduction value */
17952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             redValue[elementId] = scaleValue(tmp0,(scalMin-scale0)) + scaleValue(tmp1,(scalMin-scale1));
17962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             redValScaling[elementId] = scalMin;
17972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           } /* EOF DSE-suppression */
17992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         } /* EOF for all elements... */
18002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } /* nActiveLinesNoAHGlobal > 0 */
18012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
18022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     else {
18032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* desiredPe >= redPeGlobal */
18042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (elementId = elementOffset;elementId<nElements;elementId++) {
18052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (cm->elInfo[elementId].elType != ID_DSE) {
18062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT redVal_scale = 0;
18082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FIXP_DBL tmp = fDivNorm((FIXP_DBL)redPeGlobal, (FIXP_DBL)desiredPe, &redVal_scale);
18092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* redVal *= redPeGlobal/desiredPe; */
18112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            redValue[elementId] = fMult(redValue[elementId], tmp);
18122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            redValScaling[elementId] -= redVal_scale;
18132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDKaacEnc_resetAHFlags(pAhFlag[elementId], cm->elInfo[elementId].nChannelsInEl, psyOutElement[elementId]->psyOutChannel);
18152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          } /* EOF DSE-suppression */
18162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } /* EOF for all elements... */
18172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
18182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     redPeGlobal = 0;
18202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* Calculate new redVal's PE... */
18212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for (elementId = elementOffset;elementId<nElements;elementId++) {
18222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (cm->elInfo[elementId].elType != ID_DSE) {
18232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         INT nChannels = cm->elInfo[elementId].nChannelsInEl;
18252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         PE_DATA *peData    = &qcElement[elementId]->peData;
18262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* reduce thresholds */
18282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FDKaacEnc_reduceThresholdsCBR(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, pAhFlag[elementId], pThrExp[elementId], nChannels, redValue[elementId], redValScaling[elementId]);
18292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* pe after second guess */
18312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FDKaacEnc_calcPe(psyOutElement[elementId]->psyOutChannel, qcElement[elementId]->qcOutChannel, peData, nChannels);
18322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         redPeGlobal += peData->pe;
18332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } /* EOF DSE-suppression */
18352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF for all elements... */
18362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     iter++;
18382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   } /* EOF while */
18392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ------------------------------------------------------- */
18422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Part IV: if still required, further reduce constraints  */
18432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* ------------------------------------------------------- */
18442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /*                  1.0*        1.15*       1.20*
18452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *               desiredPe   desiredPe   desiredPe
18462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *                   |           |           |
18472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * ...XXXXXXXXXXXXXXXXXXXXXXXXXXX|           |
18482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *                   |           |           |XXXXXXXXXXX...
18492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *                   |           |XXXXXXXXXXX|
18502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *            --- A ---          | --- B --- | --- C ---
18512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *
18522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * (X): redPeGlobal
18532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * (A): FDKaacEnc_correctThresh()
18542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * (B): FDKaacEnc_allowMoreHoles()
18552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    * (C): FDKaacEnc_reduceMinSnr()
18562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   */
18572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* correct thresholds to get closer to the desired pe */
18592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if ( redPeGlobal > desiredPe ) {
18602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     FDKaacEnc_correctThresh(cm, qcElement, psyOutElement, pAhFlag, pThrExp, redValue, redValScaling,
18612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   desiredPe - redPeGlobal, processElements, elementOffset);
18622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* update PE */
18642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     redPeGlobal = 0;
18652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     for(elementId=elementOffset;elementId<nElements;elementId++) {
18662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (cm->elInfo[elementId].elType != ID_DSE) {
18672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         INT nChannels = cm->elInfo[elementId].nChannelsInEl;
18692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         PE_DATA *peData    = &qcElement[elementId]->peData;
18702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* pe after correctThresh */
18722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FDKaacEnc_calcPe(psyOutElement[elementId]->psyOutChannel, qcElement[elementId]->qcOutChannel, peData, nChannels);
18732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         redPeGlobal += peData->pe;
18742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } /* EOF DSE-suppression */
18762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     } /* EOF for all elements... */
18772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
18782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if ( redPeGlobal > desiredPe ) {
18802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* reduce pe by reducing minSnr requirements */
18812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     FDKaacEnc_reduceMinSnr(cm, qcElement, psyOutElement, pAhFlag,
18822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            (fMultI(FL2FXCONST_DBL(0.15f),desiredPe) + desiredPe),
18832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            &redPeGlobal, processElements, elementOffset);
18842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* reduce pe by allowing additional spectral holes */
18862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     FDKaacEnc_allowMoreHoles(cm, qcElement, psyOutElement, AdjThrStateElement, pAhFlag,
18872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    desiredPe, redPeGlobal, processElements, elementOffset);
18882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
18892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
18912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* similar to FDKaacEnc_adaptThresholdsToPe(), for  VBR-mode */
18932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_AdaptThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)],
18942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               PSY_OUT_CHANNEL* psyOutChannel[(2)],
18952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               ATS_ELEMENT* AdjThrStateElement,
18962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               struct TOOLSINFO *toolsInfo,
18972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               PE_DATA *peData,
18982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               const INT nChannels)
18992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
19007ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   UCHAR    (*pAhFlag)[MAX_GROUPED_SFB];
19017ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   FIXP_DBL (*pThrExp)[MAX_GROUPED_SFB];
19027ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
19037ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   /* allocate scratch memory */
19047ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   C_ALLOC_SCRATCH_START(_pAhFlag, UCHAR, (2)*MAX_GROUPED_SFB)
19057ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   C_ALLOC_SCRATCH_START(_pThrExp, FIXP_DBL, (2)*MAX_GROUPED_SFB)
19067ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   pAhFlag = (UCHAR(*)[MAX_GROUPED_SFB])_pAhFlag;
19077ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   pThrExp = (FIXP_DBL(*)[MAX_GROUPED_SFB])_pThrExp;
19082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* thresholds to the power of redExp */
19102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FDKaacEnc_calcThreshExp(pThrExp, qcOutChannel, psyOutChannel, nChannels);
19112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* lower the minSnr requirements for low energies compared to the average
19132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      energy in this frame */
19142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FDKaacEnc_adaptMinSnr(qcOutChannel, psyOutChannel, &AdjThrStateElement->minSnrAdaptParam, nChannels);
19152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */
19172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FDKaacEnc_initAvoidHoleFlag(qcOutChannel, psyOutChannel, pAhFlag, toolsInfo,
19182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     nChannels, peData, &AdjThrStateElement->ahParam);
19192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* reduce thresholds */
19212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FDKaacEnc_reduceThresholdsVBR(qcOutChannel, psyOutChannel, pAhFlag, pThrExp, nChannels,
19222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       AdjThrStateElement->vbrQualFactor,
19232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       &AdjThrStateElement->chaosMeasureOld);
19242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19257ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   /* free scratch memory */
19267ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   C_ALLOC_SCRATCH_END(_pThrExp, FIXP_DBL, (2)*MAX_GROUPED_SFB)
19277ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi   C_ALLOC_SCRATCH_END(_pAhFlag, UCHAR, (2)*MAX_GROUPED_SFB)
19282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
19292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
19322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  functionname: FDKaacEnc_calcBitSave
19342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  description:  Calculates percentage of bit save, see figure below
19352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  returns:
19362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  input:        parameters and bitres-fullness
19372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  output:       percentage of bit save
19382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
19402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
19412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitsave
19422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    maxBitSave(%)|   clipLow
19432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |---\
19442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |    \
19452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |     \
19462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |      \
19472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |       \
19482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |--------\--------------> bitres
19492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |         \
19502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    minBitSave(%)|          \------------
19512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          clipHigh      maxBitres
19522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
19532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL FDKaacEnc_calcBitSave(FIXP_DBL fillLevel,
19542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL clipLow,
19552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL clipHigh,
19562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL minBitSave,
19572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL maxBitSave,
19582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL bitsave_slope)
19592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
19602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitsave;
19612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fillLevel = fixMax(fillLevel, clipLow);
19632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fillLevel = fixMin(fillLevel, clipHigh);
19642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitsave = maxBitSave - fMult((fillLevel-clipLow), bitsave_slope);
19662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return (bitsave);
19682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
19692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
19712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  functionname: FDKaacEnc_calcBitSpend
19732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  description:  Calculates percentage of bit spend, see figure below
19742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  returns:
19752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  input:        parameters and bitres-fullness
19762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  output:       percentage of bit spend
19772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
19792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
19802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              bitspend      clipHigh
19812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   maxBitSpend(%)|          /-----------maxBitres
19822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |         /
19832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |        /
19842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |       /
19852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |      /
19862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |     /
19872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |----/-----------------> bitres
19882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |   /
19892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   minBitSpend(%)|--/
19902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   clipLow
19912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
19922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL FDKaacEnc_calcBitSpend(FIXP_DBL fillLevel,
19932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL clipLow,
19942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL clipHigh,
19952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL minBitSpend,
19962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL maxBitSpend,
19972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL bitspend_slope)
19982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
19992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitspend;
20002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fillLevel = fixMax(fillLevel, clipLow);
20022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fillLevel = fixMin(fillLevel, clipHigh);
20032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitspend = minBitSpend + fMult(fillLevel-clipLow, bitspend_slope);
20052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return (bitspend);
20072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
20082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
20112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  functionname: FDKaacEnc_adjustPeMinMax()
20132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  description:  adjusts peMin and peMax parameters over time
20142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  returns:
20152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  input:        current pe, peMin, peMax, bitres size
20162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  output:       adjusted peMin/peMax
20172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
20192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_adjustPeMinMax(const INT currPe,
20202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT      *peMin,
20212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT      *peMax)
20222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
20232228e360595641dd906bf1773307f43d304f5b2The 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);
20242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT diff;
20252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT minDiff_fix = fMultI(FL2FXCONST_DBL(0.1666666667f), currPe);
20272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (currPe > *peMax)
20292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
20302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        diff = (currPe-*peMax) ;
20312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMin += fMultI(minFacHi,diff);
20322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMax += fMultI(maxFacHi,diff);
20332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
20342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (currPe < *peMin)
20352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
20362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        diff = (*peMin-currPe) ;
20372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMin -= fMultI(minFacLo,diff);
20382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMax -= fMultI(maxFacLo,diff);
20392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
20402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
20412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
20422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMin += fMultI(minFacHi, (currPe - *peMin));
20432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMax -= fMultI(maxFacLo, (*peMax - currPe));
20442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
20452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((*peMax - *peMin) < minDiff_fix)
20472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
20482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT peMax_fix = *peMax, peMin_fix = *peMin;
20492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FIXP_DBL partLo_fix, partHi_fix;
20502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        partLo_fix = (FIXP_DBL)fixMax(0, currPe - peMin_fix);
20522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        partHi_fix = (FIXP_DBL)fixMax(0, peMax_fix - currPe);
20532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        peMax_fix = (INT)(currPe + fMultI(fDivNorm(partHi_fix, (partLo_fix+partHi_fix)), minDiff_fix));
20552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        peMin_fix = (INT)(currPe - fMultI(fDivNorm(partLo_fix, (partLo_fix+partHi_fix)), minDiff_fix));
20562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        peMin_fix = fixMax(0, peMin_fix);
20572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMax = peMax_fix;
20592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *peMin = peMin_fix;
20602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
20612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
20622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
20662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  functionname: BitresCalcBitFac
20682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  description:  calculates factor of spending bits for one frame
20692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  1.0 : take all frame dynpart bits
20702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  >1.0 : take all frame dynpart bits + bitres
20712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <1.0 : put bits in bitreservoir
20722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  returns:      BitFac
20732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  input:        bitres-fullness, pe, blockType, parameter-settings
20742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  output:
20752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
20772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
20782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     bitfac(%)            pemax
20792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   bitspend(%)   |          /-----------maxBitres
20802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |         /
20812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |        /
20822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |       /
20832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |      /
20842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |     /
20852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |----/-----------------> pe
20862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 |   /
20872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   bitsave(%)    |--/
20882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    pemin
20892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
20902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL FDKaacEnc_bitresCalcBitFac(const INT       bitresBits,
20922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT        maxBitresBits,
20932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT        pe,
20942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT        lastWindowSequence,
20952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT        avgBits,
20962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL   maxBitFac,
20972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ADJ_THR_STATE   *AdjThr,
20982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ATS_ELEMENT     *adjThrChan)
20992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
21002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    BRES_PARAM *bresParam;
21012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT pex;
21022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT qmin, qbr, qbres, qmbr;
21042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitSave, bitSpend;
21052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitresFac_fix, tmp_cst, tmp_fix;
21072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL pe_pers, bits_ratio, maxBrVal;
21082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL bitsave_slope, bitspend_slope, maxBitFac_tmp;
21092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL fillLevel_fix = (FIXP_DBL)0x7fffffff;
21102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL UNITY = (FIXP_DBL)0x7fffffff;
21112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL POINT7 = (FIXP_DBL)0x5999999A;
21122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (maxBitresBits > bitresBits) {
21142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      fillLevel_fix = fDivNorm(bitresBits, maxBitresBits);
21152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (lastWindowSequence != SHORT_WINDOW)
21182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
21192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam = &(AdjThr->bresParamLong);
21202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitsave_slope = (FIXP_DBL)0x3BBBBBBC;
21212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitspend_slope = (FIXP_DBL)0x55555555;
21222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
21242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
21252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam = &(AdjThr->bresParamShort);
21262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitsave_slope = (FIXP_DBL)0x2E8BA2E9;
21272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitspend_slope = (FIXP_DBL)0x7fffffff;
21282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pex = fixMax(pe, adjThrChan->peMin);
21312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pex = fixMin(pex, adjThrChan->peMax);
21322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitSave = FDKaacEnc_calcBitSave(fillLevel_fix,
21342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam->clipSaveLow, bresParam->clipSaveHigh,
21352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam->minBitSave, bresParam->maxBitSave, bitsave_slope);
21362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitSpend = FDKaacEnc_calcBitSpend(fillLevel_fix,
21382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam->clipSpendLow, bresParam->clipSpendHigh,
21392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bresParam->minBitSpend, bresParam->maxBitSpend, bitspend_slope);
21402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pe_pers = fDivNorm(pex - adjThrChan->peMin, adjThrChan->peMax - adjThrChan->peMin);
21422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tmp_fix = fMult(((FIXP_DBL)bitSpend + (FIXP_DBL)bitSave), pe_pers);
21432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitresFac_fix = (UNITY>>1) - ((FIXP_DBL)bitSave>>1) + (tmp_fix>>1); qbres = (DFRACT_BITS-2);
21442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* (float)bitresBits/(float)avgBits */
21462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bits_ratio = fDivNorm(bitresBits, avgBits, &qbr);
21472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qbr = DFRACT_BITS-1-qbr;
21482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Add 0.7 in q31 to bits_ratio in qbr */
21502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* 0.7f + (float)bitresBits/(float)avgBits */
21512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qmin = fixMin(qbr, (DFRACT_BITS-1));
21522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bits_ratio = bits_ratio >> (qbr - qmin);
21532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tmp_cst = POINT7 >> ((DFRACT_BITS-1) - qmin);
21542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    maxBrVal = (bits_ratio>>1) + (tmp_cst>>1); qmbr = qmin - 1;
21552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* bitresFac_fix = fixMin(bitresFac_fix, 0.7 + bitresBits/avgBits); */
21572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitresFac_fix = bitresFac_fix >> (qbres - qmbr); qbres = qmbr;
21582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitresFac_fix = fixMin(bitresFac_fix, maxBrVal);
21592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Compare with maxBitFac */
21612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qmin = fixMin(Q_BITFAC, qbres);
21622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitresFac_fix = bitresFac_fix >> (qbres - qmin);
21632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    maxBitFac_tmp = maxBitFac >> (Q_BITFAC - qmin);
21642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if(maxBitFac_tmp < bitresFac_fix)
21652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
21662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitresFac_fix = maxBitFac;
21672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
21692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
21702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if(qmin < Q_BITFAC)
21712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
21722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            bitresFac_fix = bitresFac_fix << (Q_BITFAC-qmin);
21732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
21742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else
21752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
21762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            bitresFac_fix = bitresFac_fix >> (qmin-Q_BITFAC);
21772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
21782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKaacEnc_adjustPeMinMax(pe, &adjThrChan->peMin, &adjThrChan->peMax);
21812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return bitresFac_fix;
21832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
21842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
21872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_AdjThrNew
21882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  allocate ADJ_THR_STATE
21892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
21902228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT FDKaacEnc_AdjThrNew(ADJ_THR_STATE** phAdjThr,
21912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        INT             nElements)
21922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
21932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT err = 0;
21942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i;
21952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ADJ_THR_STATE* hAdjThr = GetRam_aacEnc_AdjustThreshold();
21962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAdjThr==NULL) {
21972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = 1;
21982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
21992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
22002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<nElements; i++) {
22022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAdjThr->adjThrStateElem[i] =  GetRam_aacEnc_AdjThrStateElement(i);
22032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAdjThr->adjThrStateElem[i]==NULL) {
22042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = 1;
22052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          goto bail;
22062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
22072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
22082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
22102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *phAdjThr = hAdjThr;
22112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
22122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
22132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
22162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_AdjThrInit
22172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  initialize ADJ_THR_STATE
22182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
22197ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivivoid FDKaacEnc_AdjThrInit(
22207ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        ADJ_THR_STATE   *hAdjThr,
22217ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT       meanPe,
2222fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi        ELEMENT_BITS    *elBits[(8)],
22237ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        INT             invQuant,
22247ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        INT             nElements,
22257ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        INT             nChannelsEff,
22267ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        INT             sampleRate,
22277ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        INT             advancedBitsToPe,
22287ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        FIXP_DBL        vbrQualFactor
22297ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        )
22302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
22317ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  INT i;
22327ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
22337ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  FIXP_DBL POINT8 = FL2FXCONST_DBL(0.8f);
22347ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  FIXP_DBL POINT6 = FL2FXCONST_DBL(0.6f);
22357ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
22367ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  /* common for all elements: */
22377ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  /* parameters for bitres control */
22387ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamLong.clipSaveLow   = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */
22397ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamLong.clipSaveHigh  = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */
22407ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamLong.minBitSave    = (FIXP_DBL)0xf999999a; /* FL2FXCONST_DBL(-0.05f); */
22417ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamLong.maxBitSave    = (FIXP_DBL)0x26666666; /* FL2FXCONST_DBL(0.3f); */
22427ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamLong.clipSpendLow  = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */
22437ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamLong.clipSpendHigh = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */
22447ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamLong.minBitSpend   = (FIXP_DBL)0xf3333333; /* FL2FXCONST_DBL(-0.10f); */
22457ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamLong.maxBitSpend   = (FIXP_DBL)0x33333333; /* FL2FXCONST_DBL(0.4f); */
22467ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
22477ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamShort.clipSaveLow   = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
22487ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamShort.clipSaveHigh  = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */
22497ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamShort.minBitSave    = (FIXP_DBL)0x00000000; /* FL2FXCONST_DBL(0.0f); */
22507ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamShort.maxBitSave    = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
22517ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamShort.clipSpendLow  = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
22527ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamShort.clipSpendHigh = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */
22537ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamShort.minBitSpend   = (FIXP_DBL)0xf9999998; /* FL2FXCONST_DBL(-0.05f); */
22547ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  hAdjThr->bresParamShort.maxBitSpend   = (FIXP_DBL)0x40000000; /* FL2FXCONST_DBL(0.5f); */
22557ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
22567ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  /* specific for each element: */
22577ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  for (i=0; i<nElements; i++) {
22587ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    ATS_ELEMENT* atsElem = hAdjThr->adjThrStateElem[i];
22597ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    MINSNR_ADAPT_PARAM *msaParam = &atsElem->minSnrAdaptParam;
22607ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    INT chBitrate = elBits[i]->chBitrateEl;
22612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* parameters for bitres control */
22637ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    atsElem->peMin = fMultI(POINT8, meanPe) >> 1;
22647ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    atsElem->peMax = fMultI(POINT6, meanPe);
22652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22667ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* for use in FDKaacEnc_reduceThresholdsVBR */
22677ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    atsElem->chaosMeasureOld = FL2FXCONST_DBL(0.3f);
22682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22697ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* additional pe offset to correct pe2bits for low bitrates */
22707ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    atsElem->peOffset = 0;
22712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22727ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* vbr initialisation */
22737ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    atsElem->vbrQualFactor = vbrQualFactor;
22747ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    if (chBitrate < 32000)
22757ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    {
22767ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      atsElem->peOffset = fixMax(50, 100-fMultI((FIXP_DBL)0x666667, chBitrate));
22777ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    }
22782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22797ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* avoid hole parameters */
22807ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    if (chBitrate > 20000) {
22817ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      atsElem->ahParam.modifyMinSnr = TRUE;
22827ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      atsElem->ahParam.startSfbL = 15;
22837ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      atsElem->ahParam.startSfbS = 3;
22847ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    }
22857ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    else {
22867ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      atsElem->ahParam.modifyMinSnr = FALSE;
22877ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      atsElem->ahParam.startSfbL = 0;
22887ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      atsElem->ahParam.startSfbS = 0;
22897ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    }
22902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22917ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* minSnr adaptation */
22927ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    msaParam->maxRed = FL2FXCONST_DBL(0.00390625f); /* 0.25f/64.0f */
22937ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* start adaptation of minSnr for avgEn/sfbEn > startRatio */
22947ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    msaParam->startRatio = FL2FXCONST_DBL(0.05190512648f); /* ld64(10.0f) */
22957ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* maximum minSnr reduction to minSnr^maxRed is reached for
22967ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi       avgEn/sfbEn >= maxRatio */
22977ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* msaParam->maxRatio = 1000.0f; */
22987ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /*msaParam->redRatioFac = ((float)1.0f - msaParam->maxRed) / ((float)10.0f*log10(msaParam->startRatio/msaParam->maxRatio)/log10(2.0f)*(float)0.3010299956f);*/
22997ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    msaParam->redRatioFac = FL2FXCONST_DBL(-0.375f); /* -0.0375f * 10.0f */
23007ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /*msaParam->redOffs = (float)1.0f - msaParam->redRatioFac * (float)10.0f * log10(msaParam->startRatio)/log10(2.0f) * (float)0.3010299956f;*/
23017ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    msaParam->redOffs = FL2FXCONST_DBL(0.021484375); /* 1.375f/64.0f */
23027ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
23037ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* init pe correction */
23047ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    atsElem->peCorrectionFactor_m = FL2FXCONST_DBL(0.5f); /* 1.0 */
23057ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    atsElem->peCorrectionFactor_e = 1;
23067ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
23077ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    atsElem->dynBitsLast = -1;
23087ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    atsElem->peLast = 0;
23097ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
23107ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* init bits to pe factor */
23117ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
23127ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* init bits2PeFactor */
23137ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    FDKaacEnc_InitBits2PeFactor(
23147ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              &atsElem->bits2PeFactor_m,
23157ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              &atsElem->bits2PeFactor_e,
23167ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              chBitrate,       /* bitrate/channel*/
23177ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              nChannelsEff,    /* number of channels */
23187ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              sampleRate,
23197ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              advancedBitsToPe,
23207ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              invQuant
23217ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi              );
23227ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
23237ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  } /* for nElements */
23242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
23262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
23292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_FDKaacEnc_calcPeCorrection
23302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  calc desired pe
23312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
23322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_FDKaacEnc_calcPeCorrection(
23332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FIXP_DBL *const           correctionFac_m,
23342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT *const                correctionFac_e,
23352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 peAct,
23362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 peLast,
23372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 bitsLast,
23382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const FIXP_DBL            bits2PeFactor_m,
23392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 bits2PeFactor_e
23402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
23412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
23422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (bitsLast > 0) && (peAct < 1.5f*peLast) && (peAct > 0.7f*peLast) &&
23432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       (FDKaacEnc_bits2pe2(bitsLast, fMult(FL2FXCONST_DBL(1.2f/2.f), bits2PeFactor_m), bits2PeFactor_e+1) > peLast) &&
23442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       (FDKaacEnc_bits2pe2(bitsLast, fMult(FL2FXCONST_DBL(0.65f),    bits2PeFactor_m), bits2PeFactor_e  ) < peLast) )
23452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
23462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL corrFac = *correctionFac_m;
23472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int scaling = 0;
23492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL denum = (FIXP_DBL)FDKaacEnc_bits2pe2(bitsLast, bits2PeFactor_m, bits2PeFactor_e);
23502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL newFac = fDivNorm((FIXP_DBL)peLast, denum, &scaling);
23512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* dead zone, newFac and corrFac are scaled by 0.5 */
23532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((FIXP_DBL)peLast <= denum) { /* ratio <= 1.f */
23542228e360595641dd906bf1773307f43d304f5b2The 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) );
23552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
23562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else { /* ratio < 1.f */
23572228e360595641dd906bf1773307f43d304f5b2The 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) );
23582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
23592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (   ((newFac > FL2FXCONST_DBL(1.f/2.f)) && (corrFac < FL2FXCONST_DBL(1.f/2.f)))
23612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        || ((newFac < FL2FXCONST_DBL(1.f/2.f)) && (corrFac > FL2FXCONST_DBL(1.f/2.f))))
23622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
23632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      corrFac = FL2FXCONST_DBL(1.f/2.f);
23642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
23652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* faster adaptation towards 1.0, slower in the other direction */
23672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (corrFac < FL2FXCONST_DBL(1.f/2.f) && newFac < corrFac)
23682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || (corrFac > FL2FXCONST_DBL(1.f/2.f) && newFac > corrFac) )
23692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
23702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      corrFac = fMult(FL2FXCONST_DBL(0.85f), corrFac) + fMult(FL2FXCONST_DBL(0.15f), newFac);
23712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
23722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
23732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      corrFac = fMult(FL2FXCONST_DBL(0.7f), corrFac) + fMult(FL2FXCONST_DBL(0.3f), newFac);
23742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
23752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    corrFac = fixMax( fixMin( corrFac, FL2FXCONST_DBL(1.15f/2.f) ), FL2FXCONST_DBL(0.85/2.f) );
23772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *correctionFac_m = corrFac;
23792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *correctionFac_e = 1;
23802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
23812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
23822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *correctionFac_m = FL2FXCONST_DBL(1.f/2.f);
23832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *correctionFac_e = 1;
23842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
23852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
23862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23887ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivistatic void FDKaacEnc_calcPeCorrectionLowBitRes(
23897ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        FIXP_DBL *const           correctionFac_m,
23907ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        INT *const                correctionFac_e,
23917ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT                 peLast,
23927ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT                 bitsLast,
23937ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT                 bitresLevel,
23947ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT                 nChannels,
23957ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const FIXP_DBL            bits2PeFactor_m,
23967ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        const INT                 bits2PeFactor_e
23977ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        )
23987ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi{
23997ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  /* tuning params */
24007ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  const FIXP_DBL amp     = FL2FXCONST_DBL(0.005);
24017ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  const FIXP_DBL maxDiff = FL2FXCONST_DBL(0.25f);
24027ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24037ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  if (bitsLast > 0) {
24047ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24057ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* Estimate deviation of granted and used dynamic bits in previous frame, in PE units */
24067ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    const int bitsBalLast = peLast - FDKaacEnc_bits2pe2(
24077ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          bitsLast,
24087ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          bits2PeFactor_m,
24097ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          bits2PeFactor_e);
24107ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24117ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* reserve n bits per channel */
24127ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    int headroom = (bitresLevel>=50*nChannels) ? 0 : (100*nChannels);
24137ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24147ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /* in PE units */
24157ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    headroom = FDKaacEnc_bits2pe2(
24167ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          headroom,
24177ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          bits2PeFactor_m,
24187ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi          bits2PeFactor_e);
24197ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24207ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /*
24217ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi     * diff = amp * ((bitsBalLast - headroom) / (bitresLevel + headroom)
24227ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi     * diff = max ( min ( diff, maxDiff, -maxDiff)) / 2
24237ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi     */
24247ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    FIXP_DBL denominator = (FIXP_DBL)FDKaacEnc_bits2pe2(bitresLevel, bits2PeFactor_m, bits2PeFactor_e) + (FIXP_DBL)headroom;
24257ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24267ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    int scaling = 0;
24277ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    FIXP_DBL diff = (bitsBalLast>=headroom)
24287ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi         ?  fMult(amp, fDivNorm( (FIXP_DBL)(bitsBalLast - headroom), denominator, &scaling))
24297ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi         : -fMult(amp, fDivNorm(-(FIXP_DBL)(bitsBalLast - headroom), denominator, &scaling)) ;
24307ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24317ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    scaling -= 1; /* divide by 2 */
24327ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24337ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    diff = (scaling<=0) ? FDKmax( FDKmin (diff>>(-scaling), maxDiff>>1), -maxDiff>>1)
24347ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                        : FDKmax( FDKmin (diff, maxDiff>>(1+scaling)), -maxDiff>>(1+scaling)) << scaling;
24357ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24367ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    /*
24377ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi     * corrFac += diff
24387ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi     * corrFac = max ( min ( corrFac/2.f, 1.f/2.f, 0.75f/2.f ) )
24397ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi     */
24407ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    *correctionFac_m = FDKmax(FDKmin((*correctionFac_m)+diff, FL2FXCONST_DBL(1.0f/2.f)), FL2FXCONST_DBL(0.75f/2.f)) ;
24417ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    *correctionFac_e = 1;
24427ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  }
24437ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  else {
24447ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    *correctionFac_m = FL2FXCONST_DBL(0.75/2.f);
24457ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    *correctionFac_e = 1;
24467ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  }
24477ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi}
24487ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi
24492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_DistributeBits(ADJ_THR_STATE *adjThrState,
24502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ATS_ELEMENT       *AdjThrStateElement,
24512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    PSY_OUT_CHANNEL   *psyOutChannel[(2)],
24522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    PE_DATA           *peData,
24532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT               *grantedPe,
24542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT               *grantedPeCorr,
24552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         nChannels,
24562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         commonWindow,
24572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         grantedDynBits,
24582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         bitresBits,
24592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT         maxBitresBits,
24602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const FIXP_DBL    maxBitFac,
24617ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    const INT         bitDistributionMode)
24622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
24632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL bitFactor;
24642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT noRedPe = peData->pe;
24652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
24662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* prefer short windows for calculation of bitFactor */
24672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT curWindowSequence = LONG_WINDOW;
24682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (nChannels==2) {
24692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((psyOutChannel[0]->lastWindowSequence == SHORT_WINDOW) ||
24702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        (psyOutChannel[1]->lastWindowSequence == SHORT_WINDOW)) {
24712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        curWindowSequence = SHORT_WINDOW;
24722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
24732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
24742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
24752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    curWindowSequence = psyOutChannel[0]->lastWindowSequence;
24762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
24772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
24782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (grantedDynBits >= 1) {
24797ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    if (bitDistributionMode!=0) {
24802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *grantedPe = FDKaacEnc_bits2pe2(grantedDynBits, AdjThrStateElement->bits2PeFactor_m, AdjThrStateElement->bits2PeFactor_e);
24812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
24822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
24832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
24842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* factor dependend on current fill level and pe */
24852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitFactor = FDKaacEnc_bitresCalcBitFac(bitresBits, maxBitresBits, noRedPe,
24862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 curWindowSequence, grantedDynBits, maxBitFac,
24872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 adjThrState,
24882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 AdjThrStateElement
24892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 );
24902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
24912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* desired pe for actual frame */
24922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Worst case max of grantedDynBits is = 1024 * 5.27 * 2 */
24932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *grantedPe = FDKaacEnc_bits2pe2(grantedDynBits,
24942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     fMult(bitFactor, AdjThrStateElement->bits2PeFactor_m), AdjThrStateElement->bits2PeFactor_e+(DFRACT_BITS-1-Q_BITFAC)
24952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     );
24962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
24972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
24982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
24992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *grantedPe = 0; /* prevent divsion by 0 */
25002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
25012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* correction of pe value */
25037ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  switch (bitDistributionMode) {
25047ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  case 2:
25057ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  case 1:
25067ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    FDKaacEnc_calcPeCorrectionLowBitRes(
25077ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi           &AdjThrStateElement->peCorrectionFactor_m,
25087ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi           &AdjThrStateElement->peCorrectionFactor_e,
25097ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            AdjThrStateElement->peLast,
25107ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            AdjThrStateElement->dynBitsLast,
25117ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            bitresBits,
25127ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            nChannels,
25137ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            AdjThrStateElement->bits2PeFactor_m,
25147ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            AdjThrStateElement->bits2PeFactor_e
25152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
25167ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    break;
25177ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  case 0:
25187ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  default:
25197ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi      FDKaacEnc_FDKaacEnc_calcPeCorrection(
25207ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi           &AdjThrStateElement->peCorrectionFactor_m,
25217ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi           &AdjThrStateElement->peCorrectionFactor_e,
25227ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            fixMin(*grantedPe, noRedPe),
25237ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            AdjThrStateElement->peLast,
25247ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            AdjThrStateElement->dynBitsLast,
25257ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            AdjThrStateElement->bits2PeFactor_m,
25267ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            AdjThrStateElement->bits2PeFactor_e
25277ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            );
25287ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    break;
25292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
25302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *grantedPeCorr = (INT)(fMult((FIXP_DBL)(*grantedPe<<Q_AVGBITS), AdjThrStateElement->peCorrectionFactor_m) >> (Q_AVGBITS-AdjThrStateElement->peCorrectionFactor_e));
25322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* update last pe */
25342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AdjThrStateElement->peLast = *grantedPe;
25352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AdjThrStateElement->dynBitsLast = -1;
25362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
25382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
25402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectfunctionname: FDKaacEnc_AdjustThresholds
25412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectdescription:  adjust thresholds
25422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
2543fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivivoid FDKaacEnc_AdjustThresholds(ATS_ELEMENT*        AdjThrStateElement[(8)],
2544fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                QC_OUT_ELEMENT*     qcElement[(8)],
25452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                QC_OUT*             qcOut,
2546fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                PSY_OUT_ELEMENT*    psyOutElement[(8)],
25472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT                 CBRbitrateMode,
25482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                CHANNEL_MAPPING*    cm)
25492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
25502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int i;
25512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (CBRbitrateMode)
25522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
25532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* In case, no bits must be shifted between different elements, */
25542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* an element-wise execution of the pe-dependent threshold- */
25552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* adaption becomes necessary... */
25562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (i=0; i<cm->nElements; i++)
25572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
25582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                ELEMENT_INFO elInfo = cm->elInfo[i];
25592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
25612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    (elInfo.elType == ID_LFE))
25622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                {
25632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* qcElement[i]->grantedPe = 2000; */  /* Use this only for debugging */
25642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    //if (totalGrantedPeCorr < totalNoRedPe) {
25652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    if (qcElement[i]->grantedPe < qcElement[i]->peData.pe)
25662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    {
25672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        /* calc threshold necessary for desired pe */
25682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        FDKaacEnc_adaptThresholdsToPe(cm,
25692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            AdjThrStateElement,
25702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            qcElement,
25712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            psyOutElement,
25722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            qcElement[i]->grantedPeCorr,
25732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            1,         /* Process only 1 element */
25742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            i);        /* Process exactly THIS element */
25752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
25772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
25792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }  /* -end- element loop */
25812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
25822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
25832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i=0; i<cm->nElements; i++)
25842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
25852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ELEMENT_INFO elInfo = cm->elInfo[i];
25862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
25882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                (elInfo.elType == ID_LFE))
25892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
25902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* for VBR-mode */
25912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  FDKaacEnc_AdaptThresholdsVBR(qcElement[i]->qcOutChannel,
25922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            psyOutElement[i]->psyOutChannel,
25932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            AdjThrStateElement[i],
25942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            &psyOutElement[i]->toolsInfo,
25952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            &qcElement[i]->peData,
25962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            cm->elInfo[i].nChannelsInEl);
25972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
25982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
25992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }  /* -end- element loop */
26002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
26012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
26027ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    for (i=0; i<cm->nElements; i++) {
26037ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        int ch,sfb,sfbGrp;
26047ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        /* no weighting of threholds and energies for mlout */
26057ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        /* weight energies and thresholds */
26067ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        for (ch=0; ch<cm->elInfo[i].nChannelsInEl; ch++) {
26077ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            QC_OUT_CHANNEL* pQcOutCh = qcElement[i]->qcOutChannel[ch];
26087ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi            for (sfbGrp = 0;sfbGrp < psyOutElement[i]->psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutElement[i]->psyOutChannel[ch]->sfbPerGroup) {
26097ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                for (sfb=0; sfb<psyOutElement[i]->psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
26107ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                    pQcOutCh->sfbThresholdLdData[sfb+sfbGrp] += pQcOutCh->sfbEnFacLd[sfb+sfbGrp];
26112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
26122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
26132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
26147ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    }
26152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
26162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
26172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_AdjThrClose(ADJ_THR_STATE** phAdjThr)
26182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
26192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i;
26202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ADJ_THR_STATE* hAdjThr = *phAdjThr;
26212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
26222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAdjThr!=NULL) {
2623fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi      for (i=0; i<(8); i++) {
26242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAdjThr->adjThrStateElem[i]!=NULL) {
26252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FreeRam_aacEnc_AdjThrStateElement(&hAdjThr->adjThrStateElem[i]);
26262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
26272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
26282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FreeRam_aacEnc_AdjustThreshold(phAdjThr);
26292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
26302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
26312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2632