Coverage Report

Created: 2025-07-11 06:54

/src/aac/libSACdec/src/sac_dec.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
100
101
*******************************************************************************/
102
103
#include "sac_dec_errorcodes.h"
104
#include "sac_dec.h"
105
106
#include "sac_process.h"
107
#include "sac_bitdec.h"
108
#include "sac_smoothing.h"
109
#include "sac_calcM1andM2.h"
110
#include "sac_reshapeBBEnv.h"
111
#include "sac_stp.h"
112
#include "sac_rom.h"
113
114
#include "FDK_decorrelate.h"
115
116
#include "FDK_trigFcts.h"
117
#include "FDK_matrixCalloc.h"
118
119
/* static int pbStrideTable[] = {1, 2, 5, 28}; see sac_rom.cpp */
120
121
enum {
122
  APPLY_M2_NONE = 0,    /* init value */
123
  APPLY_M2 = 1,         /* apply m2 fallback implementation */
124
  APPLY_M2_MODE212 = 2, /* apply m2 for 212 mode */
125
  APPLY_M2_MODE212_Res_PhaseCoding =
126
      3 /* apply m2 for 212 mode with residuals and phase coding */
127
};
128
129
/******************************************************************************************/
130
/* function: FDK_SpatialDecInitDefaultSpatialSpecificConfig */
131
/* output:   struct of type SPATIAL_SPECIFIC_CONFIG */
132
/* input:    core coder audio object type */
133
/* input:    nr of core channels */
134
/* input:    sampling rate */
135
/* input:    nr of time slots */
136
/* input:    decoder level */
137
/* input:    flag indicating upmix type blind */
138
/*                                                                                        */
139
/* returns:  error code */
140
/******************************************************************************************/
141
int FDK_SpatialDecInitDefaultSpatialSpecificConfig(
142
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig,
143
    AUDIO_OBJECT_TYPE coreCodec, int coreChannels, int samplingFreq,
144
990
    int nTimeSlots, int decoderLevel, int isBlind) {
145
990
  return SpatialDecDefaultSpecificConfig(pSpatialSpecificConfig, coreCodec,
146
990
                                         samplingFreq, nTimeSlots, decoderLevel,
147
990
                                         isBlind, coreChannels);
148
990
}
149
150
/******************************************************************************************/
151
/* function: FDK_SpatialDecCompareSpatialSpecificConfigHeader */
152
/* input:    2 pointers to a ssc */
153
/*                                                                                        */
154
/* output:   - */
155
/* returns:  error code (0 = equal, <>0 unequal) */
156
/******************************************************************************************/
157
int FDK_SpatialDecCompareSpatialSpecificConfigHeader(
158
57.0k
    SPATIAL_SPECIFIC_CONFIG *pSsc1, SPATIAL_SPECIFIC_CONFIG *pSsc2) {
159
57.0k
  int result = MPS_OK;
160
161
  /* we assume: every bit must be equal */
162
57.0k
  if (FDKmemcmp(pSsc1, pSsc2, sizeof(SPATIAL_SPECIFIC_CONFIG)) != 0) {
163
42.0k
    result = MPS_UNEQUAL_SSC;
164
42.0k
  }
165
57.0k
  return result;
166
57.0k
}
167
168
/*******************************************************************************
169
 Functionname: SpatialDecClearFrameData
170
 *******************************************************************************
171
172
 Description: Clear/Fake frame data to avoid misconfiguration and allow proper
173
              error concealment.
174
 Arguments:
175
 Input:       self (frame data)
176
 Output:      No return value.
177
178
*******************************************************************************/
179
static void SpatialDecClearFrameData(
180
    spatialDec *self, /* Shall be removed */
181
82.0k
    SPATIAL_BS_FRAME *bsFrame, const SACDEC_CREATION_PARAMS *const setup) {
182
82.0k
  int i;
183
184
82.0k
  FDK_ASSERT(self != NULL);
185
82.0k
  FDK_ASSERT(bsFrame != NULL);
186
82.0k
  FDK_ASSERT(setup != NULL);
187
188
  /* do not apply shaping tools (GES or STP) */
189
246k
  for (i = 0; i < setup->maxNumOutputChannels;
190
164k
       i += 1) { /* MAX_OUTPUT_CHANNELS */
191
164k
    bsFrame->tempShapeEnableChannelSTP[i] = 0;
192
164k
    bsFrame->tempShapeEnableChannelGES[i] = 0;
193
164k
  }
194
195
82.0k
  bsFrame->TsdData->bsTsdEnable = 0;
196
197
  /* use only 1 parameter set at the end of the frame */
198
82.0k
  bsFrame->numParameterSets = 1;
199
82.0k
  bsFrame->paramSlot[0] = self->timeSlots - 1;
200
201
  /* parameter smoothing tool set to off */
202
82.0k
  bsFrame->bsSmoothMode[0] = 0;
203
82.0k
  initParameterSmoothing(self);
204
205
  /* reset residual data */
206
82.0k
  {
207
82.0k
    int resQmfBands, resTimeSlots = (1);
208
209
82.0k
    resQmfBands = setup->maxNumQmfBands;
210
211
164k
    for (i = 0; i < setup->bProcResidual
212
164k
                    ? fMin(setup->maxNumResChannels,
213
82.0k
                           setup->maxNumOttBoxes + setup->maxNumInputChannels)
214
164k
                    : 0;
215
82.0k
         i += 1) {
216
164k
      for (int j = 0; j < resTimeSlots; j += 1) {
217
5.33M
        for (int k = 0; k < resQmfBands; k += 1) {
218
5.24M
          self->qmfResidualReal__FDK[i][j][k] = FL2FXCONST_DBL(0.0f);
219
5.24M
          self->qmfResidualImag__FDK[i][j][k] = FL2FXCONST_DBL(0.0f);
220
5.24M
        }
221
82.0k
      }
222
82.0k
    }
223
82.0k
  }
224
225
82.0k
  return;
226
82.0k
}
227
228
/*******************************************************************************
229
 Functionname: FDK_SpatialDecOpen
230
 *******************************************************************************
231
232
 Description:
233
234
 Arguments:
235
236
 Return:
237
238
*******************************************************************************/
239
spatialDec *FDK_SpatialDecOpen(const SPATIAL_DEC_CONFIG *config,
240
25.0k
                               int stereoConfigIndex) {
241
25.0k
  int i;
242
25.0k
  int lfSize, hfSize;
243
25.0k
  spatialDec *self = NULL;
244
25.0k
  SACDEC_CREATION_PARAMS setup;
245
246
25.0k
  switch (config->decoderLevel) {
247
25.0k
    case DECODER_LEVEL_0: /* 212 maxNumOutputChannels== 2 */
248
25.0k
      setup.maxNumInputChannels = 1;
249
25.0k
      setup.maxNumOutputChannels = 2;
250
25.0k
      setup.maxNumQmfBands = 64;
251
25.0k
      setup.maxNumXChannels = 2;
252
25.0k
      setup.maxNumVChannels = 2;
253
25.0k
      setup.maxNumDecorChannels = 1;
254
25.0k
      setup.bProcResidual = 1;
255
25.0k
      setup.maxNumResidualChannels = 0;
256
25.0k
      setup.maxNumOttBoxes = 1;
257
25.0k
      setup.maxNumParams = setup.maxNumInputChannels + setup.maxNumOttBoxes;
258
25.0k
      break;
259
0
    default:
260
0
      return NULL;
261
25.0k
  }
262
263
25.0k
  setup.maxNumResChannels = 1;
264
265
25.0k
  {
266
25.0k
    switch (config->maxNumOutputChannels) {
267
0
      case OUTPUT_CHANNELS_2_0:
268
0
        setup.maxNumOutputChannels = fMin(setup.maxNumOutputChannels, 2);
269
0
        break;
270
25.0k
      case OUTPUT_CHANNELS_DEFAULT:
271
25.0k
      default:
272
25.0k
        break;
273
25.0k
    }
274
25.0k
  }
275
276
25.0k
  setup.maxNumHybridBands = SacGetHybridSubbands(setup.maxNumQmfBands);
277
278
25.0k
  switch (config->decoderMode) {
279
25.0k
    case EXT_HQ_ONLY:
280
25.0k
      setup.maxNumCmplxQmfBands = setup.maxNumQmfBands;
281
25.0k
      setup.maxNumCmplxHybBands = setup.maxNumHybridBands;
282
25.0k
      break;
283
0
    default:
284
0
      setup.maxNumCmplxQmfBands = fixMax(PC_NUM_BANDS, setup.maxNumQmfBands);
285
0
      setup.maxNumCmplxHybBands =
286
0
          fixMax(PC_NUM_HYB_BANDS, setup.maxNumHybridBands);
287
0
      break;
288
25.0k
  } /* switch config->decoderMode */
289
290
25.0k
  FDK_ALLOCATE_MEMORY_1D_INT(self, 1, spatialDec, SECT_DATA_L2)
291
292
25.0k
  self->createParams = setup;
293
294
25.0k
  FDK_ALLOCATE_MEMORY_1D(self->param2hyb, MAX_PARAMETER_BANDS + 1, int)
295
296
25.0k
  FDK_ALLOCATE_MEMORY_1D(self->numOttBands, setup.maxNumOttBoxes, int)
297
298
  /* allocate arrays */
299
300
25.0k
  FDK_ALLOCATE_MEMORY_1D(self->smgTime, MAX_PARAMETER_SETS, int)
301
25.0k
  FDK_ALLOCATE_MEMORY_2D(self->smgData, MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS,
302
25.0k
                         UCHAR)
303
304
25.0k
  FDK_ALLOCATE_MEMORY_3D(self->ottCLD__FDK, setup.maxNumOttBoxes,
305
25.0k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
306
25.0k
  FDK_ALLOCATE_MEMORY_3D(self->ottICC__FDK, setup.maxNumOttBoxes,
307
25.0k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
308
25.0k
  FDK_ALLOCATE_MEMORY_3D(self->ottIPD__FDK, setup.maxNumOttBoxes,
309
25.0k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
310
311
  /* Last parameters from prev frame */
312
25.0k
  FDK_ALLOCATE_MEMORY_2D(self->ottCLDidxPrev, setup.maxNumOttBoxes,
313
25.0k
                         MAX_PARAMETER_BANDS, SCHAR)
314
25.0k
  FDK_ALLOCATE_MEMORY_2D(self->ottICCidxPrev, setup.maxNumOttBoxes,
315
25.0k
                         MAX_PARAMETER_BANDS, SCHAR)
316
25.0k
  FDK_ALLOCATE_MEMORY_3D(self->ottICCdiffidx, setup.maxNumOttBoxes,
317
25.0k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
318
25.0k
  FDK_ALLOCATE_MEMORY_2D(self->ottIPDidxPrev, setup.maxNumOttBoxes,
319
25.0k
                         MAX_PARAMETER_BANDS, SCHAR)
320
25.0k
  FDK_ALLOCATE_MEMORY_2D(self->arbdmxGainIdxPrev, setup.maxNumInputChannels,
321
25.0k
                         MAX_PARAMETER_BANDS, SCHAR)
322
25.0k
  FDK_ALLOCATE_MEMORY_2D(self->cmpOttCLDidxPrev, setup.maxNumOttBoxes,
323
25.0k
                         MAX_PARAMETER_BANDS, SCHAR)
324
25.0k
  FDK_ALLOCATE_MEMORY_2D(self->cmpOttICCidxPrev, setup.maxNumOttBoxes,
325
25.0k
                         MAX_PARAMETER_BANDS, SCHAR)
326
25.0k
  FDK_ALLOCATE_MEMORY_3D(self->outIdxData, setup.maxNumOttBoxes,
327
25.0k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
328
329
25.0k
  FDK_ALLOCATE_MEMORY_3D(self->arbdmxGain__FDK, setup.maxNumInputChannels,
330
25.0k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
331
25.0k
  FDK_ALLOCATE_MEMORY_1D(self->arbdmxAlpha__FDK, setup.maxNumInputChannels,
332
25.0k
                         FIXP_DBL)
333
25.0k
  FDK_ALLOCATE_MEMORY_1D(self->arbdmxAlphaPrev__FDK, setup.maxNumInputChannels,
334
25.0k
                         FIXP_DBL)
335
25.0k
  FDK_ALLOCATE_MEMORY_2D(self->cmpArbdmxGainIdxPrev, setup.maxNumInputChannels,
336
25.0k
                         MAX_PARAMETER_BANDS, SCHAR)
337
338
25.0k
  FDK_ALLOCATE_MEMORY_2D(self->cmpOttIPDidxPrev, setup.maxNumOttBoxes,
339
25.0k
                         MAX_PARAMETER_BANDS, SCHAR)
340
341
25.0k
  FDK_ALLOCATE_MEMORY_3D_INT(self->M2Real__FDK, setup.maxNumOutputChannels,
342
25.0k
                             setup.maxNumVChannels, MAX_PARAMETER_BANDS,
343
25.0k
                             FIXP_DBL, SECT_DATA_L2)
344
25.0k
  FDK_ALLOCATE_MEMORY_3D(self->M2Imag__FDK, setup.maxNumOutputChannels,
345
25.0k
                         setup.maxNumVChannels, MAX_PARAMETER_BANDS, FIXP_DBL)
346
347
25.0k
  FDK_ALLOCATE_MEMORY_3D_INT(self->M2RealPrev__FDK, setup.maxNumOutputChannels,
348
25.0k
                             setup.maxNumVChannels, MAX_PARAMETER_BANDS,
349
25.0k
                             FIXP_DBL, SECT_DATA_L2)
350
25.0k
  FDK_ALLOCATE_MEMORY_3D(self->M2ImagPrev__FDK, setup.maxNumOutputChannels,
351
25.0k
                         setup.maxNumVChannels, MAX_PARAMETER_BANDS, FIXP_DBL)
352
353
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(
354
25.0k
      self->qmfInputReal__FDK, setup.maxNumInputChannels, setup.maxNumQmfBands,
355
25.0k
      FIXP_DBL, SECT_DATA_L2)
356
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(
357
25.0k
      self->qmfInputImag__FDK, setup.maxNumInputChannels,
358
25.0k
      setup.maxNumCmplxQmfBands, FIXP_DBL, SECT_DATA_L2)
359
360
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybInputReal__FDK, setup.maxNumInputChannels,
361
25.0k
                             setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2)
362
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybInputImag__FDK, setup.maxNumInputChannels,
363
25.0k
                             setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2)
364
365
25.0k
  if (setup.bProcResidual) {
366
25.0k
    FDK_ALLOCATE_MEMORY_1D(self->qmfResidualReal__FDK, setup.maxNumResChannels,
367
25.0k
                           FIXP_DBL **)
368
25.0k
    FDK_ALLOCATE_MEMORY_1D(self->qmfResidualImag__FDK, setup.maxNumResChannels,
369
25.0k
                           FIXP_DBL **)
370
371
25.0k
    FDK_ALLOCATE_MEMORY_1D(self->hybResidualReal__FDK, setup.maxNumResChannels,
372
25.0k
                           FIXP_DBL *)
373
25.0k
    FDK_ALLOCATE_MEMORY_1D(self->hybResidualImag__FDK, setup.maxNumResChannels,
374
25.0k
                           FIXP_DBL *)
375
376
50.0k
    for (i = 0; i < setup.maxNumResChannels; i++) {
377
25.0k
      int resQmfBands = (config->decoderMode == EXT_LP_ONLY)
378
25.0k
                            ? PC_NUM_BANDS
379
25.0k
                            : setup.maxNumQmfBands;
380
25.0k
      int resHybBands = (config->decoderMode == EXT_LP_ONLY)
381
25.0k
                            ? PC_NUM_HYB_BANDS
382
25.0k
                            : setup.maxNumHybridBands;
383
      /* Alignment is needed for USAC residuals because QMF analysis directly
384
       * writes to this buffer. */
385
25.0k
      FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(self->qmfResidualReal__FDK[i], (1),
386
25.0k
                                         resQmfBands, FIXP_DBL, SECT_DATA_L1)
387
25.0k
      FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(self->qmfResidualImag__FDK[i], (1),
388
25.0k
                                         resQmfBands, FIXP_DBL, SECT_DATA_L1)
389
390
25.0k
      FDK_ALLOCATE_MEMORY_1D(self->hybResidualReal__FDK[i],
391
25.0k
                             setup.maxNumHybridBands, FIXP_DBL)
392
25.0k
      FDK_ALLOCATE_MEMORY_1D(self->hybResidualImag__FDK[i], resHybBands,
393
25.0k
                             FIXP_DBL)
394
25.0k
    }
395
25.0k
  } /* if (setup.bProcResidual) */
396
397
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->wReal__FDK, setup.maxNumVChannels,
398
25.0k
                             setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2)
399
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->wImag__FDK, setup.maxNumVChannels,
400
25.0k
                             setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2)
401
402
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputRealDry__FDK,
403
25.0k
                             setup.maxNumOutputChannels,
404
25.0k
                             setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2)
405
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputImagDry__FDK,
406
25.0k
                             setup.maxNumOutputChannels,
407
25.0k
                             setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2)
408
409
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputRealWet__FDK,
410
25.0k
                             setup.maxNumOutputChannels,
411
25.0k
                             setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2)
