Coverage Report

Created: 2026-01-13 06:51

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libSACdec/src/sac_bitdec.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 Dec bitstream decoder
100
101
*******************************************************************************/
102
103
#include "sac_bitdec.h"
104
105
#include "sac_dec_errorcodes.h"
106
#include "nlc_dec.h"
107
#include "sac_rom.h"
108
#include "FDK_matrixCalloc.h"
109
#include "sac_tsd.h"
110
111
enum {
112
  ottVsTotInactiv = 0,
113
  ottVsTotDb1Activ = 1,
114
  ottVsTotDb2Activ = 2,
115
  ottVsTotDb1Db2Activ = 3
116
};
117
118
static SACDEC_ERROR SpatialDecDecodeHelperInfo(
119
209k
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, UPMIXTYPE upmixType) {
120
209k
  int i;
121
209k
  UINT syntaxFlags;
122
123
  /* Determine bit stream syntax */
124
209k
  syntaxFlags = 0;
125
209k
  switch (pSpatialSpecificConfig->coreCodec) {
126
99.2k
    case AOT_ER_AAC_ELD:
127
99.2k
    case AOT_ER_AAC_LD:
128
99.2k
      syntaxFlags |= SACDEC_SYNTAX_LD;
129
99.2k
      break;
130
109k
    case AOT_USAC:
131
109k
      syntaxFlags |= SACDEC_SYNTAX_USAC;
132
109k
      break;
133
0
    case AOT_NONE:
134
1.06k
    default:
135
1.06k
      return MPS_UNSUPPORTED_FORMAT;
136
209k
  }
137
138
208k
  pSpatialSpecificConfig->syntaxFlags = syntaxFlags;
139
140
208k
  switch (pSpatialSpecificConfig->treeConfig) {
141
208k
    case TREE_212: {
142
208k
      pSpatialSpecificConfig->ottCLDdefault[0] = 0;
143
208k
    } break;
144
0
    default:
145
0
      return MPS_INVALID_TREECONFIG;
146
208k
  }
147
148
208k
  if (syntaxFlags & SACDEC_SYNTAX_USAC) {
149
109k
    if (pSpatialSpecificConfig->bsOttBandsPhasePresent) {
150
21.3k
      pSpatialSpecificConfig->numOttBandsIPD =
151
21.3k
          pSpatialSpecificConfig->bsOttBandsPhase;
152
88.2k
    } else {
153
88.2k
      int numParameterBands;
154
155
88.2k
      numParameterBands = pSpatialSpecificConfig->freqRes;
156
88.2k
      switch (numParameterBands) {
157
3.07k
        case 4:
158
6.68k
        case 5:
159
6.68k
          pSpatialSpecificConfig->numOttBandsIPD = 2;
160
6.68k
          break;
161
39.1k
        case 7:
162
39.1k
          pSpatialSpecificConfig->numOttBandsIPD = 3;
163
39.1k
          break;
164
16.8k
        case 10:
165
16.8k
          pSpatialSpecificConfig->numOttBandsIPD = 5;
166
16.8k
          break;
167
6.47k
        case 14:
168
6.47k
          pSpatialSpecificConfig->numOttBandsIPD = 7;
169
6.47k
          break;
170
13.0k
        case 20:
171
19.0k
        case 28:
172
19.0k
          pSpatialSpecificConfig->numOttBandsIPD = 10;
173
19.0k
          break;
174
0
        default:
175
0
          return MPS_INVALID_PARAMETERBANDS;
176
88.2k
      }
177
88.2k
    }
178
109k
  } else {
179
99.2k
    pSpatialSpecificConfig->numOttBandsIPD = 0;
180
99.2k
  }
181
417k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
182
208k
    {
183
208k
      pSpatialSpecificConfig->bitstreamOttBands[i] =
184
208k
          pSpatialSpecificConfig->freqRes;
185
208k
    }
186
208k
    {
187
208k
      pSpatialSpecificConfig->numOttBands[i] =
188
208k
          pSpatialSpecificConfig->bitstreamOttBands[i];
189
208k
      if (syntaxFlags & SACDEC_SYNTAX_USAC &&
190
109k
          !pSpatialSpecificConfig->bsOttBandsPhasePresent) {
191
88.2k
        if (pSpatialSpecificConfig->bResidualCoding &&
192
21.8k
            pSpatialSpecificConfig->ResidualConfig[i].bResidualPresent &&
193
21.8k
            (pSpatialSpecificConfig->numOttBandsIPD <
194
21.8k
             pSpatialSpecificConfig->ResidualConfig[i].nResidualBands)) {
195
6.38k
          pSpatialSpecificConfig->numOttBandsIPD =
196
6.38k
              pSpatialSpecificConfig->ResidualConfig[i].nResidualBands;
197
6.38k
        }
198
88.2k
      }
199
208k
    }
200
208k
  } /* i */
201
202
208k
  return MPS_OK;
203
208k
}
204
205
/*******************************************************************************
206
 Functionname: SpatialDecParseExtensionConfig
207
 *******************************************************************************
208
209
 Description:
210
211
 Arguments:
212
213
 Return:
214
215
*******************************************************************************/
216
217
static SACDEC_ERROR SpatialDecParseExtensionConfig(
218
    HANDLE_FDK_BITSTREAM bitstream, SPATIAL_SPECIFIC_CONFIG *config,
219
61.9k
    int numOttBoxes, int numTttBoxes, int numOutChan, int bitsAvailable) {
220
61.9k
  SACDEC_ERROR err = MPS_OK;
221
61.9k
  INT ba = bitsAvailable;
222
223
61.9k
  config->sacExtCnt = 0;
224
61.9k
  config->bResidualCoding = 0;
225
226
61.9k
  ba = fMin((int)FDKgetValidBits(bitstream), ba);
227
228
222k
  while ((ba >= 8) && (config->sacExtCnt < MAX_NUM_EXT_TYPES)) {
229
165k
    int bitsRead, nFillBits;
230
165k
    INT tmp;
231
165k
    UINT sacExtLen;
232
233
165k
    config->sacExtType[config->sacExtCnt] = FDKreadBits(bitstream, 4);
234
165k
    ba -= 4;
235
236
165k
    sacExtLen = FDKreadBits(bitstream, 4);
237
165k
    ba -= 4;
238
239
165k
    if (sacExtLen == 15) {
240
29.5k
      sacExtLen += FDKreadBits(bitstream, 8);
241
29.5k
      ba -= 8;
242
29.5k
      if (sacExtLen == 15 + 255) {
243
17.4k
        sacExtLen += FDKreadBits(bitstream, 16);
244
17.4k
        ba -= 16;
245
17.4k
      }
246
29.5k
    }
247
248
165k
    tmp = (INT)FDKgetValidBits(
249
165k
        bitstream); /* Extension config payload start anchor. */
250
165k
    if ((tmp <= 0) || (tmp < (INT)sacExtLen * 8) || (ba < (INT)sacExtLen * 8)) {
251
4.84k
      err = MPS_PARSE_ERROR;
252
4.84k
      goto bail;
253
4.84k
    }
254
255
161k
    switch (config->sacExtType[config->sacExtCnt]) {
256
161k
      default:; /* unknown extension data => do nothing */
257
161k
    }
258
259
    /* skip remaining extension data */
260
161k
    bitsRead = tmp - FDKgetValidBits(bitstream);
261
161k
    nFillBits = 8 * sacExtLen - bitsRead;
262
263
161k
    if (nFillBits < 0) {
264
0
      err = MPS_PARSE_ERROR;
265
0
      goto bail;
266
161k
    } else {
267
      /* Skip fill bits or an unkown extension. */
268
161k
      FDKpushFor(bitstream, nFillBits);
269
161k
    }
270
271
161k
    ba -= 8 * sacExtLen;
272
161k
    config->sacExtCnt++;
273
161k
  }
274
275
61.9k
bail:
276
61.9k
  return err;
277
61.9k
}
278
279
SACDEC_ERROR SpatialDecParseSpecificConfigHeader(
280
    HANDLE_FDK_BITSTREAM bitstream,
281
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig,
282
6.89k
    AUDIO_OBJECT_TYPE coreCodec, SPATIAL_DEC_UPMIX_TYPE upmixType) {
283
6.89k
  SACDEC_ERROR err = MPS_OK;
284
6.89k
  INT numFillBits;
285
6.89k
  int sacHeaderLen = 0;
286
6.89k
  int sacTimeAlignFlag = 0;
287
288
6.89k
  sacTimeAlignFlag = FDKreadBits(bitstream, 1);
289
6.89k
  sacHeaderLen = FDKreadBits(bitstream, 7);
290
291
6.89k
  if (sacHeaderLen == 127) {
292
578
    sacHeaderLen += FDKreadBits(bitstream, 16);
293
578
  }
294
6.89k
  numFillBits = (INT)FDKgetValidBits(bitstream);
295
296
6.89k
  err = SpatialDecParseSpecificConfig(bitstream, pSpatialSpecificConfig,
297
6.89k
                                      sacHeaderLen, coreCodec);
298
299
6.89k
  numFillBits -=
300
6.89k
      (INT)FDKgetValidBits(bitstream); /* the number of read bits (tmpBits) */
301
6.89k
  numFillBits = (8 * sacHeaderLen) - numFillBits;
302
6.89k
  if (numFillBits < 0) {
303
    /* Parsing went wrong */
304
81
    err = MPS_PARSE_ERROR;
305
81
  }
306
  /* Move to the very end of the SSC */
307
6.89k
  FDKpushBiDirectional(bitstream, numFillBits);
308
309
6.89k
  if ((err == MPS_OK) && sacTimeAlignFlag) {
310
    /* not supported */
311
294
    FDKreadBits(bitstream, 16);
312
294
    err = MPS_UNSUPPORTED_CONFIG;
313
294
  }
314
315
  /* Derive additional helper variables */
316
6.89k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, (UPMIXTYPE)upmixType);
317
318
6.89k
  return err;
319
6.89k
}
320
321
SACDEC_ERROR SpatialDecParseMps212Config(
322
    HANDLE_FDK_BITSTREAM bitstream,
323
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, int samplingRate,
324
    AUDIO_OBJECT_TYPE coreCodec, INT stereoConfigIndex,
325
82.6k
    INT coreSbrFrameLengthIndex) {
326
82.6k
  int i;
327
328
82.6k
  FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG));
329
330
82.6k
  pSpatialSpecificConfig->stereoConfigIndex = stereoConfigIndex;
331
82.6k
  pSpatialSpecificConfig->coreSbrFrameLengthIndex = coreSbrFrameLengthIndex;
332
82.6k
  pSpatialSpecificConfig->freqRes =
333
82.6k
      (SPATIALDEC_FREQ_RES)freqResTable[FDKreadBits(bitstream, 3)];
334
82.6k
  if (pSpatialSpecificConfig->freqRes == 0) {
335
380
    return MPS_PARSE_ERROR; /* reserved value */
336
380
  }
337
338
82.2k
  switch (coreCodec) {
339
0
    case AOT_DRM_USAC:
340
0
      pSpatialSpecificConfig->bsFixedGainDMX =
341
0
          (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3);
342
      /* tempShapeConfig = (bsTempShapeConfigDrm == 1) ? 3 : 0 */
343
0
      pSpatialSpecificConfig->tempShapeConfig =
344
0
          (SPATIALDEC_TS_CONF)(FDKreadBits(bitstream, 1) * 3);
345
0
      pSpatialSpecificConfig->decorrConfig = (SPATIALDEC_DECORR_CONF)0;
346
0
      pSpatialSpecificConfig->bsDecorrType = 0;
347
0
      break;
348
82.2k
    case AOT_USAC:
349
82.2k
      pSpatialSpecificConfig->bsFixedGainDMX =
350
82.2k
          (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3);
351
82.2k
      pSpatialSpecificConfig->tempShapeConfig =
352
82.2k
          (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2);
353
82.2k
      pSpatialSpecificConfig->decorrConfig =
354
82.2k
          (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2);
355
82.2k
      if (pSpatialSpecificConfig->decorrConfig > 2) {
356
471
        return MPS_PARSE_ERROR; /* reserved value */
357
471
      }
358
81.7k
      pSpatialSpecificConfig->bsDecorrType = 0;
359
81.7k
      break;
360
0
    default:
361
0
      return MPS_UNSUPPORTED_FORMAT;
362
82.2k
  }
363
81.7k
  pSpatialSpecificConfig->nTimeSlots = (coreSbrFrameLengthIndex == 4) ? 64 : 32;
