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#include "env_est.h" 852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tran_det.h" 862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "qmf.h" 882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "fram_gen.h" 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "bit_sbr.h" 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "cmondata.h" 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_ram.h" 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "genericStds.h" 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define QUANT_ERROR_THRES 200 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define Y_NRG_SCALE 5 /* noCols = 32 -> shift(5) */ 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const UCHAR panTable[2][10] = { { 0, 2, 4, 6, 8,12,16,20,24}, 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 0, 2, 4, 8,12, 0, 0, 0, 0 } }; 1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const UCHAR maxIndex[2] = {9, 5}; 1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Calculates energy form real and imaginary part of 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the QMF subsamples 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLNK_SECTION_CODE_L1 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_getEnergyFromCplxQmfData(FIXP_DBL **RESTRICT energyValues,/*!< the result of the operation */ 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **RESTRICT realValues, /*!< the real part of the QMF subsamples */ 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **RESTRICT imagValues, /*!< the imaginary part of the QMF subsamples */ 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT numberBands, /*!< number of QMF bands */ 1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT numberCols, /*!< number of QMF subsamples */ 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT *qmfScale, /*!< sclefactor of QMF subsamples */ 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT *energyScale) /*!< scalefactor of energies */ 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int j, k; 1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int scale; 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL max_val = FL2FXCONST_DBL(0.0f); 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Get Scratch buffer */ 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, QMF_CHANNELS*QMF_MAX_TIME_SLOTS/2); 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(numberBands <= QMF_CHANNELS); 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(numberCols <= QMF_MAX_TIME_SLOTS); 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Get max possible scaling of QMF data */ 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = DFRACT_BITS; 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k=0; k<numberCols; k++) { 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = fixMin(scale, fixMin(getScalefactor(realValues[k], numberBands), getScalefactor(imagValues[k], numberBands))); 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Tweak scaling stability for zero signal to non-zero signal transitions */ 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (scale >= DFRACT_BITS-1) { 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = (FRACT_BITS-1-*qmfScale); 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* prevent scaling of QFM values to -1.f */ 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = fixMax(0,scale-1); 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Update QMF scale */ 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *qmfScale += scale; 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Calculate energy of each time slot pair, max energy 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project and shift QMF values as far as possible to the left. 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *nrgValues = tmpNrg; 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k=0; k<numberCols; k+=2) 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Load band vector addresses of 2 consecutive timeslots */ 1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT r0 = realValues[k]; 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT i0 = imagValues[k]; 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT r1 = realValues[k+1]; 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT i1 = imagValues[k+1]; 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j=0; j<numberBands; j++) 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL energy; 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL tr0,tr1,ti0,ti1; 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Read QMF values of 2 timeslots */ 1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tr0 = r0[j]; tr1 = r1[j]; ti0 = i0[j]; ti1 = i1[j]; 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Scale QMF Values and Calc Energy of both timeslots */ 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tr0 <<= scale; 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ti0 <<= scale; 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project energy = fPow2AddDiv2(fPow2Div2(tr0), ti0) >> 1; 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tr1 <<= scale; 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ti1 <<= scale; 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project energy += fPow2AddDiv2(fPow2Div2(tr1), ti1) >> 1; 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Write timeslot pair energy to scratch */ 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *nrgValues++ = energy; 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project max_val = fixMax(max_val, energy); 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Write back scaled QMF values */ 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r0[j] = tr0; r1[j] = tr1; i0[j] = ti0; i1[j] = ti1; 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* energyScale: scalefactor energies of current frame */ 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *energyScale = 2*(*qmfScale)-1; /* if qmfScale > 0: nr of right shifts otherwise nr of left shifts */ 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Scale timeslot pair energies and write to output buffer */ 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = CountLeadingBits(max_val); 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *nrgValues = tmpNrg; 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k=0; k<numberCols>>1; k++) { 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleValues(energyValues[k], nrgValues, numberBands, scale); 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgValues += numberBands; 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *energyScale += scale; 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Free Scratch buffer */ 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(tmpNrg, FIXP_DBL, QMF_CHANNELS*QMF_MAX_TIME_SLOTS/2); 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLNK_SECTION_CODE_L1 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_getEnergyFromCplxQmfDataFull(FIXP_DBL **RESTRICT energyValues,/*!< the result of the operation */ 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **RESTRICT realValues, /*!< the real part of the QMF subsamples */ 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **RESTRICT imagValues, /*!< the imaginary part of the QMF subsamples */ 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int numberBands, /*!< number of QMF bands */ 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int numberCols, /*!< number of QMF subsamples */ 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *qmfScale, /*!< sclefactor of QMF subsamples */ 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *energyScale) /*!< scalefactor of energies */ 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int j, k; 2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int scale; 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL max_val = FL2FXCONST_DBL(0.0f); 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Get Scratch buffer */ 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, QMF_MAX_TIME_SLOTS*QMF_CHANNELS/2); 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(numberBands <= QMF_CHANNELS); 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(numberCols <= QMF_MAX_TIME_SLOTS/2); 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Get max possible scaling of QMF data */ 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = DFRACT_BITS; 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k=0; k<numberCols; k++) { 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = fixMin(scale, fixMin(getScalefactor(realValues[k], numberBands), getScalefactor(imagValues[k], numberBands))); 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Tweak scaling stability for zero signal to non-zero signal transitions */ 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (scale >= DFRACT_BITS-1) { 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = (FRACT_BITS-1-*qmfScale); 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* prevent scaling of QFM values to -1.f */ 2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = fixMax(0,scale-1); 2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Update QMF scale */ 2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *qmfScale += scale; 2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Calculate energy of each time slot pair, max energy 2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project and shift QMF values as far as possible to the left. 2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *nrgValues = tmpNrg; 2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k=0; k<numberCols; k++) 2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Load band vector addresses of 2 consecutive timeslots */ 2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT r0 = realValues[k]; 2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT i0 = imagValues[k]; 2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j=0; j<numberBands; j++) 2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL energy; 2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL tr0,ti0; 2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Read QMF values of 2 timeslots */ 2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tr0 = r0[j]; ti0 = i0[j]; 2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Scale QMF Values and Calc Energy of both timeslots */ 2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tr0 <<= scale; 2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ti0 <<= scale; 2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project energy = fPow2AddDiv2(fPow2Div2(tr0), ti0); 2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *nrgValues++ = energy; 2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project max_val = fixMax(max_val, energy); 2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Write back scaled QMF values */ 2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r0[j] = tr0; i0[j] = ti0; 2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* energyScale: scalefactor energies of current frame */ 2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *energyScale = 2*(*qmfScale)-1; /* if qmfScale > 0: nr of right shifts otherwise nr of left shifts */ 2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Scale timeslot pair energies and write to output buffer */ 2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scale = CountLeadingBits(max_val); 2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *nrgValues = tmpNrg; 2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k=0; k<numberCols; k++) { 2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleValues(energyValues[k], nrgValues, numberBands, scale); 2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgValues += numberBands; 2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *energyScale += scale; 2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Free Scratch buffer */ 2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(tmpNrg, FIXP_DBL, QMF_MAX_TIME_SLOTS*QMF_CHANNELS/2); 2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Quantisation of the panorama value (balance) 2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return the quantized pan value 3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT 3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectmapPanorama(INT nrgVal, /*! integer value of the energy */ 3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT ampRes, /*! amplitude resolution [1.5/3dB] */ 3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT *quantError /*! quantization error of energy val*/ 3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT min_val, val; 3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR panIndex; 3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT sign; 3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sign = nrgVal > 0 ? 1 : -1; 3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgVal *= sign; 3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project min_val = FDK_INT_MAX; 3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project panIndex = 0; 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < maxIndex[ampRes]; i++) { 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project val = fixp_abs ((nrgVal - (INT)panTable[ampRes][i])); 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (val < min_val) { 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project min_val = val; 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project panIndex = i; 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *quantError=min_val; 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return panTable[ampRes][maxIndex[ampRes]-1] + sign * panTable[ampRes][panIndex]; 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Quantisation of the noise floor levels 3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return void 3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void 3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrNoiseFloorLevelsQuantisation(SCHAR *RESTRICT iNoiseLevels, /*! quantized noise levels */ 3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT NoiseLevels, /*! the noise levels */ 3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT coupling /*! the coupling flag */ 3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i; 3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT tmp, dummy; 3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Quantisation, similar to sfb quant... */ 3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) { 3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* tmp = NoiseLevels[i] > (PFLOAT)30.0f ? 30: (INT) (NoiseLevels[i] + (PFLOAT)0.5); */ 3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 30>>6 = 0.46875 */ 3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((FIXP_DBL)NoiseLevels[i] > FL2FXCONST_DBL(0.46875f)) { 3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = 30; 3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* tmp = (INT)((FIXP_DBL)NoiseLevels[i] + (FL2FXCONST_DBL(0.5f)>>(*/ /* FRACT_BITS+ */ /* 6-1)));*/ 3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* tmp = tmp >> (DFRACT_BITS-1-6); */ /* conversion to integer happens here */ 3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* rounding is done by shifting one bit less than necessary to the right, adding '1' and then shifting the final bit */ 3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = ((((INT)NoiseLevels[i])>>(DFRACT_BITS-1-LD_DATA_SHIFT)) ); /* conversion to integer */ 3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (tmp != 0) 3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp += 1; 3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (coupling) { 3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = tmp < -30 ? -30 : tmp; 3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = mapPanorama (tmp,1,&dummy); 3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iNoiseLevels[i] = tmp; 3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Calculation of noise floor for coupling 3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return void 3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void 3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectcoupleNoiseFloor(FIXP_DBL *RESTRICT noise_level_left, /*! noise level left (modified)*/ 3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT noise_level_right /*! noise level right (modified)*/ 3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL cmpValLeft,cmpValRight; 3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i; 3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL temp1,temp2; 3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) { 3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Calculation of the power function using ld64: 3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project z = x^y; 3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project z' = CalcLd64(z) = y*CalcLd64(x)/64; 3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project z = CalcInvLd64(z'); 3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cmpValLeft = NOISE_FLOOR_OFFSET_64 - noise_level_left[i]; 4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cmpValRight = NOISE_FLOOR_OFFSET_64 - noise_level_right[i]; 4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (cmpValRight < FL2FXCONST_DBL(0.0f)) { 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]); 4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]); 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp1 = temp1 << (DFRACT_BITS-1-LD_DATA_SHIFT-1); /* INT to fract conversion of result, if input of CalcInvLdData is positiv */ 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (cmpValLeft < FL2FXCONST_DBL(0.0f)) { 4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]); 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]); 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp2 = temp2 << (DFRACT_BITS-1-LD_DATA_SHIFT-1); /* INT to fract conversion of result, if input of CalcInvLdData is positiv */ 4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && (cmpValRight < FL2FXCONST_DBL(0.0f))) { 4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>1)))); /* no scaling needed! both values are dfract */ 4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1); 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && (cmpValRight >= FL2FXCONST_DBL(0.0f))) { 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>1))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1); 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && (cmpValRight < FL2FXCONST_DBL(0.0f))) { 4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>(7+1)) + (temp2>>1))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ 4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noise_level_right[i] = (CalcLdData(temp2) + FL2FXCONST_DBL(0.109375f)) - CalcLdData(temp1); 4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && (cmpValRight >= FL2FXCONST_DBL(0.0f))) { 4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>(7+1)))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ 4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noise_level_right[i] = CalcLdData(temp2) - (CalcLdData(temp1) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ 4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Calculation of energy starting in lower band (li) up to upper band (ui) 4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project over slots (start_pos) to (stop_pos) 4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return void 4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL 4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectgetEnvSfbEnergy(INT li, /*! lower band */ 4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT ui, /*! upper band */ 4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT start_pos, /*! start slot */ 4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT stop_pos, /*! stop slot */ 4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT border_pos, /*! slots scaling border */ 4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **YBuffer, /*! sfb energy buffer */ 4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT YBufferSzShift, /*! Energy buffer index scale */ 4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT scaleNrg0, /*! scaling of lower slots */ 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT scaleNrg1) /*! scaling of upper slots */ 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* use dynamic scaling for outer energy loop; 4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project energies are critical and every bit is important */ 4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int sc0, sc1, k, l; 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL nrgSum, nrg1, nrg2, accu1, accu2; 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT dynScale, dynScale1, dynScale2; 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(ui-li==0) dynScale = DFRACT_BITS-1; 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dynScale = CalcLdInt(ui-li)>>(DFRACT_BITS-1-LD_DATA_SHIFT); 4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sc0 = fixMin(scaleNrg0,Y_NRG_SCALE); sc1 = fixMin(scaleNrg1,Y_NRG_SCALE); 4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* dynScale{1,2} is set such that the right shift below is positive */ 4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dynScale1 = fixMin((scaleNrg0-sc0),dynScale); 4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dynScale2 = fixMin((scaleNrg1-sc1),dynScale); 4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgSum = accu1 = accu2 = (FIXP_DBL)0; 4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = li; k < ui; k++) { 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrg1 = nrg2 = (FIXP_DBL)0; 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (l = start_pos; l < border_pos; l++) { 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrg1 += YBuffer[l>>YBufferSzShift][k] >> sc0; 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (; l < stop_pos; l++) { 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrg2 += YBuffer[l>>YBufferSzShift][k] >> sc1; 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project accu1 += (nrg1>>dynScale1); 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project accu2 += (nrg2>>dynScale2); 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* This shift factor is always positive. See comment above. */ 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgSum += ( accu1 >> fixMin((scaleNrg0-sc0-dynScale1),(DFRACT_BITS-1)) ) 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project + ( accu2 >> fixMin((scaleNrg1-sc1-dynScale2),(DFRACT_BITS-1)) ); 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return nrgSum; 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Energy compensation in missing harmonic mode 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return void 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FIXP_DBL 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectmhLoweringEnergy(FIXP_DBL nrg, INT M) 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Compensating for the fact that we in the decoder map the "average energy to every QMF 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project band, and use this when we calculate the boost-factor. Since the mapped energy isn't 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the average energy but the maximum energy in case of missing harmonic creation, we will 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project in the boost function calculate that too much limiting has been applied and hence we will 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project boost the signal although it isn't called for. Hence we need to compensate for this by 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lowering the transmitted energy values for the sines so they will get the correct level 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project after the boost is applied. 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(M > 2){ 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT tmpScale; 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmpScale = CountLeadingBits(nrg); 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrg <<= tmpScale; 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrg = fMult(nrg, FL2FXCONST_DBL(0.398107267f)); /* The maximum boost is 1.584893, so the maximum attenuation should be square(1/1.584893) = 0.398107267 */ 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrg >>= tmpScale; 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(M > 1){ 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrg >>= 1; 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return nrg; 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Energy compensation in none missing harmonic mode 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return void 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 539381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivistatic FIXP_DBL nmhLoweringEnergy( 540381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi FIXP_DBL nrg, 541381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi const FIXP_DBL nrgSum, 542381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi const INT nrgSum_scale, 543381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi const INT M 544381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi ) 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nrg>FL2FXCONST_DBL(0)) { 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int sc=0; 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* gain = nrgSum / (nrg*(M+1)) */ 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL gain = fMult(fDivNorm(nrgSum, nrg, &sc), GetInvInt(M+1)); 550381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi sc += nrgSum_scale; 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* reduce nrg if gain smaller 1.f */ 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !((sc>=0) && ( gain > ((FIXP_DBL)MAXVAL_DBL>>sc) )) ) { 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrg = fMult(scaleValue(gain,sc), nrg); 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return nrg; 5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief calculates the envelope values from the energies, depending on 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project framing and stereo mode 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return void 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectcalculateSbrEnvelope (FIXP_DBL **RESTRICT YBufferLeft, /*! energy buffer left */ 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **RESTRICT YBufferRight, /*! energy buffer right */ 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *RESTRICT YBufferScaleLeft, /*! scale energy buffer left */ 5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *RESTRICT YBufferScaleRight, /*! scale energy buffer right */ 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const SBR_FRAME_INFO *frame_info, /*! frame info vector */ 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *RESTRICT sfb_nrgLeft, /*! sfb energy buffer left */ 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *RESTRICT sfb_nrgRight, /*! sfb energy buffer right */ 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data */ 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_ENV_CHANNEL h_sbr, /*! envelope channel handle */ 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_STEREO_MODE stereoMode, /*! stereo coding mode */ 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT* maxQuantError, /*! maximum quantization error, for panorama. */ 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int YBufferSzShift) /*! Energy buffer index scale */ 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i, j, m = 0; 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT no_of_bands, start_pos, stop_pos, li, ui; 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FREQ_RES freq_res; 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT ca = 2 - h_sbr->encEnvData.init_sbr_amp_res; 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT oneBitLess = 0; 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ca == 2) 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project oneBitLess = 1; /* LD_DATA_SHIFT => ld64 scaling; one bit less for rounding */ 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT quantError; 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nEnvelopes = frame_info->nEnvelopes; 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT short_env = frame_info->shortEnv - 1; 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT timeStep = h_sbr->sbrExtractEnvelope.time_step; 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT commonScale,scaleLeft0,scaleLeft1; 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT scaleRight0=0,scaleRight1=0; 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonScale = fixMin(YBufferScaleLeft[0],YBufferScaleLeft[1]); 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (stereoMode == SBR_COUPLING) { 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonScale = fixMin(commonScale,YBufferScaleRight[0]); 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonScale = fixMin(commonScale,YBufferScaleRight[1]); 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonScale = commonScale - 7; 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleLeft0 = YBufferScaleLeft[0] - commonScale; 6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleLeft1 = YBufferScaleLeft[1] - commonScale ; 6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT ((scaleLeft0 >= 0) && (scaleLeft1 >= 0)); 6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (stereoMode == SBR_COUPLING) { 6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleRight0 = YBufferScaleRight[0] - commonScale; 6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleRight1 = YBufferScaleRight[1] - commonScale; 6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT ((scaleRight0 >= 0) && (scaleRight1 >= 0)); 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *maxQuantError = 0; 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < nEnvelopes; i++) { 6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pNrgLeft[QMF_MAX_TIME_SLOTS]; 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL pNrgRight[QMF_MAX_TIME_SLOTS]; 624381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi int envNrg_scale; 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL envNrgLeft = FL2FXCONST_DBL(0.0f); 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL envNrgRight = FL2FXCONST_DBL(0.0f); 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int missingHarmonic[QMF_MAX_TIME_SLOTS]; 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int count[QMF_MAX_TIME_SLOTS]; 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start_pos = timeStep * frame_info->borders[i]; 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stop_pos = timeStep * frame_info->borders[i + 1]; 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project freq_res = frame_info->freqRes[i]; 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project no_of_bands = h_con->nSfb[freq_res]; 634381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi envNrg_scale = DFRACT_BITS-fNormz((FIXP_DBL)no_of_bands); 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (i == short_env) { 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stop_pos -= fixMax(2, timeStep); /* consider at least 2 QMF slots less for short envelopes (envelopes just before transients) */ 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j = 0; j < no_of_bands; j++) { 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL nrgLeft = FL2FXCONST_DBL(0.0f); 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL nrgRight = FL2FXCONST_DBL(0.0f); 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project li = h_con->freqBandTable[freq_res][j]; 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = h_con->freqBandTable[freq_res][j + 1]; 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(freq_res == FREQ_RES_HIGH){ 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(j == 0 && ui-li > 1){ 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project li++; 6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(j == 0 && ui-li > 2){ 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project li++; 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Find out whether a sine will be missing in the scale-factor 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project band that we're currently processing. 6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project missingHarmonic[j] = 0; 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(h_sbr->encEnvData.addHarmonicFlag){ 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(freq_res == FREQ_RES_HIGH){ 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(h_sbr->encEnvData.addHarmonic[j]){ /*A missing sine in the current band*/ 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project missingHarmonic[j] = 1; 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i; 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT startBandHigh = 0; 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT stopBandHigh = 0; 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while(h_con->freqBandTable[FREQ_RES_HIGH][startBandHigh] < h_con->freqBandTable[FREQ_RES_LOW][j]) 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBandHigh++; 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while(h_con->freqBandTable[FREQ_RES_HIGH][stopBandHigh] < h_con->freqBandTable[FREQ_RES_LOW][j + 1]) 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stopBandHigh++; 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i = startBandHigh; i<stopBandHigh; i++){ 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(h_sbr->encEnvData.addHarmonic[i]){ 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project missingHarmonic[j] = 1; 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project If a sine is missing in a scalefactorband, with more than one qmf channel 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project use the nrg from the channel with the largest nrg rather than the mean. 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Compensate for the boost calculation in the decdoder. 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int border_pos = fixMin(stop_pos, h_sbr->sbrExtractEnvelope.YBufferWriteOffset<<YBufferSzShift); 6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(missingHarmonic[j]){ 6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int k; 6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project count[j] = stop_pos - start_pos; 7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = FL2FXCONST_DBL(0.0f); 7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = li; k < ui; k++) { 7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL tmpNrg; 7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmpNrg = getEnvSfbEnergy(k, 7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project k+1, 7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start_pos, 7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stop_pos, 7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border_pos, 7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferLeft, 7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferSzShift, 7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleLeft0, 7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleLeft1); 7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = fixMax(nrgLeft, tmpNrg); 7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Energy lowering compensation */ 7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = mhLoweringEnergy(nrgLeft, ui-li); 7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (stereoMode == SBR_COUPLING) { 7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgRight = FL2FXCONST_DBL(0.0f); 7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (k = li; k < ui; k++) { 7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL tmpNrg; 7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmpNrg = getEnvSfbEnergy(k, 7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project k+1, 7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start_pos, 7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stop_pos, 7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border_pos, 7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferRight, 7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferSzShift, 7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleRight0, 7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleRight1); 7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgRight = fixMax(nrgRight, tmpNrg); 7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Energy lowering compensation */ 7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgRight = mhLoweringEnergy(nrgRight, ui-li); 7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* end missingHarmonic */ 7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project count[j] = (stop_pos - start_pos) * (ui - li); 7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = getEnvSfbEnergy(li, 7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui, 7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start_pos, 7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stop_pos, 7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border_pos, 7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferLeft, 7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferSzShift, 7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleLeft0, 7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleLeft1); 7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (stereoMode == SBR_COUPLING) { 7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgRight = getEnvSfbEnergy(li, 7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui, 7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start_pos, 7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stop_pos, 7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project border_pos, 7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferRight, 7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferSzShift, 7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleRight0, 7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleRight1); 7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* !missingHarmonic */ 7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* save energies */ 7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNrgLeft[j] = nrgLeft; 7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNrgRight[j] = nrgRight; 772381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi envNrgLeft += (nrgLeft>>envNrg_scale); 773381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi envNrgRight += (nrgRight>>envNrg_scale); 7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* j */ 7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j = 0; j < no_of_bands; j++) { 7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL nrgLeft2 = FL2FXCONST_DBL(0.0f); 7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL nrgLeft = pNrgLeft[j]; 7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL nrgRight = pNrgRight[j]; 7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* None missing harmonic Energy lowering compensation */ 7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(!missingHarmonic[j] && h_sbr->fLevelProtect) { 7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* in case of missing energy in base band, 7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project reduce reference energy to prevent overflows in decoder output */ 786381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi nrgLeft = nmhLoweringEnergy(nrgLeft, envNrgLeft, envNrg_scale, no_of_bands); 7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (stereoMode == SBR_COUPLING) { 788381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi nrgRight = nmhLoweringEnergy(nrgRight, envNrgRight, envNrg_scale, no_of_bands); 7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (stereoMode == SBR_COUPLING) { 7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calc operation later with log */ 7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft2 = nrgLeft; 7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = (nrgRight + nrgLeft) >> 1; 7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* nrgLeft = f20_log2(nrgLeft / (PFLOAT)(count * h_sbr->sbrQmf.no_channels))+(PFLOAT)44; */ 7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* If nrgLeft == 0 then the Log calculations below do fail. */ 8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nrgLeft > FL2FXCONST_DBL(0.0f)) 8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL tmp0,tmp1,tmp2,tmp3; 8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT tmpScale; 8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmpScale = CountLeadingBits(nrgLeft); 8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = nrgLeft << tmpScale; 8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp0 = CalcLdData(nrgLeft); /* scaled by 1/64 */ 8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp1 = ((FIXP_DBL) (commonScale+tmpScale)) << (DFRACT_BITS-1-LD_DATA_SHIFT-1); /* scaled by 1/64 */ 8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp2 = ((FIXP_DBL)(count[j]*h_con->noQmfBands)) << (DFRACT_BITS-1-14-1); 8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp2 = CalcLdData(tmp2); /* scaled by 1/64 */ 8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp3 = FL2FXCONST_DBL(0.6875f-0.21875f-0.015625f)>>1; /* scaled by 1/64 */ 8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = ((tmp0-tmp2)>>1) + (tmp3 - tmp1); 8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = FL2FXCONST_DBL(-1.0f); 8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* ld64 to integer conversion */ 8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = fixMin(fixMax(nrgLeft,FL2FXCONST_DBL(0.0f)),FL2FXCONST_DBL(0.5f)); 8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLeft = (FIXP_DBL)(LONG)nrgLeft >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess-1); 8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfb_nrgLeft[m] = ((INT)nrgLeft+1)>>1; /* rounding */ 8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (stereoMode == SBR_COUPLING) { 8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL scaleFract; 8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nrgRight != FL2FXCONST_DBL(0.0f)) { 8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int sc0 = CountLeadingBits(nrgLeft2); 8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int sc1 = CountLeadingBits(nrgRight); 8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scaleFract = ((FIXP_DBL)(sc0-sc1)) << (DFRACT_BITS-1-LD_DATA_SHIFT); /* scale value in ld64 representation */ 8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgRight = CalcLdData(nrgLeft2<<sc0) - CalcLdData(nrgRight<<sc1) - scaleFract; 8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgRight = FL2FXCONST_DBL(0.5f); /* ld64(4294967296.0f) */ 8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* ld64 to integer conversion */ 8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgRight = (FIXP_DBL)(LONG)(nrgRight) >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess); 8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgRight = (nrgRight+(FIXP_DBL)1)>>1; /* rounding */ 8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfb_nrgRight[m] = mapPanorama (nrgRight,h_sbr->encEnvData.init_sbr_amp_res,&quantError); 8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *maxQuantError = fixMax(quantError, *maxQuantError); 8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project m++; 8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* j */ 8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Do energy compensation for sines that are present in two 8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project QMF-bands in the original, but will only occur in one band in 8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the decoder due to the synthetic sine coding.*/ 8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_con->useParametricCoding) { 8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project m-=no_of_bands; 8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j = 0; j < no_of_bands; j++) { 8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (freq_res==FREQ_RES_HIGH && h_sbr->sbrExtractEnvelope.envelopeCompensation[j]){ 8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfb_nrgLeft[m] -= (ca * fixp_abs((INT)h_sbr->sbrExtractEnvelope.envelopeCompensation[j])); 8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfb_nrgLeft[m] = fixMax(0, sfb_nrgLeft[m]); 8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project m++; 8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* useParametricCoding */ 8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* i*/ 8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief calculates the noise floor and the envelope values from the 8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project energies, depending on framing and stereo mode 8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the 8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envelope and the noise floor. The function includes the following processes: 8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Analysis subband filtering. 8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Encoding SA and pan parameters (if enabled). 8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Transient detection. 8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLNK_SECTION_CODE_L1 8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid 8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_extractSbrEnvelope1 ( 8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data */ 8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_HEADER_DATA sbrHeaderData, 8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, 8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_ENV_CHANNEL hEnvChan, 8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_COMMON_DATA hCmonData, 8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_ENV_TEMP_DATA *eData, 8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_FRAME_TEMP_DATA *fData 8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope; 8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sbrExtrEnv->YBufferSzShift == 0) 8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_getEnergyFromCplxQmfDataFull(&sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset], 8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset, 8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset, 9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->noQmfBands, 9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->no_cols, 9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hEnvChan->qmfScale, 9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &sbrExtrEnv->YBufferScale[1]); 9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_getEnergyFromCplxQmfData(&sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset], 9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset, 9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset, 9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->noQmfBands, 9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->no_cols, 9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hEnvChan->qmfScale, 9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &sbrExtrEnv->YBufferScale[1]); 9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Precalculation of Tonality Quotas COEFF Transform OK 9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_CalculateTonalityQuotas(&hEnvChan->TonCorr, 9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->rBuffer, 9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->iBuffer, 9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->freqBandTable[HI][h_con->nSfb[HI]], 9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->qmfScale); 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 Transient detection COEFF Transform OK 9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_transientDetect(&hEnvChan->sbrTransientDetector, 9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->YBuffer, 9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->YBufferScale, 9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData->transient_info, 9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->YBufferWriteOffset, 9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->YBufferSzShift, 9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->time_step, 9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->SbrEnvFrame.frameMiddleSlot); 9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Generate flags for 2 env in a FIXFIX-frame. 9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Remove this function to get always 1 env per FIXFIX-frame. 9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frame Splitter COEFF Transform OK 9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_frameSplitter(sbrExtrEnv->YBuffer, 9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->YBufferScale, 9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hEnvChan->sbrTransientDetector, 9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->freqBandTable[1], 9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData->transient_info, 9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->YBufferWriteOffset, 9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->YBufferSzShift, 9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->nSfb[1], 9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->time_step, 9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->no_cols); 9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief calculates the noise floor and the envelope values from the 9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project energies, depending on framing and stereo mode 9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the 9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envelope and the noise floor. The function includes the following processes: 9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Determine time/frequency division of current granule. 9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Sending transient info to bitstream. 9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Set amp_res to 1.5 dB if the current frame contains only one envelope. 9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Lock dynamic bandwidth frequency change if the next envelope not starts on a 9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frame boundary. 9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -MDCT transposer (needed to detect where harmonics will be missing). 9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Spectrum Estimation (used for pulse train and missing harmonics detection). 9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Pulse train detection. 9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Inverse Filtering detection. 9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Waveform Coding. 9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Missing Harmonics detection. 9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Extract envelope of current frame. 9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Noise floor estimation. 9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Noise floor quantisation and coding. 9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Encode envelope of current frame. 9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Send the encoded data to the bitstream. 9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -Write to bitstream. 9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLNK_SECTION_CODE_L1 9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid 9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_extractSbrEnvelope2 ( 9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data */ 9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_HEADER_DATA sbrHeaderData, 9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_PARAMETRIC_STEREO hParametricStereo, 9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, 9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_ENV_CHANNEL h_envChan0, 9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_ENV_CHANNEL h_envChan1, 10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_COMMON_DATA hCmonData, 10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_ENV_TEMP_DATA *eData, 10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_FRAME_TEMP_DATA *fData, 10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int clearOutput 10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_ENV_CHANNEL h_envChan[MAX_NUM_CHANNELS] = {h_envChan0, h_envChan1}; 10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int ch, i, j, c, YSzShift = h_envChan[0]->sbrExtractEnvelope.YBufferSzShift; 10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_STEREO_MODE stereoMode = h_con->stereoMode; 10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int nChannels = h_con->nChannels; 10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int *v_tuning; 10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project static const int v_tuningHEAAC[6] = { 0, 2, 4, 0, 0, 0 }; 10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project static const int v_tuningELD[6] = { 0, 2, 3, 0, 0, 0 }; 10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) 10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project v_tuning = v_tuningELD; 10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project v_tuning = v_tuningHEAAC; 10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Select stereo mode. 10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (stereoMode == SBR_COUPLING) { 10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (eData[0].transient_info[1] && eData[1].transient_info[1]) { 10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].transient_info[0] = fixMin(eData[1].transient_info[0], eData[0].transient_info[0]); 10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].transient_info[0] = eData[0].transient_info[0]; 10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (eData[0].transient_info[1] && !eData[1].transient_info[1]) { 10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].transient_info[0] = eData[0].transient_info[0]; 10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!eData[0].transient_info[1] && eData[1].transient_info[1]) 10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].transient_info[0] = eData[1].transient_info[0]; 10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].transient_info[0] = fixMax(eData[1].transient_info[0], eData[0].transient_info[0]); 10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].transient_info[0] = eData[0].transient_info[0]; 10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Determine time/frequency division of current granule 10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info = FDKsbrEnc_frameInfoGenerator(&h_envChan[0]->SbrEnvFrame, 10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].transient_info, 10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrExtractEnvelope.pre_transient_info, 10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.ldGrid, 10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project v_tuning); 10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid; 10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* AAC LD patch for transient prediction */ 10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_envChan[0]->encEnvData.ldGrid && eData[0].transient_info[2]) { 10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if next frame will start with transient, set shortEnv to numEnvelopes(shortend Envelope = shortEnv-1)*/ 10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->SbrEnvFrame.SbrFrameInfo.shortEnv = h_envChan[0]->SbrEnvFrame.SbrFrameInfo.nEnvelopes; 10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (stereoMode) { 10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_LEFT_RIGHT: 10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_SWITCH_LRC: 10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].frame_info = FDKsbrEnc_frameInfoGenerator(&h_envChan[1]->SbrEnvFrame, 10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].transient_info, 10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->sbrExtractEnvelope.pre_transient_info, 10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.ldGrid, 10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project v_tuning); 10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[1]->SbrEnvFrame.SbrGrid; 10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_envChan[1]->encEnvData.ldGrid && eData[1].transient_info[2]) { 10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if next frame will start with transient, set shortEnv to numEnvelopes(shortend Envelope = shortEnv-1)*/ 10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->SbrEnvFrame.SbrFrameInfo.shortEnv = h_envChan[1]->SbrEnvFrame.SbrFrameInfo.nEnvelopes; 10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* compare left and right frame_infos */ 10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (eData[0].frame_info->nEnvelopes != eData[1].frame_info->nEnvelopes) { 10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stereoMode = SBR_LEFT_RIGHT; 10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < eData[0].frame_info->nEnvelopes + 1; i++) { 10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (eData[0].frame_info->borders[i] != eData[1].frame_info->borders[i]) { 10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stereoMode = SBR_LEFT_RIGHT; 10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < eData[0].frame_info->nEnvelopes; i++) { 10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (eData[0].frame_info->freqRes[i] != eData[1].frame_info->freqRes[i]) { 10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stereoMode = SBR_LEFT_RIGHT; 10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (eData[0].frame_info->shortEnv != eData[1].frame_info->shortEnv) { 10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stereoMode = SBR_LEFT_RIGHT; 10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_COUPLING: 11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].frame_info = eData[0].frame_info; 11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid; 11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_MONO: 11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* nothing to do */ 11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT (0); 11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (ch = 0; ch < nChannels;ch++) 11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_ENV_CHANNEL hEnvChan = h_envChan[ch]; 11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope; 11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_ENV_TEMP_DATA *ed = &eData[ch]; 11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Send transient info to bitstream and store for next call 11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->pre_transient_info[0] = ed->transient_info[0];/* tran_pos */ 11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->pre_transient_info[1] = ed->transient_info[1];/* tran_flag */ 11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.noOfEnvelopes = ed->nEnvelopes = ed->frame_info->nEnvelopes; /* number of envelopes of current frame */ 11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Check if the current frame is divided into one envelope only. If so, set the amplitude 11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project resolution to 1.5 dB, otherwise may set back to chosen value 11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( ( hEnvChan->encEnvData.hSbrBSGrid->frameClass == FIXFIX ) 11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && ( ed->nEnvelopes == 1 ) ) 11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hEnvChan->encEnvData.ldGrid) 11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.currentAmpResFF = (AMP_RES)h_con->initAmpResFF; 11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.currentAmpResFF = SBR_AMP_RES_1_5; 11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( hEnvChan->encEnvData.currentAmpResFF != hEnvChan->encEnvData.init_sbr_amp_res) { 11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_InitSbrHuffmanTables(&hEnvChan->encEnvData, 11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hEnvChan->sbrCodeEnvelope, 11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hEnvChan->sbrCodeNoiseFloor, 11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.currentAmpResFF); 11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(sbrHeaderData->sbr_amp_res != hEnvChan->encEnvData.init_sbr_amp_res ) { 11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_InitSbrHuffmanTables(&hEnvChan->encEnvData, 11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hEnvChan->sbrCodeEnvelope, 11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hEnvChan->sbrCodeNoiseFloor, 11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->sbr_amp_res); 11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!clearOutput) { 11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Tonality correction parameter extraction (inverse filtering level, noise floor additional sines). 11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_TonCorrParamExtr(&hEnvChan->TonCorr, 11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.sbr_invf_mode_vec, 11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ed->noiseFloor, 11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hEnvChan->encEnvData.addHarmonicFlag, 11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.addHarmonic, 11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrExtrEnv->envelopeCompensation, 11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ed->frame_info, 11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ed->transient_info, 11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->freqBandTable[HI], 11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->nSfb[HI], 11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.sbr_xpos_mode, 11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->sbrSyntaxFlags); 11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Low energy in low band fix */ 11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( hEnvChan->sbrTransientDetector.prevLowBandEnergy < hEnvChan->sbrTransientDetector.prevHighBandEnergy && hEnvChan->sbrTransientDetector.prevHighBandEnergy > FL2FX_DBL(0.03)) 11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->fLevelProtect = 1; 11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<MAX_NUM_NOISE_VALUES; i++) 11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.sbr_invf_mode_vec[i] = INVF_HIGH_LEVEL; 11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->fLevelProtect = 0; 11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.sbr_invf_mode = hEnvChan->encEnvData.sbr_invf_mode_vec[0]; 11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hEnvChan->encEnvData.noOfnoisebands = hEnvChan->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; 11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* ch */ 11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Save number of scf bands per envelope 12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (ch = 0; ch < nChannels;ch++) { 12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < eData[ch].nEnvelopes; i++){ 12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->encEnvData.noScfBands[i] = 12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[ch].frame_info->freqRes[i] == FREQ_RES_HIGH ? h_con->nSfb[FREQ_RES_HIGH] : h_con->nSfb[FREQ_RES_LOW]); 12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Extract envelope of current frame. 12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (stereoMode) { 12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_MONO: 12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, 12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, 12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info, eData[0].sfb_nrg, NULL, 12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con, h_envChan[0], SBR_MONO, NULL, YSzShift); 12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_LEFT_RIGHT: 12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, 12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, 12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info, eData[0].sfb_nrg, NULL, 12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con, h_envChan[0], SBR_MONO, NULL, YSzShift); 12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateSbrEnvelope (h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL, 12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL, 12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].frame_info,eData[1].sfb_nrg, NULL, 12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con, h_envChan[1], SBR_MONO, NULL, YSzShift); 12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_COUPLING: 12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, h_envChan[1]->sbrExtractEnvelope.YBuffer, 12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrExtractEnvelope.YBufferScale, h_envChan[1]->sbrExtractEnvelope.YBufferScale, 12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info, eData[0].sfb_nrg, eData[1].sfb_nrg, 12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con, h_envChan[0], SBR_COUPLING, &fData->maxQuantError, YSzShift); 12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_SWITCH_LRC: 12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, 12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, 12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info, eData[0].sfb_nrg, NULL, 12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con, h_envChan[0], SBR_MONO, NULL, YSzShift); 12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateSbrEnvelope (h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL, 12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL, 12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].frame_info, eData[1].sfb_nrg, NULL, 12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con, h_envChan[1], SBR_MONO,NULL, YSzShift); 12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, h_envChan[1]->sbrExtractEnvelope.YBuffer, 12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrExtractEnvelope.YBufferScale, h_envChan[1]->sbrExtractEnvelope.YBufferScale, 12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info, eData[0].sfb_nrg_coupling, eData[1].sfb_nrg_coupling, 12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con, h_envChan[0], SBR_COUPLING, &fData->maxQuantError, YSzShift); 12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Noise floor quantisation and coding. 12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (stereoMode) { 12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_MONO: 12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrNoiseFloorLevelsQuantisation(eData[0].noise_level, eData[0].noiseFloor, 0); 12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope(eData[0].noise_level, fData->res, 12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeNoiseFloor, 12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec_noise, 0, 12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, 12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_LEFT_RIGHT: 12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0); 12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res, 12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeNoiseFloor, 12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec_noise, 0, 12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, 12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 0); 12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res, 12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->sbrCodeNoiseFloor, 12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.domain_vec_noise, 0, 12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0, 12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_COUPLING: 12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project coupleNoiseFloor(eData[0].noiseFloor,eData[1].noiseFloor); 12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0); 12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res, 12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeNoiseFloor, 12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec_noise, 1, 12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, 12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 1); 12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res, 13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->sbrCodeNoiseFloor, 13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.domain_vec_noise, 1, 13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1, 13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_SWITCH_LRC: 13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0); 13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 0); 13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project coupleNoiseFloor(eData[0].noiseFloor,eData[1].noiseFloor); 13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrNoiseFloorLevelsQuantisation(eData[0].noise_level_coupling,eData[0].noiseFloor, 0); 13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrNoiseFloorLevelsQuantisation(eData[1].noise_level_coupling,eData[1].noiseFloor, 1); 13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Encode envelope of current frame. 13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (stereoMode) { 13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_MONO: 13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling = 0; 13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.balance = 0; 13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, 13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeEnvelope, 13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec, 13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling, 13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info->nEnvelopes, 0, 13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_LEFT_RIGHT: 13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling = 0; 13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.balance = 0; 13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.balance = 0; 13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, 13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeEnvelope, 13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec, 13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling, 13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info->nEnvelopes, 0, 13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes, 13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->sbrCodeEnvelope, 13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.domain_vec, 13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling, 13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].frame_info->nEnvelopes, 0, 13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_COUPLING: 13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling = 1; 13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.balance = 0; 13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.balance = 1; 13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, 13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeEnvelope, 13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec, 13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling, 13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info->nEnvelopes, 0, 13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes, 13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->sbrCodeEnvelope, 13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.domain_vec, 13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling, 13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].frame_info->nEnvelopes, 1, 13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case SBR_SWITCH_LRC: 13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT payloadbitsLR; 13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT payloadbitsCOUPLING; 13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR sfbNrgPrevTemp[MAX_NUM_CHANNELS][MAX_FREQ_COEFFS]; 13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR noisePrevTemp[MAX_NUM_CHANNELS][MAX_NUM_NOISE_COEFFS]; 13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT upDateNrgTemp[MAX_NUM_CHANNELS]; 13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT upDateNoiseTemp[MAX_NUM_CHANNELS]; 13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT domainVecTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES]; 13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT domainVecNoiseTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES]; 13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT tempFlagRight = 0; 13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT tempFlagLeft = 0; 13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Store previous values, in order to be able to "undo" what is being done. 13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(ch = 0; ch < nChannels;ch++){ 13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (sfbNrgPrevTemp[ch], h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev, 13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MAX_FREQ_COEFFS * sizeof (SCHAR)); 13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (noisePrevTemp[ch], h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev, 13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MAX_NUM_NOISE_COEFFS * sizeof (SCHAR)); 13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project upDateNrgTemp[ch] = h_envChan[ch]->sbrCodeEnvelope.upDate; 13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project upDateNoiseTemp[ch] = h_envChan[ch]->sbrCodeNoiseFloor.upDate; 13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project forbid time coding in the first envelope in case of a different 14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project previous stereomode 14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(sbrHeaderData->prev_coupling){ 14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeEnvelope.upDate = 0; 14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0; 14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* ch */ 14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Code ordinary Left/Right stereo 14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, 14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeEnvelope, 14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec, 0, 14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info->nEnvelopes, 0, 14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes, 14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->sbrCodeEnvelope, 14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.domain_vec, 0, 14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].frame_info->nEnvelopes, 0, 14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project c = 0; 14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < eData[0].nEnvelopes; i++) { 14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++) 14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.ienvelope[i][j] = eData[0].sfb_nrg[c]; 14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.ienvelope[i][j] = eData[1].sfb_nrg[c]; 14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project c++; 14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res, 14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeNoiseFloor, 14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec_noise, 0, 14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, 14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) 14442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.sbr_noise_levels[i] = eData[0].noise_level[i]; 14452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res, 14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->sbrCodeNoiseFloor, 14492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.domain_vec_noise, 0, 14502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0, 14512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 14522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) 14542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.sbr_noise_levels[i] = eData[1].noise_level[i]; 14552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling = 0; 14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.balance = 0; 14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.balance = 0; 14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project payloadbitsLR = FDKsbrEnc_CountSbrChannelPairElement (sbrHeaderData, 14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hParametricStereo, 14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData, 14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->encEnvData, 14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->encEnvData, 14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hCmonData, 14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->sbrSyntaxFlags); 14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project swap saved stored with current values 14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(ch = 0; ch < nChannels;ch++){ 14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT itmp; 14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<MAX_FREQ_COEFFS;i++){ 14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project swap sfb energies 14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project itmp = h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev[i]; 14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev[i]=sfbNrgPrevTemp[ch][i]; 14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfbNrgPrevTemp[ch][i]=itmp; 14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<MAX_NUM_NOISE_COEFFS;i++){ 14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project swap noise energies 14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project itmp = h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev[i]; 14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev[i]=noisePrevTemp[ch][i]; 14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noisePrevTemp[ch][i]=itmp; 14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* swap update flags */ 14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project itmp = h_envChan[ch]->sbrCodeEnvelope.upDate; 14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeEnvelope.upDate=upDateNrgTemp[ch]; 14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project upDateNrgTemp[ch] = itmp; 14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project itmp = h_envChan[ch]->sbrCodeNoiseFloor.upDate; 14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeNoiseFloor.upDate=upDateNoiseTemp[ch]; 14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project upDateNoiseTemp[ch]=itmp; 14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project save domain vecs 15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(domainVecTemp[ch],h_envChan[ch]->encEnvData.domain_vec,sizeof(INT)*MAX_ENVELOPES); 15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(domainVecNoiseTemp[ch],h_envChan[ch]->encEnvData.domain_vec_noise,sizeof(INT)*MAX_ENVELOPES); 15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project forbid time coding in the first envelope in case of a different 15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project previous stereomode 15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(!sbrHeaderData->prev_coupling){ 15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeEnvelope.upDate = 0; 15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0; 15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* ch */ 15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Coupling 15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg_coupling, eData[0].frame_info->freqRes, 15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeEnvelope, 15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec, 1, 15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[0].frame_info->nEnvelopes, 0, 15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg_coupling, eData[1].frame_info->freqRes, 15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->sbrCodeEnvelope, 15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.domain_vec, 1, 15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project eData[1].frame_info->nEnvelopes, 1, 15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project c = 0; 15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < eData[0].nEnvelopes; i++) { 15362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++) { 15372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.ienvelope[i][j] = eData[0].sfb_nrg_coupling[c]; 15382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.ienvelope[i][j] = eData[1].sfb_nrg_coupling[c]; 15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project c++; 15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[0].noise_level_coupling, fData->res, 15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->sbrCodeNoiseFloor, 15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.domain_vec_noise, 1, 15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, 15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) 15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.sbr_noise_levels[i] = eData[0].noise_level_coupling[i]; 15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_codeEnvelope (eData[1].noise_level_coupling, fData->res, 15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->sbrCodeNoiseFloor, 15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.domain_vec_noise, 1, 15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1, 15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData->HeaderActive); 15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) 15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.sbr_noise_levels[i] = eData[1].noise_level_coupling[i]; 15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling = 1; 15632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.balance = 0; 15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.balance = 1; 15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempFlagLeft = h_envChan[0]->encEnvData.addHarmonicFlag; 15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempFlagRight = h_envChan[1]->encEnvData.addHarmonicFlag; 15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project payloadbitsCOUPLING = 15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_CountSbrChannelPairElement (sbrHeaderData, 15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hParametricStereo, 15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData, 15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->encEnvData, 15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->encEnvData, 15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hCmonData, 15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->sbrSyntaxFlags); 15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.addHarmonicFlag = tempFlagLeft; 15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.addHarmonicFlag = tempFlagRight; 15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (payloadbitsCOUPLING < payloadbitsLR) { 15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project copy coded coupling envelope and noise data to l/r 15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(ch = 0; ch < nChannels;ch++){ 15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_ENV_TEMP_DATA *ed = &eData[ch]; 15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (ed->sfb_nrg, ed->sfb_nrg_coupling, 15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MAX_NUM_ENVELOPE_VALUES * sizeof (SCHAR)); 15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (ed->noise_level, ed->noise_level_coupling, 15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MAX_NUM_NOISE_VALUES * sizeof (SCHAR)); 15942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling = 1; 15972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.balance = 0; 15982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.balance = 1; 15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 16022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project restore saved l/r items 16032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 16042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(ch = 0; ch < nChannels;ch++){ 16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev, 16072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfbNrgPrevTemp[ch], MAX_FREQ_COEFFS * sizeof (SCHAR)); 16082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeEnvelope.upDate = upDateNrgTemp[ch]; 16102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev, 16122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noisePrevTemp[ch], MAX_NUM_NOISE_COEFFS * sizeof (SCHAR)); 16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (h_envChan[ch]->encEnvData.domain_vec,domainVecTemp[ch],sizeof(INT)*MAX_ENVELOPES); 16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy (h_envChan[ch]->encEnvData.domain_vec_noise,domainVecNoiseTemp[ch],sizeof(INT)*MAX_ENVELOPES); 16162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrCodeNoiseFloor.upDate = upDateNoiseTemp[ch]; 16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->coupling = 0; 16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->encEnvData.balance = 0; 16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.balance = 0; 16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* switch */ 16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* tell the envelope encoders how long it has been, since we last sent 16302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project a frame starting with a dF-coded envelope */ 16312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (stereoMode == SBR_MONO ) { 16322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_envChan[0]->encEnvData.domain_vec[0] == TIME) 16332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++; 16342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 16352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0; 16362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 16382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (h_envChan[0]->encEnvData.domain_vec[0] == TIME || 16392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->encEnvData.domain_vec[0] == TIME) { 16402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++; 16412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac++; 16422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 16442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0; 16452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac = 0; 16462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 16502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Send the encoded data to the bitstream 16512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 16522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(ch = 0; ch < nChannels;ch++){ 16532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_ENV_TEMP_DATA *ed = &eData[ch]; 16542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project c = 0; 16552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < ed->nEnvelopes; i++) { 16562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (j = 0; j < h_envChan[ch]->encEnvData.noScfBands[i]; j++) { 16572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->encEnvData.ienvelope[i][j] = ed->sfb_nrg[c]; 16582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project c++; 16602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < MAX_NUM_NOISE_VALUES; i++){ 16632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->encEnvData.sbr_noise_levels[i] = ed->noise_level[i]; 16642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project }/* ch */ 16662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 16692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Write bitstream 16702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 16712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nChannels == 2) { 16722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_WriteEnvChannelPairElement(sbrHeaderData, 16732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hParametricStereo, 16742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData, 16752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->encEnvData, 16762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[1]->encEnvData, 16772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hCmonData, 16782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->sbrSyntaxFlags); 16792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 16812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsbrEnc_WriteEnvSingleChannelElement(sbrHeaderData, 16822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hParametricStereo, 16832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrBitstreamData, 16842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &h_envChan[0]->encEnvData, 16852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hCmonData, 16862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_con->sbrSyntaxFlags); 16872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 16902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Update buffers. 16912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 16922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (ch=0; ch<nChannels; ch++) 16932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 16942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int YBufferLength = h_envChan[ch]->sbrExtractEnvelope.no_cols >> h_envChan[ch]->sbrExtractEnvelope.YBufferSzShift; 16952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < h_envChan[ch]->sbrExtractEnvelope.YBufferWriteOffset; i++) { 16962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(h_envChan[ch]->sbrExtractEnvelope.YBuffer[i], 16972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrExtractEnvelope.YBuffer[i + YBufferLength], 16982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sizeof(FIXP_DBL)*QMF_CHANNELS); 16992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_envChan[ch]->sbrExtractEnvelope.YBufferScale[0] = h_envChan[ch]->sbrExtractEnvelope.YBufferScale[1]; 17012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrHeaderData->prev_coupling = sbrHeaderData->coupling; 17042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 17052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 17072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 17082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief creates an envelope extractor handle 17102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return error status 17122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 17142228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT 17152228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_CreateExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut, 17162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT channel 17172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ,INT chInEl 17182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ,UCHAR* dynamic_RAM 17192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 17202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 17212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i; 17222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL* YBuffer = GetRam_Sbr_envYBuffer(channel); 17232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hSbrCut,sizeof(SBR_EXTRACT_ENVELOPE)); 17252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->p_YBuffer = YBuffer; 17262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < (QMF_MAX_TIME_SLOTS>>1); i++) { 17292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBuffer[i] = YBuffer + (i*QMF_CHANNELS); 17302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM); 17322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT n=0; 17332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (; i < QMF_MAX_TIME_SLOTS; i++,n++) { 17342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBuffer[i] = YBufferDyn + (n*QMF_CHANNELS); 17352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL* rBuffer = GetRam_Sbr_envRBuffer(0, dynamic_RAM); 17382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL* iBuffer = GetRam_Sbr_envIBuffer(0, dynamic_RAM); 17392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < QMF_MAX_TIME_SLOTS; i++) { 17412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->rBuffer[i] = rBuffer + (i*QMF_CHANNELS); 17422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->iBuffer[i] = iBuffer + (i*QMF_CHANNELS); 17432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 17462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 17472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 17502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 17512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Initialize an envelope extractor instance. 17532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return error status 17552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 17572228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT 17582228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_InitExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut, 17592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int no_cols, 17602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int no_rows, 17612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int start_index, 17622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int time_slots, 17632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int time_step, 17642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int tran_off, 17652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ULONG statesInitFlag 17662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ,int chInEl 17672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ,UCHAR* dynamic_RAM 17682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ,UINT sbrSyntaxFlags 17692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 17702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 17712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int YBufferLength, rBufferLength; 17722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 17732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { 17752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int off = TRANSIENT_OFFSET_LD; 17762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifndef FULL_DELAY 17772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBufferWriteOffset = (no_cols>>1)+off*time_step; 17782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else 17792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBufferWriteOffset = no_cols+off*time_step; 17802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 17812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else 17822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 17832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBufferWriteOffset = tran_off*time_step; 17842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->rBufferReadOffset = 0; 17862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferLength = hSbrCut->YBufferWriteOffset + no_cols; 17892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project rBufferLength = no_cols; 17902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->pre_transient_info[0] = 0; 17922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->pre_transient_info[1] = 0; 17932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->no_cols = no_cols; 17962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->no_rows = no_rows; 17972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->start_index = start_index; 17982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->time_slots = time_slots; 18002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->time_step = time_step; 18012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(no_rows <= QMF_CHANNELS); 18032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Use half the Energy values if time step is 2 or greater */ 18052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (time_step >= 2) 18062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBufferSzShift = 1; 18072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 18082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBufferSzShift = 0; 18092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project YBufferLength >>= hSbrCut->YBufferSzShift; 18112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBufferWriteOffset >>= hSbrCut->YBufferSzShift; 18122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(YBufferLength<=QMF_MAX_TIME_SLOTS); 18142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM); 18162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT n=0; 18172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=(QMF_MAX_TIME_SLOTS>>1); i < QMF_MAX_TIME_SLOTS; i++,n++) { 18182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBuffer[i] = YBufferDyn + (n*QMF_CHANNELS); 18192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(statesInitFlag) { 18222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<YBufferLength; i++) { 18232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear( hSbrCut->YBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL)); 18242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < rBufferLength; i++) { 18282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear( hSbrCut->rBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL)); 18292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear( hSbrCut->iBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL)); 18302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear (hSbrCut->envelopeCompensation,sizeof(UCHAR)*MAX_FREQ_COEFFS); 18332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(statesInitFlag) { 18352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrCut->YBufferScale[0] = hSbrCut->YBufferScale[1] = FRACT_BITS-1; 18362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return (0); 18392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 18402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/ 18452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 18462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief deinitializes an envelope extractor handle 18482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return void 18502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 18522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid 18542228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_deleteExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut) 18552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 18562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hSbrCut) { 18582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeRam_Sbr_envYBuffer(&hSbrCut->p_YBuffer); 18592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 18612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18622228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT 18632228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_GetEnvEstDelay(HANDLE_SBR_EXTRACT_ENVELOPE hSbr) 18642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 18652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return hSbr->no_rows*((hSbr->YBufferWriteOffset)*2 /* mult 2 because nrg's are grouped half */ 18662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project - hSbr->rBufferReadOffset ); /* in reference hold half spec and calc nrg's on overlapped spec */ 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 18722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1873