412
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputImagWet__FDK,
413
25.0k
                             setup.maxNumOutputChannels,
414
25.0k
                             setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2)
415
416
25.0k
  FDK_ALLOCATE_MEMORY_1D(self->hybridSynthesis, setup.maxNumOutputChannels,
417
25.0k
                         FDK_SYN_HYB_FILTER)
418
419
25.0k
  FDK_ALLOCATE_MEMORY_1D(
420
25.0k
      self->hybridAnalysis,
421
25.0k
      setup.bProcResidual ? setup.maxNumInputChannels + setup.maxNumResChannels
422
25.0k
                          : setup.maxNumInputChannels,
423
25.0k
      FDK_ANA_HYB_FILTER)
424
425
25.0k
  lfSize = 2 * BUFFER_LEN_LF * MAX_QMF_BANDS_TO_HYBRID;
426
25.0k
  {
427
25.0k
    hfSize =
428
25.0k
        BUFFER_LEN_HF * ((setup.maxNumQmfBands - MAX_QMF_BANDS_TO_HYBRID) +
429
25.0k
                         (setup.maxNumCmplxQmfBands - MAX_QMF_BANDS_TO_HYBRID));
430
25.0k
  }
431
432
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->pHybridAnaStatesLFdmx,
433
25.0k
                             setup.maxNumInputChannels, lfSize, FIXP_DBL,
434
25.0k
                             SECT_DATA_L2) {
435
25.0k
    FDK_ALLOCATE_MEMORY_2D(self->pHybridAnaStatesHFdmx,
436
25.0k
                           setup.maxNumInputChannels, hfSize, FIXP_DBL)
437
25.0k
  }
438
439
50.0k
  for (i = 0; i < setup.maxNumInputChannels; i++) {
440
25.0k
    FIXP_DBL *pHybridAnaStatesHFdmx;
441
442
25.0k
    pHybridAnaStatesHFdmx = self->pHybridAnaStatesHFdmx[i];
443
444
25.0k
    FDKhybridAnalysisOpen(&self->hybridAnalysis[i],
445
25.0k
                          self->pHybridAnaStatesLFdmx[i],
446
25.0k
                          lfSize * sizeof(FIXP_DBL), pHybridAnaStatesHFdmx,
447
25.0k
                          hfSize * sizeof(FIXP_DBL));
448
25.0k
  }
