/src/aac/libSACdec/src/sac_dec_lib.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 - 2020 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 | | /*********************** MPEG surround decoder library ************************* |
96 | | |
97 | | Author(s): |
98 | | |
99 | | Description: SAC Decoder Library Interface |
100 | | |
101 | | *******************************************************************************/ |
102 | | |
103 | | #include "sac_dec_lib.h" |
104 | | #include "sac_dec_interface.h" |
105 | | #include "sac_dec.h" |
106 | | #include "sac_bitdec.h" |
107 | | #include "FDK_matrixCalloc.h" |
108 | | |
109 | 9.01k | #define MPS_DATA_BUFFER_SIZE (2048) |
110 | | |
111 | | /** |
112 | | * \brief MPEG Surround data indication. |
113 | | **/ |
114 | | typedef enum { |
115 | | MPEGS_ANCTYPE_FRAME = 0, /*!< MPEG Surround frame, see ISO/IEC 23003-1 */ |
116 | | MPEGS_ANCTYPE_HEADER_AND_FRAME = 1, /*!< MPEG Surround header and MPEG |
117 | | Surround frame, see ISO/IEC 23003-1 */ |
118 | | MPEGS_ANCTYPE_RESERVED_1 = 2, /*!< reserved, see ISO/IEC 23003-1 */ |
119 | | MPEGS_ANCTYPE_RESERVED_2 = 3 /*!< reserved, see ISO/IEC 23003-1*/ |
120 | | } MPEGS_ANCTYPE; |
121 | | |
122 | | /** |
123 | | * \brief MPEG Surround data segment indication. |
124 | | **/ |
125 | | typedef enum { |
126 | | MPEGS_CONTINUE = 0, /*!< Indicates if data segment continues a data block. */ |
127 | | MPEGS_STOP = 1, /*!< Indicates if data segment ends a data block. */ |
128 | | MPEGS_START = 2, /*!< Indicates if data segment begins a data block. */ |
129 | | MPEGS_START_STOP = |
130 | | 3 /*!< Indicates if data segment begins and ends a data block. */ |
131 | | } MPEGS_ANCSTARTSTOP; |
132 | | |
133 | | /** |
134 | | * \brief MPEG Surround synchronizaiton state. |
135 | | * |
136 | | * CAUTION: Changing the enumeration values can break the sync mechanism |
137 | | *because it is based on comparing the state values. |
138 | | **/ |
139 | | typedef enum { |
140 | | MPEGS_SYNC_LOST = |
141 | | 0, /*!< Indicates lost sync because of current discontinuity. */ |
142 | | MPEGS_SYNC_FOUND = 1, /*!< Parsed a valid header and (re)intialization was |
143 | | successfully completed. */ |
144 | | MPEGS_SYNC_COMPLETE = 2 /*!< In sync and continuous. Found an independent |
145 | | frame in addition to MPEGS_SYNC_FOUND. |
146 | | Precondition: MPEGS_SYNC_FOUND. */ |
147 | | } MPEGS_SYNCSTATE; |
148 | | |
149 | | /** |
150 | | * \brief MPEG Surround operation mode. |
151 | | **/ |
152 | | typedef enum { |
153 | | MPEGS_OPMODE_EMM = 0, /*!< Mode: Enhanced Matrix Mode (Blind) */ |
154 | | MPEGS_OPMODE_MPS_PAYLOAD = 1, /*!< Mode: Normal, Stereo or Binaural */ |
155 | | MPEGS_OPMODE_NO_MPS_PAYLOAD = 2 /*!< Mode: no MPEG Surround payload */ |
156 | | } MPEGS_OPMODE; |
157 | | |
158 | | /** |
159 | | * \brief MPEG Surround init flags. |
160 | | **/ |
161 | | typedef enum { |
162 | | MPEGS_INIT_OK = 0x00000000, /*!< indicate correct initialization */ |
163 | | MPEGS_INIT_ENFORCE_REINIT = |
164 | | 0x00000001, /*!< indicate complete initialization */ |
165 | | |
166 | | MPEGS_INIT_CHANGE_OUTPUT_MODE = |
167 | | 0x00000010, /*!< indicate change of the output mode */ |
168 | | MPEGS_INIT_CHANGE_PARTIALLY_COMPLEX = |
169 | | 0x00000020, /*!< indicate change of low power/high quality */ |
170 | | MPEGS_INIT_CHANGE_TIME_FREQ_INTERFACE = |
171 | | 0x00000040, /*!< indicate change of qmf/time interface */ |
172 | | MPEGS_INIT_CHANGE_HEADER = 0x00000080, /*!< indicate change of header */ |
173 | | |
174 | | MPEGS_INIT_ERROR_PAYLOAD = |
175 | | 0x00000100, /*!< indicate payload/ancType/ancStartStop error */ |
176 | | |
177 | | MPEGS_INIT_BS_INTERRUPTION = |
178 | | 0x00001000, /*!< indicate bitstream interruption */ |
179 | | MPEGS_INIT_CLEAR_HISTORY = |
180 | | 0x00002000, /*!< indicate that all states shall be cleared */ |
181 | | |
182 | | /* Re-initialization of submodules */ |
183 | | |
184 | | MPEGS_INIT_CHANGE_CONCEAL_PARAMS = 0x00100000, /*!< indicate a change of at |
185 | | least one error concealment |
186 | | param */ |
187 | | |
188 | | /* No re-initialization needed, currently not used */ |
189 | | MPEGS_INIT_CHANGE_BYPASS_MODE = |
190 | | 0x01000000, /*!< indicate change of bypass mode */ |
191 | | |
192 | | /* Re-initialization needed, currently not used */ |
193 | | MPEGS_INIT_ERROR_ANC_TYPE = 0x10000000, /*!< indicate ancType error*/ |
194 | | MPEGS_INIT_ERROR_ANC_STARTSTOP = |
195 | | 0x20000000 /*!< indicate ancStartStop error */ |
196 | | } MPEGS_INIT_FLAGS; |
197 | | |
198 | | struct MpegSurroundDecoder { |
199 | | HANDLE_FDK_QMF_DOMAIN pQmfDomain; |
200 | | UCHAR mpsData[MPS_DATA_BUFFER_SIZE]; /* Buffer for MPS payload accross more |
201 | | than one segment */ |
202 | | INT mpsDataBits; /* Amount of bits in mpsData */ |
203 | | /* MPEG Surround decoder */ |
204 | | SPATIAL_SPECIFIC_CONFIG spatialSpecificConfig[1]; /* SSC delay line which is |
205 | | used during decoding */ |
206 | | spatialDec *pSpatialDec; |
207 | | SPATIAL_SPECIFIC_CONFIG |
208 | | spatialSpecificConfigBackup; /* SSC used while parsing */ |
209 | | |
210 | | /* Creation parameter */ |
211 | | UCHAR mpegSurroundDecoderLevel; |
212 | | /* Run-time parameter */ |
213 | | UCHAR mpegSurroundSscIsGlobalCfg; /* Flag telling that the SSC |
214 | | (::spatialSpecificConfig) is a |
215 | | out-of-band configuration. */ |
216 | | UCHAR mpegSurroundUseTimeInterface; |
217 | | |
218 | | SPATIAL_BS_FRAME |
219 | | bsFrames[1]; /* Bitstream Structs that contain data read from the |
220 | | SpatialFrame() bitstream element */ |
221 | | BS_LL_STATE llState; /* Bit stream parser state memory */ |
222 | | UCHAR bsFrameParse; /* Current parse frame context index */ |
223 | | UCHAR bsFrameDecode; /* Current decode/apply frame context index */ |
224 | | UCHAR bsFrameDelay; /* Amount of frames delay between parsing and processing. |
225 | | Required i.e. for interpolation error concealment. */ |
226 | | |
227 | | /* User prameters */ |
228 | | SPATIALDEC_PARAM mpegSurroundUserParams; |
229 | | |
230 | | /* Internal flags */ |
231 | | SPATIAL_DEC_UPMIX_TYPE upmixType; |
232 | | int initFlags[1]; |
233 | | MPEGS_ANCSTARTSTOP ancStartStopPrev; |
234 | | MPEGS_SYNCSTATE fOnSync[1]; |
235 | | |
236 | | /* Inital decoder configuration */ |
237 | | SPATIAL_DEC_CONFIG decConfig; |
238 | | }; |
239 | | |
240 | | SACDEC_ERROR |
241 | | static sscCheckOutOfBand(const SPATIAL_SPECIFIC_CONFIG *pSsc, |
242 | | const INT coreCodec, const INT sampleRate, |
243 | | const INT frameSize); |
244 | | |
245 | | static SACDEC_ERROR sscParseCheck(const SPATIAL_SPECIFIC_CONFIG *pSsc); |
246 | | |
247 | | /** |
248 | | * \brief Get the number of QMF bands from the sampling frequency (in Hz) |
249 | | **/ |
250 | | static int mpegSurroundDecoder_GetNrOfQmfBands( |
251 | 143k | const SPATIAL_SPECIFIC_CONFIG *pSsc, UINT sampleRate) { |
252 | 143k | UINT samplingFrequency = sampleRate; |
253 | 143k | int qmfBands = 64; |
254 | | |
255 | 143k | if (pSsc != NULL) { |
256 | 140k | switch (pSsc->coreCodec) { |
257 | 31.3k | case AOT_USAC: |
258 | 31.3k | if ((pSsc->stereoConfigIndex == 3)) { |
259 | 5.62k | static const UCHAR mapIdx2QmfBands[3] = {24, 32, 16}; |
260 | 5.62k | FDK_ASSERT((pSsc->coreSbrFrameLengthIndex >= 2) && |
261 | 5.62k | (pSsc->coreSbrFrameLengthIndex <= 4)); |
262 | 5.62k | qmfBands = mapIdx2QmfBands[pSsc->coreSbrFrameLengthIndex - 2]; |
263 | 5.62k | } |
264 | 31.3k | return qmfBands; |
265 | 108k | default: |
266 | 108k | samplingFrequency = pSsc->samplingFreq; |
267 | 108k | break; |
268 | 140k | } |
269 | 140k | } |
270 | | |
271 | | /* number of QMF bands depend on sampling frequency, see FDIS 23003-1:2006 |
272 | | * Chapter 6.3.3 */ |
273 | 112k | if (samplingFrequency < 27713) { |
274 | 61.9k | qmfBands = 32; |
275 | 61.9k | } |
276 | 112k | if (samplingFrequency > 55426) { |
277 | 901 | qmfBands = 128; |
278 | 901 | } |
279 | | |
280 | 112k | return qmfBands; |
281 | 143k | } |
282 | | |
283 | | /** |
284 | | * \brief Analyse init flags |
285 | | **/ |
286 | | static int mpegSurroundDecoder_CalcInitFlags(SPATIAL_SPECIFIC_CONFIG *pSsc1, |
287 | | SPATIAL_SPECIFIC_CONFIG *pSsc2, |
288 | | int upmixTypeFlag, |
289 | | int binauralQualityFlag, |
290 | | int partiallyComplexFlag, |
291 | 55.4k | int *ctrlFlags) { |
292 | | /* Analyse core coder */ |
293 | 55.4k | if (pSsc1->coreCodec != pSsc2->coreCodec) { |
294 | 0 | *ctrlFlags |= MASK_MPEGS_INIT_ALL_STATES; |
295 | 0 | *ctrlFlags |= MASK_MPEGS_INIT_ALL_PARAMS; |
296 | 55.4k | } else { |
297 | | /* Analyse elements for initialization of space analysis qmf filterbank */ |
298 | 55.4k | if ((partiallyComplexFlag) || (pSsc1->treeConfig != pSsc2->treeConfig) || |
299 | 55.4k | (pSsc1->samplingFreq != pSsc2->samplingFreq)) { |
300 | 0 | *ctrlFlags |= MPEGS_INIT_STATES_ANA_QMF_FILTER; |
301 | 0 | *ctrlFlags |= MPEGS_INIT_STATES_ANA_HYB_FILTER; |
302 | 0 | } |
303 | | |
304 | | /* Analyse elements for initialization of space synthesis qmf filterbank */ |
305 | 55.4k | if ((upmixTypeFlag) || (partiallyComplexFlag) || |
306 | 55.4k | (pSsc1->treeConfig != pSsc2->treeConfig) || |
307 | 55.4k | (pSsc1->samplingFreq != pSsc2->samplingFreq) || |
308 | 55.4k | (pSsc1->bsFixedGainDMX != pSsc2->bsFixedGainDMX)) { |
309 | 1.94k | *ctrlFlags |= MPEGS_INIT_STATES_SYN_QMF_FILTER; |
310 | 1.94k | } |
311 | | |
312 | | /* Analyse elements for initialization of decorrelator */ |
313 | 55.4k | if ((upmixTypeFlag) || (partiallyComplexFlag) || |
314 | 55.4k | (pSsc1->treeConfig != pSsc2->treeConfig) || |
315 | 55.4k | (pSsc1->samplingFreq != pSsc2->samplingFreq) || |
316 | 55.4k | (pSsc1->decorrConfig != pSsc2->decorrConfig)) { |
317 | 818 | *ctrlFlags |= MPEGS_INIT_STATES_DECORRELATOR; |
318 | 818 | } |
319 | | |
320 | | /* Analyse elements for initialization of m1 and m2 calculation */ |
321 | 55.4k | if ((upmixTypeFlag) || (binauralQualityFlag) || |
322 | 55.4k | (pSsc1->treeConfig != pSsc2->treeConfig) || |
323 | 55.4k | (pSsc1->samplingFreq != pSsc2->samplingFreq)) |
324 | | |
325 | 0 | { |
326 | 0 | *ctrlFlags |= MPEGS_INIT_STATES_M1M2; |
327 | 0 | } |
328 | | |
329 | | /* Analyse elements for initialization of GES */ |
330 | 55.4k | if ((upmixTypeFlag) || (pSsc1->treeConfig != pSsc2->treeConfig) || |
331 | 55.4k | (pSsc1->tempShapeConfig != pSsc2->tempShapeConfig)) { |
332 | 812 | *ctrlFlags |= MPEGS_INIT_STATES_GES; |
333 | 812 | } |
334 | | |
335 | | /* Analyse elements for initialization of FDreverb */ |
336 | 55.4k | if ((upmixTypeFlag) || (binauralQualityFlag) || (partiallyComplexFlag) || |
337 | 55.4k | (pSsc1->samplingFreq != pSsc2->samplingFreq) || |
338 | 55.4k | (pSsc1->nTimeSlots != pSsc2->nTimeSlots)) { |
339 | 1.24k | *ctrlFlags |= MPEGS_INIT_STATES_REVERB; |
340 | 1.24k | } |
341 | | |
342 | | /* Reset previous frame data whenever the config changes */ |
343 | 55.4k | if (*ctrlFlags & MPEGS_INIT_CONFIG) { |
344 | 10.0k | *ctrlFlags |= MPEGS_INIT_STATES_PARAM; |
345 | 10.0k | } |
346 | 55.4k | } |
347 | | |
348 | 55.4k | return MPS_OK; |
349 | 55.4k | } |
350 | | |
351 | | /** |
352 | | * \brief Reset MPEG Surround status info |
353 | | **/ |
354 | | static void updateMpegSurroundDecoderStatus( |
355 | | CMpegSurroundDecoder *pMpegSurroundDecoder, int initFlags, |
356 | 101k | MPEGS_SYNCSTATE fOnSync, MPEGS_ANCSTARTSTOP ancStartStopPrev) { |
357 | 101k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
358 | 101k | initFlags; |
359 | 101k | if ((pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg != 0) && |
360 | 101k | (pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] >= |
361 | 46.2k | MPEGS_SYNC_FOUND) && |
362 | 101k | (fOnSync < MPEGS_SYNC_FOUND)) { |
363 | 43.1k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
364 | 43.1k | MPEGS_SYNC_FOUND; |
365 | 58.3k | } else { |
366 | 58.3k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
367 | 58.3k | fOnSync; |
368 | 58.3k | } |
369 | 101k | pMpegSurroundDecoder->ancStartStopPrev = ancStartStopPrev; |
370 | 101k | } |
371 | | |
372 | | static SACDEC_ERROR mpegSurroundDecoder_Create( |
373 | | CMpegSurroundDecoder **pMpegSurroundDecoder, int stereoConfigIndex, |
374 | | HANDLE_FDK_QMF_DOMAIN pQmfDomain); |
375 | | |
376 | | SAC_INSTANCE_AVAIL |
377 | | mpegSurroundDecoder_IsFullMpegSurroundDecoderInstanceAvailable( |
378 | 5.12k | CMpegSurroundDecoder *pMpegSurroundDecoder) { |
379 | 5.12k | SAC_INSTANCE_AVAIL instanceAvailable = SAC_INSTANCE_NOT_FULL_AVAILABLE; |
380 | | |
381 | 5.12k | if (pMpegSurroundDecoder->pSpatialDec != NULL) { |
382 | 3.62k | instanceAvailable = SAC_INSTANCE_FULL_AVAILABLE; |
383 | 3.62k | } |
384 | | |
385 | 5.12k | return instanceAvailable; |
386 | 5.12k | } |
387 | | |
388 | | SACDEC_ERROR mpegSurroundDecoder_Open( |
389 | | CMpegSurroundDecoder **pMpegSurroundDecoder, int stereoConfigIndex, |
390 | 60.0k | HANDLE_FDK_QMF_DOMAIN pQmfDomain) { |
391 | 60.0k | SACDEC_ERROR error; |
392 | | |
393 | 60.0k | error = mpegSurroundDecoder_Create(pMpegSurroundDecoder, stereoConfigIndex, |
394 | 60.0k | pQmfDomain); |
395 | | |
396 | 60.0k | return error; |
397 | 60.0k | } |
398 | | |
399 | | /** |
400 | | * \brief Renamed function from getUpmixType to check_UParam_Build_DecConfig. |
401 | | * This function checks if user params, decoder config and SSC are valid |
402 | | * and if the decoder build can handle all this settings. |
403 | | * The upmix type may be modified by this function. |
404 | | * It is called in initMpegSurroundDecoder() after the ssc parse check, |
405 | | * to have all checks in one place and to ensure these checks are always |
406 | | * performed if config changes (inband and out-of-band). |
407 | | * |
408 | | * \param pUserParams User data handle. |
409 | | * \param pDecConfig decoder config handle. |
410 | | * \param pSsc spatial specific config handle. |
411 | | * \param pUpmixType upmix type which is set by this function |
412 | | * |
413 | | * \return MPS_OK on sucess, and else on failure. |
414 | | */ |
415 | | static SACDEC_ERROR check_UParam_Build_DecConfig( |
416 | | SPATIALDEC_PARAM const *pUserParams, SPATIAL_DEC_CONFIG const *pDecConfig, |
417 | 69.6k | const SPATIAL_SPECIFIC_CONFIG *pSsc, SPATIAL_DEC_UPMIX_TYPE *pUpmixType) { |
418 | 69.6k | int dmxChannels, outChannels, maxNumOutChannels; |
419 | | |
420 | 69.6k | FDK_ASSERT(pUserParams != NULL); |
421 | 69.6k | FDK_ASSERT(pUpmixType != NULL); |
422 | | |
423 | | /* checks if implementation can handle the Ssc */ |
424 | | |
425 | 69.6k | switch (pSsc->treeConfig) { |
426 | 69.6k | case SPATIALDEC_MODE_RSVD7: /* 212 */ |
427 | 69.6k | dmxChannels = 1; |
428 | 69.6k | outChannels = 2; |
429 | 69.6k | break; |
430 | 0 | default: |
431 | 0 | return MPS_UNSUPPORTED_CONFIG; |
432 | 69.6k | } |
433 | | |
434 | | /* ------------------------------------------- */ |
435 | | |
436 | | /* Analyse pDecConfig params */ |
437 | 69.6k | switch (pDecConfig->binauralMode) { |
438 | 69.6k | case BINAURAL_NONE: |
439 | 69.6k | break; |
440 | 0 | default: |
441 | 0 | return MPS_UNSUPPORTED_CONFIG; |
442 | 69.6k | } |
443 | | |
444 | 69.6k | switch (pDecConfig->decoderMode) { |
445 | 69.6k | case EXT_HQ_ONLY: |
446 | 69.6k | break; |
447 | 0 | default: |
448 | 0 | return MPS_UNSUPPORTED_CONFIG; |
449 | 69.6k | } |
450 | | |
451 | 69.6k | switch (pDecConfig->maxNumOutputChannels) { |
452 | 69.6k | case OUTPUT_CHANNELS_DEFAULT: |
453 | | /* No special restrictions -> Get the level restriction: */ |
454 | 69.6k | switch (pDecConfig->decoderLevel) { |
455 | 69.6k | case DECODER_LEVEL_0: |
456 | 69.6k | maxNumOutChannels = 2; |
457 | 69.6k | break; |
458 | 0 | default: |
459 | 0 | return MPS_UNSUPPORTED_CONFIG; |
460 | 69.6k | } |
461 | 69.6k | break; |
462 | 69.6k | case OUTPUT_CHANNELS_2_0: |
463 | 0 | maxNumOutChannels = 2; |
464 | 0 | break; |
465 | 0 | default: |
466 | 0 | return MPS_UNSUPPORTED_CONFIG; |
467 | 69.6k | } |
468 | | /* ------------------------- */ |
469 | | |
470 | | /* check if we can handle user params */ |
471 | 69.6k | if (pUserParams->blindEnable == 1) { |
472 | 0 | return MPS_UNSUPPORTED_CONFIG; |
473 | 0 | } |
474 | 69.6k | { |
475 | 69.6k | switch ((SAC_DEC_OUTPUT_MODE)pUserParams->outputMode) { |
476 | 69.6k | case SACDEC_OUT_MODE_NORMAL: |
477 | 69.6k | if (maxNumOutChannels >= outChannels) { |
478 | 69.6k | *pUpmixType = UPMIX_TYPE_NORMAL; |
479 | 69.6k | } else { |
480 | 0 | { *pUpmixType = UPMIX_TYPE_BYPASS; } |
481 | 0 | } |
482 | 69.6k | break; |
483 | 0 | case SACDEC_OUT_MODE_STEREO: |
484 | 0 | if (dmxChannels == 1) { |
485 | 0 | if (outChannels == 2) { |
486 | 0 | *pUpmixType = UPMIX_TYPE_NORMAL; |
487 | 0 | } |
488 | 0 | } else { |
489 | 0 | *pUpmixType = UPMIX_TYPE_BYPASS; |
490 | 0 | } |
491 | 0 | break; |
492 | 0 | case SACDEC_OUT_MODE_6CHANNEL: |
493 | 0 | if (outChannels > 6) { |
494 | 0 | { *pUpmixType = UPMIX_TYPE_BYPASS; } |
495 | 0 | } else { |
496 | 0 | *pUpmixType = UPMIX_TYPE_NORMAL; |
497 | 0 | } |
498 | 0 | break; |
499 | 0 | default: |
500 | 0 | return MPS_UNSUPPORTED_CONFIG; |
501 | 69.6k | } |
502 | 69.6k | } |
503 | | |
504 | 69.6k | return MPS_OK; |
505 | 69.6k | } |
506 | | |
507 | | /** |
508 | | * \brief Init MPEG Surround decoder. |
509 | | **/ |
510 | | static SACDEC_ERROR initMpegSurroundDecoder( |
511 | 69.6k | CMpegSurroundDecoder *pMpegSurroundDecoder) { |
512 | 69.6k | SACDEC_ERROR err; |
513 | 69.6k | int initFlags = MPEGS_INIT_NONE, initFlagsDec; |
514 | 69.6k | int upmixTypeCurr = pMpegSurroundDecoder->upmixType; |
515 | | |
516 | 69.6k | FDK_ASSERT(pMpegSurroundDecoder != NULL); |
517 | | |
518 | 69.6k | SPATIAL_SPECIFIC_CONFIG *const pSSCinput = |
519 | 69.6k | &pMpegSurroundDecoder->spatialSpecificConfigBackup; |
520 | 69.6k | SPATIAL_SPECIFIC_CONFIG *const pSSCtarget = |
521 | 69.6k | &pMpegSurroundDecoder |
522 | 69.6k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; |
523 | 69.6k | initFlagsDec = |
524 | 69.6k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode]; |
525 | | |
526 | 69.6k | if (pSSCinput->coreCodec != AOT_USAC) { |
527 | | /* here we check if we have a valid Ssc */ |
528 | 38.2k | err = sscParseCheck(pSSCinput); |
529 | 38.2k | if (err != MPS_OK) goto bail; |
530 | 38.2k | } |
531 | | |
532 | | /* here we check if Ssc matches build; also check UParams and DecConfig */ |
533 | | /* if desired upmixType is changes */ |
534 | 69.6k | err = check_UParam_Build_DecConfig( |
535 | 69.6k | &pMpegSurroundDecoder->mpegSurroundUserParams, |
536 | 69.6k | &pMpegSurroundDecoder->decConfig, pSSCinput, |
537 | 69.6k | &pMpegSurroundDecoder->upmixType); |
538 | 69.6k | if (err != MPS_OK) goto bail; |
539 | | |
540 | | /* init config */ |
541 | 69.6k | if (initFlagsDec & MPEGS_INIT_CHANGE_HEADER) { |
542 | 22.5k | initFlags |= MPEGS_INIT_CONFIG; |
543 | 22.5k | } |
544 | | /* init all states */ |
545 | 69.6k | if (initFlagsDec & MPEGS_INIT_CLEAR_HISTORY) { |
546 | 0 | initFlags |= MASK_MPEGS_INIT_ALL_STATES; |
547 | 0 | } |
548 | 69.6k | if (initFlagsDec & MPEGS_INIT_CHANGE_CONCEAL_PARAMS) { |
549 | 0 | initFlags |= MPEGS_INIT_PARAMS_ERROR_CONCEALMENT; |
550 | 0 | } |
551 | | |
552 | 69.6k | if (initFlagsDec & MPEGS_INIT_ENFORCE_REINIT) { |
553 | | /* init all states */ |
554 | 14.1k | initFlags |= MASK_MPEGS_INIT_ALL_STATES; |
555 | 14.1k | initFlags |= MASK_MPEGS_INIT_ALL_PARAMS; |
556 | 55.4k | } else { |
557 | | /* analyse states which have to be initialized */ |
558 | 55.4k | mpegSurroundDecoder_CalcInitFlags( |
559 | 55.4k | pSSCtarget, pSSCinput, |
560 | 55.4k | (upmixTypeCurr != |
561 | 55.4k | pMpegSurroundDecoder->upmixType), /* upmixType changed */ |
562 | 55.4k | 0, (initFlagsDec & MPEGS_INIT_CHANGE_PARTIALLY_COMPLEX) ? 1 : 0, |
563 | 55.4k | &initFlags); |
564 | 55.4k | } |
565 | | |
566 | 69.6k | { |
567 | 69.6k | int nrOfQmfBands; |
568 | 69.6k | FDKmemcpy(pSSCtarget, pSSCinput, sizeof(SPATIAL_SPECIFIC_CONFIG)); |
569 | | |
570 | 69.6k | nrOfQmfBands = mpegSurroundDecoder_GetNrOfQmfBands( |
571 | 69.6k | pSSCtarget, pSSCtarget->samplingFreq); |
572 | 69.6k | err = FDK_SpatialDecInit( |
573 | 69.6k | pMpegSurroundDecoder->pSpatialDec, |
574 | 69.6k | &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode], |
575 | 69.6k | pSSCtarget, nrOfQmfBands, pMpegSurroundDecoder->upmixType, |
576 | 69.6k | &pMpegSurroundDecoder->mpegSurroundUserParams, initFlags); |
577 | | |
578 | 69.6k | if (err != MPS_OK) goto bail; |
579 | | |
580 | | /* Signal that we got a header and can go on decoding */ |
581 | 68.6k | if (err == MPS_OK) { |
582 | 68.6k | initFlagsDec = MPEGS_INIT_OK; |
583 | 68.6k | { |
584 | 68.6k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
585 | 68.6k | MPEGS_SYNC_FOUND; |
586 | 68.6k | } |
587 | 68.6k | } |
588 | 68.6k | } |
589 | | |
590 | 69.6k | bail: |
591 | 69.6k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] = |
592 | 69.6k | initFlagsDec; |
593 | 69.6k | return err; |
594 | 68.6k | } |
595 | | |
596 | | /** |
597 | | * \brief Init MPEG Surround decoder. |
598 | | **/ |
599 | | SACDEC_ERROR mpegSurroundDecoder_Init( |
600 | 0 | CMpegSurroundDecoder *pMpegSurroundDecoder) { |
601 | 0 | SACDEC_ERROR err = MPS_OK; |
602 | |
|
603 | 0 | if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode]) { |
604 | 0 | err = initMpegSurroundDecoder(pMpegSurroundDecoder); |
605 | 0 | } |
606 | 0 | return err; |
607 | 0 | } |
608 | | |
609 | | /** |
610 | | * \brief Open MPEG Surround decoder. |
611 | | **/ |
612 | | static SACDEC_ERROR mpegSurroundDecoder_Create( |
613 | | CMpegSurroundDecoder **pMpegSurroundDecoder, int stereoConfigIndex, |
614 | 60.0k | HANDLE_FDK_QMF_DOMAIN pQmfDomain) { |
615 | 60.0k | SACDEC_ERROR err = MPS_OK; |
616 | 60.0k | CMpegSurroundDecoder *sacDec = NULL; |
617 | 60.0k | spatialDec *self = NULL; |
618 | | |
619 | | /* decoderLevel decoderMode maxNumOutputChannels binauralMode */ |
620 | 60.0k | static const SPATIAL_DEC_CONFIG decConfig = { |
621 | 60.0k | (CFG_LEVEL)(0), EXT_HQ_ONLY, OUTPUT_CHANNELS_DEFAULT, BINAURAL_NONE}; |
622 | | |
623 | 60.0k | if (*pMpegSurroundDecoder == NULL) { |
624 | 34.2k | FDK_ALLOCATE_MEMORY_1D(*pMpegSurroundDecoder, 1, CMpegSurroundDecoder) |
625 | | |
626 | 68.5k | for (int i = 0; i < 1; i++) { |
627 | 34.2k | err = SpatialDecCreateBsFrame(&(*pMpegSurroundDecoder)->bsFrames[i], |
628 | 34.2k | &(*pMpegSurroundDecoder)->llState); |
629 | 34.2k | if (err != MPS_OK) { |
630 | 0 | sacDec = *pMpegSurroundDecoder; |
631 | 0 | goto bail; |
632 | 0 | } |
633 | 34.2k | } |
634 | 34.2k | (*pMpegSurroundDecoder)->pQmfDomain = pQmfDomain; |
635 | | |
636 | 34.2k | (*pMpegSurroundDecoder)->bsFrameDelay = 1; |
637 | 34.2k | (*pMpegSurroundDecoder)->bsFrameParse = 0; |
638 | 34.2k | (*pMpegSurroundDecoder)->bsFrameDecode = 0; |
639 | | |
640 | 34.2k | return err; |
641 | 34.2k | } else { |
642 | 25.7k | sacDec = *pMpegSurroundDecoder; |
643 | 25.7k | } |
644 | | |
645 | 25.7k | if (sacDec->pSpatialDec == NULL) { |
646 | 25.0k | if ((self = FDK_SpatialDecOpen(&decConfig, stereoConfigIndex)) == NULL) { |
647 | 0 | err = MPS_OUTOFMEMORY; |
648 | 0 | goto bail; |
649 | 0 | } |
650 | 25.0k | } else { |
651 | 670 | self = sacDec->pSpatialDec; |
652 | 670 | } |
653 | | |
654 | 25.7k | self->pQmfDomain = sacDec->pQmfDomain; |
655 | | |
656 | 25.7k | sacDec->pSpatialDec = self; |
657 | | |
658 | | /* default parameter set */ |
659 | 25.7k | sacDec->mpegSurroundUserParams.outputMode = SACDEC_OUT_MODE_NORMAL; |
660 | 25.7k | sacDec->mpegSurroundUserParams.blindEnable = 0; |
661 | 25.7k | sacDec->mpegSurroundUserParams.bypassMode = 0; |
662 | 25.7k | sacDec->mpegSurroundUserParams.concealMethod = 1; |
663 | 25.7k | sacDec->mpegSurroundUserParams.concealNumKeepFrames = 10; |
664 | 25.7k | sacDec->mpegSurroundUserParams.concealFadeOutSlopeLength = 5; |
665 | 25.7k | sacDec->mpegSurroundUserParams.concealFadeInSlopeLength = 5; |
666 | 25.7k | sacDec->mpegSurroundUserParams.concealNumReleaseFrames = 3; |
667 | 25.7k | sacDec->mpegSurroundSscIsGlobalCfg = 0; |
668 | 25.7k | sacDec->mpegSurroundUseTimeInterface = 1; |
669 | 25.7k | sacDec->mpegSurroundDecoderLevel = decConfig.decoderLevel; |
670 | | |
671 | 25.7k | sacDec->upmixType = UPMIX_TYPE_NORMAL; |
672 | | |
673 | | /* signalize spatial decoder re-initalization */ |
674 | 25.7k | updateMpegSurroundDecoderStatus(sacDec, MPEGS_INIT_ENFORCE_REINIT, |
675 | 25.7k | MPEGS_SYNC_LOST, MPEGS_STOP); |
676 | | |
677 | | /* return decoder instance */ |
678 | 25.7k | *pMpegSurroundDecoder = sacDec; |
679 | 25.7k | sacDec->decConfig = decConfig; |
680 | | |
681 | 25.7k | SpatialDecInitParserContext(sacDec->pSpatialDec); |
682 | | |
683 | 25.7k | return err; |
684 | | |
685 | 0 | bail: |
686 | 0 | if (sacDec != NULL) { |
687 | 0 | mpegSurroundDecoder_Close(sacDec); |
688 | 0 | } |
689 | 0 | *pMpegSurroundDecoder = NULL; |
690 | 0 | if (err == MPS_OK) { |
691 | 0 | return MPS_OUTOFMEMORY; |
692 | 0 | } else { |
693 | 0 | return err; |
694 | 0 | } |
695 | 0 | } |
696 | | |
697 | | /** |
698 | | * \brief Config MPEG Surround decoder. |
699 | | **/ |
700 | | SACDEC_ERROR mpegSurroundDecoder_Config( |
701 | | CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, |
702 | | AUDIO_OBJECT_TYPE coreCodec, INT samplingRate, INT frameSize, |
703 | | INT numChannels, INT stereoConfigIndex, INT coreSbrFrameLengthIndex, |
704 | 224k | INT configBytes, const UCHAR configMode, UCHAR *configChanged) { |
705 | 224k | SACDEC_ERROR err = MPS_OK; |
706 | 224k | INT nInputChannels; |
707 | 224k | SPATIAL_SPECIFIC_CONFIG spatialSpecificConfig; |
708 | 224k | SPATIAL_SPECIFIC_CONFIG *pSsc = |
709 | 224k | &pMpegSurroundDecoder->spatialSpecificConfigBackup; |
710 | | |
711 | 224k | switch (coreCodec) { |
712 | 0 | case AOT_DRM_USAC: |
713 | 98.1k | case AOT_USAC: |
714 | 98.1k | if (configMode == AC_CM_DET_CFG_CHANGE) { |
715 | | /* In config detection mode write spatial specific config parameters |
716 | | * into temporarily allocated structure */ |
717 | 61.6k | err = SpatialDecParseMps212Config( |
718 | 61.6k | hBs, &spatialSpecificConfig, samplingRate, coreCodec, |
719 | 61.6k | stereoConfigIndex, coreSbrFrameLengthIndex); |
720 | 61.6k | nInputChannels = spatialSpecificConfig.nInputChannels; |
721 | 61.6k | pSsc = &spatialSpecificConfig; |
722 | 61.6k | } else { |
723 | 36.5k | err = SpatialDecParseMps212Config( |
724 | 36.5k | hBs, &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
725 | 36.5k | samplingRate, coreCodec, stereoConfigIndex, |
726 | 36.5k | coreSbrFrameLengthIndex); |
727 | 36.5k | nInputChannels = |
728 | 36.5k | pMpegSurroundDecoder->spatialSpecificConfigBackup.nInputChannels; |
729 | 36.5k | } |
730 | 98.1k | if ((err == MPS_OK) && (numChannels != nInputChannels)) { |
731 | 0 | err = MPS_PARSE_ERROR; |
732 | 0 | } |
733 | 98.1k | break; |
734 | 125k | case AOT_ER_AAC_ELD: |
735 | 125k | case AOT_ER_AAC_LD: |
736 | 125k | if (configMode == AC_CM_DET_CFG_CHANGE) { |
737 | | /* In config detection mode write spatial specific config parameters |
738 | | * into temporarily allocated structure */ |
739 | 102k | err = SpatialDecParseSpecificConfig(hBs, &spatialSpecificConfig, |
740 | 102k | configBytes, coreCodec); |
741 | 102k | nInputChannels = spatialSpecificConfig.nInputChannels; |
742 | 102k | pSsc = &spatialSpecificConfig; |
743 | 102k | } else { |
744 | 22.8k | err = SpatialDecParseSpecificConfig( |
745 | 22.8k | hBs, &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
746 | 22.8k | configBytes, coreCodec); |
747 | 22.8k | nInputChannels = |
748 | 22.8k | pMpegSurroundDecoder->spatialSpecificConfigBackup.nInputChannels; |
749 | 22.8k | } |
750 | | /* check number of channels for channel_configuration > 0 */ |
751 | 125k | if ((err == MPS_OK) && (numChannels > 0) && |
752 | 125k | (numChannels != nInputChannels)) { |
753 | 455 | err = MPS_PARSE_ERROR; |
754 | 455 | } |
755 | 125k | break; |
756 | 359 | default: |
757 | 359 | err = MPS_UNSUPPORTED_FORMAT; |
758 | 359 | break; |
759 | 224k | } |
760 | | |
761 | 224k | if (err != MPS_OK) { |
762 | 62.7k | goto bail; |
763 | 62.7k | } |
764 | | |
765 | 161k | err = sscCheckOutOfBand(pSsc, coreCodec, samplingRate, frameSize); |
766 | | |
767 | 161k | if (err != MPS_OK) { |
768 | 15.7k | goto bail; |
769 | 15.7k | } |
770 | | |
771 | 145k | if (configMode & AC_CM_DET_CFG_CHANGE) { |
772 | 94.5k | return err; |
773 | 94.5k | } |
774 | | |
775 | 51.3k | if (configMode & AC_CM_ALLOC_MEM) { |
776 | 51.3k | if (*configChanged) { |
777 | 24.2k | err = mpegSurroundDecoder_Open(&pMpegSurroundDecoder, stereoConfigIndex, |
778 | 24.2k | NULL); |
779 | 24.2k | if (err) { |
780 | 0 | return err; |
781 | 0 | } |
782 | 24.2k | } |
783 | 51.3k | } |
784 | | |
785 | 51.3k | { |
786 | 51.3k | SPATIAL_SPECIFIC_CONFIG *sscParse = |
787 | 51.3k | &pMpegSurroundDecoder |
788 | 51.3k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; |
789 | | |
790 | 51.3k | if (FDK_SpatialDecCompareSpatialSpecificConfigHeader( |
791 | 51.3k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, sscParse)) { |
792 | 36.5k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameParse] |= |
793 | 36.5k | MPEGS_INIT_CHANGE_HEADER; |
794 | | /* Error resilience code */ |
795 | 36.5k | if (pMpegSurroundDecoder->pSpatialDec == NULL) { |
796 | 247 | err = MPS_NOTOK; |
797 | 247 | goto bail; |
798 | 247 | } |
799 | 36.3k | SpatialDecInitParserContext(pMpegSurroundDecoder->pSpatialDec); |
800 | 36.3k | pMpegSurroundDecoder->pSpatialDec->pConfigCurrent = |
801 | 36.3k | &pMpegSurroundDecoder |
802 | 36.3k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; |
803 | 36.3k | } |
804 | 51.3k | } |
805 | | |
806 | 51.0k | if (err == MPS_OK) { |
807 | | /* We got a valid out-of-band configuration so label it accordingly. */ |
808 | 51.0k | pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg = 1; |
809 | 51.0k | } |
810 | | |
811 | 129k | bail: |
812 | 129k | return err; |
813 | 51.0k | } |
814 | | |
815 | | /** |
816 | | * \brief Determine MPEG Surround operation mode. |
817 | | **/ |
818 | | static MPEGS_OPMODE mpegSurroundOperationMode( |
819 | 222k | CMpegSurroundDecoder *pMpegSurroundDecoder, int mpsDataBits) { |
820 | 222k | MPEGS_OPMODE mode; |
821 | | |
822 | 222k | { |
823 | 222k | if ((mpsDataBits > 0) && |
824 | 222k | (pMpegSurroundDecoder->mpegSurroundUserParams.blindEnable == 0)) { |
825 | 222k | mode = MPEGS_OPMODE_MPS_PAYLOAD; /* Mode: Normal, Stereo or Binaural */ |
826 | 222k | } else { |
827 | 0 | mode = MPEGS_OPMODE_NO_MPS_PAYLOAD; /* Mode: No MPEG Surround Payload */ |
828 | 0 | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
829 | 0 | MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, |
830 | 0 | MPEGS_STOP); |
831 | 0 | } |
832 | 222k | } |
833 | | |
834 | 222k | return (mode); |
835 | 222k | } |
836 | | |
837 | | /** |
838 | | * \brief Check ssc for parse errors. |
839 | | * This one is called in initMpegSurroundDecoder() |
840 | | * to ensure checking of inband and out-of-band mps configs. |
841 | | * Only parse errors checked here! Check for valid config is done |
842 | | * in check_UParam_Build_DecConfig()! |
843 | | * |
844 | | * \param pSsc spatial specific config handle. |
845 | | * |
846 | | * \return MPS_OK on sucess, and else on parse error. |
847 | | */ |
848 | 206k | static SACDEC_ERROR sscParseCheck(const SPATIAL_SPECIFIC_CONFIG *pSsc) { |
849 | 206k | if (pSsc->samplingFreq > 96000) return MPS_PARSE_ERROR; |
850 | 205k | if (pSsc->samplingFreq < 8000) return MPS_PARSE_ERROR; |
851 | | |
852 | 204k | if ((pSsc->treeConfig < 0) || (pSsc->treeConfig > 7)) { |
853 | 0 | return MPS_PARSE_ERROR; |
854 | 0 | } |
855 | | |
856 | 204k | if ((pSsc->quantMode < 0) || (pSsc->quantMode > 2)) { |
857 | 1.03k | return MPS_PARSE_ERROR; |
858 | 1.03k | } |
859 | | |
860 | | /* now we are sure there were no parsing errors */ |
861 | | |
862 | 203k | return MPS_OK; |
863 | 204k | } |
864 | | |
865 | | /** |
866 | | * \brief Check number of time slots |
867 | | * |
868 | | * Basically the mps frame length must be a multiple of the core coder frame |
869 | | * length. The below table shows all valid configurations in detail. See ISO/IEC |
870 | | * 23003-1: "Table 4A - Allowed values for bsFrameLength in the Baseline MPEG |
871 | | * Surround Profile" |
872 | | * |
873 | | * Downmix Coder Downmix Code Allowed values for bsFrameLength |
874 | | * Allowed frame sizes for normal, downsampled and upsampled MPS Framelength |
875 | | * (QMF Samples) |
876 | | * |
877 | | * AAC 1024 16 15, 31, 47, 63 1024 2048 3072 4096 |
878 | | * downsampled MPS 32 31, 63 1024 2048 upsampled MPS |
879 | | * 8 7, 15, 23, 31, 39, 47, 55, 63, 71 1024 2048 3072 4096 |
880 | | * 5120 6144 7168 8192 9216 |
881 | | * |
882 | | * AAC 960 15 14, 29, 44, 59 960 1920 2880 3840 |
883 | | * downsampled MPS 30 29, 59 960 1920 upsampled MPS |
884 | | * 7,5 14, 29, 44, 59 1920 3840 5760 7680 |
885 | | * |
886 | | * HE-AAC 1024/2048 32 31, 63 2048 4096 downsampled MPS |
887 | | * 64 63 2048 upsampled MPS |
888 | | * 16 15, 31, 47, 63 2048 4096 6144 8192 |
889 | | * |
890 | | * HE-AAC 960/1920 30 29, 59 1920 3840 downsampled MPS |
891 | | * 60 59 1920 upsampled MPS |
892 | | * 15 14, 29, 44, 59 1920 3840 5760 7680 |
893 | | * |
894 | | * BSAC 16 15, 31, 47, 63 1024 2048 3072 4096 |
895 | | * downsampled MPS 32 31, 63 1024 2048 upsampled MPS |
896 | | * 8 7, 15, 23, 31, 39, 47, 55, 63, 71 1024 2048 3072 4096 |
897 | | * 5120 6144 7168 8192 9216 |
898 | | * |
899 | | * BSAC with SBR 32 31, 63 2048 4096 downsampled MPS |
900 | | * 64 63 2048 upsampled MPS |
901 | | * 16 15, 31, 47, 63 2048 4096 6144 8192 |
902 | | * |
903 | | * AAC LD 512 8 7, 15, 23, 31, 39, 47, 55, 63, 71 |
904 | | * 512 1024 1536 2048 2560 3072 3584 4096 4608 downsampled MPS |
905 | | * 16 15, 31, 47, 63 512 1024 1536 2048 |
906 | | * |
907 | | * AAC ELD 512 8 7, 15, 23, 31, 39, 47, 55, 63, 71 |
908 | | * 512 1024 1536 2048 2560 3072 3584 4096 4608 downsampled MPS |
909 | | * 16 15, 31, 47, 63 512 1024 1536 2048 |
910 | | * |
911 | | * AAC ELD with SBR 512/1024 16 15, 31, 47, 63 1024 2048 3072 4096 |
912 | | * downsampled MPS 32 31, 63 1024 2048 upsampled MPS |
913 | | * 8 7, 15, 23, 31, 39, 47, 55, 63, 71 1024 2048 3072 4096 |
914 | | * 5120 6144 7168 8192 9216 |
915 | | * |
916 | | * MPEG1/2 Layer II 18 17, 35, 53, 71 1152 2304 3456 4608 |
917 | | * downsampled MPS 36 35, 71 1152 2304 |
918 | | * |
919 | | * MPEG1/2 Layer III 18 17, 35, 53, 71 1152 2304 3456 4608 |
920 | | * downsampled MPS 36 35, 71 1152 2304 |
921 | | * |
922 | | * \param frameLength |
923 | | * \param qmfBands |
924 | | * \param timeSlots |
925 | | * |
926 | | * \return error code |
927 | | */ |
928 | 6.38k | SACDEC_ERROR checkTimeSlots(int frameLength, int qmfBands, int timeSlots) { |
929 | 6.38k | int len; |
930 | 6.38k | int maxFrameLength; |
931 | | |
932 | 6.38k | if (qmfBands == 64) { |
933 | | /* normal MPEG Surround */ |
934 | 473 | switch (frameLength) { |
935 | 0 | case 960: |
936 | 0 | case 1920: |
937 | 0 | maxFrameLength = 3840; |
938 | 0 | break; |
939 | 0 | case 1024: |
940 | 0 | case 2048: |
941 | 0 | maxFrameLength = 4096; |
942 | 0 | break; |
943 | 462 | case 512: |
944 | 462 | case 1152: |
945 | 462 | maxFrameLength = 4608; |
946 | 462 | break; |
947 | 11 | default: |
948 | 11 | return MPS_PARSE_ERROR; |
949 | 473 | } |
950 | 5.91k | } else if (qmfBands == 32) { |
951 | | /* downsampled MPEG Surround */ |
952 | 5.01k | switch (frameLength) { |
953 | 0 | case 960: |
954 | 0 | case 1920: |
955 | 0 | maxFrameLength = 1920; |
956 | 0 | break; |
957 | 5.00k | case 512: |
958 | 5.00k | case 1024: |
959 | 5.00k | case 2048: |
960 | 5.00k | maxFrameLength = 2048; |
961 | 5.00k | break; |
962 | 0 | case 1152: |
963 | 0 | maxFrameLength = 2304; |
964 | 0 | break; |
965 | 10 | default: |
966 | 10 | return MPS_PARSE_ERROR; |
967 | 5.01k | } |
968 | 5.01k | } else if (qmfBands == 128) { |
969 | | /* upsampled MPEG Surround */ |
970 | 901 | switch (frameLength) { |
971 | 0 | case 1920: |
972 | 0 | maxFrameLength = 7680; |
973 | 0 | break; |
974 | 0 | case 1024: |
975 | 0 | maxFrameLength = 9216; |
976 | 0 | break; |
977 | 0 | case 2048: |
978 | 0 | maxFrameLength = 8192; |
979 | 0 | break; |
980 | 899 | case 512: |
981 | 899 | case 960: |
982 | 899 | case 1152: |
983 | | /* no break, no support for upsampled MPEG Surround */ |
984 | 901 | default: |
985 | 901 | return MPS_PARSE_ERROR; |
986 | 901 | } |
987 | 901 | } else { |
988 | 0 | return MPS_PARSE_ERROR; |
989 | 0 | } |
990 | | |
991 | 5.46k | len = frameLength; |
992 | | |
993 | 15.2k | while (len <= maxFrameLength) { |
994 | 14.5k | if (len == timeSlots * qmfBands) { |
995 | 4.77k | return MPS_OK; |
996 | 4.77k | } |
997 | 9.78k | len += frameLength; |
998 | 9.78k | } |
999 | 688 | return MPS_PARSE_ERROR; |
1000 | 5.46k | } |
1001 | | |
1002 | | /** |
1003 | | * \brief Check ssc for consistency (e.g. bit errors could cause trouble) |
1004 | | * First of currently two ssc-checks. |
1005 | | * This (old) one is called in mpegSurroundDecoder_Apply() |
1006 | | * only if inband mps config is contained in stream. |
1007 | | * |
1008 | | * New ssc check is split in two functions sscParseCheck() and |
1009 | | * check_UParam_Build_DecConfig(). sscParseCheck() checks only for correct |
1010 | | * parsing. check_UParam_Build_DecConfig() is used to check if we have a |
1011 | | * valid config. Both are called in initMpegSurroundDecoder() to ensure |
1012 | | * checking of inband and out-of-band mps configs. |
1013 | | * |
1014 | | * If this function can be integrated into the new functions. |
1015 | | * We can remove this one. |
1016 | | * |
1017 | | * \param pSsc spatial specific config handle. |
1018 | | * \param frameLength |
1019 | | * \param sampleRate |
1020 | | * |
1021 | | * \return MPS_OK on sucess, and else on failure. |
1022 | | */ |
1023 | | static SACDEC_ERROR sscCheckInBand(SPATIAL_SPECIFIC_CONFIG *pSsc, |
1024 | 6.38k | int frameLength, int sampleRate) { |
1025 | 6.38k | SACDEC_ERROR err = MPS_OK; |
1026 | 6.38k | int qmfBands; |
1027 | | |
1028 | 6.38k | FDK_ASSERT(pSsc != NULL); |
1029 | | |
1030 | | /* check ssc for parse errors */ |
1031 | 6.38k | if (sscParseCheck(pSsc) != MPS_OK) { |
1032 | 1.42k | err = MPS_PARSE_ERROR; |
1033 | 1.42k | } |
1034 | | |
1035 | | /* core fs and mps fs must match */ |
1036 | 6.38k | if (pSsc->samplingFreq != sampleRate) { |
1037 | 1.45k | err = MPS_PARSE_ERROR /* MPEGSDEC_SSC_PARSE_ERROR */; |
1038 | 1.45k | } |
1039 | | |
1040 | 6.38k | qmfBands = mpegSurroundDecoder_GetNrOfQmfBands(pSsc, pSsc->samplingFreq); |
1041 | | |
1042 | 6.38k | if (checkTimeSlots(frameLength, qmfBands, pSsc->nTimeSlots) != MPS_OK) { |
1043 | 1.61k | err = MPS_PARSE_ERROR; |
1044 | 1.61k | } |
1045 | | |
1046 | 6.38k | return err; |
1047 | 6.38k | } |
1048 | | |
1049 | | SACDEC_ERROR |
1050 | | mpegSurroundDecoder_ConfigureQmfDomain( |
1051 | | CMpegSurroundDecoder *pMpegSurroundDecoder, |
1052 | | SAC_INPUT_CONFIG sac_dec_interface, UINT coreSamplingRate, |
1053 | 8.06k | AUDIO_OBJECT_TYPE coreCodec) { |
1054 | 8.06k | SACDEC_ERROR err = MPS_OK; |
1055 | 8.06k | FDK_QMF_DOMAIN_GC *pGC = NULL; |
1056 | | |
1057 | 8.06k | if (pMpegSurroundDecoder == NULL) { |
1058 | 0 | return MPS_INVALID_HANDLE; |
1059 | 0 | } |
1060 | | |
1061 | 8.06k | FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); |
1062 | | |
1063 | 8.06k | pGC = &pMpegSurroundDecoder->pQmfDomain->globalConf; |
1064 | 8.06k | if (pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg) { |
1065 | 5.59k | SPATIAL_SPECIFIC_CONFIG *pSSC = |
1066 | 5.59k | &pMpegSurroundDecoder->spatialSpecificConfigBackup; |
1067 | 5.59k | if (sac_dec_interface == SAC_INTERFACE_TIME) { |
1068 | | /* For SAC_INTERFACE_QMF these parameters are set by SBR. */ |
1069 | 5.08k | pGC->nBandsAnalysis_requested = mpegSurroundDecoder_GetNrOfQmfBands( |
1070 | 5.08k | pSSC, coreSamplingRate); /* coreSamplingRate == outputSamplingRate for |
1071 | | SAC_INTERFACE_TIME */ |
1072 | 5.08k | pGC->nBandsSynthesis_requested = pGC->nBandsAnalysis_requested; |
1073 | 5.08k | pGC->nInputChannels_requested = |
1074 | 5.08k | fMax((UINT)pSSC->nInputChannels, (UINT)pGC->nInputChannels_requested); |
1075 | 5.08k | } |
1076 | 5.59k | pGC->nOutputChannels_requested = |
1077 | 5.59k | fMax((UINT)pSSC->nOutputChannels, (UINT)pGC->nOutputChannels_requested); |
1078 | 5.59k | } else { |
1079 | 2.47k | if (sac_dec_interface == SAC_INTERFACE_TIME) { |
1080 | | /* For SAC_INTERFACE_QMF these parameters are set by SBR. */ |
1081 | 2.47k | pGC->nBandsAnalysis_requested = mpegSurroundDecoder_GetNrOfQmfBands( |
1082 | 2.47k | NULL, coreSamplingRate); /* coreSamplingRate == outputSamplingRate for |
1083 | | SAC_INTERFACE_TIME */ |
1084 | 2.47k | pGC->nBandsSynthesis_requested = pGC->nBandsAnalysis_requested; |
1085 | 2.47k | pGC->nInputChannels_requested = |
1086 | 2.47k | pMpegSurroundDecoder->pSpatialDec->createParams.maxNumInputChannels; |
1087 | 2.47k | } |
1088 | 2.47k | pGC->nOutputChannels_requested = |
1089 | 2.47k | pMpegSurroundDecoder->pSpatialDec->createParams.maxNumOutputChannels; |
1090 | 2.47k | } |
1091 | 8.06k | pGC->nQmfProcBands_requested = 64; |
1092 | 8.06k | pGC->nQmfProcChannels_requested = |
1093 | 8.06k | fMin((INT)pGC->nInputChannels_requested, |
1094 | 8.06k | pMpegSurroundDecoder->pSpatialDec->createParams.maxNumInputChannels); |
1095 | | |
1096 | 8.06k | if (coreCodec == AOT_ER_AAC_ELD) { |
1097 | 8.06k | pGC->flags_requested |= QMF_FLAG_MPSLDFB; |
1098 | 8.06k | pGC->flags_requested &= ~QMF_FLAG_CLDFB; |
1099 | 8.06k | } |
1100 | | |
1101 | 8.06k | return err; |
1102 | 8.06k | } |
1103 | | |
1104 | | /** |
1105 | | * \brief Check out-of-band config |
1106 | | * |
1107 | | * \param pSsc spatial specific config handle. |
1108 | | * \param coreCodec core codec. |
1109 | | * \param sampleRate sampling frequency. |
1110 | | * |
1111 | | * \return errorStatus |
1112 | | */ |
1113 | | SACDEC_ERROR |
1114 | | sscCheckOutOfBand(const SPATIAL_SPECIFIC_CONFIG *pSsc, const INT coreCodec, |
1115 | 161k | const INT sampleRate, const INT frameSize) { |
1116 | 161k | FDK_ASSERT(pSsc != NULL); |
1117 | 161k | int qmfBands = 0; |
1118 | | |
1119 | | /* check ssc for parse errors */ |
1120 | 161k | if (sscParseCheck(pSsc) != MPS_OK) { |
1121 | 880 | return MPS_PARSE_ERROR; |
1122 | 880 | } |
1123 | | |
1124 | 160k | switch (coreCodec) { |
1125 | 96.3k | case AOT_USAC: |
1126 | 96.3k | case AOT_DRM_USAC: |
1127 | | /* ISO/IEC 23003-1:2007(E), Chapter 6.3.3, Support for lower and higher |
1128 | | * sampling frequencies */ |
1129 | 96.3k | if (pSsc->samplingFreq >= 55426) { |
1130 | 168 | return MPS_PARSE_ERROR; |
1131 | 168 | } |
1132 | 96.1k | break; |
1133 | 96.1k | case AOT_ER_AAC_LD: |
1134 | 64.3k | case AOT_ER_AAC_ELD: |
1135 | | /* core fs and mps fs must match */ |
1136 | 64.3k | if (pSsc->samplingFreq != sampleRate) { |
1137 | 5.01k | return MPS_PARSE_ERROR; |
1138 | 5.01k | } |
1139 | | |
1140 | | /* ISO/IEC 14496-3:2009 FDAM 3: Chapter 1.5.2.3, Levels for the Low Delay |
1141 | | * AAC v2 profile */ |
1142 | 59.3k | if (pSsc->samplingFreq > 48000) { |
1143 | 199 | return MPS_PARSE_ERROR; |
1144 | 199 | } |
1145 | | |
1146 | 59.1k | qmfBands = mpegSurroundDecoder_GetNrOfQmfBands(pSsc, pSsc->samplingFreq); |
1147 | 59.1k | switch (frameSize) { |
1148 | 5.82k | case 480: |
1149 | 5.82k | if (!((qmfBands == 32) && (pSsc->nTimeSlots == 15))) { |
1150 | 721 | return MPS_PARSE_ERROR; |
1151 | 721 | } |
1152 | 5.10k | break; |
1153 | 5.10k | case 960: |
1154 | 1.27k | if (!((qmfBands == 64) && (pSsc->nTimeSlots == 15))) { |
1155 | 397 | return MPS_PARSE_ERROR; |
1156 | 397 | } |
1157 | 877 | break; |
1158 | 50.9k | case 512: |
1159 | 50.9k | if (!(((qmfBands == 32) && (pSsc->nTimeSlots == 16)) || |
1160 | 50.9k | ((qmfBands == 64) && (pSsc->nTimeSlots == 8)))) { |
1161 | 7.89k | return MPS_PARSE_ERROR; |
1162 | 7.89k | } |
1163 | 43.0k | break; |
1164 | 43.0k | case 1024: |
1165 | 1.09k | if (!((qmfBands == 64) && (pSsc->nTimeSlots == 16))) { |
1166 | 440 | return MPS_PARSE_ERROR; |
1167 | 440 | } |
1168 | 657 | break; |
1169 | 657 | default: |
1170 | 0 | return MPS_PARSE_ERROR; |
1171 | 59.1k | } |
1172 | 49.6k | break; |
1173 | 49.6k | default: |
1174 | 0 | return MPS_PARSE_ERROR; |
1175 | 0 | break; |
1176 | 160k | } |
1177 | | |
1178 | 145k | return MPS_OK; |
1179 | 160k | } |
1180 | | |
1181 | | /** |
1182 | | * \brief Decode MPEG Surround frame. |
1183 | | **/ |
1184 | | int mpegSurroundDecoder_ParseNoHeader( |
1185 | | CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, |
1186 | 140k | int *pMpsDataBits, int fGlobalIndependencyFlag) { |
1187 | 140k | SACDEC_ERROR err = MPS_OK; |
1188 | 140k | SPATIAL_SPECIFIC_CONFIG *sscParse; |
1189 | 140k | int bitsAvail, numSacBits; |
1190 | | |
1191 | 140k | if (pMpegSurroundDecoder == NULL || hBs == NULL) { |
1192 | 0 | return MPS_INVALID_HANDLE; |
1193 | 0 | } |
1194 | | |
1195 | 140k | sscParse = &pMpegSurroundDecoder |
1196 | 140k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; |
1197 | | |
1198 | 140k | bitsAvail = FDKgetValidBits(hBs); |
1199 | | |
1200 | | /* First spatial specific config is parsed into spatialSpecificConfigBackup, |
1201 | | * second spatialSpecificConfigBackup is copied into |
1202 | | * spatialSpecificConfig[bsFrameDecode] */ |
1203 | 140k | if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameParse]) { |
1204 | 19.6k | FDKmemcpy(sscParse, &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1205 | 19.6k | sizeof(SPATIAL_SPECIFIC_CONFIG)); |
1206 | 19.6k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameParse] = |
1207 | 19.6k | MPEGS_SYNC_FOUND; |
1208 | 19.6k | } |
1209 | | |
1210 | 140k | if (bitsAvail <= 0) { |
1211 | 1 | err = MPS_PARSE_ERROR; |
1212 | 140k | } else { |
1213 | 140k | err = SpatialDecParseFrameData( |
1214 | 140k | pMpegSurroundDecoder->pSpatialDec, |
1215 | 140k | &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse], |
1216 | 140k | hBs, sscParse, (UPMIXTYPE)pMpegSurroundDecoder->upmixType, |
1217 | 140k | fGlobalIndependencyFlag); |
1218 | 140k | if (err == MPS_OK) { |
1219 | 140k | pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse] |
1220 | 140k | .newBsData = 1; |
1221 | 140k | } |
1222 | 140k | } |
1223 | | |
1224 | 140k | numSacBits = bitsAvail - (INT)FDKgetValidBits(hBs); |
1225 | | |
1226 | 140k | if (numSacBits > bitsAvail) { |
1227 | 350 | pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse] |
1228 | 350 | .newBsData = 0; |
1229 | 350 | err = MPS_PARSE_ERROR; |
1230 | 350 | } |
1231 | | |
1232 | 140k | *pMpsDataBits -= numSacBits; |
1233 | | |
1234 | 140k | return err; |
1235 | 140k | } |
1236 | | |
1237 | | /** |
1238 | | * \brief Check, if ancType is valid. |
1239 | | **/ |
1240 | | static int isValidAncType(CMpegSurroundDecoder *pMpegSurroundDecoder, |
1241 | 40.1k | int ancType) { |
1242 | 40.1k | int ret = 1; |
1243 | | |
1244 | 40.1k | if ((ancType != MPEGS_ANCTYPE_HEADER_AND_FRAME) && |
1245 | 40.1k | (ancType != MPEGS_ANCTYPE_FRAME)) { |
1246 | 13.2k | ret = 0; |
1247 | 13.2k | } |
1248 | | |
1249 | 40.1k | if (ret == 0) { |
1250 | 13.2k | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1251 | 13.2k | MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, |
1252 | 13.2k | MPEGS_STOP); |
1253 | 13.2k | } |
1254 | | |
1255 | 40.1k | return (ret); |
1256 | 40.1k | } |
1257 | | |
1258 | | /** |
1259 | | * \brief Check, if ancStartStop is valid. |
1260 | | **/ |
1261 | | static int isValidAncStartStop(CMpegSurroundDecoder *pMpegSurroundDecoder, |
1262 | 26.9k | int ancStartStop) { |
1263 | 26.9k | int ret = 1; |
1264 | | |
1265 | 26.9k | switch (ancStartStop) { |
1266 | 4.28k | case MPEGS_START: |
1267 | | /* Sequence start - start and continue - start not allowed */ |
1268 | 4.28k | if ((pMpegSurroundDecoder->ancStartStopPrev == MPEGS_START) || |
1269 | 4.28k | (pMpegSurroundDecoder->ancStartStopPrev == MPEGS_CONTINUE)) { |
1270 | 646 | ret = 0; |
1271 | 646 | } |
1272 | 4.28k | break; |
1273 | | |
1274 | 5.91k | case MPEGS_STOP: |
1275 | | /* MPS payload of the previous frame must be valid if current type is stop |
1276 | | Sequence startstop - stop and stop - stop not allowed |
1277 | | Sequence startstop - continue and stop - continue are allowed */ |
1278 | 5.91k | if ((pMpegSurroundDecoder->ancStartStopPrev == MPEGS_STOP) || |
1279 | 5.91k | (pMpegSurroundDecoder->ancStartStopPrev == MPEGS_START_STOP)) { |
1280 | 2.99k | ret = 0; |
1281 | 2.99k | } |
1282 | 5.91k | break; |
1283 | | |
1284 | 2.44k | case MPEGS_CONTINUE: |
1285 | 16.7k | case MPEGS_START_STOP: |
1286 | | /* No error detection possible for this states */ |
1287 | 16.7k | break; |
1288 | 26.9k | } |
1289 | | |
1290 | 26.9k | if (ret == 0) { |
1291 | 3.63k | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1292 | 3.63k | MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, |
1293 | 3.63k | MPEGS_STOP); |
1294 | 23.2k | } else { |
1295 | 23.2k | pMpegSurroundDecoder->ancStartStopPrev = (MPEGS_ANCSTARTSTOP)ancStartStop; |
1296 | 23.2k | } |
1297 | | |
1298 | 26.9k | return (ret); |
1299 | 26.9k | } |
1300 | | |
1301 | | int mpegSurroundDecoder_Parse(CMpegSurroundDecoder *pMpegSurroundDecoder, |
1302 | | HANDLE_FDK_BITSTREAM hBs, int *pMpsDataBits, |
1303 | | AUDIO_OBJECT_TYPE coreCodec, int sampleRate, |
1304 | 40.1k | int frameSize, int fGlobalIndependencyFlag) { |
1305 | 40.1k | SACDEC_ERROR err = MPS_OK; |
1306 | 40.1k | SPATIAL_SPECIFIC_CONFIG *sscParse; |
1307 | 40.1k | SPATIAL_BS_FRAME *bsFrame; |
1308 | 40.1k | HANDLE_FDK_BITSTREAM hMpsBsData = NULL; |
1309 | 40.1k | FDK_BITSTREAM mpsBsData; |
1310 | 40.1k | int mpsDataBits = *pMpsDataBits; |
1311 | 40.1k | int mpsBsBits; |
1312 | 40.1k | MPEGS_ANCTYPE ancType; |
1313 | 40.1k | MPEGS_ANCSTARTSTOP ancStartStop; |
1314 | | |
1315 | 40.1k | if (pMpegSurroundDecoder == NULL) { |
1316 | 0 | return MPS_INVALID_HANDLE; |
1317 | 0 | } |
1318 | | |
1319 | 40.1k | FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); |
1320 | | |
1321 | 40.1k | mpsBsBits = (INT)FDKgetValidBits(hBs); |
1322 | | |
1323 | 40.1k | sscParse = &pMpegSurroundDecoder |
1324 | 40.1k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; |
1325 | 40.1k | bsFrame = &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse]; |
1326 | | |
1327 | | /* |
1328 | | Find operation mode of mpeg surround decoder: |
1329 | | - MPEGS_OPMODE_EMM: Mode: Enhanced Matrix Mode (Blind) |
1330 | | - MPEGS_OPMODE_MPS_PAYLOAD: Mode: Normal, Stereo or Binaural |
1331 | | - MPEGS_OPMODE_NO_MPS_PAYLOAD: Mode: No MpegSurround Payload |
1332 | | */ |
1333 | 40.1k | { |
1334 | | /* Parse ancType and ancStartStop */ |
1335 | 40.1k | ancType = (MPEGS_ANCTYPE)FDKreadBits(hBs, 2); |
1336 | 40.1k | ancStartStop = (MPEGS_ANCSTARTSTOP)FDKreadBits(hBs, 2); |
1337 | 40.1k | mpsDataBits -= 4; |
1338 | | |
1339 | | /* Set valid anc type flag, if ancType signals a payload with either header |
1340 | | * and frame or frame */ |
1341 | 40.1k | if (isValidAncType(pMpegSurroundDecoder, ancType)) { |
1342 | | /* Set valid anc startstop flag, if transmitted sequence is not illegal */ |
1343 | 26.9k | if (isValidAncStartStop(pMpegSurroundDecoder, ancStartStop)) { |
1344 | 23.2k | switch (ancStartStop) { |
1345 | 3.64k | case MPEGS_START: |
1346 | | /* Assuming that core coder frame size (AAC) is smaller than MPS |
1347 | | coder frame size. Save audio data for next frame. */ |
1348 | 3.64k | if (mpsDataBits > MPS_DATA_BUFFER_SIZE * 8) { |
1349 | 1 | err = MPS_NOTOK; |
1350 | 1 | goto bail; |
1351 | 1 | } |
1352 | 10.3k | for (int i = 0; i < mpsDataBits / 8; i++) { |
1353 | 6.73k | pMpegSurroundDecoder->mpsData[i] = FDKreadBits(hBs, 8); |
1354 | 6.73k | } |
1355 | 3.64k | pMpegSurroundDecoder->mpsDataBits = mpsDataBits; |
1356 | 3.64k | break; |
1357 | | |
1358 | 2.44k | case MPEGS_CONTINUE: |
1359 | 5.37k | case MPEGS_STOP: |
1360 | | /* Assuming that core coder frame size (AAC) is smaller than MPS |
1361 | | coder frame size. Save audio data for next frame. */ |
1362 | 5.37k | if ((pMpegSurroundDecoder->mpsDataBits + mpsDataBits) > |
1363 | 5.37k | MPS_DATA_BUFFER_SIZE * 8) { |
1364 | 11 | err = MPS_NOTOK; |
1365 | 11 | goto bail; |
1366 | 11 | } |
1367 | 13.4k | for (int i = 0; i < mpsDataBits / 8; i++) { |
1368 | 8.08k | pMpegSurroundDecoder |
1369 | 8.08k | ->mpsData[(pMpegSurroundDecoder->mpsDataBits / 8) + i] = |
1370 | 8.08k | FDKreadBits(hBs, 8); |
1371 | 8.08k | } |
1372 | 5.36k | pMpegSurroundDecoder->mpsDataBits += mpsDataBits; |
1373 | 5.36k | FDKinitBitStream(&mpsBsData, pMpegSurroundDecoder->mpsData, |
1374 | 5.36k | MAX_BUFSIZE_BYTES, |
1375 | 5.36k | pMpegSurroundDecoder->mpsDataBits, BS_READER); |
1376 | 5.36k | hMpsBsData = &mpsBsData; |
1377 | 5.36k | break; |
1378 | | |
1379 | 14.2k | case MPEGS_START_STOP: |
1380 | 14.2k | pMpegSurroundDecoder->mpsDataBits = mpsDataBits; |
1381 | 14.2k | hMpsBsData = hBs; |
1382 | 14.2k | break; |
1383 | | |
1384 | 0 | default: |
1385 | 0 | FDK_ASSERT(0); |
1386 | 23.2k | } |
1387 | | |
1388 | 23.2k | if ((ancStartStop == MPEGS_STOP) || |
1389 | 23.2k | (ancStartStop == MPEGS_START_STOP)) { |
1390 | 17.1k | switch (ancType) { |
1391 | 7.93k | case MPEGS_ANCTYPE_HEADER_AND_FRAME: { |
1392 | 7.93k | int parseResult, bitsRead; |
1393 | 7.93k | SPATIAL_SPECIFIC_CONFIG spatialSpecificConfigTmp = |
1394 | 7.93k | pMpegSurroundDecoder->spatialSpecificConfigBackup; |
1395 | | |
1396 | | /* Parse spatial specific config */ |
1397 | 7.93k | bitsRead = (INT)FDKgetValidBits(hMpsBsData); |
1398 | | |
1399 | 7.93k | err = SpatialDecParseSpecificConfigHeader( |
1400 | 7.93k | hMpsBsData, |
1401 | 7.93k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, coreCodec, |
1402 | 7.93k | pMpegSurroundDecoder->upmixType); |
1403 | | |
1404 | 7.93k | bitsRead = (bitsRead - (INT)FDKgetValidBits(hMpsBsData)); |
1405 | 7.93k | parseResult = ((err == MPS_OK) ? bitsRead : -bitsRead); |
1406 | | |
1407 | 7.93k | if (parseResult < 0) { |
1408 | 1.54k | parseResult = -parseResult; |
1409 | 1.54k | err = MPS_PARSE_ERROR; |
1410 | 6.38k | } else if (err == MPS_OK) { |
1411 | | /* Check SSC for consistency (e.g. bit errors could cause |
1412 | | * trouble) */ |
1413 | 6.38k | err = sscCheckInBand( |
1414 | 6.38k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1415 | 6.38k | frameSize, sampleRate); |
1416 | 6.38k | } |
1417 | 7.93k | if (err != MPS_OK) { |
1418 | 3.17k | pMpegSurroundDecoder->spatialSpecificConfigBackup = |
1419 | 3.17k | spatialSpecificConfigTmp; |
1420 | 3.17k | break; |
1421 | 3.17k | } |
1422 | | |
1423 | 4.76k | pMpegSurroundDecoder->mpsDataBits -= parseResult; |
1424 | | |
1425 | | /* Initiate re-initialization, if header has changed */ |
1426 | 4.76k | if (FDK_SpatialDecCompareSpatialSpecificConfigHeader( |
1427 | 4.76k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1428 | 4.76k | sscParse) == MPS_UNEQUAL_SSC) { |
1429 | 4.48k | pMpegSurroundDecoder |
1430 | 4.48k | ->initFlags[pMpegSurroundDecoder->bsFrameParse] |= |
1431 | 4.48k | MPEGS_INIT_CHANGE_HEADER; |
1432 | 4.48k | SpatialDecInitParserContext(pMpegSurroundDecoder->pSpatialDec); |
1433 | | /* We found a valid in-band configuration. Therefore any |
1434 | | * previous config is invalid now. */ |
1435 | 4.48k | pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg = 0; |
1436 | 4.48k | } |
1437 | 4.76k | } |
1438 | 4.76k | FDK_FALLTHROUGH; |
1439 | 14.0k | case MPEGS_ANCTYPE_FRAME: |
1440 | | |
1441 | 14.0k | if (pMpegSurroundDecoder |
1442 | 14.0k | ->initFlags[pMpegSurroundDecoder->bsFrameParse] & |
1443 | 14.0k | MPEGS_INIT_ERROR_PAYLOAD) { |
1444 | 6.13k | err = MPS_PARSE_ERROR; |
1445 | 6.13k | break; |
1446 | 6.13k | } |
1447 | | |
1448 | | /* First spatial specific config is parsed into |
1449 | | * spatialSpecificConfigBackup, second spatialSpecificConfigBackup |
1450 | | * is copied into spatialSpecificConfig[bsFrameDecode] */ |
1451 | 7.87k | if (pMpegSurroundDecoder |
1452 | 7.87k | ->initFlags[pMpegSurroundDecoder->bsFrameParse]) { |
1453 | 2.54k | FDKmemcpy(sscParse, |
1454 | 2.54k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1455 | 2.54k | sizeof(SPATIAL_SPECIFIC_CONFIG)); |
1456 | 2.54k | pMpegSurroundDecoder |
1457 | 2.54k | ->fOnSync[pMpegSurroundDecoder->bsFrameParse] = |
1458 | 2.54k | MPEGS_SYNC_FOUND; |
1459 | 2.54k | } |
1460 | | |
1461 | 7.87k | if (pMpegSurroundDecoder |
1462 | 7.87k | ->fOnSync[pMpegSurroundDecoder->bsFrameParse] >= |
1463 | 7.87k | MPEGS_SYNC_FOUND) { |
1464 | 7.83k | int nbits = 0, bitsAvail; |
1465 | | |
1466 | 7.83k | if (err != MPS_OK) { |
1467 | 0 | break; |
1468 | 0 | } |
1469 | | |
1470 | 7.83k | bitsAvail = FDKgetValidBits(hMpsBsData); |
1471 | | |
1472 | 7.83k | if (bitsAvail <= 0) { |
1473 | 113 | err = MPS_PARSE_ERROR; |
1474 | 7.72k | } else { |
1475 | 7.72k | err = SpatialDecParseFrameData( |
1476 | 7.72k | pMpegSurroundDecoder->pSpatialDec, bsFrame, hMpsBsData, |
1477 | 7.72k | sscParse, (UPMIXTYPE)pMpegSurroundDecoder->upmixType, |
1478 | 7.72k | fGlobalIndependencyFlag); |
1479 | 7.72k | if (err == MPS_OK) { |
1480 | 3.14k | bsFrame->newBsData = 1; |
1481 | 3.14k | } |
1482 | 7.72k | } |
1483 | | |
1484 | 7.83k | nbits = bitsAvail - (INT)FDKgetValidBits(hMpsBsData); |
1485 | | |
1486 | 7.83k | if ((nbits > bitsAvail) || |
1487 | 7.83k | (nbits > pMpegSurroundDecoder->mpsDataBits) || |
1488 | 7.83k | (pMpegSurroundDecoder->mpsDataBits > nbits + 7 && |
1489 | 5.71k | !IS_LOWDELAY(coreCodec))) { |
1490 | 5.71k | bsFrame->newBsData = 0; |
1491 | 5.71k | err = MPS_PARSE_ERROR; |
1492 | 5.71k | break; |
1493 | 5.71k | } |
1494 | 2.12k | pMpegSurroundDecoder->mpsDataBits -= nbits; |
1495 | 2.12k | } |
1496 | 2.16k | break; |
1497 | | |
1498 | 2.16k | default: /* added to avoid compiler warning */ |
1499 | 0 | err = MPS_NOTOK; |
1500 | 0 | break; /* added to avoid compiler warning */ |
1501 | 17.1k | } /* switch (ancType) */ |
1502 | | |
1503 | 17.1k | if (err == MPS_OK) { |
1504 | 945 | pMpegSurroundDecoder->ancStartStopPrev = ancStartStop; |
1505 | 16.2k | } else { |
1506 | 16.2k | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1507 | 16.2k | MPEGS_INIT_ERROR_PAYLOAD, |
1508 | 16.2k | MPEGS_SYNC_LOST, MPEGS_STOP); |
1509 | 16.2k | pMpegSurroundDecoder->mpsDataBits = 0; |
1510 | 16.2k | } |
1511 | 17.1k | } /* (ancStartStop == MPEGS_STOP) || (ancStartStop == MPEGS_START_STOP) |
1512 | | */ |
1513 | 23.2k | } /* validAncStartStop */ |
1514 | 26.9k | } /* validAncType */ |
1515 | 40.1k | } |
1516 | | |
1517 | 40.1k | bail: |
1518 | | |
1519 | 40.1k | *pMpsDataBits -= (mpsBsBits - (INT)FDKgetValidBits(hBs)); |
1520 | | |
1521 | 40.1k | return err; |
1522 | 40.1k | } |
1523 | | |
1524 | | int mpegSurroundDecoder_Apply(CMpegSurroundDecoder *pMpegSurroundDecoder, |
1525 | | PCM_MPS *input, PCM_MPS *pTimeData, |
1526 | | const int timeDataSize, int timeDataFrameSize, |
1527 | | int *nChannels, int *frameSize, int sampleRate, |
1528 | | AUDIO_OBJECT_TYPE coreCodec, |
1529 | | AUDIO_CHANNEL_TYPE channelType[], |
1530 | | UCHAR channelIndices[], |
1531 | | const FDK_channelMapDescr *const mapDescr, |
1532 | 222k | const INT inDataHeadroom, INT *outDataHeadroom) { |
1533 | 222k | SACDEC_ERROR err = MPS_OK; |
1534 | 222k | PCM_MPS *pTimeOut = pTimeData; |
1535 | 222k | PCM_MPS *TDinput = NULL; |
1536 | 222k | UINT initControlFlags = 0, controlFlags = 0; |
1537 | 222k | int timeDataRequiredSize = 0; |
1538 | 222k | int newData; |
1539 | | |
1540 | 222k | if (pMpegSurroundDecoder == NULL) { |
1541 | 0 | return MPS_INVALID_HANDLE; |
1542 | 0 | } |
1543 | | |
1544 | 222k | FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); |
1545 | | |
1546 | 222k | if (!FDK_chMapDescr_isValid(mapDescr)) { |
1547 | 0 | return MPS_INVALID_HANDLE; |
1548 | 0 | } |
1549 | | |
1550 | 222k | if ((*nChannels <= 0) || (*nChannels > 2)) { |
1551 | 0 | return MPS_NOTOK; |
1552 | 0 | } |
1553 | | |
1554 | 222k | pMpegSurroundDecoder->pSpatialDec->sacInDataHeadroom = inDataHeadroom; |
1555 | 222k | *outDataHeadroom = (INT)(8); |
1556 | | |
1557 | 222k | pMpegSurroundDecoder->pSpatialDec->pConfigCurrent = |
1558 | 222k | &pMpegSurroundDecoder |
1559 | 222k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; |
1560 | 222k | newData = pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse] |
1561 | 222k | .newBsData; |
1562 | | |
1563 | 222k | switch (mpegSurroundOperationMode(pMpegSurroundDecoder, 1000)) { |
1564 | 222k | case MPEGS_OPMODE_MPS_PAYLOAD: |
1565 | 222k | if (pMpegSurroundDecoder |
1566 | 222k | ->initFlags[pMpegSurroundDecoder->bsFrameDecode]) { |
1567 | 68.6k | err = initMpegSurroundDecoder(pMpegSurroundDecoder); |
1568 | 68.6k | } |
1569 | | |
1570 | 222k | if (err == MPS_OK) { |
1571 | 221k | if ((pMpegSurroundDecoder |
1572 | 221k | ->fOnSync[pMpegSurroundDecoder->bsFrameDecode] != |
1573 | 221k | MPEGS_SYNC_COMPLETE) && |
1574 | 221k | (pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode] |
1575 | 83.8k | .bsIndependencyFlag == 1)) { |
1576 | | /* We got a valid header and independently decodeable frame data. |
1577 | | -> Go to the next sync level and start processing. */ |
1578 | 43.7k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
1579 | 43.7k | MPEGS_SYNC_COMPLETE; |
1580 | 43.7k | } |
1581 | 221k | } else { |
1582 | | /* We got a valid config header but found an error while parsing the |
1583 | | bitstream. Wait for the next independent frame and apply error |
1584 | | conealment in the meantime. */ |
1585 | 998 | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
1586 | 998 | MPEGS_SYNC_FOUND; |
1587 | 998 | controlFlags |= MPEGS_CONCEAL; |
1588 | 998 | err = MPS_OK; |
1589 | 998 | } |
1590 | | /* |
1591 | | Concealment: |
1592 | | - Bitstream is available, no sync found during bitstream processing |
1593 | | - Bitstream is available, sync lost due to corrupted bitstream |
1594 | | - Bitstream is available, sync found but no independent frame |
1595 | | */ |
1596 | 222k | if (pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] != |
1597 | 222k | MPEGS_SYNC_COMPLETE) { |
1598 | 41.1k | controlFlags |= MPEGS_CONCEAL; |
1599 | 41.1k | } |
1600 | 222k | break; |
1601 | | |
1602 | 0 | case MPEGS_OPMODE_NO_MPS_PAYLOAD: |
1603 | | /* Concealment: No bitstream is available */ |
1604 | 0 | controlFlags |= MPEGS_CONCEAL; |
1605 | 0 | break; |
1606 | | |
1607 | 0 | default: |
1608 | 0 | err = MPS_NOTOK; |
1609 | 222k | } |
1610 | | |
1611 | 222k | if (err != MPS_OK) { |
1612 | 0 | goto bail; |
1613 | 0 | } |
1614 | | |
1615 | | /* |
1616 | | * Force BypassMode if choosen by user |
1617 | | */ |
1618 | 222k | if (pMpegSurroundDecoder->mpegSurroundUserParams.bypassMode) { |
1619 | 0 | controlFlags |= MPEGS_BYPASSMODE; |
1620 | 0 | } |
1621 | | |
1622 | 222k | if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode]) { |
1623 | 998 | int startWithDfltCfg = 0; |
1624 | | /* |
1625 | | * Init with a default configuration if we came here and are still not |
1626 | | * initialized. |
1627 | | */ |
1628 | 998 | if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] & |
1629 | 998 | MPEGS_INIT_ENFORCE_REINIT) { |
1630 | | /* Get default spatial specific config */ |
1631 | 990 | if (FDK_SpatialDecInitDefaultSpatialSpecificConfig( |
1632 | 990 | &pMpegSurroundDecoder->spatialSpecificConfigBackup, coreCodec, |
1633 | 990 | *nChannels, sampleRate, |
1634 | 990 | *frameSize / |
1635 | 990 | mpegSurroundDecoder_GetNrOfQmfBands(NULL, sampleRate), |
1636 | 990 | pMpegSurroundDecoder->mpegSurroundDecoderLevel, |
1637 | 990 | pMpegSurroundDecoder->mpegSurroundUserParams.blindEnable)) { |
1638 | 0 | err = MPS_NOTOK; |
1639 | 0 | goto bail; |
1640 | 0 | } |
1641 | | |
1642 | | /* Initiate re-initialization, if header has changed */ |
1643 | 990 | if (FDK_SpatialDecCompareSpatialSpecificConfigHeader( |
1644 | 990 | &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1645 | 990 | &pMpegSurroundDecoder->spatialSpecificConfig |
1646 | 990 | [pMpegSurroundDecoder->bsFrameDecode]) == MPS_UNEQUAL_SSC) { |
1647 | 990 | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
1648 | 990 | MPEGS_INIT_CHANGE_HEADER; |
1649 | 990 | SpatialDecInitParserContext(pMpegSurroundDecoder->pSpatialDec); |
1650 | 990 | } |
1651 | | |
1652 | 990 | startWithDfltCfg = 1; |
1653 | 990 | } |
1654 | | |
1655 | | /* First spatial specific config is parsed into spatialSpecificConfigBackup, |
1656 | | * second spatialSpecificConfigBackup is copied into spatialSpecificConfig |
1657 | | */ |
1658 | 998 | err = initMpegSurroundDecoder(pMpegSurroundDecoder); |
1659 | | |
1660 | 998 | if (startWithDfltCfg) { |
1661 | | /* initialized with default config, but no sync found */ |
1662 | | /* maybe use updateMpegSurroundDecoderStatus later on */ |
1663 | 990 | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
1664 | 990 | MPEGS_SYNC_LOST; |
1665 | 990 | } |
1666 | | |
1667 | | /* Since we do not have state MPEGS_SYNC_COMPLETE apply concealment */ |
1668 | 998 | controlFlags |= MPEGS_CONCEAL; |
1669 | | |
1670 | 998 | if (err != MPS_OK) { |
1671 | 8 | goto bail; |
1672 | 8 | } |
1673 | 998 | } |
1674 | | |
1675 | | /* |
1676 | | * Process MPEG Surround Audio |
1677 | | */ |
1678 | 222k | initControlFlags = controlFlags; |
1679 | | |
1680 | | /* Check that provided output buffer is large enough. */ |
1681 | 222k | if (pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis == 0) { |
1682 | 0 | err = MPS_UNSUPPORTED_FORMAT; |
1683 | 0 | goto bail; |
1684 | 0 | } |
1685 | 222k | timeDataRequiredSize = |
1686 | 222k | (timeDataFrameSize * |
1687 | 222k | pMpegSurroundDecoder->pSpatialDec->numOutputChannelsAT * |
1688 | 222k | pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsSynthesis) / |
1689 | 222k | pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis; |
1690 | 222k | if (timeDataSize < timeDataRequiredSize) { |
1691 | 0 | err = MPS_OUTPUT_BUFFER_TOO_SMALL; |
1692 | 0 | goto bail; |
1693 | 0 | } |
1694 | | |
1695 | 222k | if ((pMpegSurroundDecoder->pSpatialDec->pConfigCurrent->syntaxFlags & |
1696 | 222k | SACDEC_SYNTAX_USAC) && |
1697 | 222k | (pMpegSurroundDecoder->pSpatialDec->stereoConfigIndex > 1)) { |
1698 | 21.6k | FDK_ASSERT(timeDataRequiredSize >= timeDataFrameSize * *nChannels); |
1699 | | /* Place samples comprising QMF time slots spaced at QMF output Band raster |
1700 | | * to allow slot wise processing */ |
1701 | 21.6k | int timeDataFrameSizeOut = |
1702 | 21.6k | (timeDataFrameSize * |
1703 | 21.6k | pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsSynthesis) / |
1704 | 21.6k | pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis; |
1705 | 21.6k | TDinput = pTimeData + timeDataFrameSizeOut - timeDataFrameSize; |
1706 | 64.9k | for (int i = *nChannels - 1; i >= 0; i--) { |
1707 | 43.3k | FDKmemmove(pTimeData + (i + 1) * timeDataFrameSizeOut - timeDataFrameSize, |
1708 | 43.3k | pTimeData + timeDataFrameSize * i, |
1709 | 43.3k | sizeof(PCM_MPS) * timeDataFrameSize); |
1710 | 43.3k | FDKmemclear(pTimeData + i * timeDataFrameSizeOut, |
1711 | 43.3k | sizeof(PCM_MPS) * (timeDataFrameSizeOut - timeDataFrameSize)); |
1712 | 43.3k | } |
1713 | 200k | } else { |
1714 | 200k | if (pMpegSurroundDecoder->mpegSurroundUseTimeInterface) { |
1715 | 49.2k | FDKmemcpy(input, pTimeData, |
1716 | 49.2k | sizeof(PCM_MPS) * (*nChannels) * (*frameSize)); |
1717 | 49.2k | TDinput = input; |
1718 | 49.2k | } |
1719 | 200k | } |
1720 | | |
1721 | | /* |
1722 | | * Process MPEG Surround Audio |
1723 | | */ |
1724 | 222k | err = SpatialDecApplyFrame( |
1725 | 222k | pMpegSurroundDecoder->pSpatialDec, |
1726 | 222k | &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode], |
1727 | 222k | pMpegSurroundDecoder->mpegSurroundUseTimeInterface ? INPUTMODE_TIME |
1728 | 222k | : INPUTMODE_QMF_SBR, |
1729 | 222k | TDinput, NULL, NULL, pTimeOut, *frameSize, &controlFlags, *nChannels, |
1730 | 222k | mapDescr); |
1731 | 222k | *nChannels = pMpegSurroundDecoder->pSpatialDec->numOutputChannelsAT; |
1732 | | |
1733 | 222k | if (err != |
1734 | 222k | MPS_OK) { /* A fatal error occured. Go back to start and try again: */ |
1735 | 0 | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1736 | 0 | MPEGS_INIT_ENFORCE_REINIT, MPEGS_SYNC_LOST, |
1737 | 0 | MPEGS_STOP); |
1738 | 0 | *frameSize = |
1739 | 0 | 0; /* Declare that framework can not use the data in pTimeOut. */ |
1740 | 222k | } else { |
1741 | 222k | if (((controlFlags & MPEGS_CONCEAL) && |
1742 | 222k | !(initControlFlags & MPEGS_CONCEAL)) || |
1743 | 222k | (pMpegSurroundDecoder->pSpatialDec->errInt != |
1744 | 179k | MPS_OK)) { /* Account for errors that occured in |
1745 | | SpatialDecApplyFrame(): */ |
1746 | 42.6k | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1747 | 42.6k | MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, |
1748 | 42.6k | MPEGS_STOP); |
1749 | 42.6k | } |
1750 | 222k | } |
1751 | | |
1752 | 222k | if ((err == MPS_OK) && !(controlFlags & MPEGS_BYPASSMODE) && |
1753 | 222k | !(pMpegSurroundDecoder->upmixType == UPMIX_TYPE_BYPASS)) { |
1754 | 222k | SpatialDecChannelProperties(pMpegSurroundDecoder->pSpatialDec, channelType, |
1755 | 222k | channelIndices, mapDescr); |
1756 | 222k | } |
1757 | | |
1758 | 222k | bail: |
1759 | | |
1760 | 222k | if (newData) { |
1761 | | /* numParameterSetsPrev shall only be read in the decode process, because of |
1762 | | that we can update this state variable here */ |
1763 | 141k | pMpegSurroundDecoder->pSpatialDec->numParameterSetsPrev = |
1764 | 141k | pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode] |
1765 | 141k | .numParameterSets; |
1766 | 141k | } |
1767 | | |
1768 | 222k | return (err); |
1769 | 222k | } |
1770 | | |
1771 | | /** |
1772 | | * \brief Free config dependent MPEG Surround memory. |
1773 | | **/ |
1774 | | SACDEC_ERROR mpegSurroundDecoder_FreeMem( |
1775 | 232k | CMpegSurroundDecoder *pMpegSurroundDecoder) { |
1776 | 232k | SACDEC_ERROR err = MPS_OK; |
1777 | | |
1778 | 232k | if (pMpegSurroundDecoder != NULL) { |
1779 | 232k | FDK_SpatialDecClose(pMpegSurroundDecoder->pSpatialDec); |
1780 | 232k | pMpegSurroundDecoder->pSpatialDec = NULL; |
1781 | 232k | } |
1782 | | |
1783 | 232k | return err; |
1784 | 232k | } |
1785 | | |
1786 | | /** |
1787 | | * \brief Close MPEG Surround decoder. |
1788 | | **/ |
1789 | 34.2k | void mpegSurroundDecoder_Close(CMpegSurroundDecoder *pMpegSurroundDecoder) { |
1790 | 34.2k | if (pMpegSurroundDecoder != NULL) { |
1791 | 34.2k | FDK_SpatialDecClose(pMpegSurroundDecoder->pSpatialDec); |
1792 | 34.2k | pMpegSurroundDecoder->pSpatialDec = NULL; |
1793 | | |
1794 | 68.5k | for (int i = 0; i < 1; i++) { |
1795 | 34.2k | SpatialDecCloseBsFrame(&pMpegSurroundDecoder->bsFrames[i]); |
1796 | 34.2k | } |
1797 | | |
1798 | 34.2k | FDK_FREE_MEMORY_1D(pMpegSurroundDecoder); |
1799 | 34.2k | } |
1800 | 34.2k | } |
1801 | | |
1802 | | #define SACDEC_VL0 2 |
1803 | | #define SACDEC_VL1 1 |
1804 | | #define SACDEC_VL2 0 |
1805 | | |
1806 | 222k | int mpegSurroundDecoder_GetLibInfo(LIB_INFO *info) { |
1807 | 222k | int i; |
1808 | | |
1809 | 222k | if (info == NULL) { |
1810 | 0 | return -1; |
1811 | 0 | } |
1812 | | |
1813 | | /* search for next free tab */ |
1814 | 222k | for (i = 0; i < FDK_MODULE_LAST; i++) { |
1815 | 222k | if (info[i].module_id == FDK_NONE) break; |
1816 | 222k | } |
1817 | 222k | if (i == FDK_MODULE_LAST) return -1; |
1818 | | |
1819 | 222k | info += i; |
1820 | | |
1821 | 222k | info->module_id = FDK_MPSDEC; |
1822 | | #ifdef SUPPRESS_BUILD_DATE_INFO |
1823 | | info->build_date = ""; |
1824 | | info->build_time = ""; |
1825 | | #else |
1826 | 222k | info->build_date = __DATE__; |
1827 | 222k | info->build_time = __TIME__; |
1828 | 222k | #endif |
1829 | 222k | info->title = "MPEG Surround Decoder"; |
1830 | 222k | info->version = LIB_VERSION(SACDEC_VL0, SACDEC_VL1, SACDEC_VL2); |
1831 | 222k | LIB_VERSION_STRING(info); |
1832 | 222k | info->flags = 0 | CAPF_MPS_LD | CAPF_MPS_USAC | CAPF_MPS_HQ | |
1833 | 222k | CAPF_MPS_1CH_IN | CAPF_MPS_2CH_OUT; /* end flags */ |
1834 | | |
1835 | 222k | return 0; |
1836 | 222k | } |
1837 | | |
1838 | | SACDEC_ERROR mpegSurroundDecoder_SetParam( |
1839 | | CMpegSurroundDecoder *pMpegSurroundDecoder, const SACDEC_PARAM param, |
1840 | 445k | const INT value) { |
1841 | 445k | SACDEC_ERROR err = MPS_OK; |
1842 | 445k | SPATIALDEC_PARAM *pUserParams = NULL; |
1843 | | |
1844 | | /* check decoder handle */ |
1845 | 445k | if (pMpegSurroundDecoder != NULL) { |
1846 | | /* init local shortcuts */ |
1847 | 445k | pUserParams = &pMpegSurroundDecoder->mpegSurroundUserParams; |
1848 | 445k | } else { |
1849 | 0 | err = MPS_INVALID_HANDLE; |
1850 | | /* check the parameter values before exiting. */ |
1851 | 0 | } |
1852 | | |
1853 | | /* apply param value */ |
1854 | 445k | switch (param) { |
1855 | 0 | case SACDEC_OUTPUT_MODE: |
1856 | 0 | switch ((SAC_DEC_OUTPUT_MODE)value) { |
1857 | 0 | case SACDEC_OUT_MODE_NORMAL: |
1858 | 0 | case SACDEC_OUT_MODE_STEREO: |
1859 | 0 | break; |
1860 | 0 | default: |
1861 | 0 | err = MPS_INVALID_PARAMETER; |
1862 | 0 | } |
1863 | 0 | if (err == MPS_OK) { |
1864 | 0 | if (0) { |
1865 | 0 | err = MPS_INVALID_PARAMETER; |
1866 | 0 | } else if (pUserParams->outputMode != (UCHAR)value) { |
1867 | 0 | pUserParams->outputMode = (UCHAR)value; |
1868 | 0 | pMpegSurroundDecoder |
1869 | 0 | ->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
1870 | 0 | MPEGS_INIT_CHANGE_OUTPUT_MODE; |
1871 | 0 | } |
1872 | 0 | } |
1873 | 0 | break; |
1874 | | |
1875 | 222k | case SACDEC_INTERFACE: |
1876 | 222k | if (value < 0 || value > 1) { |
1877 | 0 | err = MPS_INVALID_PARAMETER; |
1878 | 0 | } |
1879 | 222k | if (err != MPS_OK) { |
1880 | 0 | goto bail; |
1881 | 0 | } |
1882 | 222k | if (pMpegSurroundDecoder->mpegSurroundUseTimeInterface != (UCHAR)value) { |
1883 | 5.48k | pMpegSurroundDecoder->mpegSurroundUseTimeInterface = (UCHAR)value; |
1884 | 5.48k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
1885 | 5.48k | MPEGS_INIT_CHANGE_TIME_FREQ_INTERFACE; |
1886 | 5.48k | } |
1887 | 222k | break; |
1888 | | |
1889 | 0 | case SACDEC_BS_INTERRUPTION: |
1890 | 0 | if ((err == MPS_OK) && (value != 0)) { |
1891 | 0 | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1892 | 0 | MPEGS_INIT_BS_INTERRUPTION, |
1893 | 0 | MPEGS_SYNC_LOST, MPEGS_STOP); |
1894 | 0 | } |
1895 | 0 | break; |
1896 | | |
1897 | 0 | case SACDEC_CLEAR_HISTORY: |
1898 | 0 | if ((err == MPS_OK) && (value != 0)) { |
1899 | | /* Just reset the states and go on. */ |
1900 | 0 | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1901 | 0 | MPEGS_INIT_CLEAR_HISTORY, |
1902 | 0 | MPEGS_SYNC_LOST, MPEGS_STOP); |
1903 | 0 | } |
1904 | 0 | break; |
1905 | | |
1906 | 0 | case SACDEC_CONCEAL_NUM_KEEP_FRAMES: |
1907 | 0 | if (value < 0) { /* Check valid value range */ |
1908 | 0 | err = MPS_INVALID_PARAMETER; |
1909 | 0 | } |
1910 | 0 | if (err != MPS_OK) { |
1911 | 0 | goto bail; |
1912 | 0 | } |
1913 | 0 | if (pUserParams->concealNumKeepFrames != (UINT)value) { |
1914 | 0 | pUserParams->concealNumKeepFrames = (UINT)value; |
1915 | 0 | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
1916 | 0 | MPEGS_INIT_CHANGE_CONCEAL_PARAMS; |
1917 | 0 | } |
1918 | 0 | break; |
1919 | | |
1920 | 0 | case SACDEC_CONCEAL_FADE_OUT_SLOPE_LENGTH: |
1921 | 0 | if (value < 0) { /* Check valid value range */ |
1922 | 0 | err = MPS_INVALID_PARAMETER; |
1923 | 0 | } |
1924 | 0 | if (err != MPS_OK) { |
1925 | 0 | goto bail; |
1926 | 0 | } |
1927 | 0 | if (pUserParams->concealFadeOutSlopeLength != (UINT)value) { |
1928 | 0 | pUserParams->concealFadeOutSlopeLength = (UINT)value; |
1929 | 0 | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
1930 | 0 | MPEGS_INIT_CHANGE_CONCEAL_PARAMS; |
1931 | 0 | } |
1932 | 0 | break; |
1933 | | |
1934 | 0 | case SACDEC_CONCEAL_FADE_IN_SLOPE_LENGTH: |
1935 | 0 | if (value < 0) { /* Check valid value range */ |
1936 | 0 | err = MPS_INVALID_PARAMETER; |
1937 | 0 | } |
1938 | 0 | if (err != MPS_OK) { |
1939 | 0 | goto bail; |
1940 | 0 | } |
1941 | 0 | if (pUserParams->concealFadeInSlopeLength != (UINT)value) { |
1942 | 0 | pUserParams->concealFadeInSlopeLength = (UINT)value; |
1943 | 0 | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
1944 | 0 | MPEGS_INIT_CHANGE_CONCEAL_PARAMS; |
1945 | 0 | } |
1946 | 0 | break; |
1947 | | |
1948 | 0 | case SACDEC_CONCEAL_NUM_RELEASE_FRAMES: |
1949 | 0 | if (value < 0) { /* Check valid value range */ |
1950 | 0 | err = MPS_INVALID_PARAMETER; |
1951 | 0 | } |
1952 | 0 | if (err != MPS_OK) { |
1953 | 0 | goto bail; |
1954 | 0 | } |
1955 | 0 | if (pUserParams->concealNumReleaseFrames != (UINT)value) { |
1956 | 0 | pUserParams->concealNumReleaseFrames = (UINT)value; |
1957 | 0 | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
1958 | 0 | MPEGS_INIT_CHANGE_CONCEAL_PARAMS; |
1959 | 0 | } |
1960 | 0 | break; |
1961 | | |
1962 | 222k | default: |
1963 | 222k | err = MPS_INVALID_PARAMETER; |
1964 | 222k | break; |
1965 | 445k | } /* switch(param) */ |
1966 | | |
1967 | 445k | bail: |
1968 | 445k | return err; |
1969 | 445k | } |
1970 | | |
1971 | | SACDEC_ERROR mpegSurroundDecoder_IsPseudoLR( |
1972 | 276k | CMpegSurroundDecoder *pMpegSurroundDecoder, int *bsPseudoLr) { |
1973 | 276k | if (pMpegSurroundDecoder != NULL) { |
1974 | 276k | const SPATIAL_SPECIFIC_CONFIG *sscDecode = |
1975 | 276k | &pMpegSurroundDecoder |
1976 | 276k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; |
1977 | 276k | *bsPseudoLr = (int)sscDecode->bsPseudoLr; |
1978 | 276k | return MPS_OK; |
1979 | 276k | } else |
1980 | 0 | return MPS_INVALID_HANDLE; |
1981 | 276k | } |
1982 | | |
1983 | | /** |
1984 | | * \brief Get the signal delay caused by the MPEG Surround decoder module. |
1985 | | **/ |
1986 | 222k | UINT mpegSurroundDecoder_GetDelay(const CMpegSurroundDecoder *self) { |
1987 | 222k | INT outputDelay = 0; |
1988 | | |
1989 | 222k | if (self != NULL) { |
1990 | 222k | const SPATIAL_SPECIFIC_CONFIG *sscDecode = |
1991 | 222k | &self->spatialSpecificConfig[self->bsFrameDecode]; |
1992 | 222k | AUDIO_OBJECT_TYPE coreCodec = sscDecode->coreCodec; |
1993 | | |
1994 | | /* See chapter 4.5 (delay and synchronization) of ISO/IEC FDIS 23003-1 and |
1995 | | chapter 5.4.3 of ISO/IEC FDIS 23003-2 for details on the following |
1996 | | figures. */ |
1997 | | |
1998 | 222k | if (coreCodec > AOT_NULL_OBJECT) { |
1999 | 222k | if (IS_LOWDELAY(coreCodec)) { |
2000 | | /* All low delay variants (ER-AAC-(E)LD): */ |
2001 | 50.4k | outputDelay += 256; |
2002 | 171k | } else if (!IS_USAC(coreCodec)) { |
2003 | | /* By the method of elimination this is the GA (AAC-LC, HE-AAC, ...) |
2004 | | * branch: */ |
2005 | 0 | outputDelay += 320 + 257; /* cos to exp delay + QMF synthesis */ |
2006 | 0 | if (self->mpegSurroundUseTimeInterface) { |
2007 | 0 | outputDelay += 320 + 384; /* QMF and hybrid analysis */ |
2008 | 0 | } |
2009 | 0 | } |
2010 | 222k | } |
2011 | 222k | } |
2012 | | |
2013 | 222k | return (outputDelay); |
2014 | 222k | } |