Home | History | Annotate | Download | only in src
      1 
      2 /* -----------------------------------------------------------------------------------------------------------
      3 Software License for The Fraunhofer FDK AAC Codec Library for Android
      4 
      5  Copyright  1995 - 2012 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V.
      6   All rights reserved.
      7 
      8  1.    INTRODUCTION
      9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
     10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
     11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
     14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
     15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
     16 of the MPEG specifications.
     17 
     18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
     19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
     20 individually for the purpose of encoding or decoding bit streams in products that are compliant with
     21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
     22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
     23 software may already be covered under those patent licenses when it is used for those licensed purposes only.
     24 
     25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
     26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
     27 applications information and documentation.
     28 
     29 2.    COPYRIGHT LICENSE
     30 
     31 Redistribution and use in source and binary forms, with or without modification, are permitted without
     32 payment of copyright license fees provided that you satisfy the following conditions:
     33 
     34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
     35 your modifications thereto in source code form.
     36 
     37 You must retain the complete text of this software license in the documentation and/or other materials
     38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
     39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
     40 modifications thereto to recipients of copies in binary form.
     41 
     42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
     43 prior written permission.
     44 
     45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
     46 software or your modifications thereto.
     47 
     48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
     49 and the date of any change. For modified versions of the FDK AAC Codec, the term
     50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
     51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
     52 
     53 3.    NO PATENT LICENSE
     54 
     55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
     56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
     57 respect to this software.
     58 
     59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
     60 by appropriate patent licenses.
     61 
     62 4.    DISCLAIMER
     63 
     64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
     65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
     66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
     68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
     69 or business interruption, however caused and on any theory of liability, whether in contract, strict
     70 liability, or tort (including negligence), arising in any way out of the use of this software, even if
     71 advised of the possibility of such damage.
     72 
     73 5.    CONTACT INFORMATION
     74 
     75 Fraunhofer Institute for Integrated Circuits IIS
     76 Attention: Audio and Multimedia Departments - FDK AAC LL
     77 Am Wolfsmantel 33
     78 91058 Erlangen, Germany
     79 
     80 www.iis.fraunhofer.de/amm
     81 amm-info (at) iis.fraunhofer.de
     82 ----------------------------------------------------------------------------------------------------------- */
     83 
     84 #include "env_est.h"
     85 #include "tran_det.h"
     86 
     87 #include "qmf.h"
     88 
     89 #include "fram_gen.h"
     90 #include "bit_sbr.h"
     91 #include "cmondata.h"
     92 #include "sbr_ram.h"
     93 
     94 
     95 #include "genericStds.h"
     96 
     97 #define QUANT_ERROR_THRES 200
     98 #define Y_NRG_SCALE 5 /* noCols = 32 -> shift(5) */
     99 
    100 
    101 static const UCHAR panTable[2][10] = { { 0, 2, 4, 6, 8,12,16,20,24},
    102                                        { 0, 2, 4, 8,12, 0, 0, 0, 0 } };
    103 static const UCHAR maxIndex[2] = {9, 5};
    104 
    105 
    106 /***************************************************************************/
    107 /*!
    108 
    109   \brief      Calculates energy form real and imaginary part of
    110               the QMF subsamples
    111 
    112   \return     none
    113 
    114 ****************************************************************************/
    115 LNK_SECTION_CODE_L1
    116 static void
    117 FDKsbrEnc_getEnergyFromCplxQmfData(FIXP_DBL **RESTRICT energyValues,/*!< the result of the operation */
    118                                    FIXP_DBL **RESTRICT realValues,  /*!< the real part of the QMF subsamples */
    119                                    FIXP_DBL **RESTRICT imagValues,  /*!< the imaginary part of the QMF subsamples */
    120                                    INT   numberBands,               /*!< number of QMF bands */
    121                                    INT   numberCols,                /*!< number of QMF subsamples */
    122                                    INT   *qmfScale,                 /*!< sclefactor of QMF subsamples */
    123                                    INT   *energyScale)              /*!< scalefactor of energies */
    124 {
    125   int j, k;
    126   int scale;
    127   FIXP_DBL max_val = FL2FXCONST_DBL(0.0f);
    128 
    129   /* Get Scratch buffer */
    130   C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, QMF_CHANNELS*QMF_MAX_TIME_SLOTS/2);
    131 
    132   FDK_ASSERT(numberBands <= QMF_CHANNELS);
    133   FDK_ASSERT(numberCols <= QMF_MAX_TIME_SLOTS);
    134 
    135   /* Get max possible scaling of QMF data */
    136   scale = DFRACT_BITS;
    137   for (k=0; k<numberCols; k++) {
    138     scale = fixMin(scale, fixMin(getScalefactor(realValues[k], numberBands), getScalefactor(imagValues[k], numberBands)));
    139   }
    140 
    141   /* Tweak scaling stability for zero signal to non-zero signal transitions */
    142   if (scale >= DFRACT_BITS-1) {
    143     scale = (FRACT_BITS-1-*qmfScale);
    144   }
    145   /* prevent scaling of QFM values to -1.f */
    146   scale = fixMax(0,scale-1);
    147 
    148   /* Update QMF scale */
    149   *qmfScale += scale;
    150 
    151   /*
    152      Calculate energy of each time slot pair, max energy
    153      and shift QMF values as far as possible to the left.
    154    */
    155   {
    156     FIXP_DBL *nrgValues = tmpNrg;
    157     for (k=0; k<numberCols; k+=2)
    158     {
    159       /* Load band vector addresses of 2 consecutive timeslots */
    160       FIXP_DBL *RESTRICT r0 = realValues[k];
    161       FIXP_DBL *RESTRICT i0 = imagValues[k];
    162       FIXP_DBL *RESTRICT r1 = realValues[k+1];
    163       FIXP_DBL *RESTRICT i1 = imagValues[k+1];
    164       for (j=0; j<numberBands; j++)
    165       {
    166         FIXP_DBL  energy;
    167         FIXP_DBL  tr0,tr1,ti0,ti1;
    168 
    169         /* Read QMF values of 2 timeslots */
    170         tr0 = r0[j]; tr1 = r1[j]; ti0 = i0[j]; ti1 = i1[j];
    171 
    172         /* Scale QMF Values and Calc Energy of both timeslots */
    173         tr0 <<= scale;
    174         ti0 <<= scale;
    175         energy = fPow2AddDiv2(fPow2Div2(tr0), ti0) >> 1;
    176 
    177         tr1 <<= scale;
    178         ti1 <<= scale;
    179         energy += fPow2AddDiv2(fPow2Div2(tr1), ti1) >> 1;
    180 
    181         /* Write timeslot pair energy to scratch */
    182         *nrgValues++ = energy;
    183         max_val = fixMax(max_val, energy);
    184 
    185         /* Write back scaled QMF values */
    186         r0[j] = tr0; r1[j] = tr1; i0[j] = ti0; i1[j] = ti1;
    187       }
    188     }
    189   }
    190   /* energyScale: scalefactor energies of current frame */
    191   *energyScale = 2*(*qmfScale)-1;       /* if qmfScale > 0: nr of right shifts otherwise nr of left shifts */
    192 
    193   /* Scale timeslot pair energies and write to output buffer */
    194   scale = CountLeadingBits(max_val);
    195   {
    196   	FIXP_DBL *nrgValues = tmpNrg;
    197     for (k=0; k<numberCols>>1; k++) {
    198       scaleValues(energyValues[k], nrgValues, numberBands, scale);
    199       nrgValues += numberBands;
    200     }
    201     *energyScale += scale;
    202   }
    203 
    204   /* Free Scratch buffer */
    205   C_ALLOC_SCRATCH_END(tmpNrg, FIXP_DBL, QMF_CHANNELS*QMF_MAX_TIME_SLOTS/2);
    206 }
    207 
    208 LNK_SECTION_CODE_L1
    209 static void
    210 FDKsbrEnc_getEnergyFromCplxQmfDataFull(FIXP_DBL **RESTRICT energyValues,/*!< the result of the operation */
    211                                        FIXP_DBL **RESTRICT realValues,  /*!< the real part of the QMF subsamples */
    212                                        FIXP_DBL **RESTRICT imagValues,  /*!< the imaginary part of the QMF subsamples */
    213                                        int   numberBands,               /*!< number of QMF bands */
    214                                        int   numberCols,                /*!< number of QMF subsamples */
    215                                        int   *qmfScale,                 /*!< sclefactor of QMF subsamples */
    216                                        int   *energyScale)              /*!< scalefactor of energies */
    217 {
    218   int j, k;
    219   int scale;
    220   FIXP_DBL max_val = FL2FXCONST_DBL(0.0f);
    221 
    222   /* Get Scratch buffer */
    223   C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, QMF_MAX_TIME_SLOTS*QMF_CHANNELS/2);
    224 
    225   FDK_ASSERT(numberBands <= QMF_CHANNELS);
    226   FDK_ASSERT(numberCols <= QMF_MAX_TIME_SLOTS/2);
    227 
    228   /* Get max possible scaling of QMF data */
    229   scale = DFRACT_BITS;
    230   for (k=0; k<numberCols; k++) {
    231     scale = fixMin(scale, fixMin(getScalefactor(realValues[k], numberBands), getScalefactor(imagValues[k], numberBands)));
    232   }
    233 
    234   /* Tweak scaling stability for zero signal to non-zero signal transitions */
    235   if (scale >= DFRACT_BITS-1) {
    236     scale = (FRACT_BITS-1-*qmfScale);
    237   }
    238   /* prevent scaling of QFM values to -1.f */
    239   scale = fixMax(0,scale-1);
    240 
    241   /* Update QMF scale */
    242   *qmfScale += scale;
    243 
    244   /*
    245      Calculate energy of each time slot pair, max energy
    246      and shift QMF values as far as possible to the left.
    247    */
    248   {
    249     FIXP_DBL *nrgValues = tmpNrg;
    250     for (k=0; k<numberCols; k++)
    251     {
    252       /* Load band vector addresses of 2 consecutive timeslots */
    253       FIXP_DBL *RESTRICT r0 = realValues[k];
    254       FIXP_DBL *RESTRICT i0 = imagValues[k];
    255       for (j=0; j<numberBands; j++)
    256       {
    257         FIXP_DBL  energy;
    258         FIXP_DBL  tr0,ti0;
    259 
    260         /* Read QMF values of 2 timeslots */
    261         tr0 = r0[j]; ti0 = i0[j];
    262 
    263         /* Scale QMF Values and Calc Energy of both timeslots */
    264         tr0 <<= scale;
    265         ti0 <<= scale;
    266         energy = fPow2AddDiv2(fPow2Div2(tr0), ti0);
    267         *nrgValues++ = energy;
    268 
    269         max_val = fixMax(max_val, energy);
    270 
    271         /* Write back scaled QMF values */
    272         r0[j] = tr0; i0[j] = ti0;
    273       }
    274     }
    275   }
    276   /* energyScale: scalefactor energies of current frame */
    277   *energyScale = 2*(*qmfScale)-1;       /* if qmfScale > 0: nr of right shifts otherwise nr of left shifts */
    278 
    279   /* Scale timeslot pair energies and write to output buffer */
    280   scale = CountLeadingBits(max_val);
    281   {
    282   	FIXP_DBL *nrgValues = tmpNrg;
    283     for (k=0; k<numberCols; k++) {
    284       scaleValues(energyValues[k], nrgValues, numberBands, scale);
    285       nrgValues += numberBands;
    286     }
    287     *energyScale += scale;
    288   }
    289 
    290   /* Free Scratch buffer */
    291   C_ALLOC_SCRATCH_END(tmpNrg, FIXP_DBL, QMF_MAX_TIME_SLOTS*QMF_CHANNELS/2);
    292 }
    293 
    294 /***************************************************************************/
    295 /*!
    296 
    297   \brief  Quantisation of the panorama value (balance)
    298 
    299   \return the quantized pan value
    300 
    301 ****************************************************************************/
    302 static INT
    303 mapPanorama(INT nrgVal,     /*! integer value of the energy */
    304             INT ampRes,     /*! amplitude resolution [1.5/3dB] */
    305             INT *quantError /*! quantization error of energy val*/
    306            )
    307 {
    308   int i;
    309   INT min_val, val;
    310   UCHAR panIndex;
    311   INT sign;
    312 
    313   sign = nrgVal > 0 ? 1 : -1;
    314 
    315   nrgVal *= sign;
    316 
    317   min_val = FDK_INT_MAX;
    318   panIndex = 0;
    319   for (i = 0; i < maxIndex[ampRes]; i++) {
    320     val = fixp_abs ((nrgVal - (INT)panTable[ampRes][i]));
    321 
    322     if (val < min_val) {
    323       min_val = val;
    324       panIndex = i;
    325     }
    326   }
    327 
    328   *quantError=min_val;
    329 
    330   return panTable[ampRes][maxIndex[ampRes]-1] + sign * panTable[ampRes][panIndex];
    331 }
    332 
    333 
    334 /***************************************************************************/
    335 /*!
    336 
    337   \brief  Quantisation of the noise floor levels
    338 
    339   \return void
    340 
    341 ****************************************************************************/
    342 static void
    343 sbrNoiseFloorLevelsQuantisation(SCHAR    *RESTRICT iNoiseLevels, /*! quantized noise levels */
    344                                 FIXP_DBL *RESTRICT NoiseLevels,  /*! the noise levels  */
    345                                 INT       coupling               /*! the coupling flag */
    346                                )
    347 {
    348   INT i;
    349   INT tmp, dummy;
    350 
    351   /* Quantisation, similar to sfb quant... */
    352   for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) {
    353     /* tmp = NoiseLevels[i] > (PFLOAT)30.0f ? 30: (INT) (NoiseLevels[i] + (PFLOAT)0.5); */
    354     /* 30>>6 = 0.46875 */
    355     if ((FIXP_DBL)NoiseLevels[i] > FL2FXCONST_DBL(0.46875f)) {
    356       tmp = 30;
    357     }
    358     else {
    359       /* tmp = (INT)((FIXP_DBL)NoiseLevels[i] + (FL2FXCONST_DBL(0.5f)>>(*/ /* FRACT_BITS+ */ /* 6-1)));*/
    360       /* tmp = tmp >> (DFRACT_BITS-1-6); */ /* conversion to integer happens here */
    361       /* rounding is done by shifting one bit less than necessary to the right, adding '1' and then shifting the final bit */
    362       tmp = ((((INT)NoiseLevels[i])>>(DFRACT_BITS-1-LD_DATA_SHIFT)) ); /* conversion to integer */
    363 			 if (tmp != 0)
    364 			   tmp += 1;
    365     }
    366 
    367     if (coupling) {
    368       tmp = tmp < -30 ? -30 : tmp;
    369       tmp = mapPanorama (tmp,1,&dummy);
    370     }
    371     iNoiseLevels[i] = tmp;
    372   }
    373 }
    374 
    375 /***************************************************************************/
    376 /*!
    377 
    378   \brief  Calculation of noise floor for coupling
    379 
    380   \return void
    381 
    382 ****************************************************************************/
    383 static void
    384 coupleNoiseFloor(FIXP_DBL *RESTRICT noise_level_left, /*! noise level left  (modified)*/
    385                  FIXP_DBL *RESTRICT noise_level_right /*! noise level right (modified)*/
    386                 )
    387 {
    388   FIXP_DBL cmpValLeft,cmpValRight;
    389   INT i;
    390   FIXP_DBL temp1,temp2;
    391 
    392   for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) {
    393 
    394     /* Calculation of the power function using ld64:
    395        z  = x^y;
    396        z' = CalcLd64(z) = y*CalcLd64(x)/64;
    397        z  = CalcInvLd64(z');
    398     */
    399     cmpValLeft  = NOISE_FLOOR_OFFSET_64 - noise_level_left[i];
    400     cmpValRight = NOISE_FLOOR_OFFSET_64 - noise_level_right[i];
    401 
    402     if (cmpValRight < FL2FXCONST_DBL(0.0f)) {
    403       temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]);
    404     }
    405     else {
    406       temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]);
    407       temp1 = temp1 << (DFRACT_BITS-1-LD_DATA_SHIFT-1);  /* INT to fract conversion of result, if input of CalcInvLdData is positiv */
    408     }
    409 
    410     if (cmpValLeft < FL2FXCONST_DBL(0.0f)) {
    411       temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]);
    412     }
    413     else {
    414       temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]);
    415       temp2 = temp2 << (DFRACT_BITS-1-LD_DATA_SHIFT-1);  /* INT to fract conversion of result, if input of CalcInvLdData is positiv */
    416     }
    417 
    418 
    419     if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && (cmpValRight < FL2FXCONST_DBL(0.0f))) {
    420       noise_level_left[i]  = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>1)))); /* no scaling needed! both values are dfract */
    421       noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1);
    422     }
    423 
    424     if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && (cmpValRight >= FL2FXCONST_DBL(0.0f))) {
    425       noise_level_left[i]  = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>1))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */
    426       noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1);
    427     }
    428 
    429     if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && (cmpValRight < FL2FXCONST_DBL(0.0f))) {
    430       noise_level_left[i]  = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>(7+1)) + (temp2>>1))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */
    431       noise_level_right[i] = (CalcLdData(temp2) + FL2FXCONST_DBL(0.109375f)) - CalcLdData(temp1);
    432     }
    433 
    434     if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && (cmpValRight >= FL2FXCONST_DBL(0.0f))) {
    435       noise_level_left[i]  = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>(7+1)))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */
    436       noise_level_right[i] = CalcLdData(temp2) - (CalcLdData(temp1) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */
    437     }
    438   }
    439 }
    440 
    441 /***************************************************************************/
    442 /*!
    443 
    444   \brief  Calculation of energy starting in lower band (li) up to upper band (ui)
    445           over slots (start_pos) to (stop_pos)
    446 
    447   \return void
    448 
    449 ****************************************************************************/
    450 static FIXP_DBL
    451 getEnvSfbEnergy(INT li,              /*! lower band */
    452                 INT ui,              /*! upper band */
    453                 INT start_pos,       /*! start slot */
    454                 INT stop_pos,        /*! stop slot */
    455                 INT border_pos,      /*! slots scaling border */
    456                 FIXP_DBL **YBuffer,  /*! sfb energy buffer */
    457                 INT YBufferSzShift,  /*! Energy buffer index scale */
    458                 INT scaleNrg0,       /*! scaling of lower slots */
    459                 INT scaleNrg1)       /*! scaling of upper slots */
    460 {
    461   /* use dynamic scaling for outer energy loop;
    462      energies are critical and every bit is important */
    463   int sc0, sc1, k, l;
    464 
    465   FIXP_DBL nrgSum, nrg1, nrg2, accu1, accu2;
    466   INT dynScale, dynScale1, dynScale2;
    467   if(ui-li==0) dynScale = DFRACT_BITS-1;
    468   else
    469   dynScale = CalcLdInt(ui-li)>>(DFRACT_BITS-1-LD_DATA_SHIFT);
    470 
    471   sc0 = fixMin(scaleNrg0,Y_NRG_SCALE); sc1 = fixMin(scaleNrg1,Y_NRG_SCALE);
    472   /* dynScale{1,2} is set such that the right shift below is positive */
    473   dynScale1 = fixMin((scaleNrg0-sc0),dynScale);
    474   dynScale2 = fixMin((scaleNrg1-sc1),dynScale);
    475   nrgSum = accu1 = accu2 = (FIXP_DBL)0;
    476 
    477   for (k = li; k < ui; k++) {
    478     nrg1 = nrg2 = (FIXP_DBL)0;
    479     for (l = start_pos; l < border_pos; l++) {
    480       nrg1 += YBuffer[l>>YBufferSzShift][k] >> sc0;
    481     }
    482     for (; l < stop_pos; l++) {
    483       nrg2 += YBuffer[l>>YBufferSzShift][k] >> sc1;
    484     }
    485     accu1 += (nrg1>>dynScale1);
    486     accu2 += (nrg2>>dynScale2);
    487   }
    488   /* This shift factor is always positive. See comment above. */
    489   nrgSum += ( accu1 >> fixMin((scaleNrg0-sc0-dynScale1),(DFRACT_BITS-1)) )
    490           +  ( accu2 >> fixMin((scaleNrg1-sc1-dynScale2),(DFRACT_BITS-1)) );
    491 
    492   return nrgSum;
    493 }
    494 
    495 /***************************************************************************/
    496 /*!
    497 
    498   \brief  Energy compensation in missing harmonic mode
    499 
    500   \return void
    501 
    502 ****************************************************************************/
    503 static FIXP_DBL
    504 mhLoweringEnergy(FIXP_DBL nrg, INT M)
    505 {
    506   /*
    507      Compensating for the fact that we in the decoder map the "average energy to every QMF
    508      band, and use this when we calculate the boost-factor. Since the mapped energy isn't
    509      the average energy but the maximum energy in case of missing harmonic creation, we will
    510      in the boost function calculate that too much limiting has been applied and hence we will
    511      boost the signal although it isn't called for. Hence we need to compensate for this by
    512      lowering the transmitted energy values for the sines so they will get the correct level
    513      after the boost is applied.
    514   */
    515   if(M > 2){
    516     INT tmpScale;
    517     tmpScale = CountLeadingBits(nrg);
    518     nrg <<= tmpScale;
    519     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 */
    520     nrg >>= tmpScale;
    521   }
    522   else{
    523     if(M > 1){
    524       nrg >>= 1;
    525     }
    526   }
    527 
    528   return nrg;
    529 }
    530 
    531 /***************************************************************************/
    532 /*!
    533 
    534   \brief  Energy compensation in none missing harmonic mode
    535 
    536   \return void
    537 
    538 ****************************************************************************/
    539 static FIXP_DBL nmhLoweringEnergy(
    540         FIXP_DBL nrg,
    541         const FIXP_DBL nrgSum,
    542         const INT nrgSum_scale,
    543         const INT M
    544         )
    545 {
    546   if (nrg>FL2FXCONST_DBL(0)) {
    547     int sc=0;
    548     /* gain = nrgSum / (nrg*(M+1)) */
    549     FIXP_DBL gain = fMult(fDivNorm(nrgSum, nrg, &sc), GetInvInt(M+1));
    550     sc += nrgSum_scale;
    551 
    552     /* reduce nrg if gain smaller 1.f */
    553     if ( !((sc>=0) && ( gain > ((FIXP_DBL)MAXVAL_DBL>>sc) )) ) {
    554       nrg = fMult(scaleValue(gain,sc), nrg);
    555     }
    556   }
    557   return nrg;
    558 }
    559 
    560 /***************************************************************************/
    561 /*!
    562 
    563   \brief  calculates the envelope values from the energies, depending on
    564           framing and stereo mode
    565 
    566   \return void
    567 
    568 ****************************************************************************/
    569 static void
    570 calculateSbrEnvelope (FIXP_DBL **RESTRICT YBufferLeft,  /*! energy buffer left */
    571                       FIXP_DBL **RESTRICT YBufferRight, /*! energy buffer right */
    572                       int *RESTRICT YBufferScaleLeft,   /*! scale energy buffer left */
    573                       int *RESTRICT YBufferScaleRight,  /*! scale energy buffer right */
    574                       const SBR_FRAME_INFO *frame_info, /*! frame info vector */
    575                       SCHAR *RESTRICT sfb_nrgLeft,      /*! sfb energy buffer left */
    576                       SCHAR *RESTRICT sfb_nrgRight,     /*! sfb energy buffer right */
    577                       HANDLE_SBR_CONFIG_DATA h_con,     /*! handle to config data   */
    578                       HANDLE_ENV_CHANNEL h_sbr,         /*! envelope channel handle */
    579                       SBR_STEREO_MODE stereoMode,       /*! stereo coding mode */
    580                       INT* maxQuantError,               /*! maximum quantization error, for panorama. */
    581                       int YBufferSzShift)               /*! Energy buffer index scale */
    582 
    583 {
    584   int i, j, m = 0;
    585   INT no_of_bands, start_pos, stop_pos, li, ui;
    586   FREQ_RES freq_res;
    587 
    588   INT ca = 2 - h_sbr->encEnvData.init_sbr_amp_res;
    589   INT oneBitLess = 0;
    590   if (ca == 2)
    591     oneBitLess = 1; /* LD_DATA_SHIFT => ld64 scaling; one bit less for rounding */
    592 
    593   INT quantError;
    594   INT nEnvelopes = frame_info->nEnvelopes;
    595   INT short_env = frame_info->shortEnv - 1;
    596   INT timeStep = h_sbr->sbrExtractEnvelope.time_step;
    597   INT commonScale,scaleLeft0,scaleLeft1;
    598   INT scaleRight0=0,scaleRight1=0;
    599 
    600   commonScale = fixMin(YBufferScaleLeft[0],YBufferScaleLeft[1]);
    601 
    602   if (stereoMode == SBR_COUPLING) {
    603     commonScale = fixMin(commonScale,YBufferScaleRight[0]);
    604     commonScale = fixMin(commonScale,YBufferScaleRight[1]);
    605   }
    606 
    607   commonScale = commonScale - 7;
    608 
    609   scaleLeft0 = YBufferScaleLeft[0] - commonScale;
    610   scaleLeft1 = YBufferScaleLeft[1] - commonScale ;
    611   FDK_ASSERT ((scaleLeft0 >= 0) && (scaleLeft1 >= 0));
    612 
    613   if (stereoMode == SBR_COUPLING) {
    614     scaleRight0 = YBufferScaleRight[0] - commonScale;
    615     scaleRight1 = YBufferScaleRight[1] - commonScale;
    616     FDK_ASSERT ((scaleRight0 >= 0) && (scaleRight1 >= 0));
    617     *maxQuantError = 0;
    618   }
    619 
    620   for (i = 0; i < nEnvelopes; i++) {
    621 
    622     FIXP_DBL pNrgLeft[QMF_MAX_TIME_SLOTS];
    623     FIXP_DBL pNrgRight[QMF_MAX_TIME_SLOTS];
    624     int envNrg_scale;
    625     FIXP_DBL envNrgLeft  = FL2FXCONST_DBL(0.0f);
    626     FIXP_DBL envNrgRight = FL2FXCONST_DBL(0.0f);
    627     int      missingHarmonic[QMF_MAX_TIME_SLOTS];
    628     int      count[QMF_MAX_TIME_SLOTS];
    629 
    630     start_pos = timeStep * frame_info->borders[i];
    631     stop_pos = timeStep * frame_info->borders[i + 1];
    632     freq_res = frame_info->freqRes[i];
    633     no_of_bands = h_con->nSfb[freq_res];
    634     envNrg_scale = DFRACT_BITS-fNormz((FIXP_DBL)no_of_bands);
    635 
    636     if (i == short_env) {
    637       stop_pos -= fixMax(2, timeStep);  /* consider at least 2 QMF slots less for short envelopes (envelopes just before transients) */
    638     }
    639 
    640     for (j = 0; j < no_of_bands; j++) {
    641       FIXP_DBL nrgLeft  = FL2FXCONST_DBL(0.0f);
    642       FIXP_DBL nrgRight = FL2FXCONST_DBL(0.0f);
    643 
    644       li = h_con->freqBandTable[freq_res][j];
    645       ui = h_con->freqBandTable[freq_res][j + 1];
    646 
    647       if(freq_res == FREQ_RES_HIGH){
    648         if(j == 0 && ui-li > 1){
    649           li++;
    650         }
    651       }
    652       else{
    653         if(j == 0 && ui-li > 2){
    654           li++;
    655         }
    656       }
    657 
    658       /*
    659         Find out whether a sine will be missing in the scale-factor
    660         band that we're currently processing.
    661       */
    662       missingHarmonic[j] = 0;
    663 
    664       if(h_sbr->encEnvData.addHarmonicFlag){
    665 
    666         if(freq_res == FREQ_RES_HIGH){
    667           if(h_sbr->encEnvData.addHarmonic[j]){    /*A missing sine in the current band*/
    668             missingHarmonic[j] = 1;
    669           }
    670         }
    671         else{
    672           INT i;
    673           INT startBandHigh = 0;
    674           INT stopBandHigh = 0;
    675 
    676           while(h_con->freqBandTable[FREQ_RES_HIGH][startBandHigh] < h_con->freqBandTable[FREQ_RES_LOW][j])
    677             startBandHigh++;
    678           while(h_con->freqBandTable[FREQ_RES_HIGH][stopBandHigh] < h_con->freqBandTable[FREQ_RES_LOW][j + 1])
    679             stopBandHigh++;
    680 
    681           for(i = startBandHigh; i<stopBandHigh; i++){
    682             if(h_sbr->encEnvData.addHarmonic[i]){
    683               missingHarmonic[j] = 1;
    684             }
    685           }
    686         }
    687       }
    688 
    689       /*
    690         If a sine is missing in a scalefactorband, with more than one qmf channel
    691         use the nrg from the channel with the largest nrg rather than the mean.
    692         Compensate for the boost calculation in the decdoder.
    693       */
    694       int border_pos = fixMin(stop_pos, h_sbr->sbrExtractEnvelope.YBufferWriteOffset<<YBufferSzShift);
    695 
    696       if(missingHarmonic[j]){
    697 
    698         int k;
    699         count[j] = stop_pos - start_pos;
    700         nrgLeft = FL2FXCONST_DBL(0.0f);
    701 
    702         for (k = li; k < ui; k++) {
    703           FIXP_DBL tmpNrg;
    704           tmpNrg = getEnvSfbEnergy(k,
    705                                    k+1,
    706                                    start_pos,
    707                                    stop_pos,
    708                                    border_pos,
    709                                    YBufferLeft,
    710                                    YBufferSzShift,
    711                                    scaleLeft0,
    712                                    scaleLeft1);
    713 
    714           nrgLeft = fixMax(nrgLeft, tmpNrg);
    715         }
    716 
    717         /* Energy lowering compensation */
    718         nrgLeft = mhLoweringEnergy(nrgLeft, ui-li);
    719 
    720         if (stereoMode == SBR_COUPLING) {
    721 
    722           nrgRight = FL2FXCONST_DBL(0.0f);
    723 
    724           for (k = li; k < ui; k++) {
    725             FIXP_DBL tmpNrg;
    726             tmpNrg = getEnvSfbEnergy(k,
    727                                      k+1,
    728                                      start_pos,
    729                                      stop_pos,
    730                                      border_pos,
    731                                      YBufferRight,
    732                                      YBufferSzShift,
    733                                      scaleRight0,
    734                                      scaleRight1);
    735 
    736             nrgRight = fixMax(nrgRight, tmpNrg);
    737           }
    738 
    739           /* Energy lowering compensation */
    740           nrgRight = mhLoweringEnergy(nrgRight, ui-li);
    741         }
    742       } /* end missingHarmonic */
    743       else{
    744         count[j] = (stop_pos - start_pos) * (ui - li);
    745 
    746         nrgLeft = getEnvSfbEnergy(li,
    747                                   ui,
    748                                   start_pos,
    749                                   stop_pos,
    750                                   border_pos,
    751                                   YBufferLeft,
    752                                   YBufferSzShift,
    753                                   scaleLeft0,
    754                                   scaleLeft1);
    755 
    756         if (stereoMode == SBR_COUPLING) {
    757           nrgRight = getEnvSfbEnergy(li,
    758                                      ui,
    759                                      start_pos,
    760                                      stop_pos,
    761                                      border_pos,
    762                                      YBufferRight,
    763                                      YBufferSzShift,
    764                                      scaleRight0,
    765                                      scaleRight1);
    766         }
    767       } /* !missingHarmonic */
    768 
    769       /* save energies */
    770       pNrgLeft[j]  = nrgLeft;
    771       pNrgRight[j] = nrgRight;
    772       envNrgLeft  += (nrgLeft>>envNrg_scale);
    773       envNrgRight += (nrgRight>>envNrg_scale);
    774     } /* j */
    775 
    776     for (j = 0; j < no_of_bands; j++) {
    777 
    778       FIXP_DBL nrgLeft2 = FL2FXCONST_DBL(0.0f);
    779       FIXP_DBL nrgLeft  = pNrgLeft[j];
    780       FIXP_DBL nrgRight = pNrgRight[j];
    781 
    782       /* None missing harmonic Energy lowering compensation */
    783       if(!missingHarmonic[j] && h_sbr->fLevelProtect) {
    784         /* in case of missing energy in base band,
    785            reduce reference energy to prevent overflows in decoder output */
    786         nrgLeft = nmhLoweringEnergy(nrgLeft, envNrgLeft, envNrg_scale, no_of_bands);
    787         if (stereoMode == SBR_COUPLING) {
    788           nrgRight = nmhLoweringEnergy(nrgRight, envNrgRight, envNrg_scale, no_of_bands);
    789         }
    790       }
    791 
    792       if (stereoMode == SBR_COUPLING) {
    793         /* calc operation later with log */
    794         nrgLeft2 = nrgLeft;
    795         nrgLeft = (nrgRight + nrgLeft) >> 1;
    796       }
    797 
    798       /* nrgLeft = f20_log2(nrgLeft / (PFLOAT)(count * h_sbr->sbrQmf.no_channels))+(PFLOAT)44; */
    799       /* If nrgLeft == 0 then the Log calculations below do fail. */
    800       if (nrgLeft > FL2FXCONST_DBL(0.0f))
    801       {
    802         FIXP_DBL tmp0,tmp1,tmp2,tmp3;
    803         INT tmpScale;
    804 
    805         tmpScale = CountLeadingBits(nrgLeft);
    806         nrgLeft = nrgLeft << tmpScale;
    807 
    808         tmp0 = CalcLdData(nrgLeft);                                                       /* scaled by 1/64 */
    809         tmp1 = ((FIXP_DBL) (commonScale+tmpScale)) << (DFRACT_BITS-1-LD_DATA_SHIFT-1);    /* scaled by 1/64 */
    810         tmp2 = ((FIXP_DBL)(count[j]*h_con->noQmfBands)) << (DFRACT_BITS-1-14-1);
    811         tmp2 = CalcLdData(tmp2);                                                          /* scaled by 1/64 */
    812         tmp3 = FL2FXCONST_DBL(0.6875f-0.21875f-0.015625f)>>1;                             /* scaled by 1/64 */
    813 
    814         nrgLeft = ((tmp0-tmp2)>>1) + (tmp3 - tmp1);
    815       } else {
    816         nrgLeft = FL2FXCONST_DBL(-1.0f);
    817       }
    818 
    819       /* ld64 to integer conversion */
    820       nrgLeft = fixMin(fixMax(nrgLeft,FL2FXCONST_DBL(0.0f)),FL2FXCONST_DBL(0.5f));
    821       nrgLeft = (FIXP_DBL)(LONG)nrgLeft >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess-1);
    822       sfb_nrgLeft[m] = ((INT)nrgLeft+1)>>1; /* rounding */
    823 
    824       if (stereoMode == SBR_COUPLING) {
    825         FIXP_DBL scaleFract;
    826 
    827         if (nrgRight != FL2FXCONST_DBL(0.0f)) {
    828           int sc0 = CountLeadingBits(nrgLeft2);
    829           int sc1 = CountLeadingBits(nrgRight);
    830 
    831           scaleFract = ((FIXP_DBL)(sc0-sc1)) << (DFRACT_BITS-1-LD_DATA_SHIFT); /* scale value in ld64 representation */
    832           nrgRight = CalcLdData(nrgLeft2<<sc0) - CalcLdData(nrgRight<<sc1) - scaleFract;
    833         }
    834         else
    835           nrgRight =  FL2FXCONST_DBL(0.5f);   /* ld64(4294967296.0f) */
    836 
    837         /* ld64 to integer conversion */
    838         nrgRight = (FIXP_DBL)(LONG)(nrgRight) >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess);
    839         nrgRight  = (nrgRight+(FIXP_DBL)1)>>1; /* rounding */
    840 
    841         sfb_nrgRight[m] = mapPanorama (nrgRight,h_sbr->encEnvData.init_sbr_amp_res,&quantError);
    842 
    843         *maxQuantError = fixMax(quantError, *maxQuantError);
    844       }
    845 
    846       m++;
    847     } /* j */
    848 
    849      /* Do energy compensation for sines that are present in two
    850          QMF-bands in the original, but will only occur in one band in
    851          the decoder due to the synthetic sine coding.*/
    852     if (h_con->useParametricCoding) {
    853       m-=no_of_bands;
    854       for (j = 0; j < no_of_bands; j++) {
    855         if (freq_res==FREQ_RES_HIGH && h_sbr->sbrExtractEnvelope.envelopeCompensation[j]){
    856           sfb_nrgLeft[m] -= (ca * fixp_abs((INT)h_sbr->sbrExtractEnvelope.envelopeCompensation[j]));
    857         }
    858         sfb_nrgLeft[m] = fixMax(0, sfb_nrgLeft[m]);
    859         m++;
    860       }
    861     } /* useParametricCoding */
    862 
    863   } /* i*/
    864 }
    865 
    866 /***************************************************************************/
    867 /*!
    868 
    869   \brief  calculates the noise floor and the envelope values from the
    870           energies, depending on framing and stereo mode
    871 
    872   FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the
    873   envelope and the noise floor. The function includes the following processes:
    874 
    875   -Analysis subband filtering.
    876   -Encoding SA and pan parameters (if enabled).
    877   -Transient detection.
    878 
    879 ****************************************************************************/
    880 
    881 LNK_SECTION_CODE_L1
    882 void
    883 FDKsbrEnc_extractSbrEnvelope1 (
    884                     HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data   */
    885                     HANDLE_SBR_HEADER_DATA sbrHeaderData,
    886                     HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
    887                     HANDLE_ENV_CHANNEL hEnvChan,
    888                     HANDLE_COMMON_DATA hCmonData,
    889                     SBR_ENV_TEMP_DATA   *eData,
    890                     SBR_FRAME_TEMP_DATA *fData
    891                    )
    892 {
    893 
    894   HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope;
    895 
    896   if (sbrExtrEnv->YBufferSzShift == 0)
    897     FDKsbrEnc_getEnergyFromCplxQmfDataFull(&sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset],
    898                                            sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset,
    899                                            sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset,
    900                                            h_con->noQmfBands,
    901                                            sbrExtrEnv->no_cols,
    902                                           &hEnvChan->qmfScale,
    903                                           &sbrExtrEnv->YBufferScale[1]);
    904   else
    905     FDKsbrEnc_getEnergyFromCplxQmfData(&sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset],
    906                                        sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset,
    907                                        sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset,
    908                                        h_con->noQmfBands,
    909                                        sbrExtrEnv->no_cols,
    910                                       &hEnvChan->qmfScale,
    911                                       &sbrExtrEnv->YBufferScale[1]);
    912 
    913 
    914 
    915   /*
    916     Precalculation of Tonality Quotas  COEFF Transform OK
    917   */
    918   FDKsbrEnc_CalculateTonalityQuotas(&hEnvChan->TonCorr,
    919                                      sbrExtrEnv->rBuffer,
    920                                      sbrExtrEnv->iBuffer,
    921                                      h_con->freqBandTable[HI][h_con->nSfb[HI]],
    922                                      hEnvChan->qmfScale);
    923 
    924 
    925 
    926   /*
    927     Transient detection COEFF Transform OK
    928   */
    929   FDKsbrEnc_transientDetect(&hEnvChan->sbrTransientDetector,
    930                              sbrExtrEnv->YBuffer,
    931                              sbrExtrEnv->YBufferScale,
    932                              eData->transient_info,
    933                              sbrExtrEnv->YBufferWriteOffset,
    934                              sbrExtrEnv->YBufferSzShift,
    935                              sbrExtrEnv->time_step,
    936                              hEnvChan->SbrEnvFrame.frameMiddleSlot);
    937 
    938 
    939 
    940   /*
    941     Generate flags for 2 env in a FIXFIX-frame.
    942     Remove this function to get always 1 env per FIXFIX-frame.
    943   */
    944 
    945   /*
    946     frame Splitter COEFF Transform OK
    947   */
    948   FDKsbrEnc_frameSplitter(sbrExtrEnv->YBuffer,
    949                           sbrExtrEnv->YBufferScale,
    950                          &hEnvChan->sbrTransientDetector,
    951                           h_con->freqBandTable[1],
    952                           eData->transient_info,
    953                           sbrExtrEnv->YBufferWriteOffset,
    954                           sbrExtrEnv->YBufferSzShift,
    955                           h_con->nSfb[1],
    956                           sbrExtrEnv->time_step,
    957                           sbrExtrEnv->no_cols);
    958 
    959 
    960 }
    961 
    962 /***************************************************************************/
    963 /*!
    964 
    965   \brief  calculates the noise floor and the envelope values from the
    966           energies, depending on framing and stereo mode
    967 
    968   FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the
    969   envelope and the noise floor. The function includes the following processes:
    970 
    971   -Determine time/frequency division of current granule.
    972   -Sending transient info to bitstream.
    973   -Set amp_res to 1.5 dB if the current frame contains only one envelope.
    974   -Lock dynamic bandwidth frequency change if the next envelope not starts on a
    975   frame boundary.
    976   -MDCT transposer (needed to detect where harmonics will be missing).
    977   -Spectrum Estimation (used for pulse train and missing harmonics detection).
    978   -Pulse train detection.
    979   -Inverse Filtering detection.
    980   -Waveform Coding.
    981   -Missing Harmonics detection.
    982   -Extract envelope of current frame.
    983   -Noise floor estimation.
    984   -Noise floor quantisation and coding.
    985   -Encode envelope of current frame.
    986   -Send the encoded data to the bitstream.
    987   -Write to bitstream.
    988 
    989 ****************************************************************************/
    990 
    991 LNK_SECTION_CODE_L1
    992 void
    993 FDKsbrEnc_extractSbrEnvelope2 (
    994                     HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data   */
    995                     HANDLE_SBR_HEADER_DATA sbrHeaderData,
    996                     HANDLE_PARAMETRIC_STEREO    hParametricStereo,
    997                     HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
    998                     HANDLE_ENV_CHANNEL   h_envChan0,
    999                     HANDLE_ENV_CHANNEL   h_envChan1,
   1000                     HANDLE_COMMON_DATA   hCmonData,
   1001                     SBR_ENV_TEMP_DATA   *eData,
   1002                     SBR_FRAME_TEMP_DATA *fData,
   1003                     int                  clearOutput
   1004                    )
   1005 {
   1006   HANDLE_ENV_CHANNEL h_envChan[MAX_NUM_CHANNELS] = {h_envChan0, h_envChan1};
   1007   int ch, i, j, c, YSzShift = h_envChan[0]->sbrExtractEnvelope.YBufferSzShift;
   1008 
   1009   SBR_STEREO_MODE stereoMode = h_con->stereoMode;
   1010   int nChannels = h_con->nChannels;
   1011   const int *v_tuning;
   1012   static const int v_tuningHEAAC[6] = { 0, 2, 4, 0, 0, 0 };
   1013 
   1014   static const int v_tuningELD[6] = { 0, 2, 3, 0, 0, 0 };
   1015 
   1016   if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY)
   1017     v_tuning = v_tuningELD;
   1018   else
   1019     v_tuning = v_tuningHEAAC;
   1020 
   1021 
   1022   /*
   1023     Select stereo mode.
   1024   */
   1025   if (stereoMode == SBR_COUPLING) {
   1026     if (eData[0].transient_info[1] && eData[1].transient_info[1]) {
   1027       eData[0].transient_info[0] = fixMin(eData[1].transient_info[0], eData[0].transient_info[0]);
   1028       eData[1].transient_info[0] = eData[0].transient_info[0];
   1029     }
   1030     else {
   1031       if (eData[0].transient_info[1] && !eData[1].transient_info[1]) {
   1032         eData[1].transient_info[0] = eData[0].transient_info[0];
   1033       }
   1034       else {
   1035         if (!eData[0].transient_info[1] && eData[1].transient_info[1])
   1036           eData[0].transient_info[0] = eData[1].transient_info[0];
   1037         else {
   1038           eData[0].transient_info[0] = fixMax(eData[1].transient_info[0], eData[0].transient_info[0]);
   1039           eData[1].transient_info[0] = eData[0].transient_info[0];
   1040         }
   1041       }
   1042     }
   1043   }
   1044 
   1045   /*
   1046     Determine time/frequency division of current granule
   1047   */
   1048   eData[0].frame_info = FDKsbrEnc_frameInfoGenerator(&h_envChan[0]->SbrEnvFrame,
   1049                                                      eData[0].transient_info,
   1050                                                      h_envChan[0]->sbrExtractEnvelope.pre_transient_info,
   1051                                                      h_envChan[0]->encEnvData.ldGrid,
   1052                                                      v_tuning);
   1053 
   1054   h_envChan[0]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid;
   1055 
   1056   /* AAC LD patch for transient prediction */
   1057   if (h_envChan[0]->encEnvData.ldGrid && eData[0].transient_info[2]) {
   1058     /* if next frame will start with transient, set shortEnv to numEnvelopes(shortend Envelope = shortEnv-1)*/
   1059     h_envChan[0]->SbrEnvFrame.SbrFrameInfo.shortEnv = h_envChan[0]->SbrEnvFrame.SbrFrameInfo.nEnvelopes;
   1060   }
   1061 
   1062 
   1063   switch (stereoMode) {
   1064   case SBR_LEFT_RIGHT:
   1065   case SBR_SWITCH_LRC:
   1066     eData[1].frame_info = FDKsbrEnc_frameInfoGenerator(&h_envChan[1]->SbrEnvFrame,
   1067                                                        eData[1].transient_info,
   1068                                                        h_envChan[1]->sbrExtractEnvelope.pre_transient_info,
   1069                                                        h_envChan[1]->encEnvData.ldGrid,
   1070                                                        v_tuning);
   1071 
   1072     h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[1]->SbrEnvFrame.SbrGrid;
   1073 
   1074     if (h_envChan[1]->encEnvData.ldGrid && eData[1].transient_info[2]) {
   1075       /* if next frame will start with transient, set shortEnv to numEnvelopes(shortend Envelope = shortEnv-1)*/
   1076       h_envChan[1]->SbrEnvFrame.SbrFrameInfo.shortEnv = h_envChan[1]->SbrEnvFrame.SbrFrameInfo.nEnvelopes;
   1077     }
   1078 
   1079     /* compare left and right frame_infos */
   1080     if (eData[0].frame_info->nEnvelopes != eData[1].frame_info->nEnvelopes) {
   1081       stereoMode = SBR_LEFT_RIGHT;
   1082     } else {
   1083       for (i = 0; i < eData[0].frame_info->nEnvelopes + 1; i++) {
   1084         if (eData[0].frame_info->borders[i] != eData[1].frame_info->borders[i]) {
   1085           stereoMode = SBR_LEFT_RIGHT;
   1086           break;
   1087         }
   1088       }
   1089       for (i = 0; i < eData[0].frame_info->nEnvelopes; i++) {
   1090         if (eData[0].frame_info->freqRes[i] != eData[1].frame_info->freqRes[i]) {
   1091           stereoMode = SBR_LEFT_RIGHT;
   1092           break;
   1093         }
   1094       }
   1095       if (eData[0].frame_info->shortEnv != eData[1].frame_info->shortEnv) {
   1096         stereoMode = SBR_LEFT_RIGHT;
   1097       }
   1098     }
   1099     break;
   1100   case SBR_COUPLING:
   1101     eData[1].frame_info = eData[0].frame_info;
   1102     h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid;
   1103     break;
   1104   case SBR_MONO:
   1105     /* nothing to do */
   1106     break;
   1107   default:
   1108     FDK_ASSERT (0);
   1109   }
   1110 
   1111 
   1112   for (ch = 0; ch < nChannels;ch++)
   1113   {
   1114     HANDLE_ENV_CHANNEL hEnvChan = h_envChan[ch];
   1115     HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope;
   1116     SBR_ENV_TEMP_DATA *ed = &eData[ch];
   1117 
   1118 
   1119     /*
   1120        Send transient info to bitstream and store for next call
   1121     */
   1122     sbrExtrEnv->pre_transient_info[0] = ed->transient_info[0];/* tran_pos */
   1123     sbrExtrEnv->pre_transient_info[1] = ed->transient_info[1];/* tran_flag */
   1124     hEnvChan->encEnvData.noOfEnvelopes = ed->nEnvelopes = ed->frame_info->nEnvelopes;     /* number of envelopes of current frame */
   1125 
   1126     /*
   1127       Check if the current frame is divided into one envelope only. If so, set the amplitude
   1128       resolution to 1.5 dB, otherwise may set back to chosen value
   1129     */
   1130    if( ( hEnvChan->encEnvData.hSbrBSGrid->frameClass == FIXFIX )
   1131         && ( ed->nEnvelopes == 1 ) )
   1132    {
   1133 
   1134      if (hEnvChan->encEnvData.ldGrid)
   1135        hEnvChan->encEnvData.currentAmpResFF = (AMP_RES)h_con->initAmpResFF;
   1136      else
   1137        hEnvChan->encEnvData.currentAmpResFF = SBR_AMP_RES_1_5;
   1138 
   1139      if ( hEnvChan->encEnvData.currentAmpResFF != hEnvChan->encEnvData.init_sbr_amp_res) {
   1140 
   1141         FDKsbrEnc_InitSbrHuffmanTables(&hEnvChan->encEnvData,
   1142                                        &hEnvChan->sbrCodeEnvelope,
   1143                                        &hEnvChan->sbrCodeNoiseFloor,
   1144                                        hEnvChan->encEnvData.currentAmpResFF);
   1145       }
   1146     }
   1147     else {
   1148       if(sbrHeaderData->sbr_amp_res != hEnvChan->encEnvData.init_sbr_amp_res ) {
   1149 
   1150         FDKsbrEnc_InitSbrHuffmanTables(&hEnvChan->encEnvData,
   1151                                        &hEnvChan->sbrCodeEnvelope,
   1152                                        &hEnvChan->sbrCodeNoiseFloor,
   1153                                        sbrHeaderData->sbr_amp_res);
   1154       }
   1155     }
   1156 
   1157     if (!clearOutput) {
   1158 
   1159       /*
   1160         Tonality correction parameter extraction (inverse filtering level, noise floor additional sines).
   1161       */
   1162       FDKsbrEnc_TonCorrParamExtr(&hEnvChan->TonCorr,
   1163                                   hEnvChan->encEnvData.sbr_invf_mode_vec,
   1164                                   ed->noiseFloor,
   1165                                  &hEnvChan->encEnvData.addHarmonicFlag,
   1166                                   hEnvChan->encEnvData.addHarmonic,
   1167                                   sbrExtrEnv->envelopeCompensation,
   1168                                   ed->frame_info,
   1169                                   ed->transient_info,
   1170                                   h_con->freqBandTable[HI],
   1171                                   h_con->nSfb[HI],
   1172                                   hEnvChan->encEnvData.sbr_xpos_mode,
   1173                                   h_con->sbrSyntaxFlags);
   1174 
   1175     }
   1176 
   1177     /* Low energy in low band fix */
   1178     if ( hEnvChan->sbrTransientDetector.prevLowBandEnergy < hEnvChan->sbrTransientDetector.prevHighBandEnergy && hEnvChan->sbrTransientDetector.prevHighBandEnergy > FL2FX_DBL(0.03))
   1179     {
   1180       int i;
   1181 
   1182       hEnvChan->fLevelProtect = 1;
   1183 
   1184       for (i=0; i<MAX_NUM_NOISE_VALUES; i++)
   1185         hEnvChan->encEnvData.sbr_invf_mode_vec[i] = INVF_HIGH_LEVEL;
   1186     } else {
   1187       hEnvChan->fLevelProtect = 0;
   1188     }
   1189 
   1190     hEnvChan->encEnvData.sbr_invf_mode = hEnvChan->encEnvData.sbr_invf_mode_vec[0];
   1191 
   1192     hEnvChan->encEnvData.noOfnoisebands = hEnvChan->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
   1193 
   1194 
   1195   } /* ch */
   1196 
   1197 
   1198 
   1199    /*
   1200       Save number of scf bands per envelope
   1201     */
   1202   for (ch = 0; ch < nChannels;ch++) {
   1203     for (i = 0; i < eData[ch].nEnvelopes; i++){
   1204       h_envChan[ch]->encEnvData.noScfBands[i] =
   1205       (eData[ch].frame_info->freqRes[i] == FREQ_RES_HIGH ? h_con->nSfb[FREQ_RES_HIGH] : h_con->nSfb[FREQ_RES_LOW]);
   1206     }
   1207   }
   1208 
   1209   /*
   1210     Extract envelope of current frame.
   1211   */
   1212   switch (stereoMode) {
   1213   case SBR_MONO:
   1214      calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL,
   1215                           h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL,
   1216                           eData[0].frame_info, eData[0].sfb_nrg, NULL,
   1217                           h_con, h_envChan[0], SBR_MONO, NULL, YSzShift);
   1218     break;
   1219   case SBR_LEFT_RIGHT:
   1220     calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL,
   1221                           h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL,
   1222                           eData[0].frame_info, eData[0].sfb_nrg, NULL,
   1223                           h_con, h_envChan[0], SBR_MONO, NULL, YSzShift);
   1224     calculateSbrEnvelope (h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL,
   1225                           h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL,
   1226                           eData[1].frame_info,eData[1].sfb_nrg, NULL,
   1227                           h_con, h_envChan[1], SBR_MONO, NULL, YSzShift);
   1228     break;
   1229   case SBR_COUPLING:
   1230     calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, h_envChan[1]->sbrExtractEnvelope.YBuffer,
   1231                           h_envChan[0]->sbrExtractEnvelope.YBufferScale, h_envChan[1]->sbrExtractEnvelope.YBufferScale,
   1232                           eData[0].frame_info, eData[0].sfb_nrg, eData[1].sfb_nrg,
   1233                           h_con, h_envChan[0], SBR_COUPLING, &fData->maxQuantError, YSzShift);
   1234     break;
   1235   case SBR_SWITCH_LRC:
   1236     calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL,
   1237                           h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL,
   1238                           eData[0].frame_info, eData[0].sfb_nrg, NULL,
   1239                           h_con, h_envChan[0], SBR_MONO, NULL, YSzShift);
   1240     calculateSbrEnvelope (h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL,
   1241                           h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL,
   1242                           eData[1].frame_info, eData[1].sfb_nrg, NULL,
   1243                           h_con, h_envChan[1], SBR_MONO,NULL, YSzShift);
   1244     calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, h_envChan[1]->sbrExtractEnvelope.YBuffer,
   1245                           h_envChan[0]->sbrExtractEnvelope.YBufferScale, h_envChan[1]->sbrExtractEnvelope.YBufferScale,
   1246                           eData[0].frame_info, eData[0].sfb_nrg_coupling, eData[1].sfb_nrg_coupling,
   1247                           h_con, h_envChan[0], SBR_COUPLING, &fData->maxQuantError, YSzShift);
   1248     break;
   1249   }
   1250 
   1251 
   1252 
   1253   /*
   1254     Noise floor quantisation and coding.
   1255   */
   1256 
   1257   switch (stereoMode) {
   1258   case SBR_MONO:
   1259     sbrNoiseFloorLevelsQuantisation(eData[0].noise_level, eData[0].noiseFloor, 0);
   1260 
   1261     FDKsbrEnc_codeEnvelope(eData[0].noise_level, fData->res,
   1262                            &h_envChan[0]->sbrCodeNoiseFloor,
   1263                            h_envChan[0]->encEnvData.domain_vec_noise, 0,
   1264                            (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0,
   1265                            sbrBitstreamData->HeaderActive);
   1266 
   1267     break;
   1268   case SBR_LEFT_RIGHT:
   1269     sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0);
   1270 
   1271     FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res,
   1272                   &h_envChan[0]->sbrCodeNoiseFloor,
   1273                   h_envChan[0]->encEnvData.domain_vec_noise, 0,
   1274                   (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0,
   1275                   sbrBitstreamData->HeaderActive);
   1276 
   1277     sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 0);
   1278 
   1279     FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res,
   1280                   &h_envChan[1]->sbrCodeNoiseFloor,
   1281                   h_envChan[1]->encEnvData.domain_vec_noise, 0,
   1282                   (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0,
   1283                   sbrBitstreamData->HeaderActive);
   1284 
   1285     break;
   1286 
   1287   case SBR_COUPLING:
   1288     coupleNoiseFloor(eData[0].noiseFloor,eData[1].noiseFloor);
   1289 
   1290     sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0);
   1291 
   1292     FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res,
   1293                   &h_envChan[0]->sbrCodeNoiseFloor,
   1294                   h_envChan[0]->encEnvData.domain_vec_noise, 1,
   1295                   (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0,
   1296                   sbrBitstreamData->HeaderActive);
   1297 
   1298     sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 1);
   1299 
   1300     FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res,
   1301                   &h_envChan[1]->sbrCodeNoiseFloor,
   1302                   h_envChan[1]->encEnvData.domain_vec_noise, 1,
   1303                   (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1,
   1304                   sbrBitstreamData->HeaderActive);
   1305 
   1306     break;
   1307   case SBR_SWITCH_LRC:
   1308     sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0);
   1309     sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 0);
   1310     coupleNoiseFloor(eData[0].noiseFloor,eData[1].noiseFloor);
   1311     sbrNoiseFloorLevelsQuantisation(eData[0].noise_level_coupling,eData[0].noiseFloor, 0);
   1312     sbrNoiseFloorLevelsQuantisation(eData[1].noise_level_coupling,eData[1].noiseFloor, 1);
   1313     break;
   1314   }
   1315 
   1316 
   1317 
   1318   /*
   1319     Encode envelope of current frame.
   1320   */
   1321   switch (stereoMode) {
   1322   case SBR_MONO:
   1323     sbrHeaderData->coupling = 0;
   1324     h_envChan[0]->encEnvData.balance = 0;
   1325     FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes,
   1326                   &h_envChan[0]->sbrCodeEnvelope,
   1327                   h_envChan[0]->encEnvData.domain_vec,
   1328                   sbrHeaderData->coupling,
   1329                   eData[0].frame_info->nEnvelopes, 0,
   1330                   sbrBitstreamData->HeaderActive);
   1331     break;
   1332   case SBR_LEFT_RIGHT:
   1333     sbrHeaderData->coupling = 0;
   1334 
   1335     h_envChan[0]->encEnvData.balance = 0;
   1336     h_envChan[1]->encEnvData.balance = 0;
   1337 
   1338 
   1339     FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes,
   1340                   &h_envChan[0]->sbrCodeEnvelope,
   1341                   h_envChan[0]->encEnvData.domain_vec,
   1342                   sbrHeaderData->coupling,
   1343                   eData[0].frame_info->nEnvelopes, 0,
   1344                   sbrBitstreamData->HeaderActive);
   1345     FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes,
   1346                   &h_envChan[1]->sbrCodeEnvelope,
   1347                   h_envChan[1]->encEnvData.domain_vec,
   1348                   sbrHeaderData->coupling,
   1349                   eData[1].frame_info->nEnvelopes, 0,
   1350                   sbrBitstreamData->HeaderActive);
   1351     break;
   1352   case SBR_COUPLING:
   1353     sbrHeaderData->coupling = 1;
   1354     h_envChan[0]->encEnvData.balance = 0;
   1355     h_envChan[1]->encEnvData.balance = 1;
   1356 
   1357     FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes,
   1358                   &h_envChan[0]->sbrCodeEnvelope,
   1359                   h_envChan[0]->encEnvData.domain_vec,
   1360                   sbrHeaderData->coupling,
   1361                   eData[0].frame_info->nEnvelopes, 0,
   1362                   sbrBitstreamData->HeaderActive);
   1363     FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes,
   1364                   &h_envChan[1]->sbrCodeEnvelope,
   1365                   h_envChan[1]->encEnvData.domain_vec,
   1366                   sbrHeaderData->coupling,
   1367                   eData[1].frame_info->nEnvelopes, 1,
   1368                   sbrBitstreamData->HeaderActive);
   1369     break;
   1370   case SBR_SWITCH_LRC:
   1371     {
   1372       INT payloadbitsLR;
   1373       INT payloadbitsCOUPLING;
   1374 
   1375       SCHAR sfbNrgPrevTemp[MAX_NUM_CHANNELS][MAX_FREQ_COEFFS];
   1376       SCHAR noisePrevTemp[MAX_NUM_CHANNELS][MAX_NUM_NOISE_COEFFS];
   1377       INT upDateNrgTemp[MAX_NUM_CHANNELS];
   1378       INT upDateNoiseTemp[MAX_NUM_CHANNELS];
   1379       INT domainVecTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES];
   1380       INT domainVecNoiseTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES];
   1381 
   1382       INT tempFlagRight = 0;
   1383       INT tempFlagLeft = 0;
   1384 
   1385       /*
   1386          Store previous values, in order to be able to "undo" what is being done.
   1387       */
   1388 
   1389       for(ch = 0; ch < nChannels;ch++){
   1390         FDKmemcpy (sfbNrgPrevTemp[ch], h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev,
   1391               MAX_FREQ_COEFFS * sizeof (SCHAR));
   1392 
   1393         FDKmemcpy (noisePrevTemp[ch], h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev,
   1394               MAX_NUM_NOISE_COEFFS * sizeof (SCHAR));
   1395 
   1396         upDateNrgTemp[ch] = h_envChan[ch]->sbrCodeEnvelope.upDate;
   1397         upDateNoiseTemp[ch] = h_envChan[ch]->sbrCodeNoiseFloor.upDate;
   1398 
   1399         /*
   1400           forbid time coding in the first envelope in case of a different
   1401           previous stereomode
   1402         */
   1403         if(sbrHeaderData->prev_coupling){
   1404           h_envChan[ch]->sbrCodeEnvelope.upDate = 0;
   1405           h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0;
   1406         }
   1407       } /* ch */
   1408 
   1409 
   1410       /*
   1411          Code ordinary Left/Right stereo
   1412       */
   1413       FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes,
   1414                     &h_envChan[0]->sbrCodeEnvelope,
   1415                     h_envChan[0]->encEnvData.domain_vec, 0,
   1416                     eData[0].frame_info->nEnvelopes, 0,
   1417                     sbrBitstreamData->HeaderActive);
   1418       FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes,
   1419                     &h_envChan[1]->sbrCodeEnvelope,
   1420                     h_envChan[1]->encEnvData.domain_vec, 0,
   1421                     eData[1].frame_info->nEnvelopes, 0,
   1422                     sbrBitstreamData->HeaderActive);
   1423 
   1424       c = 0;
   1425       for (i = 0; i < eData[0].nEnvelopes; i++) {
   1426         for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++)
   1427           {
   1428             h_envChan[0]->encEnvData.ienvelope[i][j] = eData[0].sfb_nrg[c];
   1429             h_envChan[1]->encEnvData.ienvelope[i][j] = eData[1].sfb_nrg[c];
   1430             c++;
   1431           }
   1432       }
   1433 
   1434 
   1435 
   1436       FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res,
   1437                     &h_envChan[0]->sbrCodeNoiseFloor,
   1438                     h_envChan[0]->encEnvData.domain_vec_noise, 0,
   1439                     (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0,
   1440                     sbrBitstreamData->HeaderActive);
   1441 
   1442 
   1443       for (i = 0; i < MAX_NUM_NOISE_VALUES; i++)
   1444         h_envChan[0]->encEnvData.sbr_noise_levels[i] = eData[0].noise_level[i];
   1445 
   1446 
   1447       FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res,
   1448                     &h_envChan[1]->sbrCodeNoiseFloor,
   1449                     h_envChan[1]->encEnvData.domain_vec_noise, 0,
   1450                     (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0,
   1451                     sbrBitstreamData->HeaderActive);
   1452 
   1453       for (i = 0; i < MAX_NUM_NOISE_VALUES; i++)
   1454         h_envChan[1]->encEnvData.sbr_noise_levels[i] = eData[1].noise_level[i];
   1455 
   1456 
   1457       sbrHeaderData->coupling = 0;
   1458       h_envChan[0]->encEnvData.balance = 0;
   1459       h_envChan[1]->encEnvData.balance = 0;
   1460 
   1461       payloadbitsLR = FDKsbrEnc_CountSbrChannelPairElement (sbrHeaderData,
   1462                                                   hParametricStereo,
   1463                                                   sbrBitstreamData,
   1464                                                   &h_envChan[0]->encEnvData,
   1465                                                   &h_envChan[1]->encEnvData,
   1466                                                   hCmonData,
   1467                                                   h_con->sbrSyntaxFlags);
   1468 
   1469       /*
   1470         swap saved stored with current values
   1471       */
   1472       for(ch = 0; ch < nChannels;ch++){
   1473         INT   itmp;
   1474         for(i=0;i<MAX_FREQ_COEFFS;i++){
   1475           /*
   1476             swap sfb energies
   1477           */
   1478           itmp =  h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev[i];
   1479           h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev[i]=sfbNrgPrevTemp[ch][i];
   1480           sfbNrgPrevTemp[ch][i]=itmp;
   1481         }
   1482         for(i=0;i<MAX_NUM_NOISE_COEFFS;i++){
   1483           /*
   1484             swap noise energies
   1485           */
   1486           itmp =  h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev[i];
   1487           h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev[i]=noisePrevTemp[ch][i];
   1488           noisePrevTemp[ch][i]=itmp;
   1489        }
   1490         /* swap update flags */
   1491         itmp  = h_envChan[ch]->sbrCodeEnvelope.upDate;
   1492         h_envChan[ch]->sbrCodeEnvelope.upDate=upDateNrgTemp[ch];
   1493         upDateNrgTemp[ch] = itmp;
   1494 
   1495         itmp =  h_envChan[ch]->sbrCodeNoiseFloor.upDate;
   1496         h_envChan[ch]->sbrCodeNoiseFloor.upDate=upDateNoiseTemp[ch];
   1497         upDateNoiseTemp[ch]=itmp;
   1498 
   1499         /*
   1500             save domain vecs
   1501         */
   1502         FDKmemcpy(domainVecTemp[ch],h_envChan[ch]->encEnvData.domain_vec,sizeof(INT)*MAX_ENVELOPES);
   1503         FDKmemcpy(domainVecNoiseTemp[ch],h_envChan[ch]->encEnvData.domain_vec_noise,sizeof(INT)*MAX_ENVELOPES);
   1504 
   1505         /*
   1506           forbid time coding in the first envelope in case of a different
   1507           previous stereomode
   1508         */
   1509 
   1510         if(!sbrHeaderData->prev_coupling){
   1511           h_envChan[ch]->sbrCodeEnvelope.upDate = 0;
   1512           h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0;
   1513         }
   1514       } /* ch */
   1515 
   1516 
   1517       /*
   1518          Coupling
   1519        */
   1520 
   1521       FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg_coupling, eData[0].frame_info->freqRes,
   1522                     &h_envChan[0]->sbrCodeEnvelope,
   1523                     h_envChan[0]->encEnvData.domain_vec, 1,
   1524                     eData[0].frame_info->nEnvelopes, 0,
   1525                     sbrBitstreamData->HeaderActive);
   1526 
   1527       FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg_coupling, eData[1].frame_info->freqRes,
   1528                     &h_envChan[1]->sbrCodeEnvelope,
   1529                     h_envChan[1]->encEnvData.domain_vec, 1,
   1530                     eData[1].frame_info->nEnvelopes, 1,
   1531                     sbrBitstreamData->HeaderActive);
   1532 
   1533 
   1534       c = 0;
   1535       for (i = 0; i < eData[0].nEnvelopes; i++) {
   1536         for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++) {
   1537           h_envChan[0]->encEnvData.ienvelope[i][j] = eData[0].sfb_nrg_coupling[c];
   1538           h_envChan[1]->encEnvData.ienvelope[i][j] = eData[1].sfb_nrg_coupling[c];
   1539           c++;
   1540         }
   1541       }
   1542 
   1543       FDKsbrEnc_codeEnvelope (eData[0].noise_level_coupling, fData->res,
   1544                     &h_envChan[0]->sbrCodeNoiseFloor,
   1545                     h_envChan[0]->encEnvData.domain_vec_noise, 1,
   1546                     (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0,
   1547                      sbrBitstreamData->HeaderActive);
   1548 
   1549       for (i = 0; i < MAX_NUM_NOISE_VALUES; i++)
   1550         h_envChan[0]->encEnvData.sbr_noise_levels[i] = eData[0].noise_level_coupling[i];
   1551 
   1552 
   1553       FDKsbrEnc_codeEnvelope (eData[1].noise_level_coupling, fData->res,
   1554                     &h_envChan[1]->sbrCodeNoiseFloor,
   1555                     h_envChan[1]->encEnvData.domain_vec_noise, 1,
   1556                     (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1,
   1557                     sbrBitstreamData->HeaderActive);
   1558 
   1559       for (i = 0; i < MAX_NUM_NOISE_VALUES; i++)
   1560         h_envChan[1]->encEnvData.sbr_noise_levels[i] = eData[1].noise_level_coupling[i];
   1561 
   1562       sbrHeaderData->coupling = 1;
   1563 
   1564       h_envChan[0]->encEnvData.balance  = 0;
   1565       h_envChan[1]->encEnvData.balance  = 1;
   1566 
   1567       tempFlagLeft  = h_envChan[0]->encEnvData.addHarmonicFlag;
   1568       tempFlagRight = h_envChan[1]->encEnvData.addHarmonicFlag;
   1569 
   1570       payloadbitsCOUPLING =
   1571         FDKsbrEnc_CountSbrChannelPairElement (sbrHeaderData,
   1572                                     hParametricStereo,
   1573                                     sbrBitstreamData,
   1574                                     &h_envChan[0]->encEnvData,
   1575                                     &h_envChan[1]->encEnvData,
   1576                                     hCmonData,
   1577                                     h_con->sbrSyntaxFlags);
   1578 
   1579 
   1580       h_envChan[0]->encEnvData.addHarmonicFlag = tempFlagLeft;
   1581       h_envChan[1]->encEnvData.addHarmonicFlag = tempFlagRight;
   1582 
   1583       if (payloadbitsCOUPLING < payloadbitsLR) {
   1584 
   1585           /*
   1586             copy coded coupling envelope and noise data to l/r
   1587           */
   1588           for(ch = 0; ch < nChannels;ch++){
   1589             SBR_ENV_TEMP_DATA *ed = &eData[ch];
   1590             FDKmemcpy (ed->sfb_nrg, ed->sfb_nrg_coupling,
   1591                   MAX_NUM_ENVELOPE_VALUES * sizeof (SCHAR));
   1592             FDKmemcpy (ed->noise_level, ed->noise_level_coupling,
   1593                   MAX_NUM_NOISE_VALUES * sizeof (SCHAR));
   1594           }
   1595 
   1596           sbrHeaderData->coupling = 1;
   1597           h_envChan[0]->encEnvData.balance  = 0;
   1598           h_envChan[1]->encEnvData.balance  = 1;
   1599       }
   1600       else{
   1601           /*
   1602             restore saved l/r items
   1603           */
   1604           for(ch = 0; ch < nChannels;ch++){
   1605 
   1606             FDKmemcpy (h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev,
   1607                     sfbNrgPrevTemp[ch], MAX_FREQ_COEFFS * sizeof (SCHAR));
   1608 
   1609             h_envChan[ch]->sbrCodeEnvelope.upDate = upDateNrgTemp[ch];
   1610 
   1611             FDKmemcpy (h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev,
   1612                     noisePrevTemp[ch], MAX_NUM_NOISE_COEFFS * sizeof (SCHAR));
   1613 
   1614             FDKmemcpy (h_envChan[ch]->encEnvData.domain_vec,domainVecTemp[ch],sizeof(INT)*MAX_ENVELOPES);
   1615             FDKmemcpy (h_envChan[ch]->encEnvData.domain_vec_noise,domainVecNoiseTemp[ch],sizeof(INT)*MAX_ENVELOPES);
   1616 
   1617             h_envChan[ch]->sbrCodeNoiseFloor.upDate = upDateNoiseTemp[ch];
   1618           }
   1619 
   1620           sbrHeaderData->coupling = 0;
   1621           h_envChan[0]->encEnvData.balance  = 0;
   1622           h_envChan[1]->encEnvData.balance  = 0;
   1623         }
   1624     }
   1625     break;
   1626   } /* switch */
   1627 
   1628 
   1629   /* tell the envelope encoders how long it has been, since we last sent
   1630      a frame starting with a dF-coded envelope */
   1631   if (stereoMode == SBR_MONO ) {
   1632     if (h_envChan[0]->encEnvData.domain_vec[0] == TIME)
   1633       h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++;
   1634     else
   1635       h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0;
   1636   }
   1637   else {
   1638     if (h_envChan[0]->encEnvData.domain_vec[0] == TIME ||
   1639         h_envChan[1]->encEnvData.domain_vec[0] == TIME) {
   1640       h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++;
   1641       h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac++;
   1642     }
   1643     else {
   1644       h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0;
   1645       h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac = 0;
   1646     }
   1647   }
   1648 
   1649   /*
   1650     Send the encoded data to the bitstream
   1651   */
   1652   for(ch = 0; ch < nChannels;ch++){
   1653     SBR_ENV_TEMP_DATA *ed = &eData[ch];
   1654     c = 0;
   1655     for (i = 0; i < ed->nEnvelopes; i++) {
   1656       for (j = 0; j < h_envChan[ch]->encEnvData.noScfBands[i]; j++) {
   1657         h_envChan[ch]->encEnvData.ienvelope[i][j] = ed->sfb_nrg[c];
   1658 
   1659         c++;
   1660       }
   1661     }
   1662     for (i = 0; i < MAX_NUM_NOISE_VALUES; i++){
   1663       h_envChan[ch]->encEnvData.sbr_noise_levels[i] = ed->noise_level[i];
   1664     }
   1665   }/* ch */
   1666 
   1667 
   1668   /*
   1669     Write bitstream
   1670   */
   1671   if (nChannels == 2) {
   1672     FDKsbrEnc_WriteEnvChannelPairElement(sbrHeaderData,
   1673                                hParametricStereo,
   1674                                sbrBitstreamData,
   1675                                &h_envChan[0]->encEnvData,
   1676                                &h_envChan[1]->encEnvData,
   1677                                hCmonData,
   1678                                h_con->sbrSyntaxFlags);
   1679   }
   1680   else {
   1681     FDKsbrEnc_WriteEnvSingleChannelElement(sbrHeaderData,
   1682                                  hParametricStereo,
   1683                                  sbrBitstreamData,
   1684                                  &h_envChan[0]->encEnvData,
   1685                                  hCmonData,
   1686                                  h_con->sbrSyntaxFlags);
   1687   }
   1688 
   1689   /*
   1690    * Update buffers.
   1691    */
   1692   for (ch=0; ch<nChannels; ch++)
   1693   {
   1694       int YBufferLength = h_envChan[ch]->sbrExtractEnvelope.no_cols >> h_envChan[ch]->sbrExtractEnvelope.YBufferSzShift;
   1695       for (i = 0; i < h_envChan[ch]->sbrExtractEnvelope.YBufferWriteOffset; i++) {
   1696          FDKmemcpy(h_envChan[ch]->sbrExtractEnvelope.YBuffer[i],
   1697                    h_envChan[ch]->sbrExtractEnvelope.YBuffer[i + YBufferLength],
   1698                    sizeof(FIXP_DBL)*QMF_CHANNELS);
   1699       }
   1700       h_envChan[ch]->sbrExtractEnvelope.YBufferScale[0] = h_envChan[ch]->sbrExtractEnvelope.YBufferScale[1];
   1701   }
   1702 
   1703   sbrHeaderData->prev_coupling = sbrHeaderData->coupling;
   1704 }
   1705 
   1706 /***************************************************************************/
   1707 /*!
   1708 
   1709   \brief  creates an envelope extractor handle
   1710 
   1711   \return error status
   1712 
   1713 ****************************************************************************/
   1714 INT
   1715 FDKsbrEnc_CreateExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE  hSbrCut,
   1716                                     INT channel
   1717                                    ,INT chInEl
   1718                                    ,UCHAR* dynamic_RAM
   1719                          )
   1720 {
   1721   INT i;
   1722   FIXP_DBL* YBuffer = GetRam_Sbr_envYBuffer(channel);
   1723 
   1724   FDKmemclear(hSbrCut,sizeof(SBR_EXTRACT_ENVELOPE));
   1725   hSbrCut->p_YBuffer = YBuffer;
   1726 
   1727 
   1728   for (i = 0; i < (QMF_MAX_TIME_SLOTS>>1); i++) {
   1729     hSbrCut->YBuffer[i] = YBuffer + (i*QMF_CHANNELS);
   1730   }
   1731   FIXP_DBL *YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM);
   1732   INT n=0;
   1733   for (; i < QMF_MAX_TIME_SLOTS; i++,n++) {
   1734     hSbrCut->YBuffer[i] = YBufferDyn + (n*QMF_CHANNELS);
   1735   }
   1736 
   1737   FIXP_DBL* rBuffer = GetRam_Sbr_envRBuffer(0, dynamic_RAM);
   1738   FIXP_DBL* iBuffer = GetRam_Sbr_envIBuffer(0, dynamic_RAM);
   1739 
   1740   for (i = 0; i < QMF_MAX_TIME_SLOTS; i++) {
   1741     hSbrCut->rBuffer[i] = rBuffer + (i*QMF_CHANNELS);
   1742     hSbrCut->iBuffer[i] = iBuffer + (i*QMF_CHANNELS);
   1743   }
   1744 
   1745   return 0;
   1746 }
   1747 
   1748 
   1749 /***************************************************************************/
   1750 /*!
   1751 
   1752   \brief  Initialize an envelope extractor instance.
   1753 
   1754   \return error status
   1755 
   1756 ****************************************************************************/
   1757 INT
   1758 FDKsbrEnc_InitExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE  hSbrCut,
   1759                                   int no_cols,
   1760                                   int no_rows,
   1761                                   int start_index,
   1762                                   int time_slots,
   1763                                   int time_step,
   1764                                   int tran_off,
   1765                                   ULONG statesInitFlag
   1766                                  ,int chInEl
   1767                                  ,UCHAR* dynamic_RAM
   1768                                  ,UINT sbrSyntaxFlags
   1769                                   )
   1770 {
   1771   int YBufferLength, rBufferLength;
   1772   int i;
   1773 
   1774   if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) {
   1775     int off = TRANSIENT_OFFSET_LD;
   1776 #ifndef FULL_DELAY
   1777     hSbrCut->YBufferWriteOffset = (no_cols>>1)+off*time_step;
   1778 #else
   1779     hSbrCut->YBufferWriteOffset = no_cols+off*time_step;
   1780 #endif
   1781   } else
   1782   {
   1783     hSbrCut->YBufferWriteOffset = tran_off*time_step;
   1784   }
   1785   hSbrCut->rBufferReadOffset  = 0;
   1786 
   1787 
   1788   YBufferLength = hSbrCut->YBufferWriteOffset + no_cols;
   1789   rBufferLength = no_cols;
   1790 
   1791   hSbrCut->pre_transient_info[0] = 0;
   1792   hSbrCut->pre_transient_info[1] = 0;
   1793 
   1794 
   1795   hSbrCut->no_cols = no_cols;
   1796   hSbrCut->no_rows = no_rows;
   1797   hSbrCut->start_index = start_index;
   1798 
   1799   hSbrCut->time_slots = time_slots;
   1800   hSbrCut->time_step = time_step;
   1801 
   1802   FDK_ASSERT(no_rows        <=   QMF_CHANNELS);
   1803 
   1804   /* Use half the Energy values if time step is 2 or greater */
   1805   if (time_step >= 2)
   1806     hSbrCut->YBufferSzShift = 1;
   1807   else
   1808     hSbrCut->YBufferSzShift = 0;
   1809 
   1810   YBufferLength               >>= hSbrCut->YBufferSzShift;
   1811   hSbrCut->YBufferWriteOffset >>= hSbrCut->YBufferSzShift;
   1812 
   1813   FDK_ASSERT(YBufferLength<=QMF_MAX_TIME_SLOTS);
   1814 
   1815   FIXP_DBL *YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM);
   1816   INT n=0;
   1817   for (i=(QMF_MAX_TIME_SLOTS>>1); i < QMF_MAX_TIME_SLOTS; i++,n++) {
   1818     hSbrCut->YBuffer[i] = YBufferDyn + (n*QMF_CHANNELS);
   1819   }
   1820 
   1821   if(statesInitFlag) {
   1822     for (i=0; i<YBufferLength; i++) {
   1823       FDKmemclear( hSbrCut->YBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL));
   1824     }
   1825   }
   1826 
   1827   for (i = 0; i < rBufferLength; i++) {
   1828     FDKmemclear( hSbrCut->rBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL));
   1829     FDKmemclear( hSbrCut->iBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL));
   1830   }
   1831 
   1832   FDKmemclear (hSbrCut->envelopeCompensation,sizeof(UCHAR)*MAX_FREQ_COEFFS);
   1833 
   1834   if(statesInitFlag) {
   1835     hSbrCut->YBufferScale[0] = hSbrCut->YBufferScale[1] = FRACT_BITS-1;
   1836   }
   1837 
   1838   return (0);
   1839 }
   1840 
   1841 
   1842 
   1843 
   1844 /***************************************************************************/
   1845 /*!
   1846 
   1847   \brief  deinitializes an envelope extractor handle
   1848 
   1849   \return void
   1850 
   1851 ****************************************************************************/
   1852 
   1853 void
   1854 FDKsbrEnc_deleteExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut)
   1855 {
   1856 
   1857   if (hSbrCut) {
   1858     FreeRam_Sbr_envYBuffer(&hSbrCut->p_YBuffer);
   1859   }
   1860 }
   1861 
   1862 INT
   1863 FDKsbrEnc_GetEnvEstDelay(HANDLE_SBR_EXTRACT_ENVELOPE hSbr)
   1864 {
   1865   return hSbr->no_rows*((hSbr->YBufferWriteOffset)*2     /* mult 2 because nrg's are grouped half */
   1866                         - hSbr->rBufferReadOffset );       /* in reference hold half spec and calc nrg's on overlapped spec */
   1867 
   1868 }
   1869 
   1870 
   1871 
   1872 
   1873