364
81.7k
  pSpatialSpecificConfig->bsHighRateMode = (UCHAR)FDKreadBits(bitstream, 1);
365
366
81.7k
  {
367
81.7k
    pSpatialSpecificConfig->bsPhaseCoding = (UCHAR)FDKreadBits(bitstream, 1);
368
81.7k
    pSpatialSpecificConfig->bsOttBandsPhasePresent =
369
81.7k
        (UCHAR)FDKreadBits(bitstream, 1);
370
81.7k
    if (pSpatialSpecificConfig->bsOttBandsPhasePresent) {
371
19.7k
      if (MAX_PARAMETER_BANDS < (pSpatialSpecificConfig->bsOttBandsPhase =
372
19.7k
                                     FDKreadBits(bitstream, 5))) {
373
220
        return MPS_PARSE_ERROR;
374
220
      }
375
62.0k
    } else {
376
62.0k
      pSpatialSpecificConfig->bsOttBandsPhase = 0;
377
62.0k
    }
378
81.7k
  }
379
380
81.5k
  if (stereoConfigIndex > 1) { /* do residual coding */
381
31.4k
    pSpatialSpecificConfig->bResidualCoding = 1;
382
31.4k
    pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 1;
383
31.4k
    if (pSpatialSpecificConfig->freqRes <
384
31.4k
        (pSpatialSpecificConfig->ResidualConfig->nResidualBands =
385
31.4k
             FDKreadBits(bitstream, 5))) {
386
477
      return MPS_PARSE_ERROR;
387
477
    }
388
30.9k
    pSpatialSpecificConfig->bsOttBandsPhase =
389
30.9k
        fMax(pSpatialSpecificConfig->bsOttBandsPhase,
390
30.9k
             pSpatialSpecificConfig->ResidualConfig->nResidualBands);
391
30.9k
    pSpatialSpecificConfig->bsPseudoLr = (UCHAR)FDKreadBits(bitstream, 1);
392
393
30.9k
    if (pSpatialSpecificConfig->bsPhaseCoding) {
394
10.1k
      pSpatialSpecificConfig->bsPhaseCoding = 3;
395
10.1k
    }
396
50.0k
  } else {
397
50.0k
    pSpatialSpecificConfig->bResidualCoding = 0;
398
50.0k
    pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 0;
399
50.0k
  }
400
401
81.0k
  if (pSpatialSpecificConfig->tempShapeConfig == 2) {
402
51.2k
    switch (coreCodec) {
403
51.2k
      case AOT_USAC:
404
51.2k
        pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1);
405
51.2k
        break;
406
0
      default: /* added to avoid compiler warning */
407
0
        break; /* added to avoid compiler warning */
408
51.2k
    }
409
51.2k
  }
410
411
  /* Static parameters */
412
413
81.0k
  pSpatialSpecificConfig->samplingFreq =
414
81.0k
      samplingRate; /* wrong for stereoConfigIndex == 3 but value is unused */
415
81.0k
  pSpatialSpecificConfig->treeConfig = SPATIALDEC_MODE_RSVD7;
416
81.0k
  pSpatialSpecificConfig->nOttBoxes =
417
81.0k
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
418
81.0k
  pSpatialSpecificConfig->nInputChannels =
419
81.0k
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
420
81.0k
  pSpatialSpecificConfig->nOutputChannels =
421
81.0k
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
422
423
81.0k
  pSpatialSpecificConfig->bArbitraryDownmix = 0;
424
425
162k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
426
81.0k
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
427
81.0k
  }
428
429
81.0k
  if (coreCodec == AOT_DRM_USAC) {
430
    /* MPS payload is MPEG conform -> no need for pseudo DRM AOT */
431
0
    coreCodec = AOT_USAC;
432
0
  }
433
81.0k
  pSpatialSpecificConfig->coreCodec = coreCodec;
434
435
  /* Derive additional helper variables */
436
81.0k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
437
438
81.0k
  return MPS_OK;
439
81.0k
}
440
441
SACDEC_ERROR SpatialDecParseSpecificConfig(
442
    HANDLE_FDK_BITSTREAM bitstream,
443
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, int sacHeaderLen,
444
105k
    AUDIO_OBJECT_TYPE coreCodec) {
445
105k
  SACDEC_ERROR err = MPS_OK;
446
105k
  int i;
447
105k
  int bsSamplingFreqIndex;
448
105k
  int bsFreqRes, b3DaudioMode = 0;
449
105k
  int numHeaderBits;
450
105k
  int cfgStartPos, bitsAvailable;
451
452
105k
  FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG));
453
454
105k
  cfgStartPos = FDKgetValidBits(bitstream);
455
  /* It might be that we do not know the SSC length beforehand. */
456
105k
  if (sacHeaderLen == 0) {
457
20.8k
    bitsAvailable = cfgStartPos;
458
84.5k
  } else {
459
84.5k
    bitsAvailable = 8 * sacHeaderLen;
460
84.5k
    if (bitsAvailable > cfgStartPos) {
461
1.02k
      err = MPS_PARSE_ERROR;
462
1.02k
      goto bail;
463
1.02k
    }
464
84.5k
  }
465
466
104k
  bsSamplingFreqIndex = FDKreadBits(bitstream, 4);
467
468
104k
  if (bsSamplingFreqIndex == 15) {
469
7.77k
    pSpatialSpecificConfig->samplingFreq = FDKreadBits(bitstream, 24);
470
96.5k
  } else {
471
96.5k
    pSpatialSpecificConfig->samplingFreq =
472
96.5k
        samplingFreqTable[bsSamplingFreqIndex];
473
96.5k
    if (pSpatialSpecificConfig->samplingFreq == 0) {
474
942
      err = MPS_PARSE_ERROR;
475
942
      goto bail;
476
942
    }
477
96.5k
  }
478
479
103k
  pSpatialSpecificConfig->nTimeSlots = FDKreadBits(bitstream, 5) + 1;
480
103k
  if ((pSpatialSpecificConfig->nTimeSlots < 1) ||
481
103k
      (pSpatialSpecificConfig->nTimeSlots > MAX_TIME_SLOTS)) {
482
0
    err = MPS_PARSE_ERROR;
483
0
    goto bail;
484
0
  }
485
486
103k
  bsFreqRes = FDKreadBits(bitstream, 3);
487
488
103k
  pSpatialSpecificConfig->freqRes =
489
103k
      (SPATIALDEC_FREQ_RES)freqResTable_LD[bsFreqRes];
490
491
103k
  {
492
103k
    UINT treeConfig = FDKreadBits(bitstream, 4);
493
494
103k
    switch (treeConfig) {
495
64.3k
      case SPATIALDEC_MODE_RSVD7:
496
64.3k
        pSpatialSpecificConfig->treeConfig = (SPATIALDEC_TREE_CONFIG)treeConfig;
497
64.3k
        break;
498
38.9k
      default:
499
38.9k
        err = MPS_UNSUPPORTED_CONFIG;
500
38.9k
        goto bail;
501
103k
    }
502
103k
  }
503
504
64.3k
  {
505
64.3k
    pSpatialSpecificConfig->nOttBoxes =
506
64.3k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
507
64.3k
    pSpatialSpecificConfig->nTttBoxes =
508
64.3k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numTttBoxes;
509
64.3k
    pSpatialSpecificConfig->nInputChannels =
510
64.3k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
511
64.3k
    pSpatialSpecificConfig->nOutputChannels =
512
64.3k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
513
64.3k
  }
514
515
64.3k
  pSpatialSpecificConfig->quantMode =
516
64.3k
      (SPATIALDEC_QUANT_MODE)FDKreadBits(bitstream, 2);
517
518
64.3k
  pSpatialSpecificConfig->bArbitraryDownmix = FDKreadBits(bitstream, 1);
519
520
64.3k
  pSpatialSpecificConfig->bsFixedGainDMX =
521
64.3k
      (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3);
522
523
64.3k
  pSpatialSpecificConfig->tempShapeConfig =
524
64.3k
      (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2);
525
64.3k
  if (pSpatialSpecificConfig->tempShapeConfig > 2) {
526
1.35k
    return MPS_PARSE_ERROR; /* reserved value */
527
1.35k
  }
528
529
63.0k
  pSpatialSpecificConfig->decorrConfig =
530
63.0k
      (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2);
531
63.0k
  if (pSpatialSpecificConfig->decorrConfig > 2) {
532
632
    return MPS_PARSE_ERROR; /* reserved value */
533
632
  }
534
535
124k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
536
62.4k
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
537
62.4k
  }
538
539
62.4k
  for (i = 0; i < pSpatialSpecificConfig->nTttBoxes; i++) {
540
0
    int bTttDualMode = FDKreadBits(bitstream, 1);
541
0
    FDKreadBits(bitstream, 3); /* not supported */
542
543
0
    if (bTttDualMode) {
544
0
      FDKreadBits(bitstream, 8); /* not supported */
545
0
    }
546
0
  }
547
548
62.4k
  if (pSpatialSpecificConfig->tempShapeConfig == 2) {
549
31.1k
    pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1);
550
31.1k
  }
551
552
62.4k
  if (b3DaudioMode) {
553
0
    if (FDKreadBits(bitstream, 2) == 0) { /* b3DaudioHRTFset ? */
554
0
      int hc;
555
0
      int HRTFnumBand;
556
0
      int HRTFfreqRes = FDKreadBits(bitstream, 3);
557
0
      int HRTFnumChan = FDKreadBits(bitstream, 4);
558
0
      int HRTFasymmetric = FDKreadBits(bitstream, 1);
559
560
0
      HRTFnumBand = freqResTable_LD[HRTFfreqRes];
561
562
0
      for (hc = 0; hc < HRTFnumChan; hc++) {
563
0
        FDKpushFor(bitstream, HRTFnumBand * 6); /* HRTFlevelLeft[hc][hb] */
564
0
        if (HRTFasymmetric) {
565
0
          FDKpushFor(bitstream, HRTFnumBand * 6); /* HRTFlevelRight[hc][hb] */
566
0
        }
567
0
        if (FDKreadBits(bitstream, 1)) {          /* HRTFphase[hc] ? */
568
0
          FDKpushFor(bitstream, HRTFnumBand * 6); /* HRTFphaseLR[hc][hb] */
569
0
        }
570
0
        if (FDKreadBits(bitstream, 1)) {          /* HRTFicc[hc] ? */
571
0
          FDKpushFor(bitstream, HRTFnumBand * 6); /* HRTFiccLR[hc][hb] */
572
0
        }
573
0
      }
574
0
    }
575
0
  }
576
577
62.4k
  FDKbyteAlign(bitstream,
578
62.4k
               cfgStartPos); /* ISO/IEC FDIS 23003-1: 5.2. ... byte alignment
579
                                with respect to the beginning of the syntactic
580
                                element in which ByteAlign() occurs. */
581
582
62.4k
  numHeaderBits = cfgStartPos - (INT)FDKgetValidBits(bitstream);
583
62.4k
  bitsAvailable -= numHeaderBits;
584
62.4k
  if (bitsAvailable < 0) {
585
460
    err = MPS_PARSE_ERROR;
586
460
    goto bail;
587
460
  }
588
589
61.9k
  pSpatialSpecificConfig->sacExtCnt = 0;
590
61.9k
  pSpatialSpecificConfig->bResidualCoding = 0;
591
592
61.9k
  err = SpatialDecParseExtensionConfig(
593
61.9k
      bitstream, pSpatialSpecificConfig, pSpatialSpecificConfig->nOttBoxes,
594
61.9k
      pSpatialSpecificConfig->nTttBoxes,
595
61.9k
      pSpatialSpecificConfig->nOutputChannels, bitsAvailable);
596
597
61.9k
  FDKbyteAlign(
598
61.9k
      bitstream,
599
61.9k
      cfgStartPos); /* Same alignment anchor as above because
600
                       SpatialExtensionConfig() always reads full bytes */
601
602
61.9k
  pSpatialSpecificConfig->coreCodec = coreCodec;
603
604
61.9k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
605
606
103k
bail:
607
103k
  if (sacHeaderLen > 0) {
608
    /* If the config is of known length then assure that the
609
       bitbuffer is exactly at its end when leaving the function. */
610
82.6k
    FDKpushBiDirectional(
611
82.6k
        bitstream,
612
82.6k
        (sacHeaderLen * 8) - (cfgStartPos - (INT)FDKgetValidBits(bitstream)));
613
82.6k
  }
614
615
103k
  return err;
