Coverage Report

Created: 2025-10-13 06:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libSACdec/src/sac_dec.cpp
Line
Count
Source
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
1.19k
    int nTimeSlots, int decoderLevel, int isBlind) {
145
1.19k
  return SpatialDecDefaultSpecificConfig(pSpatialSpecificConfig, coreCodec,
146
1.19k
                                         samplingFreq, nTimeSlots, decoderLevel,
147
1.19k
                                         isBlind, coreChannels);
148
1.19k
}
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
49.5k
    SPATIAL_SPECIFIC_CONFIG *pSsc1, SPATIAL_SPECIFIC_CONFIG *pSsc2) {
159
49.5k
  int result = MPS_OK;
160
161
  /* we assume: every bit must be equal */
162
49.5k
  if (FDKmemcmp(pSsc1, pSsc2, sizeof(SPATIAL_SPECIFIC_CONFIG)) != 0) {
163
36.9k
    result = MPS_UNEQUAL_SSC;
164
36.9k
  }
165
49.5k
  return result;
166
49.5k
}
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
77.4k
    SPATIAL_BS_FRAME *bsFrame, const SACDEC_CREATION_PARAMS *const setup) {
182
77.4k
  int i;
183
184
77.4k
  FDK_ASSERT(self != NULL);
185
77.4k
  FDK_ASSERT(bsFrame != NULL);
186
77.4k
  FDK_ASSERT(setup != NULL);
187
188
  /* do not apply shaping tools (GES or STP) */
189
232k
  for (i = 0; i < setup->maxNumOutputChannels;
190
154k
       i += 1) { /* MAX_OUTPUT_CHANNELS */
191
154k
    bsFrame->tempShapeEnableChannelSTP[i] = 0;
192
154k
    bsFrame->tempShapeEnableChannelGES[i] = 0;
193
154k
  }
194
195
77.4k
  bsFrame->TsdData->bsTsdEnable = 0;
196
197
  /* use only 1 parameter set at the end of the frame */
198
77.4k
  bsFrame->numParameterSets = 1;
199
77.4k
  bsFrame->paramSlot[0] = self->timeSlots - 1;
200
201
  /* parameter smoothing tool set to off */
202
77.4k
  bsFrame->bsSmoothMode[0] = 0;
203
77.4k
  initParameterSmoothing(self);
204
205
  /* reset residual data */
206
77.4k
  {
207
77.4k
    int resQmfBands, resTimeSlots = (1);
208
209
77.4k
    resQmfBands = setup->maxNumQmfBands;
210
211
154k
    for (i = 0; i < setup->bProcResidual
212
154k
                    ? fMin(setup->maxNumResChannels,
213
77.4k
                           setup->maxNumOttBoxes + setup->maxNumInputChannels)
214
154k
                    : 0;
215
77.4k
         i += 1) {
216
154k
      for (int j = 0; j < resTimeSlots; j += 1) {
217
5.03M
        for (int k = 0; k < resQmfBands; k += 1) {
218
4.95M
          self->qmfResidualReal__FDK[i][j][k] = FL2FXCONST_DBL(0.0f);
219
4.95M
          self->qmfResidualImag__FDK[i][j][k] = FL2FXCONST_DBL(0.0f);
220
4.95M
        }
221
77.4k
      }
222
77.4k
    }
223
77.4k
  }
224
225
77.4k
  return;
226
77.4k
}
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
23.2k
                               int stereoConfigIndex) {
241
23.2k
  int i;
242
23.2k
  int lfSize, hfSize;
243
23.2k
  spatialDec *self = NULL;
244
23.2k
  SACDEC_CREATION_PARAMS setup;
245
246
23.2k
  switch (config->decoderLevel) {
247
23.2k
    case DECODER_LEVEL_0: /* 212 maxNumOutputChannels== 2 */
248
23.2k
      setup.maxNumInputChannels = 1;
249
23.2k
      setup.maxNumOutputChannels = 2;
250
23.2k
      setup.maxNumQmfBands = 64;
251
23.2k
      setup.maxNumXChannels = 2;
252
23.2k
      setup.maxNumVChannels = 2;
253
23.2k
      setup.maxNumDecorChannels = 1;
254
23.2k
      setup.bProcResidual = 1;
255
23.2k
      setup.maxNumResidualChannels = 0;
256
23.2k
      setup.maxNumOttBoxes = 1;
257
23.2k
      setup.maxNumParams = setup.maxNumInputChannels + setup.maxNumOttBoxes;
258
23.2k
      break;
259
0
    default:
260
0
      return NULL;
261
23.2k
  }
262
263
23.2k
  setup.maxNumResChannels = 1;
264
265
23.2k
  {
266
23.2k
    switch (config->maxNumOutputChannels) {
267
0
      case OUTPUT_CHANNELS_2_0:
268
0
        setup.maxNumOutputChannels = fMin(setup.maxNumOutputChannels, 2);
269
0
        break;
270
23.2k
      case OUTPUT_CHANNELS_DEFAULT:
271
23.2k
      default:
272
23.2k
        break;
273
23.2k
    }
274
23.2k
  }
275
276
23.2k
  setup.maxNumHybridBands = SacGetHybridSubbands(setup.maxNumQmfBands);
277
278
23.2k
  switch (config->decoderMode) {
279
23.2k
    case EXT_HQ_ONLY:
280
23.2k
      setup.maxNumCmplxQmfBands = setup.maxNumQmfBands;
281
23.2k
      setup.maxNumCmplxHybBands = setup.maxNumHybridBands;
282
23.2k
      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
23.2k
  } /* switch config->decoderMode */
289
290
23.2k
  FDK_ALLOCATE_MEMORY_1D_INT(self, 1, spatialDec, SECT_DATA_L2)
291
292
23.2k
  self->createParams = setup;
293
294
23.2k
  FDK_ALLOCATE_MEMORY_1D(self->param2hyb, MAX_PARAMETER_BANDS + 1, int)
295
296
23.2k
  FDK_ALLOCATE_MEMORY_1D(self->numOttBands, setup.maxNumOttBoxes, int)
297
298
  /* allocate arrays */
299
300
23.2k
  FDK_ALLOCATE_MEMORY_1D(self->smgTime, MAX_PARAMETER_SETS, int)
301
23.2k
  FDK_ALLOCATE_MEMORY_2D(self->smgData, MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS,
302
23.2k
                         UCHAR)
303
304
23.2k
  FDK_ALLOCATE_MEMORY_3D(self->ottCLD__FDK, setup.maxNumOttBoxes,
305
23.2k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
306
23.2k
  FDK_ALLOCATE_MEMORY_3D(self->ottICC__FDK, setup.maxNumOttBoxes,
307
23.2k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
308
23.2k
  FDK_ALLOCATE_MEMORY_3D(self->ottIPD__FDK, setup.maxNumOttBoxes,
309
23.2k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
310
311
  /* Last parameters from prev frame */
312
23.2k
  FDK_ALLOCATE_MEMORY_2D(self->ottCLDidxPrev, setup.maxNumOttBoxes,
313
23.2k
                         MAX_PARAMETER_BANDS, SCHAR)
314
23.2k
  FDK_ALLOCATE_MEMORY_2D(self->ottICCidxPrev, setup.maxNumOttBoxes,
315
23.2k
                         MAX_PARAMETER_BANDS, SCHAR)
316
23.2k
  FDK_ALLOCATE_MEMORY_3D(self->ottICCdiffidx, setup.maxNumOttBoxes,
317
23.2k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
318
23.2k
  FDK_ALLOCATE_MEMORY_2D(self->ottIPDidxPrev, setup.maxNumOttBoxes,
319
23.2k
                         MAX_PARAMETER_BANDS, SCHAR)
320
23.2k
  FDK_ALLOCATE_MEMORY_2D(self->arbdmxGainIdxPrev, setup.maxNumInputChannels,
321
23.2k
                         MAX_PARAMETER_BANDS, SCHAR)
322
23.2k
  FDK_ALLOCATE_MEMORY_2D(self->cmpOttCLDidxPrev, setup.maxNumOttBoxes,
323
23.2k
                         MAX_PARAMETER_BANDS, SCHAR)
324
23.2k
  FDK_ALLOCATE_MEMORY_2D(self->cmpOttICCidxPrev, setup.maxNumOttBoxes,
325
23.2k
                         MAX_PARAMETER_BANDS, SCHAR)
326
23.2k
  FDK_ALLOCATE_MEMORY_3D(self->outIdxData, setup.maxNumOttBoxes,
327
23.2k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
328
329
23.2k
  FDK_ALLOCATE_MEMORY_3D(self->arbdmxGain__FDK, setup.maxNumInputChannels,
330
23.2k
                         MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR)
331
23.2k
  FDK_ALLOCATE_MEMORY_1D(self->arbdmxAlpha__FDK, setup.maxNumInputChannels,
332
23.2k
                         FIXP_DBL)
333
23.2k
  FDK_ALLOCATE_MEMORY_1D(self->arbdmxAlphaPrev__FDK, setup.maxNumInputChannels,
334
23.2k
                         FIXP_DBL)
335
23.2k
  FDK_ALLOCATE_MEMORY_2D(self->cmpArbdmxGainIdxPrev, setup.maxNumInputChannels,
336
23.2k
                         MAX_PARAMETER_BANDS, SCHAR)
337
338
23.2k
  FDK_ALLOCATE_MEMORY_2D(self->cmpOttIPDidxPrev, setup.maxNumOttBoxes,
339
23.2k
                         MAX_PARAMETER_BANDS, SCHAR)
340
341
23.2k
  FDK_ALLOCATE_MEMORY_3D_INT(self->M2Real__FDK, setup.maxNumOutputChannels,
342
23.2k
                             setup.maxNumVChannels, MAX_PARAMETER_BANDS,
343
23.2k
                             FIXP_DBL, SECT_DATA_L2)
344
23.2k
  FDK_ALLOCATE_MEMORY_3D(self->M2Imag__FDK, setup.maxNumOutputChannels,
345
23.2k
                         setup.maxNumVChannels, MAX_PARAMETER_BANDS, FIXP_DBL)
346
347
23.2k
  FDK_ALLOCATE_MEMORY_3D_INT(self->M2RealPrev__FDK, setup.maxNumOutputChannels,
348
23.2k
                             setup.maxNumVChannels, MAX_PARAMETER_BANDS,
349
23.2k
                             FIXP_DBL, SECT_DATA_L2)
350
23.2k
  FDK_ALLOCATE_MEMORY_3D(self->M2ImagPrev__FDK, setup.maxNumOutputChannels,
351
23.2k
                         setup.maxNumVChannels, MAX_PARAMETER_BANDS, FIXP_DBL)
352
353
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(
354
23.2k
      self->qmfInputReal__FDK, setup.maxNumInputChannels, setup.maxNumQmfBands,
355
23.2k
      FIXP_DBL, SECT_DATA_L2)
356
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(
357
23.2k
      self->qmfInputImag__FDK, setup.maxNumInputChannels,
358
23.2k
      setup.maxNumCmplxQmfBands, FIXP_DBL, SECT_DATA_L2)
359
360
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybInputReal__FDK, setup.maxNumInputChannels,
361
23.2k
                             setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2)
362
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybInputImag__FDK, setup.maxNumInputChannels,
363
23.2k
                             setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2)
364
365
23.2k
  if (setup.bProcResidual) {
366
23.2k
    FDK_ALLOCATE_MEMORY_1D(self->qmfResidualReal__FDK, setup.maxNumResChannels,
367
23.2k
                           FIXP_DBL **)
368
23.2k
    FDK_ALLOCATE_MEMORY_1D(self->qmfResidualImag__FDK, setup.maxNumResChannels,
369
23.2k
                           FIXP_DBL **)
370
371
23.2k
    FDK_ALLOCATE_MEMORY_1D(self->hybResidualReal__FDK, setup.maxNumResChannels,
372
23.2k
                           FIXP_DBL *)
373
23.2k
    FDK_ALLOCATE_MEMORY_1D(self->hybResidualImag__FDK, setup.maxNumResChannels,
374
23.2k
                           FIXP_DBL *)
375
376
46.4k
    for (i = 0; i < setup.maxNumResChannels; i++) {
377
23.2k
      int resQmfBands = (config->decoderMode == EXT_LP_ONLY)
378
23.2k
                            ? PC_NUM_BANDS
379
23.2k
                            : setup.maxNumQmfBands;
380
23.2k
      int resHybBands = (config->decoderMode == EXT_LP_ONLY)
381
23.2k
                            ? PC_NUM_HYB_BANDS
382
23.2k
                            : setup.maxNumHybridBands;
383
      /* Alignment is needed for USAC residuals because QMF analysis directly
384
       * writes to this buffer. */
385
23.2k
      FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(self->qmfResidualReal__FDK[i], (1),
386
23.2k
                                         resQmfBands, FIXP_DBL, SECT_DATA_L1)
387
23.2k
      FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(self->qmfResidualImag__FDK[i], (1),
388
23.2k
                                         resQmfBands, FIXP_DBL, SECT_DATA_L1)
389
390
23.2k
      FDK_ALLOCATE_MEMORY_1D(self->hybResidualReal__FDK[i],
391
23.2k
                             setup.maxNumHybridBands, FIXP_DBL)
392
23.2k
      FDK_ALLOCATE_MEMORY_1D(self->hybResidualImag__FDK[i], resHybBands,
393
23.2k
                             FIXP_DBL)
394
23.2k
    }
395
23.2k
  } /* if (setup.bProcResidual) */
396
397
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->wReal__FDK, setup.maxNumVChannels,
398
23.2k
                             setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2)
399
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->wImag__FDK, setup.maxNumVChannels,
400
23.2k
                             setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2)
401
402
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputRealDry__FDK,
403
23.2k
                             setup.maxNumOutputChannels,
404
23.2k
                             setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2)
405
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputImagDry__FDK,
406
23.2k
                             setup.maxNumOutputChannels,
407
23.2k
                             setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2)
