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