616
61.9k
}
617
618
int SpatialDecDefaultSpecificConfig(
619
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig,
620
    AUDIO_OBJECT_TYPE coreCodec, int samplingFreq, int nTimeSlots,
621
    int sacDecoderLevel, int isBlind, int numCoreChannels)
622
623
836
{
624
836
  int err = MPS_OK;
625
836
  int i;
626
627
836
  FDK_ASSERT(coreCodec != AOT_NONE);
628
836
  FDK_ASSERT(nTimeSlots > 0);
629
836
  FDK_ASSERT(samplingFreq > 0);
630
631
836
  pSpatialSpecificConfig->coreCodec = coreCodec;
632
836
  pSpatialSpecificConfig->samplingFreq = samplingFreq;
633
836
  pSpatialSpecificConfig->nTimeSlots = nTimeSlots;
634
836
  if ((pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_ELD) ||
635
0
      (pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_LD))
636
836
    pSpatialSpecificConfig->freqRes = SPATIALDEC_FREQ_RES_23;
637
0
  else
638
0
    pSpatialSpecificConfig->freqRes = SPATIALDEC_FREQ_RES_28;
639
640
836
  {
641
836
    pSpatialSpecificConfig->treeConfig =
642
836
        SPATIALDEC_MODE_RSVD7; /* 212  configuration */
643
836
  }
644
645
836
  {
646
836
    pSpatialSpecificConfig->nOttBoxes =
647
836
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
648
836
    pSpatialSpecificConfig->nInputChannels =
649
836
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
650
836
    pSpatialSpecificConfig->nOutputChannels =
651
836
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
652
836
  }
653
654
836
  pSpatialSpecificConfig->quantMode = SPATIALDEC_QUANT_FINE_DEF;
655
836
  pSpatialSpecificConfig->bArbitraryDownmix = 0;
656
836
  pSpatialSpecificConfig->bResidualCoding = 0;
657
836
  if ((pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_ELD) ||
658
0
      (pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_LD))
659
836
    pSpatialSpecificConfig->bsFixedGainDMX = SPATIALDEC_GAIN_RSVD2;
660
0
  else
661
0
    pSpatialSpecificConfig->bsFixedGainDMX = SPATIALDEC_GAIN_MODE0;
662
663
836
  pSpatialSpecificConfig->tempShapeConfig = SPATIALDEC_TS_TPNOWHITE;
664
836
  pSpatialSpecificConfig->decorrConfig = SPATIALDEC_DECORR_MODE0;
665
666
1.67k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
667
836
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
668
836
  }
669
670
836
  return err;
671
836
}
672
673
/*******************************************************************************
674
 Functionname: coarse2fine
675
 *******************************************************************************
676
677
 Description:
678
   Parameter index mapping from coarse to fine quantization
679
680
 Arguments:
681
682
Input:
683
684
Output:
685
686
*******************************************************************************/
687
static void coarse2fine(SCHAR *data, DATA_TYPE dataType, int startBand,
688
74.4k
                        int numBands) {
689
74.4k
  int i;
690
691
737k
  for (i = startBand; i < startBand + numBands; i++) {
692
663k
    data[i] <<= 1;
693
663k
  }
694
695
74.4k
  if (dataType == t_CLD) {
696
344k
    for (i = startBand; i < startBand + numBands; i++) {
697
310k
      if (data[i] == -14)
698
120k
        data[i] = -15;
699
189k
      else if (data[i] == 14)
700
14.2k
        data[i] = 15;
701
310k
    }
702
33.3k
  }
703
74.4k
}
704
705
/*******************************************************************************
706
 Functionname: fine2coarse
707
 *******************************************************************************
708
709
 Description:
710
   Parameter index mapping from fine to coarse quantization
711
712
 Arguments:
713
714
Input:
715
716
Output:
717
718
*******************************************************************************/
719
static void fine2coarse(SCHAR *data, DATA_TYPE dataType, int startBand,
720
18.3k
                        int numBands) {
721
18.3k
  int i;
722
723
183k
  for (i = startBand; i < startBand + numBands; i++) {
724
    /* Note: the if cases below actually make a difference (negative values) */
725
164k
    if (dataType == t_CLD)
726
72.8k
      data[i] /= 2;
727
92.0k
    else
728
92.0k
      data[i] >>= 1;
729
164k
  }
730
18.3k
}
731
732
/*******************************************************************************
733
 Functionname: getStrideMap
734
 *******************************************************************************
735
736
 Description:
737
   Index Mapping accroding to pbStrides
738
739
 Arguments:
740
741
Input:
742
743
Output:
744
745
*******************************************************************************/
746
static int getStrideMap(int freqResStride, int startBand, int stopBand,
747
53.6k
                        int *aStrides) {
748
53.6k
  int i, pb, pbStride, dataBands, strOffset;
749
750
53.6k
  pbStride = pbStrideTable[freqResStride];
751
53.6k
  dataBands = (stopBand - startBand - 1) / pbStride + 1;
752
753
53.6k
  aStrides[0] = startBand;
754
259k
  for (pb = 1; pb <= dataBands; pb++) {
755
205k
    aStrides[pb] = aStrides[pb - 1] + pbStride;
756
205k
  }
757
53.6k
  strOffset = 0;
758
477k
  while (aStrides[dataBands] > stopBand) {
759
423k
    if (strOffset < dataBands) strOffset++;
760
855k
    for (i = strOffset; i <= dataBands; i++) {
761
431k
      aStrides[i]--;
762
431k
    }
763
423k
  }
764
765
53.6k
  return dataBands;
766
53.6k
}
767
768
/*******************************************************************************
769
 Functionname: ecDataDec
770
 *******************************************************************************
771
772
 Description:
773
   Do delta decoding and dequantization
774
775
 Arguments:
776
777
Input:
778
779
Output:
780
781
782
*******************************************************************************/
783
784
static SACDEC_ERROR ecDataDec(
785
    const SPATIAL_BS_FRAME *frame, UINT syntaxFlags,
786
    HANDLE_FDK_BITSTREAM bitstream, LOSSLESSDATA *const llData,
787
    SCHAR (*data)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], SCHAR **lastdata,
