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