408
409
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputRealWet__FDK,
410
23.2k
                             setup.maxNumOutputChannels,
411
23.2k
                             setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2)
412
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputImagWet__FDK,
413
23.2k
                             setup.maxNumOutputChannels,
414
23.2k
                             setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2)
415
416
23.2k
  FDK_ALLOCATE_MEMORY_1D(self->hybridSynthesis, setup.maxNumOutputChannels,
417
23.2k
                         FDK_SYN_HYB_FILTER)
418
419
23.2k
  FDK_ALLOCATE_MEMORY_1D(
420
23.2k
      self->hybridAnalysis,
421
23.2k
      setup.bProcResidual ? setup.maxNumInputChannels + setup.maxNumResChannels
422
23.2k
                          : setup.maxNumInputChannels,
423
23.2k
      FDK_ANA_HYB_FILTER)
424
425
23.2k
  lfSize = 2 * BUFFER_LEN_LF * MAX_QMF_BANDS_TO_HYBRID;
426
23.2k
  {
427
23.2k
    hfSize =
428
23.2k
        BUFFER_LEN_HF * ((setup.maxNumQmfBands - MAX_QMF_BANDS_TO_HYBRID) +
429
23.2k
                         (setup.maxNumCmplxQmfBands - MAX_QMF_BANDS_TO_HYBRID));
430
23.2k
  }
431
432
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->pHybridAnaStatesLFdmx,
433
23.2k
                             setup.maxNumInputChannels, lfSize, FIXP_DBL,
434
23.2k
                             SECT_DATA_L2) {
435
23.2k
    FDK_ALLOCATE_MEMORY_2D(self->pHybridAnaStatesHFdmx,
436
23.2k
                           setup.maxNumInputChannels, hfSize, FIXP_DBL)
437
23.2k
  }
438
439
46.4k
  for (i = 0; i < setup.maxNumInputChannels; i++) {
440
23.2k
    FIXP_DBL *pHybridAnaStatesHFdmx;
441
442
23.2k
    pHybridAnaStatesHFdmx = self->pHybridAnaStatesHFdmx[i];
443
444
23.2k
    FDKhybridAnalysisOpen(&self->hybridAnalysis[i],
445
23.2k
                          self->pHybridAnaStatesLFdmx[i],
446
23.2k
                          lfSize * sizeof(FIXP_DBL), pHybridAnaStatesHFdmx,
447
23.2k
                          hfSize * sizeof(FIXP_DBL));
448
23.2k
  }