788
243k
    int datatype, int boxIdx, int startBand, int stopBand, SCHAR defaultValue) {
789
243k
  SACDEC_ERROR err = MPS_OK;
790
243k
  int i, j, pb, dataSets, setIdx, bsDataPair, dataBands, oldQuantCoarseXXX;
791
243k
  INT aStrides[MAX_PARAMETER_BANDS + 1] = {0};
792
793
243k
  dataSets = 0;
794
607k
  for (i = 0; i < frame->numParameterSets; i++) {
795
365k
    llData->bsXXXDataMode[i] = (SCHAR)FDKreadBits(bitstream, 2);
796
797
365k
    if ((frame->bsIndependencyFlag == 1) && (i == 0) &&
798
204k
        (llData->bsXXXDataMode[i] == 1 ||
799
204k
         llData->bsXXXDataMode[i] == 2)) { /* This check catches bitstreams
800
                                              generated by older encoder that
801
                                              cause trouble */
802
142
      return MPS_PARSE_ERROR;
803
142
    }
804
365k
    if ((i >= frame->numParameterSets - 1) &&
805
243k
        (llData->bsXXXDataMode[i] ==
806
243k
         2)) { /* The interpolation mode must not be active for the last
807
                  parameter set */
808
2.01k
      return MPS_PARSE_ERROR;
809
2.01k
    }
810
811
363k
    if (llData->bsXXXDataMode[i] == 3) {
812
77.8k
      dataSets++;
813
77.8k
    }
814
363k
  }
815
816
241k
  setIdx = 0;
817
241k
  bsDataPair = 0;
818
241k
  oldQuantCoarseXXX = llData->state->bsQuantCoarseXXXprevParse;
819
820
601k
  for (i = 0; i < frame->numParameterSets; i++) {
821
361k
    if (llData->bsXXXDataMode[i] == 0) {
822
2.45M
      for (pb = startBand; pb < stopBand; pb++) {
823
2.21M
        lastdata[boxIdx][pb] = defaultValue;
824
2.21M
      }
825
826
243k
      oldQuantCoarseXXX = 0;
827
243k
    }
828
829
361k
    if (llData->bsXXXDataMode[i] == 3) {
830
77.6k
      if (bsDataPair) {
831
23.9k
        bsDataPair = 0;
832
53.6k
      } else {
833
53.6k
        bsDataPair = FDKreadBits(bitstream, 1);
834
53.6k
        llData->bsQuantCoarseXXX[setIdx] = (UCHAR)FDKreadBits(bitstream, 1);
835
53.6k
        llData->bsFreqResStrideXXX[setIdx] = (UCHAR)FDKreadBits(bitstream, 2);
836
837
53.6k
        if (llData->bsQuantCoarseXXX[setIdx] != oldQuantCoarseXXX) {
838
24.6k
          if (oldQuantCoarseXXX) {
839
6.33k
            coarse2fine(lastdata[boxIdx], (DATA_TYPE)datatype, startBand,
840
6.33k
                        stopBand - startBand);
841
18.3k
          } else {
842
18.3k
            fine2coarse(lastdata[boxIdx], (DATA_TYPE)datatype, startBand,
843
18.3k
                        stopBand - startBand);
844
18.3k
          }
845
24.6k
        }
846
847
53.6k
        dataBands = getStrideMap(llData->bsFreqResStrideXXX[setIdx], startBand,
848
53.6k
                                 stopBand, aStrides);
849
850
259k
        for (pb = 0; pb < dataBands; pb++) {
851
205k
          lastdata[boxIdx][startBand + pb] = lastdata[boxIdx][aStrides[pb]];
852
205k
        }
853
854
53.6k
        if (boxIdx > MAX_NUM_OTT) return MPS_INVALID_BOXIDX;
855
53.6k
        if ((setIdx + bsDataPair) > MAX_PARAMETER_SETS)
856
0
          return MPS_INVALID_SETIDX;
857
858
        /* DECODER_TYPE defined in FDK_tools */
859
53.6k
        DECODER_TYPE this_decoder_type = SAC_DECODER;
860
53.6k
        if (syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) {
861
47.4k
          this_decoder_type = USAC_DECODER;
862
47.4k
        } else if (syntaxFlags & SACDEC_SYNTAX_LD) {
863
6.20k
          this_decoder_type = SAOC_DECODER;
864
6.20k
        }
865
866
53.6k
        err = (SACDEC_ERROR)EcDataPairDec(
867
53.6k
            this_decoder_type, bitstream, data[boxIdx][setIdx + 0],
868
53.6k
            data[boxIdx][setIdx + 1], lastdata[boxIdx], (DATA_TYPE)datatype,
869
53.6k
            startBand, dataBands, bsDataPair, llData->bsQuantCoarseXXX[setIdx],
870
53.6k
            !(frame->bsIndependencyFlag && (i == 0)) || (setIdx > 0));
871
53.6k
        if (err != MPS_OK) goto bail;
872
873
52.2k
        if (datatype == t_IPD) {
874
8.93k
          const SCHAR mask = (llData->bsQuantCoarseXXX[setIdx]) ? 7 : 15;
875
47.8k
          for (pb = 0; pb < dataBands; pb++) {
876
108k
            for (j = aStrides[pb]; j < aStrides[pb + 1]; j++) {
877
69.5k
              lastdata[boxIdx][j] =
878
69.5k
                  data[boxIdx][setIdx + bsDataPair][startBand + pb] & mask;
879
69.5k
            }
880
38.8k
          }
881
43.2k
        } else {
882
203k
          for (pb = 0; pb < dataBands; pb++) {
883
560k
            for (j = aStrides[pb]; j < aStrides[pb + 1]; j++) {
884
399k
              lastdata[boxIdx][j] =
885
399k
                  data[boxIdx][setIdx + bsDataPair][startBand + pb];
886
399k
            }
887
160k
          }
888
43.2k
        }
889
890
52.2k
        oldQuantCoarseXXX = llData->bsQuantCoarseXXX[setIdx];
891
892
52.2k
        if (bsDataPair) {
893
32.7k
          llData->bsQuantCoarseXXX[setIdx + 1] =
894
32.7k
              llData->bsQuantCoarseXXX[setIdx];
895
32.7k
          llData->bsFreqResStrideXXX[setIdx + 1] =
896
32.7k
              llData->bsFreqResStrideXXX[setIdx];
897
32.7k
        }
898
52.2k
        setIdx += bsDataPair + 1;
899
52.2k
      } /* !bsDataPair */
900
77.6k
    }   /* llData->bsXXXDataMode[i] == 3 */
901
361k
  }
902
903
240k
  llData->state->bsQuantCoarseXXXprevParse = oldQuantCoarseXXX;
904
905
241k
bail:
906
241k
  return err;
907
240k
}
908
909
/*******************************************************************************
910
 Functionname: parseArbitraryDownmixData
911
 *******************************************************************************
912
913
 Description:
914
915
 Arguments:
916
917
 Return:
918
919
*******************************************************************************/
920
static SACDEC_ERROR parseArbitraryDownmixData(
921
    spatialDec *self, const SPATIAL_SPECIFIC_CONFIG *pSSC,
922
    const UINT syntaxFlags, const SPATIAL_BS_FRAME *frame,
923
4.36k
    HANDLE_FDK_BITSTREAM bitstream) {
924
4.36k
  SACDEC_ERROR err = MPS_OK;
925
4.36k
  int ch;
926
4.36k
  int offset = pSSC->nOttBoxes;
927
928
  /* CLD (arbitrary down-mix gains) */
929
7.07k
  for (ch = 0; ch < pSSC->nInputChannels; ch++) {
930
4.36k
    err = ecDataDec(frame, syntaxFlags, bitstream,
931
4.36k
                    &frame->CLDLosslessData[offset + ch],
932
4.36k
                    frame->cmpArbdmxGainIdx, self->cmpArbdmxGainIdxPrev, t_CLD,
933
4.36k
                    ch, 0, pSSC->freqRes, arbdmxGainDefault);
934
4.36k
    if (err != MPS_OK) return err;
935
4.36k
  }
936
937
2.70k
  return err;
938
939
4.36k
} /* parseArbitraryDownmixData */
940
941
/*******************************************************************************
942
 Functionname: SpatialDecParseFrame
943
 *******************************************************************************
944
945
 Description:
946
947
 Arguments:
948
949
 Input:
950
951
 Output:
952
953
*******************************************************************************/
954
955
4.99k
static int nBitsParamSlot(int i) {
956
4.99k
  int bitsParamSlot;
957
958
4.99k
  bitsParamSlot = fMax(0, DFRACT_BITS - 1 - fNormz((FIXP_DBL)i));
959
4.99k
  if ((1 << bitsParamSlot) < i) {
960
91
    bitsParamSlot++;
961
91
  }
962
4.99k
  FDK_ASSERT((bitsParamSlot >= 0) && (bitsParamSlot <= 32));
963
964
4.99k
  return bitsParamSlot;
965
4.99k
}
966
967
SACDEC_ERROR SpatialDecParseFrameData(
968
    spatialDec_struct *self, SPATIAL_BS_FRAME *frame,
969
    HANDLE_FDK_BITSTREAM bitstream,
970
    const SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, UPMIXTYPE upmixType,
971
119k
    int fGlobalIndependencyFlag) {
972
119k
  SACDEC_ERROR err = MPS_OK;
973
119k
  int bsFramingType, dataBands, ps, pg, i;
974
119k
  int pb;
975
119k
  int numTempShapeChan = 0;
976
119k
  int bsNumOutputChannels =
977
119k
      treePropertyTable[pSpatialSpecificConfig->treeConfig]
978
119k
          .numOutputChannels; /* CAUTION: Maybe different to
979
                                 pSpatialSpecificConfig->treeConfig in some
980
                                 modes! */
981
119k
  int paramSetErr = 0;
982
119k
  UINT alignAnchor = FDKgetValidBits(
983
119k
      bitstream); /* Anchor for ByteAlign() function. See comment below. */
984
119k
  UINT syntaxFlags;
985
986
119k
  syntaxFlags = pSpatialSpecificConfig->syntaxFlags;
987
988
119k
  if ((syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) &&
989
112k
      pSpatialSpecificConfig->bsHighRateMode == 0) {
990
12.7k
    bsFramingType = 0; /* fixed framing */
991
12.7k
    frame->numParameterSets = 1;
992
106k
  } else {
993
106k
    bsFramingType = FDKreadBits(bitstream, 1);
994
106k
    if (syntaxFlags & SACDEC_SYNTAX_LD)
995
6.62k
      frame->numParameterSets = FDKreadBits(bitstream, 1) + 1;
996
99.8k
    else
997
99.8k
      frame->numParameterSets = FDKreadBits(bitstream, 3) + 1;
998
106k
  }
999
1000
  /* Any error after this line shall trigger parameter invalidation at bail
1001
   * label. */
1002
119k
  paramSetErr = 1;
1003
1004
119k
  if (frame->numParameterSets >= MAX_PARAMETER_SETS) {
1005
0
    goto bail;
1006
0
  }
1007
1008
  /* Basic config check. */
1009
119k
  if (pSpatialSpecificConfig->nInputChannels <= 0 ||
1010
119k
      pSpatialSpecificConfig->nOutputChannels <= 0) {
1011
0
    err = MPS_UNSUPPORTED_CONFIG;
1012
0
    goto bail;
1013
0
  }
1014
1015
119k
  if (bsFramingType) {
1016
4.99k
    int prevParamSlot = -1;
1017
4.99k
    int bitsParamSlot;
1018
1019
4.99k
    {
1020
4.99k
      bitsParamSlot = nBitsParamSlot(pSpatialSpecificConfig->nTimeSlots);
1021
1022
12.2k
      for (i = 0; i < frame->numParameterSets; i++) {
1023
7.43k
        frame->paramSlot[i] = FDKreadBits(bitstream, bitsParamSlot);
1024
        /* Sanity check */
1025
7.43k
        if ((frame->paramSlot[i] <= prevParamSlot) ||
1026
7.31k
            (frame->paramSlot[i] >= pSpatialSpecificConfig->nTimeSlots)) {
1027
208
          err = MPS_PARSE_ERROR;
1028
208
          goto bail;
1029
208
        }
1030
7.23k
        prevParamSlot = frame->paramSlot[i];
1031
7.23k
      }
1032
4.99k
    }
1033
114k
  } else {
1034
278k
    for (i = 0; i < frame->numParameterSets; i++) {
1035
163k
      frame->paramSlot[i] = ((pSpatialSpecificConfig->nTimeSlots * (i + 1)) /
1036
163k
                             frame->numParameterSets) -
1037
163k
                            1;
1038
163k
    }
1039
114k
  }
1040
1041
119k
  if ((syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) &&
1042
112k
      fGlobalIndependencyFlag) {
1043
96.2k
    frame->bsIndependencyFlag = 1;
1044
96.2k
  } else {
1045
22.7k
    frame->bsIndependencyFlag = (UCHAR)FDKreadBits(bitstream, 1);
1046
22.7k
  }
1047
1048
  /*
1049
   * OttData()
1050
   */
1051
236k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
1052
119k
    err = ecDataDec(frame, syntaxFlags, bitstream, &frame->CLDLosslessData[i],
1053
119k
                    frame->cmpOttCLDidx, self->cmpOttCLDidxPrev, t_CLD, i, 0,
1054
119k
                    pSpatialSpecificConfig->bitstreamOttBands[i],
1055
119k
                    pSpatialSpecificConfig->ottCLDdefault[i]);
1056
119k
    if (err != MPS_OK) {
1057
1.42k
      goto bail;
1058
1.42k
    }
1059
119k
  } /* i < numOttBoxes */
1060
1061
117k
  {
1062
234k
    for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
1063
117k
      err = ecDataDec(frame, syntaxFlags, bitstream, &frame->ICCLosslessData[i],
1064
117k
                      frame->cmpOttICCidx, self->cmpOttICCidxPrev, t_ICC, i, 0,
1065
117k
                      pSpatialSpecificConfig->bitstreamOttBands[i], ICCdefault);
1066
117k
      if (err != MPS_OK) {
1067
490
        goto bail;
1068
490
      }
1069
117k
    } /* i < numOttBoxes */
1070
117k
  }   /* !oneICC */
1071
1072
117k
  if ((pSpatialSpecificConfig->treeConfig == SPATIALDEC_MODE_RSVD7) &&
1073
117k
      (pSpatialSpecificConfig->bsPhaseCoding)) {
1074
9.27k
    frame->phaseMode = FDKreadBits(bitstream, 1);
1075
1076
9.27k
    if (frame->phaseMode == 0) {
1077
36.9k
      for (pb = 0; pb < pSpatialSpecificConfig->numOttBandsIPD; pb++) {
1078
30.4k
        self->cmpOttIPDidxPrev[0][pb] = 0;
1079
185k
        for (i = 0; i < frame->numParameterSets; i++) {
1080
154k
          frame->cmpOttIPDidx[0][i][pb] = 0;
1081
          // frame->ottIPDidx[0][i][pb] = 0;
1082
154k
        }
1083
        /* self->ottIPDidxPrev[0][pb] = 0; */
1084
30.4k
      }
1085
6.57k
      frame->OpdSmoothingMode = 0;
1086
6.57k
    } else {
1087
2.70k
      frame->OpdSmoothingMode = FDKreadBits(bitstream, 1);
1088
2.70k
      err = ecDataDec(frame, syntaxFlags, bitstream, &frame->IPDLosslessData[0],
1089
2.70k
                      frame->cmpOttIPDidx, self->cmpOttIPDidxPrev, t_IPD, 0, 0,
1090
2.70k
                      pSpatialSpecificConfig->numOttBandsIPD, IPDdefault);
1091
2.70k
      if (err != MPS_OK) {
1092
49
        goto bail;
1093
49
      }
1094
2.70k
    }
1095
9.27k
  }
1096
1097
  /*
1098
   * SmgData()
1099
   */
1100
1101
117k
  {
1102
117k
    if (!pSpatialSpecificConfig->bsHighRateMode &&
1103
17.3k
        (syntaxFlags & SACDEC_SYNTAX_USAC)) {
1104
25.4k
      for (ps = 0; ps < frame->numParameterSets; ps++) {
1105
12.7k
        frame->bsSmoothMode[ps] = 0;
1106
12.7k
      }
1107
104k
    } else {
1108
259k
      for (ps = 0; ps < frame->numParameterSets; ps++) {
1109
154k
        frame->bsSmoothMode[ps] = (UCHAR)FDKreadBits(bitstream, 2);
1110
154k
        if (frame->bsSmoothMode[ps] >= 2) {
1111
17.7k
          frame->bsSmoothTime[ps] = (UCHAR)FDKreadBits(bitstream, 2);
1112
17.7k
        }
1113
154k
        if (frame->bsSmoothMode[ps] == 3) {
1114
10.6k
          frame->bsFreqResStrideSmg[ps] = (UCHAR)FDKreadBits(bitstream, 2);
1115
10.6k
          dataBands = (pSpatialSpecificConfig->freqRes - 1) /
1116
10.6k
                          pbStrideTable[frame->bsFreqResStrideSmg[ps]] +
1117
10.6k
                      1;
1118
47.1k
          for (pg = 0; pg < dataBands; pg++) {
1119
36.5k
            frame->bsSmgData[ps][pg] = (UCHAR)FDKreadBits(bitstream, 1);
1120
36.5k
          }
1121
10.6k
        }
1122
154k
      } /* ps < numParameterSets */
1123
104k
    }
1124
117k
  }
1125
1126
  /*
1127
   * TempShapeData()
1128
   */
1129
117k
  if ((pSpatialSpecificConfig->tempShapeConfig == 3) &&
1130
8.65k
      (syntaxFlags & SACDEC_SYNTAX_USAC)) {
1131
8.65k
    int TsdErr;
1132
8.65k
    TsdErr = TsdRead(bitstream, pSpatialSpecificConfig->nTimeSlots,
1133
8.65k
                     &frame->TsdData[0]);
1134
8.65k
    if (TsdErr) {
1135
0
      err = MPS_PARSE_ERROR;
1136
0
      goto bail;
1137
0
    }
1138
108k
  } else {
1139
108k
    frame->TsdData[0].bsTsdEnable = 0;
1140
108k
  }
1141
1142
351k
  for (i = 0; i < bsNumOutputChannels; i++) {
1143
234k
    frame->tempShapeEnableChannelSTP[i] = 0;
1144
234k
    frame->tempShapeEnableChannelGES[i] = 0;
1145
234k
  }