449
25.0k
  if (setup.bProcResidual) {
450
25.0k
    lfSize = 2 * BUFFER_LEN_LF * MAX_QMF_BANDS_TO_HYBRID;
451
25.0k
    hfSize = BUFFER_LEN_HF *
452
25.0k
             ((((config->decoderMode == EXT_LP_ONLY) ? PC_NUM_BANDS
453
25.0k
                                                     : setup.maxNumQmfBands) -
454
25.0k
               MAX_QMF_BANDS_TO_HYBRID) +
455
25.0k
              (setup.maxNumCmplxQmfBands - MAX_QMF_BANDS_TO_HYBRID));
456
457
25.0k
    FDK_ALLOCATE_MEMORY_2D_INT(self->pHybridAnaStatesLFres,
458
25.0k
                               setup.maxNumResChannels, lfSize, FIXP_DBL,
459
25.0k
                               SECT_DATA_L2)
460
25.0k
    FDK_ALLOCATE_MEMORY_2D(self->pHybridAnaStatesHFres, setup.maxNumResChannels,
461
25.0k
                           hfSize, FIXP_DBL)
462
463
25.0k
    for (i = setup.maxNumInputChannels;
464
50.0k
         i < (setup.maxNumInputChannels + setup.maxNumResChannels); i++) {
465
25.0k
      FDKhybridAnalysisOpen(
466
25.0k
          &self->hybridAnalysis[i],
467
25.0k
          self->pHybridAnaStatesLFres[i - setup.maxNumInputChannels],
468
25.0k
          lfSize * sizeof(FIXP_DBL),
469
25.0k
          self->pHybridAnaStatesHFres[i - setup.maxNumInputChannels],
470
25.0k
          hfSize * sizeof(FIXP_DBL));
471
25.0k
    }
472
25.0k
  }
473
474
25.0k
  FDK_ALLOCATE_MEMORY_1D(self->smoothState, 1, SMOOTHING_STATE)
475
25.0k
  FDK_ALLOCATE_MEMORY_1D(self->reshapeBBEnvState, 1, RESHAPE_BBENV_STATE)
476
477
25.0k
  FDK_ALLOCATE_MEMORY_1D(self->apDecor, setup.maxNumDecorChannels, DECORR_DEC)
478
25.0k
  FDK_ALLOCATE_MEMORY_2D_INT(self->pDecorBufferCplx, setup.maxNumDecorChannels,
479
25.0k
                             (2 * ((825) + (373))), FIXP_DBL, SECT_DATA_L2)
480
481
50.0k
  for (i = 0; i < setup.maxNumDecorChannels; i++) {
482
25.0k
    if (FDKdecorrelateOpen(&self->apDecor[i], self->pDecorBufferCplx[i],
483
25.0k
                           (2 * ((825) + (373))))) {
484
0
      goto bail;
485
0
    }
486
25.0k
  }
487
488
25.0k
  if (subbandTPCreate(&self->hStpDec) != MPS_OK) {
489
0
    goto bail;
490
0
  }
491
492
  /* save general decoder configuration */
493
25.0k
  self->decoderLevel = config->decoderLevel;
494
25.0k
  self->decoderMode = config->decoderMode;
495
25.0k
  self->binauralMode = config->binauralMode;
496
497
  /* preinitialize configuration */
498
25.0k
  self->partiallyComplex = (config->decoderMode != EXT_HQ_ONLY) ? 1 : 0;
499
500
  /* Set to default state */
501
25.0k
  SpatialDecConcealment_Init(&self->concealInfo, MPEGS_CONCEAL_RESET_ALL);
502
503
  /* Everything is fine so return the handle */
504
25.0k
  return self;
505
506
0
bail:
507
  /* Collector for all errors.
508
     Deallocate all memory and return a invalid handle. */
509
0
  FDK_SpatialDecClose(self);
510
511
0
  return NULL;
