Coverage Report

Created: 2025-07-23 06:43

/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
}