Imported Debian version 0.1.3.1
[deb_fdk-aac.git] / libSBRenc / src / env_est.cpp
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
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
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
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
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
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
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
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 ****************************************************************************/
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
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
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
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
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
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
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
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