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