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