/src/aac/libSBRdec/src/env_extr.cpp
Line | Count | Source |
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 | 15.3k | #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 | 289k | { |
220 | 289k | UINT fsMapped = fs, tableSize = 0; |
221 | 289k | const SR_MAPPING *mappingTable; |
222 | 289k | int i; |
223 | | |
224 | 289k | if (!isUsac) { |
225 | 163k | mappingTable = stdSampleRatesMapping; |
226 | 163k | tableSize = sizeof(stdSampleRatesMapping) / sizeof(SR_MAPPING); |
227 | 163k | } else { |
228 | 126k | mappingTable = stdSampleRatesMappingUsac; |
229 | 126k | tableSize = sizeof(stdSampleRatesMappingUsac) / sizeof(SR_MAPPING); |
230 | 126k | } |
231 | | |
232 | 2.02M | for (i = tableSize - 1; i >= 0; i--) { |
233 | 2.02M | if (fs >= mappingTable[i].fsRangeLo) { |
234 | 289k | fsMapped = mappingTable[i].fsMapped; |
235 | 289k | break; |
236 | 289k | } |
237 | 2.02M | } |
238 | | |
239 | 289k | return (fsMapped); |
240 | 289k | } |
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 | 244k | const int setDefaultHdr) { |
247 | 244k | HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; |
248 | 244k | SBR_ERROR sbrError = SBRDEC_OK; |
249 | 244k | int numAnalysisBands; |
250 | 244k | int sampleRateProc; |
251 | | |
252 | 244k | if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) { |
253 | 163k | sampleRateProc = |
254 | 163k | sbrdec_mapToStdSampleRate(sampleRateOut * downscaleFactor, 0); |
255 | 163k | } else { |
256 | 81.0k | sampleRateProc = sampleRateOut * downscaleFactor; |
257 | 81.0k | } |
258 | | |
259 | 244k | if (sampleRateIn == sampleRateOut) { |
260 | 101k | hHeaderData->sbrProcSmplRate = sampleRateProc << 1; |
261 | 101k | numAnalysisBands = 32; |
262 | 143k | } else { |
263 | 143k | hHeaderData->sbrProcSmplRate = sampleRateProc; |
264 | 143k | if ((sampleRateOut >> 1) == sampleRateIn) { |
265 | | /* 1:2 */ |
266 | 89.7k | numAnalysisBands = 32; |
267 | 89.7k | } else if ((sampleRateOut >> 2) == sampleRateIn) { |
268 | | /* 1:4 */ |
269 | 21.9k | numAnalysisBands = 16; |
270 | 31.3k | } else if ((sampleRateOut * 3) >> 3 == (sampleRateIn * 8) >> 3) { |
271 | | /* 3:8, 3/4 core frame length */ |
272 | 31.2k | numAnalysisBands = 24; |
273 | 31.2k | } else { |
274 | 102 | sbrError = SBRDEC_UNSUPPORTED_CONFIG; |
275 | 102 | goto bail; |
276 | 102 | } |
277 | 143k | } |
278 | 244k | numAnalysisBands /= downscaleFactor; |
279 | | |
280 | 244k | if (setDefaultHdr) { |
281 | | /* Fill in default values first */ |
282 | 242k | hHeaderData->syncState = SBR_NOT_INITIALIZED; |
283 | 242k | hHeaderData->status = 0; |
284 | 242k | hHeaderData->frameErrorFlag = 0; |
285 | | |
286 | 242k | hHeaderData->bs_info.ampResolution = 1; |
287 | 242k | hHeaderData->bs_info.xover_band = 0; |
288 | 242k | hHeaderData->bs_info.sbr_preprocessing = 0; |
289 | 242k | hHeaderData->bs_info.pvc_mode = 0; |
290 | | |
291 | 242k | hHeaderData->bs_data.startFreq = 5; |
292 | 242k | hHeaderData->bs_data.stopFreq = 0; |
293 | 242k | hHeaderData->bs_data.freqScale = |
294 | 242k | 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 | 242k | hHeaderData->bs_data.alterScale = 1; |
300 | 242k | hHeaderData->bs_data.noise_bands = 2; |
301 | 242k | hHeaderData->bs_data.limiterBands = 2; |
302 | 242k | hHeaderData->bs_data.limiterGains = 2; |
303 | 242k | hHeaderData->bs_data.interpolFreq = 1; |
304 | 242k | hHeaderData->bs_data.smoothingLength = 1; |
305 | | |
306 | | /* Patch some entries */ |
307 | 242k | if (sampleRateOut * downscaleFactor >= 96000) { |
308 | 28.3k | hHeaderData->bs_data.startFreq = |
309 | 28.3k | 4; /* having read these frequency values from bit stream before. */ |
310 | 28.3k | hHeaderData->bs_data.stopFreq = 3; |
311 | 213k | } else if (sampleRateOut * downscaleFactor > |
312 | 213k | 24000) { /* Trigger an error if SBR is going to be processed |
313 | | without */ |
314 | 77.7k | hHeaderData->bs_data.startFreq = |
315 | 77.7k | 7; /* having read these frequency values from bit stream before. */ |
316 | 77.7k | hHeaderData->bs_data.stopFreq = 3; |
317 | 77.7k | } |
318 | 242k | } |
319 | | |
320 | 244k | if ((sampleRateOut >> 2) == sampleRateIn) { |
321 | 21.9k | hHeaderData->timeStep = 4; |
322 | 222k | } else { |
323 | 222k | hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2; |
324 | 222k | } |
325 | | |
326 | | /* Setup pointers to frequency band tables */ |
327 | 244k | hFreq->freqBandTable[0] = hFreq->freqBandTableLo; |
328 | 244k | 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 | 244k | hHeaderData->numberTimeSlots = |
333 | 244k | (samplesPerFrame / numAnalysisBands) >> (hHeaderData->timeStep - 1); |
334 | 244k | if (hHeaderData->numberTimeSlots > (16)) { |
335 | 0 | sbrError = SBRDEC_UNSUPPORTED_CONFIG; |
336 | 0 | } |
337 | | |
338 | 244k | hHeaderData->numberOfAnalysisBands = numAnalysisBands; |
339 | 244k | if ((sampleRateOut >> 2) == sampleRateIn) { |
340 | 21.9k | hHeaderData->numberTimeSlots <<= 1; |
341 | 21.9k | } |
342 | | |
343 | 244k | bail: |
344 | 244k | return sbrError; |
345 | 244k | } |
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 | 153k | { |
355 | 153k | 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.73M | for (i = 0; i < MAX_FREQ_COEFFS; i++) |
360 | 8.58M | h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0; |
361 | 919k | for (i = 0; i < MAX_NOISE_COEFFS; i++) |
362 | 766k | h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0; |
363 | 919k | for (i = 0; i < MAX_INVF_BANDS; i++) h_prev_data->sbr_invf_mode[i] = INVF_OFF; |
364 | | |
365 | 153k | h_prev_data->stopPos = timeSlots; |
366 | 153k | h_prev_data->coupling = COUPLING_OFF; |
367 | 153k | h_prev_data->ampRes = 0; |
368 | | |
369 | 153k | FDKmemclear(&h_prev_data->prevFrameInfo, sizeof(h_prev_data->prevFrameInfo)); |
370 | 153k | } |
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 | 709k | const UCHAR configMode) { |
381 | 709k | SBR_HEADER_DATA_BS *pBsData; |
382 | 709k | SBR_HEADER_DATA_BS lastHeader; |
383 | 709k | SBR_HEADER_DATA_BS_INFO lastInfo; |
384 | 709k | int headerExtra1 = 0, headerExtra2 = 0; |
385 | | |
386 | | /* Read and discard new header in config change detection mode */ |
387 | 709k | if (configMode & AC_CM_DET_CFG_CHANGE) { |
388 | 360k | if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { |
389 | | /* ampResolution */ |
390 | 250k | FDKreadBits(hBs, 1); |
391 | 250k | } |
392 | | /* startFreq, stopFreq */ |
393 | 360k | FDKpushFor(hBs, 8); |
394 | 360k | if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { |
395 | | /* xover_band */ |
396 | 250k | FDKreadBits(hBs, 3); |
397 | | /* reserved bits */ |
398 | 250k | FDKreadBits(hBs, 2); |
399 | 250k | } |
400 | 360k | headerExtra1 = FDKreadBit(hBs); |
401 | 360k | headerExtra2 = FDKreadBit(hBs); |
402 | 360k | FDKpushFor(hBs, 5 * headerExtra1 + 6 * headerExtra2); |
403 | | |
404 | 360k | return HEADER_OK; |
405 | 360k | } |
406 | | |
407 | | /* Copy SBR bit stream header to temporary header */ |
408 | 349k | lastHeader = hHeaderData->bs_data; |
409 | 349k | lastInfo = hHeaderData->bs_info; |
410 | | |
411 | | /* Read new header from bitstream */ |
412 | 349k | if ((flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) && !fIsSbrData) { |
413 | 62.0k | pBsData = &hHeaderData->bs_dflt; |
414 | 287k | } else { |
415 | 287k | pBsData = &hHeaderData->bs_data; |
416 | 287k | } |
417 | | |
418 | 349k | if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { |
419 | 202k | hHeaderData->bs_info.ampResolution = FDKreadBits(hBs, 1); |
420 | 202k | } |
421 | | |
422 | 349k | pBsData->startFreq = FDKreadBits(hBs, 4); |
423 | 349k | pBsData->stopFreq = FDKreadBits(hBs, 4); |
424 | | |
425 | 349k | if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { |
426 | 202k | hHeaderData->bs_info.xover_band = FDKreadBits(hBs, 3); |
427 | 202k | FDKreadBits(hBs, 2); |
428 | 202k | } |
429 | | |
430 | 349k | headerExtra1 = FDKreadBits(hBs, 1); |
431 | 349k | headerExtra2 = FDKreadBits(hBs, 1); |
432 | | |
433 | | /* Handle extra header information */ |
434 | 349k | if (headerExtra1) { |
435 | 114k | pBsData->freqScale = FDKreadBits(hBs, 2); |
436 | 114k | pBsData->alterScale = FDKreadBits(hBs, 1); |
437 | 114k | pBsData->noise_bands = FDKreadBits(hBs, 2); |
438 | 234k | } else { |
439 | 234k | pBsData->freqScale = 2; |
440 | 234k | pBsData->alterScale = 1; |
441 | 234k | pBsData->noise_bands = 2; |
442 | 234k | } |
443 | | |
444 | 349k | if (headerExtra2) { |
445 | 121k | pBsData->limiterBands = FDKreadBits(hBs, 2); |
446 | 121k | pBsData->limiterGains = FDKreadBits(hBs, 2); |
447 | 121k | pBsData->interpolFreq = FDKreadBits(hBs, 1); |
448 | 121k | pBsData->smoothingLength = FDKreadBits(hBs, 1); |
449 | 227k | } else { |
450 | 227k | pBsData->limiterBands = 2; |
451 | 227k | pBsData->limiterGains = 2; |
452 | 227k | pBsData->interpolFreq = 1; |
453 | 227k | pBsData->smoothingLength = 1; |
454 | 227k | } |
455 | | |
456 | | /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */ |
457 | 349k | if (hHeaderData->syncState < SBR_HEADER || |
458 | 186k | lastHeader.startFreq != pBsData->startFreq || |
459 | 128k | lastHeader.stopFreq != pBsData->stopFreq || |
460 | 111k | lastHeader.freqScale != pBsData->freqScale || |
461 | 109k | lastHeader.alterScale != pBsData->alterScale || |
462 | 106k | lastHeader.noise_bands != pBsData->noise_bands || |
463 | 246k | lastInfo.xover_band != hHeaderData->bs_info.xover_band) { |
464 | 246k | return HEADER_RESET; /* New settings */ |
465 | 246k | } |
466 | | |
467 | 102k | return HEADER_OK; |
468 | 349k | } |
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 | 404k | HANDLE_FDK_BITSTREAM hBs, const UINT flags) { |
478 | 404k | int i, bitsRead = 0; |
479 | | |
480 | 404k | int add_harmonic_flag = FDKreadBits(hBs, 1); |
481 | 404k | bitsRead++; |
482 | | |
483 | 404k | if (add_harmonic_flag) { |
484 | 46.1k | 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.2k | int readBits = fMin(32, nSfb); |
488 | 92.2k | nSfb -= readBits; |
489 | 92.2k | if (readBits > 0) { |
490 | 47.8k | hFrameData->addHarmonics[i] = FDKreadBits(hBs, readBits) |
491 | 47.8k | << (32 - readBits); |
492 | 47.8k | } else { |
493 | 44.4k | hFrameData->addHarmonics[i] = 0; |
494 | 44.4k | } |
495 | | |
496 | 92.2k | bitsRead += readBits; |
497 | 92.2k | } |
498 | | /* bs_pvc_mode = 0 for Rsvd50 */ |
499 | 46.1k | if (flags & SBRDEC_SYNTAX_USAC) { |
500 | 16.1k | if (hHeaderData->bs_info.pvc_mode) { |
501 | 5.25k | int bs_sinusoidal_position = 31; |
502 | 5.25k | if (FDKreadBit(hBs) /* bs_sinusoidal_position_flag */) { |
503 | 908 | bs_sinusoidal_position = FDKreadBits(hBs, 5); |
504 | 908 | } |
505 | 5.25k | hFrameData->sinusoidal_position = bs_sinusoidal_position; |
506 | 5.25k | } |
507 | 16.1k | } |
508 | 358k | } else { |
509 | 1.07M | for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) |
510 | 716k | hFrameData->addHarmonics[i] = 0; |
511 | 358k | } |
512 | | |
513 | 404k | return (bitsRead); |
514 | 404k | } |
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 | 71.1k | ) { |
531 | 71.1k | INT nBitsLeft; |
532 | 71.1k | int extended_data; |
533 | 71.1k | int i, frameOk = 1; |
534 | | |
535 | 71.1k | extended_data = FDKreadBits(hBs, 1); |
536 | | |
537 | 71.1k | if (extended_data) { |
538 | 27.9k | int cnt; |
539 | 27.9k | int bPsRead = 0; |
540 | | |
541 | 27.9k | cnt = FDKreadBits(hBs, 4); |
542 | 27.9k | if (cnt == (1 << 4) - 1) cnt += FDKreadBits(hBs, 8); |
543 | | |
544 | 27.9k | nBitsLeft = 8 * cnt; |
545 | | |
546 | | /* sanity check for cnt */ |
547 | 27.9k | if (nBitsLeft > (INT)FDKgetValidBits(hBs)) { |
548 | | /* limit nBitsLeft */ |
549 | 3.25k | nBitsLeft = (INT)FDKgetValidBits(hBs); |
550 | | /* set frame error */ |
551 | 3.25k | frameOk = 0; |
552 | 3.25k | } |
553 | | |
554 | 62.2k | while (nBitsLeft > 7) { |
555 | 34.2k | int extension_id = FDKreadBits(hBs, 2); |
556 | 34.2k | nBitsLeft -= 2; |
557 | | |
558 | 34.2k | switch (extension_id) { |
559 | 15.3k | case EXTENSION_ID_PS_CODING: |
560 | | |
561 | | /* Read PS data from bitstream */ |
562 | | |
563 | 15.3k | if (hParametricStereoDec != NULL) { |
564 | 11.1k | if (bPsRead && |
565 | 2.89k | !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot] |
566 | 2.89k | .mpeg.bPsHeaderValid) { |
567 | 356 | cnt = nBitsLeft >> 3; /* number of remaining bytes */ |
568 | 2.46k | for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8); |
569 | 356 | nBitsLeft -= cnt * 8; |
570 | 10.8k | } else { |
571 | 10.8k | nBitsLeft -= |
572 | 10.8k | (INT)ReadPsData(hParametricStereoDec, hBs, nBitsLeft); |
573 | 10.8k | bPsRead = 1; |
574 | 10.8k | } |
575 | 11.1k | } |
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 | 15.3k | break; |
591 | | |
592 | 18.9k | default: |
593 | 18.9k | cnt = nBitsLeft >> 3; /* number of remaining bytes */ |
594 | 257k | for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8); |
595 | 18.9k | nBitsLeft -= cnt * 8; |
596 | 18.9k | break; |
597 | 34.2k | } |
598 | 34.2k | } |
599 | | |
600 | 27.9k | if (nBitsLeft < 0) { |
601 | 3.77k | frameOk = 0; |
602 | 3.77k | goto bail; |
603 | 24.1k | } else { |
604 | | /* Read fill bits for byte alignment */ |
605 | 24.1k | FDKreadBits(hBs, nBitsLeft); |
606 | 24.1k | } |
607 | 27.9k | } |
608 | | |
609 | 71.1k | bail: |
610 | 71.1k | return (frameOk); |
611 | 71.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 | 311k | const int overlap) { |
624 | 311k | int i, bs_coupling = COUPLING_OFF; |
625 | 311k | const int nCh = (hFrameDataRight == NULL) ? 1 : 2; |
626 | | |
627 | 311k | if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) { |
628 | | /* Reserved bits */ |
629 | 79.7k | if (FDKreadBits(hBs, 1)) { /* bs_data_extra */ |
630 | 24.3k | FDKreadBits(hBs, 4); |
631 | 24.3k | if ((flags & SBRDEC_SYNTAX_SCAL) || (nCh == 2)) { |
632 | 21.1k | FDKreadBits(hBs, 4); |
633 | 21.1k | } |
634 | 24.3k | } |
635 | 79.7k | } |
636 | | |
637 | 311k | if (nCh == 2) { |
638 | | /* Read coupling flag */ |
639 | 112k | bs_coupling = FDKreadBits(hBs, 1); |
640 | 112k | if (bs_coupling) { |
641 | 31.8k | hFrameDataLeft->coupling = COUPLING_LEVEL; |
642 | 31.8k | hFrameDataRight->coupling = COUPLING_BAL; |
643 | 80.3k | } else { |
644 | 80.3k | hFrameDataLeft->coupling = COUPLING_OFF; |
645 | 80.3k | hFrameDataRight->coupling = COUPLING_OFF; |
646 | 80.3k | } |
647 | 199k | } else { |
648 | 199k | if (flags & SBRDEC_SYNTAX_SCAL) { |
649 | 24.3k | FDKreadBits(hBs, 1); /* bs_coupling */ |
650 | 24.3k | } |
651 | 199k | hFrameDataLeft->coupling = COUPLING_OFF; |
652 | 199k | } |
653 | | |
654 | 311k | if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { |
655 | 231k | if (flags & SBRDEC_USAC_HARMONICSBR) { |
656 | 58.2k | hFrameDataLeft->sbrPatchingMode = FDKreadBit(hBs); |
657 | 58.2k | if (hFrameDataLeft->sbrPatchingMode == 0) { |
658 | 35.7k | hFrameDataLeft->sbrOversamplingFlag = FDKreadBit(hBs); |
659 | 35.7k | if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */ |
660 | 4.71k | hFrameDataLeft->sbrPitchInBins = FDKreadBits(hBs, 7); |
661 | 31.0k | } else { |
662 | 31.0k | hFrameDataLeft->sbrPitchInBins = 0; |
663 | 31.0k | } |
664 | 35.7k | } else { |
665 | 22.4k | hFrameDataLeft->sbrOversamplingFlag = 0; |
666 | 22.4k | hFrameDataLeft->sbrPitchInBins = 0; |
667 | 22.4k | } |
668 | | |
669 | 58.2k | if (nCh == 2) { |
670 | 36.4k | if (bs_coupling) { |
671 | 18.1k | hFrameDataRight->sbrPatchingMode = hFrameDataLeft->sbrPatchingMode; |
672 | 18.1k | hFrameDataRight->sbrOversamplingFlag = |
673 | 18.1k | hFrameDataLeft->sbrOversamplingFlag; |
674 | 18.1k | hFrameDataRight->sbrPitchInBins = hFrameDataLeft->sbrPitchInBins; |
675 | 18.2k | } else { |
676 | 18.2k | hFrameDataRight->sbrPatchingMode = FDKreadBit(hBs); |
677 | 18.2k | if (hFrameDataRight->sbrPatchingMode == 0) { |
678 | 11.3k | hFrameDataRight->sbrOversamplingFlag = FDKreadBit(hBs); |
679 | 11.3k | if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */ |
680 | 2.43k | hFrameDataRight->sbrPitchInBins = FDKreadBits(hBs, 7); |
681 | 8.94k | } else { |
682 | 8.94k | hFrameDataRight->sbrPitchInBins = 0; |
683 | 8.94k | } |
684 | 11.3k | } else { |
685 | 6.91k | hFrameDataRight->sbrOversamplingFlag = 0; |
686 | 6.91k | hFrameDataRight->sbrPitchInBins = 0; |
687 | 6.91k | } |
688 | 18.2k | } |
689 | 36.4k | } |
690 | 173k | } else { |
691 | 173k | if (nCh == 2) { |
692 | 43.0k | hFrameDataRight->sbrPatchingMode = 1; |
693 | 43.0k | hFrameDataRight->sbrOversamplingFlag = 0; |
694 | 43.0k | hFrameDataRight->sbrPitchInBins = 0; |
695 | 43.0k | } |
696 | | |
697 | 173k | hFrameDataLeft->sbrPatchingMode = 1; |
698 | 173k | hFrameDataLeft->sbrOversamplingFlag = 0; |
699 | 173k | hFrameDataLeft->sbrPitchInBins = 0; |
700 | 173k | } |
701 | 231k | } else { |
702 | 79.7k | if (nCh == 2) { |
703 | 32.7k | hFrameDataRight->sbrPatchingMode = 1; |
704 | 32.7k | hFrameDataRight->sbrOversamplingFlag = 0; |
705 | 32.7k | hFrameDataRight->sbrPitchInBins = 0; |
706 | 32.7k | } |
707 | | |
708 | 79.7k | hFrameDataLeft->sbrPatchingMode = 1; |
709 | 79.7k | hFrameDataLeft->sbrOversamplingFlag = 0; |
710 | 79.7k | hFrameDataLeft->sbrPitchInBins = 0; |
711 | 79.7k | } |
712 | | |
713 | | /* |
714 | | sbr_grid(): Grid control |
715 | | */ |
716 | 311k | if (hHeaderData->bs_info.pvc_mode) { |
717 | 124k | FDK_ASSERT(nCh == 1); /* PVC not possible for CPE */ |
718 | 124k | if (!extractPvcFrameInfo(hBs, hHeaderData, hFrameDataLeft, |
719 | 124k | hFrameDataLeftPrev, pvc_mode_last, flags)) |
720 | 870 | return 0; |
721 | | |
722 | 123k | if (!checkFrameInfo(&hFrameDataLeft->frameInfo, |
723 | 123k | hHeaderData->numberTimeSlots, overlap, |
724 | 123k | hHeaderData->timeStep)) |
725 | 417 | return 0; |
726 | 187k | } else { |
727 | 187k | if (!extractFrameInfo(hBs, hHeaderData, hFrameDataLeft, 1, flags)) return 0; |
728 | | |
729 | 182k | if (!checkFrameInfo(&hFrameDataLeft->frameInfo, |
730 | 182k | hHeaderData->numberTimeSlots, overlap, |
731 | 182k | hHeaderData->timeStep)) |
732 | 3.30k | return 0; |
733 | 182k | } |
734 | 301k | if (nCh == 2) { |
735 | 108k | if (hFrameDataLeft->coupling) { |
736 | 30.3k | FDKmemcpy(&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo, |
737 | 30.3k | sizeof(FRAME_INFO)); |
738 | 30.3k | hFrameDataRight->ampResolutionCurrentFrame = |
739 | 30.3k | hFrameDataLeft->ampResolutionCurrentFrame; |
740 | 78.1k | } else { |
741 | 78.1k | if (!extractFrameInfo(hBs, hHeaderData, hFrameDataRight, 2, flags)) |
742 | 1.66k | return 0; |
743 | | |
744 | 76.4k | if (!checkFrameInfo(&hFrameDataRight->frameInfo, |
745 | 76.4k | hHeaderData->numberTimeSlots, overlap, |
746 | 76.4k | hHeaderData->timeStep)) |
747 | 926 | return 0; |
748 | 76.4k | } |
749 | 108k | } |
750 | | |
751 | | /* |
752 | | sbr_dtdf(): Fetch domain vectors (time or frequency direction for |
753 | | delta-coding) |
754 | | */ |
755 | 298k | sbrGetDirectionControlData(hFrameDataLeft, hBs, flags, |
756 | 298k | hHeaderData->bs_info.pvc_mode); |
757 | 298k | if (nCh == 2) { |
758 | 105k | sbrGetDirectionControlData(hFrameDataRight, hBs, flags, 0); |
759 | 105k | } |
760 | | |
761 | | /* sbr_invf() */ |
762 | 1.00M | for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { |
763 | 704k | hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2); |
764 | 704k | } |
765 | 298k | if (nCh == 2) { |
766 | 105k | if (hFrameDataLeft->coupling) { |
767 | 101k | for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { |
768 | 70.7k | hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i]; |
769 | 70.7k | } |
770 | 75.5k | } else { |
771 | 287k | for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { |
772 | 212k | hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2); |
773 | 212k | } |
774 | 75.5k | } |
775 | 105k | } |
776 | | |
777 | 298k | if (nCh == 1) { |
778 | 193k | if (hHeaderData->bs_info.pvc_mode) { |
779 | 122k | if (!sbrGetPvcEnvelope(hHeaderData, hFrameDataLeft, hBs, flags, |
780 | 122k | hHeaderData->bs_info.pvc_mode)) |
781 | 556 | return 0; |
782 | 122k | } else if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) |
783 | 0 | return 0; |
784 | | |
785 | 192k | sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs); |
786 | 192k | } else if (hFrameDataLeft->coupling) { |
787 | 30.3k | if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) { |
788 | 0 | return 0; |
789 | 0 | } |
790 | | |
791 | 30.3k | sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs); |
792 | | |
793 | 30.3k | if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) { |
794 | 0 | return 0; |
795 | 0 | } |
796 | 30.3k | sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs); |
797 | 75.5k | } else { /* nCh == 2 && no coupling */ |
798 | | |
799 | 75.5k | if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) return 0; |
800 | | |
801 | 75.5k | if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) return 0; |
802 | | |
803 | 75.5k | sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs); |
804 | | |
805 | 75.5k | sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs); |
806 | 75.5k | } |
807 | | |
808 | 298k | sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs, flags); |
809 | 298k | if (nCh == 2) { |
810 | 105k | sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs, flags); |
811 | 105k | } |
812 | | |
813 | 298k | if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) { |
814 | 71.1k | if (!extractExtendedData(hHeaderData, hBs, hParametricStereoDec)) { |
815 | 5.95k | return 0; |
816 | 5.95k | } |
817 | 71.1k | } |
818 | | |
819 | 292k | return 1; |
820 | 298k | } |
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 | 404k | { |
831 | 404k | int i; |
832 | 404k | int indepFlag = 0; |
833 | | |
834 | 404k | if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { |
835 | 305k | indepFlag = flags & SBRDEC_USAC_INDEP; |
836 | 305k | } |
837 | | |
838 | 404k | if (bs_pvc_mode == 0) { |
839 | 282k | i = 0; |
840 | 282k | if (indepFlag) { |
841 | 144k | h_frame_data->domain_vec[i++] = 0; |
842 | 144k | } |
843 | 659k | for (; i < h_frame_data->frameInfo.nEnvelopes; i++) { |
844 | 377k | h_frame_data->domain_vec[i] = FDKreadBits(hBs, 1); |
845 | 377k | } |
846 | 282k | } |
847 | | |
848 | 404k | i = 0; |
849 | 404k | if (indepFlag) { |
850 | 241k | h_frame_data->domain_vec_noise[i++] = 0; |
851 | 241k | } |
852 | 797k | for (; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) { |
853 | 392k | h_frame_data->domain_vec_noise[i] = FDKreadBits(hBs, 1); |
854 | 392k | } |
855 | 404k | } |
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 | 404k | { |
865 | 404k | int i, j; |
866 | 404k | int delta; |
867 | 404k | COUPLING_MODE coupling; |
868 | 404k | int noNoiseBands = hHeaderData->freqBandData.nNfb; |
869 | | |
870 | 404k | Huffman hcb_noiseF; |
871 | 404k | Huffman hcb_noise; |
872 | 404k | int envDataTableCompFactor; |
873 | | |
874 | 404k | coupling = h_frame_data->coupling; |
875 | | |
876 | | /* |
877 | | Select huffman codebook depending on coupling mode |
878 | | */ |
879 | 404k | if (coupling == COUPLING_BAL) { |
880 | 30.3k | hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T; |
881 | 30.3k | hcb_noiseF = |
882 | 30.3k | (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F" |
883 | | */ |
884 | 30.3k | envDataTableCompFactor = 1; |
885 | 373k | } else { |
886 | 373k | hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T; |
887 | 373k | hcb_noiseF = |
888 | 373k | (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F" |
889 | | */ |
890 | 373k | envDataTableCompFactor = 0; |
891 | 373k | } |
892 | | |
893 | | /* |
894 | | Read raw noise-envelope data |
895 | | */ |
896 | 1.03M | for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) { |
897 | 632k | if (h_frame_data->domain_vec_noise[i] == 0) { |
898 | 468k | if (coupling == COUPLING_BAL) { |
899 | 40.5k | h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] = |
900 | 40.5k | (FIXP_SGL)(((int)FDKreadBits(hBs, 5)) << envDataTableCompFactor); |
901 | 427k | } else { |
902 | 427k | h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] = |
903 | 427k | (FIXP_SGL)(int)FDKreadBits(hBs, 5); |
904 | 427k | } |
905 | | |
906 | 1.19M | for (j = 1; j < noNoiseBands; j++) { |
907 | 724k | delta = DecodeHuffmanCW(hcb_noiseF, hBs); |
908 | 724k | h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] = |
909 | 724k | (FIXP_SGL)(delta << envDataTableCompFactor); |
910 | 724k | } |
911 | 468k | } else { |
912 | 498k | 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 | 164k | } |
918 | 632k | } |
919 | 404k | } |
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 | 122k | const UINT flags, const UINT pvcMode) { |
932 | 122k | int divMode, nsMode; |
933 | 122k | int indepFlag = flags & SBRDEC_USAC_INDEP; |
934 | 122k | UCHAR *pvcID = h_frame_data->pvcID; |
935 | | |
936 | 122k | divMode = FDKreadBits(hBs, PVC_DIVMODE_BITS); |
937 | 122k | nsMode = FDKreadBit(hBs); |
938 | 122k | FDK_ASSERT((pvcMode == 1) || (pvcMode == 2)); |
939 | 122k | h_frame_data->ns = mapNsMode2ns[pvcMode - 1][nsMode]; |
940 | | |
941 | 122k | if (divMode <= 3) { |
942 | 23.6k | int i, k = 1, sum_length = 0, reuse_pcvID; |
943 | | |
944 | | /* special treatment for first time slot k=0 */ |
945 | 23.6k | indepFlag ? (reuse_pcvID = 0) : (reuse_pcvID = FDKreadBit(hBs)); |
946 | 23.6k | if (reuse_pcvID) { |
947 | 6.43k | pvcID[0] = hHeaderData->pvcIDprev; |
948 | 17.1k | } else { |
949 | 17.1k | pvcID[0] = FDKreadBits(hBs, PVC_PVCID_BITS); |
950 | 17.1k | } |
951 | | |
952 | | /* other time slots k>0 */ |
953 | 44.6k | for (i = 0; i < divMode; i++) { |
954 | 21.6k | int length, numBits = 4; |
955 | | |
956 | 21.6k | if (sum_length >= 13) { |
957 | 1.03k | numBits = 1; |
958 | 20.5k | } else if (sum_length >= 11) { |
959 | 255 | numBits = 2; |
960 | 20.3k | } else if (sum_length >= 7) { |
961 | 1.78k | numBits = 3; |
962 | 1.78k | } |
963 | | |
964 | 21.6k | length = FDKreadBits(hBs, numBits); |
965 | 21.6k | sum_length += length + 1; |
966 | 21.6k | if (sum_length >= PVC_NTIMESLOT) { |
967 | 556 | return 0; /* parse error */ |
968 | 556 | } |
969 | 87.4k | for (; length--; k++) { |
970 | 66.3k | pvcID[k] = pvcID[k - 1]; |
971 | 66.3k | } |
972 | 21.0k | pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS); |
973 | 21.0k | } |
974 | 285k | for (; k < 16; k++) { |
975 | 262k | pvcID[k] = pvcID[k - 1]; |
976 | 262k | } |
977 | 99.2k | } else { /* divMode >= 4 */ |
978 | 99.2k | int num_grid_info, fixed_length, grid_info, j, k = 0; |
979 | | |
980 | 99.2k | divMode -= 4; |
981 | 99.2k | num_grid_info = 2 << divMode; |
982 | 99.2k | fixed_length = 8 >> divMode; |
983 | 99.2k | FDK_ASSERT(num_grid_info * fixed_length == PVC_NTIMESLOT); |
984 | | |
985 | | /* special treatment for first time slot k=0 */ |
986 | 99.2k | indepFlag ? (grid_info = 1) : (grid_info = FDKreadBit(hBs)); |
987 | 99.2k | if (grid_info) { |
988 | 94.1k | pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS); |
989 | 94.1k | } else { |
990 | 5.04k | pvcID[k++] = hHeaderData->pvcIDprev; |
991 | 5.04k | } |
992 | 99.2k | j = fixed_length - 1; |
993 | 769k | for (; j--; k++) { |
994 | 670k | pvcID[k] = pvcID[k - 1]; |
995 | 670k | } |
996 | 99.2k | num_grid_info--; |
997 | | |
998 | | /* other time slots k>0 */ |
999 | 236k | for (; num_grid_info--;) { |
1000 | 137k | j = fixed_length; |
1001 | 137k | grid_info = FDKreadBit(hBs); |
1002 | 137k | if (grid_info) { |
1003 | 13.5k | pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS); |
1004 | 13.5k | j--; |
1005 | 13.5k | } |
1006 | 941k | for (; j--; k++) { |
1007 | 803k | pvcID[k] = pvcID[k - 1]; |
1008 | 803k | } |
1009 | 137k | } |
1010 | 99.2k | } |
1011 | | |
1012 | 122k | hHeaderData->pvcIDprev = pvcID[PVC_NTIMESLOT - 1]; |
1013 | | |
1014 | | /* usage of PVC excludes inter-TES tool */ |
1015 | 122k | h_frame_data->iTESactive = (UCHAR)0; |
1016 | | |
1017 | 122k | return 1; |
1018 | 122k | } |
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 | 282k | const UINT flags) { |
1027 | 282k | int i, j; |
1028 | 282k | UCHAR no_band[MAX_ENVELOPES]; |
1029 | 282k | int delta = 0; |
1030 | 282k | int offset = 0; |
1031 | 282k | COUPLING_MODE coupling = h_frame_data->coupling; |
1032 | 282k | int ampRes = hHeaderData->bs_info.ampResolution; |
1033 | 282k | int nEnvelopes = h_frame_data->frameInfo.nEnvelopes; |
1034 | 282k | int envDataTableCompFactor; |
1035 | 282k | int start_bits, start_bits_balance; |
1036 | 282k | Huffman hcb_t, hcb_f; |
1037 | | |
1038 | 282k | h_frame_data->nScaleFactors = 0; |
1039 | | |
1040 | 282k | if ((h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1)) { |
1041 | 86.4k | if (flags & SBRDEC_ELD_GRID) |
1042 | 28.9k | ampRes = h_frame_data->ampResolutionCurrentFrame; |
1043 | 57.5k | else |
1044 | 57.5k | ampRes = 0; |
1045 | 86.4k | } |
1046 | 282k | h_frame_data->ampResolutionCurrentFrame = ampRes; |
1047 | | |
1048 | | /* |
1049 | | Set number of bits for first value depending on amplitude resolution |
1050 | | */ |
1051 | 282k | if (ampRes == 1) { |
1052 | 75.8k | start_bits = 6; |
1053 | 75.8k | start_bits_balance = 5; |
1054 | 206k | } else { |
1055 | 206k | start_bits = 7; |
1056 | 206k | start_bits_balance = 6; |
1057 | 206k | } |
1058 | | |
1059 | | /* |
1060 | | Calculate number of values for each envelope and alltogether |
1061 | | */ |
1062 | 804k | for (i = 0; i < nEnvelopes; i++) { |
1063 | 522k | no_band[i] = |
1064 | 522k | hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]]; |
1065 | 522k | h_frame_data->nScaleFactors += no_band[i]; |
1066 | 522k | } |
1067 | 282k | 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 | 282k | if (coupling == COUPLING_BAL) { |
1073 | 30.3k | envDataTableCompFactor = 1; |
1074 | 30.3k | if (ampRes == 0) { |
1075 | 24.9k | hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T; |
1076 | 24.9k | hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F; |
1077 | 24.9k | } else { |
1078 | 5.42k | hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T; |
1079 | 5.42k | hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; |
1080 | 5.42k | } |
1081 | 251k | } else { |
1082 | 251k | envDataTableCompFactor = 0; |
1083 | 251k | if (ampRes == 0) { |
1084 | 181k | hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T; |
1085 | 181k | hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F; |
1086 | 181k | } else { |
1087 | 70.4k | hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T; |
1088 | 70.4k | hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; |
1089 | 70.4k | } |
1090 | 251k | } |
1091 | | |
1092 | 282k | h_frame_data->iTESactive = (UCHAR)0; /* disable inter-TES by default */ |
1093 | | /* |
1094 | | Now read raw envelope data |
1095 | | */ |
1096 | 804k | for (j = 0, offset = 0; j < nEnvelopes; j++) { |
1097 | 522k | if (h_frame_data->domain_vec[j] == 0) { |
1098 | 375k | if (coupling == COUPLING_BAL) { |
1099 | 55.5k | h_frame_data->iEnvelope[offset] = |
1100 | 55.5k | (FIXP_SGL)(((int)FDKreadBits(hBs, start_bits_balance)) |
1101 | 55.5k | << envDataTableCompFactor); |
1102 | 320k | } else { |
1103 | 320k | h_frame_data->iEnvelope[offset] = |
1104 | 320k | (FIXP_SGL)(int)FDKreadBits(hBs, start_bits); |
1105 | 320k | } |
1106 | 375k | } |
1107 | | |
1108 | 4.18M | for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) { |
1109 | 3.66M | if (h_frame_data->domain_vec[j] == 0) { |
1110 | 2.43M | delta = DecodeHuffmanCW(hcb_f, hBs); |
1111 | 2.43M | } else { |
1112 | 1.23M | delta = DecodeHuffmanCW(hcb_t, hBs); |
1113 | 1.23M | } |
1114 | | |
1115 | 3.66M | h_frame_data->iEnvelope[offset + i] = |
1116 | 3.66M | (FIXP_SGL)(delta << envDataTableCompFactor); |
1117 | 3.66M | } |
1118 | 522k | if ((flags & SBRDEC_SYNTAX_USAC) && (flags & SBRDEC_USAC_ITES)) { |
1119 | 140k | int bs_temp_shape = FDKreadBit(hBs); |
1120 | 140k | FDK_ASSERT(j < 8); |
1121 | 140k | h_frame_data->iTESactive |= (UCHAR)(bs_temp_shape << j); |
1122 | 140k | if (bs_temp_shape) { |
1123 | 36.2k | h_frame_data->interTempShapeMode[j] = |
1124 | 36.2k | FDKread2Bits(hBs); /* bs_inter_temp_shape_mode */ |
1125 | 104k | } else { |
1126 | 104k | h_frame_data->interTempShapeMode[j] = 0; |
1127 | 104k | } |
1128 | 140k | } |
1129 | 522k | offset += no_band[j]; |
1130 | 522k | } |
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 | 282k | return 1; |
1141 | 282k | } |
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 | 8.05k | int numberTimeSlots, const UINT flags) { |
1152 | 8.05k | int nEnv, i, tranIdx; |
1153 | 8.05k | const int *pTable; |
1154 | | |
1155 | 8.05k | if (tranPosInternal >= numberTimeSlots) { |
1156 | 0 | return 0; |
1157 | 0 | } |
1158 | | |
1159 | 8.05k | switch (numberTimeSlots) { |
1160 | 0 | case 8: |
1161 | 0 | pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal]; |
1162 | 0 | break; |
1163 | 5.74k | case 15: |
1164 | 5.74k | pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal]; |
1165 | 5.74k | break; |
1166 | 2.31k | case 16: |
1167 | 2.31k | pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal]; |
1168 | 2.31k | break; |
1169 | 0 | default: |
1170 | 0 | return 0; |
1171 | 8.05k | } |
1172 | | |
1173 | | /* look number of envelopes in table */ |
1174 | 8.05k | nEnv = pTable[0]; |
1175 | | /* look up envelope distribution in table */ |
1176 | 20.4k | for (i = 1; i < nEnv; i++) hSbrFrameInfo->borders[i] = pTable[i + 2]; |
1177 | | /* open and close frame border */ |
1178 | 8.05k | hSbrFrameInfo->borders[0] = 0; |
1179 | 8.05k | hSbrFrameInfo->borders[nEnv] = numberTimeSlots; |
1180 | 8.05k | hSbrFrameInfo->nEnvelopes = nEnv; |
1181 | | |
1182 | | /* transient idx */ |
1183 | 8.05k | tranIdx = hSbrFrameInfo->tranEnv = pTable[1]; |
1184 | | |
1185 | | /* add noise floors */ |
1186 | 8.05k | hSbrFrameInfo->bordersNoise[0] = 0; |
1187 | 8.05k | hSbrFrameInfo->bordersNoise[1] = |
1188 | 8.05k | hSbrFrameInfo->borders[tranIdx ? tranIdx : 1]; |
1189 | 8.05k | hSbrFrameInfo->bordersNoise[2] = numberTimeSlots; |
1190 | | /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2) |
1191 | | */ |
1192 | 8.05k | hSbrFrameInfo->nNoiseEnvelopes = 2; |
1193 | | |
1194 | 8.05k | return 1; |
1195 | 8.05k | } |
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 | 10.0k | int timeSlots, const UINT flags) { |
1208 | 10.0k | FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo; |
1209 | 10.0k | INT numberTimeSlots = hHeaderData->numberTimeSlots; |
1210 | 10.0k | INT temp = 0, k; |
1211 | | |
1212 | | /* FIXFIXonly framing case */ |
1213 | 10.0k | h_frame_data->frameInfo.frameClass = 0; |
1214 | | |
1215 | | /* get the transient position from the bitstream */ |
1216 | 10.0k | switch (timeSlots) { |
1217 | 0 | case 8: |
1218 | | /* 3bit transient position (temp={0;..;7}) */ |
1219 | 0 | temp = FDKreadBits(hBitBuf, 3); |
1220 | 0 | break; |
1221 | | |
1222 | 2.31k | case 16: |
1223 | 10.0k | case 15: |
1224 | | /* 4bit transient position (temp={0;..;15}) */ |
1225 | 10.0k | temp = FDKreadBits(hBitBuf, 4); |
1226 | 10.0k | break; |
1227 | | |
1228 | 0 | default: |
1229 | 0 | return 0; |
1230 | 10.0k | } |
1231 | | |
1232 | | /* For "case 15" only*/ |
1233 | 10.0k | if (temp >= timeSlots) { |
1234 | 2.01k | return 0; |
1235 | 2.01k | } |
1236 | | |
1237 | | /* calculate borders according to the transient position */ |
1238 | 8.05k | if (!generateFixFixOnly(pFrameInfo, temp, numberTimeSlots, flags)) { |
1239 | 0 | return 0; |
1240 | 0 | } |
1241 | | |
1242 | | /* decode freq res: */ |
1243 | 28.5k | for (k = 0; k < pFrameInfo->nEnvelopes; k++) { |
1244 | 20.4k | pFrameInfo->freqRes[k] = |
1245 | 20.4k | (UCHAR)FDKreadBits(hBitBuf, 1); /* f = F [1 bits] */ |
1246 | 20.4k | } |
1247 | | |
1248 | 8.05k | return 1; |
1249 | 8.05k | } |
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 | 124k | const UINT flags) { |
1265 | 124k | FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo; |
1266 | 124k | FRAME_INFO *pPrevFrameInfo = &h_prev_frame_data->prevFrameInfo; |
1267 | 124k | int bs_var_len_hf, bs_noise_position; |
1268 | 124k | bs_noise_position = FDKreadBits(hBs, 4); /* SBR_PVC_NOISEPOSITION_BITS 4 */ |
1269 | 124k | bs_var_len_hf = FDKreadBit(hBs); |
1270 | 124k | pFrameInfo->noisePosition = bs_noise_position; |
1271 | 124k | pFrameInfo->tranEnv = -1; |
1272 | | |
1273 | | /* Init for bs_noise_position == 0 in case a parse error is found below. */ |
1274 | 124k | pFrameInfo->nEnvelopes = 1; |
1275 | 124k | pFrameInfo->nNoiseEnvelopes = 1; |
1276 | 124k | pFrameInfo->freqRes[0] = 0; |
1277 | | |
1278 | 124k | if (bs_var_len_hf) { /* 1 or 3 Bits */ |
1279 | 100k | pFrameInfo->varLength = FDKreadBits(hBs, 2) + 1; |
1280 | 100k | if (pFrameInfo->varLength > 3) { |
1281 | 870 | pFrameInfo->varLength = |
1282 | 870 | 0; /* assume bs_var_len_hf == 0 in case of error */ |
1283 | 870 | return 0; /* reserved value -> parse error */ |
1284 | 870 | } |
1285 | 100k | } else { |
1286 | 23.8k | pFrameInfo->varLength = 0; |
1287 | 23.8k | } |
1288 | | |
1289 | 123k | if (bs_noise_position) { |
1290 | 102k | pFrameInfo->nEnvelopes = 2; |
1291 | 102k | pFrameInfo->nNoiseEnvelopes = 2; |
1292 | 102k | FDKmemclear(pFrameInfo->freqRes, sizeof(pFrameInfo->freqRes)); |
1293 | 102k | } |
1294 | | |
1295 | | /* frame border calculation */ |
1296 | 123k | if (hHeaderData->bs_info.pvc_mode > 0) { |
1297 | | /* See "7.5.1.4 HF adjustment of SBR envelope scalefactors" for reference. |
1298 | | */ |
1299 | | |
1300 | 123k | FDK_ASSERT((pFrameInfo->nEnvelopes == 1) || (pFrameInfo->nEnvelopes == 2)); |
1301 | | |
1302 | | /* left timeborder-offset: use the timeborder of prev SBR frame */ |
1303 | 123k | if (pPrevFrameInfo->nEnvelopes > 0) { |
1304 | 117k | pFrameInfo->borders[0] = |
1305 | 117k | pPrevFrameInfo->borders[pPrevFrameInfo->nEnvelopes] - PVC_NTIMESLOT; |
1306 | 117k | FDK_ASSERT(pFrameInfo->borders[0] <= 3); |
1307 | 117k | } else { |
1308 | 5.51k | pFrameInfo->borders[0] = 0; |
1309 | 5.51k | } |
1310 | | |
1311 | | /* right timeborder-offset: */ |
1312 | 123k | pFrameInfo->borders[pFrameInfo->nEnvelopes] = 16 + pFrameInfo->varLength; |
1313 | | |
1314 | 123k | if (pFrameInfo->nEnvelopes == 2) { |
1315 | 102k | pFrameInfo->borders[1] = pFrameInfo->noisePosition; |
1316 | 102k | } |
1317 | | |
1318 | | /* Calculation of PVC time borders t_EPVC */ |
1319 | 123k | 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 | 11.2k | pFrameInfo->pvcBorders[0] = pFrameInfo->borders[0]; |
1323 | 111k | } else { |
1324 | 111k | pFrameInfo->pvcBorders[0] = 0; |
1325 | 111k | } |
1326 | 123k | if (pFrameInfo->nEnvelopes == 2) { |
1327 | 102k | pFrameInfo->pvcBorders[1] = pFrameInfo->borders[1]; |
1328 | 102k | } |
1329 | 123k | pFrameInfo->pvcBorders[pFrameInfo->nEnvelopes] = 16; |
1330 | | |
1331 | | /* calculation of SBR noise-floor time-border vector: */ |
1332 | 472k | for (INT i = 0; i <= pFrameInfo->nNoiseEnvelopes; i++) { |
1333 | 349k | pFrameInfo->bordersNoise[i] = pFrameInfo->borders[i]; |
1334 | 349k | } |
1335 | | |
1336 | 123k | pFrameInfo->tranEnv = -1; /* tranEnv not used */ |
1337 | 123k | } |
1338 | 123k | return 1; |
1339 | 123k | } |
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 | 265k | const UINT nrOfChannels, const UINT flags) { |
1351 | 265k | FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo; |
1352 | 265k | int numberTimeSlots = hHeaderData->numberTimeSlots; |
1353 | 265k | int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0, k, p, aL, aR, nL, nR, |
1354 | 265k | temp = 0, staticFreqRes; |
1355 | 265k | UCHAR frameClass; |
1356 | | |
1357 | 265k | 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 | 49.5k | frameClass = FDKreadBits(hBs, 1); /* frameClass = [1 bit] */ |
1361 | 49.5k | if (frameClass == 1) { |
1362 | | /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal |
1363 | | * SBR-Grid for FIXIFX */ |
1364 | | /* extract the AACLD-Sbr-Grid */ |
1365 | 10.0k | pFrameInfo->frameClass = frameClass; |
1366 | 10.0k | int err = 1; |
1367 | 10.0k | err = extractLowDelayGrid(hBs, hHeaderData, h_frame_data, numberTimeSlots, |
1368 | 10.0k | flags); |
1369 | 10.0k | return err; |
1370 | 10.0k | } |
1371 | 216k | } else { |
1372 | 216k | frameClass = FDKreadBits(hBs, 2); /* frameClass = C [2 bits] */ |
1373 | 216k | } |
1374 | | |
1375 | 255k | switch (frameClass) { |
1376 | 134k | case 0: |
1377 | 134k | temp = FDKreadBits(hBs, 2); /* E [2 bits ] */ |
1378 | 134k | nEnv = (int)(1 << temp); /* E -> e */ |
1379 | | |
1380 | 134k | if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1)) |
1381 | 28.6k | h_frame_data->ampResolutionCurrentFrame = |
1382 | 28.6k | FDKreadBits(hBs, 1); /* new ELD Syntax 07-11-09 */ |
1383 | | |
1384 | 134k | staticFreqRes = FDKreadBits(hBs, 1); |
1385 | | |
1386 | 134k | if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { |
1387 | 80.8k | if (nEnv > MAX_ENVELOPES_USAC) return 0; |
1388 | 80.8k | } else |
1389 | | |
1390 | 53.4k | b = nEnv + 1; |
1391 | 134k | switch (nEnv) { |
1392 | 79.5k | case 1: |
1393 | 79.5k | switch (numberTimeSlots) { |
1394 | 26.3k | case 15: |
1395 | 26.3k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15, |
1396 | 26.3k | sizeof(FRAME_INFO)); |
1397 | 26.3k | break; |
1398 | 53.1k | case 16: |
1399 | 53.1k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16, |
1400 | 53.1k | sizeof(FRAME_INFO)); |
1401 | 53.1k | break; |
1402 | 0 | default: |
1403 | 0 | FDK_ASSERT(0); |
1404 | 79.5k | } |
1405 | 79.5k | break; |
1406 | 79.5k | case 2: |
1407 | 38.3k | switch (numberTimeSlots) { |
1408 | 5.92k | case 15: |
1409 | 5.92k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15, |
1410 | 5.92k | sizeof(FRAME_INFO)); |
1411 | 5.92k | break; |
1412 | 32.4k | case 16: |
1413 | 32.4k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16, |
1414 | 32.4k | sizeof(FRAME_INFO)); |
1415 | 32.4k | break; |
1416 | 0 | default: |
1417 | 0 | FDK_ASSERT(0); |
1418 | 38.3k | } |
1419 | 38.3k | break; |
1420 | 38.3k | case 4: |
1421 | 8.27k | switch (numberTimeSlots) { |
1422 | 4.80k | case 15: |
1423 | 4.80k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15, |
1424 | 4.80k | sizeof(FRAME_INFO)); |
1425 | 4.80k | break; |
1426 | 3.47k | case 16: |
1427 | 3.47k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16, |
1428 | 3.47k | sizeof(FRAME_INFO)); |
1429 | 3.47k | break; |
1430 | 0 | default: |
1431 | 0 | FDK_ASSERT(0); |
1432 | 8.27k | } |
1433 | 8.27k | break; |
1434 | 8.27k | case 8: |
1435 | 8.05k | #if (MAX_ENVELOPES >= 8) |
1436 | 8.05k | switch (numberTimeSlots) { |
1437 | 1.99k | case 15: |
1438 | 1.99k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15, |
1439 | 1.99k | sizeof(FRAME_INFO)); |
1440 | 1.99k | break; |
1441 | 6.05k | case 16: |
1442 | 6.05k | FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16, |
1443 | 6.05k | sizeof(FRAME_INFO)); |
1444 | 6.05k | break; |
1445 | 0 | default: |
1446 | 0 | FDK_ASSERT(0); |
1447 | 8.05k | } |
1448 | 8.05k | break; |
1449 | | #else |
1450 | | return 0; |
1451 | | #endif |
1452 | 134k | } |
1453 | | /* Apply correct freqRes (High is default) */ |
1454 | 134k | if (!staticFreqRes) { |
1455 | 198k | for (i = 0; i < nEnv; i++) pFrameInfo->freqRes[i] = 0; |
1456 | 82.0k | } |
1457 | | |
1458 | 134k | break; |
1459 | 48.9k | case 1: |
1460 | 105k | case 2: |
1461 | 105k | temp = FDKreadBits(hBs, 2); /* A [2 bits] */ |
1462 | | |
1463 | 105k | n = FDKreadBits(hBs, 2); /* n = N [2 bits] */ |
1464 | | |
1465 | 105k | nEnv = n + 1; /* # envelopes */ |
1466 | 105k | b = nEnv + 1; /* # borders */ |
1467 | | |
1468 | 105k | break; |
1469 | 255k | } |
1470 | | |
1471 | 255k | switch (frameClass) { |
1472 | 48.9k | case 1: |
1473 | | /* Decode borders: */ |
1474 | 48.9k | pFrameInfo->borders[0] = 0; /* first border */ |
1475 | 48.9k | border = temp + numberTimeSlots; /* A -> aR */ |
1476 | 48.9k | i = b - 1; /* frame info index for last border */ |
1477 | 48.9k | pFrameInfo->borders[i] = border; /* last border */ |
1478 | | |
1479 | 91.1k | for (k = 0; k < n; k++) { |
1480 | 42.2k | temp = FDKreadBits(hBs, 2); /* R [2 bits] */ |
1481 | 42.2k | border -= (2 * temp + 2); /* R -> r */ |
1482 | 42.2k | pFrameInfo->borders[--i] = border; |
1483 | 42.2k | } |
1484 | | |
1485 | | /* Decode pointer: */ |
1486 | 48.9k | pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1)); |
1487 | 48.9k | p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */ |
1488 | | |
1489 | 48.9k | if (p > n + 1) return 0; |
1490 | | |
1491 | 46.9k | pFrameInfo->tranEnv = p ? n + 2 - p : -1; |
1492 | | |
1493 | | /* Decode freq res: */ |
1494 | 131k | for (k = n; k >= 0; k--) { |
1495 | 84.7k | pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ |
1496 | 84.7k | } |
1497 | | |
1498 | | /* Calculate noise floor middle border: */ |
1499 | 46.9k | if (p == 0 || p == 1) |
1500 | 45.2k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; |
1501 | 1.71k | else |
1502 | 1.71k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; |
1503 | | |
1504 | 46.9k | break; |
1505 | | |
1506 | 56.8k | case 2: |
1507 | | /* Decode borders: */ |
1508 | 56.8k | border = temp; /* A -> aL */ |
1509 | 56.8k | pFrameInfo->borders[0] = border; /* first border */ |
1510 | | |
1511 | 81.2k | for (k = 1; k <= n; k++) { |
1512 | 24.4k | temp = FDKreadBits(hBs, 2); /* R [2 bits] */ |
1513 | 24.4k | border += (2 * temp + 2); /* R -> r */ |
1514 | 24.4k | pFrameInfo->borders[k] = border; |
1515 | 24.4k | } |
1516 | 56.8k | pFrameInfo->borders[k] = numberTimeSlots; /* last border */ |
1517 | | |
1518 | | /* Decode pointer: */ |
1519 | 56.8k | pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1)); |
1520 | 56.8k | p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */ |
1521 | 56.8k | if (p > n + 1) return 0; |
1522 | | |
1523 | 55.3k | if (p == 0 || p == 1) |
1524 | 48.1k | pFrameInfo->tranEnv = -1; |
1525 | 7.21k | else |
1526 | 7.21k | pFrameInfo->tranEnv = p - 1; |
1527 | | |
1528 | | /* Decode freq res: */ |
1529 | 131k | for (k = 0; k <= n; k++) { |
1530 | 76.1k | pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ |
1531 | 76.1k | } |
1532 | | |
1533 | | /* Calculate noise floor middle border: */ |
1534 | 55.3k | switch (p) { |
1535 | 45.2k | case 0: |
1536 | 45.2k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1]; |
1537 | 45.2k | break; |
1538 | 2.91k | case 1: |
1539 | 2.91k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; |
1540 | 2.91k | break; |
1541 | 7.21k | default: |
1542 | 7.21k | pFrameInfo->bordersNoise[1] = |
1543 | 7.21k | pFrameInfo->borders[pFrameInfo->tranEnv]; |
1544 | 7.21k | break; |
1545 | 55.3k | } |
1546 | | |
1547 | 55.3k | break; |
1548 | | |
1549 | 55.3k | case 3: |
1550 | | /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */ |
1551 | | |
1552 | 15.7k | aL = FDKreadBits(hBs, 2); /* AL [2 bits], AL -> aL */ |
1553 | | |
1554 | 15.7k | aR = FDKreadBits(hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */ |
1555 | | |
1556 | 15.7k | nL = FDKreadBits(hBs, 2); /* nL = NL [2 bits] */ |
1557 | | |
1558 | 15.7k | nR = FDKreadBits(hBs, 2); /* nR = NR [2 bits] */ |
1559 | | |
1560 | | /*------------------------------------------------------------------------- |
1561 | | Calculate help variables |
1562 | | --------------------------------------------------------------------------*/ |
1563 | | |
1564 | | /* general: */ |
1565 | 15.7k | nEnv = nL + nR + 1; /* # envelopes */ |
1566 | 15.7k | if (nEnv > MAX_ENVELOPES) return 0; |
1567 | 15.7k | b = nEnv + 1; /* # borders */ |
1568 | | |
1569 | | /*------------------------------------------------------------------------- |
1570 | | Decode envelopes |
1571 | | --------------------------------------------------------------------------*/ |
1572 | | |
1573 | | /* L-borders: */ |
1574 | 15.7k | border = aL; /* first border */ |
1575 | 15.7k | pFrameInfo->borders[0] = border; |
1576 | | |
1577 | 34.8k | for (k = 1; k <= nL; k++) { |
1578 | 19.1k | temp = FDKreadBits(hBs, 2); /* R [2 bits] */ |
1579 | 19.1k | border += (2 * temp + 2); /* R -> r */ |
1580 | 19.1k | pFrameInfo->borders[k] = border; |
1581 | 19.1k | } |
1582 | | |
1583 | | /* R-borders: */ |
1584 | 15.7k | border = aR; /* last border */ |
1585 | 15.7k | i = nEnv; |
1586 | | |
1587 | 15.7k | pFrameInfo->borders[i] = border; |
1588 | | |
1589 | 34.8k | for (k = 0; k < nR; k++) { |
1590 | 19.1k | temp = FDKreadBits(hBs, 2); /* R [2 bits] */ |
1591 | 19.1k | border -= (2 * temp + 2); /* R -> r */ |
1592 | 19.1k | pFrameInfo->borders[--i] = border; |
1593 | 19.1k | } |
1594 | | |
1595 | | /* decode pointer: */ |
1596 | 15.7k | pointer_bits = |
1597 | 15.7k | DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL + nR + 1)); |
1598 | 15.7k | p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */ |
1599 | | |
1600 | 15.7k | if (p > nL + nR + 1) return 0; |
1601 | | |
1602 | 13.9k | pFrameInfo->tranEnv = p ? b - p : -1; |
1603 | | |
1604 | | /* decode freq res: */ |
1605 | 60.5k | for (k = 0; k < nEnv; k++) { |
1606 | 46.6k | pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ |
1607 | 46.6k | } |
1608 | | |
1609 | | /*------------------------------------------------------------------------- |
1610 | | Decode noise floors |
1611 | | --------------------------------------------------------------------------*/ |
1612 | 13.9k | pFrameInfo->bordersNoise[0] = aL; |
1613 | | |
1614 | 13.9k | if (nEnv == 1) { |
1615 | | /* 1 noise floor envelope: */ |
1616 | 2.24k | pFrameInfo->bordersNoise[1] = aR; |
1617 | 11.6k | } else { |
1618 | | /* 2 noise floor envelopes */ |
1619 | 11.6k | if (p == 0 || p == 1) |
1620 | 9.06k | pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1]; |
1621 | 2.60k | else |
1622 | 2.60k | pFrameInfo->bordersNoise[1] = |
1623 | 2.60k | pFrameInfo->borders[pFrameInfo->tranEnv]; |
1624 | 11.6k | pFrameInfo->bordersNoise[2] = aR; |
1625 | 11.6k | } |
1626 | 13.9k | break; |
1627 | 255k | } |
1628 | | |
1629 | | /* |
1630 | | Store number of envelopes, noise floor envelopes and frame class |
1631 | | */ |
1632 | 250k | pFrameInfo->nEnvelopes = nEnv; |
1633 | | |
1634 | 250k | if (nEnv == 1) |
1635 | 148k | pFrameInfo->nNoiseEnvelopes = 1; |
1636 | 102k | else |
1637 | 102k | pFrameInfo->nNoiseEnvelopes = 2; |
1638 | | |
1639 | 250k | pFrameInfo->frameClass = frameClass; |
1640 | | |
1641 | 250k | if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) { |
1642 | | /* calculate noise floor first and last borders: */ |
1643 | 102k | pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0]; |
1644 | 102k | pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] = |
1645 | 102k | pFrameInfo->borders[nEnv]; |
1646 | 102k | } |
1647 | | |
1648 | 250k | return 1; |
1649 | 255k | } |
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 | 381k | { |
1661 | 381k | int maxPos, i, j; |
1662 | 381k | int startPos; |
1663 | 381k | int stopPos; |
1664 | 381k | int tranEnv; |
1665 | 381k | int startPosNoise; |
1666 | 381k | int stopPosNoise; |
1667 | 381k | int nEnvelopes = pFrameInfo->nEnvelopes; |
1668 | 381k | int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes; |
1669 | | |
1670 | 381k | if (nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) return 0; |
1671 | | |
1672 | 381k | if (nNoiseEnvelopes > MAX_NOISE_ENVELOPES) return 0; |
1673 | | |
1674 | 381k | startPos = pFrameInfo->borders[0]; |
1675 | 381k | stopPos = pFrameInfo->borders[nEnvelopes]; |
1676 | 381k | tranEnv = pFrameInfo->tranEnv; |
1677 | 381k | startPosNoise = pFrameInfo->bordersNoise[0]; |
1678 | 381k | stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes]; |
1679 | | |
1680 | 381k | if (overlap < 0 || overlap > (3 * (4))) { |
1681 | 0 | return 0; |
1682 | 0 | } |
1683 | 381k | if (timeStep < 1 || timeStep > (4)) { |
1684 | 0 | return 0; |
1685 | 0 | } |
1686 | 381k | maxPos = numberOfTimeSlots + (overlap / timeStep); |
1687 | | |
1688 | | /* Check that the start and stop positions of the frame are reasonable values. |
1689 | | */ |
1690 | 381k | if ((startPos < 0) || (startPos >= stopPos)) return 0; |
1691 | 381k | if (startPos > maxPos - numberOfTimeSlots) /* First env. must start in or |
1692 | | directly after the overlap |
1693 | | buffer */ |
1694 | 0 | return 0; |
1695 | 381k | if (stopPos < numberOfTimeSlots) /* One complete frame must be ready for |
1696 | | output after processing */ |
1697 | 0 | return 0; |
1698 | 381k | if (stopPos > maxPos) return 0; |
1699 | | |
1700 | | /* Check that the start border for every envelope is strictly later in time |
1701 | | */ |
1702 | 1.07M | for (i = 0; i < nEnvelopes; i++) { |
1703 | 699k | if (pFrameInfo->borders[i] >= pFrameInfo->borders[i + 1]) return 0; |
1704 | 699k | } |
1705 | | |
1706 | | /* Check that the envelope to be shortened is actually among the envelopes */ |
1707 | 377k | if (tranEnv > nEnvelopes) return 0; |
1708 | | |
1709 | | /* Check the noise borders */ |
1710 | 377k | if (nEnvelopes == 1 && nNoiseEnvelopes > 1) return 0; |
1711 | | |
1712 | 377k | 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 | 962k | for (i = 0; i < nNoiseEnvelopes; i++) { |
1717 | 585k | if (pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i + 1]) |
1718 | 0 | return 0; |
1719 | 585k | } |
1720 | | |
1721 | | /* Check that every noise border is the same as an envelope border*/ |
1722 | 962k | for (i = 0; i < nNoiseEnvelopes; i++) { |
1723 | 585k | startPosNoise = pFrameInfo->bordersNoise[i]; |
1724 | | |
1725 | 853k | for (j = 0; j < nEnvelopes; j++) { |
1726 | 853k | if (pFrameInfo->borders[j] == startPosNoise) break; |
1727 | 853k | } |
1728 | 585k | if (j == nEnvelopes) return 0; |
1729 | 585k | } |
1730 | | |
1731 | 377k | return 1; |
1732 | 377k | } |