449
23.2k
  if (setup.bProcResidual) {
450
23.2k
    lfSize = 2 * BUFFER_LEN_LF * MAX_QMF_BANDS_TO_HYBRID;
451
23.2k
    hfSize = BUFFER_LEN_HF *
452
23.2k
             ((((config->decoderMode == EXT_LP_ONLY) ? PC_NUM_BANDS
453
23.2k
                                                     : setup.maxNumQmfBands) -
454
23.2k
               MAX_QMF_BANDS_TO_HYBRID) +
455
23.2k
              (setup.maxNumCmplxQmfBands - MAX_QMF_BANDS_TO_HYBRID));
456
457
23.2k
    FDK_ALLOCATE_MEMORY_2D_INT(self->pHybridAnaStatesLFres,
458
23.2k
                               setup.maxNumResChannels, lfSize, FIXP_DBL,
459
23.2k
                               SECT_DATA_L2)
460
23.2k
    FDK_ALLOCATE_MEMORY_2D(self->pHybridAnaStatesHFres, setup.maxNumResChannels,
461
23.2k
                           hfSize, FIXP_DBL)
462
463
23.2k
    for (i = setup.maxNumInputChannels;
464
46.4k
         i < (setup.maxNumInputChannels + setup.maxNumResChannels); i++) {
465
23.2k
      FDKhybridAnalysisOpen(
466
23.2k
          &self->hybridAnalysis[i],
467
23.2k
          self->pHybridAnaStatesLFres[i - setup.maxNumInputChannels],
468
23.2k
          lfSize * sizeof(FIXP_DBL),
469
23.2k
          self->pHybridAnaStatesHFres[i - setup.maxNumInputChannels],
470
23.2k
          hfSize * sizeof(FIXP_DBL));
471
23.2k
    }
472
23.2k
  }
473
474
23.2k
  FDK_ALLOCATE_MEMORY_1D(self->smoothState, 1, SMOOTHING_STATE)
475
23.2k
  FDK_ALLOCATE_MEMORY_1D(self->reshapeBBEnvState, 1, RESHAPE_BBENV_STATE)
476
477
23.2k
  FDK_ALLOCATE_MEMORY_1D(self->apDecor, setup.maxNumDecorChannels, DECORR_DEC)
478
23.2k
  FDK_ALLOCATE_MEMORY_2D_INT(self->pDecorBufferCplx, setup.maxNumDecorChannels,
479
23.2k
                             (2 * ((825) + (373))), FIXP_DBL, SECT_DATA_L2)
480
481
46.4k
  for (i = 0; i < setup.maxNumDecorChannels; i++) {
482
23.2k
    if (FDKdecorrelateOpen(&self->apDecor[i], self->pDecorBufferCplx[i],
483
23.2k
                           (2 * ((825) + (373))))) {
484
0
      goto bail;
485
0
    }
486
23.2k
  }
487
488
23.2k
  if (subbandTPCreate(&self->hStpDec) != MPS_OK) {
489
0
    goto bail;
490
0
  }
491
492
  /* save general decoder configuration */
493
23.2k
  self->decoderLevel = config->decoderLevel;
494
23.2k
  self->decoderMode = config->decoderMode;
495
23.2k
  self->binauralMode = config->binauralMode;
496
497
  /* preinitialize configuration */
498
23.2k
  self->partiallyComplex = (config->decoderMode != EXT_HQ_ONLY) ? 1 : 0;
499
500
  /* Set to default state */
501
23.2k
  SpatialDecConcealment_Init(&self->concealInfo, MPEGS_CONCEAL_RESET_ALL);
502
503
  /* Everything is fine so return the handle */
504
23.2k
  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