512
25.0k
}
513
514
/*******************************************************************************
515
 Functionname: isValidConfig
516
 *******************************************************************************
517
518
 Description: Validate if configuration is supported in present instance
519
520
 Arguments:
521
522
 Return: 1: all okay
523
         0: configuration not supported
524
*******************************************************************************/
525
static int isValidConfig(spatialDec const *const self,
526
                         const SPATIAL_DEC_UPMIX_TYPE upmixType,
527
                         SPATIALDEC_PARAM const *const pUserParams,
528
69.6k
                         const AUDIO_OBJECT_TYPE coreAot) {
529
69.6k
  UPMIXTYPE nUpmixType;
530
531
69.6k
  FDK_ASSERT(self != NULL);
532
69.6k
  FDK_ASSERT(pUserParams != NULL);
533
534
69.6k
  nUpmixType = (UPMIXTYPE)upmixType;
535
536
69.6k
  switch (nUpmixType) {
537
0
    case UPMIXTYPE_BYPASS: /* UPMIX_TYPE_BYPASS */
538
0
      break;
539
69.6k
    case UPMIXTYPE_NORMAL: /* UPMIX_TYPE_NORMAL */
540
69.6k
      break;
541
0
    default:
542
0
      return 0; /* unsupported upmixType */
543
69.6k
  }
544
545
69.6k
  return 1; /* upmixType supported */
546
69.6k
}
547
548
static SACDEC_ERROR CheckLevelTreeUpmixType(
549
    const SACDEC_CREATION_PARAMS *const pCreateParams,
550
    const SPATIAL_SPECIFIC_CONFIG *const pSsc, const int decoderLevel,
551
69.6k
    const UPMIXTYPE upmixType) {
552
69.6k
  SACDEC_ERROR err = MPS_OK;
553
69.6k
  int nOutputChannels, treeConfig;
554
555
69.6k
  FDK_ASSERT(pCreateParams != NULL);
556
69.6k
  FDK_ASSERT(pSsc != NULL);
557
558
69.6k
  treeConfig = pSsc->treeConfig;
559
560
69.6k
  switch (decoderLevel) {
561
69.6k
    case 0: {
562
69.6k
      if (treeConfig != SPATIALDEC_MODE_RSVD7) {
563
0
        err = MPS_INVALID_TREECONFIG;
564
0
        goto bail;
565
0
      }
566
69.6k
      break;
567
69.6k
    }
568
69.6k
    default:
569
0
      err = MPS_INVALID_PARAMETER /* MPS_UNIMPLEMENTED */;
570
0
      goto bail;
571
69.6k
  }
572
573
69.6k
  switch (upmixType) {
574
0
    case UPMIXTYPE_BYPASS:
575
0
      nOutputChannels = pSsc->nInputChannels;
576
0
      break;
577
69.6k
    default:
578
69.6k
      nOutputChannels = pSsc->nOutputChannels;
579
69.6k
      break;
580
69.6k
  }
581
582
  /* Is sufficient memory allocated. */
583
69.6k
  if ((pSsc->nInputChannels > pCreateParams->maxNumInputChannels) ||
584
69.6k
      (nOutputChannels > pCreateParams->maxNumOutputChannels) ||
585
69.6k
      (pSsc->nOttBoxes > pCreateParams->maxNumOttBoxes)) {
586
0
    err = MPS_INVALID_PARAMETER;
587
0
  }
588
589
69.6k
bail:
590
69.6k
  return err;
591
69.6k
}
592
593
67.5k
void SpatialDecInitParserContext(spatialDec *self) {
594
67.5k
  int i, j;
595
596
135k
  for (i = 0; i < self->createParams.maxNumOttBoxes; i += 1) {
597
1.95M
    for (j = 0; j < MAX_PARAMETER_BANDS; j++) {
598
1.89M
      self->ottCLDidxPrev[i][j] = 0;
599
1.89M
      self->ottICCidxPrev[i][j] = 0;
600
1.89M
      self->cmpOttCLDidxPrev[i][j] = 0;
601
1.89M
      self->cmpOttICCidxPrev[i][j] = 0;
602
1.89M
    }
603
67.5k
  }
604
135k
  for (i = 0; i < self->createParams.maxNumInputChannels; i++) {
605
1.95M
    for (j = 0; j < MAX_PARAMETER_BANDS; j++) {
606
1.89M
      self->arbdmxGainIdxPrev[i][j] = 0;
607
1.89M
      self->cmpArbdmxGainIdxPrev[i][j] = 0;
608
1.89M
    }
609
67.5k
  }
610
67.5k
}
611
612
/*******************************************************************************
613
 Functionname: FDK_SpatialDecInit
614
 *******************************************************************************
615
616
 Description:
617
618
 Arguments:
619
620
 Return:
621
622
*******************************************************************************/
623
624
SACDEC_ERROR FDK_SpatialDecInit(spatialDec *self, SPATIAL_BS_FRAME *frame,
625
                                SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig,
626
                                int nQmfBands,
627
                                SPATIAL_DEC_UPMIX_TYPE const upmixType,
628
69.6k
                                SPATIALDEC_PARAM *pUserParams, UINT initFlags) {
629
69.6k
  SACDEC_ERROR err = MPS_OK;
630
69.6k
  int nCh, i, j, k;
631
69.6k
  int maxQmfBands;
632
69.6k
  int bypassMode = 0;
633
634
69.6k
  self->useFDreverb = 0;
635
636
  /* check configuration parameter */
637
69.6k
  if (!isValidConfig(self, upmixType, pUserParams,
638
69.6k
                     pSpatialSpecificConfig->coreCodec)) {
639
0
    return MPS_INVALID_PARAMETER;
640
0
  }
641
642
  /* check tree configuration */
643
69.6k
  err = CheckLevelTreeUpmixType(&self->createParams, pSpatialSpecificConfig,
644
69.6k
                                self->decoderLevel, (UPMIXTYPE)upmixType);
645
69.6k
  if (err != MPS_OK) {
646
0
    goto bail;
647
0
  }
648
649
  /* Store and update instance after all checks passed successfully: */
650
69.6k
  self->upmixType = (UPMIXTYPE)upmixType;
651
652
69.6k
  if (initFlags & MPEGS_INIT_PARAMS_ERROR_CONCEALMENT) { /* At least one error
653
                                                            concealment
654
                                                            parameter changed */
655
14.1k
    err = SpatialDecConcealment_SetParam(
656
14.1k
        &self->concealInfo, SAC_DEC_CONCEAL_METHOD, pUserParams->concealMethod);
657
14.1k
    if (err != MPS_OK) {
658
0
      goto bail;
659
0
    }
660
14.1k
    err = SpatialDecConcealment_SetParam(&self->concealInfo,
661
14.1k
                                         SAC_DEC_CONCEAL_NUM_KEEP_FRAMES,
662
14.1k
                                         pUserParams->concealNumKeepFrames);
663
14.1k
    if (err != MPS_OK) {
664
0
      goto bail;
665
0
    }
666
14.1k
    err = SpatialDecConcealment_SetParam(
667
14.1k
        &self->concealInfo, SAC_DEC_CONCEAL_FADE_OUT_SLOPE_LENGTH,
668
14.1k
        pUserParams->concealFadeOutSlopeLength);
669
14.1k
    if (err != MPS_OK) {
670
0
      goto bail;
671
0
    }
672
14.1k
    err = SpatialDecConcealment_SetParam(&self->concealInfo,
673
14.1k
                                         SAC_DEC_CONCEAL_FADE_IN_SLOPE_LENGTH,
674
14.1k
                                         pUserParams->concealFadeInSlopeLength);
675
14.1k
    if (err != MPS_OK) {
676
0
      goto bail;
677
0
    }
678
14.1k
    err = SpatialDecConcealment_SetParam(&self->concealInfo,
679
14.1k
                                         SAC_DEC_CONCEAL_NUM_RELEASE_FRAMES,
680
14.1k
                                         pUserParams->concealNumReleaseFrames);
681
14.1k
    if (err != MPS_OK) {
682
0
      goto bail;
683
0
    }
684
14.1k
  }
685
686
69.6k
  if (initFlags &
687
69.6k
      MPEGS_INIT_STATES_ERROR_CONCEALMENT) { /* Set to default state */
688
14.1k
    SpatialDecConcealment_Init(&self->concealInfo, MPEGS_CONCEAL_RESET_STATE);
689
14.1k
  }
690
691
  /* determine bypass mode */
692
69.6k
  bypassMode |= pUserParams->bypassMode;
693
69.6k
  bypassMode |= ((self->upmixType == UPMIXTYPE_BYPASS) ? 1 : 0);
694
695
  /* static decoder scale depends on number of qmf bands */
696
69.6k
  switch (nQmfBands) {
697
1.80k
    case 16:
698
3.99k
    case 24:
699
42.0k
    case 32:
700
42.0k
      self->staticDecScale = 21;
701
42.0k
      break;
702
27.5k
    case 64:
703
27.5k
      self->staticDecScale = 22;
704
27.5k
      break;
705
0
    default:
706
0
      return MPS_INVALID_PARAMETER;
707
69.6k
  }
708
709
69.6k
  self->numParameterSetsPrev = 1;
710
711
69.6k
  self->qmfBands = nQmfBands;
712
  /* self->hybridBands will be updated in SpatialDecDecodeHeader() below. */
713
714
69.6k
  self->bShareDelayWithSBR = 0;
715
716
69.6k
  err = SpatialDecDecodeHeader(self, pSpatialSpecificConfig);
717
69.6k
  if (err != MPS_OK) {
718
1.00k
    goto bail;
719
1.00k
  }
720
721
68.6k
  self->stereoConfigIndex = pSpatialSpecificConfig->stereoConfigIndex;
722
723
68.6k
  if (initFlags & MPEGS_INIT_STATES_ANA_QMF_FILTER) {
724
13.2k
    self->qmfInputDelayBufPos = 0;
725
13.2k
    self->pc_filterdelay = 1; /* Division by 0 not possible */
726
13.2k
  }
727
728
68.6k
  maxQmfBands = self->qmfBands;
729
730
  /* init residual decoder */
731
732
  /* init tonality smoothing */
733
68.6k
  if (initFlags & MPEGS_INIT_STATES_PARAM) {
734
23.2k
    initParameterSmoothing(self);
735
23.2k
  }
736
737
  /* init GES */
738
68.6k
  initBBEnv(self, (initFlags & MPEGS_INIT_STATES_GES) ? 1 : 0);
739
740
  /* Clip protection is applied only for normal processing. */
741
68.6k
  if (!isTwoChMode(self->upmixType) && !bypassMode) {
742
68.6k
    self->staticDecScale += self->clipProtectGainSF__FDK;
743
68.6k
  }
744
745
68.6k
  {
746
68.6k
    UINT flags = 0;
747
68.6k
    INT initStatesFlag = (initFlags & MPEGS_INIT_STATES_ANA_QMF_FILTER) ? 1 : 0;
748
68.6k
    INT useLdFilter =
749
68.6k
        (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) ? 1 : 0;
750
751
68.6k
    flags = self->pQmfDomain->globalConf.flags_requested;
752
68.6k
    flags &= (~(UINT)QMF_FLAG_LP);
753
754
68.6k
    if (initStatesFlag)
755
13.2k
      flags &= ~QMF_FLAG_KEEP_STATES;
756
55.3k
    else
757
55.3k
      flags |= QMF_FLAG_KEEP_STATES;
758
759
68.6k
    if (useLdFilter)
760
37.2k
      flags |= QMF_FLAG_MPSLDFB;
761
31.3k
    else
762
31.3k
      flags &= ~QMF_FLAG_MPSLDFB;
763
764
68.6k
    self->pQmfDomain->globalConf.flags_requested = flags;
765
68.6k
    FDK_QmfDomain_Configure(self->pQmfDomain);
766
767
    /* output scaling */
768
205k
    for (nCh = 0; nCh < self->numOutputChannelsAT; nCh++) {
769
137k
      int outputScale = 0, outputGain_e = 0, scale = -(8) + (1);
770
137k
      FIXP_DBL outputGain_m = getChGain(self, nCh, &outputGain_e);
771
772
137k
      if (!isTwoChMode(self->upmixType) && !bypassMode) {
773
137k
        outputScale +=
774
137k
            self->clipProtectGainSF__FDK; /* consider clip protection scaling at
775
                                             synthesis qmf */
776
137k
      }
777
778
137k
      scale += outputScale;
779
780
137k
      qmfChangeOutScalefactor(&self->pQmfDomain->QmfDomainOut[nCh].fb, scale);
781
137k
      qmfChangeOutGain(&self->pQmfDomain->QmfDomainOut[nCh].fb, outputGain_m,
782
137k
                       outputGain_e);
783
137k
    }
784
68.6k
  }
785
786
205k
  for (nCh = 0; nCh < self->numOutputChannelsAT; nCh++) {
787
137k
    FDKhybridSynthesisInit(&self->hybridSynthesis[nCh], THREE_TO_TEN,
788
137k
                           self->qmfBands, maxQmfBands);
789
137k
  }
790
791
  /* for input, residual channels and arbitrary down-mix residual channels */
792
137k
  for (nCh = 0; nCh < self->createParams.maxNumInputChannels; nCh++) {
793
68.6k
    FDKhybridAnalysisInit(
794
68.6k
        &self->hybridAnalysis[nCh], THREE_TO_TEN, self->qmfBands, maxQmfBands,
795
68.6k
        (initFlags & MPEGS_INIT_STATES_ANA_HYB_FILTER) ? 1 : 0);
796
68.6k
  }
797
137k
  for (; nCh < (self->createParams.bProcResidual
798
137k
                    ? (self->createParams.maxNumInputChannels +
799
137k
                       self->createParams.maxNumResChannels)
800
137k
                    : self->createParams.maxNumInputChannels);
801
68.6k
       nCh++) {
802
68.6k
    FDKhybridAnalysisInit(&self->hybridAnalysis[nCh], THREE_TO_TEN, maxQmfBands,
803
68.6k
                          maxQmfBands, 0);
804
68.6k
  }
805
806
68.6k
  {
807
137k
    for (k = 0; k < self->numDecorSignals; k++) {
808
68.6k
      int errCode, idec;
809
68.6k
      FDK_DECORR_TYPE decorrType = DECORR_PS;
810
68.6k
      decorrType = DECORR_LD;
811
68.6k
      if (self->pConfigCurrent->syntaxFlags &
812
68.6k
          (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) {
813
31.3k
        decorrType =
814
31.3k
            ((self->treeConfig == TREE_212) && (self->decorrType == DECORR_PS))
815
31.3k
                ? DECORR_PS
816
31.3k
                : DECORR_USAC;
817
31.3k
      }
818
68.6k
      {
819
68.6k
        idec = k;
820
68.6k
        if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) {
821
37.2k
          if (self->treeConfig == TREE_212 && k == 0) {
822
37.2k
            idec = 2;
823
37.2k
          }
824
37.2k
        }
825
68.6k
      }
826
68.6k
      errCode = FDKdecorrelateInit(
827
68.6k
          &self->apDecor[k], self->hybridBands, decorrType, DUCKER_AUTOMATIC,
828
68.6k
          self->decorrConfig, idec, 0, /* self->partiallyComplex */
829
68.6k
          0, 0,                        /* isLegacyPS */
830
68.6k
          (initFlags & MPEGS_INIT_STATES_DECORRELATOR) ? 1 : 0);
831
68.6k
      if (errCode) return MPS_NOTOK;
832
68.6k
    }
833
68.6k
  } /* !self->partiallyComplex */
834
835
68.6k
  err = initM1andM2(self, (initFlags & MPEGS_INIT_STATES_M1M2) ? 1 : 0,
836
68.6k
                    (initFlags & MPEGS_INIT_CONFIG) ? 1 : 0);
837
68.6k
  if (err != MPS_OK) return err;
838
839
  /* Initialization of previous frame data */
840
68.6k
  if (initFlags & MPEGS_INIT_STATES_PARAM) {
841
46.4k
    for (i = 0; i < self->createParams.maxNumOttBoxes; i += 1) {
842
      /* reset icc diff data */
843
232k
      for (k = 0; k < MAX_PARAMETER_SETS; k += 1) {
844
6.06M
        for (j = 0; j < MAX_PARAMETER_BANDS; j += 1) {
845
5.85M
          self->ottICCdiffidx[i][k][j] = 0;
846
5.85M
        }
847
209k
      }
848
23.2k
    }
849
    /* Parameter Smoothing */
850
    /* robustness: init with one of the values of smgTimeTable[] = {64, 128,
851
       256, 512} to avoid division by zero in calcFilterCoeff__FDK() */
852
23.2k
    self->smoothState->prevSmgTime = smgTimeTable[2]; /* == 256 */
853
23.2k
    FDKmemclear(self->smoothState->prevSmgData,
854
23.2k
                MAX_PARAMETER_BANDS * sizeof(UCHAR));
855
23.2k
    FDKmemclear(self->smoothState->opdLeftState__FDK,
856
23.2k
                MAX_PARAMETER_BANDS * sizeof(FIXP_DBL));
857
23.2k
    FDKmemclear(self->smoothState->opdRightState__FDK,
858
23.2k
                MAX_PARAMETER_BANDS * sizeof(FIXP_DBL));
859
23.2k
  }
860
861
68.6k
  self->prevTimeSlot = -1;
862
68.6k
  self->curTimeSlot =
863
68.6k
      MAX_TIME_SLOTS + 1; /* Initialize with a invalid value to trigger
864
                             concealment if first frame has no valid data. */
865
68.6k
  self->curPs = 0;
866
867
68.6k
  subbandTPInit(self->hStpDec);
868
869
69.6k
bail:
870
69.6k
  return err;
871
68.6k
}
872
873
void SpatialDecChannelProperties(spatialDec *self,
874
                                 AUDIO_CHANNEL_TYPE channelType[],
875
                                 UCHAR channelIndices[],
876
222k
                                 const FDK_channelMapDescr *const mapDescr) {
877
222k
  if ((self == NULL) || (channelType == NULL) || (channelIndices == NULL) ||
878
222k
      (mapDescr == NULL)) {
879
0
    return; /* no extern buffer to be filled */
880
0
  }
881
882
222k
  if (self->numOutputChannelsAT !=
883
222k
      treePropertyTable[self->treeConfig].numOutputChannels) {
884
0
    int ch;
885
    /* Declare all channels to be front channels: */
886
0
    for (ch = 0; ch < self->numOutputChannelsAT; ch += 1) {
887
0
      channelType[ch] = ACT_FRONT;
888
0
      channelIndices[ch] = ch;
889
0
    }
890
222k
  } else {
891
    /* ISO/IEC FDIS 23003-1:2006(E), page 46, Table 40 bsTreeConfig */
892
222k
    switch (self->treeConfig) {
893
222k
      case TREE_212:
894
222k
        channelType[0] = ACT_FRONT;
895
222k
        channelIndices[0] = 0;
896
222k
        channelType[1] = ACT_FRONT;
897
222k
        channelIndices[1] = 1;
898
222k
        break;
899
0
      default:;
900
222k
    }
901
222k
  }
902
222k
}
903
904
/*******************************************************************************
905
 Functionname: FDK_SpatialDecClose
906
 *******************************************************************************
907
908
 Description:
909
910
 Arguments:
911
912
 Return:
913
914
*******************************************************************************/
915
916
267k
void FDK_SpatialDecClose(spatialDec *self) {
917
267k
  if (self) {
918
25.0k
    int k;
919
920
25.0k
    if (self->apDecor != NULL) {
921
50.0k
      for (k = 0; k < self->createParams.maxNumDecorChannels; k++) {
922
25.0k
        FDKdecorrelateClose(&(self->apDecor[k]));
923
25.0k
      }
924
25.0k
      FDK_FREE_MEMORY_1D(self->apDecor);
925
25.0k
    }
926
25.0k
    if (self->pDecorBufferCplx != NULL) {
927
25.0k
      FDK_FREE_MEMORY_2D(self->pDecorBufferCplx);
928
25.0k
    }
929
930
25.0k
    subbandTPDestroy(&self->hStpDec);
931
932
25.0k
    FDK_FREE_MEMORY_1D(self->reshapeBBEnvState);
933
25.0k
    FDK_FREE_MEMORY_1D(self->smoothState);
934
935
25.0k
    FDK_FREE_MEMORY_2D(self->pHybridAnaStatesLFdmx);
936
25.0k
    FDK_FREE_MEMORY_2D(self->pHybridAnaStatesHFdmx);
937
25.0k
    FDK_FREE_MEMORY_2D(self->pHybridAnaStatesLFres);
938
25.0k
    FDK_FREE_MEMORY_2D(self->pHybridAnaStatesHFres);
939
25.0k
    FDK_FREE_MEMORY_1D(self->hybridAnalysis);
940
941
25.0k
    FDK_FREE_MEMORY_1D(self->hybridSynthesis);
942
943
    /* The time buffer is passed to the decoder from outside to avoid copying
944
     * (zero copy). */
945
    /* FDK_FREE_MEMORY_2D(self->timeOut__FDK); */
946
947
25.0k
    FDK_FREE_MEMORY_2D(self->hybOutputImagWet__FDK);
948
25.0k
    FDK_FREE_MEMORY_2D(self->hybOutputRealWet__FDK);
949
950
25.0k
    FDK_FREE_MEMORY_2D(self->hybOutputImagDry__FDK);
951
25.0k
    FDK_FREE_MEMORY_2D(self->hybOutputRealDry__FDK);
952
953
25.0k
    FDK_FREE_MEMORY_2D(self->wImag__FDK);
954
25.0k
    FDK_FREE_MEMORY_2D(self->wReal__FDK);
955
956
25.0k
    if (self->createParams.bProcResidual) {
957
25.0k
      int i;
958
959
50.0k
      for (i = 0; i < self->createParams.maxNumResChannels; i++) {
960
25.0k
        if (self->hybResidualImag__FDK != NULL)
961
25.0k
          FDK_FREE_MEMORY_1D(self->hybResidualImag__FDK[i]);
962
25.0k
        if (self->hybResidualReal__FDK != NULL)
963
25.0k
          FDK_FREE_MEMORY_1D(self->hybResidualReal__FDK[i]);
964
25.0k
        if (self->qmfResidualImag__FDK != NULL)
965
25.0k
          FDK_FREE_MEMORY_2D_ALIGNED(self->qmfResidualImag__FDK[i]);
966
25.0k
        if (self->qmfResidualReal__FDK != NULL)
967
25.0k
          FDK_FREE_MEMORY_2D_ALIGNED(self->qmfResidualReal__FDK[i]);
968
25.0k
      }
969
970
25.0k
      FDK_FREE_MEMORY_1D(self->hybResidualImag__FDK);
971
25.0k
      FDK_FREE_MEMORY_1D(self->hybResidualReal__FDK);
972
973
25.0k
      FDK_FREE_MEMORY_1D(self->qmfResidualImag__FDK);
974
25.0k
      FDK_FREE_MEMORY_1D(self->qmfResidualReal__FDK);
975
976
25.0k
    } /* self->createParams.bProcResidual */
977
978
25.0k
    FDK_FREE_MEMORY_2D(self->hybInputImag__FDK);
979
25.0k
    FDK_FREE_MEMORY_2D(self->hybInputReal__FDK);
980
981
25.0k
    FDK_FREE_MEMORY_2D_ALIGNED(self->qmfInputImag__FDK);
982
25.0k
    FDK_FREE_MEMORY_2D_ALIGNED(self->qmfInputReal__FDK);
983
984
25.0k
    FDK_FREE_MEMORY_3D(self->M2ImagPrev__FDK);
985
986
25.0k
    FDK_FREE_MEMORY_3D(self->M2RealPrev__FDK);
987
988
25.0k
    FDK_FREE_MEMORY_3D(self->M2Imag__FDK);
989
990
25.0k
    FDK_FREE_MEMORY_3D(self->M2Real__FDK);
991
992
25.0k
    FDK_FREE_MEMORY_1D(self->arbdmxAlphaPrev__FDK);
993
25.0k
    FDK_FREE_MEMORY_1D(self->arbdmxAlpha__FDK);
994
995
25.0k
    FDK_FREE_MEMORY_3D(self->arbdmxGain__FDK);
996
997
25.0k
    FDK_FREE_MEMORY_3D(self->ottIPD__FDK);
998
25.0k
    FDK_FREE_MEMORY_3D(self->ottICC__FDK);
999
25.0k
    FDK_FREE_MEMORY_3D(self->ottCLD__FDK);
1000
1001
    /* Last parameters from prev frame */
1002
25.0k
    FDK_FREE_MEMORY_2D(self->ottCLDidxPrev);
1003
25.0k
    FDK_FREE_MEMORY_2D(self->ottICCidxPrev);
1004
25.0k
    FDK_FREE_MEMORY_3D(self->ottICCdiffidx);
1005
25.0k
    FDK_FREE_MEMORY_2D(self->ottIPDidxPrev);
1006
25.0k
    FDK_FREE_MEMORY_2D(self->arbdmxGainIdxPrev);
1007
1008
25.0k
    FDK_FREE_MEMORY_2D(self->cmpOttCLDidxPrev);
1009
25.0k
    FDK_FREE_MEMORY_2D(self->cmpOttICCidxPrev);
1010
25.0k
    FDK_FREE_MEMORY_3D(self->outIdxData);
1011
25.0k
    FDK_FREE_MEMORY_2D(self->cmpOttIPDidxPrev);
1012
25.0k
    FDK_FREE_MEMORY_2D(self->cmpArbdmxGainIdxPrev);
1013
1014
25.0k
    FDK_FREE_MEMORY_2D(self->smgData);
1015
25.0k
    FDK_FREE_MEMORY_1D(self->smgTime);
1016
1017
25.0k
    FDK_FREE_MEMORY_1D(self->numOttBands);
1018
1019
25.0k
    FDK_FREE_MEMORY_1D(self->param2hyb);
1020
1021
25.0k
    FDK_FREE_MEMORY_1D(self);
1022
25.0k
  }
1023
1024
267k
  return;
1025
267k
}
1026
1027
/**
1028
 * \brief Apply Surround bypass buffer copies
1029
 * \param self spatialDec handle
1030
 * \param hybInputReal
1031
 * \param hybInputImag
1032
 * \param hybOutputReal
1033
 * \param hybOutputImag
1034
 * \param numInputChannels amount if input channels available in hybInputReal
1035
 * and hybInputImag, which may differ from self->numInputChannels.
1036
 */
