/src/aac/libSBRdec/src/env_extr.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 - 2018 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 | | /**************************** SBR decoder library ****************************** |
96 | | |
97 | | Author(s): |
98 | | |
99 | | Description: |
100 | | |
101 | | *******************************************************************************/ |
102 | | |
103 | | /*! |
104 | | \file |
105 | | \brief Envelope extraction |
106 | | The functions provided by this module are mostly called by applySBR(). After |
107 | | it is determined that there is valid SBR data, sbrGetHeaderData() might be |
108 | | called if the current SBR data contains an \ref SBR_HEADER_ELEMENT as opposed |
109 | | to a \ref SBR_STANDARD_ELEMENT. This function may return various error codes |
110 | | as defined in #SBR_HEADER_STATUS . Most importantly it returns HEADER_RESET |
111 | | when decoder settings need to be recalculated according to the SBR |
112 | | specifications. In that case applySBR() will initiatite the required |
113 | | re-configuration. |
114 | | |
115 | | The header data is stored in a #SBR_HEADER_DATA structure. |
116 | | |
117 | | The actual SBR data for the current frame is decoded into SBR_FRAME_DATA |
118 | | stuctures by sbrGetChannelPairElement() [for stereo streams] and |
119 | | sbrGetSingleChannelElement() [for mono streams]. There is no fractional |
120 | | arithmetic involved. |
121 | | |
122 | | Once the information is extracted, the data needs to be further prepared |
123 | | before the actual decoding process. This is done in decodeSbrData(). |
124 | | |
125 | | \sa Description of buffer management in applySBR(). \ref documentationOverview |
126 | | |
127 | | <h1>About the SBR data format:</h1> |
128 | | |
129 | | Each frame includes SBR data (side chain information), and can be either the |
130 | | \ref SBR_HEADER_ELEMENT or the \ref SBR_STANDARD_ELEMENT. Parts of the data |
131 | | can be protected by a CRC checksum. |
132 | | |
133 | | \anchor SBR_HEADER_ELEMENT <h2>The SBR_HEADER_ELEMENT</h2> |
134 | | |
135 | | The SBR_HEADER_ELEMENT can be transmitted with every frame, however, it |
136 | | typically is send every second or so. It contains fundamental information such |
137 | | as SBR sampling frequency and frequency range as well as control signals that |
138 | | do not require frequent changes. It also includes the \ref |
139 | | SBR_STANDARD_ELEMENT. |
140 | | |
141 | | Depending on the changes between the information in a current |
142 | | SBR_HEADER_ELEMENT and the previous SBR_HEADER_ELEMENT, the SBR decoder might |
143 | | need to be reset and reconfigured (e.g. new tables need to be calculated). |
144 | | |
145 | | \anchor SBR_STANDARD_ELEMENT <h2>The SBR_STANDARD_ELEMENT</h2> |
146 | | |
147 | | This data can be subdivided into "side info" and "raw data", where side info |
148 | | is defined as signals needed to decode the raw data and some decoder tuning |
149 | | signals. Raw data is referred to as PCM and Huffman coded envelope and noise |
150 | | floor estimates. The side info also includes information about the |
151 | | time-frequency grid for the current frame. |
152 | | |
153 | | \sa \ref documentationOverview |
154 | | */ |
155 | | |
156 | | #include "env_extr.h" |
157 | | |
158 | | #include "sbr_ram.h" |
159 | | #include "sbr_rom.h" |
160 | | #include "huff_dec.h" |
161 | | |
162 | | #include "psbitdec.h" |
163 | | |
164 | | #define DRM_PARAMETRIC_STEREO 0 |
165 | 16.0k | #define EXTENSION_ID_PS_CODING 2 |
166 | | |
167 | | static int extractPvcFrameInfo( |
168 | | HANDLE_FDK_BITSTREAM hBs, /*!< bitbuffer handle */ |
169 | | HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ |
170 | | HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the |
171 | | frame-info will be stored */ |
172 | | HANDLE_SBR_PREV_FRAME_DATA h_prev_frame_data, /*!< pointer to memory where |
173 | | the previous frame-info |
174 | | will be stored */ |
175 | | UCHAR pvc_mode_last, /**< PVC mode of last frame */ |
176 | | const UINT flags); |
177 | | static int extractFrameInfo(HANDLE_FDK_BITSTREAM hBs, |
178 | | HANDLE_SBR_HEADER_DATA hHeaderData, |
179 | | HANDLE_SBR_FRAME_DATA h_frame_data, |
180 | | const UINT nrOfChannels, const UINT flags); |
181 | | |
182 | | static int sbrGetPvcEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData, |
183 | | HANDLE_SBR_FRAME_DATA h_frame_data, |
184 | | HANDLE_FDK_BITSTREAM hBs, const UINT flags, |
185 | | const UINT pvcMode); |
186 | | static int sbrGetEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData, |
187 | | HANDLE_SBR_FRAME_DATA h_frame_data, |
188 | | HANDLE_FDK_BITSTREAM hBs, const UINT flags); |
189 | | |
190 | | static void sbrGetDirectionControlData(HANDLE_SBR_FRAME_DATA hFrameData, |
191 | | HANDLE_FDK_BITSTREAM hBs, |
192 | | const UINT flags, const int bs_pvc_mode); |
193 | | |
194 | | static void sbrGetNoiseFloorData(HANDLE_SBR_HEADER_DATA hHeaderData, |
195 | | HANDLE_SBR_FRAME_DATA h_frame_data, |
196 | | HANDLE_FDK_BITSTREAM hBs); |
197 | | |
198 | | static int checkFrameInfo(FRAME_INFO *pFrameInfo, int numberOfTimeSlots, |
199 | | int overlap, int timeStep); |
200 | | |
201 | | /* Mapping to std samplerate table according to 14496-3 (4.6.18.2.6) */ |
202 | | typedef struct SR_MAPPING { |
203 | | UINT fsRangeLo; /* If fsRangeLo(n+1)>fs>=fsRangeLo(n), it will be mapped to... |
204 | | */ |
205 | | UINT fsMapped; /* fsMapped. */ |
206 | | } SR_MAPPING; |
207 | | |
208 | | static const SR_MAPPING stdSampleRatesMapping[] = { |
209 | | {0, 8000}, {9391, 11025}, {11502, 12000}, {13856, 16000}, |
210 | | {18783, 22050}, {23004, 24000}, {27713, 32000}, {37566, 44100}, |
211 | | {46009, 48000}, {55426, 64000}, {75132, 88200}, {92017, 96000}}; |
212 | | static const SR_MAPPING stdSampleRatesMappingUsac[] = { |
213 | | {0, 16000}, {18783, 22050}, {23004, 24000}, {27713, 32000}, |
214 | | {35777, 40000}, {42000, 44100}, {46009, 48000}, {55426, 64000}, |
215 | | {75132, 88200}, {92017, 96000}}; |
216 | | |
217 | | UINT sbrdec_mapToStdSampleRate(UINT fs, |
218 | | UINT isUsac) /*!< Output sampling frequency */ |
219 | 283k | { |
220 | 283k | UINT fsMapped = fs, tableSize = 0; |
221 | 283k | const SR_MAPPING *mappingTable; |
222 | 283k | int i; |
223 | | |
224 | 283k | if (!isUsac) { |
225 | 157k | mappingTable = stdSampleRatesMapping; |
226 | 157k | tableSize = sizeof(stdSampleRatesMapping) / sizeof(SR_MAPPING); |
227 | 157k | } else { |
228 | 125k | mappingTable = stdSampleRatesMappingUsac; |
229 | 125k | tableSize = sizeof(stdSampleRatesMappingUsac) / sizeof(SR_MAPPING); |
230 | 125k | } |
231 | | |
232 | 2.10M | for (i = tableSize - 1; i >= 0; i--) { |
233 | 2.10M | if (fs >= mappingTable[i].fsRangeLo) { |
234 | 283k | fsMapped = mappingTable[i].fsMapped; |
235 | 283k | break; |
236 | 283k | } |
237 | 2.10M | } |
238 | | |
239 | 283k | return (fsMapped); |
240 | 283k | } |
241 | | |
242 | | SBR_ERROR |
243 | | initHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn, |
244 | | const int sampleRateOut, const INT downscaleFactor, |
245 | | const int samplesPerFrame, const UINT flags, |
246 | 246k | const int setDefaultHdr) { |
247 | 246k | HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; |
248 | 246k | SBR_ERROR sbrError = SBRDEC_OK; |
249 | 246k | int numAnalysisBands; |
250 | 246k | int sampleRateProc; |
251 | | |
252 | 246k | if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) { |
253 | 157k | sampleRateProc = |
254 | 157k | sbrdec_mapToStdSampleRate(sampleRateOut * downscaleFactor, 0); |
255 | 157k | } else { |
256 | 88.9k | sampleRateProc = sampleRateOut * downscaleFactor; |
257 | 88.9k | } |
258 | | |
259 | 246k | if (sampleRateIn == sampleRateOut) { |
260 | 101k | hHeaderData->sbrProcSmplRate = sampleRateProc << 1; |
261 | 101k | numAnalysisBands = 32; |
262 | 145k | } else { |
263 | 145k | hHeaderData->sbrProcSmplRate = sampleRateProc; |
264 | 145k | if ((sampleRateOut >> 1) == sampleRateIn) { |
265 | | /* 1:2 */ |
266 | 80.9k | numAnalysisBands = 32; |
267 | 80.9k | } else if ((sampleRateOut >> 2) == sampleRateIn) { |
268 | | /* 1:4 */ |
269 | 26.2k | numAnalysisBands = 16; |
270 | 38.4k | } else if ((sampleRateOut * 3) >> 3 == (sampleRateIn * 8) >> 3) { |
271 | | /* 3:8, 3/4 core frame length */ |
272 | 38.3k | numAnalysisBands = 24; |
273 | 38.3k | } else { |
274 | 134 | sbrError = SBRDEC_UNSUPPORTED_CONFIG; |
275 | 134 | goto bail; |
276 | 134 | } |
277 | 145k | } |
278 | 246k | numAnalysisBands /= downscaleFactor; |
279 | | |
280 | 246k | if (setDefaultHdr) { |
281 | | /* Fill in default values first */ |
282 | 245k | hHeaderData->syncState = SBR_NOT_INITIALIZED; |
283 | 245k | hHeaderData->status = 0; |
284 | 245k | hHeaderData->frameErrorFlag = 0; |
285 | | |
286 | 245k | hHeaderData->bs_info.ampResolution = 1; |
287 | 245k | hHeaderData->bs_info.xover_band = 0; |
288 | 245k | hHeaderData->bs_info.sbr_preprocessing = 0; |
289 | 245k | hHeaderData->bs_info.pvc_mode = 0; |
290 | | |
291 | 245k | hHeaderData->bs_data.startFreq = 5; |
292 | 245k | hHeaderData->bs_data.stopFreq = 0; |
293 | 245k | hHeaderData->bs_data.freqScale = |
294 | 245k | 0; /* previously 2; for ELD reduced delay bitstreams |
295 | | /samplerates initializing of the sbr decoder instance fails if |
296 | | freqScale is set to 2 because no master table can be generated; in |
297 | | ELD reduced delay bitstreams this value is always 0; gets overwritten |
298 | | when header is read */ |
299 | 245k | hHeaderData->bs_data.alterScale = 1; |
300 | 245k | hHeaderData->bs_data.noise_bands = 2; |
301 | 245k | hHeaderData->bs_data.limiterBands = 2; |
302 | 245k | hHeaderData->bs_data.limiterGains = 2; |
303 | 245k | hHeaderData->bs_data.interpolFreq = 1; |
304 | 245k | hHeaderData->bs_data.smoothingLength = 1; |
305 | | |
306 | | /* Patch some entries */ |
307 | 245k | if (sampleRateOut * downscaleFactor >= 96000) { |
308 | 26.4k | hHeaderData->bs_data.startFreq = |
309 | 26.4k | 4; /* having read these frequency values from bit stream before. */ |
310 | 26.4k | hHeaderData->bs_data.stopFreq = 3; |
311 | 218k | } else if (sampleRateOut * downscaleFactor > |
312 | 218k | 24000) { /* Trigger an error if SBR is going to be processed |
313 | | without */ |
314 | 74.9k | hHeaderData->bs_data.startFreq = |
315 | 74.9k | 7; /* having read these frequency values from bit stream before. */ |
316 | 74.9k | hHeaderData->bs_data.stopFreq = 3; |
317 | 74.9k | } |
318 | 245k | } |
319 | | |
320 | 246k | if ((sampleRateOut >> 2) == sampleRateIn) { |
321 | 26.2k | hHeaderData->timeStep = 4; |
322 | 220k | } else { |
323 | 220k | hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2; |
324 | 220k | } |
325 | | |
326 | | /* Setup pointers to frequency band tables */ |
327 | 246k | hFreq->freqBandTable[0] = hFreq->freqBandTableLo; |
328 | 246k | hFreq->freqBandTable[1] = hFreq->freqBandTableHi; |
329 | | |
330 | | /* One SBR timeslot corresponds to the amount of samples equal to the amount |
331 | | * of analysis bands, divided by the timestep. */ |
332 | 246k | hHeaderData->numberTimeSlots = |
333 | 246k | (samplesPerFrame / numAnalysisBands) >> (hHeaderData->timeStep - 1); |
334 | 246k | if (hHeaderData->numberTimeSlots > (16)) { |
335 | 0 | sbrError = SBRDEC_UNSUPPORTED_CONFIG; |
336 | 0 | } |
337 | | |
338 | 246k | hHeaderData->numberOfAnalysisBands = numAnalysisBands; |
339 | 246k | if ((sampleRateOut >> 2) == sampleRateIn) { |
340 | 26.2k | hHeaderData->numberTimeSlots <<= 1; |
341 | 26.2k | } |
342 | | |
343 | 246k | bail: |
344 | 246k | return sbrError; |
345 | 246k | } |
346 | | |
347 | | /*! |
348 | | \brief Initialize the SBR_PREV_FRAME_DATA struct |
349 | | */ |
350 | | void initSbrPrevFrameData( |
351 | | HANDLE_SBR_PREV_FRAME_DATA |
352 | | h_prev_data, /*!< handle to struct SBR_PREV_FRAME_DATA */ |
353 | | int timeSlots) /*!< Framelength in SBR-timeslots */ |
354 | 151k | { |
355 | 151k | int i; |
356 | | |
357 | | /* Set previous energy and noise levels to 0 for the case |
358 | | that decoding starts in the middle of a bitstream */ |
359 | 8.62M | for (i = 0; i < MAX_FREQ_COEFFS; i++) |
360 | 8.47M | h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0; |
361 | 908k | for (i = 0; i < MAX_NOISE_COEFFS; i++) |
362 | 756k | h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0; |
363 | 908k | for (i = 0; i < MAX_INVF_BANDS; i++) h_prev_data->sbr_invf_mode[i] = INVF_OFF; |
364 | | |
365 | 151k | h_prev_data->stopPos = timeSlots; |
366 | 151k | h_prev_data->coupling = COUPLING_OFF; |
367 | 151k | h_prev_data->ampRes = 0; |
368 | | |
369 | 151k | FDKmemclear(&h_prev_data->prevFrameInfo, sizeof(h_prev_data->prevFrameInfo)); |
370 | 151k | } |
371 | | |
372 | | /*! |
373 | | \brief Read header data from bitstream |
374 | | |
375 | | \return error status - 0 if ok |
376 | | */ |
377 | | SBR_HEADER_STATUS |
378 | | sbrGetHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_FDK_BITSTREAM hBs, |
379 | | const UINT flags, const int fIsSbrData, |
380 | 607k | const UCHAR configMode) { |
381 | 607k | SBR_HEADER_DATA_BS *pBsData; |
382 | 607k | SBR_HEADER_DATA_BS lastHeader; |
383 | 607k | SBR_HEADER_DATA_BS_INFO lastInfo; |
384 | 607k | int headerExtra1 = 0, headerExtra2 = 0; |
385 | | |
386 | | /* Read and discard new header in config change detection mode */ |
387 | 607k | if (configMode & AC_CM_DET_CFG_CHANGE) { |
388 | 308k | if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { |
389 | | /* ampResolution */ |
390 | 196k | FDKreadBits(hBs, 1); |
391 | 196k | } |
392 | | /* startFreq, stopFreq */ |
393 | 308k | FDKpushFor(hBs, 8); |
394 | 308k | if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { |
395 | | /* xover_band */ |
396 | 196k | FDKreadBits(hBs, 3); |
397 | | /* reserved bits */ |
398 | 196k | FDKreadBits(hBs, 2); |
399 | 196k | } |
400 | 308k | headerExtra1 = FDKreadBit(hBs); |
401 | 308k | headerExtra2 = FDKreadBit(hBs); |
402 | 308k | FDKpushFor(hBs, 5 * headerExtra1 + 6 * headerExtra2); |
403 | | |
404 | 308k | return HEADER_OK; |
405 | 308k | } |
406 | | |
407 | | /* Copy SBR bit stream header to temporary header */ |
408 | 299k | lastHeader = hHeaderData->bs_data; |
409 | 299k | lastInfo = hHeaderData->bs_info; |
410 | | |
411 | | /* Read new header from bitstream */ |
412 | 299k | if ((flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) && !fIsSbrData) { |
413 | 65.0k | pBsData = &hHeaderData->bs_dflt; |
414 | 234k | } else { |
415 | 234k | pBsData = &hHeaderData->bs_data; |
416 | 234k | } |
417 | | |
418 | 299k | if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { |
419 | 164k | hHeaderData->bs_info.ampResolution = FDKreadBits(hBs, 1); |
420 | 164k | } |
421 | | |
422 | 299k | pBsData->startFreq = FDKreadBits(hBs, 4); |
423 | 299k | pBsData->stopFreq = FDKreadBits(hBs, 4); |
424 | | |
425 | 299k | if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { |
426 | 164k | hHeaderData->bs_info.xover_band = FDKreadBits(hBs, 3); |
427 | 164k | FDKreadBits(hBs, 2); |
428 | 164k | } |
429 | | |
430 | 299k | headerExtra1 = FDKreadBits(hBs, 1); |
431 | 299k | headerExtra2 = FDKreadBits(hBs, 1); |
432 | | |
433 | | /* Handle extra header information */ |
434 | 299k | if (headerExtra1) { |
435 | 98.8k | pBsData->freqScale = FDKreadBits(hBs, 2); |
436 | 98.8k | pBsData->alterScale = FDKreadBits(hBs, 1); |
437 | 98.8k | pBsData->noise_bands = FDKreadBits(hBs, 2); |
438 | 200k | } else { |
439 | 200k | pBsData->freqScale = 2; |
440 | 200k | pBsData->alterScale = 1; |
441 | 200k | pBsData->noise_bands = 2; |
442 | 200k | } |
443 | | |
444 | 299k | if (headerExtra2) { |
445 | 100k | pBsData->limiterBands = FDKreadBits(hBs, 2); |
446 | 100k | pBsData->limiterGains = FDKreadBits(hBs, 2); |
447 | 100k | pBsData->interpolFreq = FDKreadBits(hBs, 1); |
448 | 100k | pBsData->smoothingLength = FDKreadBits(hBs, 1); |
449 | 198k | } else { |
450 | 198k | pBsData->limiterBands = 2; |
451 | 198k | pBsData->limiterGains = 2; |
452 | 198k | pBsData->interpolFreq = 1; |
453 | 198k | pBsData->smoothingLength = 1; |
454 | 198k | } |
455 | | |
456 | | /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */ |
457 | 299k | if (hHeaderData->syncState < SBR_HEADER || |
458 | 299k | lastHeader.startFreq != pBsData->startFreq || |
459 | 299k | lastHeader.stopFreq != pBsData->stopFreq || |
460 | 299k | lastHeader.freqScale != pBsData->freqScale || |
461 | 299k | lastHeader.alterScale != pBsData->alterScale || |
462 | 299k | lastHeader.noise_bands != pBsData->noise_bands || |
463 | 299k | lastInfo.xover_band != hHeaderData->bs_info.xover_band) { |
464 | 233k | return HEADER_RESET; /* New settings */ |
465 | 233k | } |
466 | | |
467 | 65.4k | return HEADER_OK; |
468 | 299k | } |
469 | | |
470 | | /*! |
471 | | \brief Get missing harmonics parameters (only used for AAC+SBR) |
472 | | |
473 | | \return error status - 0 if ok |
474 | | */ |
475 | | int sbrGetSyntheticCodedData(HANDLE_SBR_HEADER_DATA hHeaderData, |
476 | | HANDLE_SBR_FRAME_DATA hFrameData, |
477 | 381k | HANDLE_FDK_BITSTREAM hBs, const UINT flags) { |
478 | 381k | int i, bitsRead = 0; |
479 | | |
480 | 381k | int add_harmonic_flag = FDKreadBits(hBs, 1); |
481 | 381k | bitsRead++; |
482 | | |
483 | 381k | if (add_harmonic_flag) { |
484 | 46.0k | int nSfb = hHeaderData->freqBandData.nSfb[1]; |
485 | 138k | for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) { |
486 | | /* read maximum 32 bits and align them to the MSB */ |
487 | 92.1k | int readBits = fMin(32, nSfb); |
488 | 92.1k | nSfb -= readBits; |
489 | 92.1k | if (readBits > 0) { |
490 | 46.7k | hFrameData->addHarmonics[i] = FDKreadBits(hBs, readBits) |
491 | 46.7k | << (32 - readBits); |
492 | 46.7k | } else { |
493 | 45.4k | hFrameData->addHarmonics[i] = 0; |
494 | 45.4k | } |
495 | | |
496 | 92.1k | bitsRead += readBits; |
497 | 92.1k | } |
498 | | /* bs_pvc_mode = 0 for Rsvd50 */ |
499 | 46.0k | if (flags & SBRDEC_SYNTAX_USAC) { |
500 | 14.6k | if (hHeaderData->bs_info.pvc_mode) { |
501 | 3.56k | int bs_sinusoidal_position = 31; |
502 | 3.56k | if (FDKreadBit(hBs) /* bs_sinusoidal_position_flag */) { |
503 | 592 | bs_sinusoidal_position = FDKreadBits(hBs, 5); |
504 | 592 | } |
505 | 3.56k | hFrameData->sinusoidal_position = bs_sinusoidal_position; |
506 | 3.56k | } |
507 | 14.6k | } |
508 | 335k | } else { |
509 | 1.00M | for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) |
510 | 671k | hFrameData->addHarmonics[i] = 0; |
511 | 335k | } |
512 | | |
513 | 381k | return (bitsRead); |
514 | 381k | } |
515 | | |
516 | | /*! |
517 | | \brief Reads extension data from the bitstream |
518 | | |
519 | | The bitstream format allows up to 4 kinds of extended data element. |
520 | | Extended data may contain several elements, each identified by a 2-bit-ID. |
521 | | So far, no extended data elements are defined hence the first 2 parameters |
522 | | are unused. The data should be skipped in order to update the number |
523 | | of read bits for the consistency check in applySBR(). |
524 | | */ |
525 | | static int extractExtendedData( |
526 | | HANDLE_SBR_HEADER_DATA hHeaderData, /*!< handle to SBR header */ |
527 | | HANDLE_FDK_BITSTREAM hBs /*!< Handle to the bit buffer */ |
528 | | , |
529 | | HANDLE_PS_DEC hParametricStereoDec /*!< Parametric Stereo Decoder */ |
530 | 76.1k | ) { |
531 | 76.1k | INT nBitsLeft; |
532 | 76.1k | int extended_data; |
533 | 76.1k | int i, frameOk = 1; |
534 | | |
535 | 76.1k | extended_data = FDKreadBits(hBs, 1); |
536 | | |
537 | 76.1k | if (extended_data) { |
538 | 25.1k | int cnt; |
539 | 25.1k | int bPsRead = 0; |
540 | | |
541 | 25.1k | cnt = FDKreadBits(hBs, 4); |
542 | 25.1k | if (cnt == (1 << 4) - 1) cnt += FDKreadBits(hBs, 8); |
543 | | |
544 | 25.1k | nBitsLeft = 8 * cnt; |
545 | | |
546 | | /* sanity check for cnt */ |
547 | 25.1k | if (nBitsLeft > (INT)FDKgetValidBits(hBs)) { |
548 | | /* limit nBitsLeft */ |
549 | 3.76k | nBitsLeft = (INT)FDKgetValidBits(hBs); |
550 | | /* set frame error */ |
551 | 3.76k | frameOk = 0; |
552 | 3.76k | } |
553 | | |
554 | 57.6k | while (nBitsLeft > 7) { |
555 | 32.4k | int extension_id = FDKreadBits(hBs, 2); |
556 | 32.4k | nBitsLeft -= 2; |
557 | | |
558 | 32.4k | switch (extension_id) { |
559 | 16.0k | case EXTENSION_ID_PS_CODING: |
560 | | |
561 | | /* Read PS data from bitstream */ |
562 | | |
563 | 16.0k | if (hParametricStereoDec != NULL) { |
564 | 11.5k | if (bPsRead && |
565 | 11.5k | !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot] |
566 | 3.12k | .mpeg.bPsHeaderValid) { |
567 | 317 | cnt = nBitsLeft >> 3; /* number of remaining bytes */ |
568 | 9.92k | for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8); |
569 | 317 | nBitsLeft -= cnt * 8; |
570 | 11.2k | } else { |
571 | 11.2k | nBitsLeft -= |
572 | 11.2k | (INT)ReadPsData(hParametricStereoDec, hBs, nBitsLeft); |
573 | 11.2k | bPsRead = 1; |
574 | 11.2k | } |
575 | 11.5k | } |
576 | | |
577 | | /* parametric stereo detected, could set channelMode accordingly here |
578 | | */ |
579 | | /* */ |
580 | | /* "The usage of this parametric stereo extension to HE-AAC is */ |
581 | | /* signalled implicitly in the bitstream. Hence, if an sbr_extension() |
582 | | */ |
583 | | /* with bs_extension_id==EXTENSION_ID_PS is found in the SBR part of |
584 | | */ |
585 | | /* the bitstream, a decoder supporting the combination of SBR and PS |
586 | | */ |
587 | | /* shall operate the PS tool to generate a stereo output signal." */ |
588 | | /* source: ISO/IEC 14496-3:2001/FDAM 2:2004(E) */ |
589 | | |
590 | 16.0k | break; |
591 | | |
592 | 16.3k | default: |
593 | 16.3k | cnt = nBitsLeft >> 3; /* number of remaining bytes */ |
594 | 224k | for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8); |
595 | 16.3k | nBitsLeft -= cnt * 8; |
596 | 16.3k | break; |
597 | 32.4k | } |
598 | 32.4k | } |
599 | | |
600 | 25.1k | if (nBitsLeft < 0) { |
601 | 4.10k | frameOk = 0; |
602 | 4.10k | goto bail; |
603 | 21.0k | } else { |
604 | | /* Read fill bits for byte alignment */ |
605 | 21.0k | FDKreadBits(hBs, nBitsLeft); |
606 | 21.0k | } |
607 | 25.1k | } |
608 | | |
609 | 76.1k | bail: |
610 | 76.1k | return (frameOk); |
611 | 76.1k | } |
612 | | |
613 | | /*! |
614 | | \brief Read bitstream elements of a SBR channel element |
615 | | \return SbrFrameOK |
616 | | */ |
617 | | int sbrGetChannelElement(HANDLE_SBR_HEADER_DATA hHeaderData, |
618 | | HANDLE_SBR_FRAME_DATA hFrameDataLeft, |
619 | | HANDLE_SBR_FRAME_DATA hFrameDataRight, |
620 | | HANDLE_SBR_PREV_FRAME_DATA hFrameDataLeftPrev, |
621 | | UCHAR pvc_mode_last, HANDLE_FDK_BITSTREAM hBs, |
622 | | HANDLE_PS_DEC hParametricStereoDec, const UINT flags, |
623 | 301k | const int overlap) { |
624 | 301k | int i, bs_coupling = COUPLING_OFF; |
625 | 301k | const int nCh = (hFrameDataRight == NULL) ? 1 : 2; |
626 | | |
627 | 301k | if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) { |
628 | | /* Reserved bits */ |
629 | 83.8k | if (FDKreadBits(hBs, 1)) { /* bs_data_extra */ |
630 | 24.7k | FDKreadBits(hBs, 4); |
631 | 24.7k | if ((flags & SBRDEC_SYNTAX_SCAL) || (nCh == 2)) { |
632 | 21.9k | FDKreadBits(hBs, 4); |
633 | 21.9k | } |
634 | 24.7k | } |
635 | 83.8k | } |
636 | | |
637 | 301k | if (nCh == 2) { |
638 | | /* Read coupling flag */ |
639 | 98.9k | bs_coupling = FDKreadBits(hBs, 1); |
640 | 98.9k | if (bs_coupling) { |
641 | 29.8k | hFrameDataLeft->coupling = COUPLING_LEVEL; |
642 | 29.8k | hFrameDataRight->coupling = COUPLING_BAL; |
643 | 69.1k | } else { |
644 | 69.1k | hFrameDataLeft->coupling = COUPLING_OFF; |
645 | 69.1k | hFrameDataRight->coupling = COUPLING_OFF; |
646 | 69.1k | } |
647 | 202k | } else { |
648 | 202k | if (flags & SBRDEC_SYNTAX_SCAL) { |
649 | 24.6k | FDKreadBits(hBs, 1); /* bs_coupling */ |
650 | 24.6k | } |
651 | 202k | hFrameDataLeft->coupling = COUPLING_OFF; |
652 | 202k | } |
653 | | |
654 | 301k | if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { |
655 | 217k | if (flags & SBRDEC_USAC_HARMONICSBR) { |
656 | 55.6k | hFrameDataLeft->sbrPatchingMode = FDKreadBit(hBs); |
657 | 55.6k | if (hFrameDataLeft->sbrPatchingMode == 0) { |
658 | 33.6k | hFrameDataLeft->sbrOversamplingFlag = FDKreadBit(hBs); |
659 | 33.6k | if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */ |
660 | 4.44k | hFrameDataLeft->sbrPitchInBins = FDKreadBits(hBs, 7); |
661 | 29.2k | } else { |
662 | 29.2k | hFrameDataLeft->sbrPitchInBins = 0; |
663 | 29.2k | } |
664 | 33.6k | } else { |
665 | 21.9k | hFrameDataLeft->sbrOversamplingFlag = 0; |
666 | 21.9k | hFrameDataLeft->sbrPitchInBins = 0; |
667 | 21.9k | } |
668 | | |
669 | 55.6k | if (nCh == 2) { |
670 | 38.9k | if (bs_coupling) { |
671 | 18.9k | hFrameDataRight->sbrPatchingMode = hFrameDataLeft->sbrPatchingMode; |
672 | 18.9k | hFrameDataRight->sbrOversamplingFlag = |
673 | 18.9k | hFrameDataLeft->sbrOversamplingFlag; |
674 | 18.9k | hFrameDataRight->sbrPitchInBins = hFrameDataLeft->sbrPitchInBins; |
675 | 19.9k | } else { |
676 | 19.9k | hFrameDataRight->sbrPatchingMode = FDKreadBit(hBs); |
677 | 19.9k | if (hFrameDataRight->sbrPatchingMode == 0) { |
678 | 12.6k | hFrameDataRight->sbrOversamplingFlag = FDKreadBit(hBs); |
679 | 12.6k | if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */ |
680 | 1.78k | hFrameDataRight->sbrPitchInBins = FDKreadBits(hBs, 7); |
681 | 10.8k | } else { |
682 | 10.8k | hFrameDataRight->sbrPitchInBins = 0; |
683 | 10.8k | } |
684 | 12.6k | } else { |
685 | 7.23k | hFrameDataRight->sbrOversamplingFlag = 0; |
686 | 7.23k | hFrameDataRight->sbrPitchInBins = 0; |
687 | 7.23k | } |
688 | 19.9k | } |
689 | 38.9k | } |
690 | 161k | } else { |
691 | 161k | if (nCh == 2) { |
692 | 26.4k | hFrameDataRight->sbrPatchingMode = 1; |
693 | 26.4k | hFrameDataRight->sbrOversamplingFlag = 0; |
694 | 26.4k | hFrameDataRight->sbrPitchInBins = 0; |
695 | 26.4k | } |
696 | | |
697 | 161k | hFrameDataLeft->sbrPatchingMode = 1; |
698 | 161k | hFrameDataLeft->sbrOversamplingFlag = 0; |
699 | 161k | hFrameDataLeft->sbrPitchInBins = 0; |
700 | 161k | } |
701 | 217k | } else { |
702 | 83.8k | if (nCh == 2) { |
703 | 33.6k | hFrameDataRight->sbrPatchingMode = 1; |
704 | 33.6k | hFrameDataRight->sbrOversamplingFlag = 0; |
705 | 33.6k | hFrameDataRight->sbrPitchInBins = 0; |
706 | 33.6k | } |
707 | | |
708 | 83.8k | hFrameDataLeft->sbrPatchingMode = 1; |
709 | 83.8k | hFrameDataLeft->sbrOversamplingFlag = 0; |
710 | 83.8k | hFrameDataLeft->sbrPitchInBins = 0; |
711 | 83.8k | } |
712 | | |
713 | | /* |
714 | | sbr_grid(): Grid control |
715 | | */ |
716 | 301k | if (hHeaderData->bs_info.pvc_mode) { |
717 | 127k | FDK_ASSERT(nCh == 1); /* PVC not possible for CPE */ |
718 | 127k | if (!extractPvcFrameInfo(hBs, hHeaderData, hFrameDataLeft, |
719 | 127k | hFrameDataLeftPrev, pvc_mode_last, flags)) |
720 | 775 | return 0; |
721 | | |
722 | 127k | if (!checkFrameInfo(&hFrameDataLeft->frameInfo, |
723 | 127k | hHeaderData->numberTimeSlots, overlap, |
724 | 127k | hHeaderData->timeStep)) |
725 | 620 | return 0; |
726 | 173k | } else { |
727 | 173k | if (!extractFrameInfo(hBs, hHeaderData, hFrameDataLeft, 1, flags)) return 0; |
728 | | |
729 | 168k | if (!checkFrameInfo(&hFrameDataLeft->frameInfo, |
730 | 168k | hHeaderData->numberTimeSlots, overlap, |
731 | 168k | hHeaderData->timeStep)) |
732 | 3.07k | return 0; |
733 | 168k | } |
734 | 291k | if (nCh == 2) { |
735 | 95.1k | if (hFrameDataLeft->coupling) { |
736 | 28.7k | FDKmemcpy(&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo, |
737 | 28.7k | sizeof(FRAME_INFO)); |
738 | 28.7k | hFrameDataRight->ampResolutionCurrentFrame = |
739 | 28.7k | hFrameDataLeft->ampResolutionCurrentFrame; |
740 | 66.4k | } else { |
741 | 66.4k | if (!extractFrameInfo(hBs, hHeaderData, hFrameDataRight, 2, flags)) |
742 | 1.25k | return 0; |
743 | | |
744 | 65.2k | if (!checkFrameInfo(&hFrameDataRight->frameInfo, |
745 | 65.2k | hHeaderData->numberTimeSlots, overlap, |
746 | 65.2k | hHeaderData->timeStep)) |
747 | 942 | return 0; |
748 | 65.2k | } |
749 | 95.1k | } |
750 | | |
751 | | /* |
752 | | sbr_dtdf(): Fetch domain vectors (time or frequency direction for |
753 | | delta-coding) |
754 | | */ |
755 | 289k | sbrGetDirectionControlData(hFrameDataLeft, hBs, flags, |
756 | 289k | hHeaderData->bs_info.pvc_mode); |
757 | 289k | if (nCh == 2) { |
758 | 92.9k | sbrGetDirectionControlData(hFrameDataRight, hBs, flags, 0); |
759 | 92.9k | } |
760 | | |
761 | | /* sbr_invf() */ |
762 | 944k | for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { |
763 | 654k | hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2); |
764 | 654k | } |
765 | 289k | if (nCh == 2) { |
766 | 92.9k | if (hFrameDataLeft->coupling) { |
767 | 94.1k | for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { |
768 | 65.4k | hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i]; |
769 | 65.4k | } |
770 | 64.2k | } else { |
771 | 234k | for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { |
772 | 169k | hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2); |
773 | 169k | } |
774 | 64.2k | } |
775 | 92.9k | } |
776 | | |
777 | 289k | if (nCh == 1) { |
778 | 196k | if (hHeaderData->bs_info.pvc_mode) { |
779 | 126k | if (!sbrGetPvcEnvelope(hHeaderData, hFrameDataLeft, hBs, flags, |
780 | 126k | hHeaderData->bs_info.pvc_mode)) |
781 | 858 | return 0; |
782 | 126k | } else if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) |
783 | 0 | return 0; |
784 | | |
785 | 195k | sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs); |
786 | 195k | } else if (hFrameDataLeft->coupling) { |
787 | 28.7k | if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) { |
788 | 0 | return 0; |
789 | 0 | } |
790 | | |
791 | 28.7k | sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs); |
792 | | |
793 | 28.7k | if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) { |
794 | 0 | return 0; |
795 | 0 | } |
796 | 28.7k | sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs); |
797 | 64.2k | } else { /* nCh == 2 && no coupling */ |
798 | | |
799 | 64.2k | if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) return 0; |
800 | | |
801 | 64.2k | if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) return 0; |
802 | | |
803 | 64.2k | sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs); |
804 | | |
805 | 64.2k | sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs); |
806 | 64.2k | } |
807 | | |
808 | 288k | sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs, flags); |
809 | 288k | if (nCh == 2) { |
810 | 92.9k | sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs, flags); |
811 | 92.9k | } |
812 | | |
813 | 288k | if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) { |
814 | 76.1k | if (!extractExtendedData(hHeaderData, hBs, hParametricStereoDec)) { |
815 | 6.65k | return 0; |
816 | 6.65k | } |
817 | 76.1k | } |
818 | | |
819 | 281k | return 1; |
820 | 288k | } |
821 | | |
822 | | /*! |
823 | | \brief Read direction control data from bitstream |
824 | | */ |
825 | | void sbrGetDirectionControlData( |
826 | | HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ |
827 | | HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ |
828 | | const UINT flags, const int bs_pvc_mode) |
829 | | |
830 | 382k | { |
831 | 382k | int i; |
832 | 382k | int indepFlag = 0; |
833 | | |
834 | 382k | if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { |
835 | 276k | indepFlag = flags & SBRDEC_USAC_INDEP; |
836 | 276k | } |
837 | | |
838 | 382k | if (bs_pvc_mode == 0) { |
839 | 256k | i = 0; |
840 | 256k | if (indepFlag) { |
841 | 117k | h_frame_data->domain_vec[i++] = 0; |
842 | 117k | } |
843 | 592k | for (; i < h_frame_data->frameInfo.nEnvelopes; i++) { |
844 | 336k | h_frame_data->domain_vec[i] = FDKreadBits(hBs, 1); |
845 | 336k | } |
846 | 256k | } |
847 | | |
848 | 382k | i = 0; |
849 | 382k | if (indepFlag) { |
850 | 224k | h_frame_data->domain_vec_noise[i++] = 0; |
851 | 224k | } |
852 | 763k | for (; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) { |
853 | 380k | h_frame_data->domain_vec_noise[i] = FDKreadBits(hBs, 1); |
854 | 380k | } |
855 | 382k | } |
856 | | |
857 | | /*! |
858 | | \brief Read noise-floor-level data from bitstream |
859 | | */ |
860 | | void sbrGetNoiseFloorData( |
861 | | HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ |
862 | | HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ |
863 | | HANDLE_FDK_BITSTREAM hBs) /*!< handle to struct BIT_BUF */ |
864 | 381k | { |
865 | 381k | int i, j; |
866 | 381k | int delta; |
867 | 381k | COUPLING_MODE coupling; |
868 | 381k | int noNoiseBands = hHeaderData->freqBandData.nNfb; |
869 | | |
870 | 381k | Huffman hcb_noiseF; |
871 | 381k | Huffman hcb_noise; |
872 | 381k | int envDataTableCompFactor; |
873 | | |
874 | 381k | coupling = h_frame_data->coupling; |
875 | | |
876 | | /* |
877 | | Select huffman codebook depending on coupling mode |
878 | | */ |
879 | 381k | if (coupling == COUPLING_BAL) { |
880 | 28.7k | hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T; |
881 | 28.7k | hcb_noiseF = |
882 | 28.7k | (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F" |
883 | | */ |
884 | 28.7k | envDataTableCompFactor = 1; |
885 | 352k | } else { |
886 | 352k | hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T; |
887 | 352k | hcb_noiseF = |
888 | 352k | (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F" |
889 | | */ |
890 | 352k | envDataTableCompFactor = 0; |
891 | 352k | } |
892 | | |
893 | | /* |
894 | | Read raw noise-envelope data |
895 | | */ |
896 | 985k | for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) { |
897 | 604k | if (h_frame_data->domain_vec_noise[i] == 0) { |
898 | 437k | if (coupling == COUPLING_BAL) { |
899 | 42.0k | h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] = |
900 | 42.0k | (FIXP_SGL)(((int)FDKreadBits(hBs, 5)) << envDataTableCompFactor); |
901 | 395k | } else { |
902 | 395k | h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] = |
903 | 395k | (FIXP_SGL)(int)FDKreadBits(hBs, 5); |
904 | 395k | } |
905 | | |
906 | 1.05M | for (j = 1; j < noNoiseBands; j++) { |
907 | 617k | delta = DecodeHuffmanCW(hcb_noiseF, hBs); |
908 | 617k | h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] = |
909 | 617k | (FIXP_SGL)(delta << envDataTableCompFactor); |
910 | 617k | } |
911 | 437k | } else { |
912 | 499k | for (j = 0; j < noNoiseBands; j++) { |
913 | 333k | delta = DecodeHuffmanCW(hcb_noise, hBs); |
914 | 333k | h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] = |
915 | 333k | (FIXP_SGL)(delta << envDataTableCompFactor); |
916 | 333k | } |
917 | 166k | } |
918 | 604k | } |
919 | 381k | } |
920 | | |
921 | | /* ns = mapNsMode2ns[pvcMode-1][nsMode] */ |
922 | | static const UCHAR mapNsMode2ns[2][2] = { |
923 | | {16, 4}, /* pvcMode = 1 */ |
924 | | {12, 3} /* pvcMode = 2 */ |
925 | | }; |
926 | | |
927 | | static int sbrGetPvcEnvelope( |
928 | | HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ |
929 | | HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ |
930 | | HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ |
931 | 126k | const UINT flags, const UINT pvcMode) { |
932 | 126k | int divMode, nsMode; |
933 | 126k | int indepFlag = flags & SBRDEC_USAC_INDEP; |
934 | 126k | UCHAR *pvcID = h_frame_data->pvcID; |
935 | | |
936 | 126k | divMode = FDKreadBits(hBs, PVC_DIVMODE_BITS); |
937 | 126k | nsMode = FDKreadBit(hBs); |
938 | 126k | FDK_ASSERT((pvcMode == 1) || (pvcMode == 2)); |
939 | 126k | h_frame_data->ns = mapNsMode2ns[pvcMode - 1][nsMode]; |
940 | | |
941 | 126k | if (divMode <= 3) { |
942 | 16.2k | int i, k = 1, sum_length = 0, reuse_pcvID; |
943 | | |
944 | | /* special treatment for first time slot k=0 */ |
945 | 16.2k | indepFlag ? (reuse_pcvID = 0) : (reuse_pcvID = FDKreadBit(hBs)); |
946 | 16.2k | if (reuse_pcvID) { |
947 | 4.66k | pvcID[0] = hHeaderData->pvcIDprev; |
948 | 11.5k | } else { |
949 | 11.5k | pvcID[0] = FDKreadBits(hBs, PVC_PVCID_BITS); |
950 | 11.5k | } |
951 | | |
952 | | /* other time slots k>0 */ |
953 | 32.1k | for (i = 0; i < divMode; i++) { |
954 | 16.7k | int length, numBits = 4; |
955 | | |
956 | 16.7k | if (sum_length >= 13) { |
957 | 1.12k | numBits = 1; |
958 | 15.6k | } else if (sum_length >= 11) { |
959 | 263 | numBits = 2; |
960 | 15.3k | } else if (sum_length >= 7) { |
961 | 1.46k | numBits = 3; |
962 | 1.46k | } |
963 | | |
964 | 16.7k | length = FDKreadBits(hBs, numBits); |
965 | 16.7k | sum_length += length + 1; |
966 | 16.7k | if (sum_length >= PVC_NTIMESLOT) { |
967 | 858 | return 0; /* parse error */ |
968 | 858 | } |
969 | 63.3k | for (; length--; k++) { |
970 | 47.4k | pvcID[k] = pvcID[k - 1]; |
971 | 47.4k | } |
972 | 15.9k | pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS); |
973 | 15.9k | } |
974 | 189k | for (; k < 16; k++) { |
975 | 173k | pvcID[k] = pvcID[k - 1]; |
976 | 173k | } |
977 | 110k | } else { /* divMode >= 4 */ |
978 | 110k | int num_grid_info, fixed_length, grid_info, j, k = 0; |
979 | | |
980 | 110k | divMode -= 4; |
981 | 110k | num_grid_info = 2 << divMode; |
982 | 110k | fixed_length = 8 >> divMode; |
983 | 110k | FDK_ASSERT(num_grid_info * fixed_length == PVC_NTIMESLOT); |
984 | | |
985 | | /* special treatment for first time slot k=0 */ |
986 | 110k | indepFlag ? (grid_info = 1) : (grid_info = FDKreadBit(hBs)); |
987 | 110k | if (grid_info) { |
988 | 105k | pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS); |
989 | 105k | } else { |
990 | 4.28k | pvcID[k++] = hHeaderData->pvcIDprev; |
991 | 4.28k | } |
992 | 110k | j = fixed_length - 1; |
993 | 854k | for (; j--; k++) { |
994 | 743k | pvcID[k] = pvcID[k - 1]; |
995 | 743k | } |
996 | 110k | num_grid_info--; |
997 | | |
998 | | /* other time slots k>0 */ |
999 | 266k | for (; num_grid_info--;) { |
1000 | 156k | j = fixed_length; |
1001 | 156k | grid_info = FDKreadBit(hBs); |
1002 | 156k | if (grid_info) { |
1003 | 17.7k | pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS); |
1004 | 17.7k | j--; |
1005 | 17.7k | } |
1006 | 1.04M | for (; j--; k++) { |
1007 | 891k | pvcID[k] = pvcID[k - 1]; |
1008 | 891k | } |
1009 | 156k | } |
1010 | 110k | } |
1011 | | |
1012 | 125k | hHeaderData->pvcIDprev = pvcID[PVC_NTIMESLOT - 1]; |
1013 | | |
1014 | | /* usage of PVC excludes inter-TES tool */ |
1015 | 125k | h_frame_data->iTESactive = (UCHAR)0; |
1016 | | |
1017 | 125k | return 1; |
1018 | 126k | } |
1019 | | /*! |
1020 | | \brief Read envelope data from bitstream |
1021 | | */ |
1022 | | static int sbrGetEnvelope( |
1023 | | HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ |
1024 | | HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ |
1025 | | HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ |
1026 | 256k | const UINT flags) { |
1027 | 256k | int i, j; |
1028 | 256k | UCHAR no_band[MAX_ENVELOPES]; |
1029 | 256k | int delta = 0; |
1030 | 256k | int offset = 0; |
1031 | 256k | COUPLING_MODE coupling = h_frame_data->coupling; |
1032 | 256k | int ampRes = hHeaderData->bs_info.ampResolution; |
1033 | 256k | int nEnvelopes = h_frame_data->frameInfo.nEnvelopes; |
1034 | 256k | int envDataTableCompFactor; |
1035 | 256k | int start_bits, start_bits_balance; |
1036 | 256k | Huffman hcb_t, hcb_f; |
1037 | | |
1038 | 256k | h_frame_data->nScaleFactors = 0; |
1039 | | |
1040 | 256k | if ((h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1)) { |
1041 | 96.2k | if (flags & SBRDEC_ELD_GRID) |
1042 | 36.7k | ampRes = h_frame_data->ampResolutionCurrentFrame; |
1043 | 59.4k | else |
1044 | 59.4k | ampRes = 0; |
1045 | 96.2k | } |
1046 | 256k | h_frame_data->ampResolutionCurrentFrame = ampRes; |
1047 | | |
1048 | | /* |
1049 | | Set number of bits for first value depending on amplitude resolution |
1050 | | */ |
1051 | 256k | if (ampRes == 1) { |
1052 | 67.3k | start_bits = 6; |
1053 | 67.3k | start_bits_balance = 5; |
1054 | 188k | } else { |
1055 | 188k | start_bits = 7; |
1056 | 188k | start_bits_balance = 6; |
1057 | 188k | } |
1058 | | |
1059 | | /* |
1060 | | Calculate number of values for each envelope and alltogether |
1061 | | */ |
1062 | 710k | for (i = 0; i < nEnvelopes; i++) { |
1063 | 453k | no_band[i] = |
1064 | 453k | hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]]; |
1065 | 453k | h_frame_data->nScaleFactors += no_band[i]; |
1066 | 453k | } |
1067 | 256k | if (h_frame_data->nScaleFactors > MAX_NUM_ENVELOPE_VALUES) return 0; |
1068 | | |
1069 | | /* |
1070 | | Select Huffman codebook depending on coupling mode and amplitude resolution |
1071 | | */ |
1072 | 256k | if (coupling == COUPLING_BAL) { |
1073 | 28.7k | envDataTableCompFactor = 1; |
1074 | 28.7k | if (ampRes == 0) { |
1075 | 23.9k | hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T; |
1076 | 23.9k | hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F; |
1077 | 23.9k | } else { |
1078 | 4.75k | hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T; |
1079 | 4.75k | hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; |
1080 | 4.75k | } |
1081 | 227k | } else { |
1082 | 227k | envDataTableCompFactor = 0; |
1083 | 227k | if (ampRes == 0) { |
1084 | 164k | hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T; |
1085 | 164k | hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F; |
1086 | 164k | } else { |
1087 | 62.6k | hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T; |
1088 | 62.6k | hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; |
1089 | 62.6k | } |
1090 | 227k | } |
1091 | | |
1092 | 256k | h_frame_data->iTESactive = (UCHAR)0; /* disable inter-TES by default */ |
1093 | | /* |
1094 | | Now read raw envelope data |
1095 | | */ |
1096 | 710k | for (j = 0, offset = 0; j < nEnvelopes; j++) { |
1097 | 453k | if (h_frame_data->domain_vec[j] == 0) { |
1098 | 332k | if (coupling == COUPLING_BAL) { |
1099 | 48.4k | h_frame_data->iEnvelope[offset] = |
1100 | 48.4k | (FIXP_SGL)(((int)FDKreadBits(hBs, start_bits_balance)) |
1101 | 48.4k | << envDataTableCompFactor); |
1102 | 283k | } else { |
1103 | 283k | h_frame_data->iEnvelope[offset] = |
1104 | 283k | (FIXP_SGL)(int)FDKreadBits(hBs, start_bits); |
1105 | 283k | } |
1106 | 332k | } |
1107 | | |
1108 | 3.64M | for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) { |
1109 | 3.18M | if (h_frame_data->domain_vec[j] == 0) { |
1110 | 2.11M | delta = DecodeHuffmanCW(hcb_f, hBs); |
1111 | 2.11M | } else { |
1112 | 1.06M | delta = DecodeHuffmanCW(hcb_t, hBs); |
1113 | 1.06M | } |
1114 | | |
1115 | 3.18M | h_frame_data->iEnvelope[offset + i] = |
1116 | 3.18M | (FIXP_SGL)(delta << envDataTableCompFactor); |
1117 | 3.18M | } |
1118 | 453k | if ((flags & SBRDEC_SYNTAX_USAC) && (flags & SBRDEC_USAC_ITES)) { |
1119 | 145k | int bs_temp_shape = FDKreadBit(hBs); |
1120 | 145k | FDK_ASSERT(j < 8); |
1121 | 145k | h_frame_data->iTESactive |= (UCHAR)(bs_temp_shape << j); |
1122 | 145k | if (bs_temp_shape) { |
1123 | 38.4k | h_frame_data->interTempShapeMode[j] = |
1124 | 38.4k | FDKread2Bits(hBs); /* bs_inter_temp_shape_mode */ |
1125 | 106k | } else { |
1126 | 106k | h_frame_data->interTempShapeMode[j] = 0; |
1127 | 106k | } |
1128 | 145k | } |
1129 | 453k | offset += no_band[j]; |
1130 | 453k | } |
1131 | | |
1132 | | #if ENV_EXP_FRACT |
1133 | | /* Convert from int to scaled fract (ENV_EXP_FRACT bits for the fractional |
1134 | | * part) */ |
1135 | | for (i = 0; i < h_frame_data->nScaleFactors; i++) { |
1136 | | h_frame_data->iEnvelope[i] <<= ENV_EXP_FRACT; |
1137 | | } |
1138 | | #endif |
1139 | | |
1140 | 256k | return 1; |
1141 | 256k | } |
1142 | | |
1143 | | /***************************************************************************/ |
1144 | | /*! |
1145 | | \brief Generates frame info for FIXFIXonly frame class used for low delay |
1146 | | version |
1147 | | |
1148 | | \return zero for error, one for correct. |
1149 | | ****************************************************************************/ |
1150 | | static int generateFixFixOnly(FRAME_INFO *hSbrFrameInfo, int tranPosInternal, |
1151 | 10.1k | int numberTimeSlots, const UINT flags) { |
1152 | 10.1k | int nEnv, i, tranIdx; |
1153 | 10.1k | const int *pTable; |
1154 | | |
1155 | 10.1k | if (tranPosInternal >= numberTimeSlots) { |
1156 | 0 | return 0; |
1157 | 0 | } |
1158 | | |
1159 | 10.1k | switch (numberTimeSlots) { |
1160 | 0 | case 8: |
1161 | 0 | pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal]; |
1162 | 0 | break; |
1163 | 8.19k | case 15: |
1164 | 8.19k | pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal]; |
1165 | 8.19k | break; |
1166 | 1.94k | case 16: |
1167 | 1.94k | pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal]; |
1168 | 1.94k | break; |
1169 | 0 | default: |
1170 | 0 | return 0; |
1171 | 10.1k | } |
1172 | | |
1173 | | /* look number of envelopes in table */ |
1174 | 10.1k | nEnv = pTable[0]; |
1175 | | /* look up envelope distribution in table */ |
1176 | 23.7k | for (i = 1; i < nEnv; i++) hSbrFrameInfo->borders[i] = pTable[i + 2]; |
1177 | | /* open and close frame border */ |
1178 | 10.1k | hSbrFrameInfo->borders[0] = 0; |
1179 | 10.1k | hSbrFrameInfo->borders[nEnv] = numberTimeSlots; |
1180 | 10.1k | hSbrFrameInfo->nEnvelopes = nEnv; |
1181 | | |
1182 | | /* transient idx */ |
1183 | 10.1k | tranIdx = hSbrFrameInfo->tranEnv = pTable[1]; |
1184 | | |
1185 | | /* add noise floors */ |
1186 | 10.1k | hSbrFrameInfo->bordersNoise[0] = 0; |
1187 | 10.1k | hSbrFrameInfo->bordersNoise[1] = |
1188 | 10.1k | hSbrFrameInfo->borders[tranIdx ? tranIdx : 1]; |
1189 | 10.1k | hSbrFrameInfo->bordersNoise[2] = numberTimeSlots; |
1190 | | /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2) |
1191 | | */ |
1192 | 10.1k | hSbrFrameInfo->nNoiseEnvelopes = 2; |
1193 | | |
1194 | 10.1k | return 1; |
1195 | 10.1k | } |
1196 | | |
1197 | | /*! |
1198 | | \brief Extracts LowDelaySBR control data from the bitstream. |
1199 | | |
1200 | | \return zero for bitstream error, one for correct. |
1201 | | */ |
1202 | | static int extractLowDelayGrid( |
1203 | | HANDLE_FDK_BITSTREAM hBitBuf, /*!< bitbuffer handle */ |
1204 | | HANDLE_SBR_HEADER_DATA hHeaderData, |
1205 | | HANDLE_SBR_FRAME_DATA |
1206 | | h_frame_data, /*!< contains the FRAME_INFO struct to be filled */ |
1207 | 12.2k | int timeSlots, const UINT flags) { |
1208 | 12.2k | FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo; |
1209 | 12.2k | INT numberTimeSlots = hHeaderData->numberTimeSlots; |
1210 | 12.2k | INT temp = 0, k; |
1211 | | |
1212 | | /* FIXFIXonly framing case */ |
1213 | 12.2k | h_frame_data->frameInfo.frameClass = 0; |
1214 | | |
1215 | | /* get the transient position from the bitstream */ |
1216 | 12.2k | switch (timeSlots) { |
1217 | 0 | case 8: |
1218 | | /* 3bit transient position (temp={0;..;7}) */ |
1219 | 0 | temp = FDKreadBits(hBitBuf, 3); |
1220 | 0 | break; |
1221 | | |
1222 | 1.94k | case 16: |
1223 | 12.2k | case 15: |
1224 | | /* 4bit transient position (temp={0;..;15}) */ |
1225 | 12.2k | temp = FDKreadBits(hBitBuf, 4); |
1226 | 12.2k | break; |
1227 | | |
1228 | 0 | default: |
1229 | 0 | return 0; |
1230 | 12.2k | } |
1231 | | |
1232 | | /* For "case 15" only*/ |
1233 | 12.2k | if (temp >= timeSlots) { |
1234 | 2.07k | return 0; |
1235 | 2.07k | } |
1236 | | |
1237 | | /* calculate borders according to the transient position */ |
1238 | 10.1k | if (!generateFixFixOnly(pFrameInfo, temp, numberTimeSlots, flags)) { |
1239 | 0 | return 0; |
1240 | 0 | } |
1241 | | |
1242 | | /* decode freq res: */ |
1243 | 33.8k | for (k = 0; k < pFrameInfo->nEnvelopes; k++) { |
1244 | 23.7k | pFrameInfo->freqRes[k] = |
1245 | 23.7k | (UCHAR)FDKreadBits(hBitBuf, 1); /* f = F [1 bits] */ |
1246 | 23.7k | } |
1247 | | |
1248 | 10.1k | return 1; |
1249 | 10.1k | } |
1250 | | |
1251 | | /*! |
1252 | | \brief Extract the PVC frame information (structure FRAME_INFO) from the |
1253 | | bitstream \return Zero for bitstream error, one for correct. |
1254 | | */ |
1255 | | int extractPvcFrameInfo( |
1256 | | HANDLE_FDK_BITSTREAM hBs, /*!< bitbuffer handle */ |
1257 | | HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ |
1258 | | HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the |
1259 | | frame-info will be stored */ |
1260 | | HANDLE_SBR_PREV_FRAME_DATA h_prev_frame_data, /*!< pointer to memory where |
1261 | | the previous frame-info |
1262 | | will be stored */ |
1263 | | UCHAR pvc_mode_last, /**< PVC mode of last frame */ |
1264 | 127k | const UINT flags) { |
1265 | 127k | FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo; |
1266 | 127k | FRAME_INFO *pPrevFrameInfo = &h_prev_frame_data->prevFrameInfo; |
1267 | 127k | int bs_var_len_hf, bs_noise_position; |
1268 | 127k | bs_noise_position = FDKreadBits(hBs, 4); /* SBR_PVC_NOISEPOSITION_BITS 4 */ |
1269 | 127k | bs_var_len_hf = FDKreadBit(hBs); |
1270 | 127k | pFrameInfo->noisePosition = bs_noise_position; |
1271 | 127k | pFrameInfo->tranEnv = -1; |
1272 | | |
1273 | | /* Init for bs_noise_position == 0 in case a parse error is found below. */ |
1274 | 127k | pFrameInfo->nEnvelopes = 1; |
1275 | 127k | pFrameInfo->nNoiseEnvelopes = 1; |
1276 | 127k | pFrameInfo->freqRes[0] = 0; |
1277 | | |
1278 | 127k | if (bs_var_len_hf) { /* 1 or 3 Bits */ |
1279 | 109k | pFrameInfo->varLength = FDKreadBits(hBs, 2) + 1; |
1280 | 109k | if (pFrameInfo->varLength > 3) { |
1281 | 775 | pFrameInfo->varLength = |
1282 | 775 | 0; /* assume bs_var_len_hf == 0 in case of error */ |
1283 | 775 | return 0; /* reserved value -> parse error */ |
1284 | 775 | } |
1285 | 109k | } else { |
1286 | 18.3k | pFrameInfo->varLength = 0; |
1287 | 18.3k | } |
1288 | | |
1289 | 127k | if (bs_noise_position) { |
1290 | 111k | pFrameInfo->nEnvelopes = 2; |
1291 | 111k | pFrameInfo->nNoiseEnvelopes = 2; |
1292 | 111k | FDKmemclear(pFrameInfo->freqRes, sizeof(pFrameInfo->freqRes)); |
1293 | 111k | } |
1294 | | |
1295 | | /* frame border calculation */ |
1296 | 127k | if (hHeaderData->bs_info.pvc_mode > 0) { |
1297 | | /* See "7.5.1.4 HF adjustment of SBR envelope scalefactors" for reference. |
1298 | | */ |
1299 | | |
1300 | 127k | FDK_ASSERT((pFrameInfo->nEnvelopes == 1) || (pFrameInfo->nEnvelopes == 2)); |
1301 | | |
1302 | | /* left timeborder-offset: use the timeborder of prev SBR frame */ |
1303 | 127k | if (pPrevFrameInfo->nEnvelopes > 0) { |
1304 | 123k | pFrameInfo->borders[0] = |
1305 | 123k | pPrevFrameInfo->borders[pPrevFrameInfo->nEnvelopes] - PVC_NTIMESLOT; |
1306 | 123k | FDK_ASSERT(pFrameInfo->borders[0] <= 3); |
1307 | 123k | } else { |
1308 | 3.95k | pFrameInfo->borders[0] = 0; |
1309 | 3.95k | } |
1310 | | |
1311 | | /* right timeborder-offset: */ |
1312 | 127k | pFrameInfo->borders[pFrameInfo->nEnvelopes] = 16 + pFrameInfo->varLength; |
1313 | | |
1314 | 127k | if (pFrameInfo->nEnvelopes == 2) { |
1315 | 111k | pFrameInfo->borders[1] = pFrameInfo->noisePosition; |
1316 | 111k | } |
1317 | | |
1318 | | /* Calculation of PVC time borders t_EPVC */ |
1319 | 127k | if (pvc_mode_last == 0) { |
1320 | | /* there was a legacy SBR frame before this frame => use bs_var_len' for |
1321 | | * first PVC timeslot */ |
1322 | 8.93k | pFrameInfo->pvcBorders[0] = pFrameInfo->borders[0]; |
1323 | 118k | } else { |
1324 | 118k | pFrameInfo->pvcBorders[0] = 0; |
1325 | 118k | } |
1326 | 127k | if (pFrameInfo->nEnvelopes == 2) { |
1327 | 111k | pFrameInfo->pvcBorders[1] = pFrameInfo->borders[1]; |
1328 | 111k | } |
1329 | 127k | pFrameInfo->pvcBorders[pFrameInfo->nEnvelopes] = 16; |
1330 | | |
1331 | | /* calculation of SBR noise-floor time-border vector: */ |
1332 | 492k | for (INT i = 0; i <= pFrameInfo->nNoiseEnvelopes; i++) { |
1333 | 365k | pFrameInfo->bordersNoise[i] = pFrameInfo->borders[i]; |
1334 | 365k | } |
1335 | | |
1336 | 127k | pFrameInfo->tranEnv = -1; /* tranEnv not used */ |
1337 | 127k | } |
1338 | 127k | return 1; |
1339 | 127k | } |
1340 | | |
1341 | | /*! |
1342 | | \brief Extract the frame information (structure FRAME_INFO) from the |
1343 | | bitstream \return Zero for bitstream error, one for correct. |
1344 | | */ |
1345 | | int extractFrameInfo( |
1346 | | HANDLE_FDK_BITSTREAM hBs, /*!< bitbuffer handle */ |
1347 | | HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ |
1348 | | HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the |
1349 | | frame-info will be stored */ |
1350 | 240k | const UINT nrOfChannels, const UINT flags) { |
1351 | 240k | FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo; |
1352 | 240k | int numberTimeSlots = hHeaderData->numberTimeSlots; |
1353 | 240k | int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0, k, p, aL, aR, nL, nR, |
1354 | 240k | temp = 0, staticFreqRes; |
1355 | 240k | UCHAR frameClass; |
1356 | | |
1357 | 240k | if (flags & SBRDEC_ELD_GRID) { |
1358 | | /* CODEC_AACLD (LD+SBR) only uses the normal 0 Grid for non-transient Frames |
1359 | | * and the LowDelayGrid for transient Frames */ |
1360 | 60.3k | frameClass = FDKreadBits(hBs, 1); /* frameClass = [1 bit] */ |
1361 | 60.3k | if (frameClass == 1) { |
1362 | | /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal |
1363 | | * SBR-Grid for FIXIFX */ |
1364 | | /* extract the AACLD-Sbr-Grid */ |
1365 | 12.2k | pFrameInfo->frameClass = frameClass; |
1366 | 12.2k | int err = 1; |
1367 | 12.2k | err = extractLowDelayGrid(hBs, hHeaderData, h_frame_data, numberTimeSlots, |
1368 | 12.2k | flags); |
1369 | 12.2k | return err; |
1370 | 12.2k | } |
1371 | 179k | } else { |
1372 | 179k | frameClass = FDKreadBits(hBs, 2); /* frameClass = C [2 bits] */ |
1373 | 179k | } |
1374 | | |
1375 | 227k | switch (frameClass) { |
1376 | 128k | case 0: |
1377 | 128k | temp = FDKreadBits(hBs, 2); /* E [2 bits ] */ |
1378 | 128k | nEnv = (int)(1 << temp); /* E -> e */ |
1379 | | |
1380 | 128k | if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1)) |
1381 | 36.2k | h_frame_data->ampResolutionCurrentFrame = |
1382 | 36.2k | FDKreadBits(hBs, 1); /* new ELD Syntax 07-11-09 */ |
1383 | | |
1384 | 128k | staticFreqRes = FDKreadBits(hBs, 1); |
1385 | | |
1386 | 128k | if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { |
1387 | 68.1k | if (nEnv > MAX_ENVELOPES_USAC) return 0; |
1388 | 68.1k | } else |
1389 | | |
1390 | 60.6k | b = nEnv + 1; |
1391 | 128k | switch (nEnv) { |
1392 | 88.8k | case 1: |
1393 | 88.8k | switch (numberTimeSlots) { |
1394 | 35.4k | case 15: |
1395 | 35.4k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15, |
1396 | 35.4k | sizeof(FRAME_INFO)); |
1397 | 35.4k | break; |
1398 | 53.3k | case 16: |
1399 | 53.3k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16, |
1400 | 53.3k | sizeof(FRAME_INFO)); |
1401 | 53.3k | break; |
1402 | 0 | default: |
1403 | 0 | FDK_ASSERT(0); |
1404 | 88.8k | } |
1405 | 88.8k | break; |
1406 | 88.8k | case 2: |
1407 | 26.7k | switch (numberTimeSlots) { |
1408 | 6.07k | case 15: |
1409 | 6.07k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15, |
1410 | 6.07k | sizeof(FRAME_INFO)); |
1411 | 6.07k | break; |
1412 | 20.6k | case 16: |
1413 | 20.6k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16, |
1414 | 20.6k | sizeof(FRAME_INFO)); |
1415 | 20.6k | break; |
1416 | 0 | default: |
1417 | 0 | FDK_ASSERT(0); |
1418 | 26.7k | } |
1419 | 26.7k | break; |
1420 | 26.7k | case 4: |
1421 | 7.56k | switch (numberTimeSlots) { |
1422 | 5.29k | case 15: |
1423 | 5.29k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15, |
1424 | 5.29k | sizeof(FRAME_INFO)); |
1425 | 5.29k | break; |
1426 | 2.26k | case 16: |
1427 | 2.26k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16, |
1428 | 2.26k | sizeof(FRAME_INFO)); |
1429 | 2.26k | break; |
1430 | 0 | default: |
1431 | 0 | FDK_ASSERT(0); |
1432 | 7.56k | } |
1433 | 7.56k | break; |
1434 | 7.56k | case 8: |
1435 | 5.61k | #if (MAX_ENVELOPES >= 8) |
1436 | 5.61k | switch (numberTimeSlots) { |
1437 | 1.87k | case 15: |
1438 | 1.87k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15, |
1439 | 1.87k | sizeof(FRAME_INFO)); |
1440 | 1.87k | break; |
1441 | 3.74k | case 16: |
1442 | 3.74k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16, |
1443 | 3.74k | sizeof(FRAME_INFO)); |
1444 | 3.74k | break; |
1445 | 0 | default: |
1446 | 0 | FDK_ASSERT(0); |
1447 | 5.61k | } |
1448 | 5.61k | break; |
1449 | | #else |
1450 | | return 0; |
1451 | | #endif |
1452 | 128k | } |
1453 | | /* Apply correct freqRes (High is default) */ |
1454 | 128k | if (!staticFreqRes) { |
1455 | 212k | for (i = 0; i < nEnv; i++) pFrameInfo->freqRes[i] = 0; |
1456 | 90.1k | } |
1457 | | |
1458 | 128k | break; |
1459 | 46.2k | case 1: |
1460 | 85.8k | case 2: |
1461 | 85.8k | temp = FDKreadBits(hBs, 2); /* A [2 bits] */ |
1462 | | |
1463 | 85.8k | n = FDKreadBits(hBs, 2); /* n = N [2 bits] */ |
1464 | | |
1465 | 85.8k | nEnv = n + 1; /* # envelopes */ |
1466 | 85.8k | b = nEnv + 1; /* # borders */ |
1467 | | |
1468 | 85.8k | break; |
1469 | 227k | } |
1470 | | |
1471 | 227k | switch (frameClass) { |
1472 | 46.2k | case 1: |
1473 | | /* Decode borders: */ |
1474 | 46.2k | pFrameInfo->borders[0] = 0; /* first border */ |
1475 | 46.2k | border = temp + numberTimeSlots; /* A -> aR */ |
1476 | 46.2k | i = b - 1; /* frame info index for last border */ |
1477 | 46.2k | pFrameInfo->borders[i] = border; /* last border */ |
1478 | | |
1479 | 87.7k | for (k = 0; k < n; k++) { |
1480 | 41.5k | temp = FDKreadBits(hBs, 2); /* R [2 bits] */ |
1481 | 41.5k | border -= (2 * temp + 2); /* R -> r */ |
1482 | 41.5k | pFrameInfo->borders[--i] = border; |
1483 | 41.5k | } |
1484 | | |
1485 | | /* Decode pointer: */ |
1486 | 46.2k | pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1)); |
1487 | 46.2k | p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */ |
1488 | | |
1489 | 46.2k | if (p > n + 1) return 0; |
1490 | | |
1491 | 44.7k | pFrameInfo->tranEnv = p ? n + 2 - p : -1; |
1492 | | |
1493 | | /* Decode freq res: */ |
1494 | 127k | for (k = n; k >= 0; k--) { |
1495 | 82.5k | pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ |
1496 | 82.5k | } |
1497 | | |
1498 | | /* Calculate noise floor middle border: */ |
1499 | 44.7k | if (p == 0 || p == 1) |
1500 | 43.1k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; |
1501 | 1.56k | else |
1502 | 1.56k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; |
1503 | | |
1504 | 44.7k | break; |
1505 | | |
1506 | 39.6k | case 2: |
1507 | | /* Decode borders: */ |
1508 | 39.6k | border = temp; /* A -> aL */ |
1509 | 39.6k | pFrameInfo->borders[0] = border; /* first border */ |
1510 | | |
1511 | 62.7k | for (k = 1; k <= n; k++) { |
1512 | 23.1k | temp = FDKreadBits(hBs, 2); /* R [2 bits] */ |
1513 | 23.1k | border += (2 * temp + 2); /* R -> r */ |
1514 | 23.1k | pFrameInfo->borders[k] = border; |
1515 | 23.1k | } |
1516 | 39.6k | pFrameInfo->borders[k] = numberTimeSlots; /* last border */ |
1517 | | |
1518 | | /* Decode pointer: */ |
1519 | 39.6k | pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1)); |
1520 | 39.6k | p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */ |
1521 | 39.6k | if (p > n + 1) return 0; |
1522 | | |
1523 | 38.0k | if (p == 0 || p == 1) |
1524 | 30.6k | pFrameInfo->tranEnv = -1; |
1525 | 7.35k | else |
1526 | 7.35k | pFrameInfo->tranEnv = p - 1; |
1527 | | |
1528 | | /* Decode freq res: */ |
1529 | 95.0k | for (k = 0; k <= n; k++) { |
1530 | 57.0k | pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ |
1531 | 57.0k | } |
1532 | | |
1533 | | /* Calculate noise floor middle border: */ |
1534 | 38.0k | switch (p) { |
1535 | 28.2k | case 0: |
1536 | 28.2k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1]; |
1537 | 28.2k | break; |
1538 | 2.41k | case 1: |
1539 | 2.41k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; |
1540 | 2.41k | break; |
1541 | 7.35k | default: |
1542 | 7.35k | pFrameInfo->bordersNoise[1] = |
1543 | 7.35k | pFrameInfo->borders[pFrameInfo->tranEnv]; |
1544 | 7.35k | break; |
1545 | 38.0k | } |
1546 | | |
1547 | 38.0k | break; |
1548 | | |
1549 | 38.0k | case 3: |
1550 | | /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */ |
1551 | | |
1552 | 13.3k | aL = FDKreadBits(hBs, 2); /* AL [2 bits], AL -> aL */ |
1553 | | |
1554 | 13.3k | aR = FDKreadBits(hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */ |
1555 | | |
1556 | 13.3k | nL = FDKreadBits(hBs, 2); /* nL = NL [2 bits] */ |
1557 | | |
1558 | 13.3k | nR = FDKreadBits(hBs, 2); /* nR = NR [2 bits] */ |
1559 | | |
1560 | | /*------------------------------------------------------------------------- |
1561 | | Calculate help variables |
1562 | | --------------------------------------------------------------------------*/ |
1563 | | |
1564 | | /* general: */ |
1565 | 13.3k | nEnv = nL + nR + 1; /* # envelopes */ |
1566 | 13.3k | if (nEnv > MAX_ENVELOPES) return 0; |
1567 | 13.3k | b = nEnv + 1; /* # borders */ |
1568 | | |
1569 | | /*------------------------------------------------------------------------- |
1570 | | Decode envelopes |
1571 | | --------------------------------------------------------------------------*/ |
1572 | | |
1573 | | /* L-borders: */ |
1574 | 13.3k | border = aL; /* first border */ |
1575 | 13.3k | pFrameInfo->borders[0] = border; |
1576 | | |
1577 | 29.3k | for (k = 1; k <= nL; k++) { |
1578 | 16.0k | temp = FDKreadBits(hBs, 2); /* R [2 bits] */ |
1579 | 16.0k | border += (2 * temp + 2); /* R -> r */ |
1580 | 16.0k | pFrameInfo->borders[k] = border; |
1581 | 16.0k | } |
1582 | | |
1583 | | /* R-borders: */ |
1584 | 13.3k | border = aR; /* last border */ |
1585 | 13.3k | i = nEnv; |
1586 | | |
1587 | 13.3k | pFrameInfo->borders[i] = border; |
1588 | | |
1589 | 30.4k | for (k = 0; k < nR; k++) { |
1590 | 17.1k | temp = FDKreadBits(hBs, 2); /* R [2 bits] */ |
1591 | 17.1k | border -= (2 * temp + 2); /* R -> r */ |
1592 | 17.1k | pFrameInfo->borders[--i] = border; |
1593 | 17.1k | } |
1594 | | |
1595 | | /* decode pointer: */ |
1596 | 13.3k | pointer_bits = |
1597 | 13.3k | DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL + nR + 1)); |
1598 | 13.3k | p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */ |
1599 | | |
1600 | 13.3k | if (p > nL + nR + 1) return 0; |
1601 | | |
1602 | 11.8k | pFrameInfo->tranEnv = p ? b - p : -1; |
1603 | | |
1604 | | /* decode freq res: */ |
1605 | 52.3k | for (k = 0; k < nEnv; k++) { |
1606 | 40.4k | pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ |
1607 | 40.4k | } |
1608 | | |
1609 | | /*------------------------------------------------------------------------- |
1610 | | Decode noise floors |
1611 | | --------------------------------------------------------------------------*/ |
1612 | 11.8k | pFrameInfo->bordersNoise[0] = aL; |
1613 | | |
1614 | 11.8k | if (nEnv == 1) { |
1615 | | /* 1 noise floor envelope: */ |
1616 | 1.52k | pFrameInfo->bordersNoise[1] = aR; |
1617 | 10.3k | } else { |
1618 | | /* 2 noise floor envelopes */ |
1619 | 10.3k | if (p == 0 || p == 1) |
1620 | 7.68k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1]; |
1621 | 2.67k | else |
1622 | 2.67k | pFrameInfo->bordersNoise[1] = |
1623 | 2.67k | pFrameInfo->borders[pFrameInfo->tranEnv]; |
1624 | 10.3k | pFrameInfo->bordersNoise[2] = aR; |
1625 | 10.3k | } |
1626 | 11.8k | break; |
1627 | 227k | } |
1628 | | |
1629 | | /* |
1630 | | Store number of envelopes, noise floor envelopes and frame class |
1631 | | */ |
1632 | 223k | pFrameInfo->nEnvelopes = nEnv; |
1633 | | |
1634 | 223k | if (nEnv == 1) |
1635 | 136k | pFrameInfo->nNoiseEnvelopes = 1; |
1636 | 86.8k | else |
1637 | 86.8k | pFrameInfo->nNoiseEnvelopes = 2; |
1638 | | |
1639 | 223k | pFrameInfo->frameClass = frameClass; |
1640 | | |
1641 | 223k | if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) { |
1642 | | /* calculate noise floor first and last borders: */ |
1643 | 82.7k | pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0]; |
1644 | 82.7k | pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] = |
1645 | 82.7k | pFrameInfo->borders[nEnv]; |
1646 | 82.7k | } |
1647 | | |
1648 | 223k | return 1; |
1649 | 227k | } |
1650 | | |
1651 | | /*! |
1652 | | \brief Check if the frameInfo vector has reasonable values. |
1653 | | \return Zero for error, one for correct |
1654 | | */ |
1655 | | static int checkFrameInfo( |
1656 | | FRAME_INFO *pFrameInfo, /*!< pointer to frameInfo */ |
1657 | | int numberOfTimeSlots, /*!< QMF time slots per frame */ |
1658 | | int overlap, /*!< Amount of overlap QMF time slots */ |
1659 | | int timeStep) /*!< QMF slots to SBR slots step factor */ |
1660 | 360k | { |
1661 | 360k | int maxPos, i, j; |
1662 | 360k | int startPos; |
1663 | 360k | int stopPos; |
1664 | 360k | int tranEnv; |
1665 | 360k | int startPosNoise; |
1666 | 360k | int stopPosNoise; |
1667 | 360k | int nEnvelopes = pFrameInfo->nEnvelopes; |
1668 | 360k | int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes; |
1669 | | |
1670 | 360k | if (nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) return 0; |
1671 | | |
1672 | 360k | if (nNoiseEnvelopes > MAX_NOISE_ENVELOPES) return 0; |
1673 | | |
1674 | 360k | startPos = pFrameInfo->borders[0]; |
1675 | 360k | stopPos = pFrameInfo->borders[nEnvelopes]; |
1676 | 360k | tranEnv = pFrameInfo->tranEnv; |
1677 | 360k | startPosNoise = pFrameInfo->bordersNoise[0]; |
1678 | 360k | stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes]; |
1679 | | |
1680 | 360k | if (overlap < 0 || overlap > (3 * (4))) { |
1681 | 0 | return 0; |
1682 | 0 | } |
1683 | 360k | if (timeStep < 1 || timeStep > (4)) { |
1684 | 0 | return 0; |
1685 | 0 | } |
1686 | 360k | maxPos = numberOfTimeSlots + (overlap / timeStep); |
1687 | | |
1688 | | /* Check that the start and stop positions of the frame are reasonable values. |
1689 | | */ |
1690 | 360k | if ((startPos < 0) || (startPos >= stopPos)) return 0; |
1691 | 360k | if (startPos > maxPos - numberOfTimeSlots) /* First env. must start in or |
1692 | | directly after the overlap |
1693 | | buffer */ |
1694 | 0 | return 0; |
1695 | 360k | if (stopPos < numberOfTimeSlots) /* One complete frame must be ready for |
1696 | | output after processing */ |
1697 | 0 | return 0; |
1698 | 360k | if (stopPos > maxPos) return 0; |
1699 | | |
1700 | | /* Check that the start border for every envelope is strictly later in time |
1701 | | */ |
1702 | 1.00M | for (i = 0; i < nEnvelopes; i++) { |
1703 | 651k | if (pFrameInfo->borders[i] >= pFrameInfo->borders[i + 1]) return 0; |
1704 | 651k | } |
1705 | | |
1706 | | /* Check that the envelope to be shortened is actually among the envelopes */ |
1707 | 355k | if (tranEnv > nEnvelopes) return 0; |
1708 | | |
1709 | | /* Check the noise borders */ |
1710 | 355k | if (nEnvelopes == 1 && nNoiseEnvelopes > 1) return 0; |
1711 | | |
1712 | 355k | if (startPos != startPosNoise || stopPos != stopPosNoise) return 0; |
1713 | | |
1714 | | /* Check that the start border for every noise-envelope is strictly later in |
1715 | | * time*/ |
1716 | 916k | for (i = 0; i < nNoiseEnvelopes; i++) { |
1717 | 560k | if (pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i + 1]) |
1718 | 0 | return 0; |
1719 | 560k | } |
1720 | | |
1721 | | /* Check that every noise border is the same as an envelope border*/ |
1722 | 916k | for (i = 0; i < nNoiseEnvelopes; i++) { |
1723 | 560k | startPosNoise = pFrameInfo->bordersNoise[i]; |
1724 | | |
1725 | 811k | for (j = 0; j < nEnvelopes; j++) { |
1726 | 811k | if (pFrameInfo->borders[j] == startPosNoise) break; |
1727 | 811k | } |
1728 | 560k | if (j == nEnvelopes) return 0; |
1729 | 560k | } |
1730 | | |
1731 | 355k | return 1; |
1732 | 355k | } |