Imported Debian version 0.1.3.1
[deb_fdk-aac.git] / libSBRdec / src / env_dec.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 /*!
85 \file
86 \brief envelope decoding
87 This module provides envelope decoding and error concealment algorithms. The main
88 entry point is decodeSbrData().
89
90 \sa decodeSbrData(),\ref documentationOverview
91 */
92
93 #include "env_dec.h"
94
95 #include "env_extr.h"
96 #include "transcendent.h"
97
98 #include "genericStds.h"
99
100
101 static void decodeEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData,
102 HANDLE_SBR_FRAME_DATA h_sbr_data,
103 HANDLE_SBR_PREV_FRAME_DATA h_prev_data,
104 HANDLE_SBR_PREV_FRAME_DATA h_prev_data_otherChannel);
105 static void sbr_envelope_unmapping (HANDLE_SBR_HEADER_DATA hHeaderData,
106 HANDLE_SBR_FRAME_DATA h_data_left,
107 HANDLE_SBR_FRAME_DATA h_data_right);
108 static void requantizeEnvelopeData (HANDLE_SBR_FRAME_DATA h_sbr_data,
109 int ampResolution);
110 static void deltaToLinearPcmEnvelopeDecoding (HANDLE_SBR_HEADER_DATA hHeaderData,
111 HANDLE_SBR_FRAME_DATA h_sbr_data,
112 HANDLE_SBR_PREV_FRAME_DATA h_prev_data);
113 static void decodeNoiseFloorlevels (HANDLE_SBR_HEADER_DATA hHeaderData,
114 HANDLE_SBR_FRAME_DATA h_sbr_data,
115 HANDLE_SBR_PREV_FRAME_DATA h_prev_data);
116 static void timeCompensateFirstEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData,
117 HANDLE_SBR_FRAME_DATA h_sbr_data,
118 HANDLE_SBR_PREV_FRAME_DATA h_prev_data);
119 static int checkEnvelopeData (HANDLE_SBR_HEADER_DATA hHeaderData,
120 HANDLE_SBR_FRAME_DATA h_sbr_data,
121 HANDLE_SBR_PREV_FRAME_DATA h_prev_data);
122
123
124
125 #define SBR_ENERGY_PAN_OFFSET (12 << ENV_EXP_FRACT)
126 #define SBR_MAX_ENERGY (35 << ENV_EXP_FRACT)
127
128 #define DECAY ( 1 << ENV_EXP_FRACT)
129
130 #if ENV_EXP_FRACT
131 #define DECAY_COUPLING ( 1 << (ENV_EXP_FRACT-1) ) /*!< corresponds to a value of 0.5 */
132 #else
133 #define DECAY_COUPLING 1 /*!< If the energy data is not shifted, use 1 instead of 0.5 */
134 #endif
135
136
137 /*!
138 \brief Convert table index
139 */
140 static int indexLow2High(int offset, /*!< mapping factor */
141 int index, /*!< index to scalefactor band */
142 int res) /*!< frequency resolution */
143 {
144 if(res == 0)
145 {
146 if (offset >= 0)
147 {
148 if (index < offset)
149 return(index);
150 else
151 return(2*index - offset);
152 }
153 else
154 {
155 offset = -offset;
156 if (index < offset)
157 return(2*index+index);
158 else
159 return(2*index + offset);
160 }
161 }
162 else
163 return(index);
164 }
165
166
167 /*!
168 \brief Update previous envelope value for delta-coding
169
170 The current envelope values needs to be stored for delta-coding
171 in the next frame. The stored envelope is always represented with
172 the high frequency resolution. If the current envelope uses the
173 low frequency resolution, the energy value will be mapped to the
174 corresponding high-res bands.
175 */
176 static void mapLowResEnergyVal(FIXP_SGL currVal, /*!< current energy value */
177 FIXP_SGL* prevData,/*!< pointer to previous data vector */
178 int offset, /*!< mapping factor */
179 int index, /*!< index to scalefactor band */
180 int res) /*!< frequeny resolution */
181 {
182 if(res == 0)
183 {
184 if (offset >= 0)
185 {
186 if(index < offset)
187 prevData[index] = currVal;
188 else
189 {
190 prevData[2*index - offset] = currVal;
191 prevData[2*index+1 - offset] = currVal;
192 }
193 }
194 else
195 {
196 offset = -offset;
197 if (index < offset)
198 {
199 prevData[3*index] = currVal;
200 prevData[3*index+1] = currVal;
201 prevData[3*index+2] = currVal;
202 }
203 else
204 {
205 prevData[2*index + offset] = currVal;
206 prevData[2*index + 1 + offset] = currVal;
207 }
208 }
209 }
210 else
211 prevData[index] = currVal;
212 }
213
214
215
216 /*!
217 \brief Convert raw envelope and noisefloor data to energy levels
218
219 This function is being called by sbrDecoder_ParseElement() and provides two important algorithms:
220
221 First the function decodes envelopes and noise floor levels as described in requantizeEnvelopeData()
222 and sbr_envelope_unmapping(). The function also implements concealment algorithms in case there are errors
223 within the sbr data. For both operations fractional arithmetic is used.
224 Therefore you might encounter different output values on your target
225 system compared to the reference implementation.
226 */
227 void
228 decodeSbrData (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
229 HANDLE_SBR_FRAME_DATA h_data_left, /*!< pointer to left channel frame data */
230 HANDLE_SBR_PREV_FRAME_DATA h_prev_data_left, /*!< pointer to left channel previous frame data */
231 HANDLE_SBR_FRAME_DATA h_data_right, /*!< pointer to right channel frame data */
232 HANDLE_SBR_PREV_FRAME_DATA h_prev_data_right)/*!< pointer to right channel previous frame data */
233 {
234 FIXP_SGL tempSfbNrgPrev[MAX_FREQ_COEFFS];
235 int errLeft;
236
237 /* Save previous energy values to be able to reuse them later for concealment. */
238 FDKmemcpy (tempSfbNrgPrev, h_prev_data_left->sfb_nrg_prev, MAX_FREQ_COEFFS * sizeof(FIXP_SGL));
239
240 decodeEnvelope (hHeaderData, h_data_left, h_prev_data_left, h_prev_data_right);
241 decodeNoiseFloorlevels (hHeaderData, h_data_left, h_prev_data_left);
242
243 if(h_data_right != NULL) {
244 errLeft = hHeaderData->frameErrorFlag;
245 decodeEnvelope (hHeaderData, h_data_right, h_prev_data_right, h_prev_data_left);
246 decodeNoiseFloorlevels (hHeaderData, h_data_right, h_prev_data_right);
247
248 if (!errLeft && hHeaderData->frameErrorFlag) {
249 /* If an error occurs in the right channel where the left channel seemed ok,
250 we apply concealment also on the left channel. This ensures that the coupling
251 modes of both channels match and that we have the same number of envelopes in
252 coupling mode.
253 However, as the left channel has already been processed before, the resulting
254 energy levels are not the same as if the left channel had been concealed
255 during the first call of decodeEnvelope().
256 */
257 /* Restore previous energy values for concealment, because the values have been
258 overwritten by the first call of decodeEnvelope(). */
259 FDKmemcpy (h_prev_data_left->sfb_nrg_prev, tempSfbNrgPrev, MAX_FREQ_COEFFS * sizeof(FIXP_SGL));
260 /* Do concealment */
261 decodeEnvelope (hHeaderData, h_data_left, h_prev_data_left, h_prev_data_right);
262 }
263
264 if (h_data_left->coupling) {
265 sbr_envelope_unmapping (hHeaderData, h_data_left, h_data_right);
266 }
267 }
268
269 /* Display the data for debugging: */
270 }
271
272
273 /*!
274 \brief Convert from coupled channels to independent L/R data
275 */
276 static void
277 sbr_envelope_unmapping (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
278 HANDLE_SBR_FRAME_DATA h_data_left, /*!< pointer to left channel */
279 HANDLE_SBR_FRAME_DATA h_data_right) /*!< pointer to right channel */
280 {
281 int i;
282 FIXP_SGL tempL_m, tempR_m, tempRplus1_m, newL_m, newR_m;
283 SCHAR tempL_e, tempR_e, tempRplus1_e, newL_e, newR_e;
284
285
286 /* 1. Unmap (already dequantized) coupled envelope energies */
287
288 for (i = 0; i < h_data_left->nScaleFactors; i++) {
289 tempR_m = (FIXP_SGL)((LONG)h_data_right->iEnvelope[i] & MASK_M);
290 tempR_e = (SCHAR)((LONG)h_data_right->iEnvelope[i] & MASK_E);
291
292 tempR_e -= (18 + NRG_EXP_OFFSET); /* -18 = ld(UNMAPPING_SCALE / h_data_right->nChannels) */
293 tempL_m = (FIXP_SGL)((LONG)h_data_left->iEnvelope[i] & MASK_M);
294 tempL_e = (SCHAR)((LONG)h_data_left->iEnvelope[i] & MASK_E);
295
296 tempL_e -= NRG_EXP_OFFSET;
297
298 /* Calculate tempRight+1 */
299 FDK_add_MantExp( tempR_m, tempR_e,
300 FL2FXCONST_SGL(0.5f), 1, /* 1.0 */
301 &tempRplus1_m, &tempRplus1_e);
302
303 FDK_divide_MantExp( tempL_m, tempL_e+1, /* 2 * tempLeft */
304 tempRplus1_m, tempRplus1_e,
305 &newR_m, &newR_e );
306
307 if (newR_m >= ((FIXP_SGL)MAXVAL_SGL - ROUNDING)) {
308 newR_m >>= 1;
309 newR_e += 1;
310 }
311
312 newL_m = FX_DBL2FX_SGL(fMult(tempR_m,newR_m));
313 newL_e = tempR_e + newR_e;
314
315 h_data_right->iEnvelope[i] = ((FIXP_SGL)((SHORT)(FIXP_SGL)(newR_m + ROUNDING) & MASK_M)) +
316 (FIXP_SGL)((SHORT)(FIXP_SGL)(newR_e + NRG_EXP_OFFSET) & MASK_E);
317 h_data_left->iEnvelope[i] = ((FIXP_SGL)((SHORT)(FIXP_SGL)(newL_m + ROUNDING) & MASK_M)) +
318 (FIXP_SGL)((SHORT)(FIXP_SGL)(newL_e + NRG_EXP_OFFSET) & MASK_E);
319 }
320
321 /* 2. Dequantize and unmap coupled noise floor levels */
322
323 for (i = 0; i < hHeaderData->freqBandData.nNfb * h_data_left->frameInfo.nNoiseEnvelopes; i++) {
324
325 tempL_e = (SCHAR)(6 - (LONG)h_data_left->sbrNoiseFloorLevel[i]);
326 tempR_e = (SCHAR)((LONG)h_data_right->sbrNoiseFloorLevel[i] - 12) /*SBR_ENERGY_PAN_OFFSET*/;
327
328 /* Calculate tempR+1 */
329 FDK_add_MantExp( FL2FXCONST_SGL(0.5f), 1+tempR_e, /* tempR */
330 FL2FXCONST_SGL(0.5f), 1, /* 1.0 */
331 &tempRplus1_m, &tempRplus1_e);
332
333 /* Calculate 2*tempLeft/(tempR+1) */
334 FDK_divide_MantExp( FL2FXCONST_SGL(0.5f), tempL_e+2, /* 2 * tempLeft */
335 tempRplus1_m, tempRplus1_e,
336 &newR_m, &newR_e );
337
338 /* if (newR_m >= ((FIXP_SGL)MAXVAL_SGL - ROUNDING)) {
339 newR_m >>= 1;
340 newR_e += 1;
341 } */
342
343 /* L = tempR * R */
344 newL_m = newR_m;
345 newL_e = newR_e + tempR_e;
346 h_data_right->sbrNoiseFloorLevel[i] = ((FIXP_SGL)((SHORT)(FIXP_SGL)(newR_m + ROUNDING) & MASK_M)) +
347 (FIXP_SGL)((SHORT)(FIXP_SGL)(newR_e + NOISE_EXP_OFFSET) & MASK_E);
348 h_data_left->sbrNoiseFloorLevel[i] = ((FIXP_SGL)((SHORT)(FIXP_SGL)(newL_m + ROUNDING) & MASK_M)) +
349 (FIXP_SGL)((SHORT)(FIXP_SGL)(newL_e + NOISE_EXP_OFFSET) & MASK_E);
350 }
351 }
352
353
354 /*!
355 \brief Simple alternative to the real SBR concealment
356
357 If the real frameInfo is not available due to a frame loss, a replacement will
358 be constructed with 1 envelope spanning the whole frame (FIX-FIX).
359 The delta-coded energies are set to negative values, resulting in a fade-down.
360 In case of coupling, the balance-channel will move towards the center.
361 */
362 static void
363 leanSbrConcealment(HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
364 HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */
365 HANDLE_SBR_PREV_FRAME_DATA h_prev_data /*!< pointer to data of last frame */
366 )
367 {
368 FIXP_SGL target; /* targeted level for sfb_nrg_prev during fade-down */
369 FIXP_SGL step; /* speed of fade */
370 int i;
371
372 int currentStartPos = h_prev_data->stopPos - hHeaderData->numberTimeSlots;
373 int currentStopPos = hHeaderData->numberTimeSlots;
374
375
376 /* Use some settings of the previous frame */
377 h_sbr_data->ampResolutionCurrentFrame = h_prev_data->ampRes;
378 h_sbr_data->coupling = h_prev_data->coupling;
379 for(i=0;i<MAX_INVF_BANDS;i++)
380 h_sbr_data->sbr_invf_mode[i] = h_prev_data->sbr_invf_mode[i];
381
382 /* Generate concealing control data */
383
384 h_sbr_data->frameInfo.nEnvelopes = 1;
385 h_sbr_data->frameInfo.borders[0] = currentStartPos;
386 h_sbr_data->frameInfo.borders[1] = currentStopPos;
387 h_sbr_data->frameInfo.freqRes[0] = 1;
388 h_sbr_data->frameInfo.tranEnv = -1; /* no transient */
389 h_sbr_data->frameInfo.nNoiseEnvelopes = 1;
390 h_sbr_data->frameInfo.bordersNoise[0] = currentStartPos;
391 h_sbr_data->frameInfo.bordersNoise[1] = currentStopPos;
392
393 h_sbr_data->nScaleFactors = hHeaderData->freqBandData.nSfb[1];
394
395 /* Generate fake envelope data */
396
397 h_sbr_data->domain_vec[0] = 1;
398
399 if (h_sbr_data->coupling == COUPLING_BAL) {
400 target = (FIXP_SGL)SBR_ENERGY_PAN_OFFSET;
401 step = (FIXP_SGL)DECAY_COUPLING;
402 }
403 else {
404 target = FL2FXCONST_SGL(0.0f);
405 step = (FIXP_SGL)DECAY;
406 }
407 if (hHeaderData->bs_info.ampResolution == 0) {
408 target <<= 1;
409 step <<= 1;
410 }
411
412 for (i=0; i < h_sbr_data->nScaleFactors; i++) {
413 if (h_prev_data->sfb_nrg_prev[i] > target)
414 h_sbr_data->iEnvelope[i] = -step;
415 else
416 h_sbr_data->iEnvelope[i] = step;
417 }
418
419 /* Noisefloor levels are always cleared ... */
420
421 h_sbr_data->domain_vec_noise[0] = 1;
422 for (i=0; i < hHeaderData->freqBandData.nNfb; i++)
423 h_sbr_data->sbrNoiseFloorLevel[i] = FL2FXCONST_SGL(0.0f);
424
425 /* ... and so are the sines */
426 FDKmemclear(h_sbr_data->addHarmonics, MAX_FREQ_COEFFS);
427 }
428
429
430 /*!
431 \brief Build reference energies and noise levels from bitstream elements
432 */
433 static void
434 decodeEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
435 HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */
436 HANDLE_SBR_PREV_FRAME_DATA h_prev_data, /*!< pointer to data of last frame */
437 HANDLE_SBR_PREV_FRAME_DATA otherChannel /*!< other channel's last frame data */
438 )
439 {
440 int i;
441 int fFrameError = hHeaderData->frameErrorFlag;
442 FIXP_SGL tempSfbNrgPrev[MAX_FREQ_COEFFS];
443
444 if (!fFrameError) {
445 /*
446 To avoid distortions after bad frames, set the error flag if delta coding in time occurs.
447 However, SBR can take a little longer to come up again.
448 */
449 if ( h_prev_data->frameErrorFlag ) {
450 if (h_sbr_data->domain_vec[0] != 0) {
451 fFrameError = 1;
452 }
453 } else {
454 /* Check that the previous stop position and the current start position match.
455 (Could be done in checkFrameInfo(), but the previous frame data is not available there) */
456 if ( h_sbr_data->frameInfo.borders[0] != h_prev_data->stopPos - hHeaderData->numberTimeSlots ) {
457 /* Both the previous as well as the current frame are flagged to be ok, but they do not match! */
458 if (h_sbr_data->domain_vec[0] == 1) {
459 /* Prefer concealment over delta-time coding between the mismatching frames */
460 fFrameError = 1;
461 }
462 else {
463 /* Close the gap in time by triggering timeCompensateFirstEnvelope() */
464 fFrameError = 1;
465 }
466 }
467 }
468 }
469
470
471 if (fFrameError) /* Error is detected */
472 {
473 leanSbrConcealment(hHeaderData,
474 h_sbr_data,
475 h_prev_data);
476
477 /* decode the envelope data to linear PCM */
478 deltaToLinearPcmEnvelopeDecoding (hHeaderData, h_sbr_data, h_prev_data);
479 }
480 else /*Do a temporary dummy decoding and check that the envelope values are within limits */
481 {
482 if (h_prev_data->frameErrorFlag) {
483 timeCompensateFirstEnvelope (hHeaderData, h_sbr_data, h_prev_data);
484 if (h_sbr_data->coupling != h_prev_data->coupling) {
485 /*
486 Coupling mode has changed during concealment.
487 The stored energy levels need to be converted.
488 */
489 for (i = 0; i < hHeaderData->freqBandData.nSfb[1]; i++) {
490 /* Former Level-Channel will be used for both channels */
491 if (h_prev_data->coupling == COUPLING_BAL)
492 h_prev_data->sfb_nrg_prev[i] = otherChannel->sfb_nrg_prev[i];
493 /* Former L/R will be combined as the new Level-Channel */
494 else if (h_sbr_data->coupling == COUPLING_LEVEL)
495 h_prev_data->sfb_nrg_prev[i] = (h_prev_data->sfb_nrg_prev[i] + otherChannel->sfb_nrg_prev[i]) >> 1;
496 else if (h_sbr_data->coupling == COUPLING_BAL)
497 h_prev_data->sfb_nrg_prev[i] = (FIXP_SGL)SBR_ENERGY_PAN_OFFSET;
498 }
499 }
500 }
501 FDKmemcpy (tempSfbNrgPrev, h_prev_data->sfb_nrg_prev,
502 MAX_FREQ_COEFFS * sizeof (FIXP_SGL));
503
504 deltaToLinearPcmEnvelopeDecoding (hHeaderData, h_sbr_data, h_prev_data);
505
506 fFrameError = checkEnvelopeData (hHeaderData, h_sbr_data, h_prev_data);
507
508 if (fFrameError)
509 {
510 hHeaderData->frameErrorFlag = 1;
511 FDKmemcpy (h_prev_data->sfb_nrg_prev, tempSfbNrgPrev,
512 MAX_FREQ_COEFFS * sizeof (FIXP_SGL));
513 decodeEnvelope (hHeaderData, h_sbr_data, h_prev_data, otherChannel);
514 return;
515 }
516 }
517
518 requantizeEnvelopeData (h_sbr_data, h_sbr_data->ampResolutionCurrentFrame);
519
520 hHeaderData->frameErrorFlag = fFrameError;
521 }
522
523
524 /*!
525 \brief Verify that envelope energies are within the allowed range
526 \return 0 if all is fine, 1 if an envelope value was too high
527 */
528 static int
529 checkEnvelopeData (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
530 HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */
531 HANDLE_SBR_PREV_FRAME_DATA h_prev_data /*!< pointer to data of last frame */
532 )
533 {
534 FIXP_SGL *iEnvelope = h_sbr_data->iEnvelope;
535 FIXP_SGL *sfb_nrg_prev = h_prev_data->sfb_nrg_prev;
536 int i = 0, errorFlag = 0;
537 FIXP_SGL sbr_max_energy =
538 (h_sbr_data->ampResolutionCurrentFrame == 1) ? SBR_MAX_ENERGY : (SBR_MAX_ENERGY << 1);
539
540 /*
541 Range check for current energies
542 */
543 for (i = 0; i < h_sbr_data->nScaleFactors; i++) {
544 if (iEnvelope[i] > sbr_max_energy) {
545 errorFlag = 1;
546 }
547 if (iEnvelope[i] < FL2FXCONST_SGL(0.0f)) {
548 errorFlag = 1;
549 /* iEnvelope[i] = FL2FXCONST_SGL(0.0f); */
550 }
551 }
552
553 /*
554 Range check for previous energies
555 */
556 for (i = 0; i < hHeaderData->freqBandData.nSfb[1]; i++) {
557 sfb_nrg_prev[i] = fixMax(sfb_nrg_prev[i], FL2FXCONST_SGL(0.0f));
558 sfb_nrg_prev[i] = fixMin(sfb_nrg_prev[i], sbr_max_energy);
559 }
560
561 return (errorFlag);
562 }
563
564
565 /*!
566 \brief Verify that the noise levels are within the allowed range
567
568 The function is equivalent to checkEnvelopeData().
569 When the noise-levels are being decoded, it is already too late for
570 concealment. Therefore the noise levels are simply limited here.
571 */
572 static void
573 limitNoiseLevels(HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
574 HANDLE_SBR_FRAME_DATA h_sbr_data) /*!< pointer to current data */
575 {
576 int i;
577 int nNfb = hHeaderData->freqBandData.nNfb;
578
579 /*
580 Set range limits. The exact values depend on the coupling mode.
581 However this limitation is primarily intended to avoid unlimited
582 accumulation of the delta-coded noise levels.
583 */
584 #define lowerLimit ((FIXP_SGL)0) /* lowerLimit actually refers to the _highest_ noise energy */
585 #define upperLimit ((FIXP_SGL)35) /* upperLimit actually refers to the _lowest_ noise energy */
586
587 /*
588 Range check for current noise levels
589 */
590 for (i = 0; i < h_sbr_data->frameInfo.nNoiseEnvelopes * nNfb; i++) {
591 h_sbr_data->sbrNoiseFloorLevel[i] = fixMin(h_sbr_data->sbrNoiseFloorLevel[i], upperLimit);
592 h_sbr_data->sbrNoiseFloorLevel[i] = fixMax(h_sbr_data->sbrNoiseFloorLevel[i], lowerLimit);
593 }
594 }
595
596
597 /*!
598 \brief Compensate for the wrong timing that might occur after a frame error.
599 */
600 static void
601 timeCompensateFirstEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
602 HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to actual data */
603 HANDLE_SBR_PREV_FRAME_DATA h_prev_data) /*!< pointer to data of last frame */
604 {
605 int i, nScalefactors;
606 FRAME_INFO *pFrameInfo = &h_sbr_data->frameInfo;
607 UCHAR *nSfb = hHeaderData->freqBandData.nSfb;
608 int estimatedStartPos = h_prev_data->stopPos - hHeaderData->numberTimeSlots;
609 int refLen, newLen, shift;
610 FIXP_SGL deltaExp;
611
612 /* Original length of first envelope according to bitstream */
613 refLen = pFrameInfo->borders[1] - pFrameInfo->borders[0];
614 /* Corrected length of first envelope (concealing can make the first envelope longer) */
615 newLen = pFrameInfo->borders[1] - estimatedStartPos;
616
617 if (newLen <= 0) {
618 /* An envelope length of <= 0 would not work, so we don't use it.
619 May occur if the previous frame was flagged bad due to a mismatch
620 of the old and new frame infos. */
621 newLen = refLen;
622 estimatedStartPos = pFrameInfo->borders[0];
623 }
624
625 deltaExp = FDK_getNumOctavesDiv8(newLen, refLen);
626
627 /* Shift by -3 to rescale ld-table, ampRes-1 to enable coarser steps */
628 shift = (FRACT_BITS - 1 - ENV_EXP_FRACT - 1 + h_sbr_data->ampResolutionCurrentFrame - 3);
629 deltaExp = deltaExp >> shift;
630 pFrameInfo->borders[0] = estimatedStartPos;
631 pFrameInfo->bordersNoise[0] = estimatedStartPos;
632
633 if (h_sbr_data->coupling != COUPLING_BAL) {
634 nScalefactors = (pFrameInfo->freqRes[0]) ? nSfb[1] : nSfb[0];
635
636 for (i = 0; i < nScalefactors; i++)
637 h_sbr_data->iEnvelope[i] = h_sbr_data->iEnvelope[i] + deltaExp;
638 }
639 }
640
641
642
643 /*!
644 \brief Convert each envelope value from logarithmic to linear domain
645
646 Energy levels are transmitted in powers of 2, i.e. only the exponent
647 is extracted from the bitstream.
648 Therefore, normally only integer exponents can occur. However during
649 fading (in case of a corrupt bitstream), a fractional part can also
650 occur. The data in the array iEnvelope is shifted left by ENV_EXP_FRACT
651 compared to an integer representation so that numbers smaller than 1
652 can be represented.
653
654 This function calculates a mantissa corresponding to the fractional
655 part of the exponent for each reference energy. The array iEnvelope
656 is converted in place to save memory. Input and output data must
657 be interpreted differently, as shown in the below figure:
658
659 \image html EnvelopeData.png
660
661 The data is then used in calculateSbrEnvelope().
662 */
663 static void
664 requantizeEnvelopeData (HANDLE_SBR_FRAME_DATA h_sbr_data, int ampResolution)
665 {
666 int i;
667 FIXP_SGL mantissa;
668 int ampShift = 1 - ampResolution;
669 int exponent;
670
671 /* In case that ENV_EXP_FRACT is changed to something else but 0 or 8,
672 the initialization of this array has to be adapted!
673 */
674 #if ENV_EXP_FRACT
675 static const FIXP_SGL pow2[ENV_EXP_FRACT] =
676 {
677 FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 1))), /* 0.7071 */
678 FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 2))), /* 0.5946 */
679 FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 3))),
680 FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 4))),
681 FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 5))),
682 FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 6))),
683 FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 7))),
684 FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 8))) /* 0.5013 */
685 };
686
687 int bit, mask;
688 #endif
689
690 for (i = 0; i < h_sbr_data->nScaleFactors; i++) {
691 exponent = (LONG)h_sbr_data->iEnvelope[i];
692
693 #if ENV_EXP_FRACT
694
695 exponent = exponent >> ampShift;
696 mantissa = 0.5f;
697
698 /* Amplify mantissa according to the fractional part of the
699 exponent (result will be between 0.500000 and 0.999999)
700 */
701 mask = 1; /* begin with lowest bit of exponent */
702
703 for ( bit=ENV_EXP_FRACT-1; bit>=0; bit-- ) {
704 if (exponent & mask) {
705 /* The current bit of the exponent is set,
706 multiply mantissa with the corresponding factor: */
707 mantissa = (FIXP_SGL)( (mantissa * pow2[bit]) << 1);
708 }
709 /* Advance to next bit */
710 mask = mask << 1;
711 }
712
713 /* Make integer part of exponent right aligned */
714 exponent = exponent >> ENV_EXP_FRACT;
715
716 #else
717 /* In case of the high amplitude resolution, 1 bit of the exponent gets lost by the shift.
718 This will be compensated by a mantissa of 0.5*sqrt(2) instead of 0.5 if that bit is 1. */
719 mantissa = (exponent & ampShift) ? FL2FXCONST_SGL(0.707106781186548f) : FL2FXCONST_SGL(0.5f);
720 exponent = exponent >> ampShift;
721 #endif
722
723 /*
724 Mantissa was set to 0.5 (instead of 1.0, therefore increase exponent by 1).
725 Multiply by L=nChannels=64 by increasing exponent by another 6.
726 => Increase exponent by 7
727 */
728 exponent += 7 + NRG_EXP_OFFSET;
729
730 /* Combine mantissa and exponent and write back the result */
731 h_sbr_data->iEnvelope[i] = (FIXP_SGL)(((LONG)mantissa & MASK_M) | (exponent & MASK_E));
732
733 }
734 }
735
736
737 /*!
738 \brief Build new reference energies from old ones and delta coded data
739 */
740 static void
741 deltaToLinearPcmEnvelopeDecoding (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
742 HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */
743 HANDLE_SBR_PREV_FRAME_DATA h_prev_data) /*!< pointer to previous data */
744 {
745 int i, domain, no_of_bands, band, freqRes;
746
747 FIXP_SGL *sfb_nrg_prev = h_prev_data->sfb_nrg_prev;
748 FIXP_SGL *ptr_nrg = h_sbr_data->iEnvelope;
749
750 int offset = 2 * hHeaderData->freqBandData.nSfb[0] - hHeaderData->freqBandData.nSfb[1];
751
752 for (i = 0; i < h_sbr_data->frameInfo.nEnvelopes; i++) {
753 domain = h_sbr_data->domain_vec[i];
754 freqRes = h_sbr_data->frameInfo.freqRes[i];
755
756 FDK_ASSERT(freqRes >= 0 && freqRes <= 1);
757
758 no_of_bands = hHeaderData->freqBandData.nSfb[freqRes];
759
760 FDK_ASSERT(no_of_bands < (64));
761
762 if (domain == 0)
763 {
764 mapLowResEnergyVal(*ptr_nrg, sfb_nrg_prev, offset, 0, freqRes);
765 ptr_nrg++;
766 for (band = 1; band < no_of_bands; band++)
767 {
768 *ptr_nrg = *ptr_nrg + *(ptr_nrg-1);
769 mapLowResEnergyVal(*ptr_nrg, sfb_nrg_prev, offset, band, freqRes);
770 ptr_nrg++;
771 }
772 }
773 else
774 {
775 for (band = 0; band < no_of_bands; band++)
776 {
777 *ptr_nrg = *ptr_nrg + sfb_nrg_prev[indexLow2High(offset, band, freqRes)];
778 mapLowResEnergyVal(*ptr_nrg, sfb_nrg_prev, offset, band, freqRes);
779 ptr_nrg++;
780 }
781 }
782 }
783 }
784
785
786 /*!
787 \brief Build new noise levels from old ones and delta coded data
788 */
789 static void
790 decodeNoiseFloorlevels (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
791 HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */
792 HANDLE_SBR_PREV_FRAME_DATA h_prev_data) /*!< pointer to previous data */
793 {
794 int i;
795 int nNfb = hHeaderData->freqBandData.nNfb;
796 int nNoiseFloorEnvelopes = h_sbr_data->frameInfo.nNoiseEnvelopes;
797
798 /* Decode first noise envelope */
799
800 if (h_sbr_data->domain_vec_noise[0] == 0) {
801 FIXP_SGL noiseLevel = h_sbr_data->sbrNoiseFloorLevel[0];
802 for (i = 1; i < nNfb; i++) {
803 noiseLevel += h_sbr_data->sbrNoiseFloorLevel[i];
804 h_sbr_data->sbrNoiseFloorLevel[i] = noiseLevel;
805 }
806 }
807 else {
808 for (i = 0; i < nNfb; i++) {
809 h_sbr_data->sbrNoiseFloorLevel[i] += h_prev_data->prevNoiseLevel[i];
810 }
811 }
812
813 /* If present, decode the second noise envelope
814 Note: nNoiseFloorEnvelopes can only be 1 or 2 */
815
816 if (nNoiseFloorEnvelopes > 1) {
817 if (h_sbr_data->domain_vec_noise[1] == 0) {
818 FIXP_SGL noiseLevel = h_sbr_data->sbrNoiseFloorLevel[nNfb];
819 for (i = nNfb + 1; i < 2*nNfb; i++) {
820 noiseLevel += h_sbr_data->sbrNoiseFloorLevel[i];
821 h_sbr_data->sbrNoiseFloorLevel[i] = noiseLevel;
822 }
823 }
824 else {
825 for (i = 0; i < nNfb; i++) {
826 h_sbr_data->sbrNoiseFloorLevel[i + nNfb] += h_sbr_data->sbrNoiseFloorLevel[i];
827 }
828 }
829 }
830
831 limitNoiseLevels(hHeaderData, h_sbr_data);
832
833 /* Update prevNoiseLevel with the last noise envelope */
834 for (i = 0; i < nNfb; i++)
835 h_prev_data->prevNoiseLevel[i] = h_sbr_data->sbrNoiseFloorLevel[i + nNfb*(nNoiseFloorEnvelopes-1)];
836
837
838 /* Requantize the noise floor levels in COUPLING_OFF-mode */
839 if (!h_sbr_data->coupling) {
840 int nf_e;
841
842 for (i = 0; i < nNoiseFloorEnvelopes*nNfb; i++) {
843 nf_e = 6 - (LONG)h_sbr_data->sbrNoiseFloorLevel[i] + 1 + NOISE_EXP_OFFSET;
844 /* +1 to compensate for a mantissa of 0.5 instead of 1.0 */
845
846 h_sbr_data->sbrNoiseFloorLevel[i] =
847 (FIXP_SGL)( ((LONG)FL2FXCONST_SGL(0.5f)) + /* mantissa */
848 (nf_e & MASK_E) ); /* exponent */
849
850 }
851 }
852 }