1037
static void SpatialDecApplyBypass(spatialDec *self, FIXP_DBL **hybInputReal,
1038
                                  FIXP_DBL **hybInputImag,
1039
                                  FIXP_DBL **hybOutputReal,
1040
                                  FIXP_DBL **hybOutputImag,
1041
0
                                  const int numInputChannels) {
1042
0
  int complexHybBands;
1043
1044
0
  complexHybBands = self->hybridBands;
1045
1046
0
  {
1047
0
    int ch;
1048
0
    int rf = -1, lf = -1, cf = -1; /* Right Front, Left Front, Center Front */
1049
1050
    /* Determine output channel indices according to tree config */
1051
0
    switch (self->treeConfig) {
1052
0
      case TREE_212: /* 212  */
1053
0
        lf = 0;
1054
0
        rf = 1;
1055
0
        break;
1056
0
      default:;
1057
0
    }
1058
1059
    /* Note: numInputChannels might not match the tree config ! */
1060
0
    switch (numInputChannels) {
1061
0
      case 1:
1062
0
        if (cf > 0) {
1063
0
          FDKmemcpy(hybOutputReal[cf], hybInputReal[0],
1064
0
                    self->hybridBands * sizeof(FIXP_DBL));
1065
0
          FDKmemcpy(hybOutputImag[cf], hybInputImag[0],
1066
0
                    complexHybBands * sizeof(FIXP_DBL));
1067
0
        } else {
1068
0
          FDKmemcpy(hybOutputReal[lf], hybInputReal[0],
1069
0
                    self->hybridBands * sizeof(FIXP_DBL));
1070
0
          FDKmemcpy(hybOutputReal[rf], hybInputReal[0],
1071
0
                    self->hybridBands * sizeof(FIXP_DBL));
1072
0
          FDKmemcpy(hybOutputImag[lf], hybInputImag[0],
1073
0
                    complexHybBands * sizeof(FIXP_DBL));
1074
0
          FDKmemcpy(hybOutputImag[rf], hybInputImag[0],
1075
0
                    complexHybBands * sizeof(FIXP_DBL));
1076
0
        }
1077
0
        break;
1078
0
      case 2:
1079
0
        FDK_ASSERT(lf != -1);
1080
0
        FDK_ASSERT(rf != -1);
1081
0
        FDKmemcpy(hybOutputReal[lf], hybInputReal[0],
1082
0
                  self->hybridBands * sizeof(FIXP_DBL));
1083
0
        FDKmemcpy(hybOutputReal[rf], hybInputReal[1],
1084
0
                  self->hybridBands * sizeof(FIXP_DBL));
1085
0
        FDKmemcpy(hybOutputImag[lf], hybInputImag[0],
1086
0
                  complexHybBands * sizeof(FIXP_DBL));
1087
0
        FDKmemcpy(hybOutputImag[rf], hybInputImag[1],
1088
0
                  complexHybBands * sizeof(FIXP_DBL));
1089
0
        break;
1090
0
    }
1091
0
    for (ch = 0; ch < self->numOutputChannelsAT; ch++) {
1092
0
      if (ch == lf || ch == rf || ch == cf) {
1093
0
        continue; /* Skip bypassed channels */
1094
0
      }
1095
0
      FDKmemclear(hybOutputReal[ch], self->hybridBands * sizeof(FIXP_DBL));
1096
0
      FDKmemclear(hybOutputImag[ch], complexHybBands * sizeof(FIXP_DBL));
1097
0
    }
1098
0
  }
1099
0
}
1100
1101
/**
1102
 * \brief Set internal error and reset error status
1103
 *
1104
 * \param self         spatialDec handle.
1105
 * \param bypassMode   pointer to bypassMode.
1106
 * \param err          error status.
1107
 *
1108
 * \return  error status.
1109
 */