23.2k
}
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
66.7k
                         const AUDIO_OBJECT_TYPE coreAot) {
529
66.7k
  UPMIXTYPE nUpmixType;
530
531
66.7k
  FDK_ASSERT(self != NULL);
532
66.7k
  FDK_ASSERT(pUserParams != NULL);
533
534
66.7k
  nUpmixType = (UPMIXTYPE)upmixType;
535
536
66.7k
  switch (nUpmixType) {
537
0
    case UPMIXTYPE_BYPASS: /* UPMIX_TYPE_BYPASS */
538
0
      break;
539
66.7k
    case UPMIXTYPE_NORMAL: /* UPMIX_TYPE_NORMAL */
540
66.7k
      break;
541
0
    default:
542
0
      return 0; /* unsupported upmixType */
543
66.7k
  }
544
545
66.7k
  return 1; /* upmixType supported */
546
66.7k
}
547
548
static SACDEC_ERROR CheckLevelTreeUpmixType(
549
    const SACDEC_CREATION_PARAMS *const pCreateParams,
550
    const SPATIAL_SPECIFIC_CONFIG *const pSsc, const int decoderLevel,
551
66.7k
    const UPMIXTYPE upmixType) {
552
66.7k
  SACDEC_ERROR err = MPS_OK;
553
66.7k
  int nOutputChannels, treeConfig;
554
555
66.7k
  FDK_ASSERT(pCreateParams != NULL);
556
66.7k
  FDK_ASSERT(pSsc != NULL);
557
558
66.7k
  treeConfig = pSsc->treeConfig;
559
560
66.7k
  switch (decoderLevel) {
561
66.7k
    case 0: {
562
66.7k
      if (treeConfig != SPATIALDEC_MODE_RSVD7) {
563
0
        err = MPS_INVALID_TREECONFIG;
564
0
        goto bail;
565
0
      }
566
66.7k
      break;
567
66.7k
    }
568
66.7k
    default:
569
0
      err = MPS_INVALID_PARAMETER /* MPS_UNIMPLEMENTED */;
570
0
      goto bail;
571
66.7k
  }
572
573
66.7k
  switch (upmixType) {
574
0
    case UPMIXTYPE_BYPASS:
575
0
      nOutputChannels = pSsc->nInputChannels;
576
0
      break;
577
66.7k
    default:
578
66.7k
      nOutputChannels = pSsc->nOutputChannels;
579
66.7k
      break;
580
66.7k
  }
581
582
  /* Is sufficient memory allocated. */
583
66.7k
  if ((pSsc->nInputChannels > pCreateParams->maxNumInputChannels) ||
584
66.7k
      (nOutputChannels > pCreateParams->maxNumOutputChannels) ||
585
66.7k
      (pSsc->nOttBoxes > pCreateParams->maxNumOttBoxes)) {
586
0
    err = MPS_INVALID_PARAMETER;
587
0
  }
588
589
66.7k
bail:
590
66.7k
  return err;
591
66.7k
}
592
593
60.6k
void SpatialDecInitParserContext(spatialDec *self) {
594
60.6k
  int i, j;
595
596
121k
  for (i = 0; i < self->createParams.maxNumOttBoxes; i += 1) {
597
1.75M
    for (j = 0; j < MAX_PARAMETER_BANDS; j++) {
598
1.69M
      self->ottCLDidxPrev[i][j] = 0;
599
1.69M
      self->ottICCidxPrev[i][j] = 0;
600
1.69M
      self->cmpOttCLDidxPrev[i][j] = 0;
601
1.69M
      self->cmpOttICCidxPrev[i][j] = 0;
602
1.69M
    }
603
60.6k
  }
604
121k
  for (i = 0; i < self->createParams.maxNumInputChannels; i++) {
605
1.75M
    for (j = 0; j < MAX_PARAMETER_BANDS; j++) {
606
1.69M
      self->arbdmxGainIdxPrev[i][j] = 0;
607
1.69M
      self->cmpArbdmxGainIdxPrev[i][j] = 0;
608
1.69M
    }
609
60.6k
  }
610
60.6k
}
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
66.7k
                                SPATIALDEC_PARAM *pUserParams, UINT initFlags) {
629
66.7k
  SACDEC_ERROR err = MPS_OK;
630
66.7k
  int nCh, i, j, k;
631
66.7k
  int maxQmfBands;
632
66.7k
  int bypassMode = 0;
633
634
66.7k
  self->useFDreverb = 0;
635
636
  /* check configuration parameter */
637
66.7k
  if (!isValidConfig(self, upmixType, pUserParams,
638
66.7k
                     pSpatialSpecificConfig->coreCodec)) {
639
0
    return MPS_INVALID_PARAMETER;
640
0
  }
641
642
  /* check tree configuration */
643
66.7k
  err = CheckLevelTreeUpmixType(&self->createParams, pSpatialSpecificConfig,
644
66.7k
                                self->decoderLevel, (UPMIXTYPE)upmixType);
645
66.7k
  if (err != MPS_OK) {
646
0
    goto bail;
647
0
  }
648
649
  /* Store and update instance after all checks passed successfully: */
650
66.7k
  self->upmixType = (UPMIXTYPE)upmixType;
651
652
66.7k
  if (initFlags & MPEGS_INIT_PARAMS_ERROR_CONCEALMENT) { /* At least one error
653
                                                            concealment
654
                                                            parameter changed */
655
14.0k
    err = SpatialDecConcealment_SetParam(
656
14.0k
        &self->concealInfo, SAC_DEC_CONCEAL_METHOD, pUserParams->concealMethod);
657
14.0k
    if (err != MPS_OK) {
658
0
      goto bail;
659
0
    }
660
14.0k
    err = SpatialDecConcealment_SetParam(&self->concealInfo,
661
14.0k
                                         SAC_DEC_CONCEAL_NUM_KEEP_FRAMES,
662
14.0k
                                         pUserParams->concealNumKeepFrames);
663
14.0k
    if (err != MPS_OK) {
664
0
      goto bail;
665
0
    }
666
14.0k
    err = SpatialDecConcealment_SetParam(
667
14.0k
        &self->concealInfo, SAC_DEC_CONCEAL_FADE_OUT_SLOPE_LENGTH,
668
14.0k
        pUserParams->concealFadeOutSlopeLength);
669
14.0k
    if (err != MPS_OK) {
670
0
      goto bail;
671
0
    }
672
14.0k
    err = SpatialDecConcealment_SetParam(&self->concealInfo,
673
14.0k
                                         SAC_DEC_CONCEAL_FADE_IN_SLOPE_LENGTH,
674
14.0k
                                         pUserParams->concealFadeInSlopeLength);
675
14.0k
    if (err != MPS_OK) {
676
0
      goto bail;
677
0
    }
678
14.0k
    err = SpatialDecConcealment_SetParam(&self->concealInfo,
679
14.0k
                                         SAC_DEC_CONCEAL_NUM_RELEASE_FRAMES,
680
14.0k
                                         pUserParams->concealNumReleaseFrames);
681
14.0k
    if (err != MPS_OK) {
682
0
      goto bail;
683
0
    }
684
14.0k
  }
685
686
66.7k
  if (initFlags &
687
66.7k
      MPEGS_INIT_STATES_ERROR_CONCEALMENT) { /* Set to default state */
688
14.0k
    SpatialDecConcealment_Init(&self->concealInfo, MPEGS_CONCEAL_RESET_STATE);
689
14.0k
  }
690
691
  /* determine bypass mode */
692
66.7k
  bypassMode |= pUserParams->bypassMode;
693
66.7k
  bypassMode |= ((self->upmixType == UPMIXTYPE_BYPASS) ? 1 : 0);
694
695
  /* static decoder scale depends on number of qmf bands */
696
66.7k
  switch (nQmfBands) {
697
1.52k
    case 16:
698
3.86k
    case 24:
699
39.3k
    case 32:
700
39.3k
      self->staticDecScale = 21;
701
39.3k
      break;
702
27.4k
    case 64:
703
27.4k
      self->staticDecScale = 22;
704
27.4k
      break;
705
0
    default:
706
0
      return MPS_INVALID_PARAMETER;
707
66.7k
  }
708
709
66.7k
  self->numParameterSetsPrev = 1;
710
711
66.7k
  self->qmfBands = nQmfBands;
712
  /* self->hybridBands will be updated in SpatialDecDecodeHeader() below. */
713
714
66.7k
  self->bShareDelayWithSBR = 0;
715
716
66.7k
  err = SpatialDecDecodeHeader(self, pSpatialSpecificConfig);
717
66.7k
  if (err != MPS_OK) {
718
1.20k
    goto bail;
719
1.20k
  }
720
721
65.5k
  self->stereoConfigIndex = pSpatialSpecificConfig->stereoConfigIndex;
722
723
65.5k
  if (initFlags & MPEGS_INIT_STATES_ANA_QMF_FILTER) {
724
12.8k
    self->qmfInputDelayBufPos = 0;
725
12.8k
    self->pc_filterdelay = 1; /* Division by 0 not possible */
726
12.8k
  }
727
728
65.5k
  maxQmfBands = self->qmfBands;
729
730
  /* init residual decoder */
731
732
  /* init tonality smoothing */
733
65.5k
  if (initFlags & MPEGS_INIT_STATES_PARAM) {
734
21.5k
    initParameterSmoothing(self);
735
21.5k
  }
736
737
  /* init GES */
738
65.5k
  initBBEnv(self, (initFlags & MPEGS_INIT_STATES_GES) ? 1 : 0);
739
740
  /* Clip protection is applied only for normal processing. */
741
65.5k
  if (!isTwoChMode(self->upmixType) && !bypassMode) {
742
65.5k
    self->staticDecScale += self->clipProtectGainSF__FDK;
743
65.5k
  }
744
745
65.5k
  {
746
65.5k
    UINT flags = 0;
747
65.5k
    INT initStatesFlag = (initFlags & MPEGS_INIT_STATES_ANA_QMF_FILTER) ? 1 : 0;
748
65.5k
    INT useLdFilter =
749
65.5k
        (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) ? 1 : 0;
750
751
65.5k
    flags = self->pQmfDomain->globalConf.flags_requested;
752
65.5k
    flags &= (~(UINT)QMF_FLAG_LP);
753
754
65.5k
    if (initStatesFlag)
755
12.8k
      flags &= ~QMF_FLAG_KEEP_STATES;
756
52.7k
    else
757
52.7k
      flags |= QMF_FLAG_KEEP_STATES;
758
759
65.5k
    if (useLdFilter)
760
33.5k
      flags |= QMF_FLAG_MPSLDFB;
761
32.0k
    else
762
32.0k
      flags &= ~QMF_FLAG_MPSLDFB;
763
764
65.5k
    self->pQmfDomain->globalConf.flags_requested = flags;
765
65.5k
    FDK_QmfDomain_Configure(self->pQmfDomain);
766
767
    /* output scaling */
768
196k
    for (nCh = 0; nCh < self->numOutputChannelsAT; nCh++) {
769
131k
      int outputScale = 0, outputGain_e = 0, scale = -(8) + (1);
770
131k
      FIXP_DBL outputGain_m = getChGain(self, nCh, &outputGain_e);
771
772
131k
      if (!isTwoChMode(self->upmixType) && !bypassMode) {
773
131k
        outputScale +=
774
131k
            self->clipProtectGainSF__FDK; /* consider clip protection scaling at
775
                                             synthesis qmf */
776
131k
      }
777
778
131k
      scale += outputScale;
779
780
131k
      qmfChangeOutScalefactor(&self->pQmfDomain->QmfDomainOut[nCh].fb, scale);
781
131k
      qmfChangeOutGain(&self->pQmfDomain->QmfDomainOut[nCh].fb, outputGain_m,
782
131k
                       outputGain_e);
783
131k
    }
784
65.5k
  }
785
786
196k
  for (nCh = 0; nCh < self->numOutputChannelsAT; nCh++) {
787
131k
    FDKhybridSynthesisInit(&self->hybridSynthesis[nCh], THREE_TO_TEN,
788
131k
                           self->qmfBands, maxQmfBands);
789
131k
  }
790
791
  /* for input, residual channels and arbitrary down-mix residual channels */
792
131k
  for (nCh = 0; nCh < self->createParams.maxNumInputChannels; nCh++) {
793
65.5k
    FDKhybridAnalysisInit(
794
65.5k
        &self->hybridAnalysis[nCh], THREE_TO_TEN, self->qmfBands, maxQmfBands,
795
65.5k
        (initFlags & MPEGS_INIT_STATES_ANA_HYB_FILTER) ? 1 : 0);
796
65.5k
  }
797
131k
  for (; nCh < (self->createParams.bProcResidual
798
131k
                    ? (self->createParams.maxNumInputChannels +
799
131k
                       self->createParams.maxNumResChannels)
800
131k
                    : self->createParams.maxNumInputChannels);
801
65.5k
       nCh++) {
802
65.5k
    FDKhybridAnalysisInit(&self->hybridAnalysis[nCh], THREE_TO_TEN, maxQmfBands,
803
65.5k
                          maxQmfBands, 0);
804
65.5k
  }
805
806
65.5k
  {
807
131k
    for (k = 0; k < self->numDecorSignals; k++) {
808
65.5k
      int errCode, idec;
809
65.5k
      FDK_DECORR_TYPE decorrType = DECORR_PS;
810
65.5k
      decorrType = DECORR_LD;
811
65.5k
      if (self->pConfigCurrent->syntaxFlags &
812
65.5k
          (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) {
813
32.0k
        decorrType =
814
32.0k
            ((self->treeConfig == TREE_212) && (self->decorrType == DECORR_PS))
815
32.0k
                ? DECORR_PS
816
32.0k
                : DECORR_USAC;
817
32.0k
      }
818
65.5k
      {
819
65.5k
        idec = k;
820
65.5k
        if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) {
821
33.5k
          if (self->treeConfig == TREE_212 && k == 0) {
822
33.5k
            idec = 2;
823
33.5k
          }
824
33.5k
        }
825
65.5k
      }
826
65.5k
      errCode = FDKdecorrelateInit(
827
65.5k
          &self->apDecor[k], self->hybridBands, decorrType, DUCKER_AUTOMATIC,
828
65.5k
          self->decorrConfig, idec, 0, /* self->partiallyComplex */
829
65.5k
          0, 0,                        /* isLegacyPS */
830
65.5k
          (initFlags & MPEGS_INIT_STATES_DECORRELATOR) ? 1 : 0);
831
65.5k
      if (errCode) return MPS_NOTOK;
832
65.5k
    }
833
65.5k
  } /* !self->partiallyComplex */
834
835
65.5k
  err = initM1andM2(self, (initFlags & MPEGS_INIT_STATES_M1M2) ? 1 : 0,
836
65.5k
                    (initFlags & MPEGS_INIT_CONFIG) ? 1 : 0);
837
65.5k
  if (err != MPS_OK) return err;
838
839
  /* Initialization of previous frame data */
840
65.5k
  if (initFlags & MPEGS_INIT_STATES_PARAM) {
841
43.1k
    for (i = 0; i < self->createParams.maxNumOttBoxes; i += 1) {
842
      /* reset icc diff data */
843
215k
      for (k = 0; k < MAX_PARAMETER_SETS; k += 1) {
844
5.63M
        for (j = 0; j < MAX_PARAMETER_BANDS; j += 1) {
845
5.44M
          self->ottICCdiffidx[i][k][j] = 0;
846
5.44M
        }
847
194k
      }
848
21.5k
    }
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
21.5k
    self->smoothState->prevSmgTime = smgTimeTable[2]; /* == 256 */
853
21.5k
    FDKmemclear(self->smoothState->prevSmgData,
854
21.5k
                MAX_PARAMETER_BANDS * sizeof(UCHAR));
855
21.5k
    FDKmemclear(self->smoothState->opdLeftState__FDK,
856
21.5k
                MAX_PARAMETER_BANDS * sizeof(FIXP_DBL));
857
21.5k
    FDKmemclear(self->smoothState->opdRightState__FDK,
858
21.5k
                MAX_PARAMETER_BANDS * sizeof(FIXP_DBL));
859
21.5k
  }
860
861
65.5k
  self->prevTimeSlot = -1;
862
65.5k
  self->curTimeSlot =
863
65.5k
      MAX_TIME_SLOTS + 1; /* Initialize with a invalid value to trigger
864
                             concealment if first frame has no valid data. */
865
65.5k
  self->curPs = 0;
866
867
65.5k
  subbandTPInit(self->hStpDec);
868
869
66.7k
bail:
870
66.7k
  return err;
871
65.5k
}
872
873
void SpatialDecChannelProperties(spatialDec *self,
874
                                 AUDIO_CHANNEL_TYPE channelType[],
875
                                 UCHAR channelIndices[],
876
193k
                                 const FDK_channelMapDescr *const mapDescr) {
877
193k
  if ((self == NULL) || (channelType == NULL) || (channelIndices == NULL) ||
878
193k
      (mapDescr == NULL)) {
879
0
    return; /* no extern buffer to be filled */
880
0
  }
881
882
193k
  if (self->numOutputChannelsAT !=
883
193k
      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
193k
  } else {
891
    /* ISO/IEC FDIS 23003-1:2006(E), page 46, Table 40 bsTreeConfig */
892
193k
    switch (self->treeConfig) {
893
193k
      case TREE_212:
894
193k
        channelType[0] = ACT_FRONT;
895
193k
        channelIndices[0] = 0;
896
193k
        channelType[1] = ACT_FRONT;
897
193k
        channelIndices[1] = 1;
898
193k
        break;
899
0
      default:;
900
193k
    }
901
193k
  }
902
193k
}
903
904
/*******************************************************************************
905
 Functionname: FDK_SpatialDecClose
906
 *******************************************************************************
907
908
 Description:
909
910
 Arguments:
911
912
 Return:
913
914
*******************************************************************************/
915
916
164k
void FDK_SpatialDecClose(spatialDec *self) {
917
164k
  if (self) {
918
23.2k
    int k;
919
920
23.2k
    if (self->apDecor != NULL) {
921
46.4k
      for (k = 0; k < self->createParams.maxNumDecorChannels; k++) {
922
23.2k
        FDKdecorrelateClose(&(self->apDecor[k]));
923
23.2k
      }
924
23.2k
      FDK_FREE_MEMORY_1D(self->apDecor);
925
23.2k
    }
926
23.2k
    if (self->pDecorBufferCplx != NULL) {
927
23.2k
      FDK_FREE_MEMORY_2D(self->pDecorBufferCplx);
928
23.2k
    }
929
930
23.2k
    subbandTPDestroy(&self->hStpDec);
931
932
23.2k
    FDK_FREE_MEMORY_1D(self->reshapeBBEnvState);
933
23.2k
    FDK_FREE_MEMORY_1D(self->smoothState);
934
935
23.2k
    FDK_FREE_MEMORY_2D(self->pHybridAnaStatesLFdmx);
936
23.2k
    FDK_FREE_MEMORY_2D(self->pHybridAnaStatesHFdmx);
937
23.2k
    FDK_FREE_MEMORY_2D(self->pHybridAnaStatesLFres);
938
23.2k
    FDK_FREE_MEMORY_2D(self->pHybridAnaStatesHFres);
939
23.2k
    FDK_FREE_MEMORY_1D(self->hybridAnalysis);
940
941
23.2k
    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
23.2k
    FDK_FREE_MEMORY_2D(self->hybOutputImagWet__FDK);
948
23.2k
    FDK_FREE_MEMORY_2D(self->hybOutputRealWet__FDK);
949
950
23.2k
    FDK_FREE_MEMORY_2D(self->hybOutputImagDry__FDK);
951
23.2k
    FDK_FREE_MEMORY_2D(self->hybOutputRealDry__FDK);
952
953
23.2k
    FDK_FREE_MEMORY_2D(self->wImag__FDK);
954
23.2k
    FDK_FREE_MEMORY_2D(self->wReal__FDK);
955
956
23.2k
    if (self->createParams.bProcResidual) {
957
23.2k
      int i;
958
959
46.4k
      for (i = 0; i < self->createParams.maxNumResChannels; i++) {
960
23.2k
        if (self->hybResidualImag__FDK != NULL)
961
23.2k
          FDK_FREE_MEMORY_1D(self->hybResidualImag__FDK[i]);
962
23.2k
        if (self->hybResidualReal__FDK != NULL)
963
23.2k
          FDK_FREE_MEMORY_1D(self->hybResidualReal__FDK[i]);
964
23.2k
        if (self->qmfResidualImag__FDK != NULL)
965
23.2k
          FDK_FREE_MEMORY_2D_ALIGNED(self->qmfResidualImag__FDK[i]);
966
23.2k
        if (self->qmfResidualReal__FDK != NULL)
967
23.2k
          FDK_FREE_MEMORY_2D_ALIGNED(self->qmfResidualReal__FDK[i]);
968
23.2k
      }
969
970
23.2k
      FDK_FREE_MEMORY_1D(self->hybResidualImag__FDK);
971
23.2k
      FDK_FREE_MEMORY_1D(self->hybResidualReal__FDK);
972
973
23.2k
      FDK_FREE_MEMORY_1D(self->qmfResidualImag__FDK);
974
23.2k
      FDK_FREE_MEMORY_1D(self->qmfResidualReal__FDK);
975
976
23.2k
    } /* self->createParams.bProcResidual */
977
978
23.2k
    FDK_FREE_MEMORY_2D(self->hybInputImag__FDK);
979
23.2k
    FDK_FREE_MEMORY_2D(self->hybInputReal__FDK);
980
981
23.2k
    FDK_FREE_MEMORY_2D_ALIGNED(self->qmfInputImag__FDK);
982
23.2k
    FDK_FREE_MEMORY_2D_ALIGNED(self->qmfInputReal__FDK);
983
984
23.2k
    FDK_FREE_MEMORY_3D(self->M2ImagPrev__FDK);
985
986
23.2k
    FDK_FREE_MEMORY_3D(self->M2RealPrev__FDK);
987
988
23.2k
    FDK_FREE_MEMORY_3D(self->M2Imag__FDK);
989
990
23.2k
    FDK_FREE_MEMORY_3D(self->M2Real__FDK);
991
992
23.2k
    FDK_FREE_MEMORY_1D(self->arbdmxAlphaPrev__FDK);
993
23.2k
    FDK_FREE_MEMORY_1D(self->arbdmxAlpha__FDK);
994
995
23.2k
    FDK_FREE_MEMORY_3D(self->arbdmxGain__FDK);
996
997
23.2k
    FDK_FREE_MEMORY_3D(self->ottIPD__FDK);
998
23.2k
    FDK_FREE_MEMORY_3D(self->ottICC__FDK);
999
23.2k
    FDK_FREE_MEMORY_3D(self->ottCLD__FDK);
1000
1001
    /* Last parameters from prev frame */
1002
23.2k
    FDK_FREE_MEMORY_2D(self->ottCLDidxPrev);
1003
23.2k
    FDK_FREE_MEMORY_2D(self->ottICCidxPrev);
1004
23.2k
    FDK_FREE_MEMORY_3D(self->ottICCdiffidx);
1005
23.2k
    FDK_FREE_MEMORY_2D(self->ottIPDidxPrev);
1006
23.2k
    FDK_FREE_MEMORY_2D(self->arbdmxGainIdxPrev);
1007
1008
23.2k
    FDK_FREE_MEMORY_2D(self->cmpOttCLDidxPrev);
1009
23.2k
    FDK_FREE_MEMORY_2D(self->cmpOttICCidxPrev);
1010
23.2k
    FDK_FREE_MEMORY_3D(self->outIdxData);
1011
23.2k
    FDK_FREE_MEMORY_2D(self->cmpOttIPDidxPrev);
1012
23.2k
    FDK_FREE_MEMORY_2D(self->cmpArbdmxGainIdxPrev);
1013
1014
23.2k
    FDK_FREE_MEMORY_2D(self->smgData);
1015
23.2k
    FDK_FREE_MEMORY_1D(self->smgTime);
1016
1017
23.2k
    FDK_FREE_MEMORY_1D(self->numOttBands);
1018
1019
23.2k
    FDK_FREE_MEMORY_1D(self->param2hyb);
1020
1021
23.2k
    FDK_FREE_MEMORY_1D(self);
1022
23.2k
  }
1023
1024
164k
  return;
1025
164k
}
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
193k
    const FDK_channelMapDescr *const mapDescr) {
1141
193k
  SACDEC_ERROR err = MPS_OK;
1142
1143
193k
  FIXP_SGL alpha = FL2FXCONST_SGL(0.0);
1144
1145
193k
  int ts;
1146
193k
  int ch;
1147
193k
  int hyb;
1148
1149
193k
  int prevSlot = self->prevTimeSlot;
1150
193k
  int ps = self->curPs;
1151
193k
  int ts_io = 0; /* i/o dependent slot */
1152
193k
  int bypassMode = (controlFlags & MPEGS_BYPASSMODE) ? 1 : 0;
1153
1154
  /* Bypass can be triggered by the upmixType, too. */
1155
193k
  bypassMode |= ((self->upmixType == UPMIXTYPE_BYPASS) ? 1 : 0);
1156
1157
  /*
1158
   * Decode available slots
1159
   */
1160
193k
  for (ts = self->curTimeSlot;
1161
6.02M
       ts <= fixMin(self->curTimeSlot + (int)nSamples / self->qmfBands - 1,
1162
193k
                    self->timeSlots - 1);
1163
5.83M
       ts++, ts_io++) {
1164
5.83M
    int currSlot = frame->paramSlot[ps];
1165
1166
5.83M
    err = (currSlot < ts) ? MPS_WRONG_PARAMETERSETS : MPS_OK;
1167
5.83M
    if (err != MPS_OK) {
1168
0
      err = SpatialDecSetInternalError(self, &bypassMode, err);
1169
0
    }
1170
1171
    /*
1172
     * Get new parameter set
1173
     */
1174
5.83M
    if (ts == prevSlot + 1) {
1175
243k
      if (bypassMode == 0) {
1176
243k
        err = SpatialDecCalculateM1andM2(
1177
243k
            self, ps, frame); /* input: ottCLD, ottICC, ... */
1178
                              /* output: M1param(Real/Imag), M2(Real/Imag) */
1179
243k
        if (err != MPS_OK) {
1180
0
          err = SpatialDecSetInternalError(self, &bypassMode, err);
1181
0
        }
1182
243k
      }
1183
1184
243k
      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
8.78k
        SpatialDecBufferMatrices(self); /* input: M(1/2)param(Real/Imag) */
1191
                                        /* output: M(1/2)param(Real/Imag)Prev */
1192
8.78k
        self->bOverwriteM1M2prev = 0;
1193
8.78k
      }
1194
1195
243k
      if (bypassMode == 0) {
1196
243k
        SpatialDecSmoothM1andM2(
1197
243k
            self, frame,
1198
243k
            ps); /* input: M1param(Real/Imag)(Prev), M2(Real/Imag)(Prev) */
1199
243k
      }          /* output: M1param(Real/Imag), M2(Real/Imag) */
1200
243k
    }
1201
1202
5.83M
    if (bypassMode == 0) {
1203
5.83M
      alpha = FX_DBL2FX_SGL(fDivNorm(ts - prevSlot, currSlot - prevSlot));
1204
5.83M
    }
1205
1206
5.83M
    switch (mode) {
1207
4.31M
      case INPUTMODE_QMF_SBR:
1208
4.31M
        if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD)
1209
12.8k
          self->bShareDelayWithSBR = 0; /* We got no hybrid delay */
1210
4.29M
        else
1211
4.29M
          self->bShareDelayWithSBR = 1;
1212
4.31M
        SpatialDecFeedQMF(
1213
4.31M
            self, qmfInDataReal, qmfInDataImag, ts_io, bypassMode,
1214
4.31M
            self->qmfInputReal__FDK, self->qmfInputImag__FDK,
1215
4.31M
            (bypassMode) ? numInputChannels : self->numInputChannels);
1216
4.31M
        break;
1217
1.52M
      case INPUTMODE_TIME:
1218
1.52M
        self->bShareDelayWithSBR = 0;
1219
1.52M
        SpatialDecQMFAnalysis(
1220
1.52M
            self, inData, ts_io, bypassMode, self->qmfInputReal__FDK,
1221
1.52M
            self->qmfInputImag__FDK,
1222
1.52M
            (bypassMode) ? numInputChannels : self->numInputChannels);
1223
1.52M
        break;
1224
0
      default:
1225
0
        break;
1226
5.83M
    }