1146
1147
117k
  if ((pSpatialSpecificConfig->tempShapeConfig == 1) ||
1148
112k
      (pSpatialSpecificConfig->tempShapeConfig == 2)) {
1149
101k
    int bsTempShapeEnable = FDKreadBits(bitstream, 1);
1150
101k
    if (bsTempShapeEnable) {
1151
4.48k
      numTempShapeChan =
1152
4.48k
          tempShapeChanTable[pSpatialSpecificConfig->tempShapeConfig - 1]
1153
4.48k
                            [pSpatialSpecificConfig->treeConfig];
1154
4.48k
      switch (pSpatialSpecificConfig->tempShapeConfig) {
1155
2.13k
        case 1: /* STP */
1156
6.41k
          for (i = 0; i < numTempShapeChan; i++) {
1157
4.27k
            int stpEnable = FDKreadBits(bitstream, 1);
1158
4.27k
            frame->tempShapeEnableChannelSTP[i] = stpEnable;
1159
4.27k
          }
1160
2.13k
          break;
1161
2.34k
        case 2: /* GES */
1162
2.34k
        {
1163
2.34k
          UCHAR gesChannelEnable[MAX_OUTPUT_CHANNELS];
1164
1165
7.02k
          for (i = 0; i < numTempShapeChan; i++) {
1166
4.68k
            gesChannelEnable[i] = (UCHAR)FDKreadBits(bitstream, 1);
1167
4.68k
            frame->tempShapeEnableChannelGES[i] = gesChannelEnable[i];
1168
4.68k
          }
1169
6.87k
          for (i = 0; i < numTempShapeChan; i++) {
1170
4.63k
            if (gesChannelEnable[i]) {
1171
2.44k
              int envShapeData_tmp[MAX_TIME_SLOTS];
1172
2.44k
              if (huff_dec_reshape(bitstream, envShapeData_tmp,
1173
2.44k
                                   pSpatialSpecificConfig->nTimeSlots) != 0) {
1174
110
                err = MPS_PARSE_ERROR;
1175
110
                goto bail;
1176
110
              }
1177
73.6k
              for (int ts = 0; ts < pSpatialSpecificConfig->nTimeSlots; ts++) {
1178
71.3k
                if (!(envShapeData_tmp[ts] >= 0) &&
1179
0
                    (envShapeData_tmp[ts] <= 4)) {
1180
0
                  err = MPS_PARSE_ERROR;
1181
0
                  goto bail;
1182
0
                }
1183
71.3k
                frame->bsEnvShapeData[i][ts] = (UCHAR)envShapeData_tmp[ts];
1184
71.3k
              }
1185
2.33k
            }
1186
4.63k
          }
1187
2.34k
        } break;
1188
2.23k
        default:
1189
0
          err = MPS_INVALID_TEMPSHAPE;
1190
0
          goto bail;
1191
4.48k
      }
1192
4.48k
    } /* bsTempShapeEnable */
1193
101k
  }   /* pSpatialSpecificConfig->tempShapeConfig != 0 */
1194
1195
116k
  if (pSpatialSpecificConfig->bArbitraryDownmix != 0) {
1196
4.36k
    err = parseArbitraryDownmixData(self, pSpatialSpecificConfig, syntaxFlags,
1197
4.36k
                                    frame, bitstream);
1198
4.36k
    if (err != MPS_OK) goto bail;
1199
4.36k
  }
1200
1201
115k
  if (1 && (!(syntaxFlags & (SACDEC_SYNTAX_USAC)))) {
1202
2.89k
    FDKbyteAlign(bitstream,
1203
2.89k
                 alignAnchor); /* ISO/IEC FDIS 23003-1: 5.2. ... byte alignment
1204
                                  with respect to the beginning of the syntactic
1205
                                  element in which ByteAlign() occurs. */
1206
2.89k
  }
1207
1208
119k
bail:
1209
119k
  if (err != MPS_OK && paramSetErr != 0) {
1210
    /* Since the parameter set data has already been written to the instance we
1211
     * need to ... */
1212
3.93k
    frame->numParameterSets = 0; /* ... signal that it is corrupt ... */
1213
3.93k
  }
1214
1215
119k
  return err;
1216
1217
115k
} /* SpatialDecParseFrame */
1218
1219
/*******************************************************************************
1220
 Functionname: createMapping
1221
 *******************************************************************************
1222
1223
 Description:
1224
1225
 Arguments:
1226
1227
 Return:
1228
1229
*******************************************************************************/
1230
static void createMapping(int aMap[MAX_PARAMETER_BANDS + 1], int startBand,
1231
82.6k
                          int stopBand, int stride) {
1232
82.6k
  int inBands, outBands, bandsAchived, bandsDiff, incr, k, i;
1233
82.6k
  int vDk[MAX_PARAMETER_BANDS + 1];
1234
82.6k
  inBands = stopBand - startBand;
1235
82.6k
  outBands = (inBands - 1) / stride + 1;
1236
1237
82.6k
  if (outBands < 1) {
1238
2.39k
    outBands = 1;
1239
2.39k
  }
1240
1241
82.6k
  bandsAchived = outBands * stride;
1242
82.6k
  bandsDiff = inBands - bandsAchived;
1243
332k
  for (i = 0; i < outBands; i++) {
1244
250k
    vDk[i] = stride;
1245
250k
  }
1246
1247
82.6k
  if (bandsDiff > 0) {
1248
0
    incr = -1;
1249
0
    k = outBands - 1;
1250
82.6k
  } else {
1251
82.6k
    incr = 1;
1252
82.6k
    k = 0;
1253
82.6k
  }
1254
1255
873k
  while (bandsDiff != 0) {
1256
790k
    vDk[k] = vDk[k] - incr;
1257
790k
    k = k + incr;
1258
790k
    bandsDiff = bandsDiff + incr;
1259
790k
    if (k >= outBands) {
1260
785k
      if (bandsDiff > 0) {
1261
0
        k = outBands - 1;
1262
785k
      } else if (bandsDiff < 0) {
1263
743k
        k = 0;
1264
743k
      }
1265
785k
    }
1266
790k
  }
1267
82.6k
  aMap[0] = startBand;
1268
332k
  for (i = 0; i < outBands; i++) {
1269
250k
    aMap[i + 1] = aMap[i] + vDk[i];
1270
250k
  }
1271
82.6k
} /* createMapping */
1272
1273
/*******************************************************************************
1274
 Functionname: mapFrequency
1275
 *******************************************************************************
1276
1277
 Description:
1278
1279
 Arguments:
1280
1281
 Return:
1282
1283
*******************************************************************************/
1284
static void mapFrequency(const SCHAR *pInput, /* Input */
1285
                         SCHAR *pOutput,      /* Output */
1286
                         int *pMap,           /* Mapping function */
1287
                         int dataBands)       /* Number of data Bands */
1288
73.2k
{
1289
73.2k
  int i, j;
1290
73.2k
  int startBand0 = pMap[0];
1291
1292
290k
  for (i = 0; i < dataBands; i++) {
1293
216k
    int startBand, stopBand, value;
1294
1295
216k
    value = pInput[i + startBand0];
1296
1297
216k
    startBand = pMap[i];
1298
216k
    stopBand = pMap[i + 1];
1299
863k
    for (j = startBand; j < stopBand; j++) {
1300
646k
      pOutput[j] = value;
1301
646k
    }
1302
216k
  }
1303
73.2k
}
1304
1305
/*******************************************************************************
1306
 Functionname: deq
1307
 *******************************************************************************
1308
1309
 Description:
1310
1311
 Arguments:
1312
1313
 Return:
1314
1315
*******************************************************************************/
1316
4.65M
static int deqIdx(int value, int paramType) {
1317
4.65M
  int idx = -1;
1318
1319
4.65M
  switch (paramType) {
1320
2.28M
    case t_CLD:
1321
2.28M
      if (((value + 15) >= 0) && ((value + 15) < 31)) {
1322
2.23M
        idx = (value + 15);
1323
2.23M
      }
1324
2.28M
      break;
1325
1326
2.02M
    case t_ICC:
1327
2.02M
      if ((value >= 0) && (value < 8)) {
1328
1.96M
        idx = value;
1329
1.96M
      }
1330
2.02M
      break;
1331
1332
347k
    case t_IPD:
1333
      /* (+/-)15 * MAX_PARAMETER_BANDS for differential coding in frequency
1334
       * domain (according to rbl) */
1335
347k
      if ((value >= -420) && (value <= 420)) {
1336
347k
        idx = (value & 0xf);
1337
347k
      }
1338
347k
      break;
1339
1340
0
    default:
1341
0
      FDK_ASSERT(0);
1342
4.65M
  }
1343
1344
4.65M
  return idx;
1345
4.65M
}
1346
1347
  /*******************************************************************************
1348
   Functionname: factorFunct
1349
   *******************************************************************************
1350
1351
   Description:
1352
1353
   Arguments:
1354
1355
   Return:
1356
1357
  *******************************************************************************/