1110
static SACDEC_ERROR SpatialDecSetInternalError(spatialDec *self,
1111
                                               int *bypassMode,
1112
0
                                               SACDEC_ERROR err) {
1113
0
  *bypassMode = 1;
1114
1115
0
  if (self->errInt == MPS_OK) {
1116
    /* store internal error before it gets overwritten */
1117
0
    self->errInt = err;
1118
0
  }
1119
1120
0
  return MPS_OK;
1121
0
}
1122
1123
/*******************************************************************************
1124
 Functionname: SpatialDecApplyParameterSets
1125
 *******************************************************************************
1126
1127
 Description:
1128
1129
 Arguments:
1130
1131
 Return:
1132
1133
*******************************************************************************/
1134
static SACDEC_ERROR SpatialDecApplyParameterSets(
1135
    spatialDec *self, const SPATIAL_BS_FRAME *frame, SPATIALDEC_INPUT_MODE mode,
1136
    PCM_MPS *inData,          /* Time domain input  */
1137
    FIXP_DBL **qmfInDataReal, /* QMF domain data l/r */
1138
    FIXP_DBL **qmfInDataImag, /* QMF domain data l/r */
1139
    UINT nSamples, UINT controlFlags, int numInputChannels,
1140
222k
    const FDK_channelMapDescr *const mapDescr) {
1141
222k
  SACDEC_ERROR err = MPS_OK;
1142
1143
222k
  FIXP_SGL alpha = FL2FXCONST_SGL(0.0);
1144
1145
222k
  int ts;
1146
222k
  int ch;
1147
222k
  int hyb;
1148
1149
222k
  int prevSlot = self->prevTimeSlot;
1150
222k
  int ps = self->curPs;
1151
222k
  int ts_io = 0; /* i/o dependent slot */
1152
222k
  int bypassMode = (controlFlags & MPEGS_BYPASSMODE) ? 1 : 0;
1153
1154
  /* Bypass can be triggered by the upmixType, too. */
1155
222k
  bypassMode |= ((self->upmixType == UPMIXTYPE_BYPASS) ? 1 : 0);
1156
1157
  /*
1158
   * Decode available slots
1159
   */
1160
222k
  for (ts = self->curTimeSlot;
1161
6.97M
       ts <= fixMin(self->curTimeSlot + (int)nSamples / self->qmfBands - 1,
1162
222k
                    self->timeSlots - 1);
1163
6.75M
       ts++, ts_io++) {
1164
6.75M
    int currSlot = frame->paramSlot[ps];
1165
1166
6.75M
    err = (currSlot < ts) ? MPS_WRONG_PARAMETERSETS : MPS_OK;
1167
6.75M
    if (err != MPS_OK) {
1168
0
      err = SpatialDecSetInternalError(self, &bypassMode, err);
1169
0
    }
1170
1171
    /*
1172
     * Get new parameter set
1173
     */
1174
6.75M
    if (ts == prevSlot + 1) {
1175
279k
      if (bypassMode == 0) {
1176
279k
        err = SpatialDecCalculateM1andM2(
1177
279k
            self, ps, frame); /* input: ottCLD, ottICC, ... */
1178
                              /* output: M1param(Real/Imag), M2(Real/Imag) */
1179
279k
        if (err != MPS_OK) {
1180
0
          err = SpatialDecSetInternalError(self, &bypassMode, err);
1181
0
        }
1182
279k
      }
1183
1184
279k
      if ((ps == 0) && (self->bOverwriteM1M2prev != 0)) {
1185
        /* copy matrix entries of M1/M2 of the first parameter set to the
1186
           previous matrices (of the last frame). This avoids the interpolation
1187
           of incompatible values. E.g. for residual bands the coefficients are
1188
           calculated differently compared to non-residual bands.
1189
         */
1190
10.0k
        SpatialDecBufferMatrices(self); /* input: M(1/2)param(Real/Imag) */
1191
                                        /* output: M(1/2)param(Real/Imag)Prev */
1192
10.0k
        self->bOverwriteM1M2prev = 0;
1193
10.0k
      }
1194
1195
279k
      if (bypassMode == 0) {
1196
279k
        SpatialDecSmoothM1andM2(
1197
279k
            self, frame,
1198
279k
            ps); /* input: M1param(Real/Imag)(Prev), M2(Real/Imag)(Prev) */
1199
279k
      }          /* output: M1param(Real/Imag), M2(Real/Imag) */
1200
279k
    }
1201
1202
6.75M
    if (bypassMode == 0) {
1203
6.75M
      alpha = FX_DBL2FX_SGL(fDivNorm(ts - prevSlot, currSlot - prevSlot));
1204
6.75M
    }
1205
1206
6.75M
    switch (mode) {
1207
4.92M
      case INPUTMODE_QMF_SBR:
1208
4.92M
        if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD)
1209
18.4k
          self->bShareDelayWithSBR = 0; /* We got no hybrid delay */
1210
4.90M
        else
1211
4.90M
          self->bShareDelayWithSBR = 1;
1212
4.92M
        SpatialDecFeedQMF(
1213
4.92M
            self, qmfInDataReal, qmfInDataImag, ts_io, bypassMode,
1214
4.92M
            self->qmfInputReal__FDK, self->qmfInputImag__FDK,
1215
4.92M
            (bypassMode) ? numInputChannels : self->numInputChannels);
1216
4.92M
        break;
1217
1.82M
      case INPUTMODE_TIME:
1218
1.82M
        self->bShareDelayWithSBR = 0;
1219
1.82M
        SpatialDecQMFAnalysis(
1220
1.82M
            self, inData, ts_io, bypassMode, self->qmfInputReal__FDK,
1221
1.82M
            self->qmfInputImag__FDK,
1222
1.82M
            (bypassMode) ? numInputChannels : self->numInputChannels);
1223
1.82M
        break;
1224
0
      default:
1225
0
        break;
1226
6.75M
    }
1227
1228
6.75M
    if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC) &&