1227
1228
5.83M
    if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC) &&
1229
5.13M
        self->residualCoding) {
1230
968k
      int offset;
1231
968k
      ch = 1;
1232
1233
968k
      offset = self->pQmfDomain->globalConf.nBandsSynthesis *
1234
968k
               self->pQmfDomain->globalConf.nQmfTimeSlots;
1235
1236
968k
      {
1237
968k
        const PCM_MPS *inSamples =
1238
968k
            &inData[ts * self->pQmfDomain->globalConf.nBandsAnalysis];
1239
1240
968k
        CalculateSpaceAnalysisQmf(
1241
968k
            &self->pQmfDomain->QmfDomainIn[ch].fb, inSamples + (ch * offset),
1242
968k
            self->qmfResidualReal__FDK[0][0], self->qmfResidualImag__FDK[0][0]);
1243
1244
968k
        if (!isTwoChMode(self->upmixType) && !bypassMode) {
1245
968k
          int i;
1246
968k
          FIXP_DBL *RESTRICT self_qmfResidualReal__FDK_0_0 =
1247
968k
              &self->qmfResidualReal__FDK[0][0][0];
1248
968k
          FIXP_DBL *RESTRICT self_qmfResidualImag__FDK_0_0 =
1249
968k
              &self->qmfResidualImag__FDK[0][0][0];
1250
1251
968k
          if ((self->pQmfDomain->globalConf.nBandsAnalysis == 24) &&
1252
199k
              !(self->stereoConfigIndex == 3)) {
1253
5.95M
            for (i = 0; i < self->qmfBands; i++) {
1254
5.85M
              self_qmfResidualReal__FDK_0_0[i] =
1255
5.85M
                  fMult(scaleValueSaturate(self_qmfResidualReal__FDK_0_0[i],
1256
5.85M
                                           1 + self->sacInDataHeadroom - (1)),
1257
5.85M
                        self->clipProtectGain__FDK);
1258
5.85M
              self_qmfResidualImag__FDK_0_0[i] =
1259
5.85M
                  fMult(scaleValueSaturate(self_qmfResidualImag__FDK_0_0[i],
1260
5.85M
                                           1 + self->sacInDataHeadroom - (1)),
1261
5.85M
                        self->clipProtectGain__FDK);
1262
5.85M
            }
1263
876k
          } else {
1264
19.0M
            for (i = 0; i < self->qmfBands; i++) {
1265
18.1M
              self_qmfResidualReal__FDK_0_0[i] =
1266
18.1M
                  fMult(scaleValueSaturate(self_qmfResidualReal__FDK_0_0[i],
1267
18.1M
                                           self->sacInDataHeadroom - (1)),
1268
18.1M
                        self->clipProtectGain__FDK);
1269
18.1M
              self_qmfResidualImag__FDK_0_0[i] =
1270
18.1M
                  fMult(scaleValueSaturate(self_qmfResidualImag__FDK_0_0[i],
1271
18.1M
                                           self->sacInDataHeadroom - (1)),
1272
18.1M
                        self->clipProtectGain__FDK);
1273
18.1M
            }
1274
876k
          }
1275
968k
        }
1276
968k
      }
1277
968k
    }