1358
1359
0
#define SF_IDX (7)
1360
0
#define SF_FACTOR (3)
1361
#define SCALE_FACTOR (1 << SF_FACTOR)
1362
#define SCALE_CLD_C1C2 (1 << SF_CLD_C1C2)
1363
1364
0
static FIXP_DBL factorFunct(FIXP_DBL ottVsTotDb, INT quantMode) {
1365
0
  FIXP_DBL factor;
1366
1367
0
  if (ottVsTotDb > FL2FXCONST_DBL(0.0)) {
1368
0
    ottVsTotDb = FL2FXCONST_DBL(0.0);
1369
0
  }
1370
1371
0
  ottVsTotDb = -ottVsTotDb;
1372
1373
0
  switch (quantMode) {
1374
0
    case 0:
1375
0
      factor = FL2FXCONST_DBL(1.0f / SCALE_FACTOR);
1376
0
      break;
1377
0
    case 1:
1378
0
      if (ottVsTotDb >= FL2FXCONST_DBL(21.0f / SCALE_CLD_C1C2))
1379
0
        factor = FL2FXCONST_DBL(5.0f / SCALE_FACTOR);
1380
0
      else if (ottVsTotDb <= FL2FXCONST_DBL(1.0f / SCALE_CLD_C1C2))
1381
0
        factor = FL2FXCONST_DBL(1.0f / SCALE_FACTOR);
1382
0
      else
1383
0
        factor = (fMult(FL2FXCONST_DBL(0.2f), ottVsTotDb) +
1384
0
                  FL2FXCONST_DBL(0.8f / SCALE_CLD_C1C2))
1385
0
                 << (SF_CLD_C1C2 - SF_FACTOR);
1386
0
      break;
1387
0
    case 2:
1388
0
      if (ottVsTotDb >= FL2FXCONST_DBL(25.0f / SCALE_CLD_C1C2)) {
1389
0
        FDK_ASSERT(SF_FACTOR == 3);
1390
0
        factor = (FIXP_DBL)
1391
0
            MAXVAL_DBL; /* avoid warning: FL2FXCONST_DBL(8.0f/SCALE_FACTOR) */
1392
0
      } else if (ottVsTotDb <= FL2FXCONST_DBL(1.0f / SCALE_CLD_C1C2))
1393
0
        factor = FL2FXCONST_DBL(1.0f / SCALE_FACTOR);
1394
0
      else
1395
0
        factor = (fMult(FL2FXCONST_DBL(7.0f / 24.0f), ottVsTotDb) +
1396
0
                  FL2FXCONST_DBL((17.0f / 24.0f) / SCALE_CLD_C1C2))
1397
0
                 << (SF_CLD_C1C2 - SF_FACTOR);
1398
0
      break;
1399
0
    default:
1400
0
      factor = FL2FXCONST_DBL(0.0f);
1401
0
  }
1402
1403
0
  return (factor);
1404
0
}
1405
1406
/*******************************************************************************
1407
 Functionname: factorCLD
1408
 *******************************************************************************
1409
1410
 Description:
1411
1412
 Arguments:
1413
1414
 Return:
1415
1416
*******************************************************************************/
1417
static void factorCLD(SCHAR *idx, FIXP_DBL ottVsTotDb, FIXP_DBL *ottVsTotDb1,
1418
                      FIXP_DBL *ottVsTotDb2, SCHAR ottVsTotDbMode,
1419
0
                      INT quantMode) {
1420
0
  FIXP_DBL factor;
1421
0
  FIXP_DBL cldIdxFract;
1422
0
  INT cldIdx;
1423
1424
0
  factor = factorFunct(ottVsTotDb, quantMode);
1425
1426
0
  cldIdxFract =
1427
0
      fMult((FIXP_DBL)((*idx) << ((DFRACT_BITS - 1) - SF_IDX)), factor);
1428
0
  cldIdxFract += FL2FXCONST_DBL(15.5f / (1 << (SF_FACTOR + SF_IDX)));
1429
0
  cldIdx = fixp_truncateToInt(cldIdxFract, SF_FACTOR + SF_IDX);
1430
1431
0
  cldIdx = fMin(cldIdx, 30);
1432
0
  cldIdx = fMax(cldIdx, 0);
1433
1434
0
  *idx = cldIdx - 15;
1435
1436
0
  if (ottVsTotDbMode & ottVsTotDb1Activ)
1437
0
    (*ottVsTotDb1) = ottVsTotDb + dequantCLD_c1[cldIdx];
1438
1439
0
  if (ottVsTotDbMode & ottVsTotDb2Activ)
1440
0
    (*ottVsTotDb2) = ottVsTotDb + dequantCLD_c1[30 - cldIdx];
1441
0
}
1442
1443
/*******************************************************************************
1444
 Functionname: mapIndexData
1445
 *******************************************************************************
1446
1447
 Description:
1448
1449
 Arguments:
1450
1451
 Return:
1452
1453
*******************************************************************************/
1454
static SACDEC_ERROR mapIndexData(
1455
    LOSSLESSDATA *llData, SCHAR ***outputDataIdx, SCHAR ***outputIdxData,
1456
    const SCHAR (*cmpIdxData)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1457
    SCHAR ***diffIdxData, SCHAR xttIdx, SCHAR **idxPrev, int paramIdx,
1458
    int paramType, int startBand, int stopBand, SCHAR defaultValue,
1459
    int numParameterSets, const int *paramSlot, int extendFrame, int quantMode,
1460
    SpatialDecConcealmentInfo *concealmentInfo, SCHAR ottVsTotDbMode,
1461
    FIXP_DBL (*pOttVsTotDbIn)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1462
    FIXP_DBL (*pOttVsTotDb1)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1463
391k
    FIXP_DBL (*pOttVsTotDb2)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]) {
1464
391k
  int aParamSlots[MAX_PARAMETER_SETS];
1465
391k
  int aInterpolate[MAX_PARAMETER_SETS] = {0};
1466
1467
391k
  int dataSets;
1468
391k
  int aMap[MAX_PARAMETER_BANDS + 1];
1469
1470
391k
  int setIdx, i, band, parmSlot;
1471
391k
  int dataBands;
1472
391k
  int ps, pb;
1473
391k
  int i1;
1474
1475
391k
  if (numParameterSets > MAX_PARAMETER_SETS) return MPS_WRONG_PARAMETERSETS;
1476
1477
391k
  dataSets = 0;
1478
911k
  for (i = 0; i < numParameterSets; i++) {
1479
520k
    if (llData->bsXXXDataMode[i] == 3) {
1480
80.3k
      aParamSlots[dataSets] = i;
1481
80.3k
      dataSets++;
1482
80.3k
    }
1483
520k
  }
1484
1485
391k
  setIdx = 0;
1486
1487
  /* Main concealment stage is here: */
1488
391k
  SpatialDecConcealment_Apply(
1489
391k
      concealmentInfo, cmpIdxData[xttIdx],
1490
391k
      (diffIdxData != NULL) ? diffIdxData[xttIdx] : NULL, idxPrev[xttIdx],
1491
391k
      llData->bsXXXDataMode, startBand, stopBand, defaultValue, paramType,
1492
391k
      numParameterSets);
1493
1494
  /* Prepare data */
1495
911k
  for (i = 0; i < numParameterSets; i++) {
1496
520k
    if (llData->bsXXXDataMode[i] == 0) {
1497
350k
      llData->nocmpQuantCoarseXXX[i] = 0;
1498
3.30M
      for (band = startBand; band < stopBand; band++) {
1499
2.95M
        outputIdxData[xttIdx][i][band] = defaultValue;
1500
2.95M
      }
1501
3.30M
      for (band = startBand; band < stopBand; band++) {
1502
2.95M
        idxPrev[xttIdx][band] = outputIdxData[xttIdx][i][band];
1503
2.95M
      }
1504
      /* Because the idxPrev are also set to the defaultValue -> signalize fine
1505
       */
1506
350k
      llData->state->bsQuantCoarseXXXprev = 0;
1507
350k
    }
1508
1509
520k
    if (llData->bsXXXDataMode[i] == 1) {
1510
932k
      for (band = startBand; band < stopBand; band++) {
1511
856k
        outputIdxData[xttIdx][i][band] = idxPrev[xttIdx][band];
1512
856k
      }
1513
76.3k
      llData->nocmpQuantCoarseXXX[i] = llData->state->bsQuantCoarseXXXprev;
1514
76.3k
    }
1515
1516
520k
    if (llData->bsXXXDataMode[i] == 2) {
1517
218k
      for (band = startBand; band < stopBand; band++) {
1518
198k
        outputIdxData[xttIdx][i][band] = idxPrev[xttIdx][band];
1519
198k
      }
1520
20.0k
      llData->nocmpQuantCoarseXXX[i] = llData->state->bsQuantCoarseXXXprev;
1521
20.0k
      aInterpolate[i] = 1;
1522
499k
    } else {
1523
499k
      aInterpolate[i] = 0;
1524
499k
    }
1525
1526
520k
    if (llData->bsXXXDataMode[i] == 3) {
1527
73.2k
      int stride;
1528
1529
73.2k
      parmSlot = aParamSlots[setIdx];
1530
73.2k
      stride = pbStrideTable[llData->bsFreqResStrideXXX[setIdx]];
1531
73.2k
      dataBands = (stopBand - startBand - 1) / stride + 1;
1532
73.2k
      createMapping(aMap, startBand, stopBand, stride);
1533
73.2k
      mapFrequency(&cmpIdxData[xttIdx][setIdx][0],
1534
73.2k
                   &outputIdxData[xttIdx][parmSlot][0], aMap, dataBands);
1535
719k
      for (band = startBand; band < stopBand; band++) {
1536
646k
        idxPrev[xttIdx][band] = outputIdxData[xttIdx][parmSlot][band];
1537
646k
      }
1538
73.2k
      llData->state->bsQuantCoarseXXXprev = llData->bsQuantCoarseXXX[setIdx];
1539
73.2k
      llData->nocmpQuantCoarseXXX[i] = llData->bsQuantCoarseXXX[setIdx];
1540
1541
73.2k
      setIdx++;
1542
73.2k
    }
1543
520k
    if (diffIdxData != NULL) {
1544
2.23M
      for (band = startBand; band < stopBand; band++) {
1545
2.02M
        outputIdxData[xttIdx][i][band] += diffIdxData[xttIdx][i][band];
1546
2.02M
      }
1547
215k
    }
1548
520k
  } /* for( i = 0 ; i < numParameterSets; i++ ) */
1549
1550
  /* Map all coarse data to fine */
1551
911k
  for (i = 0; i < numParameterSets; i++) {
1552
520k
    if (llData->nocmpQuantCoarseXXX[i] == 1) {
1553
68.1k
      coarse2fine(outputIdxData[xttIdx][i], (DATA_TYPE)paramType, startBand,
1554
68.1k
                  stopBand - startBand);
1555
68.1k
      llData->nocmpQuantCoarseXXX[i] = 0;
1556
68.1k
    }
1557
520k
  }
1558
1559
  /* Interpolate */
1560
391k
  i1 = 0;
1561
911k
  for (i = 0; i < numParameterSets; i++) {
1562
520k
    if (aInterpolate[i] != 1) {
1563
499k
      i1 = i;
1564
499k
    } else {
1565
20.0k
      int xi, i2, x1, x2;
1566
1567
49.3k
      for (i2 = i; i2 < numParameterSets; i2++) {
1568
49.0k
        if (aInterpolate[i2] != 1) break;
1569
49.0k
      }
1570
20.0k
      if (i2 >= numParameterSets) return MPS_WRONG_PARAMETERSETS;
1571
1572
19.7k
      x1 = paramSlot[i1];
1573
19.7k
      xi = paramSlot[i];
1574
19.7k
      x2 = paramSlot[i2];
1575
1576
217k
      for (band = startBand; band < stopBand; band++) {
1577
197k
        int yi, y1, y2;
1578
197k
        y1 = outputIdxData[xttIdx][i1][band];
1579
197k
        y2 = outputIdxData[xttIdx][i2][band];
1580
197k
        if (x1 != x2) {
1581
197k
          yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1582
197k
        } else {
1583
0
          yi = y1 /*+ (xi-x1)*(y2-y1)/1e-12*/;
1584
0
        }
1585
197k
        outputIdxData[xttIdx][i][band] = yi;
1586
197k
      }
1587
19.7k
    }
1588
520k
  } /* for( i = 0 ; i < numParameterSets; i++ ) */
1589
1590
  /* Dequantize data and apply factorCLD if necessary */
1591
911k
  for (ps = 0; ps < numParameterSets; ps++) {
1592
519k
    if (quantMode && (paramType == t_CLD)) {
1593
0
      if (pOttVsTotDbIn == 0) return MPS_WRONG_OTT;
1594
0
      if ((pOttVsTotDb1 == 0) && (ottVsTotDbMode & ottVsTotDb1Activ))
1595
0
        return MPS_WRONG_OTT;
1596
0
      if ((pOttVsTotDb2 == 0) && (ottVsTotDbMode & ottVsTotDb2Activ))
1597
0
        return MPS_WRONG_OTT;
1598
1599
0
      for (pb = startBand; pb < stopBand; pb++) {
1600
0
        factorCLD(&(outputIdxData[xttIdx][ps][pb]), (*pOttVsTotDbIn)[ps][pb],
1601
0
                  (pOttVsTotDb1 != NULL) ? &((*pOttVsTotDb1)[ps][pb]) : NULL,
1602
0
                  (pOttVsTotDb2 != NULL) ? &((*pOttVsTotDb2)[ps][pb]) : NULL,
1603
0
                  ottVsTotDbMode, quantMode);
1604
0
      }
1605
0
    }
1606
1607
    /* Dequantize data */
1608
5.17M
    for (band = startBand; band < stopBand; band++) {
1609
4.65M
      outputDataIdx[xttIdx][ps][band] =
1610
4.65M
          deqIdx(outputIdxData[xttIdx][ps][band], paramType);
1611
4.65M
      if (outputDataIdx[xttIdx][ps][band] == -1) {
1612
107k
        outputDataIdx[xttIdx][ps][band] = defaultValue;
1613
107k
      }
1614
4.65M
    }
1615
519k
  } /* for( i = 0 ; i < numParameterSets; i++ ) */
1616
1617
391k
  if (extendFrame) {
1618
7.37k
    if (paramType == t_IPD) {
1619
1.07k
      llData->bsQuantCoarseXXX[numParameterSets] =
1620
1.07k
          llData->bsQuantCoarseXXX[numParameterSets - 1];
1621
1.07k
    }
1622
61.0k
    for (band = startBand; band < stopBand; band++) {
1623
53.7k
      outputDataIdx[xttIdx][numParameterSets][band] =
1624
53.7k
          outputDataIdx[xttIdx][numParameterSets - 1][band];
1625
53.7k
    }
1626
7.37k
  }
1627
1628
391k
  return MPS_OK;
1629
391k
}
1630
1631
/*******************************************************************************
1632
 Functionname: decodeAndMapFrameOtt
1633
 *******************************************************************************
1634
1635
 Description:
1636
   Do delta decoding and dequantization
1637
1638
 Arguments:
1639
1640
Input:
1641
1642
Output:
1643
1644
*******************************************************************************/
1645
static SACDEC_ERROR decodeAndMapFrameOtt(HANDLE_SPATIAL_DEC self,
1646
185k
                                         SPATIAL_BS_FRAME *pCurBs) {
1647
185k
  int i, ottIdx;
1648
185k
  int numOttBoxes;
1649
1650
185k
  SACDEC_ERROR err = MPS_OK;
1651
1652
185k
  numOttBoxes = self->numOttBoxes;
1653
1654
185k
  switch (self->treeConfig) {
1655
185k
    default: {
1656
185k
      if (self->quantMode != 0) {
1657
17.2k
        goto bail;
1658
17.2k
      }
1659
185k
    }
1660
336k
      for (i = 0; i < numOttBoxes; i++) {
1661
168k
        err = mapIndexData(
1662
168k
            &pCurBs->CLDLosslessData[i], /* LOSSLESSDATA *llData,*/
1663
168k
            self->ottCLD__FDK, self->outIdxData,
1664
168k
            pCurBs
1665
168k
                ->cmpOttCLDidx, /* int
1666
                                   cmpIdxData[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1667
                                 */
1668
168k
            NULL,               /* no differential data */
1669
168k
            i, /*  int   xttIdx,  Which ott/ttt index to use for input and
1670
                  output buffers */
1671
168k
            self->ottCLDidxPrev,                        /* int
1672
                                                           idxPrev[MAX_NUM_OTT][MAX_PARAMETER_BANDS],
1673
                                                         */
1674
168k
            i, t_CLD, 0,                                /* int   startBand, */
1675
168k
            self->pConfigCurrent->bitstreamOttBands[i], /*  int   stopBand, */
1676
168k
            self->pConfigCurrent->ottCLDdefault[i], /* int   defaultValue, */
1677
168k
            pCurBs->numParameterSets, /* int   numParameterSets) */
1678
168k
            pCurBs->paramSlot, self->extendFrame, self->quantMode,
1679
168k
            &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1680
168k
        if (err != MPS_OK) goto bail;
1681
1682
168k
      } /* for(i = 0; i < numOttBoxes ; i++ ) */
1683
168k
      break;
1684
185k
  } /* case */
1685
1686
336k
  for (ottIdx = 0; ottIdx < numOttBoxes; ottIdx++) {
1687
    /* Read ICC */
1688
168k
    err = mapIndexData(
1689
168k
        &pCurBs->ICCLosslessData[ottIdx], /* LOSSLESSDATA *llData,*/
1690
168k
        self->ottICC__FDK, self->outIdxData,
1691
168k
        pCurBs
1692
168k
            ->cmpOttICCidx,  /* int
1693
                                cmpIdxData[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1694
                              */
1695
168k
        self->ottICCdiffidx, /* differential data */
1696
168k
        ottIdx, /* int   xttIdx,  Which ott/ttt index to use for input and
1697
                   output buffers */
1698
168k
        self->ottICCidxPrev, /* int   idxPrev[MAX_NUM_OTT][MAX_PARAMETER_BANDS],
1699
                              */
1700
168k
        ottIdx, t_ICC, 0,    /* int   startBand, */
1701
168k
        self->pConfigCurrent->bitstreamOttBands[ottIdx], /* int   stopBand, */
1702
168k
        ICCdefault,               /* int   defaultValue, */
1703
168k
        pCurBs->numParameterSets, /* int   numParameterSets) */
1704
168k
        pCurBs->paramSlot, self->extendFrame, self->quantMode,
1705
168k
        &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1706
168k
    if (err != MPS_OK) goto bail;
1707
168k
  } /* ottIdx */
1708
1709
168k
  if ((self->treeConfig == TREE_212) && (self->phaseCoding)) {
1710
15.4k
    if (pCurBs->phaseMode == 0) {
1711
88.2k
      for (int pb = 0; pb < self->pConfigCurrent->numOttBandsIPD; pb++) {
1712
76.0k
        self->ottIPDidxPrev[0][pb] = 0;
1713
76.0k
      }
1714
12.1k
    }
1715
30.8k
    for (ottIdx = 0; ottIdx < numOttBoxes; ottIdx++) {
1716
15.4k
      err = mapIndexData(
1717
15.4k
          &pCurBs->IPDLosslessData[ottIdx], self->ottIPD__FDK, self->outIdxData,
1718
15.4k
          pCurBs->cmpOttIPDidx, NULL, ottIdx, self->ottIPDidxPrev, ottIdx,
1719
15.4k
          t_IPD, 0, self->numOttBandsIPD, IPDdefault, pCurBs->numParameterSets,
1720
15.4k
          pCurBs->paramSlot, self->extendFrame, self->quantMode,
1721
15.4k
          &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1722
15.4k
    }
1723
15.4k
  }
1724
1725
185k
bail:
1726
1727
185k
  return MPS_OK;
1728
1729
168k
} /* decodeAndMapFrameOtt */
1730
1731
/*******************************************************************************
1732
 Functionname: decodeAndMapFrameSmg
1733
 *******************************************************************************
1734
1735
 Description:
1736
   Decode smoothing flags
1737
1738
 Arguments:
1739
1740
Input:
1741
1742
Output:
1743
1744
1745
*******************************************************************************/
1746
static SACDEC_ERROR decodeAndMapFrameSmg(HANDLE_SPATIAL_DEC self,
1747
185k
                                         const SPATIAL_BS_FRAME *frame) {
1748
185k
  int ps, pb, pg, pbStride, dataBands, pbStart, pbStop,
1749
185k
      aGroupToBand[MAX_PARAMETER_BANDS + 1];
1750
1751
185k
  if (frame->numParameterSets > MAX_PARAMETER_SETS)
1752
0
    return MPS_WRONG_PARAMETERSETS;
1753
185k
  if (self->bitstreamParameterBands > MAX_PARAMETER_BANDS)
1754
0
    return MPS_WRONG_PARAMETERBANDS;
1755
1756
418k
  for (ps = 0; ps < frame->numParameterSets; ps++) {
1757
232k
    switch (frame->bsSmoothMode[ps]) {
1758
207k
      case 0:
1759
207k
        self->smgTime[ps] = 256;
1760
207k
        FDKmemclear(self->smgData[ps],
1761
207k
                    self->bitstreamParameterBands * sizeof(UCHAR));
1762
207k
        break;
1763
1764
10.0k
      case 1:
1765
10.0k
        if (ps > 0) {
1766
8.59k
          self->smgTime[ps] = self->smgTime[ps - 1];
1767
8.59k
          FDKmemcpy(self->smgData[ps], self->smgData[ps - 1],
1768
8.59k
                    self->bitstreamParameterBands * sizeof(UCHAR));
1769
8.59k
        } else {
1770
1.46k
          self->smgTime[ps] = self->smoothState->prevSmgTime;
1771
1.46k
          FDKmemcpy(self->smgData[ps], self->smoothState->prevSmgData,
1772
1.46k
                    self->bitstreamParameterBands * sizeof(UCHAR));
1773
1.46k
        }
1774
10.0k
        break;
1775
1776
5.70k
      case 2:
1777
5.70k
        self->smgTime[ps] = smgTimeTable[frame->bsSmoothTime[ps]];
1778
61.6k
        for (pb = 0; pb < self->bitstreamParameterBands; pb++) {
1779
55.9k
          self->smgData[ps][pb] = 1;
1780
55.9k
        }
1781
5.70k
        break;
1782
1783
9.40k
      case 3:
1784
9.40k
        self->smgTime[ps] = smgTimeTable[frame->bsSmoothTime[ps]];
1785
9.40k
        pbStride = pbStrideTable[frame->bsFreqResStrideSmg[ps]];
1786
9.40k
        dataBands = (self->bitstreamParameterBands - 1) / pbStride + 1;
1787
9.40k
        createMapping(aGroupToBand, 0, self->bitstreamParameterBands, pbStride);
1788
40.1k
        for (pg = 0; pg < dataBands; pg++) {
1789
30.7k
          pbStart = aGroupToBand[pg];
1790
30.7k
          pbStop = aGroupToBand[pg + 1];
1791
114k
          for (pb = pbStart; pb < pbStop; pb++) {
1792
83.9k
            self->smgData[ps][pb] = frame->bsSmgData[ps][pg];
1793
83.9k
          }
1794
30.7k
        }
1795
9.40k
        break;
1796
232k
    }
1797
232k
  }
1798
1799
185k
  self->smoothState->prevSmgTime = self->smgTime[frame->numParameterSets - 1];
1800
185k
  FDKmemcpy(self->smoothState->prevSmgData,
1801
185k
            self->smgData[frame->numParameterSets - 1],
1802
185k
            self->bitstreamParameterBands * sizeof(UCHAR));
1803
1804
185k
  if (self->extendFrame) {
1805
3.14k
    self->smgTime[frame->numParameterSets] =
1806
3.14k
        self->smgTime[frame->numParameterSets - 1];
1807
3.14k
    FDKmemcpy(self->smgData[frame->numParameterSets],
1808
3.14k
              self->smgData[frame->numParameterSets - 1],
1809
3.14k
              self->bitstreamParameterBands * sizeof(UCHAR));
1810
3.14k
  }
1811
1812
185k
  return MPS_OK;
1813
185k
}
1814
1815
/*******************************************************************************
1816
 Functionname: decodeAndMapFrameArbdmx
1817
 *******************************************************************************
1818
1819
 Description:
1820
   Do delta decoding and dequantization
1821
1822
 Arguments:
1823
1824
Input:
1825
1826
Output:
1827
1828
*******************************************************************************/
1829
static SACDEC_ERROR decodeAndMapFrameArbdmx(HANDLE_SPATIAL_DEC self,
1830
39.4k
                                            const SPATIAL_BS_FRAME *frame) {
1831
39.4k
  SACDEC_ERROR err = MPS_OK;
1832
39.4k
  int ch;
1833
39.4k
  int offset = self->numOttBoxes;
1834
1835
78.8k
  for (ch = 0; ch < self->numInputChannels; ch++) {
1836
39.4k
    err = mapIndexData(&frame->CLDLosslessData[offset + ch],
1837
39.4k
                       self->arbdmxGain__FDK, self->outIdxData,
1838
39.4k
                       frame->cmpArbdmxGainIdx, NULL, /* no differential data */
1839
39.4k
                       ch, self->arbdmxGainIdxPrev, offset + ch, t_CLD, 0,
1840
39.4k
                       self->bitstreamParameterBands,
1841
39.4k
                       0 /*self->arbdmxGainDefault*/, frame->numParameterSets,
1842
39.4k
                       frame->paramSlot, self->extendFrame, 0,
1843
39.4k
                       &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1844
39.4k
    if (err != MPS_OK) goto bail;
1845
39.4k
  }
1846
1847
39.4k
bail:
1848
39.4k
  return err;
1849
39.4k
} /* decodeAndMapFrameArbdmx */
1850
1851
/*******************************************************************************
1852
 Functionname: SpatialDecDecodeFrame
1853
 *******************************************************************************
1854
1855
 Description:
1856
1857
 Arguments:
1858
1859
 Return:
1860
1861
*******************************************************************************/
1862
185k
SACDEC_ERROR SpatialDecDecodeFrame(spatialDec *self, SPATIAL_BS_FRAME *frame) {
1863
185k
  SACDEC_ERROR err = MPS_OK;
1864
1865
185k
  self->extendFrame = 0;
1866
185k
  if (frame->paramSlot[frame->numParameterSets - 1] != self->timeSlots - 1) {
1867
3.14k
    self->extendFrame = 1;
1868
3.14k
  }
1869
1870
185k
  self->TsdTs = 0;
1871
1872
  /****** DTDF and MAP DATA ********/
1873
185k
  if ((err = decodeAndMapFrameOtt(self, frame)) != MPS_OK) goto bail;
1874
1875
185k
  if ((err = decodeAndMapFrameSmg(self, frame)) != MPS_OK) goto bail;
1876
1877
185k
  if (self->arbitraryDownmix != 0) {
1878
39.4k
    if ((err = decodeAndMapFrameArbdmx(self, frame)) != MPS_OK) goto bail;
1879
39.4k
  }
1880
1881
185k
  if (self->extendFrame) {
1882
3.14k
    frame->numParameterSets =
1883
3.14k
        fixMin(MAX_PARAMETER_SETS, frame->numParameterSets + 1);
1884
3.14k
    frame->paramSlot[frame->numParameterSets - 1] = self->timeSlots - 1;
1885
1886
11.5k
    for (int p = 0; p < frame->numParameterSets; p++) {
1887
8.43k
      if (frame->paramSlot[p] > self->timeSlots - 1) {
1888
0
        frame->paramSlot[p] = self->timeSlots - 1;
1889
0
        err = MPS_PARSE_ERROR;
1890
0
      }
1891
8.43k
    }
1892
3.14k
    if (err != MPS_OK) {
1893
0
      goto bail;
1894
0
    }
1895
3.14k
  }
1896
1897
185k
bail:
1898
185k
  return err;
1899
185k
} /* SpatialDecDecodeFrame() */
1900
1901
/*******************************************************************************
1902
 Functionname: SpatialDecodeHeader
1903
 *******************************************************************************
1904
1905
 Description:
1906
1907
 Arguments:
1908
1909
 Return:
1910
1911
*******************************************************************************/
1912
1913
SACDEC_ERROR SpatialDecDecodeHeader(
1914
60.7k
    spatialDec *self, SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig) {
1915
60.7k
  SACDEC_ERROR err = MPS_OK;
1916
60.7k
  int i;
1917
1918
60.7k
  self->samplingFreq = pSpatialSpecificConfig->samplingFreq;
1919
60.7k
  self->timeSlots = pSpatialSpecificConfig->nTimeSlots;
1920
60.7k
  self->frameLength = self->timeSlots * self->qmfBands;
1921
60.7k
  self->bitstreamParameterBands = pSpatialSpecificConfig->freqRes;
1922
1923
60.7k
  if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD)
1924
32.2k
    self->hybridBands = self->qmfBands;
1925
28.5k
  else
1926
28.5k
    self->hybridBands = SacGetHybridSubbands(self->qmfBands);
1927
60.7k
  self->tp_hybBandBorder = 12;
1928
1929
60.7k
  self->numParameterBands = self->bitstreamParameterBands;
1930
1931
60.7k
  if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) {
1932
32.2k
    switch (self->numParameterBands) {
1933
612
      case 4:
1934
612
        self->kernels = kernels_4_to_64;
1935
612
        break;
1936
14.0k
      case 5:
1937
14.0k
        self->kernels = kernels_5_to_64;
1938
14.0k
        break;
1939
307
      case 7:
1940
307
        self->kernels = kernels_7_to_64;
1941
307
        break;
1942
12.6k
      case 9:
1943
12.6k
        self->kernels = kernels_9_to_64;
1944
12.6k
        break;
1945
321
      case 12:
1946
321
        self->kernels = kernels_12_to_64;
1947
321
        break;
1948
1.38k
      case 15:
1949
1.38k
        self->kernels = kernels_15_to_64;
1950
1.38k
        break;
1951
2.03k
      case 23:
1952
2.03k
        self->kernels = kernels_23_to_64;
1953
2.03k
        break;
1954
840
      default:
1955
840
        return MPS_INVALID_PARAMETERBANDS; /* unsupported numParameterBands */
1956
32.2k
    }
1957
32.2k
  } else {
1958
28.5k
    switch (self->numParameterBands) {
1959
946
      case 4:
1960
946
        self->kernels = kernels_4_to_71;
1961
946
        break;
1962
1.31k
      case 5:
1963
1.31k
        self->kernels = kernels_5_to_71;
1964
1.31k
        break;
1965
11.4k
      case 7:
1966
11.4k
        self->kernels = kernels_7_to_71;
1967
11.4k
        break;
1968
5.22k
      case 10:
1969
5.22k
        self->kernels = kernels_10_to_71;
1970
5.22k
        break;
1971
1.62k
      case 14:
1972
1.62k
        self->kernels = kernels_14_to_71;
1973
1.62k
        break;
1974
5.00k
      case 20:
1975
5.00k
        self->kernels = kernels_20_to_71;
1976
5.00k
        break;
1977
2.94k
      case 28:
1978
2.94k
        self->kernels = kernels_28_to_71;
1979
2.94k
        break;
1980
0
      default:
1981
0
        return MPS_INVALID_PARAMETERBANDS; /* unsupported numParameterBands */
1982
28.5k
    }
1983
28.5k
  }
1984
1985
  /* create param to hyb band table */
1986
59.9k
  FDKmemclear(self->param2hyb, (MAX_PARAMETER_BANDS + 1) * sizeof(int));
1987
2.94M
  for (i = 0; i < self->hybridBands; i++) {
1988
2.89M
    self->param2hyb[self->kernels[i] + 1] = i + 1;
1989
2.89M
  }
1990
59.9k
  {
1991
59.9k
    int pb = self->kernels[i - 1] + 2;
1992
1.14M
    for (; pb < (MAX_PARAMETER_BANDS + 1); pb++) {
1993
1.08M
      self->param2hyb[pb] = i;
1994
1.08M
    }
1995
1.73M
    for (pb = 0; pb < MAX_PARAMETER_BANDS; pb += 1) {
1996
1.67M
      self->kernels_width[pb] = self->param2hyb[pb + 1] - self->param2hyb[pb];
1997
1.67M
    }
1998
59.9k
  }
1999
2000
59.9k
  self->treeConfig = pSpatialSpecificConfig->treeConfig;
2001
2002
59.9k
  self->numOttBoxes = pSpatialSpecificConfig->nOttBoxes;
2003
2004
59.9k
  self->numInputChannels = pSpatialSpecificConfig->nInputChannels;
2005
2006
59.9k
  self->numOutputChannels = pSpatialSpecificConfig->nOutputChannels;
2007
2008
59.9k
  self->quantMode = pSpatialSpecificConfig->quantMode;
2009
2010
59.9k
  self->arbitraryDownmix = pSpatialSpecificConfig->bArbitraryDownmix;
2011
2012
59.9k
  self->numM2rows = self->numOutputChannels;
2013
2014
59.9k
  {
2015
59.9k
    self->residualCoding = 0;
2016
59.9k
    if (self->arbitraryDownmix == 2)
2017
0
      self->arbitraryDownmix = 1; /* no arbitrary downmix residuals */
2018
59.9k
  }
2019
59.9k
  if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC)) {
2020
28.5k
    self->residualCoding = pSpatialSpecificConfig->bResidualCoding;
2021
28.5k
  }
2022
2023
59.9k
  self->clipProtectGain__FDK =
2024
59.9k
      FX_CFG2FX_DBL(clipGainTable__FDK[pSpatialSpecificConfig->bsFixedGainDMX]);
2025
59.9k
  self->clipProtectGainSF__FDK =
2026
59.9k
      clipGainSFTable__FDK[pSpatialSpecificConfig->bsFixedGainDMX];
2027
2028
59.9k
  self->tempShapeConfig = pSpatialSpecificConfig->tempShapeConfig;
2029
2030
59.9k
  self->decorrConfig = pSpatialSpecificConfig->decorrConfig;
2031
2032
59.9k
  if (self->upmixType == UPMIXTYPE_BYPASS) {
2033
0
    self->numOutputChannels = self->numInputChannels;
2034
0
  }
2035
2036
59.9k
  self->numOutputChannelsAT = self->numOutputChannels;
2037
2038
59.9k
  self->numOttBandsIPD = pSpatialSpecificConfig->numOttBandsIPD;
2039
59.9k
  self->phaseCoding = pSpatialSpecificConfig->bsPhaseCoding;
2040
119k
  for (i = 0; i < self->numOttBoxes; i++) {
2041
59.9k
    {
2042
59.9k
      self->pConfigCurrent->bitstreamOttBands[i] =
2043
59.9k
          self->bitstreamParameterBands;
2044
59.9k
    }
2045
59.9k
    self->numOttBands[i] = self->pConfigCurrent->bitstreamOttBands[i];
2046
59.9k
  } /* i */
2047
2048
59.9k
  if (self->residualCoding) {
2049
5.39k
    int numBoxes = self->numOttBoxes;
2050
10.7k
    for (i = 0; i < numBoxes; i++) {
2051
5.39k
      self->residualPresent[i] =
2052
5.39k
          pSpatialSpecificConfig->ResidualConfig[i].bResidualPresent;
2053
2054
5.39k
      if (self->residualPresent[i]) {
2055
5.39k
        self->residualBands[i] =
2056
5.39k
            pSpatialSpecificConfig->ResidualConfig[i].nResidualBands;
2057
        /* conversion from hybrid bands to qmf bands */
2058
5.39k
        self->residualQMFBands[i] =
2059
5.39k
            fMax(self->param2hyb[self->residualBands[i]] + 3 - 10,
2060
5.39k
                 3); /* simplification for the lowest 10 hybrid bands */
2061
5.39k
      } else {
2062
0
        self->residualBands[i] = 0;
2063
0
        self->residualQMFBands[i] = 0;
2064
0
      }
2065
5.39k
    }
2066
5.39k
  } /* self->residualCoding */
2067
54.5k
  else {
2068
54.5k
    int boxes = self->numOttBoxes;
2069
109k
    for (i = 0; i < boxes; i += 1) {
2070
54.5k
      self->residualPresent[i] = 0;
2071
54.5k
      self->residualBands[i] = 0;
2072
54.5k
    }
2073
54.5k
  }
2074
2075
59.9k
  switch (self->treeConfig) {
2076
59.9k
    case TREE_212:
2077
59.9k
      self->numDirektSignals = 1;
2078
59.9k
      self->numDecorSignals = 1;
2079
59.9k
      self->numXChannels = 1;
2080
59.9k
      if (self->arbitraryDownmix == 2) {
2081
0
        self->numXChannels += 1;
2082
0
      }
2083
59.9k
      self->numVChannels = self->numDirektSignals + self->numDecorSignals;
2084
59.9k
      break;
2085
0
    default:
2086
0
      return MPS_INVALID_TREECONFIG;
2087
59.9k
  }
2088
2089
59.9k
  self->highRateMode = pSpatialSpecificConfig->bsHighRateMode;
2090
59.9k
  self->decorrType = pSpatialSpecificConfig->bsDecorrType;
2091
2092
59.9k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
2093
2094
59.9k
  return err;
2095
59.9k
}
2096
2097
/*******************************************************************************
2098
 Functionname: SpatialDecCreateBsFrame
2099
 *******************************************************************************
2100
2101
 Description: Create spatial bitstream structure
2102
2103
 Arguments:   spatialDec* self
2104
              const SPATIAL_BS_FRAME **bsFrame
2105
2106
 Return:      -
2107
2108
*******************************************************************************/
2109
SACDEC_ERROR SpatialDecCreateBsFrame(SPATIAL_BS_FRAME *bsFrame,
2110
30.6k
                                     BS_LL_STATE *llState) {
2111
30.6k
  SPATIAL_BS_FRAME *pBs = bsFrame;
2112
2113
30.6k
  const int maxNumOtt = MAX_NUM_OTT;
2114
30.6k
  const int maxNumInputChannels = MAX_INPUT_CHANNELS;
2115
2116
30.6k
  FDK_ALLOCATE_MEMORY_1D_P(
2117
30.6k
      pBs->cmpOttIPDidx, maxNumOtt * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS,
2118
30.6k
      SCHAR, SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS])