1229
6.75M
        self->residualCoding) {
1230
1.14M
      int offset;
1231
1.14M
      ch = 1;
1232
1233
1.14M
      offset = self->pQmfDomain->globalConf.nBandsSynthesis *
1234
1.14M
               self->pQmfDomain->globalConf.nQmfTimeSlots;
1235
1236
1.14M
      {
1237
1.14M
        const PCM_MPS *inSamples =
1238
1.14M
            &inData[ts * self->pQmfDomain->globalConf.nBandsAnalysis];
1239
1240
1.14M
        CalculateSpaceAnalysisQmf(
1241
1.14M
            &self->pQmfDomain->QmfDomainIn[ch].fb, inSamples + (ch * offset),
1242
1.14M
            self->qmfResidualReal__FDK[0][0], self->qmfResidualImag__FDK[0][0]);
1243
1244
1.14M
        if (!isTwoChMode(self->upmixType) && !bypassMode) {
1245
1.14M
          int i;
1246
1.14M
          FIXP_DBL *RESTRICT self_qmfResidualReal__FDK_0_0 =
1247
1.14M
              &self->qmfResidualReal__FDK[0][0][0];
1248
1.14M
          FIXP_DBL *RESTRICT self_qmfResidualImag__FDK_0_0 =
1249
1.14M
              &self->qmfResidualImag__FDK[0][0][0];
1250
1251
1.14M
          if ((self->pQmfDomain->globalConf.nBandsAnalysis == 24) &&
1252
1.14M
              !(self->stereoConfigIndex == 3)) {
1253
3.06M
            for (i = 0; i < self->qmfBands; i++) {
1254
3.01M
              self_qmfResidualReal__FDK_0_0[i] =
1255
3.01M
                  fMult(scaleValueSaturate(self_qmfResidualReal__FDK_0_0[i],
1256
3.01M
                                           1 + self->sacInDataHeadroom - (1)),
1257
3.01M
                        self->clipProtectGain__FDK);
1258
3.01M
              self_qmfResidualImag__FDK_0_0[i] =
1259
3.01M
                  fMult(scaleValueSaturate(self_qmfResidualImag__FDK_0_0[i],
1260
3.01M
                                           1 + self->sacInDataHeadroom - (1)),
1261
3.01M
                        self->clipProtectGain__FDK);
1262
3.01M
            }
1263
1.09M
          } else {
1264
22.3M
            for (i = 0; i < self->qmfBands; i++) {
1265
21.2M
              self_qmfResidualReal__FDK_0_0[i] =
1266
21.2M
                  fMult(scaleValueSaturate(self_qmfResidualReal__FDK_0_0[i],
1267
21.2M
                                           self->sacInDataHeadroom - (1)),
1268
21.2M
                        self->clipProtectGain__FDK);
1269
21.2M
              self_qmfResidualImag__FDK_0_0[i] =
1270
21.2M
                  fMult(scaleValueSaturate(self_qmfResidualImag__FDK_0_0[i],
1271
21.2M
                                           self->sacInDataHeadroom - (1)),
1272
21.2M
                        self->clipProtectGain__FDK);
1273
21.2M
            }
1274
1.09M
          }
1275
1.14M
        }
1276
1.14M
      }
1277
1.14M
    }
1278
1279
6.75M
    SpatialDecHybridAnalysis(
1280
6.75M
        self, /* input: qmfInput(Real/Imag), qmfResidual(Real/Imag) */
1281
6.75M
        self->qmfInputReal__FDK, self->qmfInputImag__FDK,
1282
6.75M
        self->hybInputReal__FDK, self->hybInputImag__FDK, ts, numInputChannels);
1283
1284
6.75M
    if (bypassMode) {
1285
0
      SpatialDecApplyBypass(
1286
0
          self, self->hybInputReal__FDK, /* input: hybInput(Real/Imag) */
1287
0
          self->hybInputImag__FDK,
1288
0
          self->hybOutputRealDry__FDK, /* output: hybOutput(Real/Imag)Dry */
1289
0
          self->hybOutputImagDry__FDK, numInputChannels);
1290
0
    } else /* !bypassMode */
1291
6.75M
    {
1292
6.75M
      FIXP_DBL *pxReal[MAX_NUM_XCHANNELS] = {NULL};
1293
6.75M
      FIXP_DBL *pxImag[MAX_NUM_XCHANNELS] = {NULL};
1294
1295
6.75M
      SpatialDecCreateX(self,
1296
6.75M
                        self->hybInputReal__FDK, /* input: hybInput(Real/Imag),
1297
                                                    hybResidual(Real/Imag) */
1298
6.75M
                        self->hybInputImag__FDK, pxReal, pxImag);
1299
1300
6.75M
      {
1301
6.75M
        SpatialDecApplyM1_CreateW_Mode212(
1302
6.75M
            self, frame, pxReal, pxImag,
1303
6.75M
            self->wReal__FDK, /* output: w(Real/Imag) */
1304
6.75M
            self->wImag__FDK);
1305
6.75M
      }
1306
6.75M
      if (err != MPS_OK) goto bail;
1307
1308
6.75M
      int applyM2Config = APPLY_M2_NONE;
1309
1310
6.75M
      applyM2Config = APPLY_M2;
1311
6.75M
      if ((self->pConfigCurrent->syntaxFlags &
1312
6.75M
           (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) &&
1313
6.75M
          (self->tempShapeConfig != 1) && (self->tempShapeConfig != 2)) {
1314
894k
        if (self->phaseCoding == 3)
1315
78.8k
          applyM2Config = APPLY_M2_MODE212_Res_PhaseCoding;
1316
815k
        else
1317
815k
          applyM2Config = APPLY_M2_MODE212;
1318
894k
      }
1319
1320
6.75M
      switch (applyM2Config) {
1321
815k
        case APPLY_M2_MODE212: {
1322
815k
          err = SpatialDecApplyM2_Mode212(
1323
815k
              self, ps, alpha, self->wReal__FDK, self->wImag__FDK,
1324
815k
              self->hybOutputRealDry__FDK, self->hybOutputImagDry__FDK);
1325
815k
        } break;
1326
78.8k
        case APPLY_M2_MODE212_Res_PhaseCoding:
1327
78.8k
          err = SpatialDecApplyM2_Mode212_ResidualsPlusPhaseCoding(
1328
78.8k
              self, ps, alpha, self->wReal__FDK, self->wImag__FDK,
1329
78.8k
              self->hybOutputRealDry__FDK, self->hybOutputImagDry__FDK);
1330
78.8k
          break;
1331
5.85M
        case APPLY_M2:
1332
5.85M
          err = SpatialDecApplyM2(
1333
5.85M
              self, ps, alpha, self->wReal__FDK, self->wImag__FDK,
1334
5.85M
              self->hybOutputRealDry__FDK, self->hybOutputImagDry__FDK,
1335
5.85M
              self->hybOutputRealWet__FDK, self->hybOutputImagWet__FDK);
1336
5.85M
          break;
1337
0
        default:
1338
0
          err = MPS_APPLY_M2_ERROR;
1339
0
          goto bail;
1340
6.75M
      }
1341
1342
6.75M
      if (err != MPS_OK) goto bail;
1343
1344
6.75M
      if ((self->tempShapeConfig == 2) && (!isTwoChMode(self->upmixType))) {
1345
4.76M
        SpatialDecReshapeBBEnv(self, frame,
1346
4.76M
                               ts); /* input: reshapeBBEnvState,
1347
                                       hybOutput(Real/Imag)(Dry/Wet),
1348
                                       hybInput(Real/Imag) */
1349
4.76M
      }                             /* output: hybOutput(Real/Imag)Dry */
1350
1351
      /* Merge parts of the dry and wet QMF buffers. */
1352
6.75M
      if ((self->tempShapeConfig == 1) && (!isTwoChMode(self->upmixType))) {
1353
2.62M
        for (ch = 0; ch < self->numOutputChannels; ch++) {
1354
22.7M
          for (hyb = 0; hyb < self->tp_hybBandBorder; hyb++) {
1355
21.0M
            self->hybOutputRealDry__FDK[ch][hyb] =
1356
21.0M
                fAddSaturate(self->hybOutputRealDry__FDK[ch][hyb],
1357
21.0M
                             self->hybOutputRealWet__FDK[ch][hyb]);
1358
21.0M
            self->hybOutputImagDry__FDK[ch][hyb] =
1359
21.0M
                fAddSaturate(self->hybOutputImagDry__FDK[ch][hyb],
1360
21.0M
                             self->hybOutputImagWet__FDK[ch][hyb]);
1361
21.0M
          } /* loop hyb */
1362
1.75M
        }   /* loop ch */
1363
875k
        err = subbandTPApply(
1364
875k
            self, frame); /* input: hStpDec, hybOutput(Real/Imag)Dry/Wet */
1365
                          /* output: hStpDec, hybOutput(Real/Imag)Dry */
1366
875k
        if (err != MPS_OK) goto bail;
1367
875k
      } /* (self->tempShapeConfig == 1) */
1368
5.87M
      else {
1369
        /* The wet signal is added to the dry signal in applyM2 if GES and STP
1370
         * are disabled */
1371
5.87M
        if ((self->tempShapeConfig == 1) || (self->tempShapeConfig == 2)) {
1372
4.76M
          int nHybBands;
1373
4.76M
          nHybBands = self->hybridBands;
1374
1375
14.2M
          for (ch = 0; ch < self->numOutputChannels; ch++) {
1376
9.52M
            FIXP_DBL *RESTRICT pRealDry = self->hybOutputRealDry__FDK[ch];
1377
9.52M
            FIXP_DBL *RESTRICT pImagDry = self->hybOutputImagDry__FDK[ch];
1378
9.52M
            FIXP_DBL *RESTRICT pRealWet = self->hybOutputRealWet__FDK[ch];
1379
9.52M
            FIXP_DBL *RESTRICT pImagWet = self->hybOutputImagWet__FDK[ch];
1380
679M
            for (hyb = 0; hyb < nHybBands; hyb++) {
1381
670M
              pRealDry[hyb] = fAddSaturate(pRealDry[hyb], pRealWet[hyb]);
1382
670M
              pImagDry[hyb] = fAddSaturate(pImagDry[hyb], pImagWet[hyb]);
1383
670M
            } /* loop hyb */
1384
9.52M
            for (; hyb < self->hybridBands; hyb++) {
1385
0
              pRealDry[hyb] = fAddSaturate(pRealDry[hyb], pRealWet[hyb]);
1386
0
            } /* loop hyb */
1387
9.52M
          }   /* loop ch */
1388
4.76M
        } /* ( self->tempShapeConfig == 1 ) || ( self->tempShapeConfig == 2 ) */
1389
5.87M
      }   /* !self->tempShapeConfig == 1 */
1390
6.75M
    }     /*  !bypassMode */
1391
1392
6.75M
    if ((self->phaseCoding == 1) && (bypassMode == 0)) {
1393
      /* only if bsPhaseCoding == 1 and bsResidualCoding == 0 */
1394
1395
443k
      SpatialDecApplyPhase(
1396
443k
          self, alpha, (ts == currSlot) /* signal the last slot of the set */
1397
443k
      );
1398
443k
    }
1399
1400
    /*
1401
     * Synthesis Filtering
1402
     */
1403
1404
6.75M
    err = SpatialDecSynthesis(
1405
6.75M
        self, ts_io,
1406
6.75M
        self->hybOutputRealDry__FDK, /* input: hybOutput(Real/Imag)Dry */
1407
6.75M
        self->hybOutputImagDry__FDK, self->timeOut__FDK, /* output: timeOut */
1408
6.75M
        numInputChannels, mapDescr);
1409
1410
6.75M
    if (err != MPS_OK) goto bail;
1411
1412
    /*
1413
     * Update parameter buffer
1414
     */
1415
6.75M
    if (ts == currSlot) {
1416
260k
      SpatialDecBufferMatrices(self); /* input: M(1/2)param(Real/Imag) */
1417
                                      /* output: M(1/2)param(Real/Imag)Prev */
1418
1419
260k
      prevSlot = currSlot;
1420
260k
      ps++;
1421
260k
    } /* if (ts==currSlot) */
1422
1423
6.75M
  } /* ts loop */
