/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 | 7.92k | #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 | 133k | const SPATIAL_SPECIFIC_CONFIG *pSsc, UINT sampleRate) { |
252 | 133k | UINT samplingFrequency = sampleRate; |
253 | 133k | int qmfBands = 64; |
254 | | |
255 | 133k | if (pSsc != NULL) { |
256 | 130k | switch (pSsc->coreCodec) { |
257 | 32.6k | case AOT_USAC: |
258 | 32.6k | if ((pSsc->stereoConfigIndex == 3)) { |
259 | 5.14k | static const UCHAR mapIdx2QmfBands[3] = {24, 32, 16}; |
260 | 5.14k | FDK_ASSERT((pSsc->coreSbrFrameLengthIndex >= 2) && |
261 | 5.14k | (pSsc->coreSbrFrameLengthIndex <= 4)); |
262 | 5.14k | qmfBands = mapIdx2QmfBands[pSsc->coreSbrFrameLengthIndex - 2]; |
263 | 5.14k | } |
264 | 32.6k | return qmfBands; |
265 | 97.5k | default: |
266 | 97.5k | samplingFrequency = pSsc->samplingFreq; |
267 | 97.5k | break; |
268 | 130k | } |
269 | 130k | } |
270 | | |
271 | | /* number of QMF bands depend on sampling frequency, see FDIS 23003-1:2006 |
272 | | * Chapter 6.3.3 */ |
273 | 100k | if (samplingFrequency < 27713) { |
274 | 61.9k | qmfBands = 32; |
275 | 61.9k | } |
276 | 100k | if (samplingFrequency > 55426) { |
277 | 1.32k | qmfBands = 128; |
278 | 1.32k | } |
279 | | |
280 | 100k | return qmfBands; |
281 | 133k | } |
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 | 57.2k | int *ctrlFlags) { |
292 | | /* Analyse core coder */ |
293 | 57.2k | if (pSsc1->coreCodec != pSsc2->coreCodec) { |
294 | 0 | *ctrlFlags |= MASK_MPEGS_INIT_ALL_STATES; |
295 | 0 | *ctrlFlags |= MASK_MPEGS_INIT_ALL_PARAMS; |
296 | 57.2k | } else { |
297 | | /* Analyse elements for initialization of space analysis qmf filterbank */ |
298 | 57.2k | if ((partiallyComplexFlag) || (pSsc1->treeConfig != pSsc2->treeConfig) || |
299 | 57.2k | (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 | 57.2k | if ((upmixTypeFlag) || (partiallyComplexFlag) || |
306 | 57.2k | (pSsc1->treeConfig != pSsc2->treeConfig) || |
307 | 57.2k | (pSsc1->samplingFreq != pSsc2->samplingFreq) || |
308 | 57.2k | (pSsc1->bsFixedGainDMX != pSsc2->bsFixedGainDMX)) { |
309 | 1.92k | *ctrlFlags |= MPEGS_INIT_STATES_SYN_QMF_FILTER; |
310 | 1.92k | } |
311 | | |
312 | | /* Analyse elements for initialization of decorrelator */ |
313 | 57.2k | if ((upmixTypeFlag) || (partiallyComplexFlag) || |
314 | 57.2k | (pSsc1->treeConfig != pSsc2->treeConfig) || |
315 | 57.2k | (pSsc1->samplingFreq != pSsc2->samplingFreq) || |
316 | 57.2k | (pSsc1->decorrConfig != pSsc2->decorrConfig)) { |
317 | 835 | *ctrlFlags |= MPEGS_INIT_STATES_DECORRELATOR; |
318 | 835 | } |
319 | | |
320 | | /* Analyse elements for initialization of m1 and m2 calculation */ |
321 | 57.2k | if ((upmixTypeFlag) || (binauralQualityFlag) || |
322 | 57.2k | (pSsc1->treeConfig != pSsc2->treeConfig) || |
323 | 57.2k | (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 | 57.2k | if ((upmixTypeFlag) || (pSsc1->treeConfig != pSsc2->treeConfig) || |
331 | 57.2k | (pSsc1->tempShapeConfig != pSsc2->tempShapeConfig)) { |
332 | 796 | *ctrlFlags |= MPEGS_INIT_STATES_GES; |
333 | 796 | } |
334 | | |
335 | | /* Analyse elements for initialization of FDreverb */ |
336 | 57.2k | if ((upmixTypeFlag) || (binauralQualityFlag) || (partiallyComplexFlag) || |
337 | 57.2k | (pSsc1->samplingFreq != pSsc2->samplingFreq) || |
338 | 57.2k | (pSsc1->nTimeSlots != pSsc2->nTimeSlots)) { |
339 | 1.20k | *ctrlFlags |= MPEGS_INIT_STATES_REVERB; |
340 | 1.20k | } |
341 | | |
342 | | /* Reset previous frame data whenever the config changes */ |
343 | 57.2k | if (*ctrlFlags & MPEGS_INIT_CONFIG) { |
344 | 10.3k | *ctrlFlags |= MPEGS_INIT_STATES_PARAM; |
345 | 10.3k | } |
346 | 57.2k | } |
347 | | |
348 | 57.2k | return MPS_OK; |
349 | 57.2k | } |
350 | | |
351 | | /** |
352 | | * \brief Reset MPEG Surround status info |
353 | | **/ |
354 | | static void updateMpegSurroundDecoderStatus( |
355 | | CMpegSurroundDecoder *pMpegSurroundDecoder, int initFlags, |
356 | 99.4k | MPEGS_SYNCSTATE fOnSync, MPEGS_ANCSTARTSTOP ancStartStopPrev) { |
357 | 99.4k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
358 | 99.4k | initFlags; |
359 | 99.4k | if ((pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg != 0) && |
360 | 99.4k | (pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] >= |
361 | 48.4k | MPEGS_SYNC_FOUND) && |
362 | 99.4k | (fOnSync < MPEGS_SYNC_FOUND)) { |
363 | 45.3k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
364 | 45.3k | MPEGS_SYNC_FOUND; |
365 | 54.1k | } else { |
366 | 54.1k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
367 | 54.1k | fOnSync; |
368 | 54.1k | } |
369 | 99.4k | pMpegSurroundDecoder->ancStartStopPrev = ancStartStopPrev; |
370 | 99.4k | } |
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.07k | CMpegSurroundDecoder *pMpegSurroundDecoder) { |
379 | 5.07k | SAC_INSTANCE_AVAIL instanceAvailable = SAC_INSTANCE_NOT_FULL_AVAILABLE; |
380 | | |
381 | 5.07k | if (pMpegSurroundDecoder->pSpatialDec != NULL) { |
382 | 3.70k | instanceAvailable = SAC_INSTANCE_FULL_AVAILABLE; |
383 | 3.70k | } |
384 | | |
385 | 5.07k | return instanceAvailable; |
386 | 5.07k | } |
387 | | |
388 | | SACDEC_ERROR mpegSurroundDecoder_Open( |
389 | | CMpegSurroundDecoder **pMpegSurroundDecoder, int stereoConfigIndex, |
390 | 59.7k | HANDLE_FDK_QMF_DOMAIN pQmfDomain) { |
391 | 59.7k | SACDEC_ERROR error; |
392 | | |
393 | 59.7k | error = mpegSurroundDecoder_Create(pMpegSurroundDecoder, stereoConfigIndex, |
394 | 59.7k | pQmfDomain); |
395 | | |
396 | 59.7k | return error; |
397 | 59.7k | } |
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 | 71.1k | const SPATIAL_SPECIFIC_CONFIG *pSsc, SPATIAL_DEC_UPMIX_TYPE *pUpmixType) { |
418 | 71.1k | int dmxChannels, outChannels, maxNumOutChannels; |
419 | | |
420 | 71.1k | FDK_ASSERT(pUserParams != NULL); |
421 | 71.1k | FDK_ASSERT(pUpmixType != NULL); |
422 | | |
423 | | /* checks if implementation can handle the Ssc */ |
424 | | |
425 | 71.1k | switch (pSsc->treeConfig) { |
426 | 71.1k | case SPATIALDEC_MODE_RSVD7: /* 212 */ |
427 | 71.1k | dmxChannels = 1; |
428 | 71.1k | outChannels = 2; |
429 | 71.1k | break; |
430 | 0 | default: |
431 | 0 | return MPS_UNSUPPORTED_CONFIG; |
432 | 71.1k | } |
433 | | |
434 | | /* ------------------------------------------- */ |
435 | | |
436 | | /* Analyse pDecConfig params */ |
437 | 71.1k | switch (pDecConfig->binauralMode) { |
438 | 71.1k | case BINAURAL_NONE: |
439 | 71.1k | break; |
440 | 0 | default: |
441 | 0 | return MPS_UNSUPPORTED_CONFIG; |
442 | 71.1k | } |
443 | | |
444 | 71.1k | switch (pDecConfig->decoderMode) { |
445 | 71.1k | case EXT_HQ_ONLY: |
446 | 71.1k | break; |
447 | 0 | default: |
448 | 0 | return MPS_UNSUPPORTED_CONFIG; |
449 | 71.1k | } |
450 | | |
451 | 71.1k | switch (pDecConfig->maxNumOutputChannels) { |
452 | 71.1k | case OUTPUT_CHANNELS_DEFAULT: |
453 | | /* No special restrictions -> Get the level restriction: */ |
454 | 71.1k | switch (pDecConfig->decoderLevel) { |
455 | 71.1k | case DECODER_LEVEL_0: |
456 | 71.1k | maxNumOutChannels = 2; |
457 | 71.1k | break; |
458 | 0 | default: |
459 | 0 | return MPS_UNSUPPORTED_CONFIG; |
460 | 71.1k | } |
461 | 71.1k | break; |
462 | 71.1k | case OUTPUT_CHANNELS_2_0: |
463 | 0 | maxNumOutChannels = 2; |
464 | 0 | break; |
465 | 0 | default: |
466 | 0 | return MPS_UNSUPPORTED_CONFIG; |
467 | 71.1k | } |
468 | | /* ------------------------- */ |
469 | | |
470 | | /* check if we can handle user params */ |
471 | 71.1k | if (pUserParams->blindEnable == 1) { |
472 | 0 | return MPS_UNSUPPORTED_CONFIG; |
473 | 0 | } |
474 | 71.1k | { |
475 | 71.1k | switch ((SAC_DEC_OUTPUT_MODE)pUserParams->outputMode) { |
476 | 71.1k | case SACDEC_OUT_MODE_NORMAL: |
477 | 71.1k | if (maxNumOutChannels >= outChannels) { |
478 | 71.1k | *pUpmixType = UPMIX_TYPE_NORMAL; |
479 | 71.1k | } else { |
480 | 0 | { *pUpmixType = UPMIX_TYPE_BYPASS; } |
481 | 0 | } |
482 | 71.1k | 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 | 71.1k | } |
502 | 71.1k | } |
503 | | |
504 | 71.1k | return MPS_OK; |
505 | 71.1k | } |
506 | | |
507 | | /** |
508 | | * \brief Init MPEG Surround decoder. |
509 | | **/ |
510 | | static SACDEC_ERROR initMpegSurroundDecoder( |
511 | 71.1k | CMpegSurroundDecoder *pMpegSurroundDecoder) { |
512 | 71.1k | SACDEC_ERROR err; |
513 | 71.1k | int initFlags = MPEGS_INIT_NONE, initFlagsDec; |
514 | 71.1k | int upmixTypeCurr = pMpegSurroundDecoder->upmixType; |
515 | | |
516 | 71.1k | FDK_ASSERT(pMpegSurroundDecoder != NULL); |
517 | | |
518 | 71.1k | SPATIAL_SPECIFIC_CONFIG *const pSSCinput = |
519 | 71.1k | &pMpegSurroundDecoder->spatialSpecificConfigBackup; |
520 | 71.1k | SPATIAL_SPECIFIC_CONFIG *const pSSCtarget = |
521 | 71.1k | &pMpegSurroundDecoder |
522 | 71.1k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; |
523 | 71.1k | initFlagsDec = |
524 | 71.1k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode]; |
525 | | |
526 | 71.1k | if (pSSCinput->coreCodec != AOT_USAC) { |
527 | | /* here we check if we have a valid Ssc */ |
528 | 38.4k | err = sscParseCheck(pSSCinput); |
529 | 38.4k | if (err != MPS_OK) goto bail; |
530 | 38.4k | } |
531 | | |
532 | | /* here we check if Ssc matches build; also check UParams and DecConfig */ |
533 | | /* if desired upmixType is changes */ |
534 | 71.1k | err = check_UParam_Build_DecConfig( |
535 | 71.1k | &pMpegSurroundDecoder->mpegSurroundUserParams, |
536 | 71.1k | &pMpegSurroundDecoder->decConfig, pSSCinput, |
537 | 71.1k | &pMpegSurroundDecoder->upmixType); |
538 | 71.1k | if (err != MPS_OK) goto bail; |
539 | | |
540 | | /* init config */ |
541 | 71.1k | if (initFlagsDec & MPEGS_INIT_CHANGE_HEADER) { |
542 | 22.6k | initFlags |= MPEGS_INIT_CONFIG; |
543 | 22.6k | } |
544 | | /* init all states */ |
545 | 71.1k | if (initFlagsDec & MPEGS_INIT_CLEAR_HISTORY) { |
546 | 0 | initFlags |= MASK_MPEGS_INIT_ALL_STATES; |
547 | 0 | } |
548 | 71.1k | if (initFlagsDec & MPEGS_INIT_CHANGE_CONCEAL_PARAMS) { |
549 | 0 | initFlags |= MPEGS_INIT_PARAMS_ERROR_CONCEALMENT; |
550 | 0 | } |
551 | | |
552 | 71.1k | if (initFlagsDec & MPEGS_INIT_ENFORCE_REINIT) { |
553 | | /* init all states */ |
554 | 13.8k | initFlags |= MASK_MPEGS_INIT_ALL_STATES; |
555 | 13.8k | initFlags |= MASK_MPEGS_INIT_ALL_PARAMS; |
556 | 57.2k | } else { |
557 | | /* analyse states which have to be initialized */ |
558 | 57.2k | mpegSurroundDecoder_CalcInitFlags( |
559 | 57.2k | pSSCtarget, pSSCinput, |
560 | 57.2k | (upmixTypeCurr != |
561 | 57.2k | pMpegSurroundDecoder->upmixType), /* upmixType changed */ |
562 | 57.2k | 0, (initFlagsDec & MPEGS_INIT_CHANGE_PARTIALLY_COMPLEX) ? 1 : 0, |
563 | 57.2k | &initFlags); |
564 | 57.2k | } |
565 | | |
566 | 71.1k | { |
567 | 71.1k | int nrOfQmfBands; |
568 | 71.1k | FDKmemcpy(pSSCtarget, pSSCinput, sizeof(SPATIAL_SPECIFIC_CONFIG)); |
569 | | |
570 | 71.1k | nrOfQmfBands = mpegSurroundDecoder_GetNrOfQmfBands( |
571 | 71.1k | pSSCtarget, pSSCtarget->samplingFreq); |
572 | 71.1k | err = FDK_SpatialDecInit( |
573 | 71.1k | pMpegSurroundDecoder->pSpatialDec, |
574 | 71.1k | &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode], |
575 | 71.1k | pSSCtarget, nrOfQmfBands, pMpegSurroundDecoder->upmixType, |
576 | 71.1k | &pMpegSurroundDecoder->mpegSurroundUserParams, initFlags); |
577 | | |
578 | 71.1k | if (err != MPS_OK) goto bail; |
579 | | |
580 | | /* Signal that we got a header and can go on decoding */ |
581 | 70.2k | if (err == MPS_OK) { |
582 | 70.2k | initFlagsDec = MPEGS_INIT_OK; |
583 | 70.2k | { |
584 | 70.2k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
585 | 70.2k | MPEGS_SYNC_FOUND; |
586 | 70.2k | } |
587 | 70.2k | } |
588 | 70.2k | } |
589 | | |
590 | 71.1k | bail: |
591 | 71.1k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] = |
592 | 71.1k | initFlagsDec; |
593 | 71.1k | return err; |
594 | 70.2k | } |
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 | 59.7k | HANDLE_FDK_QMF_DOMAIN pQmfDomain) { |
615 | 59.7k | SACDEC_ERROR err = MPS_OK; |
616 | 59.7k | CMpegSurroundDecoder *sacDec = NULL; |
617 | 59.7k | spatialDec *self = NULL; |
618 | | |
619 | | /* decoderLevel decoderMode maxNumOutputChannels binauralMode */ |
620 | 59.7k | static const SPATIAL_DEC_CONFIG decConfig = { |
621 | 59.7k | (CFG_LEVEL)(0), EXT_HQ_ONLY, OUTPUT_CHANNELS_DEFAULT, BINAURAL_NONE}; |
622 | | |
623 | 59.7k | if (*pMpegSurroundDecoder == NULL) { |
624 | 36.8k | FDK_ALLOCATE_MEMORY_1D(*pMpegSurroundDecoder, 1, CMpegSurroundDecoder) |
625 | | |
626 | 73.6k | for (int i = 0; i < 1; i++) { |
627 | 36.8k | err = SpatialDecCreateBsFrame(&(*pMpegSurroundDecoder)->bsFrames[i], |
628 | 36.8k | &(*pMpegSurroundDecoder)->llState); |
629 | 36.8k | if (err != MPS_OK) { |
630 | 0 | sacDec = *pMpegSurroundDecoder; |
631 | 0 | goto bail; |
632 | 0 | } |
633 | 36.8k | } |
634 | 36.8k | (*pMpegSurroundDecoder)->pQmfDomain = pQmfDomain; |
635 | | |
636 | 36.8k | (*pMpegSurroundDecoder)->bsFrameDelay = 1; |
637 | 36.8k | (*pMpegSurroundDecoder)->bsFrameParse = 0; |
638 | 36.8k | (*pMpegSurroundDecoder)->bsFrameDecode = 0; |
639 | | |
640 | 36.8k | return err; |
641 | 36.8k | } else { |
642 | 22.8k | sacDec = *pMpegSurroundDecoder; |
643 | 22.8k | } |
644 | | |
645 | 22.8k | if (sacDec->pSpatialDec == NULL) { |
646 | 22.1k | if ((self = FDK_SpatialDecOpen(&decConfig, stereoConfigIndex)) == NULL) { |
647 | 0 | err = MPS_OUTOFMEMORY; |
648 | 0 | goto bail; |
649 | 0 | } |
650 | 22.1k | } else { |
651 | 675 | self = sacDec->pSpatialDec; |
652 | 675 | } |
653 | | |
654 | 22.8k | self->pQmfDomain = sacDec->pQmfDomain; |
655 | | |
656 | 22.8k | sacDec->pSpatialDec = self; |
657 | | |
658 | | /* default parameter set */ |
659 | 22.8k | sacDec->mpegSurroundUserParams.outputMode = SACDEC_OUT_MODE_NORMAL; |
660 | 22.8k | sacDec->mpegSurroundUserParams.blindEnable = 0; |
661 | 22.8k | sacDec->mpegSurroundUserParams.bypassMode = 0; |
662 | 22.8k | sacDec->mpegSurroundUserParams.concealMethod = 1; |
663 | 22.8k | sacDec->mpegSurroundUserParams.concealNumKeepFrames = 10; |
664 | 22.8k | sacDec->mpegSurroundUserParams.concealFadeOutSlopeLength = 5; |
665 | 22.8k | sacDec->mpegSurroundUserParams.concealFadeInSlopeLength = 5; |
666 | 22.8k | sacDec->mpegSurroundUserParams.concealNumReleaseFrames = 3; |
667 | 22.8k | sacDec->mpegSurroundSscIsGlobalCfg = 0; |
668 | 22.8k | sacDec->mpegSurroundUseTimeInterface = 1; |
669 | 22.8k | sacDec->mpegSurroundDecoderLevel = decConfig.decoderLevel; |
670 | | |
671 | 22.8k | sacDec->upmixType = UPMIX_TYPE_NORMAL; |
672 | | |
673 | | /* signalize spatial decoder re-initalization */ |
674 | 22.8k | updateMpegSurroundDecoderStatus(sacDec, MPEGS_INIT_ENFORCE_REINIT, |
675 | 22.8k | MPEGS_SYNC_LOST, MPEGS_STOP); |
676 | | |
677 | | /* return decoder instance */ |
678 | 22.8k | *pMpegSurroundDecoder = sacDec; |
679 | 22.8k | sacDec->decConfig = decConfig; |
680 | | |
681 | 22.8k | SpatialDecInitParserContext(sacDec->pSpatialDec); |
682 | | |
683 | 22.8k | 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 | 177k | INT configBytes, const UCHAR configMode, UCHAR *configChanged) { |
705 | 177k | SACDEC_ERROR err = MPS_OK; |
706 | 177k | INT nInputChannels; |
707 | 177k | SPATIAL_SPECIFIC_CONFIG spatialSpecificConfig; |
708 | 177k | SPATIAL_SPECIFIC_CONFIG *pSsc = |
709 | 177k | &pMpegSurroundDecoder->spatialSpecificConfigBackup; |
710 | | |
711 | 177k | switch (coreCodec) { |
712 | 0 | case AOT_DRM_USAC: |
713 | 91.7k | case AOT_USAC: |
714 | 91.7k | if (configMode == AC_CM_DET_CFG_CHANGE) { |
715 | | /* In config detection mode write spatial specific config parameters |
716 | | * into temporarily allocated structure */ |
717 | 57.7k | err = SpatialDecParseMps212Config( |
718 | 57.7k | hBs, &spatialSpecificConfig, samplingRate, coreCodec, |
719 | 57.7k | stereoConfigIndex, coreSbrFrameLengthIndex); |
720 | 57.7k | nInputChannels = spatialSpecificConfig.nInputChannels; |
721 | 57.7k | pSsc = &spatialSpecificConfig; |
722 | 57.7k | } else { |
723 | 34.0k | err = SpatialDecParseMps212Config( |
724 | 34.0k | hBs, &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
725 | 34.0k | samplingRate, coreCodec, stereoConfigIndex, |
726 | 34.0k | coreSbrFrameLengthIndex); |
727 | 34.0k | nInputChannels = |
728 | 34.0k | pMpegSurroundDecoder->spatialSpecificConfigBackup.nInputChannels; |
729 | 34.0k | } |
730 | 91.7k | if ((err == MPS_OK) && (numChannels != nInputChannels)) { |
731 | 0 | err = MPS_PARSE_ERROR; |
732 | 0 | } |
733 | 91.7k | break; |
734 | 85.4k | case AOT_ER_AAC_ELD: |
735 | 85.4k | case AOT_ER_AAC_LD: |
736 | 85.4k | if (configMode == AC_CM_DET_CFG_CHANGE) { |
737 | | /* In config detection mode write spatial specific config parameters |
738 | | * into temporarily allocated structure */ |
739 | 69.3k | err = SpatialDecParseSpecificConfig(hBs, &spatialSpecificConfig, |
740 | 69.3k | configBytes, coreCodec); |
741 | 69.3k | nInputChannels = spatialSpecificConfig.nInputChannels; |
742 | 69.3k | pSsc = &spatialSpecificConfig; |
743 | 69.3k | } else { |
744 | 16.0k | err = SpatialDecParseSpecificConfig( |
745 | 16.0k | hBs, &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
746 | 16.0k | configBytes, coreCodec); |
747 | 16.0k | nInputChannels = |
748 | 16.0k | pMpegSurroundDecoder->spatialSpecificConfigBackup.nInputChannels; |
749 | 16.0k | } |
750 | | /* check number of channels for channel_configuration > 0 */ |
751 | 85.4k | if ((err == MPS_OK) && (numChannels > 0) && |
752 | 85.4k | (numChannels != nInputChannels)) { |
753 | 444 | err = MPS_PARSE_ERROR; |
754 | 444 | } |
755 | 85.4k | break; |
756 | 332 | default: |
757 | 332 | err = MPS_UNSUPPORTED_FORMAT; |
758 | 332 | break; |
759 | 177k | } |
760 | | |
761 | 177k | if (err != MPS_OK) { |
762 | 37.3k | goto bail; |
763 | 37.3k | } |
764 | | |
765 | 140k | err = sscCheckOutOfBand(pSsc, coreCodec, samplingRate, frameSize); |
766 | | |
767 | 140k | if (err != MPS_OK) { |
768 | 20.3k | goto bail; |
769 | 20.3k | } |
770 | | |
771 | 119k | if (configMode & AC_CM_DET_CFG_CHANGE) { |
772 | 75.6k | return err; |
773 | 75.6k | } |
774 | | |
775 | 44.2k | if (configMode & AC_CM_ALLOC_MEM) { |
776 | 44.2k | if (*configChanged) { |
777 | 21.5k | err = mpegSurroundDecoder_Open(&pMpegSurroundDecoder, stereoConfigIndex, |
778 | 21.5k | NULL); |
779 | 21.5k | if (err) { |
780 | 0 | return err; |
781 | 0 | } |
782 | 21.5k | } |
783 | 44.2k | } |
784 | | |
785 | 44.2k | { |
786 | 44.2k | SPATIAL_SPECIFIC_CONFIG *sscParse = |
787 | 44.2k | &pMpegSurroundDecoder |
788 | 44.2k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; |
789 | | |
790 | 44.2k | if (FDK_SpatialDecCompareSpatialSpecificConfigHeader( |
791 | 44.2k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, sscParse)) { |
792 | 29.7k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameParse] |= |
793 | 29.7k | MPEGS_INIT_CHANGE_HEADER; |
794 | | /* Error resilience code */ |
795 | 29.7k | if (pMpegSurroundDecoder->pSpatialDec == NULL) { |
796 | 259 | err = MPS_NOTOK; |
797 | 259 | goto bail; |
798 | 259 | } |
799 | 29.5k | SpatialDecInitParserContext(pMpegSurroundDecoder->pSpatialDec); |
800 | 29.5k | pMpegSurroundDecoder->pSpatialDec->pConfigCurrent = |
801 | 29.5k | &pMpegSurroundDecoder |
802 | 29.5k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; |
803 | 29.5k | } |
804 | 44.2k | } |
805 | | |
806 | 43.9k | if (err == MPS_OK) { |
807 | | /* We got a valid out-of-band configuration so label it accordingly. */ |
808 | 43.9k | pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg = 1; |
809 | 43.9k | } |
810 | | |
811 | 101k | bail: |
812 | 101k | return err; |
813 | 43.9k | } |
814 | | |
815 | | /** |
816 | | * \brief Determine MPEG Surround operation mode. |
817 | | **/ |
818 | | static MPEGS_OPMODE mpegSurroundOperationMode( |
819 | 220k | CMpegSurroundDecoder *pMpegSurroundDecoder, int mpsDataBits) { |
820 | 220k | MPEGS_OPMODE mode; |
821 | | |
822 | 220k | { |
823 | 220k | if ((mpsDataBits > 0) && |
824 | 220k | (pMpegSurroundDecoder->mpegSurroundUserParams.blindEnable == 0)) { |
825 | 220k | mode = MPEGS_OPMODE_MPS_PAYLOAD; /* Mode: Normal, Stereo or Binaural */ |
826 | 220k | } 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 | 220k | } |
833 | | |
834 | 220k | return (mode); |
835 | 220k | } |
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 | 186k | static SACDEC_ERROR sscParseCheck(const SPATIAL_SPECIFIC_CONFIG *pSsc) { |
849 | 186k | if (pSsc->samplingFreq > 96000) return MPS_PARSE_ERROR; |
850 | 185k | if (pSsc->samplingFreq < 8000) return MPS_PARSE_ERROR; |
851 | | |
852 | 184k | if ((pSsc->treeConfig < 0) || (pSsc->treeConfig > 7)) { |
853 | 0 | return MPS_PARSE_ERROR; |
854 | 0 | } |
855 | | |
856 | 184k | if ((pSsc->quantMode < 0) || (pSsc->quantMode > 2)) { |
857 | 1.37k | return MPS_PARSE_ERROR; |
858 | 1.37k | } |
859 | | |
860 | | /* now we are sure there were no parsing errors */ |
861 | | |
862 | 183k | return MPS_OK; |
863 | 184k | } |
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 | 7.58k | SACDEC_ERROR checkTimeSlots(int frameLength, int qmfBands, int timeSlots) { |
929 | 7.58k | int len; |
930 | 7.58k | int maxFrameLength; |
931 | | |
932 | 7.58k | if (qmfBands == 64) { |
933 | | /* normal MPEG Surround */ |
934 | 717 | 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 | 703 | case 512: |
944 | 703 | case 1152: |
945 | 703 | maxFrameLength = 4608; |
946 | 703 | break; |
947 | 14 | default: |
948 | 14 | return MPS_PARSE_ERROR; |
949 | 717 | } |
950 | 6.86k | } else if (qmfBands == 32) { |
951 | | /* downsampled MPEG Surround */ |
952 | 5.54k | switch (frameLength) { |
953 | 0 | case 960: |
954 | 0 | case 1920: |
955 | 0 | maxFrameLength = 1920; |
956 | 0 | break; |
957 | 5.53k | case 512: |
958 | 5.53k | case 1024: |
959 | 5.53k | case 2048: |
960 | 5.53k | maxFrameLength = 2048; |
961 | 5.53k | break; |
962 | 0 | case 1152: |
963 | 0 | maxFrameLength = 2304; |
964 | 0 | break; |
965 | 10 | default: |
966 | 10 | return MPS_PARSE_ERROR; |
967 | 5.54k | } |
968 | 5.54k | } else if (qmfBands == 128) { |
969 | | /* upsampled MPEG Surround */ |
970 | 1.32k | 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 | 1.32k | case 512: |
981 | 1.32k | case 960: |
982 | 1.32k | case 1152: |
983 | | /* no break, no support for upsampled MPEG Surround */ |
984 | 1.32k | default: |
985 | 1.32k | return MPS_PARSE_ERROR; |
986 | 1.32k | } |
987 | 1.32k | } else { |
988 | 0 | return MPS_PARSE_ERROR; |
989 | 0 | } |
990 | | |
991 | 6.23k | len = frameLength; |
992 | | |
993 | 18.9k | while (len <= maxFrameLength) { |
994 | 17.9k | if (len == timeSlots * qmfBands) { |
995 | 5.22k | return MPS_OK; |
996 | 5.22k | } |
997 | 12.7k | len += frameLength; |
998 | 12.7k | } |
999 | 1.01k | return MPS_PARSE_ERROR; |
1000 | 6.23k | } |
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 | 7.58k | int frameLength, int sampleRate) { |
1025 | 7.58k | SACDEC_ERROR err = MPS_OK; |
1026 | 7.58k | int qmfBands; |
1027 | | |
1028 | 7.58k | FDK_ASSERT(pSsc != NULL); |
1029 | | |
1030 | | /* check ssc for parse errors */ |
1031 | 7.58k | if (sscParseCheck(pSsc) != MPS_OK) { |
1032 | 2.10k | err = MPS_PARSE_ERROR; |
1033 | 2.10k | } |
1034 | | |
1035 | | /* core fs and mps fs must match */ |
1036 | 7.58k | if (pSsc->samplingFreq != sampleRate) { |
1037 | 2.15k | err = MPS_PARSE_ERROR /* MPEGSDEC_SSC_PARSE_ERROR */; |
1038 | 2.15k | } |
1039 | | |
1040 | 7.58k | qmfBands = mpegSurroundDecoder_GetNrOfQmfBands(pSsc, pSsc->samplingFreq); |
1041 | | |
1042 | 7.58k | if (checkTimeSlots(frameLength, qmfBands, pSsc->nTimeSlots) != MPS_OK) { |
1043 | 2.36k | err = MPS_PARSE_ERROR; |
1044 | 2.36k | } |
1045 | | |
1046 | 7.58k | return err; |
1047 | 7.58k | } |
1048 | | |
1049 | | SACDEC_ERROR |
1050 | | mpegSurroundDecoder_ConfigureQmfDomain( |
1051 | | CMpegSurroundDecoder *pMpegSurroundDecoder, |
1052 | | SAC_INPUT_CONFIG sac_dec_interface, UINT coreSamplingRate, |
1053 | 7.21k | AUDIO_OBJECT_TYPE coreCodec) { |
1054 | 7.21k | SACDEC_ERROR err = MPS_OK; |
1055 | 7.21k | FDK_QMF_DOMAIN_GC *pGC = NULL; |
1056 | | |
1057 | 7.21k | if (pMpegSurroundDecoder == NULL) { |
1058 | 0 | return MPS_INVALID_HANDLE; |
1059 | 0 | } |
1060 | | |
1061 | 7.21k | FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); |
1062 | | |
1063 | 7.21k | pGC = &pMpegSurroundDecoder->pQmfDomain->globalConf; |
1064 | 7.21k | if (pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg) { |
1065 | 5.01k | SPATIAL_SPECIFIC_CONFIG *pSSC = |
1066 | 5.01k | &pMpegSurroundDecoder->spatialSpecificConfigBackup; |
1067 | 5.01k | if (sac_dec_interface == SAC_INTERFACE_TIME) { |
1068 | | /* For SAC_INTERFACE_QMF these parameters are set by SBR. */ |
1069 | 4.53k | pGC->nBandsAnalysis_requested = mpegSurroundDecoder_GetNrOfQmfBands( |
1070 | 4.53k | pSSC, coreSamplingRate); /* coreSamplingRate == outputSamplingRate for |
1071 | | SAC_INTERFACE_TIME */ |
1072 | 4.53k | pGC->nBandsSynthesis_requested = pGC->nBandsAnalysis_requested; |
1073 | 4.53k | pGC->nInputChannels_requested = |
1074 | 4.53k | fMax((UINT)pSSC->nInputChannels, (UINT)pGC->nInputChannels_requested); |
1075 | 4.53k | } |
1076 | 5.01k | pGC->nOutputChannels_requested = |
1077 | 5.01k | fMax((UINT)pSSC->nOutputChannels, (UINT)pGC->nOutputChannels_requested); |
1078 | 5.01k | } else { |
1079 | 2.20k | if (sac_dec_interface == SAC_INTERFACE_TIME) { |
1080 | | /* For SAC_INTERFACE_QMF these parameters are set by SBR. */ |
1081 | 2.20k | pGC->nBandsAnalysis_requested = mpegSurroundDecoder_GetNrOfQmfBands( |
1082 | 2.20k | NULL, coreSamplingRate); /* coreSamplingRate == outputSamplingRate for |
1083 | | SAC_INTERFACE_TIME */ |
1084 | 2.20k | pGC->nBandsSynthesis_requested = pGC->nBandsAnalysis_requested; |
1085 | 2.20k | pGC->nInputChannels_requested = |
1086 | 2.20k | pMpegSurroundDecoder->pSpatialDec->createParams.maxNumInputChannels; |
1087 | 2.20k | } |
1088 | 2.20k | pGC->nOutputChannels_requested = |
1089 | 2.20k | pMpegSurroundDecoder->pSpatialDec->createParams.maxNumOutputChannels; |
1090 | 2.20k | } |
1091 | 7.21k | pGC->nQmfProcBands_requested = 64; |
1092 | 7.21k | pGC->nQmfProcChannels_requested = |
1093 | 7.21k | fMin((INT)pGC->nInputChannels_requested, |
1094 | 7.21k | pMpegSurroundDecoder->pSpatialDec->createParams.maxNumInputChannels); |
1095 | | |
1096 | 7.21k | if (coreCodec == AOT_ER_AAC_ELD) { |
1097 | 7.21k | pGC->flags_requested |= QMF_FLAG_MPSLDFB; |
1098 | 7.21k | pGC->flags_requested &= ~QMF_FLAG_CLDFB; |
1099 | 7.21k | } |
1100 | | |
1101 | 7.21k | return err; |
1102 | 7.21k | } |
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 | 140k | const INT sampleRate, const INT frameSize) { |
1116 | 140k | FDK_ASSERT(pSsc != NULL); |
1117 | 140k | int qmfBands = 0; |
1118 | | |
1119 | | /* check ssc for parse errors */ |
1120 | 140k | if (sscParseCheck(pSsc) != MPS_OK) { |
1121 | 655 | return MPS_PARSE_ERROR; |
1122 | 655 | } |
1123 | | |
1124 | 139k | switch (coreCodec) { |
1125 | 90.1k | case AOT_USAC: |
1126 | 90.1k | case AOT_DRM_USAC: |
1127 | | /* ISO/IEC 23003-1:2007(E), Chapter 6.3.3, Support for lower and higher |
1128 | | * sampling frequencies */ |
1129 | 90.1k | if (pSsc->samplingFreq >= 55426) { |
1130 | 303 | return MPS_PARSE_ERROR; |
1131 | 303 | } |
1132 | 89.8k | break; |
1133 | 89.8k | case AOT_ER_AAC_LD: |
1134 | 49.4k | case AOT_ER_AAC_ELD: |
1135 | | /* core fs and mps fs must match */ |
1136 | 49.4k | if (pSsc->samplingFreq != sampleRate) { |
1137 | 2.32k | return MPS_PARSE_ERROR; |
1138 | 2.32k | } |
1139 | | |
1140 | | /* ISO/IEC 14496-3:2009 FDAM 3: Chapter 1.5.2.3, Levels for the Low Delay |
1141 | | * AAC v2 profile */ |
1142 | 47.0k | if (pSsc->samplingFreq > 48000) { |
1143 | 201 | return MPS_PARSE_ERROR; |
1144 | 201 | } |
1145 | | |
1146 | 46.8k | qmfBands = mpegSurroundDecoder_GetNrOfQmfBands(pSsc, pSsc->samplingFreq); |
1147 | 46.8k | switch (frameSize) { |
1148 | 5.12k | case 480: |
1149 | 5.12k | if (!((qmfBands == 32) && (pSsc->nTimeSlots == 15))) { |
1150 | 519 | return MPS_PARSE_ERROR; |
1151 | 519 | } |
1152 | 4.60k | break; |
1153 | 4.60k | case 960: |
1154 | 1.26k | if (!((qmfBands == 64) && (pSsc->nTimeSlots == 15))) { |
1155 | 394 | return MPS_PARSE_ERROR; |
1156 | 394 | } |
1157 | 867 | break; |
1158 | 39.2k | case 512: |
1159 | 39.2k | if (!(((qmfBands == 32) && (pSsc->nTimeSlots == 16)) || |
1160 | 39.2k | ((qmfBands == 64) && (pSsc->nTimeSlots == 8)))) { |
1161 | 15.5k | return MPS_PARSE_ERROR; |
1162 | 15.5k | } |
1163 | 23.7k | break; |
1164 | 23.7k | case 1024: |
1165 | 1.25k | if (!((qmfBands == 64) && (pSsc->nTimeSlots == 16))) { |
1166 | 423 | return MPS_PARSE_ERROR; |
1167 | 423 | } |
1168 | 829 | break; |
1169 | 829 | default: |
1170 | 0 | return MPS_PARSE_ERROR; |
1171 | 46.8k | } |
1172 | 30.0k | break; |
1173 | 30.0k | default: |
1174 | 0 | return MPS_PARSE_ERROR; |
1175 | 0 | break; |
1176 | 139k | } |
1177 | | |
1178 | 119k | return MPS_OK; |
1179 | 139k | } |
1180 | | |
1181 | | /** |
1182 | | * \brief Decode MPEG Surround frame. |
1183 | | **/ |
1184 | | int mpegSurroundDecoder_ParseNoHeader( |
1185 | | CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, |
1186 | 137k | int *pMpsDataBits, int fGlobalIndependencyFlag) { |
1187 | 137k | SACDEC_ERROR err = MPS_OK; |
1188 | 137k | SPATIAL_SPECIFIC_CONFIG *sscParse; |
1189 | 137k | int bitsAvail, numSacBits; |
1190 | | |
1191 | 137k | if (pMpegSurroundDecoder == NULL || hBs == NULL) { |
1192 | 0 | return MPS_INVALID_HANDLE; |
1193 | 0 | } |
1194 | | |
1195 | 137k | sscParse = &pMpegSurroundDecoder |
1196 | 137k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; |
1197 | | |
1198 | 137k | bitsAvail = FDKgetValidBits(hBs); |
1199 | | |
1200 | | /* First spatial specific config is parsed into spatialSpecificConfigBackup, |
1201 | | * second spatialSpecificConfigBackup is copied into |
1202 | | * spatialSpecificConfig[bsFrameDecode] */ |
1203 | 137k | if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameParse]) { |
1204 | 19.5k | FDKmemcpy(sscParse, &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1205 | 19.5k | sizeof(SPATIAL_SPECIFIC_CONFIG)); |
1206 | 19.5k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameParse] = |
1207 | 19.5k | MPEGS_SYNC_FOUND; |
1208 | 19.5k | } |
1209 | | |
1210 | 137k | if (bitsAvail <= 0) { |
1211 | 2 | err = MPS_PARSE_ERROR; |
1212 | 137k | } else { |
1213 | 137k | err = SpatialDecParseFrameData( |
1214 | 137k | pMpegSurroundDecoder->pSpatialDec, |
1215 | 137k | &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse], |
1216 | 137k | hBs, sscParse, (UPMIXTYPE)pMpegSurroundDecoder->upmixType, |
1217 | 137k | fGlobalIndependencyFlag); |
1218 | 137k | if (err == MPS_OK) { |
1219 | 137k | pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse] |
1220 | 137k | .newBsData = 1; |
1221 | 137k | } |
1222 | 137k | } |
1223 | | |
1224 | 137k | numSacBits = bitsAvail - (INT)FDKgetValidBits(hBs); |
1225 | | |
1226 | 137k | if (numSacBits > bitsAvail) { |
1227 | 376 | pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse] |
1228 | 376 | .newBsData = 0; |
1229 | 376 | err = MPS_PARSE_ERROR; |
1230 | 376 | } |
1231 | | |
1232 | 137k | *pMpsDataBits -= numSacBits; |
1233 | | |
1234 | 137k | return err; |
1235 | 137k | } |
1236 | | |
1237 | | /** |
1238 | | * \brief Check, if ancType is valid. |
1239 | | **/ |
1240 | | static int isValidAncType(CMpegSurroundDecoder *pMpegSurroundDecoder, |
1241 | 41.5k | int ancType) { |
1242 | 41.5k | int ret = 1; |
1243 | | |
1244 | 41.5k | if ((ancType != MPEGS_ANCTYPE_HEADER_AND_FRAME) && |
1245 | 41.5k | (ancType != MPEGS_ANCTYPE_FRAME)) { |
1246 | 13.4k | ret = 0; |
1247 | 13.4k | } |
1248 | | |
1249 | 41.5k | if (ret == 0) { |
1250 | 13.4k | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1251 | 13.4k | MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, |
1252 | 13.4k | MPEGS_STOP); |
1253 | 13.4k | } |
1254 | | |
1255 | 41.5k | return (ret); |
1256 | 41.5k | } |
1257 | | |
1258 | | /** |
1259 | | * \brief Check, if ancStartStop is valid. |
1260 | | **/ |
1261 | | static int isValidAncStartStop(CMpegSurroundDecoder *pMpegSurroundDecoder, |
1262 | 28.0k | int ancStartStop) { |
1263 | 28.0k | int ret = 1; |
1264 | | |
1265 | 28.0k | switch (ancStartStop) { |
1266 | 3.98k | case MPEGS_START: |
1267 | | /* Sequence start - start and continue - start not allowed */ |
1268 | 3.98k | if ((pMpegSurroundDecoder->ancStartStopPrev == MPEGS_START) || |
1269 | 3.98k | (pMpegSurroundDecoder->ancStartStopPrev == MPEGS_CONTINUE)) { |
1270 | 789 | ret = 0; |
1271 | 789 | } |
1272 | 3.98k | break; |
1273 | | |
1274 | 5.11k | 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.11k | if ((pMpegSurroundDecoder->ancStartStopPrev == MPEGS_STOP) || |
1279 | 5.11k | (pMpegSurroundDecoder->ancStartStopPrev == MPEGS_START_STOP)) { |
1280 | 2.76k | ret = 0; |
1281 | 2.76k | } |
1282 | 5.11k | break; |
1283 | | |
1284 | 2.38k | case MPEGS_CONTINUE: |
1285 | 18.9k | case MPEGS_START_STOP: |
1286 | | /* No error detection possible for this states */ |
1287 | 18.9k | break; |
1288 | 28.0k | } |
1289 | | |
1290 | 28.0k | if (ret == 0) { |
1291 | 3.55k | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1292 | 3.55k | MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, |
1293 | 3.55k | MPEGS_STOP); |
1294 | 24.5k | } else { |
1295 | 24.5k | pMpegSurroundDecoder->ancStartStopPrev = (MPEGS_ANCSTARTSTOP)ancStartStop; |
1296 | 24.5k | } |
1297 | | |
1298 | 28.0k | return (ret); |
1299 | 28.0k | } |
1300 | | |
1301 | | int mpegSurroundDecoder_Parse(CMpegSurroundDecoder *pMpegSurroundDecoder, |
1302 | | HANDLE_FDK_BITSTREAM hBs, int *pMpsDataBits, |
1303 | | AUDIO_OBJECT_TYPE coreCodec, int sampleRate, |
1304 | 41.5k | int frameSize, int fGlobalIndependencyFlag) { |
1305 | 41.5k | SACDEC_ERROR err = MPS_OK; |
1306 | 41.5k | SPATIAL_SPECIFIC_CONFIG *sscParse; |
1307 | 41.5k | SPATIAL_BS_FRAME *bsFrame; |
1308 | 41.5k | HANDLE_FDK_BITSTREAM hMpsBsData = NULL; |
1309 | 41.5k | FDK_BITSTREAM mpsBsData; |
1310 | 41.5k | int mpsDataBits = *pMpsDataBits; |
1311 | 41.5k | int mpsBsBits; |
1312 | 41.5k | MPEGS_ANCTYPE ancType; |
1313 | 41.5k | MPEGS_ANCSTARTSTOP ancStartStop; |
1314 | | |
1315 | 41.5k | if (pMpegSurroundDecoder == NULL) { |
1316 | 0 | return MPS_INVALID_HANDLE; |
1317 | 0 | } |
1318 | | |
1319 | 41.5k | FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); |
1320 | | |
1321 | 41.5k | mpsBsBits = (INT)FDKgetValidBits(hBs); |
1322 | | |
1323 | 41.5k | sscParse = &pMpegSurroundDecoder |
1324 | 41.5k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; |
1325 | 41.5k | 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 | 41.5k | { |
1334 | | /* Parse ancType and ancStartStop */ |
1335 | 41.5k | ancType = (MPEGS_ANCTYPE)FDKreadBits(hBs, 2); |
1336 | 41.5k | ancStartStop = (MPEGS_ANCSTARTSTOP)FDKreadBits(hBs, 2); |
1337 | 41.5k | mpsDataBits -= 4; |
1338 | | |
1339 | | /* Set valid anc type flag, if ancType signals a payload with either header |
1340 | | * and frame or frame */ |
1341 | 41.5k | if (isValidAncType(pMpegSurroundDecoder, ancType)) { |
1342 | | /* Set valid anc startstop flag, if transmitted sequence is not illegal */ |
1343 | 28.0k | if (isValidAncStartStop(pMpegSurroundDecoder, ancStartStop)) { |
1344 | 24.5k | switch (ancStartStop) { |
1345 | 3.19k | 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.19k | if (mpsDataBits > MPS_DATA_BUFFER_SIZE * 8) { |
1349 | 1 | err = MPS_NOTOK; |
1350 | 1 | goto bail; |
1351 | 1 | } |
1352 | 9.63k | for (int i = 0; i < mpsDataBits / 8; i++) { |
1353 | 6.44k | pMpegSurroundDecoder->mpsData[i] = FDKreadBits(hBs, 8); |
1354 | 6.44k | } |
1355 | 3.19k | pMpegSurroundDecoder->mpsDataBits = mpsDataBits; |
1356 | 3.19k | break; |
1357 | | |
1358 | 2.38k | case MPEGS_CONTINUE: |
1359 | 4.72k | 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 | 4.72k | if ((pMpegSurroundDecoder->mpsDataBits + mpsDataBits) > |
1363 | 4.72k | MPS_DATA_BUFFER_SIZE * 8) { |
1364 | 19 | err = MPS_NOTOK; |
1365 | 19 | goto bail; |
1366 | 19 | } |
1367 | 13.1k | for (int i = 0; i < mpsDataBits / 8; i++) { |
1368 | 8.43k | pMpegSurroundDecoder |
1369 | 8.43k | ->mpsData[(pMpegSurroundDecoder->mpsDataBits / 8) + i] = |
1370 | 8.43k | FDKreadBits(hBs, 8); |
1371 | 8.43k | } |
1372 | 4.70k | pMpegSurroundDecoder->mpsDataBits += mpsDataBits; |
1373 | 4.70k | FDKinitBitStream(&mpsBsData, pMpegSurroundDecoder->mpsData, |
1374 | 4.70k | MAX_BUFSIZE_BYTES, |
1375 | 4.70k | pMpegSurroundDecoder->mpsDataBits, BS_READER); |
1376 | 4.70k | hMpsBsData = &mpsBsData; |
1377 | 4.70k | break; |
1378 | | |
1379 | 16.5k | case MPEGS_START_STOP: |
1380 | 16.5k | pMpegSurroundDecoder->mpsDataBits = mpsDataBits; |
1381 | 16.5k | hMpsBsData = hBs; |
1382 | 16.5k | break; |
1383 | | |
1384 | 0 | default: |
1385 | 0 | FDK_ASSERT(0); |
1386 | 24.5k | } |
1387 | | |
1388 | 24.4k | if ((ancStartStop == MPEGS_STOP) || |
1389 | 24.4k | (ancStartStop == MPEGS_START_STOP)) { |
1390 | 18.9k | switch (ancType) { |
1391 | 9.29k | case MPEGS_ANCTYPE_HEADER_AND_FRAME: { |
1392 | 9.29k | int parseResult, bitsRead; |
1393 | 9.29k | SPATIAL_SPECIFIC_CONFIG spatialSpecificConfigTmp = |
1394 | 9.29k | pMpegSurroundDecoder->spatialSpecificConfigBackup; |
1395 | | |
1396 | | /* Parse spatial specific config */ |
1397 | 9.29k | bitsRead = (INT)FDKgetValidBits(hMpsBsData); |
1398 | | |
1399 | 9.29k | err = SpatialDecParseSpecificConfigHeader( |
1400 | 9.29k | hMpsBsData, |
1401 | 9.29k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, coreCodec, |
1402 | 9.29k | pMpegSurroundDecoder->upmixType); |
1403 | | |
1404 | 9.29k | bitsRead = (bitsRead - (INT)FDKgetValidBits(hMpsBsData)); |
1405 | 9.29k | parseResult = ((err == MPS_OK) ? bitsRead : -bitsRead); |
1406 | | |
1407 | 9.29k | if (parseResult < 0) { |
1408 | 1.70k | parseResult = -parseResult; |
1409 | 1.70k | err = MPS_PARSE_ERROR; |
1410 | 7.58k | } else if (err == MPS_OK) { |
1411 | | /* Check SSC for consistency (e.g. bit errors could cause |
1412 | | * trouble) */ |
1413 | 7.58k | err = sscCheckInBand( |
1414 | 7.58k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1415 | 7.58k | frameSize, sampleRate); |
1416 | 7.58k | } |
1417 | 9.29k | if (err != MPS_OK) { |
1418 | 4.08k | pMpegSurroundDecoder->spatialSpecificConfigBackup = |
1419 | 4.08k | spatialSpecificConfigTmp; |
1420 | 4.08k | break; |
1421 | 4.08k | } |
1422 | | |
1423 | 5.20k | pMpegSurroundDecoder->mpsDataBits -= parseResult; |
1424 | | |
1425 | | /* Initiate re-initialization, if header has changed */ |
1426 | 5.20k | if (FDK_SpatialDecCompareSpatialSpecificConfigHeader( |
1427 | 5.20k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1428 | 5.20k | sscParse) == MPS_UNEQUAL_SSC) { |
1429 | 4.82k | pMpegSurroundDecoder |
1430 | 4.82k | ->initFlags[pMpegSurroundDecoder->bsFrameParse] |= |
1431 | 4.82k | MPEGS_INIT_CHANGE_HEADER; |
1432 | 4.82k | SpatialDecInitParserContext(pMpegSurroundDecoder->pSpatialDec); |
1433 | | /* We found a valid in-band configuration. Therefore any |
1434 | | * previous config is invalid now. */ |
1435 | 4.82k | pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg = 0; |
1436 | 4.82k | } |
1437 | 5.20k | } |
1438 | 5.20k | FDK_FALLTHROUGH; |
1439 | 14.8k | case MPEGS_ANCTYPE_FRAME: |
1440 | | |
1441 | 14.8k | if (pMpegSurroundDecoder |
1442 | 14.8k | ->initFlags[pMpegSurroundDecoder->bsFrameParse] & |
1443 | 14.8k | MPEGS_INIT_ERROR_PAYLOAD) { |
1444 | 4.84k | err = MPS_PARSE_ERROR; |
1445 | 4.84k | break; |
1446 | 4.84k | } |
1447 | | |
1448 | | /* First spatial specific config is parsed into |
1449 | | * spatialSpecificConfigBackup, second spatialSpecificConfigBackup |
1450 | | * is copied into spatialSpecificConfig[bsFrameDecode] */ |
1451 | 9.99k | if (pMpegSurroundDecoder |
1452 | 9.99k | ->initFlags[pMpegSurroundDecoder->bsFrameParse]) { |
1453 | 3.64k | FDKmemcpy(sscParse, |
1454 | 3.64k | &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1455 | 3.64k | sizeof(SPATIAL_SPECIFIC_CONFIG)); |
1456 | 3.64k | pMpegSurroundDecoder |
1457 | 3.64k | ->fOnSync[pMpegSurroundDecoder->bsFrameParse] = |
1458 | 3.64k | MPEGS_SYNC_FOUND; |
1459 | 3.64k | } |
1460 | | |
1461 | 9.99k | if (pMpegSurroundDecoder |
1462 | 9.99k | ->fOnSync[pMpegSurroundDecoder->bsFrameParse] >= |
1463 | 9.99k | MPEGS_SYNC_FOUND) { |
1464 | 9.96k | int nbits = 0, bitsAvail; |
1465 | | |
1466 | 9.96k | if (err != MPS_OK) { |
1467 | 0 | break; |
1468 | 0 | } |
1469 | | |
1470 | 9.96k | bitsAvail = FDKgetValidBits(hMpsBsData); |
1471 | | |
1472 | 9.96k | if (bitsAvail <= 0) { |
1473 | 138 | err = MPS_PARSE_ERROR; |
1474 | 9.82k | } else { |
1475 | 9.82k | err = SpatialDecParseFrameData( |
1476 | 9.82k | pMpegSurroundDecoder->pSpatialDec, bsFrame, hMpsBsData, |
1477 | 9.82k | sscParse, (UPMIXTYPE)pMpegSurroundDecoder->upmixType, |
1478 | 9.82k | fGlobalIndependencyFlag); |
1479 | 9.82k | if (err == MPS_OK) { |
1480 | 4.15k | bsFrame->newBsData = 1; |
1481 | 4.15k | } |
1482 | 9.82k | } |
1483 | | |
1484 | 9.96k | nbits = bitsAvail - (INT)FDKgetValidBits(hMpsBsData); |
1485 | | |
1486 | 9.96k | if ((nbits > bitsAvail) || |
1487 | 9.96k | (nbits > pMpegSurroundDecoder->mpsDataBits) || |
1488 | 9.96k | (pMpegSurroundDecoder->mpsDataBits > nbits + 7 && |
1489 | 7.24k | !IS_LOWDELAY(coreCodec))) { |
1490 | 7.24k | bsFrame->newBsData = 0; |
1491 | 7.24k | err = MPS_PARSE_ERROR; |
1492 | 7.24k | break; |
1493 | 7.24k | } |
1494 | 2.71k | pMpegSurroundDecoder->mpsDataBits -= nbits; |
1495 | 2.71k | } |
1496 | 2.75k | break; |
1497 | | |
1498 | 2.75k | default: /* added to avoid compiler warning */ |
1499 | 0 | err = MPS_NOTOK; |
1500 | 0 | break; /* added to avoid compiler warning */ |
1501 | 18.9k | } /* switch (ancType) */ |
1502 | | |
1503 | 18.9k | if (err == MPS_OK) { |
1504 | 1.20k | pMpegSurroundDecoder->ancStartStopPrev = ancStartStop; |
1505 | 17.7k | } else { |
1506 | 17.7k | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1507 | 17.7k | MPEGS_INIT_ERROR_PAYLOAD, |
1508 | 17.7k | MPEGS_SYNC_LOST, MPEGS_STOP); |
1509 | 17.7k | pMpegSurroundDecoder->mpsDataBits = 0; |
1510 | 17.7k | } |
1511 | 18.9k | } /* (ancStartStop == MPEGS_STOP) || (ancStartStop == MPEGS_START_STOP) |
1512 | | */ |
1513 | 24.4k | } /* validAncStartStop */ |
1514 | 28.0k | } /* validAncType */ |
1515 | 41.5k | } |
1516 | | |
1517 | 41.5k | bail: |
1518 | | |
1519 | 41.5k | *pMpsDataBits -= (mpsBsBits - (INT)FDKgetValidBits(hBs)); |
1520 | | |
1521 | 41.5k | return err; |
1522 | 41.5k | } |
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 | 220k | const INT inDataHeadroom, INT *outDataHeadroom) { |
1533 | 220k | SACDEC_ERROR err = MPS_OK; |
1534 | 220k | PCM_MPS *pTimeOut = pTimeData; |
1535 | 220k | PCM_MPS *TDinput = NULL; |
1536 | 220k | UINT initControlFlags = 0, controlFlags = 0; |
1537 | 220k | int timeDataRequiredSize = 0; |
1538 | 220k | int newData; |
1539 | | |
1540 | 220k | if (pMpegSurroundDecoder == NULL) { |
1541 | 0 | return MPS_INVALID_HANDLE; |
1542 | 0 | } |
1543 | | |
1544 | 220k | FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); |
1545 | | |
1546 | 220k | if (!FDK_chMapDescr_isValid(mapDescr)) { |
1547 | 0 | return MPS_INVALID_HANDLE; |
1548 | 0 | } |
1549 | | |
1550 | 220k | if ((*nChannels <= 0) || (*nChannels > 2)) { |
1551 | 0 | return MPS_NOTOK; |
1552 | 0 | } |
1553 | | |
1554 | 220k | pMpegSurroundDecoder->pSpatialDec->sacInDataHeadroom = inDataHeadroom; |
1555 | 220k | *outDataHeadroom = (INT)(8); |
1556 | | |
1557 | 220k | pMpegSurroundDecoder->pSpatialDec->pConfigCurrent = |
1558 | 220k | &pMpegSurroundDecoder |
1559 | 220k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; |
1560 | 220k | newData = pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse] |
1561 | 220k | .newBsData; |
1562 | | |
1563 | 220k | switch (mpegSurroundOperationMode(pMpegSurroundDecoder, 1000)) { |
1564 | 220k | case MPEGS_OPMODE_MPS_PAYLOAD: |
1565 | 220k | if (pMpegSurroundDecoder |
1566 | 220k | ->initFlags[pMpegSurroundDecoder->bsFrameDecode]) { |
1567 | 70.2k | err = initMpegSurroundDecoder(pMpegSurroundDecoder); |
1568 | 70.2k | } |
1569 | | |
1570 | 220k | if (err == MPS_OK) { |
1571 | 220k | if ((pMpegSurroundDecoder |
1572 | 220k | ->fOnSync[pMpegSurroundDecoder->bsFrameDecode] != |
1573 | 220k | MPEGS_SYNC_COMPLETE) && |
1574 | 220k | (pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode] |
1575 | 86.0k | .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.0k | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
1579 | 43.0k | MPEGS_SYNC_COMPLETE; |
1580 | 43.0k | } |
1581 | 220k | } 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 | 888 | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
1586 | 888 | MPEGS_SYNC_FOUND; |
1587 | 888 | controlFlags |= MPEGS_CONCEAL; |
1588 | 888 | err = MPS_OK; |
1589 | 888 | } |
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 | 220k | if (pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] != |
1597 | 220k | MPEGS_SYNC_COMPLETE) { |
1598 | 43.9k | controlFlags |= MPEGS_CONCEAL; |
1599 | 43.9k | } |
1600 | 220k | 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 | 220k | } |
1610 | | |
1611 | 220k | if (err != MPS_OK) { |
1612 | 0 | goto bail; |
1613 | 0 | } |
1614 | | |
1615 | | /* |
1616 | | * Force BypassMode if choosen by user |
1617 | | */ |
1618 | 220k | if (pMpegSurroundDecoder->mpegSurroundUserParams.bypassMode) { |
1619 | 0 | controlFlags |= MPEGS_BYPASSMODE; |
1620 | 0 | } |
1621 | | |
1622 | 220k | if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode]) { |
1623 | 888 | int startWithDfltCfg = 0; |
1624 | | /* |
1625 | | * Init with a default configuration if we came here and are still not |
1626 | | * initialized. |
1627 | | */ |
1628 | 888 | if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] & |
1629 | 888 | MPEGS_INIT_ENFORCE_REINIT) { |
1630 | | /* Get default spatial specific config */ |
1631 | 878 | if (FDK_SpatialDecInitDefaultSpatialSpecificConfig( |
1632 | 878 | &pMpegSurroundDecoder->spatialSpecificConfigBackup, coreCodec, |
1633 | 878 | *nChannels, sampleRate, |
1634 | 878 | *frameSize / |
1635 | 878 | mpegSurroundDecoder_GetNrOfQmfBands(NULL, sampleRate), |
1636 | 878 | pMpegSurroundDecoder->mpegSurroundDecoderLevel, |
1637 | 878 | pMpegSurroundDecoder->mpegSurroundUserParams.blindEnable)) { |
1638 | 0 | err = MPS_NOTOK; |
1639 | 0 | goto bail; |
1640 | 0 | } |
1641 | | |
1642 | | /* Initiate re-initialization, if header has changed */ |
1643 | 878 | if (FDK_SpatialDecCompareSpatialSpecificConfigHeader( |
1644 | 878 | &pMpegSurroundDecoder->spatialSpecificConfigBackup, |
1645 | 878 | &pMpegSurroundDecoder->spatialSpecificConfig |
1646 | 878 | [pMpegSurroundDecoder->bsFrameDecode]) == MPS_UNEQUAL_SSC) { |
1647 | 878 | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
1648 | 878 | MPEGS_INIT_CHANGE_HEADER; |
1649 | 878 | SpatialDecInitParserContext(pMpegSurroundDecoder->pSpatialDec); |
1650 | 878 | } |
1651 | | |
1652 | 878 | startWithDfltCfg = 1; |
1653 | 878 | } |
1654 | | |
1655 | | /* First spatial specific config is parsed into spatialSpecificConfigBackup, |
1656 | | * second spatialSpecificConfigBackup is copied into spatialSpecificConfig |
1657 | | */ |
1658 | 888 | err = initMpegSurroundDecoder(pMpegSurroundDecoder); |
1659 | | |
1660 | 888 | if (startWithDfltCfg) { |
1661 | | /* initialized with default config, but no sync found */ |
1662 | | /* maybe use updateMpegSurroundDecoderStatus later on */ |
1663 | 878 | pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = |
1664 | 878 | MPEGS_SYNC_LOST; |
1665 | 878 | } |
1666 | | |
1667 | | /* Since we do not have state MPEGS_SYNC_COMPLETE apply concealment */ |
1668 | 888 | controlFlags |= MPEGS_CONCEAL; |
1669 | | |
1670 | 888 | if (err != MPS_OK) { |
1671 | 10 | goto bail; |
1672 | 10 | } |
1673 | 888 | } |
1674 | | |
1675 | | /* |
1676 | | * Process MPEG Surround Audio |
1677 | | */ |
1678 | 220k | initControlFlags = controlFlags; |
1679 | | |
1680 | | /* Check that provided output buffer is large enough. */ |
1681 | 220k | if (pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis == 0) { |
1682 | 0 | err = MPS_UNSUPPORTED_FORMAT; |
1683 | 0 | goto bail; |
1684 | 0 | } |
1685 | 220k | timeDataRequiredSize = |
1686 | 220k | (timeDataFrameSize * |
1687 | 220k | pMpegSurroundDecoder->pSpatialDec->numOutputChannelsAT * |
1688 | 220k | pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsSynthesis) / |
1689 | 220k | pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis; |
1690 | 220k | if (timeDataSize < timeDataRequiredSize) { |
1691 | 0 | err = MPS_OUTPUT_BUFFER_TOO_SMALL; |
1692 | 0 | goto bail; |
1693 | 0 | } |
1694 | | |
1695 | 220k | if ((pMpegSurroundDecoder->pSpatialDec->pConfigCurrent->syntaxFlags & |
1696 | 220k | SACDEC_SYNTAX_USAC) && |
1697 | 220k | (pMpegSurroundDecoder->pSpatialDec->stereoConfigIndex > 1)) { |
1698 | 21.4k | 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.4k | int timeDataFrameSizeOut = |
1702 | 21.4k | (timeDataFrameSize * |
1703 | 21.4k | pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsSynthesis) / |
1704 | 21.4k | pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis; |
1705 | 21.4k | TDinput = pTimeData + timeDataFrameSizeOut - timeDataFrameSize; |
1706 | 64.3k | for (int i = *nChannels - 1; i >= 0; i--) { |
1707 | 42.9k | FDKmemmove(pTimeData + (i + 1) * timeDataFrameSizeOut - timeDataFrameSize, |
1708 | 42.9k | pTimeData + timeDataFrameSize * i, |
1709 | 42.9k | sizeof(PCM_MPS) * timeDataFrameSize); |
1710 | 42.9k | FDKmemclear(pTimeData + i * timeDataFrameSizeOut, |
1711 | 42.9k | sizeof(PCM_MPS) * (timeDataFrameSizeOut - timeDataFrameSize)); |
1712 | 42.9k | } |
1713 | 199k | } else { |
1714 | 199k | if (pMpegSurroundDecoder->mpegSurroundUseTimeInterface) { |
1715 | 49.3k | FDKmemcpy(input, pTimeData, |
1716 | 49.3k | sizeof(PCM_MPS) * (*nChannels) * (*frameSize)); |
1717 | 49.3k | TDinput = input; |
1718 | 49.3k | } |
1719 | 199k | } |
1720 | | |
1721 | | /* |
1722 | | * Process MPEG Surround Audio |
1723 | | */ |
1724 | 220k | err = SpatialDecApplyFrame( |
1725 | 220k | pMpegSurroundDecoder->pSpatialDec, |
1726 | 220k | &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode], |
1727 | 220k | pMpegSurroundDecoder->mpegSurroundUseTimeInterface ? INPUTMODE_TIME |
1728 | 220k | : INPUTMODE_QMF_SBR, |
1729 | 220k | TDinput, NULL, NULL, pTimeOut, *frameSize, &controlFlags, *nChannels, |
1730 | 220k | mapDescr); |
1731 | 220k | *nChannels = pMpegSurroundDecoder->pSpatialDec->numOutputChannelsAT; |
1732 | | |
1733 | 220k | if (err != |
1734 | 220k | 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 | 220k | } else { |
1741 | 220k | if (((controlFlags & MPEGS_CONCEAL) && |
1742 | 220k | !(initControlFlags & MPEGS_CONCEAL)) || |
1743 | 220k | (pMpegSurroundDecoder->pSpatialDec->errInt != |
1744 | 179k | MPS_OK)) { /* Account for errors that occured in |
1745 | | SpatialDecApplyFrame(): */ |
1746 | 41.8k | updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, |
1747 | 41.8k | MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, |
1748 | 41.8k | MPEGS_STOP); |
1749 | 41.8k | } |
1750 | 220k | } |
1751 | | |
1752 | 220k | if ((err == MPS_OK) && !(controlFlags & MPEGS_BYPASSMODE) && |
1753 | 220k | !(pMpegSurroundDecoder->upmixType == UPMIX_TYPE_BYPASS)) { |
1754 | 220k | SpatialDecChannelProperties(pMpegSurroundDecoder->pSpatialDec, channelType, |
1755 | 220k | channelIndices, mapDescr); |
1756 | 220k | } |
1757 | | |
1758 | 220k | bail: |
1759 | | |
1760 | 220k | if (newData) { |
1761 | | /* numParameterSetsPrev shall only be read in the decode process, because of |
1762 | | that we can update this state variable here */ |
1763 | 138k | pMpegSurroundDecoder->pSpatialDec->numParameterSetsPrev = |
1764 | 138k | pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode] |
1765 | 138k | .numParameterSets; |
1766 | 138k | } |
1767 | | |
1768 | 220k | return (err); |
1769 | 220k | } |
1770 | | |
1771 | | /** |
1772 | | * \brief Free config dependent MPEG Surround memory. |
1773 | | **/ |
1774 | | SACDEC_ERROR mpegSurroundDecoder_FreeMem( |
1775 | 159k | CMpegSurroundDecoder *pMpegSurroundDecoder) { |
1776 | 159k | SACDEC_ERROR err = MPS_OK; |
1777 | | |
1778 | 159k | if (pMpegSurroundDecoder != NULL) { |
1779 | 159k | FDK_SpatialDecClose(pMpegSurroundDecoder->pSpatialDec); |
1780 | 159k | pMpegSurroundDecoder->pSpatialDec = NULL; |
1781 | 159k | } |
1782 | | |
1783 | 159k | return err; |
1784 | 159k | } |
1785 | | |
1786 | | /** |
1787 | | * \brief Close MPEG Surround decoder. |
1788 | | **/ |
1789 | 36.8k | void mpegSurroundDecoder_Close(CMpegSurroundDecoder *pMpegSurroundDecoder) { |
1790 | 36.8k | if (pMpegSurroundDecoder != NULL) { |
1791 | 36.8k | FDK_SpatialDecClose(pMpegSurroundDecoder->pSpatialDec); |
1792 | 36.8k | pMpegSurroundDecoder->pSpatialDec = NULL; |
1793 | | |
1794 | 73.6k | for (int i = 0; i < 1; i++) { |
1795 | 36.8k | SpatialDecCloseBsFrame(&pMpegSurroundDecoder->bsFrames[i]); |
1796 | 36.8k | } |
1797 | | |
1798 | 36.8k | FDK_FREE_MEMORY_1D(pMpegSurroundDecoder); |
1799 | 36.8k | } |
1800 | 36.8k | } |
1801 | | |
1802 | | #define SACDEC_VL0 2 |
1803 | | #define SACDEC_VL1 1 |
1804 | | #define SACDEC_VL2 0 |
1805 | | |
1806 | 221k | int mpegSurroundDecoder_GetLibInfo(LIB_INFO *info) { |
1807 | 221k | int i; |
1808 | | |
1809 | 221k | if (info == NULL) { |
1810 | 0 | return -1; |
1811 | 0 | } |
1812 | | |
1813 | | /* search for next free tab */ |
1814 | 221k | for (i = 0; i < FDK_MODULE_LAST; i++) { |
1815 | 221k | if (info[i].module_id == FDK_NONE) break; |
1816 | 221k | } |
1817 | 221k | if (i == FDK_MODULE_LAST) return -1; |
1818 | | |
1819 | 221k | info += i; |
1820 | | |
1821 | 221k | info->module_id = FDK_MPSDEC; |
1822 | | #ifdef SUPPRESS_BUILD_DATE_INFO |
1823 | | info->build_date = ""; |
1824 | | info->build_time = ""; |
1825 | | #else |
1826 | 221k | info->build_date = __DATE__; |
1827 | 221k | info->build_time = __TIME__; |
1828 | 221k | #endif |
1829 | 221k | info->title = "MPEG Surround Decoder"; |
1830 | 221k | info->version = LIB_VERSION(SACDEC_VL0, SACDEC_VL1, SACDEC_VL2); |
1831 | 221k | LIB_VERSION_STRING(info); |
1832 | 221k | info->flags = 0 | CAPF_MPS_LD | CAPF_MPS_USAC | CAPF_MPS_HQ | |
1833 | 221k | CAPF_MPS_1CH_IN | CAPF_MPS_2CH_OUT; /* end flags */ |
1834 | | |
1835 | 221k | return 0; |
1836 | 221k | } |
1837 | | |
1838 | | SACDEC_ERROR mpegSurroundDecoder_SetParam( |
1839 | | CMpegSurroundDecoder *pMpegSurroundDecoder, const SACDEC_PARAM param, |
1840 | 442k | const INT value) { |
1841 | 442k | SACDEC_ERROR err = MPS_OK; |
1842 | 442k | SPATIALDEC_PARAM *pUserParams = NULL; |
1843 | | |
1844 | | /* check decoder handle */ |
1845 | 442k | if (pMpegSurroundDecoder != NULL) { |
1846 | | /* init local shortcuts */ |
1847 | 442k | pUserParams = &pMpegSurroundDecoder->mpegSurroundUserParams; |
1848 | 442k | } else { |
1849 | 0 | err = MPS_INVALID_HANDLE; |
1850 | | /* check the parameter values before exiting. */ |
1851 | 0 | } |
1852 | | |
1853 | | /* apply param value */ |
1854 | 442k | 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 | 220k | case SACDEC_INTERFACE: |
1876 | 220k | if (value < 0 || value > 1) { |
1877 | 0 | err = MPS_INVALID_PARAMETER; |
1878 | 0 | } |
1879 | 220k | if (err != MPS_OK) { |
1880 | 0 | goto bail; |
1881 | 0 | } |
1882 | 220k | if (pMpegSurroundDecoder->mpegSurroundUseTimeInterface != (UCHAR)value) { |
1883 | 5.85k | pMpegSurroundDecoder->mpegSurroundUseTimeInterface = (UCHAR)value; |
1884 | 5.85k | pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= |
1885 | 5.85k | MPEGS_INIT_CHANGE_TIME_FREQ_INTERFACE; |
1886 | 5.85k | } |
1887 | 220k | 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 | 221k | default: |
1963 | 221k | err = MPS_INVALID_PARAMETER; |
1964 | 221k | break; |
1965 | 442k | } /* switch(param) */ |
1966 | | |
1967 | 442k | bail: |
1968 | 442k | return err; |
1969 | 442k | } |
1970 | | |
1971 | | SACDEC_ERROR mpegSurroundDecoder_IsPseudoLR( |
1972 | 285k | CMpegSurroundDecoder *pMpegSurroundDecoder, int *bsPseudoLr) { |
1973 | 285k | if (pMpegSurroundDecoder != NULL) { |
1974 | 285k | const SPATIAL_SPECIFIC_CONFIG *sscDecode = |
1975 | 285k | &pMpegSurroundDecoder |
1976 | 285k | ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; |
1977 | 285k | *bsPseudoLr = (int)sscDecode->bsPseudoLr; |
1978 | 285k | return MPS_OK; |
1979 | 285k | } else |
1980 | 0 | return MPS_INVALID_HANDLE; |
1981 | 285k | } |
1982 | | |
1983 | | /** |
1984 | | * \brief Get the signal delay caused by the MPEG Surround decoder module. |
1985 | | **/ |
1986 | 220k | UINT mpegSurroundDecoder_GetDelay(const CMpegSurroundDecoder *self) { |
1987 | 220k | INT outputDelay = 0; |
1988 | | |
1989 | 220k | if (self != NULL) { |
1990 | 220k | const SPATIAL_SPECIFIC_CONFIG *sscDecode = |
1991 | 220k | &self->spatialSpecificConfig[self->bsFrameDecode]; |
1992 | 220k | 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 | 220k | if (coreCodec > AOT_NULL_OBJECT) { |
1999 | 220k | if (IS_LOWDELAY(coreCodec)) { |
2000 | | /* All low delay variants (ER-AAC-(E)LD): */ |
2001 | 50.6k | outputDelay += 256; |
2002 | 170k | } 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 | 220k | } |
2011 | 220k | } |
2012 | | |
2013 | 220k | return (outputDelay); |
2014 | 220k | } |