1278
1279
5.83M
    SpatialDecHybridAnalysis(
1280
5.83M
        self, /* input: qmfInput(Real/Imag), qmfResidual(Real/Imag) */
1281
5.83M
        self->qmfInputReal__FDK, self->qmfInputImag__FDK,
1282
5.83M
        self->hybInputReal__FDK, self->hybInputImag__FDK, ts, numInputChannels);
1283
1284
5.83M
    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
5.83M
    {
1292
5.83M
      FIXP_DBL *pxReal[MAX_NUM_XCHANNELS] = {NULL};
1293
5.83M
      FIXP_DBL *pxImag[MAX_NUM_XCHANNELS] = {NULL};
1294
1295
5.83M
      SpatialDecCreateX(self,
1296
5.83M
                        self->hybInputReal__FDK, /* input: hybInput(Real/Imag),
1297
                                                    hybResidual(Real/Imag) */
1298
5.83M
                        self->hybInputImag__FDK, pxReal, pxImag);
1299
1300
5.83M
      {
1301
5.83M
        SpatialDecApplyM1_CreateW_Mode212(
1302
5.83M
            self, frame, pxReal, pxImag,
1303
5.83M
            self->wReal__FDK, /* output: w(Real/Imag) */
1304
5.83M
            self->wImag__FDK);
1305
5.83M
      }
1306
5.83M
      if (err != MPS_OK) goto bail;
1307
1308
5.83M
      int applyM2Config = APPLY_M2_NONE;
1309
1310
5.83M
      applyM2Config = APPLY_M2;
1311
5.83M
      if ((self->pConfigCurrent->syntaxFlags &
1312
5.83M
           (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) &&
1313
5.13M
          (self->tempShapeConfig != 1) && (self->tempShapeConfig != 2)) {
1314
866k
        if (self->phaseCoding == 3)
1315
94.7k
          applyM2Config = APPLY_M2_MODE212_Res_PhaseCoding;
1316
771k
        else
1317
771k
          applyM2Config = APPLY_M2_MODE212;
1318
866k
      }
1319
1320
5.83M
      switch (applyM2Config) {
1321
771k
        case APPLY_M2_MODE212: {
1322
771k
          err = SpatialDecApplyM2_Mode212(
1323
771k
              self, ps, alpha, self->wReal__FDK, self->wImag__FDK,
1324
771k
              self->hybOutputRealDry__FDK, self->hybOutputImagDry__FDK);
1325
771k
        } break;
1326
94.7k
        case APPLY_M2_MODE212_Res_PhaseCoding:
1327
94.7k
          err = SpatialDecApplyM2_Mode212_ResidualsPlusPhaseCoding(
1328
94.7k
              self, ps, alpha, self->wReal__FDK, self->wImag__FDK,
1329
94.7k
              self->hybOutputRealDry__FDK, self->hybOutputImagDry__FDK);
1330
94.7k
          break;
1331
4.96M
        case APPLY_M2:
1332
4.96M
          err = SpatialDecApplyM2(
1333
4.96M
              self, ps, alpha, self->wReal__FDK, self->wImag__FDK,
1334
4.96M
              self->hybOutputRealDry__FDK, self->hybOutputImagDry__FDK,
1335
4.96M
              self->hybOutputRealWet__FDK, self->hybOutputImagWet__FDK);
1336
4.96M
          break;
1337
0
        default:
1338
0
          err = MPS_APPLY_M2_ERROR;
1339
0
          goto bail;
1340
5.83M
      }
1341
1342
5.83M
      if (err != MPS_OK) goto bail;
1343
1344
5.83M
      if ((self->tempShapeConfig == 2) && (!isTwoChMode(self->upmixType))) {
1345
4.09M
        SpatialDecReshapeBBEnv(self, frame,
1346
4.09M
                               ts); /* input: reshapeBBEnvState,
1347
                                       hybOutput(Real/Imag)(Dry/Wet),
1348
                                       hybInput(Real/Imag) */
1349
4.09M
      }                             /* output: hybOutput(Real/Imag)Dry */
1350
1351
      /* Merge parts of the dry and wet QMF buffers. */
1352
5.83M
      if ((self->tempShapeConfig == 1) && (!isTwoChMode(self->upmixType))) {
1353
1.99M
        for (ch = 0; ch < self->numOutputChannels; ch++) {
1354
17.3M
          for (hyb = 0; hyb < self->tp_hybBandBorder; hyb++) {
1355
15.9M
            self->hybOutputRealDry__FDK[ch][hyb] =
1356
15.9M
                fAddSaturate(self->hybOutputRealDry__FDK[ch][hyb],
1357
15.9M
                             self->hybOutputRealWet__FDK[ch][hyb]);
1358
15.9M
            self->hybOutputImagDry__FDK[ch][hyb] =
1359
15.9M
                fAddSaturate(self->hybOutputImagDry__FDK[ch][hyb],
1360
15.9M
                             self->hybOutputImagWet__FDK[ch][hyb]);
1361
15.9M
          } /* loop hyb */
1362
1.33M
        }   /* loop ch */
1363
666k
        err = subbandTPApply(
1364
666k
            self, frame); /* input: hStpDec, hybOutput(Real/Imag)Dry/Wet */
1365
                          /* output: hStpDec, hybOutput(Real/Imag)Dry */
1366
666k
        if (err != MPS_OK) goto bail;
1367
666k
      } /* (self->tempShapeConfig == 1) */
1368
5.16M
      else {
1369
        /* The wet signal is added to the dry signal in applyM2 if GES and STP
1370
         * are disabled */
1371
5.16M
        if ((self->tempShapeConfig == 1) || (self->tempShapeConfig == 2)) {
1372
4.09M
          int nHybBands;
1373
4.09M
          nHybBands = self->hybridBands;
1374
1375
12.2M
          for (ch = 0; ch < self->numOutputChannels; ch++) {
1376
8.18M
            FIXP_DBL *RESTRICT pRealDry = self->hybOutputRealDry__FDK[ch];
1377
8.18M
            FIXP_DBL *RESTRICT pImagDry = self->hybOutputImagDry__FDK[ch];
1378
8.18M
            FIXP_DBL *RESTRICT pRealWet = self->hybOutputRealWet__FDK[ch];
1379
8.18M
            FIXP_DBL *RESTRICT pImagWet = self->hybOutputImagWet__FDK[ch];
1380
583M
            for (hyb = 0; hyb < nHybBands; hyb++) {
1381
575M
              pRealDry[hyb] = fAddSaturate(pRealDry[hyb], pRealWet[hyb]);
1382
575M
              pImagDry[hyb] = fAddSaturate(pImagDry[hyb], pImagWet[hyb]);
1383
575M
            } /* loop hyb */
1384
8.18M
            for (; hyb < self->hybridBands; hyb++) {
1385
0
              pRealDry[hyb] = fAddSaturate(pRealDry[hyb], pRealWet[hyb]);
1386
0
            } /* loop hyb */
1387
8.18M
          }   /* loop ch */
1388
4.09M
        } /* ( self->tempShapeConfig == 1 ) || ( self->tempShapeConfig == 2 ) */
1389
5.16M
      }   /* !self->tempShapeConfig == 1 */
1390
5.83M
    }     /*  !bypassMode */
1391
1392
5.83M
    if ((self->phaseCoding == 1) && (bypassMode == 0)) {
1393
      /* only if bsPhaseCoding == 1 and bsResidualCoding == 0 */
1394
1395
377k
      SpatialDecApplyPhase(
1396
377k
          self, alpha, (ts == currSlot) /* signal the last slot of the set */
1397
377k
      );
1398
377k
    }
1399
1400
    /*
1401
     * Synthesis Filtering
1402
     */
1403
1404
5.83M
    err = SpatialDecSynthesis(
1405
5.83M
        self, ts_io,
1406
5.83M
        self->hybOutputRealDry__FDK, /* input: hybOutput(Real/Imag)Dry */
1407
5.83M
        self->hybOutputImagDry__FDK, self->timeOut__FDK, /* output: timeOut */
1408
5.83M
        numInputChannels, mapDescr);
1409
1410
5.83M
    if (err != MPS_OK) goto bail;
1411
1412
    /*
1413
     * Update parameter buffer
1414
     */
1415
5.83M
    if (ts == currSlot) {
1416
228k
      SpatialDecBufferMatrices(self); /* input: M(1/2)param(Real/Imag) */
1417
                                      /* output: M(1/2)param(Real/Imag)Prev */
1418
1419
228k
      prevSlot = currSlot;
1420
228k
      ps++;
1421
228k
    } /* if (ts==currSlot) */
1422
1423
5.83M
  } /* ts loop */