1424
1425
  /*
1426
   * Save parameter states
1427
   */
1428
222k
  self->prevTimeSlot = prevSlot;
1429
222k
  self->curTimeSlot = ts;
1430
222k
  self->curPs = ps;
1431
1432
222k
bail:
1433
1434
222k
  return err;
1435
222k
}
1436
1437
SACDEC_ERROR SpatialDecApplyFrame(
1438
    spatialDec *self,
1439
    SPATIAL_BS_FRAME *frame, /* parsed frame data to be applied */
1440
    SPATIALDEC_INPUT_MODE inputMode, PCM_MPS *inData, /* Time domain input  */
1441
    FIXP_DBL **qmfInDataReal,                         /* QMF domain data l/r */
1442
    FIXP_DBL **qmfInDataImag,                         /* QMF domain data l/r */
1443
    PCM_MPS *pcmOutBuf, /* MAX_OUTPUT_CHANNELS*MAX_TIME_SLOTS*NUM_QMF_BANDS] */
1444
    UINT nSamples, UINT *pControlFlags, int numInputChannels,
1445
222k
    const FDK_channelMapDescr *const mapDescr) {
1446
222k
  SACDEC_ERROR err = MPS_OK;
1447
1448
222k
  int fDecAndMapFrameData;
1449
222k
  int controlFlags;
1450
1451
222k
  FDK_ASSERT(self != NULL);
1452
222k
  FDK_ASSERT(pControlFlags != NULL);
1453
222k
  FDK_ASSERT(pcmOutBuf != NULL);
1454
222k
  FDK_ASSERT(self->sacInDataHeadroom >= (1));
1455
1456
222k
  self->errInt = err; /* Init internal error */
1457
1458
222k
  controlFlags = *pControlFlags;
1459
1460
222k
  if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC) &&
1461
222k
      (self->stereoConfigIndex > 1)) {
1462
21.6k
    numInputChannels =
1463
21.6k
        1; /* Do not count residual channel as input channel. It is handled
1464
              seperately. */
1465
21.6k
  }
1466
1467
  /* Check if input amount of channels is consistent */
1468
222k
  if (numInputChannels != self->numInputChannels) {
1469
0
    controlFlags |= MPEGS_CONCEAL;
1470
0
    if (numInputChannels > self->createParams.maxNumInputChannels) {
1471
0
      return MPS_INVALID_PARAMETER;
1472
0
    }
1473
0
  }
1474
1475
222k
  self->timeOut__FDK = pcmOutBuf;
1476
1477
  /* Determine local function control flags */
1478
222k
  fDecAndMapFrameData = frame->newBsData;
1479
1480
222k
  if (((fDecAndMapFrameData ==
1481
222k
        0) /* assures that conceal flag will not be set for blind mode */
1482
222k
       && (self->curTimeSlot + (int)nSamples / self->qmfBands >
1483
80.9k
           self->timeSlots)) ||
1484
222k
      (frame->numParameterSets ==
1485
143k
       0)) { /* New input samples but missing side info */
1486
79.1k
    fDecAndMapFrameData = 1;
1487
79.1k
    controlFlags |= MPEGS_CONCEAL;
1488
79.1k
  }
1489
1490
222k
  if ((fDecAndMapFrameData == 0) &&
1491
222k
      (frame->paramSlot[fMax(0, frame->numParameterSets - 1)] !=
1492
1.73k
           (self->timeSlots - 1) ||
1493
1.73k
       self->curTimeSlot >
1494
1.73k
           frame->paramSlot[self->curPs])) { /* Detected faulty parameter slot
1495
                                                data. */
1496
0
    fDecAndMapFrameData = 1;
1497
0
    controlFlags |= MPEGS_CONCEAL;
1498
0
  }
1499
1500
  /* Update concealment state machine */
1501
222k
  SpatialDecConcealment_UpdateState(
1502
222k
      &self->concealInfo,
1503
222k
      (controlFlags & MPEGS_CONCEAL)
1504
222k
          ? 0
1505
222k
          : 1); /* convert from conceal flag to frame ok flag */
1506
1507
222k
  if (fDecAndMapFrameData) {
1508
    /* Reset spatial framing control vars */
1509
220k
    frame->newBsData = 0;
1510
220k
    self->prevTimeSlot = -1;
1511
220k
    self->curTimeSlot = 0;
1512
220k
    self->curPs = 0;
1513
1514
220k
    if (controlFlags & MPEGS_CONCEAL) {
1515
      /* Reset frame data to avoid misconfiguration. */
1516
82.0k
      SpatialDecClearFrameData(self, frame, &self->createParams);
1517
82.0k
    }
1518
1519
220k
    {
1520
220k
      err = SpatialDecDecodeFrame(self, frame); /* input: ... */
1521
      /* output: decodeAndMapFrameDATA */
1522
220k
    }
1523
1524
220k
    if (err != MPS_OK) {
1525
      /* Rescue strategy is to apply bypass mode in order
1526
         to keep at least the downmix channels continuous. */
1527
0
      controlFlags |= MPEGS_CONCEAL;
1528
0
      if (self->errInt == MPS_OK) {
1529
        /* store internal error befor it gets overwritten */
1530
0
        self->errInt = err;
1531
0
      }
1532
0
    }
1533
220k
  }
1534
1535
222k
  err = SpatialDecApplyParameterSets(
1536
222k
      self, frame, inputMode, inData, qmfInDataReal, qmfInDataImag, nSamples,
1537
222k
      controlFlags | ((err == MPS_OK) ? 0 : MPEGS_BYPASSMODE), numInputChannels,
1538
222k
      mapDescr);
1539
222k
  if (err != MPS_OK) {
1540
0
    goto bail;
1541
0
  }
1542
1543
222k
bail:
1544
1545
222k
  *pControlFlags = controlFlags;
1546
1547
222k
  return err;
1548
222k
}