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