1424
1425
  /*
1426
   * Save parameter states
1427
   */
1428
193k
  self->prevTimeSlot = prevSlot;
1429
193k
  self->curTimeSlot = ts;
1430
193k
  self->curPs = ps;
1431
1432
193k
bail:
1433
1434
193k
  return err;
1435
193k
}
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
193k
    const FDK_channelMapDescr *const mapDescr) {
1446
193k
  SACDEC_ERROR err = MPS_OK;
1447
1448
193k
  int fDecAndMapFrameData;
1449
193k
  int controlFlags;
1450
1451
193k
  FDK_ASSERT(self != NULL);
1452
193k
  FDK_ASSERT(pControlFlags != NULL);
1453
193k
  FDK_ASSERT(pcmOutBuf != NULL);
1454
193k
  FDK_ASSERT(self->sacInDataHeadroom >= (1));
1455
1456
193k
  self->errInt = err; /* Init internal error */
1457
1458
193k
  controlFlags = *pControlFlags;
1459
1460
193k
  if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC) &&
1461
149k
      (self->stereoConfigIndex > 1)) {
1462
19.5k
    numInputChannels =
1463
19.5k
        1; /* Do not count residual channel as input channel. It is handled
1464
              seperately. */
1465
19.5k
  }
1466
1467
  /* Check if input amount of channels is consistent */
