1 /* -----------------------------------------------------------------------------
2 Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
5 Forschung e.V. All rights reserved.
6
7 1. INTRODUCTION
8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
11 a wide variety of Android devices.
12
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14 general perceptual audio codecs. AAC-ELD is considered the best-performing
15 full-bandwidth communications codec by independent studies and is widely
16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17 specifications.
18
19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
20 those of Fraunhofer) may be obtained through Via Licensing
21 (www.vialicensing.com) or through the respective patent owners individually for
22 the purpose of encoding or decoding bit streams in products that are compliant
23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24 Android devices already license these patent claims through Via Licensing or
25 directly from the patent owners, and therefore FDK AAC Codec software may
26 already be covered under those patent licenses when it is used for those
27 licensed purposes only.
28
29 Commercially-licensed AAC software libraries, including floating-point versions
30 with enhanced sound quality, are also available from Fraunhofer. Users are
31 encouraged to check the Fraunhofer website for additional applications
32 information and documentation.
33
34 2. COPYRIGHT LICENSE
35
36 Redistribution and use in source and binary forms, with or without modification,
37 are permitted without payment of copyright license fees provided that you
38 satisfy the following conditions:
39
40 You must retain the complete text of this software license in redistributions of
41 the FDK AAC Codec or your modifications thereto in source code form.
42
43 You must retain the complete text of this software license in the documentation
44 and/or other materials provided with redistributions of the FDK AAC Codec or
45 your modifications thereto in binary form. You must make available free of
46 charge copies of the complete source code of the FDK AAC Codec and your
47 modifications thereto to recipients of copies in binary form.
48
49 The name of Fraunhofer may not be used to endorse or promote products derived
50 from this library without prior written permission.
51
52 You may not charge copyright license fees for anyone to use, copy or distribute
53 the FDK AAC Codec software or your modifications thereto.
54
55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
56 that you changed the software and the date of any change. For modified versions
57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59 AAC Codec Library for Android."
60
61 3. NO PATENT LICENSE
62
63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65 Fraunhofer provides no warranty of patent non-infringement with respect to this
66 software.
67
68 You may use this FDK AAC Codec software or modifications thereto only for
69 purposes that are authorized by appropriate patent licenses.
70
71 4. DISCLAIMER
72
73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75 including but not limited to the implied warranties of merchantability and
76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78 or consequential damages, including but not limited to procurement of substitute
79 goods or services; loss of use, data, or profits, or business interruption,
80 however caused and on any theory of liability, whether in contract, strict
81 liability, or tort (including negligence), arising in any way out of the use of
82 this software, even if advised of the possibility of such damage.
83
84 5. CONTACT INFORMATION
85
86 Fraunhofer Institute for Integrated Circuits IIS
87 Attention: Audio and Multimedia Departments - FDK AAC LL
88 Am Wolfsmantel 33
89 91058 Erlangen, Germany
90
91 www.iis.fraunhofer.de/amm
92 amm-info@iis.fraunhofer.de
93 ----------------------------------------------------------------------------- */
94
95 /**************************** AAC decoder library ******************************
96
97 Author(s): Josef Hoepfl
98
99 Description: long/short-block decoding
100
101 *******************************************************************************/
102
103 #include "block.h"
104
105 #include "aac_rom.h"
106 #include "FDK_bitstream.h"
107 #include "scale.h"
108 #include "FDK_tools_rom.h"
109
110 #include "usacdec_fac.h"
111 #include "usacdec_lpd.h"
112 #include "usacdec_lpc.h"
113 #include "FDK_trigFcts.h"
114
115 #include "ac_arith_coder.h"
116
117 #include "aacdec_hcr.h"
118 #include "rvlc.h"
119
120 #if defined(__arm__)
121 #include "arm/block_arm.cpp"
122 #endif
123
124 /*!
125 \brief Read escape sequence of codeword
126
127 The function reads the escape sequence from the bitstream,
128 if the absolute value of the quantized coefficient has the
129 value 16.
130 A limitation is implemented to maximal 21 bits according to
131 ISO/IEC 14496-3:2009(E) 4.6.3.3.
132 This limits the escape prefix to a maximum of eight 1's.
133 If more than eight 1's are read, MAX_QUANTIZED_VALUE + 1 is
134 returned, independent of the sign of parameter q.
135
136 \return quantized coefficient
137 */
CBlock_GetEscape(HANDLE_FDK_BITSTREAM bs,const LONG q)138 LONG CBlock_GetEscape(HANDLE_FDK_BITSTREAM bs, /*!< pointer to bitstream */
139 const LONG q) /*!< quantized coefficient */
140 {
141 if (fAbs(q) != 16) return (q);
142
143 LONG i, off;
144 for (i = 4; i < 13; i++) {
145 if (FDKreadBit(bs) == 0) break;
146 }
147
148 if (i == 13) return (MAX_QUANTIZED_VALUE + 1);
149
150 off = FDKreadBits(bs, i);
151 i = off + (1 << i);
152
153 if (q < 0) i = -i;
154
155 return i;
156 }
157
CBlock_ReadScaleFactorData(CAacDecoderChannelInfo * pAacDecoderChannelInfo,HANDLE_FDK_BITSTREAM bs,UINT flags)158 AAC_DECODER_ERROR CBlock_ReadScaleFactorData(
159 CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs,
160 UINT flags) {
161 int temp;
162 int band;
163 int group;
164 int position = 0; /* accu for intensity delta coding */
165 int factor = pAacDecoderChannelInfo->pDynData->RawDataInfo
166 .GlobalGain; /* accu for scale factor delta coding */
167 UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
168 SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor;
169 const CodeBookDescription *hcb = &AACcodeBookDescriptionTable[BOOKSCL];
170
171 const USHORT(*CodeBook)[HuffmanEntries] = hcb->CodeBook;
172
173 int ScaleFactorBandsTransmitted =
174 GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
175 for (group = 0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
176 group++) {
177 for (band = 0; band < ScaleFactorBandsTransmitted; band++) {
178 switch (pCodeBook[band]) {
179 case ZERO_HCB: /* zero book */
180 pScaleFactor[band] = 0;
181 break;
182
183 default: /* decode scale factor */
184 if (!((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) && band == 0 &&
185 group == 0)) {
186 temp = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
187 factor += temp - 60; /* MIDFAC 1.5 dB */
188 }
189 pScaleFactor[band] = factor - 100;
190 break;
191
192 case INTENSITY_HCB: /* intensity steering */
193 case INTENSITY_HCB2:
194 temp = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
195 position += temp - 60;
196 pScaleFactor[band] = position - 100;
197 break;
198
199 case NOISE_HCB: /* PNS */
200 if (flags & (AC_MPEGD_RES | AC_USAC | AC_RSVD50 | AC_RSV603DA)) {
201 return AAC_DEC_PARSE_ERROR;
202 }
203 CPns_Read(&pAacDecoderChannelInfo->data.aac.PnsData, bs, hcb,
204 pAacDecoderChannelInfo->pDynData->aScaleFactor,
205 pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain,
206 band, group);
207 break;
208 }
209 }
210 pCodeBook += 16;
211 pScaleFactor += 16;
212 }
213
214 return AAC_DEC_OK;
215 }
216
CBlock_ScaleSpectralData(CAacDecoderChannelInfo * pAacDecoderChannelInfo,UCHAR maxSfbs,SamplingRateInfo * pSamplingRateInfo)217 void CBlock_ScaleSpectralData(CAacDecoderChannelInfo *pAacDecoderChannelInfo,
218 UCHAR maxSfbs,
219 SamplingRateInfo *pSamplingRateInfo) {
220 int band;
221 int window;
222 const SHORT *RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale;
223 SHORT *RESTRICT pSpecScale = pAacDecoderChannelInfo->specScale;
224 int groupwin, group;
225 const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(
226 &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
227 SPECTRAL_PTR RESTRICT pSpectralCoefficient =
228 pAacDecoderChannelInfo->pSpectralCoefficient;
229
230 FDKmemclear(pSpecScale, 8 * sizeof(SHORT));
231
232 for (window = 0, group = 0;
233 group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) {
234 for (groupwin = 0; groupwin < GetWindowGroupLength(
235 &pAacDecoderChannelInfo->icsInfo, group);
236 groupwin++, window++) {
237 int SpecScale_window = pSpecScale[window];
238 FIXP_DBL *pSpectrum = SPEC(pSpectralCoefficient, window,
239 pAacDecoderChannelInfo->granuleLength);
240
241 /* find scaling for current window */
242 for (band = 0; band < maxSfbs; band++) {
243 SpecScale_window =
244 fMax(SpecScale_window, (int)pSfbScale[window * 16 + band]);
245 }
246
247 if (pAacDecoderChannelInfo->pDynData->TnsData.Active &&
248 pAacDecoderChannelInfo->pDynData->TnsData.NumberOfFilters[window] >
249 0) {
250 int filter_index, SpecScale_window_tns;
251 int tns_start, tns_stop;
252
253 /* Find max scale of TNS bands */
254 SpecScale_window_tns = 0;
255 tns_start = GetMaximumTnsBands(&pAacDecoderChannelInfo->icsInfo,
256 pSamplingRateInfo->samplingRateIndex);
257 tns_stop = 0;
258 for (filter_index = 0;
259 filter_index < (int)pAacDecoderChannelInfo->pDynData->TnsData
260 .NumberOfFilters[window];
261 filter_index++) {
262 for (band = pAacDecoderChannelInfo->pDynData->TnsData
263 .Filter[window][filter_index]
264 .StartBand;
265 band < pAacDecoderChannelInfo->pDynData->TnsData
266 .Filter[window][filter_index]
267 .StopBand;
268 band++) {
269 SpecScale_window_tns =
270 fMax(SpecScale_window_tns, (int)pSfbScale[window * 16 + band]);
271 }
272 /* Find TNS line boundaries for all TNS filters */
273 tns_start =
274 fMin(tns_start, (int)pAacDecoderChannelInfo->pDynData->TnsData
275 .Filter[window][filter_index]
276 .StartBand);
277 tns_stop =
278 fMax(tns_stop, (int)pAacDecoderChannelInfo->pDynData->TnsData
279 .Filter[window][filter_index]
280 .StopBand);
281 }
282 SpecScale_window_tns = SpecScale_window_tns +
283 pAacDecoderChannelInfo->pDynData->TnsData.GainLd;
284 FDK_ASSERT(tns_stop >= tns_start);
285 /* Consider existing headroom of all MDCT lines inside the TNS bands. */
286 SpecScale_window_tns -=
287 getScalefactor(pSpectrum + BandOffsets[tns_start],
288 BandOffsets[tns_stop] - BandOffsets[tns_start]);
289 if (SpecScale_window <= 17) {
290 SpecScale_window_tns++;
291 }
292 /* Add enough mantissa head room such that the spectrum is still
293 representable after applying TNS. */
294 SpecScale_window = fMax(SpecScale_window, SpecScale_window_tns);
295 }
296
297 /* store scaling of current window */
298 pSpecScale[window] = SpecScale_window;
299
300 #ifdef FUNCTION_CBlock_ScaleSpectralData_func1
301
302 CBlock_ScaleSpectralData_func1(pSpectrum, maxSfbs, BandOffsets,
303 SpecScale_window, pSfbScale, window);
304
305 #else /* FUNCTION_CBlock_ScaleSpectralData_func1 */
306 for (band = 0; band < maxSfbs; band++) {
307 int scale = fMin(DFRACT_BITS - 1,
308 SpecScale_window - pSfbScale[window * 16 + band]);
309 if (scale) {
310 FDK_ASSERT(scale > 0);
311
312 /* following relation can be used for optimizations:
313 * (BandOffsets[i]%4) == 0 for all i */
314 int max_index = BandOffsets[band + 1];
315 DWORD_ALIGNED(pSpectrum);
316 for (int index = BandOffsets[band]; index < max_index; index++) {
317 pSpectrum[index] >>= scale;
318 }
319 }
320 }
321 #endif /* FUNCTION_CBlock_ScaleSpectralData_func1 */
322 }
323 }
324 }
325
CBlock_ReadSectionData(HANDLE_FDK_BITSTREAM bs,CAacDecoderChannelInfo * pAacDecoderChannelInfo,const SamplingRateInfo * pSamplingRateInfo,const UINT flags)326 AAC_DECODER_ERROR CBlock_ReadSectionData(
327 HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
328 const SamplingRateInfo *pSamplingRateInfo, const UINT flags) {
329 int top, band;
330 int sect_len, sect_len_incr;
331 int group;
332 UCHAR sect_cb;
333 UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
334 /* HCR input (long) */
335 SHORT *pNumLinesInSec =
336 pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr;
337 int numLinesInSecIdx = 0;
338 UCHAR *pHcrCodeBook =
339 pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr;
340 const SHORT *BandOffsets = GetScaleFactorBandOffsets(
341 &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
342 pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection = 0;
343 AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
344
345 FDKmemclear(pCodeBook, sizeof(UCHAR) * (8 * 16));
346
347 const int nbits =
348 (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) == 1) ? 5 : 3;
349
350 int sect_esc_val = (1 << nbits) - 1;
351
352 UCHAR ScaleFactorBandsTransmitted =
353 GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
354 for (group = 0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
355 group++) {
356 for (band = 0; band < ScaleFactorBandsTransmitted;) {
357 sect_len = 0;
358 if (flags & AC_ER_VCB11) {
359 sect_cb = (UCHAR)FDKreadBits(bs, 5);
360 } else
361 sect_cb = (UCHAR)FDKreadBits(bs, 4);
362
363 if (((flags & AC_ER_VCB11) == 0) || (sect_cb < 11) ||
364 ((sect_cb > 11) && (sect_cb < 16))) {
365 sect_len_incr = FDKreadBits(bs, nbits);
366 while (sect_len_incr == sect_esc_val) {
367 sect_len += sect_esc_val;
368 sect_len_incr = FDKreadBits(bs, nbits);
369 }
370 } else {
371 sect_len_incr = 1;
372 }
373
374 sect_len += sect_len_incr;
375
376 top = band + sect_len;
377
378 if (flags & AC_ER_HCR) {
379 /* HCR input (long) -- collecting sideinfo (for HCR-_long_ only) */
380 if (numLinesInSecIdx >= MAX_SFB_HCR) {
381 return AAC_DEC_PARSE_ERROR;
382 }
383 if (top > (int)GetNumberOfScaleFactorBands(
384 &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo)) {
385 return AAC_DEC_PARSE_ERROR;
386 }
387 pNumLinesInSec[numLinesInSecIdx] = BandOffsets[top] - BandOffsets[band];
388 numLinesInSecIdx++;
389 if (sect_cb == BOOKSCL) {
390 return AAC_DEC_INVALID_CODE_BOOK;
391 } else {
392 *pHcrCodeBook++ = sect_cb;
393 }
394 pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection++;
395 }
396
397 /* Check spectral line limits */
398 if (IsLongBlock(&(pAacDecoderChannelInfo->icsInfo))) {
399 if (top > 64) {
400 return AAC_DEC_DECODE_FRAME_ERROR;
401 }
402 } else { /* short block */
403 if (top + group * 16 > (8 * 16)) {
404 return AAC_DEC_DECODE_FRAME_ERROR;
405 }
406 }
407
408 /* Check if decoded codebook index is feasible */
409 if ((sect_cb == BOOKSCL) ||
410 ((sect_cb == INTENSITY_HCB || sect_cb == INTENSITY_HCB2) &&
411 pAacDecoderChannelInfo->pDynData->RawDataInfo.CommonWindow == 0)) {
412 return AAC_DEC_INVALID_CODE_BOOK;
413 }
414
415 /* Store codebook index */
416 for (; band < top; band++) {
417 pCodeBook[group * 16 + band] = sect_cb;
418 }
419 }
420 }
421
422 return ErrorStatus;
423 }
424
425 /* mso: provides a faster way to i-quantize a whole band in one go */
426
427 /**
428 * \brief inverse quantize one sfb. Each value of the sfb is processed according
429 * to the formula: spectrum[i] = Sign(spectrum[i]) * Matissa(spectrum[i])^(4/3)
430 * * 2^(lsb/4).
431 * \param spectrum pointer to first line of the sfb to be inverse quantized.
432 * \param noLines number of lines belonging to the sfb.
433 * \param lsb last 2 bits of the scale factor of the sfb.
434 * \param scale max allowed shift scale for the sfb.
435 */
InverseQuantizeBand(FIXP_DBL * RESTRICT spectrum,const FIXP_DBL * RESTRICT InverseQuantTabler,const FIXP_DBL * RESTRICT MantissaTabler,const SCHAR * RESTRICT ExponentTabler,INT noLines,INT scale)436 static inline void InverseQuantizeBand(
437 FIXP_DBL *RESTRICT spectrum, const FIXP_DBL *RESTRICT InverseQuantTabler,
438 const FIXP_DBL *RESTRICT MantissaTabler,
439 const SCHAR *RESTRICT ExponentTabler, INT noLines, INT scale) {
440 scale = scale + 1; /* +1 to compensate fMultDiv2 shift-right in loop */
441
442 FIXP_DBL *RESTRICT ptr = spectrum;
443 FIXP_DBL signedValue;
444
445 for (INT i = noLines; i--;) {
446 if ((signedValue = *ptr++) != FL2FXCONST_DBL(0)) {
447 FIXP_DBL value = fAbs(signedValue);
448 UINT freeBits = CntLeadingZeros(value);
449 UINT exponent = 32 - freeBits;
450
451 UINT x = (UINT)(LONG)value << (INT)freeBits;
452 x <<= 1; /* shift out sign bit to avoid masking later on */
453 UINT tableIndex = x >> 24;
454 x = (x >> 20) & 0x0F;
455
456 UINT r0 = (UINT)(LONG)InverseQuantTabler[tableIndex + 0];
457 UINT r1 = (UINT)(LONG)InverseQuantTabler[tableIndex + 1];
458 UINT temp = (r1 - r0) * x + (r0 << 4);
459
460 value = fMultDiv2((FIXP_DBL)temp, MantissaTabler[exponent]);
461
462 /* + 1 compensates fMultDiv2() */
463 scaleValueInPlace(&value, scale + ExponentTabler[exponent]);
464
465 signedValue = (signedValue < (FIXP_DBL)0) ? -value : value;
466 ptr[-1] = signedValue;
467 }
468 }
469 }
470
maxabs_D(const FIXP_DBL * pSpectralCoefficient,const int noLines)471 static inline FIXP_DBL maxabs_D(const FIXP_DBL *pSpectralCoefficient,
472 const int noLines) {
473 /* Find max spectral line value of the current sfb */
474 FIXP_DBL locMax = (FIXP_DBL)0;
475 int i;
476
477 DWORD_ALIGNED(pSpectralCoefficient);
478
479 for (i = noLines; i-- > 0;) {
480 /* Expensive memory access */
481 locMax = fMax(fixp_abs(pSpectralCoefficient[i]), locMax);
482 }
483
484 return locMax;
485 }
486
CBlock_InverseQuantizeSpectralData(CAacDecoderChannelInfo * pAacDecoderChannelInfo,SamplingRateInfo * pSamplingRateInfo,UCHAR * band_is_noise,UCHAR active_band_search)487 AAC_DECODER_ERROR CBlock_InverseQuantizeSpectralData(
488 CAacDecoderChannelInfo *pAacDecoderChannelInfo,
489 SamplingRateInfo *pSamplingRateInfo, UCHAR *band_is_noise,
490 UCHAR active_band_search) {
491 int window, group, groupwin, band;
492 int ScaleFactorBandsTransmitted =
493 GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
494 UCHAR *RESTRICT pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
495 SHORT *RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale;
496 SHORT *RESTRICT pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor;
497 const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(
498 &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
499 const SHORT total_bands =
500 GetScaleFactorBandsTotal(&pAacDecoderChannelInfo->icsInfo);
501
502 FDKmemclear(pAacDecoderChannelInfo->pDynData->aSfbScale,
503 (8 * 16) * sizeof(SHORT));
504
505 for (window = 0, group = 0;
506 group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) {
507 for (groupwin = 0; groupwin < GetWindowGroupLength(
508 &pAacDecoderChannelInfo->icsInfo, group);
509 groupwin++, window++) {
510 /* inverse quantization */
511 for (band = 0; band < ScaleFactorBandsTransmitted; band++) {
512 FIXP_DBL *pSpectralCoefficient =
513 SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, window,
514 pAacDecoderChannelInfo->granuleLength) +
515 BandOffsets[band];
516 FIXP_DBL locMax;
517
518 const int noLines = BandOffsets[band + 1] - BandOffsets[band];
519 const int bnds = group * 16 + band;
520
521 if ((pCodeBook[bnds] == ZERO_HCB) ||
522 (pCodeBook[bnds] == INTENSITY_HCB) ||
523 (pCodeBook[bnds] == INTENSITY_HCB2))
524 continue;
525
526 if (pCodeBook[bnds] == NOISE_HCB) {
527 /* Leave headroom for PNS values. + 1 because ceil(log2(2^(0.25*3))) =
528 1, worst case of additional headroom required because of the
529 scalefactor. */
530 pSfbScale[window * 16 + band] = (pScaleFactor[bnds] >> 2) + 1;
531 continue;
532 }
533
534 locMax = maxabs_D(pSpectralCoefficient, noLines);
535
536 if (active_band_search) {
537 if (locMax != FIXP_DBL(0)) {
538 band_is_noise[group * 16 + band] = 0;
539 }
540 }
541
542 /* Cheap robustness improvement - Do not remove!!! */
543 if (fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE) {
544 return AAC_DEC_PARSE_ERROR;
545 }
546
547 /* Added by Youliy Ninov:
548 The inverse quantization operation is given by (ISO/IEC 14496-3:2009(E))
549 by:
550
551 x_invquant=Sign(x_quant). abs(x_quant)^(4/3)
552
553 We apply a gain, derived from the scale factor for the particular sfb,
554 according to the following function:
555
556 gain=2^(0.25*ScaleFactor)
557
558 So, after scaling we have:
559
560 x_rescale=gain*x_invquant=Sign(x_quant)*2^(0.25*ScaleFactor)*abs(s_quant)^(4/3)
561
562 We could represent the ScaleFactor as:
563
564 ScaleFactor= (ScaleFactor >> 2)*4 + ScaleFactor %4
565
566 When we substitute it we get:
567
568 x_rescale=Sign(x_quant)*2^(ScaleFactor>>2)* (
569 2^(0.25*(ScaleFactor%4))*abs(s_quant)^(4/3))
570
571 When we set: msb=(ScaleFactor>>2) and lsb=(ScaleFactor%4), we obtain:
572
573 x_rescale=Sign(x_quant)*(2^msb)* ( 2^(lsb/4)*abs(s_quant)^(4/3))
574
575 The rescaled output can be represented by:
576 mantissa : Sign(x_quant)*( 2^(lsb/4)*abs(s_quant)^(4/3))
577 exponent :(2^msb)
578
579 */
580
581 int msb = pScaleFactor[bnds] >> 2;
582
583 /* Inverse quantize band only if it is not empty */
584 if (locMax != FIXP_DBL(0)) {
585 int lsb = pScaleFactor[bnds] & 0x03;
586
587 int scale = EvaluatePower43(&locMax, lsb);
588
589 scale = CntLeadingZeros(locMax) - scale - 2;
590
591 pSfbScale[window * 16 + band] = msb - scale;
592 InverseQuantizeBand(pSpectralCoefficient, InverseQuantTable,
593 MantissaTable[lsb], ExponentTable[lsb], noLines,
594 scale);
595 } else {
596 pSfbScale[window * 16 + band] = msb;
597 }
598
599 } /* for (band=0; band < ScaleFactorBandsTransmitted; band++) */
600
601 /* Make sure the array is cleared to the end */
602 SHORT start_clear = BandOffsets[ScaleFactorBandsTransmitted];
603 SHORT end_clear = BandOffsets[total_bands];
604 int diff_clear = (int)(end_clear - start_clear);
605 FIXP_DBL *pSpectralCoefficient =
606 SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, window,
607 pAacDecoderChannelInfo->granuleLength) +
608 start_clear;
609 FDKmemclear(pSpectralCoefficient, diff_clear * sizeof(FIXP_DBL));
610
611 } /* for (groupwin=0; groupwin <
612 GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
613 groupwin++, window++) */
614 } /* for (window=0, group=0; group <
615 GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++)*/
616
617 return AAC_DEC_OK;
618 }
619
CBlock_ReadSpectralData(HANDLE_FDK_BITSTREAM bs,CAacDecoderChannelInfo * pAacDecoderChannelInfo,const SamplingRateInfo * pSamplingRateInfo,const UINT flags)620 AAC_DECODER_ERROR CBlock_ReadSpectralData(
621 HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
622 const SamplingRateInfo *pSamplingRateInfo, const UINT flags) {
623 int index, i;
624 const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(
625 &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
626
627 SPECTRAL_PTR pSpectralCoefficient =
628 pAacDecoderChannelInfo->pSpectralCoefficient;
629
630 FDK_ASSERT(BandOffsets != NULL);
631
632 FDKmemclear(pSpectralCoefficient, sizeof(SPECTRUM));
633
634 if ((flags & AC_ER_HCR) == 0) {
635 int group;
636 int groupoffset;
637 UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
638 int ScaleFactorBandsTransmitted =
639 GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
640 int granuleLength = pAacDecoderChannelInfo->granuleLength;
641
642 groupoffset = 0;
643
644 /* plain huffman decoder short */
645 int max_group = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
646
647 for (group = 0; group < max_group; group++) {
648 int max_groupwin =
649 GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group);
650 int band;
651
652 int bnds = group * 16;
653
654 int bandOffset1 = BandOffsets[0];
655 for (band = 0; band < ScaleFactorBandsTransmitted; band++, bnds++) {
656 UCHAR currentCB = pCodeBook[bnds];
657 int bandOffset0 = bandOffset1;
658 bandOffset1 = BandOffsets[band + 1];
659
660 /* patch to run plain-huffman-decoder with vcb11 input codebooks
661 * (LAV-checking might be possible below using the virtual cb and a
662 * LAV-table) */
663 if ((currentCB >= 16) && (currentCB <= 31)) {
664 pCodeBook[bnds] = currentCB = 11;
665 }
666 if (((currentCB != ZERO_HCB) && (currentCB != NOISE_HCB) &&
667 (currentCB != INTENSITY_HCB) && (currentCB != INTENSITY_HCB2))) {
668 const CodeBookDescription *hcb =
669 &AACcodeBookDescriptionTable[currentCB];
670 int step = hcb->Dimension;
671 int offset = hcb->Offset;
672 int bits = hcb->numBits;
673 int mask = (1 << bits) - 1;
674 const USHORT(*CodeBook)[HuffmanEntries] = hcb->CodeBook;
675 int groupwin;
676
677 FIXP_DBL *mdctSpectrum =
678 &pSpectralCoefficient[groupoffset * granuleLength];
679
680 if (offset == 0) {
681 for (groupwin = 0; groupwin < max_groupwin; groupwin++) {
682 for (index = bandOffset0; index < bandOffset1; index += step) {
683 int idx = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
684 for (i = 0; i < step; i++, idx >>= bits) {
685 FIXP_DBL tmp = (FIXP_DBL)((idx & mask) - offset);
686 if (tmp != FIXP_DBL(0)) tmp = (FDKreadBit(bs)) ? -tmp : tmp;
687 mdctSpectrum[index + i] = tmp;
688 }
689
690 if (currentCB == ESCBOOK) {
691 for (int j = 0; j < 2; j++)
692 mdctSpectrum[index + j] = (FIXP_DBL)CBlock_GetEscape(
693 bs, (LONG)mdctSpectrum[index + j]);
694 }
695 }
696 mdctSpectrum += granuleLength;
697 }
698 } else {
699 for (groupwin = 0; groupwin < max_groupwin; groupwin++) {
700 for (index = bandOffset0; index < bandOffset1; index += step) {
701 int idx = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
702 for (i = 0; i < step; i++, idx >>= bits) {
703 mdctSpectrum[index + i] = (FIXP_DBL)((idx & mask) - offset);
704 }
705 if (currentCB == ESCBOOK) {
706 for (int j = 0; j < 2; j++)
707 mdctSpectrum[index + j] = (FIXP_DBL)CBlock_GetEscape(
708 bs, (LONG)mdctSpectrum[index + j]);
709 }
710 }
711 mdctSpectrum += granuleLength;
712 }
713 }
714 }
715 }
716 groupoffset += max_groupwin;
717 }
718 /* plain huffman decoding (short) finished */
719 }
720
721 /* HCR - Huffman Codeword Reordering short */
722 else /* if ( flags & AC_ER_HCR ) */
723
724 {
725 H_HCR_INFO hHcr = &pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo;
726
727 int hcrStatus = 0;
728
729 /* advanced Huffman decoding starts here (HCR decoding :) */
730 if (pAacDecoderChannelInfo->pDynData->specificTo.aac
731 .lenOfReorderedSpectralData != 0) {
732 /* HCR initialization short */
733 hcrStatus = HcrInit(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs);
734
735 if (hcrStatus != 0) {
736 return AAC_DEC_DECODE_FRAME_ERROR;
737 }
738
739 /* HCR decoding short */
740 hcrStatus =
741 HcrDecoder(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs);
742
743 if (hcrStatus != 0) {
744 #if HCR_ERROR_CONCEALMENT
745 HcrMuteErroneousLines(hHcr);
746 #else
747 return AAC_DEC_DECODE_FRAME_ERROR;
748 #endif /* HCR_ERROR_CONCEALMENT */
749 }
750
751 FDKpushFor(bs, pAacDecoderChannelInfo->pDynData->specificTo.aac
752 .lenOfReorderedSpectralData);
753 }
754 }
755 /* HCR - Huffman Codeword Reordering short finished */
756
757 if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) &&
758 !(flags & (AC_ELD | AC_SCALABLE))) {
759 /* apply pulse data */
760 CPulseData_Apply(
761 &pAacDecoderChannelInfo->pDynData->specificTo.aac.PulseData,
762 GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo,
763 pSamplingRateInfo),
764 SPEC_LONG(pSpectralCoefficient));
765 }
766
767 return AAC_DEC_OK;
768 }
769
770 static const FIXP_SGL noise_level_tab[8] = {
771 /* FDKpow(2, (float)(noise_level-14)/3.0f) * 2; (*2 to compensate for
772 fMultDiv2) noise_level_tab(noise_level==0) == 0 by definition
773 */
774 FX_DBL2FXCONST_SGL(0x00000000 /*0x0a145173*/),
775 FX_DBL2FXCONST_SGL(0x0cb2ff5e),
776 FX_DBL2FXCONST_SGL(0x10000000),
777 FX_DBL2FXCONST_SGL(0x1428a2e7),
778 FX_DBL2FXCONST_SGL(0x1965febd),
779 FX_DBL2FXCONST_SGL(0x20000000),
780 FX_DBL2FXCONST_SGL(0x28514606),
781 FX_DBL2FXCONST_SGL(0x32cbfd33)};
782
CBlock_ApplyNoise(CAacDecoderChannelInfo * pAacDecoderChannelInfo,SamplingRateInfo * pSamplingRateInfo,ULONG * nfRandomSeed,UCHAR * band_is_noise)783 void CBlock_ApplyNoise(CAacDecoderChannelInfo *pAacDecoderChannelInfo,
784 SamplingRateInfo *pSamplingRateInfo, ULONG *nfRandomSeed,
785 UCHAR *band_is_noise) {
786 const SHORT *swb_offset = GetScaleFactorBandOffsets(
787 &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
788 int g, win, gwin, sfb, noiseFillingStartOffset, nfStartOffset_sfb;
789
790 /* Obtain noise level and scale factor offset. */
791 int noise_level = pAacDecoderChannelInfo->pDynData->specificTo.usac
792 .fd_noise_level_and_offset >>
793 5;
794 const FIXP_SGL noiseVal_pos = noise_level_tab[noise_level];
795
796 /* noise_offset can change even when noise_level=0. Neccesary for IGF stereo
797 * filling */
798 const int noise_offset = (pAacDecoderChannelInfo->pDynData->specificTo.usac
799 .fd_noise_level_and_offset &
800 0x1f) -
801 16;
802
803 int max_sfb =
804 GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
805
806 noiseFillingStartOffset =
807 (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT)
808 ? 20
809 : 160;
810 if (pAacDecoderChannelInfo->granuleLength == 96) {
811 noiseFillingStartOffset =
812 (3 * noiseFillingStartOffset) /
813 4; /* scale offset with 3/4 for coreCoderFrameLength == 768 */
814 }
815
816 /* determine sfb from where on noise filling is applied */
817 for (sfb = 0; swb_offset[sfb] < noiseFillingStartOffset; sfb++)
818 ;
819 nfStartOffset_sfb = sfb;
820
821 /* if (noise_level!=0) */
822 {
823 for (g = 0, win = 0; g < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
824 g++) {
825 int windowGroupLength =
826 GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, g);
827 for (sfb = nfStartOffset_sfb; sfb < max_sfb; sfb++) {
828 int bin_start = swb_offset[sfb];
829 int bin_stop = swb_offset[sfb + 1];
830
831 int flagN = band_is_noise[g * 16 + sfb];
832
833 /* if all bins of one sfb in one window group are zero modify the scale
834 * factor by noise_offset */
835 if (flagN) {
836 /* Change scaling factors for empty signal bands */
837 pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] +=
838 noise_offset;
839 /* scale factor "sf" implied gain "g" is g = 2^(sf/4) */
840 for (gwin = 0; gwin < windowGroupLength; gwin++) {
841 pAacDecoderChannelInfo->pDynData
842 ->aSfbScale[(win + gwin) * 16 + sfb] += (noise_offset >> 2);
843 }
844 }
845
846 ULONG seed = *nfRandomSeed;
847 /* + 1 because exponent of MantissaTable[lsb][0] is always 1. */
848 int scale =
849 (pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] >>
850 2) +
851 1;
852 int lsb =
853 pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] & 3;
854 FIXP_DBL mantissa = MantissaTable[lsb][0];
855
856 for (gwin = 0; gwin < windowGroupLength; gwin++) {
857 FIXP_DBL *pSpec =
858 SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, win + gwin,
859 pAacDecoderChannelInfo->granuleLength);
860
861 int scale1 = scale - pAacDecoderChannelInfo->pDynData
862 ->aSfbScale[(win + gwin) * 16 + sfb];
863 FIXP_DBL scaled_noiseVal_pos =
864 scaleValue(fMultDiv2(noiseVal_pos, mantissa), scale1);
865 FIXP_DBL scaled_noiseVal_neg = -scaled_noiseVal_pos;
866
867 /* If the whole band is zero, just fill without checking */
868 if (flagN) {
869 for (int bin = bin_start; bin < bin_stop; bin++) {
870 seed = (ULONG)(
871 (UINT64)seed * 69069 +
872 5); /* Inlined: UsacRandomSign - origin in usacdec_lpd.h */
873 pSpec[bin] =
874 (seed & 0x10000) ? scaled_noiseVal_neg : scaled_noiseVal_pos;
875 } /* for (bin...) */
876 }
877 /*If band is sparsely filled, check for 0 and fill */
878 else {
879 for (int bin = bin_start; bin < bin_stop; bin++) {
880 if (pSpec[bin] == (FIXP_DBL)0) {
881 seed = (ULONG)(
882 (UINT64)seed * 69069 +
883 5); /* Inlined: UsacRandomSign - origin in usacdec_lpd.h */
884 pSpec[bin] = (seed & 0x10000) ? scaled_noiseVal_neg
885 : scaled_noiseVal_pos;
886 }
887 } /* for (bin...) */
888 }
889
890 } /* for (gwin...) */
891 *nfRandomSeed = seed;
892 } /* for (sfb...) */
893 win += windowGroupLength;
894 } /* for (g...) */
895
896 } /* ... */
897 }
898
CBlock_ReadAcSpectralData(HANDLE_FDK_BITSTREAM hBs,CAacDecoderChannelInfo * pAacDecoderChannelInfo,CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo,const SamplingRateInfo * pSamplingRateInfo,const UINT frame_length,const UINT flags)899 AAC_DECODER_ERROR CBlock_ReadAcSpectralData(
900 HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
901 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
902 const SamplingRateInfo *pSamplingRateInfo, const UINT frame_length,
903 const UINT flags) {
904 AAC_DECODER_ERROR errorAAC = AAC_DEC_OK;
905 ARITH_CODING_ERROR error = ARITH_CODER_OK;
906 int arith_reset_flag, lg, numWin, win, winLen;
907 const SHORT *RESTRICT BandOffsets;
908
909 /* number of transmitted spectral coefficients */
910 BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo,
911 pSamplingRateInfo);
912 lg = BandOffsets[GetScaleFactorBandsTransmitted(
913 &pAacDecoderChannelInfo->icsInfo)];
914
915 numWin = GetWindowsPerFrame(&pAacDecoderChannelInfo->icsInfo);
916 winLen = (IsLongBlock(&pAacDecoderChannelInfo->icsInfo))
917 ? (int)frame_length
918 : (int)frame_length / numWin;
919
920 if (flags & AC_INDEP) {
921 arith_reset_flag = 1;
922 } else {
923 arith_reset_flag = (USHORT)FDKreadBits(hBs, 1);
924 }
925
926 for (win = 0; win < numWin; win++) {
927 error =
928 CArco_DecodeArithData(pAacDecoderStaticChannelInfo->hArCo, hBs,
929 SPEC(pAacDecoderChannelInfo->pSpectralCoefficient,
930 win, pAacDecoderChannelInfo->granuleLength),
931 lg, winLen, arith_reset_flag && (win == 0));
932 if (error != ARITH_CODER_OK) {
933 goto bail;
934 }
935 }
936
937 bail:
938 if (error == ARITH_CODER_ERROR) {
939 errorAAC = AAC_DEC_PARSE_ERROR;
940 }
941
942 return errorAAC;
943 }
944
ApplyTools(CAacDecoderChannelInfo * pAacDecoderChannelInfo[],const SamplingRateInfo * pSamplingRateInfo,const UINT flags,const UINT elFlags,const int channel,const int common_window)945 void ApplyTools(CAacDecoderChannelInfo *pAacDecoderChannelInfo[],
946 const SamplingRateInfo *pSamplingRateInfo, const UINT flags,
947 const UINT elFlags, const int channel,
948 const int common_window) {
949 if (!(flags & (AC_USAC | AC_RSVD50 | AC_MPEGD_RES | AC_RSV603DA))) {
950 CPns_Apply(&pAacDecoderChannelInfo[channel]->data.aac.PnsData,
951 &pAacDecoderChannelInfo[channel]->icsInfo,
952 pAacDecoderChannelInfo[channel]->pSpectralCoefficient,
953 pAacDecoderChannelInfo[channel]->specScale,
954 pAacDecoderChannelInfo[channel]->pDynData->aScaleFactor,
955 pSamplingRateInfo,
956 pAacDecoderChannelInfo[channel]->granuleLength, channel);
957 }
958
959 UCHAR nbands =
960 GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[channel]->icsInfo);
961
962 CTns_Apply(&pAacDecoderChannelInfo[channel]->pDynData->TnsData,
963 &pAacDecoderChannelInfo[channel]->icsInfo,
964 pAacDecoderChannelInfo[channel]->pSpectralCoefficient,
965 pSamplingRateInfo, pAacDecoderChannelInfo[channel]->granuleLength,
966 nbands, (elFlags & AC_EL_ENHANCED_NOISE) ? 1 : 0, flags);
967 }
968
getWindow2Nr(int length,int shape)969 static int getWindow2Nr(int length, int shape) {
970 int nr = 0;
971
972 if (shape == 2) {
973 /* Low Overlap, 3/4 zeroed */
974 nr = (length * 3) >> 2;
975 }
976
977 return nr;
978 }
979
get_gain(const FIXP_DBL * x,const FIXP_DBL * y,int n)980 FIXP_DBL get_gain(const FIXP_DBL *x, const FIXP_DBL *y, int n) {
981 FIXP_DBL corr = (FIXP_DBL)0;
982 FIXP_DBL ener = (FIXP_DBL)1;
983
984 int headroom_x = getScalefactor(x, n);
985 int headroom_y = getScalefactor(y, n);
986
987 /*Calculate the normalization necessary due to addition*/
988 /* Check for power of two /special case */
989 INT width_shift = (INT)(fNormz((FIXP_DBL)n));
990 /* Get the number of bits necessary minus one, because we need one sign bit
991 * only */
992 width_shift = 31 - width_shift;
993
994 for (int i = 0; i < n; i++) {
995 corr +=
996 fMultDiv2((x[i] << headroom_x), (y[i] << headroom_y)) >> width_shift;
997 ener += fPow2Div2((y[i] << headroom_y)) >> width_shift;
998 }
999
1000 int exp_corr = (17 - headroom_x) + (17 - headroom_y) + width_shift + 1;
1001 int exp_ener = ((17 - headroom_y) << 1) + width_shift + 1;
1002
1003 int temp_exp = 0;
1004 FIXP_DBL output = fDivNormSigned(corr, ener, &temp_exp);
1005
1006 int output_exp = (exp_corr - exp_ener) + temp_exp;
1007
1008 INT output_shift = 17 - output_exp;
1009 output_shift = fMin(output_shift, 31);
1010
1011 output = scaleValue(output, -output_shift);
1012
1013 return output;
1014 }
1015
CBlock_FrequencyToTime(CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo,CAacDecoderChannelInfo * pAacDecoderChannelInfo,PCM_DEC outSamples[],const SHORT frameLen,const int frameOk,FIXP_DBL * pWorkBuffer1,const INT aacOutDataHeadroom,UINT elFlags,INT elCh)1016 void CBlock_FrequencyToTime(
1017 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1018 CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[],
1019 const SHORT frameLen, const int frameOk, FIXP_DBL *pWorkBuffer1,
1020 const INT aacOutDataHeadroom, UINT elFlags, INT elCh) {
1021 int fr, fl, tl, nSpec;
1022
1023 #if defined(FDK_ASSERT_ENABLE)
1024 LONG nSamples;
1025 #endif
1026
1027 /* Determine left slope length (fl), right slope length (fr) and transform
1028 length (tl). USAC: The slope length may mismatch with the previous frame in
1029 case of LPD / FD transitions. The adjustment is handled by the imdct
1030 implementation.
1031 */
1032 tl = frameLen;
1033 nSpec = 1;
1034
1035 switch (pAacDecoderChannelInfo->icsInfo.WindowSequence) {
1036 default:
1037 case BLOCK_LONG:
1038 fl = frameLen;
1039 fr = frameLen -
1040 getWindow2Nr(frameLen,
1041 GetWindowShape(&pAacDecoderChannelInfo->icsInfo));
1042 /* New startup needs differentiation between sine shape and low overlap
1043 shape. This is a special case for the LD-AAC transformation windows,
1044 because the slope length can be different while using the same window
1045 sequence. */
1046 if (pAacDecoderStaticChannelInfo->IMdct.prev_tl == 0) {
1047 fl = fr;
1048 }
1049 break;
1050 case BLOCK_STOP:
1051 fl = frameLen >> 3;
1052 fr = frameLen;
1053 break;
1054 case BLOCK_START: /* or StopStartSequence */
1055 fl = frameLen;
1056 fr = frameLen >> 3;
1057 break;
1058 case BLOCK_SHORT:
1059 fl = fr = frameLen >> 3;
1060 tl >>= 3;
1061 nSpec = 8;
1062 break;
1063 }
1064
1065 {
1066 int last_frame_lost = pAacDecoderStaticChannelInfo->last_lpc_lost;
1067
1068 if (pAacDecoderStaticChannelInfo->last_core_mode == LPD) {
1069 INT fac_FB = 1;
1070 if (elFlags & AC_EL_FULLBANDLPD) {
1071 fac_FB = 2;
1072 }
1073
1074 FIXP_DBL *synth;
1075
1076 /* Keep some free space at the beginning of the buffer. To be used for
1077 * past data */
1078 if (!(elFlags & AC_EL_LPDSTEREOIDX)) {
1079 synth = pWorkBuffer1 + ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB);
1080 } else {
1081 synth = pWorkBuffer1 + PIT_MAX_MAX * fac_FB;
1082 }
1083
1084 int fac_length =
1085 (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT)
1086 ? (frameLen >> 4)
1087 : (frameLen >> 3);
1088
1089 INT pitch[NB_SUBFR_SUPERFR + SYN_SFD];
1090 FIXP_DBL pit_gain[NB_SUBFR_SUPERFR + SYN_SFD];
1091
1092 int nbDiv = (elFlags & AC_EL_FULLBANDLPD) ? 2 : 4;
1093 int lFrame = (elFlags & AC_EL_FULLBANDLPD) ? frameLen / 2 : frameLen;
1094 int nbSubfr =
1095 lFrame / (nbDiv * L_SUBFR); /* number of subframes per division */
1096 int LpdSfd = (nbDiv * nbSubfr) >> 1;
1097 int SynSfd = LpdSfd - BPF_SFD;
1098
1099 FDKmemclear(
1100 pitch,
1101 sizeof(
1102 pitch)); // added to prevent ferret errors in bass_pf_1sf_delay
1103 FDKmemclear(pit_gain, sizeof(pit_gain));
1104
1105 /* FAC case */
1106 if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0 ||
1107 pAacDecoderStaticChannelInfo->last_lpd_mode == 4) {
1108 FIXP_DBL fac_buf[LFAC];
1109 FIXP_LPC *A = pAacDecoderChannelInfo->data.usac.lp_coeff[0];
1110
1111 if (!frameOk || last_frame_lost ||
1112 (pAacDecoderChannelInfo->data.usac.fac_data[0] == NULL)) {
1113 FDKmemclear(fac_buf,
1114 pAacDecoderChannelInfo->granuleLength * sizeof(FIXP_DBL));
1115 pAacDecoderChannelInfo->data.usac.fac_data[0] = fac_buf;
1116 pAacDecoderChannelInfo->data.usac.fac_data_e[0] = 0;
1117 }
1118
1119 INT A_exp; /* linear prediction coefficients exponent */
1120 {
1121 for (int i = 0; i < M_LP_FILTER_ORDER; i++) {
1122 A[i] = FX_DBL2FX_LPC(fixp_cos(
1123 fMult(pAacDecoderStaticChannelInfo->lpc4_lsf[i],
1124 FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)),
1125 LSF_SCALE - LSPARG_SCALE));
1126 }
1127
1128 E_LPC_f_lsp_a_conversion(A, A, &A_exp);
1129 }
1130
1131 #if defined(FDK_ASSERT_ENABLE)
1132 nSamples =
1133 #endif
1134 CLpd_FAC_Acelp2Mdct(
1135 &pAacDecoderStaticChannelInfo->IMdct, synth,
1136 SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
1137 pAacDecoderChannelInfo->specScale, nSpec,
1138 pAacDecoderChannelInfo->data.usac.fac_data[0],
1139 pAacDecoderChannelInfo->data.usac.fac_data_e[0], fac_length,
1140 frameLen, tl,
1141 FDKgetWindowSlope(
1142 fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1143 fr, A, A_exp, &pAacDecoderStaticChannelInfo->acelp,
1144 (FIXP_DBL)0, /* FAC gain has already been applied. */
1145 (last_frame_lost || !frameOk), 1,
1146 pAacDecoderStaticChannelInfo->last_lpd_mode, 0,
1147 pAacDecoderChannelInfo->currAliasingSymmetry);
1148
1149 } else {
1150 #if defined(FDK_ASSERT_ENABLE)
1151 nSamples =
1152 #endif
1153 imlt_block(
1154 &pAacDecoderStaticChannelInfo->IMdct, synth,
1155 SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
1156 pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl,
1157 FDKgetWindowSlope(
1158 fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1159 fl,
1160 FDKgetWindowSlope(
1161 fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1162 fr, (FIXP_DBL)0,
1163 pAacDecoderChannelInfo->currAliasingSymmetry
1164 ? MLT_FLAG_CURR_ALIAS_SYMMETRY
1165 : 0);
1166 }
1167 FDK_ASSERT(nSamples == frameLen);
1168
1169 /* The "if" clause is entered both for fullbandLpd mono and
1170 * non-fullbandLpd*. The "else"-> just for fullbandLpd stereo*/
1171 if (!(elFlags & AC_EL_LPDSTEREOIDX)) {
1172 FDKmemcpy(pitch, pAacDecoderStaticChannelInfo->old_T_pf,
1173 SynSfd * sizeof(INT));
1174 FDKmemcpy(pit_gain, pAacDecoderStaticChannelInfo->old_gain_pf,
1175 SynSfd * sizeof(FIXP_DBL));
1176
1177 for (int i = SynSfd; i < LpdSfd + 3; i++) {
1178 pitch[i] = L_SUBFR;
1179 pit_gain[i] = (FIXP_DBL)0;
1180 }
1181
1182 if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0) {
1183 pitch[SynSfd] = pitch[SynSfd - 1];
1184 pit_gain[SynSfd] = pit_gain[SynSfd - 1];
1185 if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) {
1186 pitch[SynSfd + 1] = pitch[SynSfd];
1187 pit_gain[SynSfd + 1] = pit_gain[SynSfd];
1188 }
1189 }
1190
1191 /* Copy old data to the beginning of the buffer */
1192 {
1193 FDKmemcpy(
1194 pWorkBuffer1, pAacDecoderStaticChannelInfo->old_synth,
1195 ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB) * sizeof(FIXP_DBL));
1196 }
1197
1198 FIXP_DBL *p2_synth = pWorkBuffer1 + (PIT_MAX_MAX * fac_FB);
1199
1200 /* recalculate pitch gain to allow postfilering on FAC area */
1201 for (int i = 0; i < SynSfd + 2; i++) {
1202 int T = pitch[i];
1203 FIXP_DBL gain = pit_gain[i];
1204
1205 if (gain > (FIXP_DBL)0) {
1206 gain = get_gain(&p2_synth[i * L_SUBFR * fac_FB],
1207 &p2_synth[(i * L_SUBFR * fac_FB) - fac_FB * T],
1208 L_SUBFR * fac_FB);
1209 pit_gain[i] = gain;
1210 }
1211 }
1212
1213 bass_pf_1sf_delay(p2_synth, pitch, pit_gain, frameLen,
1214 (LpdSfd + 2) * L_SUBFR + BPF_SFD * L_SUBFR,
1215 frameLen - (LpdSfd + 4) * L_SUBFR, outSamples,
1216 aacOutDataHeadroom,
1217 pAacDecoderStaticChannelInfo->mem_bpf);
1218 }
1219
1220 } else /* last_core_mode was not LPD */
1221 {
1222 FIXP_DBL *tmp =
1223 pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1->mdctOutTemp;
1224 #if defined(FDK_ASSERT_ENABLE)
1225 nSamples =
1226 #endif
1227 imlt_block(&pAacDecoderStaticChannelInfo->IMdct, tmp,
1228 SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
1229 pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl,
1230 FDKgetWindowSlope(
1231 fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1232 fl,
1233 FDKgetWindowSlope(
1234 fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1235 fr, (FIXP_DBL)0,
1236 pAacDecoderChannelInfo->currAliasingSymmetry
1237 ? MLT_FLAG_CURR_ALIAS_SYMMETRY
1238 : 0);
1239
1240 scaleValuesSaturate(outSamples, tmp, frameLen,
1241 MDCT_OUT_HEADROOM - aacOutDataHeadroom);
1242 }
1243 }
1244
1245 FDK_ASSERT(nSamples == frameLen);
1246
1247 pAacDecoderStaticChannelInfo->last_core_mode =
1248 (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT) ? FD_SHORT
1249 : FD_LONG;
1250 pAacDecoderStaticChannelInfo->last_lpd_mode = 255;
1251 }
1252
1253 #include "ldfiltbank.h"
CBlock_FrequencyToTimeLowDelay(CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo,CAacDecoderChannelInfo * pAacDecoderChannelInfo,PCM_DEC outSamples[],const short frameLen)1254 void CBlock_FrequencyToTimeLowDelay(
1255 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1256 CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[],
1257 const short frameLen) {
1258 InvMdctTransformLowDelay_fdk(
1259 SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
1260 pAacDecoderChannelInfo->specScale[0], outSamples,
1261 pAacDecoderStaticChannelInfo->pOverlapBuffer, frameLen);
1262 }
1263