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