1468
193k
  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
193k
  self->timeOut__FDK = pcmOutBuf;
1476
1477
  /* Determine local function control flags */
1478
193k
  fDecAndMapFrameData = frame->newBsData;
1479
1480
193k
  if (((fDecAndMapFrameData ==
1481
193k
        0) /* assures that conceal flag will not be set for blind mode */
1482
76.7k
       && (self->curTimeSlot + (int)nSamples / self->qmfBands >
1483
76.7k
           self->timeSlots)) ||
1484
118k
      (frame->numParameterSets ==
1485
118k
       0)) { /* New input samples but missing side info */
1486
75.2k
    fDecAndMapFrameData = 1;
1487
75.2k
    controlFlags |= MPEGS_CONCEAL;
1488
75.2k
  }
1489
1490
193k
  if ((fDecAndMapFrameData == 0) &&
1491
1.53k
      (frame->paramSlot[fMax(0, frame->numParameterSets - 1)] !=
1492
1.53k
           (self->timeSlots - 1) ||
1493
1.53k
       self->curTimeSlot >
1494
1.53k
           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
193k
  SpatialDecConcealment_UpdateState(
1502
193k
      &self->concealInfo,
1503
193k
      (controlFlags & MPEGS_CONCEAL)
1504
193k
          ? 0
1505
193k
          : 1); /* convert from conceal flag to frame ok flag */
1506
1507
193k
  if (fDecAndMapFrameData) {
1508
    /* Reset spatial framing control vars */
1509
192k
    frame->newBsData = 0;
1510
192k
    self->prevTimeSlot = -1;
1511
192k
    self->curTimeSlot = 0;
1512
192k
    self->curPs = 0;
1513
1514
192k
    if (controlFlags & MPEGS_CONCEAL) {
1515
      /* Reset frame data to avoid misconfiguration. */
1516
77.4k
      SpatialDecClearFrameData(self, frame, &self->createParams);
1517
77.4k
    }
1518
1519
192k
    {
1520
192k
      err = SpatialDecDecodeFrame(self, frame); /* input: ... */
1521
      /* output: decodeAndMapFrameDATA */
1522
192k
    }
1523
1524
192k
    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
192k
  }
1534
1535
193k
  err = SpatialDecApplyParameterSets(
1536
193k
      self, frame, inputMode, inData, qmfInDataReal, qmfInDataImag, nSamples,
1537
193k
      controlFlags | ((err == MPS_OK) ? 0 : MPEGS_BYPASSMODE), numInputChannels,
1538
193k
      mapDescr);
1539
193k
  if (err != MPS_OK) {
1540
0
    goto bail;
1541
0
  }
1542
1543
193k
bail:
1544
1545
193k
  *pControlFlags = controlFlags;
1546
1547
193k
  return err;
1548
193k
}