/src/aac/libAACdec/src/block.cpp
Line | Count | Source (jump to first uncovered line) |
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 | | */ |
138 | | LONG CBlock_GetEscape(HANDLE_FDK_BITSTREAM bs, /*!< pointer to bitstream */ |
139 | | const LONG q) /*!< quantized coefficient */ |
140 | 597k | { |
141 | 597k | if (fAbs(q) != 16) return (q); |
142 | | |
143 | 31.9k | LONG i, off; |
144 | 41.9k | for (i = 4; i < 13; i++) { |
145 | 41.8k | if (FDKreadBit(bs) == 0) break; |
146 | 41.8k | } |
147 | | |
148 | 31.9k | if (i == 13) return (MAX_QUANTIZED_VALUE + 1); |
149 | | |
150 | 31.8k | off = FDKreadBits(bs, i); |
151 | 31.8k | i = off + (1 << i); |
152 | | |
153 | 31.8k | if (q < 0) i = -i; |
154 | | |
155 | 31.8k | return i; |
156 | 31.9k | } |
157 | | |
158 | | AAC_DECODER_ERROR CBlock_ReadScaleFactorData( |
159 | | CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs, |
160 | 527k | UINT flags) { |
161 | 527k | int temp; |
162 | 527k | int band; |
163 | 527k | int group; |
164 | 527k | int position = 0; /* accu for intensity delta coding */ |
165 | 527k | int factor = pAacDecoderChannelInfo->pDynData->RawDataInfo |
166 | 527k | .GlobalGain; /* accu for scale factor delta coding */ |
167 | 527k | UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; |
168 | 527k | SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor; |
169 | 527k | const CodeBookDescription *hcb = &AACcodeBookDescriptionTable[BOOKSCL]; |
170 | | |
171 | 527k | const USHORT(*CodeBook)[HuffmanEntries] = hcb->CodeBook; |
172 | | |
173 | 527k | int ScaleFactorBandsTransmitted = |
174 | 527k | GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); |
175 | 1.57M | for (group = 0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); |
176 | 1.04M | group++) { |
177 | 3.67M | for (band = 0; band < ScaleFactorBandsTransmitted; band++) { |
178 | 2.63M | switch (pCodeBook[band]) { |
179 | 90.4k | case ZERO_HCB: /* zero book */ |
180 | 90.4k | pScaleFactor[band] = 0; |
181 | 90.4k | break; |
182 | | |
183 | 2.48M | default: /* decode scale factor */ |
184 | 2.48M | if (!((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) && band == 0 && |
185 | 2.48M | group == 0)) { |
186 | 2.31M | temp = CBlock_DecodeHuffmanWordCB(bs, CodeBook); |
187 | 2.31M | factor += temp - 60; /* MIDFAC 1.5 dB */ |
188 | 2.31M | } |
189 | 2.48M | pScaleFactor[band] = factor - 100; |
190 | 2.48M | break; |
191 | | |
192 | 30.7k | case INTENSITY_HCB: /* intensity steering */ |
193 | 40.0k | case INTENSITY_HCB2: |
194 | 40.0k | temp = CBlock_DecodeHuffmanWordCB(bs, CodeBook); |
195 | 40.0k | position += temp - 60; |
196 | 40.0k | pScaleFactor[band] = position - 100; |
197 | 40.0k | break; |
198 | | |
199 | 17.1k | case NOISE_HCB: /* PNS */ |
200 | 17.1k | if (flags & (AC_MPEGD_RES | AC_USAC | AC_RSVD50 | AC_RSV603DA)) { |
201 | 0 | return AAC_DEC_PARSE_ERROR; |
202 | 0 | } |
203 | 17.1k | CPns_Read(&pAacDecoderChannelInfo->data.aac.PnsData, bs, hcb, |
204 | 17.1k | pAacDecoderChannelInfo->pDynData->aScaleFactor, |
205 | 17.1k | pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain, |
206 | 17.1k | band, group); |
207 | 17.1k | break; |
208 | 2.63M | } |
209 | 2.63M | } |
210 | 1.04M | pCodeBook += 16; |
211 | 1.04M | pScaleFactor += 16; |
212 | 1.04M | } |
213 | | |
214 | 527k | return AAC_DEC_OK; |
215 | 527k | } |
216 | | |
217 | | void CBlock_ScaleSpectralData(CAacDecoderChannelInfo *pAacDecoderChannelInfo, |
218 | | UCHAR maxSfbs, |
219 | 667k | SamplingRateInfo *pSamplingRateInfo) { |
220 | 667k | int band; |
221 | 667k | int window; |
222 | 667k | const SHORT *RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale; |
223 | 667k | SHORT *RESTRICT pSpecScale = pAacDecoderChannelInfo->specScale; |
224 | 667k | int groupwin, group; |
225 | 667k | const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets( |
226 | 667k | &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); |
227 | 667k | SPECTRAL_PTR RESTRICT pSpectralCoefficient = |
228 | 667k | pAacDecoderChannelInfo->pSpectralCoefficient; |
229 | | |
230 | 667k | FDKmemclear(pSpecScale, 8 * sizeof(SHORT)); |
231 | | |
232 | 667k | for (window = 0, group = 0; |
233 | 1.89M | group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) { |
234 | 2.73M | for (groupwin = 0; groupwin < GetWindowGroupLength( |
235 | 2.73M | &pAacDecoderChannelInfo->icsInfo, group); |
236 | 1.50M | groupwin++, window++) { |
237 | 1.50M | int SpecScale_window = pSpecScale[window]; |
238 | 1.50M | FIXP_DBL *pSpectrum = SPEC(pSpectralCoefficient, window, |
239 | 1.50M | pAacDecoderChannelInfo->granuleLength); |
240 | | |
241 | | /* find scaling for current window */ |
242 | 5.38M | for (band = 0; band < maxSfbs; band++) { |
243 | 3.88M | SpecScale_window = |
244 | 3.88M | fMax(SpecScale_window, (int)pSfbScale[window * 16 + band]); |
245 | 3.88M | } |
246 | | |
247 | 1.50M | if (pAacDecoderChannelInfo->pDynData->TnsData.Active && |
248 | 1.50M | pAacDecoderChannelInfo->pDynData->TnsData.NumberOfFilters[window] > |
249 | 513k | 0) { |
250 | 217k | int filter_index, SpecScale_window_tns; |
251 | 217k | int tns_start, tns_stop; |
252 | | |
253 | | /* Find max scale of TNS bands */ |
254 | 217k | SpecScale_window_tns = 0; |
255 | 217k | tns_start = GetMaximumTnsBands(&pAacDecoderChannelInfo->icsInfo, |
256 | 217k | pSamplingRateInfo->samplingRateIndex); |
257 | 217k | tns_stop = 0; |
258 | 217k | for (filter_index = 0; |
259 | 456k | filter_index < (int)pAacDecoderChannelInfo->pDynData->TnsData |
260 | 456k | .NumberOfFilters[window]; |
261 | 239k | filter_index++) { |
262 | 239k | for (band = pAacDecoderChannelInfo->pDynData->TnsData |
263 | 239k | .Filter[window][filter_index] |
264 | 239k | .StartBand; |
265 | 2.43M | band < pAacDecoderChannelInfo->pDynData->TnsData |
266 | 2.43M | .Filter[window][filter_index] |
267 | 2.43M | .StopBand; |
268 | 2.19M | band++) { |
269 | 2.19M | SpecScale_window_tns = |
270 | 2.19M | fMax(SpecScale_window_tns, (int)pSfbScale[window * 16 + band]); |
271 | 2.19M | } |
272 | | /* Find TNS line boundaries for all TNS filters */ |
273 | 239k | tns_start = |
274 | 239k | fMin(tns_start, (int)pAacDecoderChannelInfo->pDynData->TnsData |
275 | 239k | .Filter[window][filter_index] |
276 | 239k | .StartBand); |
277 | 239k | tns_stop = |
278 | 239k | fMax(tns_stop, (int)pAacDecoderChannelInfo->pDynData->TnsData |
279 | 239k | .Filter[window][filter_index] |
280 | 239k | .StopBand); |
281 | 239k | } |
282 | 217k | SpecScale_window_tns = SpecScale_window_tns + |
283 | 217k | pAacDecoderChannelInfo->pDynData->TnsData.GainLd; |
284 | 217k | FDK_ASSERT(tns_stop >= tns_start); |
285 | | /* Consider existing headroom of all MDCT lines inside the TNS bands. */ |
286 | 217k | SpecScale_window_tns -= |
287 | 217k | getScalefactor(pSpectrum + BandOffsets[tns_start], |
288 | 217k | BandOffsets[tns_stop] - BandOffsets[tns_start]); |
289 | 217k | if (SpecScale_window <= 17) { |
290 | 205k | SpecScale_window_tns++; |
291 | 205k | } |
292 | | /* Add enough mantissa head room such that the spectrum is still |
293 | | representable after applying TNS. */ |
294 | 217k | SpecScale_window = fMax(SpecScale_window, SpecScale_window_tns); |
295 | 217k | } |
296 | | |
297 | | /* store scaling of current window */ |
298 | 1.50M | 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 | 5.38M | for (band = 0; band < maxSfbs; band++) { |
307 | 3.88M | int scale = fMin(DFRACT_BITS - 1, |
308 | 3.88M | SpecScale_window - pSfbScale[window * 16 + band]); |
309 | 3.88M | if (scale) { |
310 | 2.73M | FDK_ASSERT(scale > 0); |
311 | | |
312 | | /* following relation can be used for optimizations: |
313 | | * (BandOffsets[i]%4) == 0 for all i */ |
314 | 2.73M | int max_index = BandOffsets[band + 1]; |
315 | 2.73M | DWORD_ALIGNED(pSpectrum); |
316 | 25.9M | for (int index = BandOffsets[band]; index < max_index; index++) { |
317 | 23.2M | pSpectrum[index] >>= scale; |
318 | 23.2M | } |
319 | 2.73M | } |
320 | 3.88M | } |
321 | 1.50M | #endif /* FUNCTION_CBlock_ScaleSpectralData_func1 */ |
322 | 1.50M | } |
323 | 1.23M | } |
324 | 667k | } |
325 | | |
326 | | AAC_DECODER_ERROR CBlock_ReadSectionData( |
327 | | HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo, |
328 | 379k | const SamplingRateInfo *pSamplingRateInfo, const UINT flags) { |
329 | 379k | int top, band; |
330 | 379k | int sect_len, sect_len_incr; |
331 | 379k | int group; |
332 | 379k | UCHAR sect_cb; |
333 | 379k | UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; |
334 | | /* HCR input (long) */ |
335 | 379k | SHORT *pNumLinesInSec = |
336 | 379k | pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr; |
337 | 379k | int numLinesInSecIdx = 0; |
338 | 379k | UCHAR *pHcrCodeBook = |
339 | 379k | pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr; |
340 | 379k | const SHORT *BandOffsets = GetScaleFactorBandOffsets( |
341 | 379k | &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); |
342 | 379k | pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection = 0; |
343 | 379k | AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; |
344 | | |
345 | 379k | FDKmemclear(pCodeBook, sizeof(UCHAR) * (8 * 16)); |
346 | | |
347 | 379k | const int nbits = |
348 | 379k | (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) == 1) ? 5 : 3; |
349 | | |
350 | 379k | int sect_esc_val = (1 << nbits) - 1; |
351 | | |
352 | 379k | UCHAR ScaleFactorBandsTransmitted = |
353 | 379k | GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); |
354 | 1.01M | for (group = 0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); |
355 | 637k | group++) { |
356 | 79.3M | for (band = 0; band < ScaleFactorBandsTransmitted;) { |
357 | 78.6M | sect_len = 0; |
358 | 78.6M | if (flags & AC_ER_VCB11) { |
359 | 55.9M | sect_cb = (UCHAR)FDKreadBits(bs, 5); |
360 | 55.9M | } else |
361 | 22.7M | sect_cb = (UCHAR)FDKreadBits(bs, 4); |
362 | | |
363 | 78.6M | if (((flags & AC_ER_VCB11) == 0) || (sect_cb < 11) || |
364 | 78.6M | ((sect_cb > 11) && (sect_cb < 16))) { |
365 | 78.5M | sect_len_incr = FDKreadBits(bs, nbits); |
366 | 78.6M | while (sect_len_incr == sect_esc_val) { |
367 | 61.2k | sect_len += sect_esc_val; |
368 | 61.2k | sect_len_incr = FDKreadBits(bs, nbits); |
369 | 61.2k | } |
370 | 78.5M | } else { |
371 | 100k | sect_len_incr = 1; |
372 | 100k | } |
373 | | |
374 | 78.6M | sect_len += sect_len_incr; |
375 | | |
376 | 78.6M | top = band + sect_len; |
377 | | |
378 | 78.6M | if (flags & AC_ER_HCR) { |
379 | | /* HCR input (long) -- collecting sideinfo (for HCR-_long_ only) */ |
380 | 143k | if (numLinesInSecIdx >= MAX_SFB_HCR) { |
381 | 260 | return AAC_DEC_PARSE_ERROR; |
382 | 260 | } |
383 | 143k | if (top > (int)GetNumberOfScaleFactorBands( |
384 | 143k | &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo)) { |
385 | 22 | return AAC_DEC_PARSE_ERROR; |
386 | 22 | } |
387 | 143k | pNumLinesInSec[numLinesInSecIdx] = BandOffsets[top] - BandOffsets[band]; |
388 | 143k | numLinesInSecIdx++; |
389 | 143k | if (sect_cb == BOOKSCL) { |
390 | 8 | return AAC_DEC_INVALID_CODE_BOOK; |
391 | 143k | } else { |
392 | 143k | *pHcrCodeBook++ = sect_cb; |
393 | 143k | } |
394 | 143k | pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection++; |
395 | 143k | } |
396 | | |
397 | | /* Check spectral line limits */ |
398 | 78.6M | if (IsLongBlock(&(pAacDecoderChannelInfo->icsInfo))) { |
399 | 19.2M | if (top > 64) { |
400 | 24 | return AAC_DEC_DECODE_FRAME_ERROR; |
401 | 24 | } |
402 | 59.4M | } else { /* short block */ |
403 | 59.4M | if (top + group * 16 > (8 * 16)) { |
404 | 9 | return AAC_DEC_DECODE_FRAME_ERROR; |
405 | 9 | } |
406 | 59.4M | } |
407 | | |
408 | | /* Check if decoded codebook index is feasible */ |
409 | 78.6M | if ((sect_cb == BOOKSCL) || |
410 | 78.6M | ((sect_cb == INTENSITY_HCB || sect_cb == INTENSITY_HCB2) && |
411 | 78.6M | pAacDecoderChannelInfo->pDynData->RawDataInfo.CommonWindow == 0)) { |
412 | 198 | return AAC_DEC_INVALID_CODE_BOOK; |
413 | 198 | } |
414 | | |
415 | | /* Store codebook index */ |
416 | 81.6M | for (; band < top; band++) { |
417 | 2.98M | pCodeBook[group * 16 + band] = sect_cb; |
418 | 2.98M | } |
419 | 78.6M | } |
420 | 637k | } |
421 | | |
422 | 378k | return ErrorStatus; |
423 | 379k | } |
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 | | */ |
436 | | static inline void InverseQuantizeBand( |
437 | | FIXP_DBL *RESTRICT spectrum, const FIXP_DBL *RESTRICT InverseQuantTabler, |
438 | | const FIXP_DBL *RESTRICT MantissaTabler, |
439 | 1.72M | const SCHAR *RESTRICT ExponentTabler, INT noLines, INT scale) { |
440 | 1.72M | scale = scale + 1; /* +1 to compensate fMultDiv2 shift-right in loop */ |
441 | | |
442 | 1.72M | FIXP_DBL *RESTRICT ptr = spectrum; |
443 | 1.72M | FIXP_DBL signedValue; |
444 | | |
445 | 12.4M | for (INT i = noLines; i--;) { |
446 | 10.7M | if ((signedValue = *ptr++) != FL2FXCONST_DBL(0)) { |
447 | 5.13M | FIXP_DBL value = fAbs(signedValue); |
448 | 5.13M | UINT freeBits = CntLeadingZeros(value); |
449 | 5.13M | UINT exponent = 32 - freeBits; |
450 | | |
451 | 5.13M | UINT x = (UINT)(LONG)value << (INT)freeBits; |
452 | 5.13M | x <<= 1; /* shift out sign bit to avoid masking later on */ |
453 | 5.13M | UINT tableIndex = x >> 24; |
454 | 5.13M | x = (x >> 20) & 0x0F; |
455 | | |
456 | 5.13M | UINT r0 = (UINT)(LONG)InverseQuantTabler[tableIndex + 0]; |
457 | 5.13M | UINT r1 = (UINT)(LONG)InverseQuantTabler[tableIndex + 1]; |
458 | 5.13M | UINT temp = (r1 - r0) * x + (r0 << 4); |
459 | | |
460 | 5.13M | value = fMultDiv2((FIXP_DBL)temp, MantissaTabler[exponent]); |
461 | | |
462 | | /* + 1 compensates fMultDiv2() */ |
463 | 5.13M | scaleValueInPlace(&value, scale + ExponentTabler[exponent]); |
464 | | |
465 | 5.13M | signedValue = (signedValue < (FIXP_DBL)0) ? -value : value; |
466 | 5.13M | ptr[-1] = signedValue; |
467 | 5.13M | } |
468 | 10.7M | } |
469 | 1.72M | } |
470 | | |
471 | | static inline FIXP_DBL maxabs_D(const FIXP_DBL *pSpectralCoefficient, |
472 | 3.15M | const int noLines) { |
473 | | /* Find max spectral line value of the current sfb */ |
474 | 3.15M | FIXP_DBL locMax = (FIXP_DBL)0; |
475 | 3.15M | int i; |
476 | | |
477 | 3.15M | DWORD_ALIGNED(pSpectralCoefficient); |
478 | | |
479 | 29.1M | for (i = noLines; i-- > 0;) { |
480 | | /* Expensive memory access */ |
481 | 26.0M | locMax = fMax(fixp_abs(pSpectralCoefficient[i]), locMax); |
482 | 26.0M | } |
483 | | |
484 | 3.15M | return locMax; |
485 | 3.15M | } |
486 | | |
487 | | AAC_DECODER_ERROR CBlock_InverseQuantizeSpectralData( |
488 | | CAacDecoderChannelInfo *pAacDecoderChannelInfo, |
489 | | SamplingRateInfo *pSamplingRateInfo, UCHAR *band_is_noise, |
490 | 687k | UCHAR active_band_search) { |
491 | 687k | int window, group, groupwin, band; |
492 | 687k | int ScaleFactorBandsTransmitted = |
493 | 687k | GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); |
494 | 687k | UCHAR *RESTRICT pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; |
495 | 687k | SHORT *RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale; |
496 | 687k | SHORT *RESTRICT pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor; |
497 | 687k | const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets( |
498 | 687k | &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); |
499 | 687k | const SHORT total_bands = |
500 | 687k | GetScaleFactorBandsTotal(&pAacDecoderChannelInfo->icsInfo); |
501 | | |
502 | 687k | FDKmemclear(pAacDecoderChannelInfo->pDynData->aSfbScale, |
503 | 687k | (8 * 16) * sizeof(SHORT)); |
504 | | |
505 | 687k | for (window = 0, group = 0; |
506 | 1.96M | group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) { |
507 | 2.83M | for (groupwin = 0; groupwin < GetWindowGroupLength( |
508 | 2.83M | &pAacDecoderChannelInfo->icsInfo, group); |
509 | 1.55M | groupwin++, window++) { |
510 | | /* inverse quantization */ |
511 | 5.44M | for (band = 0; band < ScaleFactorBandsTransmitted; band++) { |
512 | 3.88M | FIXP_DBL *pSpectralCoefficient = |
513 | 3.88M | SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, window, |
514 | 3.88M | pAacDecoderChannelInfo->granuleLength) + |
515 | 3.88M | BandOffsets[band]; |
516 | 3.88M | FIXP_DBL locMax; |
517 | | |
518 | 3.88M | const int noLines = BandOffsets[band + 1] - BandOffsets[band]; |
519 | 3.88M | const int bnds = group * 16 + band; |
520 | | |
521 | 3.88M | if ((pCodeBook[bnds] == ZERO_HCB) || |
522 | 3.88M | (pCodeBook[bnds] == INTENSITY_HCB) || |
523 | 3.88M | (pCodeBook[bnds] == INTENSITY_HCB2)) |
524 | 646k | continue; |
525 | | |
526 | 3.23M | 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 | 88.7k | pSfbScale[window * 16 + band] = (pScaleFactor[bnds] >> 2) + 1; |
531 | 88.7k | continue; |
532 | 88.7k | } |
533 | | |
534 | 3.15M | locMax = maxabs_D(pSpectralCoefficient, noLines); |
535 | | |
536 | 3.15M | if (active_band_search) { |
537 | 3.15M | if (locMax != FIXP_DBL(0)) { |
538 | 1.72M | band_is_noise[group * 16 + band] = 0; |
539 | 1.72M | } |
540 | 3.15M | } |
541 | | |
542 | | /* Cheap robustness improvement - Do not remove!!! */ |
543 | 3.15M | if (fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE) { |
544 | 59 | return AAC_DEC_PARSE_ERROR; |
545 | 59 | } |
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 | 3.15M | int msb = pScaleFactor[bnds] >> 2; |
582 | | |
583 | | /* Inverse quantize band only if it is not empty */ |
584 | 3.15M | if (locMax != FIXP_DBL(0)) { |
585 | 1.72M | int lsb = pScaleFactor[bnds] & 0x03; |
586 | | |
587 | 1.72M | int scale = EvaluatePower43(&locMax, lsb); |
588 | | |
589 | 1.72M | scale = CntLeadingZeros(locMax) - scale - 2; |
590 | | |
591 | 1.72M | pSfbScale[window * 16 + band] = msb - scale; |
592 | 1.72M | InverseQuantizeBand(pSpectralCoefficient, InverseQuantTable, |
593 | 1.72M | MantissaTable[lsb], ExponentTable[lsb], noLines, |
594 | 1.72M | scale); |
595 | 1.72M | } else { |
596 | 1.42M | pSfbScale[window * 16 + band] = msb; |
597 | 1.42M | } |
598 | | |
599 | 3.15M | } /* for (band=0; band < ScaleFactorBandsTransmitted; band++) */ |
600 | | |
601 | | /* Make sure the array is cleared to the end */ |
602 | 1.55M | SHORT start_clear = BandOffsets[ScaleFactorBandsTransmitted]; |
603 | 1.55M | SHORT end_clear = BandOffsets[total_bands]; |
604 | 1.55M | int diff_clear = (int)(end_clear - start_clear); |
605 | 1.55M | FIXP_DBL *pSpectralCoefficient = |
606 | 1.55M | SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, window, |
607 | 1.55M | pAacDecoderChannelInfo->granuleLength) + |
608 | 1.55M | start_clear; |
609 | 1.55M | FDKmemclear(pSpectralCoefficient, diff_clear * sizeof(FIXP_DBL)); |
610 | | |
611 | 1.55M | } /* for (groupwin=0; groupwin < |
612 | | GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group); |
613 | | groupwin++, window++) */ |
614 | 1.27M | } /* for (window=0, group=0; group < |
615 | | GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++)*/ |
616 | | |
617 | 687k | return AAC_DEC_OK; |
618 | 687k | } |
619 | | |
620 | | AAC_DECODER_ERROR CBlock_ReadSpectralData( |
621 | | HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo, |
622 | 378k | const SamplingRateInfo *pSamplingRateInfo, const UINT flags) { |
623 | 378k | int index, i; |
624 | 378k | const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets( |
625 | 378k | &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); |
626 | | |
627 | 378k | SPECTRAL_PTR pSpectralCoefficient = |
628 | 378k | pAacDecoderChannelInfo->pSpectralCoefficient; |
629 | | |
630 | 378k | FDK_ASSERT(BandOffsets != NULL); |
631 | | |
632 | 378k | FDKmemclear(pSpectralCoefficient, sizeof(SPECTRUM)); |
633 | | |
634 | 378k | if ((flags & AC_ER_HCR) == 0) { |
635 | 368k | int group; |
636 | 368k | int groupoffset; |
637 | 368k | UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; |
638 | 368k | int ScaleFactorBandsTransmitted = |
639 | 368k | GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); |
640 | 368k | int granuleLength = pAacDecoderChannelInfo->granuleLength; |
641 | | |
642 | 368k | groupoffset = 0; |
643 | | |
644 | | /* plain huffman decoder short */ |
645 | 368k | int max_group = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); |
646 | | |
647 | 976k | for (group = 0; group < max_group; group++) { |
648 | 607k | int max_groupwin = |
649 | 607k | GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group); |
650 | 607k | int band; |
651 | | |
652 | 607k | int bnds = group * 16; |
653 | | |
654 | 607k | int bandOffset1 = BandOffsets[0]; |
655 | 1.62M | for (band = 0; band < ScaleFactorBandsTransmitted; band++, bnds++) { |
656 | 1.01M | UCHAR currentCB = pCodeBook[bnds]; |
657 | 1.01M | int bandOffset0 = bandOffset1; |
658 | 1.01M | 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 | 1.01M | if ((currentCB >= 16) && (currentCB <= 31)) { |
664 | 76.3k | pCodeBook[bnds] = currentCB = 11; |
665 | 76.3k | } |
666 | 1.01M | if (((currentCB != ZERO_HCB) && (currentCB != NOISE_HCB) && |
667 | 1.01M | (currentCB != INTENSITY_HCB) && (currentCB != INTENSITY_HCB2))) { |
668 | 519k | const CodeBookDescription *hcb = |
669 | 519k | &AACcodeBookDescriptionTable[currentCB]; |
670 | 519k | int step = hcb->Dimension; |
671 | 519k | int offset = hcb->Offset; |
672 | 519k | int bits = hcb->numBits; |
673 | 519k | int mask = (1 << bits) - 1; |
674 | 519k | const USHORT(*CodeBook)[HuffmanEntries] = hcb->CodeBook; |
675 | 519k | int groupwin; |
676 | | |
677 | 519k | FIXP_DBL *mdctSpectrum = |
678 | 519k | &pSpectralCoefficient[groupoffset * granuleLength]; |
679 | | |
680 | 519k | if (offset == 0) { |
681 | 708k | for (groupwin = 0; groupwin < max_groupwin; groupwin++) { |
682 | 1.16M | for (index = bandOffset0; index < bandOffset1; index += step) { |
683 | 790k | int idx = CBlock_DecodeHuffmanWordCB(bs, CodeBook); |
684 | 2.65M | for (i = 0; i < step; i++, idx >>= bits) { |
685 | 1.86M | FIXP_DBL tmp = (FIXP_DBL)((idx & mask) - offset); |
686 | 1.86M | if (tmp != FIXP_DBL(0)) tmp = (FDKreadBit(bs)) ? -tmp : tmp; |
687 | 1.86M | mdctSpectrum[index + i] = tmp; |
688 | 1.86M | } |
689 | | |
690 | 790k | if (currentCB == ESCBOOK) { |
691 | 896k | for (int j = 0; j < 2; j++) |
692 | 597k | mdctSpectrum[index + j] = (FIXP_DBL)CBlock_GetEscape( |
693 | 597k | bs, (LONG)mdctSpectrum[index + j]); |
694 | 298k | } |
695 | 790k | } |
696 | 374k | mdctSpectrum += granuleLength; |
697 | 374k | } |
698 | 334k | } else { |
699 | 375k | for (groupwin = 0; groupwin < max_groupwin; groupwin++) { |
700 | 506k | for (index = bandOffset0; index < bandOffset1; index += step) { |
701 | 316k | int idx = CBlock_DecodeHuffmanWordCB(bs, CodeBook); |
702 | 1.23M | for (i = 0; i < step; i++, idx >>= bits) { |
703 | 923k | mdctSpectrum[index + i] = (FIXP_DBL)((idx & mask) - offset); |
704 | 923k | } |
705 | 316k | if (currentCB == ESCBOOK) { |
706 | 0 | for (int j = 0; j < 2; j++) |
707 | 0 | mdctSpectrum[index + j] = (FIXP_DBL)CBlock_GetEscape( |
708 | 0 | bs, (LONG)mdctSpectrum[index + j]); |
709 | 0 | } |
710 | 316k | } |
711 | 190k | mdctSpectrum += granuleLength; |
712 | 190k | } |
713 | 185k | } |
714 | 519k | } |
715 | 1.01M | } |
716 | 607k | groupoffset += max_groupwin; |
717 | 607k | } |
718 | | /* plain huffman decoding (short) finished */ |
719 | 368k | } |
720 | | |
721 | | /* HCR - Huffman Codeword Reordering short */ |
722 | 9.41k | else /* if ( flags & AC_ER_HCR ) */ |
723 | | |
724 | 9.41k | { |
725 | 9.41k | H_HCR_INFO hHcr = &pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo; |
726 | | |
727 | 9.41k | int hcrStatus = 0; |
728 | | |
729 | | /* advanced Huffman decoding starts here (HCR decoding :) */ |
730 | 9.41k | if (pAacDecoderChannelInfo->pDynData->specificTo.aac |
731 | 9.41k | .lenOfReorderedSpectralData != 0) { |
732 | | /* HCR initialization short */ |
733 | 9.14k | hcrStatus = HcrInit(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs); |
734 | | |
735 | 9.14k | if (hcrStatus != 0) { |
736 | 25 | return AAC_DEC_DECODE_FRAME_ERROR; |
737 | 25 | } |
738 | | |
739 | | /* HCR decoding short */ |
740 | 9.12k | hcrStatus = |
741 | 9.12k | HcrDecoder(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs); |
742 | | |
743 | 9.12k | if (hcrStatus != 0) { |
744 | 7.64k | #if HCR_ERROR_CONCEALMENT |
745 | 7.64k | HcrMuteErroneousLines(hHcr); |
746 | | #else |
747 | | return AAC_DEC_DECODE_FRAME_ERROR; |
748 | | #endif /* HCR_ERROR_CONCEALMENT */ |
749 | 7.64k | } |
750 | | |
751 | 9.12k | FDKpushFor(bs, pAacDecoderChannelInfo->pDynData->specificTo.aac |
752 | 9.12k | .lenOfReorderedSpectralData); |
753 | 9.12k | } |
754 | 9.41k | } |
755 | | /* HCR - Huffman Codeword Reordering short finished */ |
756 | | |
757 | 378k | if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) && |
758 | 378k | !(flags & (AC_ELD | AC_SCALABLE))) { |
759 | | /* apply pulse data */ |
760 | 18.7k | CPulseData_Apply( |
761 | 18.7k | &pAacDecoderChannelInfo->pDynData->specificTo.aac.PulseData, |
762 | 18.7k | GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, |
763 | 18.7k | pSamplingRateInfo), |
764 | 18.7k | SPEC_LONG(pSpectralCoefficient)); |
765 | 18.7k | } |
766 | | |
767 | 378k | return AAC_DEC_OK; |
768 | 378k | } |
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 | | |
783 | | void CBlock_ApplyNoise(CAacDecoderChannelInfo *pAacDecoderChannelInfo, |
784 | | SamplingRateInfo *pSamplingRateInfo, ULONG *nfRandomSeed, |
785 | 11.7k | UCHAR *band_is_noise) { |
786 | 11.7k | const SHORT *swb_offset = GetScaleFactorBandOffsets( |
787 | 11.7k | &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); |
788 | 11.7k | int g, win, gwin, sfb, noiseFillingStartOffset, nfStartOffset_sfb; |
789 | | |
790 | | /* Obtain noise level and scale factor offset. */ |
791 | 11.7k | int noise_level = pAacDecoderChannelInfo->pDynData->specificTo.usac |
792 | 11.7k | .fd_noise_level_and_offset >> |
793 | 11.7k | 5; |
794 | 11.7k | 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 | 11.7k | const int noise_offset = (pAacDecoderChannelInfo->pDynData->specificTo.usac |
799 | 11.7k | .fd_noise_level_and_offset & |
800 | 11.7k | 0x1f) - |
801 | 11.7k | 16; |
802 | | |
803 | 11.7k | int max_sfb = |
804 | 11.7k | GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); |
805 | | |
806 | 11.7k | noiseFillingStartOffset = |
807 | 11.7k | (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) |
808 | 11.7k | ? 20 |
809 | 11.7k | : 160; |
810 | 11.7k | if (pAacDecoderChannelInfo->granuleLength == 96) { |
811 | 3.53k | noiseFillingStartOffset = |
812 | 3.53k | (3 * noiseFillingStartOffset) / |
813 | 3.53k | 4; /* scale offset with 3/4 for coreCoderFrameLength == 768 */ |
814 | 3.53k | } |
815 | | |
816 | | /* determine sfb from where on noise filling is applied */ |
817 | 122k | for (sfb = 0; swb_offset[sfb] < noiseFillingStartOffset; sfb++) |
818 | 110k | ; |
819 | 11.7k | nfStartOffset_sfb = sfb; |
820 | | |
821 | | /* if (noise_level!=0) */ |
822 | 11.7k | { |
823 | 61.1k | for (g = 0, win = 0; g < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); |
824 | 49.4k | g++) { |
825 | 49.4k | int windowGroupLength = |
826 | 49.4k | GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, g); |
827 | 59.7k | for (sfb = nfStartOffset_sfb; sfb < max_sfb; sfb++) { |
828 | 10.3k | int bin_start = swb_offset[sfb]; |
829 | 10.3k | int bin_stop = swb_offset[sfb + 1]; |
830 | | |
831 | 10.3k | 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 | 10.3k | if (flagN) { |
836 | | /* Change scaling factors for empty signal bands */ |
837 | 5.32k | pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] += |
838 | 5.32k | noise_offset; |
839 | | /* scale factor "sf" implied gain "g" is g = 2^(sf/4) */ |
840 | 11.5k | for (gwin = 0; gwin < windowGroupLength; gwin++) { |
841 | 6.25k | pAacDecoderChannelInfo->pDynData |
842 | 6.25k | ->aSfbScale[(win + gwin) * 16 + sfb] += (noise_offset >> 2); |
843 | 6.25k | } |
844 | 5.32k | } |
845 | | |
846 | 10.3k | ULONG seed = *nfRandomSeed; |
847 | | /* + 1 because exponent of MantissaTable[lsb][0] is always 1. */ |
848 | 10.3k | int scale = |
849 | 10.3k | (pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] >> |
850 | 10.3k | 2) + |
851 | 10.3k | 1; |
852 | 10.3k | int lsb = |
853 | 10.3k | pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] & 3; |
854 | 10.3k | FIXP_DBL mantissa = MantissaTable[lsb][0]; |
855 | | |
856 | 23.1k | for (gwin = 0; gwin < windowGroupLength; gwin++) { |
857 | 12.8k | FIXP_DBL *pSpec = |
858 | 12.8k | SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, win + gwin, |
859 | 12.8k | pAacDecoderChannelInfo->granuleLength); |
860 | | |
861 | 12.8k | int scale1 = scale - pAacDecoderChannelInfo->pDynData |
862 | 12.8k | ->aSfbScale[(win + gwin) * 16 + sfb]; |
863 | 12.8k | FIXP_DBL scaled_noiseVal_pos = |
864 | 12.8k | scaleValue(fMultDiv2(noiseVal_pos, mantissa), scale1); |
865 | 12.8k | FIXP_DBL scaled_noiseVal_neg = -scaled_noiseVal_pos; |
866 | | |
867 | | /* If the whole band is zero, just fill without checking */ |
868 | 12.8k | if (flagN) { |
869 | 101k | for (int bin = bin_start; bin < bin_stop; bin++) { |
870 | 95.4k | seed = (ULONG)( |
871 | 95.4k | (UINT64)seed * 69069 + |
872 | 95.4k | 5); /* Inlined: UsacRandomSign - origin in usacdec_lpd.h */ |
873 | 95.4k | pSpec[bin] = |
874 | 95.4k | (seed & 0x10000) ? scaled_noiseVal_neg : scaled_noiseVal_pos; |
875 | 95.4k | } /* for (bin...) */ |
876 | 6.25k | } |
877 | | /*If band is sparsely filled, check for 0 and fill */ |
878 | 6.54k | else { |
879 | 80.3k | for (int bin = bin_start; bin < bin_stop; bin++) { |
880 | 73.7k | if (pSpec[bin] == (FIXP_DBL)0) { |
881 | 51.1k | seed = (ULONG)( |
882 | 51.1k | (UINT64)seed * 69069 + |
883 | 51.1k | 5); /* Inlined: UsacRandomSign - origin in usacdec_lpd.h */ |
884 | 51.1k | pSpec[bin] = (seed & 0x10000) ? scaled_noiseVal_neg |
885 | 51.1k | : scaled_noiseVal_pos; |
886 | 51.1k | } |
887 | 73.7k | } /* for (bin...) */ |
888 | 6.54k | } |
889 | | |
890 | 12.8k | } /* for (gwin...) */ |
891 | 10.3k | *nfRandomSeed = seed; |
892 | 10.3k | } /* for (sfb...) */ |
893 | 49.4k | win += windowGroupLength; |
894 | 49.4k | } /* for (g...) */ |
895 | | |
896 | 11.7k | } /* ... */ |
897 | 11.7k | } |
898 | | |
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 | 310k | const UINT flags) { |
904 | 310k | AAC_DECODER_ERROR errorAAC = AAC_DEC_OK; |
905 | 310k | ARITH_CODING_ERROR error = ARITH_CODER_OK; |
906 | 310k | int arith_reset_flag, lg, numWin, win, winLen; |
907 | 310k | const SHORT *RESTRICT BandOffsets; |
908 | | |
909 | | /* number of transmitted spectral coefficients */ |
910 | 310k | BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, |
911 | 310k | pSamplingRateInfo); |
912 | 310k | lg = BandOffsets[GetScaleFactorBandsTransmitted( |
913 | 310k | &pAacDecoderChannelInfo->icsInfo)]; |
914 | | |
915 | 310k | numWin = GetWindowsPerFrame(&pAacDecoderChannelInfo->icsInfo); |
916 | 310k | winLen = (IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) |
917 | 310k | ? (int)frame_length |
918 | 310k | : (int)frame_length / numWin; |
919 | | |
920 | 310k | if (flags & AC_INDEP) { |
921 | 240k | arith_reset_flag = 1; |
922 | 240k | } else { |
923 | 70.5k | arith_reset_flag = (USHORT)FDKreadBits(hBs, 1); |
924 | 70.5k | } |
925 | | |
926 | 1.06M | for (win = 0; win < numWin; win++) { |
927 | 757k | error = |
928 | 757k | CArco_DecodeArithData(pAacDecoderStaticChannelInfo->hArCo, hBs, |
929 | 757k | SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, |
930 | 757k | win, pAacDecoderChannelInfo->granuleLength), |
931 | 757k | lg, winLen, arith_reset_flag && (win == 0)); |
932 | 757k | if (error != ARITH_CODER_OK) { |
933 | 1.33k | goto bail; |
934 | 1.33k | } |
935 | 757k | } |
936 | | |
937 | 310k | bail: |
938 | 310k | if (error == ARITH_CODER_ERROR) { |
939 | 1.33k | errorAAC = AAC_DEC_PARSE_ERROR; |
940 | 1.33k | } |
941 | | |
942 | 310k | return errorAAC; |
943 | 310k | } |
944 | | |
945 | | void ApplyTools(CAacDecoderChannelInfo *pAacDecoderChannelInfo[], |
946 | | const SamplingRateInfo *pSamplingRateInfo, const UINT flags, |
947 | | const UINT elFlags, const int channel, |
948 | 616k | const int common_window) { |
949 | 616k | if (!(flags & (AC_USAC | AC_RSVD50 | AC_MPEGD_RES | AC_RSV603DA))) { |
950 | 369k | CPns_Apply(&pAacDecoderChannelInfo[channel]->data.aac.PnsData, |
951 | 369k | &pAacDecoderChannelInfo[channel]->icsInfo, |
952 | 369k | pAacDecoderChannelInfo[channel]->pSpectralCoefficient, |
953 | 369k | pAacDecoderChannelInfo[channel]->specScale, |
954 | 369k | pAacDecoderChannelInfo[channel]->pDynData->aScaleFactor, |
955 | 369k | pSamplingRateInfo, |
956 | 369k | pAacDecoderChannelInfo[channel]->granuleLength, channel); |
957 | 369k | } |
958 | | |
959 | 616k | UCHAR nbands = |
960 | 616k | GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[channel]->icsInfo); |
961 | | |
962 | 616k | CTns_Apply(&pAacDecoderChannelInfo[channel]->pDynData->TnsData, |
963 | 616k | &pAacDecoderChannelInfo[channel]->icsInfo, |
964 | 616k | pAacDecoderChannelInfo[channel]->pSpectralCoefficient, |
965 | 616k | pSamplingRateInfo, pAacDecoderChannelInfo[channel]->granuleLength, |
966 | 616k | nbands, (elFlags & AC_EL_ENHANCED_NOISE) ? 1 : 0, flags); |
967 | 616k | } |
968 | | |
969 | 198k | static int getWindow2Nr(int length, int shape) { |
970 | 198k | int nr = 0; |
971 | | |
972 | 198k | if (shape == 2) { |
973 | | /* Low Overlap, 3/4 zeroed */ |
974 | 125 | nr = (length * 3) >> 2; |
975 | 125 | } |
976 | | |
977 | 198k | return nr; |
978 | 198k | } |
979 | | |
980 | 292k | FIXP_DBL get_gain(const FIXP_DBL *x, const FIXP_DBL *y, int n) { |
981 | 292k | FIXP_DBL corr = (FIXP_DBL)0; |
982 | 292k | FIXP_DBL ener = (FIXP_DBL)1; |
983 | | |
984 | 292k | int headroom_x = getScalefactor(x, n); |
985 | 292k | int headroom_y = getScalefactor(y, n); |
986 | | |
987 | | /*Calculate the normalization necessary due to addition*/ |
988 | | /* Check for power of two /special case */ |
989 | 292k | 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 | 292k | width_shift = 31 - width_shift; |
993 | | |
994 | 19.0M | for (int i = 0; i < n; i++) { |
995 | 18.7M | corr += |
996 | 18.7M | fMultDiv2((x[i] << headroom_x), (y[i] << headroom_y)) >> width_shift; |
997 | 18.7M | ener += fPow2Div2((y[i] << headroom_y)) >> width_shift; |
998 | 18.7M | } |
999 | | |
1000 | 292k | int exp_corr = (17 - headroom_x) + (17 - headroom_y) + width_shift + 1; |
1001 | 292k | int exp_ener = ((17 - headroom_y) << 1) + width_shift + 1; |
1002 | | |
1003 | 292k | int temp_exp = 0; |
1004 | 292k | FIXP_DBL output = fDivNormSigned(corr, ener, &temp_exp); |
1005 | | |
1006 | 292k | int output_exp = (exp_corr - exp_ener) + temp_exp; |
1007 | | |
1008 | 292k | INT output_shift = 17 - output_exp; |
1009 | 292k | output_shift = fMin(output_shift, 31); |
1010 | | |
1011 | 292k | output = scaleValue(output, -output_shift); |
1012 | | |
1013 | 292k | return output; |
1014 | 292k | } |
1015 | | |
1016 | | void CBlock_FrequencyToTime( |
1017 | | CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, |
1018 | | CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[], |
1019 | | const SHORT frameLen, const int frameOk, FIXP_DBL *pWorkBuffer1, |
1020 | 407k | const INT aacOutDataHeadroom, UINT elFlags, INT elCh) { |
1021 | 407k | int fr, fl, tl, nSpec; |
1022 | | |
1023 | 407k | #if defined(FDK_ASSERT_ENABLE) |
1024 | 407k | LONG nSamples; |
1025 | 407k | #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 | 407k | tl = frameLen; |
1033 | 407k | nSpec = 1; |
1034 | | |
1035 | 407k | switch (pAacDecoderChannelInfo->icsInfo.WindowSequence) { |
1036 | 0 | default: |
1037 | 198k | case BLOCK_LONG: |
1038 | 198k | fl = frameLen; |
1039 | 198k | fr = frameLen - |
1040 | 198k | getWindow2Nr(frameLen, |
1041 | 198k | 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 | 198k | if (pAacDecoderStaticChannelInfo->IMdct.prev_tl == 0) { |
1047 | 20.6k | fl = fr; |
1048 | 20.6k | } |
1049 | 198k | break; |
1050 | 31.1k | case BLOCK_STOP: |
1051 | 31.1k | fl = frameLen >> 3; |
1052 | 31.1k | fr = frameLen; |
1053 | 31.1k | break; |
1054 | 55.1k | case BLOCK_START: /* or StopStartSequence */ |
1055 | 55.1k | fl = frameLen; |
1056 | 55.1k | fr = frameLen >> 3; |
1057 | 55.1k | break; |
1058 | 123k | case BLOCK_SHORT: |
1059 | 123k | fl = fr = frameLen >> 3; |
1060 | 123k | tl >>= 3; |
1061 | 123k | nSpec = 8; |
1062 | 123k | break; |
1063 | 407k | } |
1064 | | |
1065 | 407k | { |
1066 | 407k | int last_frame_lost = pAacDecoderStaticChannelInfo->last_lpc_lost; |
1067 | | |
1068 | 407k | if (pAacDecoderStaticChannelInfo->last_core_mode == LPD) { |
1069 | 23.3k | INT fac_FB = 1; |
1070 | 23.3k | if (elFlags & AC_EL_FULLBANDLPD) { |
1071 | 0 | fac_FB = 2; |
1072 | 0 | } |
1073 | | |
1074 | 23.3k | FIXP_DBL *synth; |
1075 | | |
1076 | | /* Keep some free space at the beginning of the buffer. To be used for |
1077 | | * past data */ |
1078 | 23.3k | if (!(elFlags & AC_EL_LPDSTEREOIDX)) { |
1079 | 23.3k | synth = pWorkBuffer1 + ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB); |
1080 | 23.3k | } else { |
1081 | 0 | synth = pWorkBuffer1 + PIT_MAX_MAX * fac_FB; |
1082 | 0 | } |
1083 | | |
1084 | 23.3k | int fac_length = |
1085 | 23.3k | (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT) |
1086 | 23.3k | ? (frameLen >> 4) |
1087 | 23.3k | : (frameLen >> 3); |
1088 | | |
1089 | 23.3k | INT pitch[NB_SUBFR_SUPERFR + SYN_SFD]; |
1090 | 23.3k | FIXP_DBL pit_gain[NB_SUBFR_SUPERFR + SYN_SFD]; |
1091 | | |
1092 | 23.3k | int nbDiv = (elFlags & AC_EL_FULLBANDLPD) ? 2 : 4; |
1093 | 23.3k | int lFrame = (elFlags & AC_EL_FULLBANDLPD) ? frameLen / 2 : frameLen; |
1094 | 23.3k | int nbSubfr = |
1095 | 23.3k | lFrame / (nbDiv * L_SUBFR); /* number of subframes per division */ |
1096 | 23.3k | int LpdSfd = (nbDiv * nbSubfr) >> 1; |
1097 | 23.3k | int SynSfd = LpdSfd - BPF_SFD; |
1098 | | |
1099 | 23.3k | FDKmemclear( |
1100 | 23.3k | pitch, |
1101 | 23.3k | sizeof( |
1102 | 23.3k | pitch)); // added to prevent ferret errors in bass_pf_1sf_delay |
1103 | 23.3k | FDKmemclear(pit_gain, sizeof(pit_gain)); |
1104 | | |
1105 | | /* FAC case */ |
1106 | 23.3k | if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0 || |
1107 | 23.3k | pAacDecoderStaticChannelInfo->last_lpd_mode == 4) { |
1108 | 18.7k | FIXP_DBL fac_buf[LFAC]; |
1109 | 18.7k | FIXP_LPC *A = pAacDecoderChannelInfo->data.usac.lp_coeff[0]; |
1110 | | |
1111 | 18.7k | if (!frameOk || last_frame_lost || |
1112 | 18.7k | (pAacDecoderChannelInfo->data.usac.fac_data[0] == NULL)) { |
1113 | 6 | FDKmemclear(fac_buf, |
1114 | 6 | pAacDecoderChannelInfo->granuleLength * sizeof(FIXP_DBL)); |
1115 | 6 | pAacDecoderChannelInfo->data.usac.fac_data[0] = fac_buf; |
1116 | 6 | pAacDecoderChannelInfo->data.usac.fac_data_e[0] = 0; |
1117 | 6 | } |
1118 | | |
1119 | 18.7k | INT A_exp; /* linear prediction coefficients exponent */ |
1120 | 18.7k | { |
1121 | 319k | for (int i = 0; i < M_LP_FILTER_ORDER; i++) { |
1122 | 300k | A[i] = FX_DBL2FX_LPC(fixp_cos( |
1123 | 300k | fMult(pAacDecoderStaticChannelInfo->lpc4_lsf[i], |
1124 | 300k | FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)), |
1125 | 300k | LSF_SCALE - LSPARG_SCALE)); |
1126 | 300k | } |
1127 | | |
1128 | 18.7k | E_LPC_f_lsp_a_conversion(A, A, &A_exp); |
1129 | 18.7k | } |
1130 | | |
1131 | 18.7k | #if defined(FDK_ASSERT_ENABLE) |
1132 | 18.7k | nSamples = |
1133 | 18.7k | #endif |
1134 | 18.7k | CLpd_FAC_Acelp2Mdct( |
1135 | 18.7k | &pAacDecoderStaticChannelInfo->IMdct, synth, |
1136 | 18.7k | SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient), |
1137 | 18.7k | pAacDecoderChannelInfo->specScale, nSpec, |
1138 | 18.7k | pAacDecoderChannelInfo->data.usac.fac_data[0], |
1139 | 18.7k | pAacDecoderChannelInfo->data.usac.fac_data_e[0], fac_length, |
1140 | 18.7k | frameLen, tl, |
1141 | 18.7k | FDKgetWindowSlope( |
1142 | 18.7k | fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), |
1143 | 18.7k | fr, A, A_exp, &pAacDecoderStaticChannelInfo->acelp, |
1144 | 18.7k | (FIXP_DBL)0, /* FAC gain has already been applied. */ |
1145 | 18.7k | (last_frame_lost || !frameOk), 1, |
1146 | 18.7k | pAacDecoderStaticChannelInfo->last_lpd_mode, 0, |
1147 | 18.7k | pAacDecoderChannelInfo->currAliasingSymmetry); |
1148 | | |
1149 | 18.7k | } else { |
1150 | 4.58k | #if defined(FDK_ASSERT_ENABLE) |
1151 | 4.58k | nSamples = |
1152 | 4.58k | #endif |
1153 | 4.58k | imlt_block( |
1154 | 4.58k | &pAacDecoderStaticChannelInfo->IMdct, synth, |
1155 | 4.58k | SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient), |
1156 | 4.58k | pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl, |
1157 | 4.58k | FDKgetWindowSlope( |
1158 | 4.58k | fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), |
1159 | 4.58k | fl, |
1160 | 4.58k | FDKgetWindowSlope( |
1161 | 4.58k | fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), |
1162 | 4.58k | fr, (FIXP_DBL)0, |
1163 | 4.58k | pAacDecoderChannelInfo->currAliasingSymmetry |
1164 | 4.58k | ? MLT_FLAG_CURR_ALIAS_SYMMETRY |
1165 | 4.58k | : 0); |
1166 | 4.58k | } |
1167 | 23.3k | 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 | 23.3k | if (!(elFlags & AC_EL_LPDSTEREOIDX)) { |
1172 | 23.3k | FDKmemcpy(pitch, pAacDecoderStaticChannelInfo->old_T_pf, |
1173 | 23.3k | SynSfd * sizeof(INT)); |
1174 | 23.3k | FDKmemcpy(pit_gain, pAacDecoderStaticChannelInfo->old_gain_pf, |
1175 | 23.3k | SynSfd * sizeof(FIXP_DBL)); |
1176 | | |
1177 | 116k | for (int i = SynSfd; i < LpdSfd + 3; i++) { |
1178 | 93.4k | pitch[i] = L_SUBFR; |
1179 | 93.4k | pit_gain[i] = (FIXP_DBL)0; |
1180 | 93.4k | } |
1181 | | |
1182 | 23.3k | if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0) { |
1183 | 18.7k | pitch[SynSfd] = pitch[SynSfd - 1]; |
1184 | 18.7k | pit_gain[SynSfd] = pit_gain[SynSfd - 1]; |
1185 | 18.7k | if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) { |
1186 | 6.86k | pitch[SynSfd + 1] = pitch[SynSfd]; |
1187 | 6.86k | pit_gain[SynSfd + 1] = pit_gain[SynSfd]; |
1188 | 6.86k | } |
1189 | 18.7k | } |
1190 | | |
1191 | | /* Copy old data to the beginning of the buffer */ |
1192 | 23.3k | { |
1193 | 23.3k | FDKmemcpy( |
1194 | 23.3k | pWorkBuffer1, pAacDecoderStaticChannelInfo->old_synth, |
1195 | 23.3k | ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB) * sizeof(FIXP_DBL)); |
1196 | 23.3k | } |
1197 | | |
1198 | 23.3k | FIXP_DBL *p2_synth = pWorkBuffer1 + (PIT_MAX_MAX * fac_FB); |
1199 | | |
1200 | | /* recalculate pitch gain to allow postfilering on FAC area */ |
1201 | 219k | for (int i = 0; i < SynSfd + 2; i++) { |
1202 | 195k | int T = pitch[i]; |
1203 | 195k | FIXP_DBL gain = pit_gain[i]; |
1204 | | |
1205 | 195k | if (gain > (FIXP_DBL)0) { |
1206 | 103k | gain = get_gain(&p2_synth[i * L_SUBFR * fac_FB], |
1207 | 103k | &p2_synth[(i * L_SUBFR * fac_FB) - fac_FB * T], |
1208 | 103k | L_SUBFR * fac_FB); |
1209 | 103k | pit_gain[i] = gain; |
1210 | 103k | } |
1211 | 195k | } |
1212 | | |
1213 | 23.3k | bass_pf_1sf_delay(p2_synth, pitch, pit_gain, frameLen, |
1214 | 23.3k | (LpdSfd + 2) * L_SUBFR + BPF_SFD * L_SUBFR, |
1215 | 23.3k | frameLen - (LpdSfd + 4) * L_SUBFR, outSamples, |
1216 | 23.3k | aacOutDataHeadroom, |
1217 | 23.3k | pAacDecoderStaticChannelInfo->mem_bpf); |
1218 | 23.3k | } |
1219 | | |
1220 | 23.3k | } else /* last_core_mode was not LPD */ |
1221 | 384k | { |
1222 | 384k | FIXP_DBL *tmp = |
1223 | 384k | pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1->mdctOutTemp; |
1224 | 384k | #if defined(FDK_ASSERT_ENABLE) |
1225 | 384k | nSamples = |
1226 | 384k | #endif |
1227 | 384k | imlt_block(&pAacDecoderStaticChannelInfo->IMdct, tmp, |
1228 | 384k | SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient), |
1229 | 384k | pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl, |
1230 | 384k | FDKgetWindowSlope( |
1231 | 384k | fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), |
1232 | 384k | fl, |
1233 | 384k | FDKgetWindowSlope( |
1234 | 384k | fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), |
1235 | 384k | fr, (FIXP_DBL)0, |
1236 | 384k | pAacDecoderChannelInfo->currAliasingSymmetry |
1237 | 384k | ? MLT_FLAG_CURR_ALIAS_SYMMETRY |
1238 | 384k | : 0); |
1239 | | |
1240 | 384k | scaleValuesSaturate(outSamples, tmp, frameLen, |
1241 | 384k | MDCT_OUT_HEADROOM - aacOutDataHeadroom); |
1242 | 384k | } |
1243 | 407k | } |
1244 | | |
1245 | 407k | FDK_ASSERT(nSamples == frameLen); |
1246 | | |
1247 | 407k | pAacDecoderStaticChannelInfo->last_core_mode = |
1248 | 407k | (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT) ? FD_SHORT |
1249 | 407k | : FD_LONG; |
1250 | 407k | pAacDecoderStaticChannelInfo->last_lpd_mode = 255; |
1251 | 407k | } |
1252 | | |
1253 | | #include "ldfiltbank.h" |
1254 | | void CBlock_FrequencyToTimeLowDelay( |
1255 | | CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, |
1256 | | CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[], |
1257 | 281k | const short frameLen) { |
1258 | 281k | InvMdctTransformLowDelay_fdk( |
1259 | 281k | SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient), |
1260 | 281k | pAacDecoderChannelInfo->specScale[0], outSamples, |
1261 | 281k | pAacDecoderStaticChannelInfo->pOverlapBuffer, frameLen); |
1262 | 281k | } |