2119
2120
  /* Arbitrary Downmix */
2121
30.6k
  FDK_ALLOCATE_MEMORY_1D_P(
2122
30.6k
      pBs->cmpArbdmxGainIdx,
2123
30.6k
      maxNumInputChannels * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS, SCHAR,
2124
30.6k
      SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS])
2125
2126
  /* Lossless control */
2127
30.6k
  FDK_ALLOCATE_MEMORY_1D(pBs->CLDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2128
30.6k
  FDK_ALLOCATE_MEMORY_1D(pBs->ICCLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2129
2130
30.6k
  FDK_ALLOCATE_MEMORY_1D(pBs->IPDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2131
2132
30.6k
  pBs->newBsData = 0;
2133
30.6k
  pBs->numParameterSets = 1;
2134
2135
  /* Link lossless states */
2136
214k
  for (int x = 0; x < MAX_NUM_PARAMETERS; x++) {
2137
183k
    pBs->CLDLosslessData[x].state = &llState->CLDLosslessState[x];
2138
183k
    pBs->ICCLosslessData[x].state = &llState->ICCLosslessState[x];
2139
2140
183k
    pBs->IPDLosslessData[x].state = &llState->IPDLosslessState[x];
2141
183k
  }
2142
2143
30.6k
  return MPS_OK;
2144
2145
0
bail:
2146
0
  return MPS_OUTOFMEMORY;
2147
30.6k
}
2148
2149
/*******************************************************************************
2150
 Functionname: SpatialDecCloseBsFrame
2151
 *******************************************************************************
2152
2153
 Description: Close spatial bitstream structure
2154
2155
 Arguments:   spatialDec* self
2156
2157
 Return:      -
2158
2159
*******************************************************************************/
2160
30.6k
void SpatialDecCloseBsFrame(SPATIAL_BS_FRAME *pBs) {
2161
30.6k
  if (pBs != NULL) {
2162
    /* These arrays contain the compact indices, only one value per pbstride,
2163
     * only paramsets actually containing data. */
2164
2165
30.6k
    FDK_FREE_MEMORY_1D(pBs->cmpOttIPDidx);
2166
2167
    /* Arbitrary Downmix */
2168
30.6k
    FDK_FREE_MEMORY_1D(pBs->cmpArbdmxGainIdx);
2169
2170
    /* Lossless control */
2171
30.6k
    FDK_FREE_MEMORY_1D(pBs->IPDLosslessData);
2172
30.6k
    FDK_FREE_MEMORY_1D(pBs->CLDLosslessData);
2173
    FDK_FREE_MEMORY_1D(pBs->ICCLosslessData);
2174
30.6k
  }
2175
30.6k
}