Coverage Report

Created: 2025-11-16 06:35

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
203k
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, UPMIXTYPE upmixType) {
120
203k
  int i;
121
203k
  UINT syntaxFlags;
122
123
  /* Determine bit stream syntax */
124
203k
  syntaxFlags = 0;
125
203k
  switch (pSpatialSpecificConfig->coreCodec) {
126
80.2k
    case AOT_ER_AAC_ELD:
127
80.2k
    case AOT_ER_AAC_LD:
128
80.2k
      syntaxFlags |= SACDEC_SYNTAX_LD;
129
80.2k
      break;
130
122k
    case AOT_USAC:
131
122k
      syntaxFlags |= SACDEC_SYNTAX_USAC;
132
122k
      break;
133
0
    case AOT_NONE:
134
574
    default:
135
574
      return MPS_UNSUPPORTED_FORMAT;
136
203k
  }
137
138
203k
  pSpatialSpecificConfig->syntaxFlags = syntaxFlags;
139
140
203k
  switch (pSpatialSpecificConfig->treeConfig) {
141
203k
    case TREE_212: {
142
203k
      pSpatialSpecificConfig->ottCLDdefault[0] = 0;
143
203k
    } break;
144
0
    default:
145
0
      return MPS_INVALID_TREECONFIG;
146
203k
  }
147
148
203k
  if (syntaxFlags & SACDEC_SYNTAX_USAC) {
149
122k
    if (pSpatialSpecificConfig->bsOttBandsPhasePresent) {
150
23.6k
      pSpatialSpecificConfig->numOttBandsIPD =
151
23.6k
          pSpatialSpecificConfig->bsOttBandsPhase;
152
99.2k
    } else {
153
99.2k
      int numParameterBands;
154
155
99.2k
      numParameterBands = pSpatialSpecificConfig->freqRes;
156
99.2k
      switch (numParameterBands) {
157
2.89k
        case 4:
158
6.74k
        case 5:
159
6.74k
          pSpatialSpecificConfig->numOttBandsIPD = 2;
160
6.74k
          break;
161
33.4k
        case 7:
162
33.4k
          pSpatialSpecificConfig->numOttBandsIPD = 3;
163
33.4k
          break;
164
14.2k
        case 10:
165
14.2k
          pSpatialSpecificConfig->numOttBandsIPD = 5;
166
14.2k
          break;
167
15.7k
        case 14:
168
15.7k
          pSpatialSpecificConfig->numOttBandsIPD = 7;
169
15.7k
          break;
170
23.1k
        case 20:
171
29.1k
        case 28:
172
29.1k
          pSpatialSpecificConfig->numOttBandsIPD = 10;
173
29.1k
          break;
174
0
        default:
175
0
          return MPS_INVALID_PARAMETERBANDS;
176
99.2k
      }
177
99.2k
    }
178
122k
  } else {
179
80.2k
    pSpatialSpecificConfig->numOttBandsIPD = 0;
180
80.2k
  }
181
406k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
182
203k
    {
183
203k
      pSpatialSpecificConfig->bitstreamOttBands[i] =
184
203k
          pSpatialSpecificConfig->freqRes;
185
203k
    }
186
203k
    {
187
203k
      pSpatialSpecificConfig->numOttBands[i] =
188
203k
          pSpatialSpecificConfig->bitstreamOttBands[i];
189
203k
      if (syntaxFlags & SACDEC_SYNTAX_USAC &&
190
122k
          !pSpatialSpecificConfig->bsOttBandsPhasePresent) {
191
99.2k
        if (pSpatialSpecificConfig->bResidualCoding &&
192
41.5k
            pSpatialSpecificConfig->ResidualConfig[i].bResidualPresent &&
193
41.5k
            (pSpatialSpecificConfig->numOttBandsIPD <
194
41.5k
             pSpatialSpecificConfig->ResidualConfig[i].nResidualBands)) {
195
6.71k
          pSpatialSpecificConfig->numOttBandsIPD =
196
6.71k
              pSpatialSpecificConfig->ResidualConfig[i].nResidualBands;
197
6.71k
        }
198
99.2k
      }
199
203k
    }
200
203k
  } /* i */
201
202
203k
  return MPS_OK;
203
203k
}
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
47.3k
    int numOttBoxes, int numTttBoxes, int numOutChan, int bitsAvailable) {
220
47.3k
  SACDEC_ERROR err = MPS_OK;
221
47.3k
  INT ba = bitsAvailable;
222
223
47.3k
  config->sacExtCnt = 0;
224
47.3k
  config->bResidualCoding = 0;
225
226
47.3k
  ba = fMin((int)FDKgetValidBits(bitstream), ba);
227
228
119k
  while ((ba >= 8) && (config->sacExtCnt < MAX_NUM_EXT_TYPES)) {
229
74.0k
    int bitsRead, nFillBits;
230
74.0k
    INT tmp;
231
74.0k
    UINT sacExtLen;
232
233
74.0k
    config->sacExtType[config->sacExtCnt] = FDKreadBits(bitstream, 4);
234
74.0k
    ba -= 4;
235
236
74.0k
    sacExtLen = FDKreadBits(bitstream, 4);
237
74.0k
    ba -= 4;
238
239
74.0k
    if (sacExtLen == 15) {
240
9.30k
      sacExtLen += FDKreadBits(bitstream, 8);
241
9.30k
      ba -= 8;
242
9.30k
      if (sacExtLen == 15 + 255) {
243
5.24k
        sacExtLen += FDKreadBits(bitstream, 16);
244
5.24k
        ba -= 16;
245
5.24k
      }
246
9.30k
    }
247
248
74.0k
    tmp = (INT)FDKgetValidBits(
249
74.0k
        bitstream); /* Extension config payload start anchor. */
250
74.0k
    if ((tmp <= 0) || (tmp < (INT)sacExtLen * 8) || (ba < (INT)sacExtLen * 8)) {
251
1.88k
      err = MPS_PARSE_ERROR;
252
1.88k
      goto bail;
253
1.88k
    }
254
255
72.2k
    switch (config->sacExtType[config->sacExtCnt]) {
256
72.2k
      default:; /* unknown extension data => do nothing */
257
72.2k
    }
258
259
    /* skip remaining extension data */
260
72.2k
    bitsRead = tmp - FDKgetValidBits(bitstream);
261
72.2k
    nFillBits = 8 * sacExtLen - bitsRead;
262
263
72.2k
    if (nFillBits < 0) {
264
0
      err = MPS_PARSE_ERROR;
265
0
      goto bail;
266
72.2k
    } else {
267
      /* Skip fill bits or an unkown extension. */
268
72.2k
      FDKpushFor(bitstream, nFillBits);
269
72.2k
    }
270
271
72.2k
    ba -= 8 * sacExtLen;
272
72.2k
    config->sacExtCnt++;
273
72.2k
  }
274
275
47.3k
bail:
276
47.3k
  return err;
277
47.3k
}
278
279
SACDEC_ERROR SpatialDecParseSpecificConfigHeader(
280
    HANDLE_FDK_BITSTREAM bitstream,
281
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig,
282
4.94k
    AUDIO_OBJECT_TYPE coreCodec, SPATIAL_DEC_UPMIX_TYPE upmixType) {
283
4.94k
  SACDEC_ERROR err = MPS_OK;
284
4.94k
  INT numFillBits;
285
4.94k
  int sacHeaderLen = 0;
286
4.94k
  int sacTimeAlignFlag = 0;
287
288
4.94k
  sacTimeAlignFlag = FDKreadBits(bitstream, 1);
289
4.94k
  sacHeaderLen = FDKreadBits(bitstream, 7);
290
291
4.94k
  if (sacHeaderLen == 127) {
292
237
    sacHeaderLen += FDKreadBits(bitstream, 16);
293
237
  }
294
4.94k
  numFillBits = (INT)FDKgetValidBits(bitstream);
295
296
4.94k
  err = SpatialDecParseSpecificConfig(bitstream, pSpatialSpecificConfig,
297
4.94k
                                      sacHeaderLen, coreCodec);
298
299
4.94k
  numFillBits -=
300
4.94k
      (INT)FDKgetValidBits(bitstream); /* the number of read bits (tmpBits) */
301
4.94k
  numFillBits = (8 * sacHeaderLen) - numFillBits;
302
4.94k
  if (numFillBits < 0) {
303
    /* Parsing went wrong */
304
86
    err = MPS_PARSE_ERROR;
305
86
  }
306
  /* Move to the very end of the SSC */
307
4.94k
  FDKpushBiDirectional(bitstream, numFillBits);
308
309
4.94k
  if ((err == MPS_OK) && sacTimeAlignFlag) {
310
    /* not supported */
311
134
    FDKreadBits(bitstream, 16);
312
134
    err = MPS_UNSUPPORTED_CONFIG;
313
134
  }
314
315
  /* Derive additional helper variables */
316
4.94k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, (UPMIXTYPE)upmixType);
317
318
4.94k
  return err;
319
4.94k
}
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
93.6k
    INT coreSbrFrameLengthIndex) {
326
93.6k
  int i;
327
328
93.6k
  FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG));
329
330
93.6k
  pSpatialSpecificConfig->stereoConfigIndex = stereoConfigIndex;
331
93.6k
  pSpatialSpecificConfig->coreSbrFrameLengthIndex = coreSbrFrameLengthIndex;
332
93.6k
  pSpatialSpecificConfig->freqRes =
333
93.6k
      (SPATIALDEC_FREQ_RES)freqResTable[FDKreadBits(bitstream, 3)];
334
93.6k
  if (pSpatialSpecificConfig->freqRes == 0) {
335
291
    return MPS_PARSE_ERROR; /* reserved value */
336
291
  }
337
338
93.3k
  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
93.3k
    case AOT_USAC:
349
93.3k
      pSpatialSpecificConfig->bsFixedGainDMX =
350
93.3k
          (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3);
351
93.3k
      pSpatialSpecificConfig->tempShapeConfig =
352
93.3k
          (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2);
353
93.3k
      pSpatialSpecificConfig->decorrConfig =
354
93.3k
          (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2);
355
93.3k
      if (pSpatialSpecificConfig->decorrConfig > 2) {
356
320
        return MPS_PARSE_ERROR; /* reserved value */
357
320
      }
358
93.0k
      pSpatialSpecificConfig->bsDecorrType = 0;
359
93.0k
      break;
360
0
    default:
361
0
      return MPS_UNSUPPORTED_FORMAT;
362
93.3k
  }
363
93.0k
  pSpatialSpecificConfig->nTimeSlots = (coreSbrFrameLengthIndex == 4) ? 64 : 32;
364
93.0k
  pSpatialSpecificConfig->bsHighRateMode = (UCHAR)FDKreadBits(bitstream, 1);
365
366
93.0k
  {
367
93.0k
    pSpatialSpecificConfig->bsPhaseCoding = (UCHAR)FDKreadBits(bitstream, 1);
368
93.0k
    pSpatialSpecificConfig->bsOttBandsPhasePresent =
369
93.0k
        (UCHAR)FDKreadBits(bitstream, 1);
370
93.0k
    if (pSpatialSpecificConfig->bsOttBandsPhasePresent) {
371
22.1k
      if (MAX_PARAMETER_BANDS < (pSpatialSpecificConfig->bsOttBandsPhase =
372
22.1k
                                     FDKreadBits(bitstream, 5))) {
373
216
        return MPS_PARSE_ERROR;
374
216
      }
375
70.8k
    } else {
376
70.8k
      pSpatialSpecificConfig->bsOttBandsPhase = 0;
377
70.8k
    }
378
93.0k
  }
379
380
92.7k
  if (stereoConfigIndex > 1) { /* do residual coding */
381
48.7k
    pSpatialSpecificConfig->bResidualCoding = 1;
382
48.7k
    pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 1;
383
48.7k
    if (pSpatialSpecificConfig->freqRes <
384
48.7k
        (pSpatialSpecificConfig->ResidualConfig->nResidualBands =
385
48.7k
             FDKreadBits(bitstream, 5))) {
386
703
      return MPS_PARSE_ERROR;
387
703
    }
388
48.0k
    pSpatialSpecificConfig->bsOttBandsPhase =
389
48.0k
        fMax(pSpatialSpecificConfig->bsOttBandsPhase,
390
48.0k
             pSpatialSpecificConfig->ResidualConfig->nResidualBands);
391
48.0k
    pSpatialSpecificConfig->bsPseudoLr = (UCHAR)FDKreadBits(bitstream, 1);
392
393
48.0k
    if (pSpatialSpecificConfig->bsPhaseCoding) {
394
24.0k
      pSpatialSpecificConfig->bsPhaseCoding = 3;
395
24.0k
    }
396
48.0k
  } else {
397
44.0k
    pSpatialSpecificConfig->bResidualCoding = 0;
398
44.0k
    pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 0;
399
44.0k
  }
400
401
92.0k
  if (pSpatialSpecificConfig->tempShapeConfig == 2) {
402
47.0k
    switch (coreCodec) {
403
47.0k
      case AOT_USAC:
404
47.0k
        pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1);
405
47.0k
        break;
406
0
      default: /* added to avoid compiler warning */
407
0
        break; /* added to avoid compiler warning */
408
47.0k
    }
409
47.0k
  }
410
411
  /* Static parameters */
412
413
92.0k
  pSpatialSpecificConfig->samplingFreq =
414
92.0k
      samplingRate; /* wrong for stereoConfigIndex == 3 but value is unused */
415
92.0k
  pSpatialSpecificConfig->treeConfig = SPATIALDEC_MODE_RSVD7;
416
92.0k
  pSpatialSpecificConfig->nOttBoxes =
417
92.0k
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
418
92.0k
  pSpatialSpecificConfig->nInputChannels =
419
92.0k
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
420
92.0k
  pSpatialSpecificConfig->nOutputChannels =
421
92.0k
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
422
423
92.0k
  pSpatialSpecificConfig->bArbitraryDownmix = 0;
424
425
184k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
426
92.0k
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
427
92.0k
  }
428
429
92.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
92.0k
  pSpatialSpecificConfig->coreCodec = coreCodec;
434
435
  /* Derive additional helper variables */
436
92.0k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
437
438
92.0k
  return MPS_OK;
439
92.0k
}
440
441
SACDEC_ERROR SpatialDecParseSpecificConfig(
442
    HANDLE_FDK_BITSTREAM bitstream,
443
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, int sacHeaderLen,
444
84.3k
    AUDIO_OBJECT_TYPE coreCodec) {
445
84.3k
  SACDEC_ERROR err = MPS_OK;
446
84.3k
  int i;
447
84.3k
  int bsSamplingFreqIndex;
448
84.3k
  int bsFreqRes, b3DaudioMode = 0;
449
84.3k
  int numHeaderBits;
450
84.3k
  int cfgStartPos, bitsAvailable;
451
452
84.3k
  FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG));
453
454
84.3k
  cfgStartPos = FDKgetValidBits(bitstream);
455
  /* It might be that we do not know the SSC length beforehand. */
456
84.3k
  if (sacHeaderLen == 0) {
457
7.28k
    bitsAvailable = cfgStartPos;
458
77.0k
  } else {
459
77.0k
    bitsAvailable = 8 * sacHeaderLen;
460
77.0k
    if (bitsAvailable > cfgStartPos) {
461
482
      err = MPS_PARSE_ERROR;
462
482
      goto bail;
463
482
    }
464
77.0k
  }
465
466
83.8k
  bsSamplingFreqIndex = FDKreadBits(bitstream, 4);
467
468
83.8k
  if (bsSamplingFreqIndex == 15) {
469
5.18k
    pSpatialSpecificConfig->samplingFreq = FDKreadBits(bitstream, 24);
470
78.6k
  } else {
471
78.6k
    pSpatialSpecificConfig->samplingFreq =
472
78.6k
        samplingFreqTable[bsSamplingFreqIndex];
473
78.6k
    if (pSpatialSpecificConfig->samplingFreq == 0) {
474
873
      err = MPS_PARSE_ERROR;
475
873
      goto bail;
476
873
    }
477
78.6k
  }
478
479
82.9k
  pSpatialSpecificConfig->nTimeSlots = FDKreadBits(bitstream, 5) + 1;
480
82.9k
  if ((pSpatialSpecificConfig->nTimeSlots < 1) ||
481
82.9k
      (pSpatialSpecificConfig->nTimeSlots > MAX_TIME_SLOTS)) {
482
0
    err = MPS_PARSE_ERROR;
483
0
    goto bail;
484
0
  }
485
486
82.9k
  bsFreqRes = FDKreadBits(bitstream, 3);
487
488
82.9k
  pSpatialSpecificConfig->freqRes =
489
82.9k
      (SPATIALDEC_FREQ_RES)freqResTable_LD[bsFreqRes];
490
491
82.9k
  {
492
82.9k
    UINT treeConfig = FDKreadBits(bitstream, 4);
493
494
82.9k
    switch (treeConfig) {
495
49.7k
      case SPATIALDEC_MODE_RSVD7:
496
49.7k
        pSpatialSpecificConfig->treeConfig = (SPATIALDEC_TREE_CONFIG)treeConfig;
497
49.7k
        break;
498
33.2k
      default:
499
33.2k
        err = MPS_UNSUPPORTED_CONFIG;
500
33.2k
        goto bail;
501
82.9k
    }
502
82.9k
  }
503
504
49.7k
  {
505
49.7k
    pSpatialSpecificConfig->nOttBoxes =
506
49.7k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
507
49.7k
    pSpatialSpecificConfig->nTttBoxes =
508
49.7k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numTttBoxes;
509
49.7k
    pSpatialSpecificConfig->nInputChannels =
510
49.7k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
511
49.7k
    pSpatialSpecificConfig->nOutputChannels =
512
49.7k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
513
49.7k
  }
514
515
49.7k
  pSpatialSpecificConfig->quantMode =
516
49.7k
      (SPATIALDEC_QUANT_MODE)FDKreadBits(bitstream, 2);
517
518
49.7k
  pSpatialSpecificConfig->bArbitraryDownmix = FDKreadBits(bitstream, 1);
519
520
49.7k
  pSpatialSpecificConfig->bsFixedGainDMX =
521
49.7k
      (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3);
522
523
49.7k
  pSpatialSpecificConfig->tempShapeConfig =
524
49.7k
      (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2);
525
49.7k
  if (pSpatialSpecificConfig->tempShapeConfig > 2) {
526
1.55k
    return MPS_PARSE_ERROR; /* reserved value */
527
1.55k
  }
528
529
48.1k
  pSpatialSpecificConfig->decorrConfig =
530
48.1k
      (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2);
531
48.1k
  if (pSpatialSpecificConfig->decorrConfig > 2) {
532
484
    return MPS_PARSE_ERROR; /* reserved value */
533
484
  }
534
535
95.3k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
536
47.6k
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
537
47.6k
  }
538
539
47.6k
  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
47.6k
  if (pSpatialSpecificConfig->tempShapeConfig == 2) {
549
22.0k
    pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1);
550
22.0k
  }
551
552
47.6k
  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
47.6k
  FDKbyteAlign(bitstream,
578
47.6k
               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
47.6k
  numHeaderBits = cfgStartPos - (INT)FDKgetValidBits(bitstream);
583
47.6k
  bitsAvailable -= numHeaderBits;
584
47.6k
  if (bitsAvailable < 0) {
585
381
    err = MPS_PARSE_ERROR;
586
381
    goto bail;
587
381
  }
588
589
47.3k
  pSpatialSpecificConfig->sacExtCnt = 0;
590
47.3k
  pSpatialSpecificConfig->bResidualCoding = 0;
591
592
47.3k
  err = SpatialDecParseExtensionConfig(
593
47.3k
      bitstream, pSpatialSpecificConfig, pSpatialSpecificConfig->nOttBoxes,
594
47.3k
      pSpatialSpecificConfig->nTttBoxes,
595
47.3k
      pSpatialSpecificConfig->nOutputChannels, bitsAvailable);
596
597
47.3k
  FDKbyteAlign(
598
47.3k
      bitstream,
599
47.3k
      cfgStartPos); /* Same alignment anchor as above because
600
                       SpatialExtensionConfig() always reads full bytes */
601
602
47.3k
  pSpatialSpecificConfig->coreCodec = coreCodec;
603
604
47.3k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
605
606
82.2k
bail:
607
82.2k
  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
75.1k
    FDKpushBiDirectional(
611
75.1k
        bitstream,
612
75.1k
        (sacHeaderLen * 8) - (cfgStartPos - (INT)FDKgetValidBits(bitstream)));
613
75.1k
  }
614
615
82.2k
  return err;
616
47.3k
}
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
941
{
624
941
  int err = MPS_OK;
625
941
  int i;
626
627
941
  FDK_ASSERT(coreCodec != AOT_NONE);
628
941
  FDK_ASSERT(nTimeSlots > 0);
629
941
  FDK_ASSERT(samplingFreq > 0);
630
631
941
  pSpatialSpecificConfig->coreCodec = coreCodec;
632
941
  pSpatialSpecificConfig->samplingFreq = samplingFreq;
633
941
  pSpatialSpecificConfig->nTimeSlots = nTimeSlots;
634
941
  if ((pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_ELD) ||
635
0
      (pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_LD))
636
941
    pSpatialSpecificConfig->freqRes = SPATIALDEC_FREQ_RES_23;
637
0
  else
638
0
    pSpatialSpecificConfig->freqRes = SPATIALDEC_FREQ_RES_28;
639
640
941
  {
641
941
    pSpatialSpecificConfig->treeConfig =
642
941
        SPATIALDEC_MODE_RSVD7; /* 212  configuration */
643
941
  }
644
645
941
  {
646
941
    pSpatialSpecificConfig->nOttBoxes =
647
941
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
648
941
    pSpatialSpecificConfig->nInputChannels =
649
941
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
650
941
    pSpatialSpecificConfig->nOutputChannels =
651
941
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
652
941
  }
653
654
941
  pSpatialSpecificConfig->quantMode = SPATIALDEC_QUANT_FINE_DEF;
655
941
  pSpatialSpecificConfig->bArbitraryDownmix = 0;
656
941
  pSpatialSpecificConfig->bResidualCoding = 0;
657
941
  if ((pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_ELD) ||
658
0
      (pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_LD))
659
941
    pSpatialSpecificConfig->bsFixedGainDMX = SPATIALDEC_GAIN_RSVD2;
660
0
  else
661
0
    pSpatialSpecificConfig->bsFixedGainDMX = SPATIALDEC_GAIN_MODE0;
662
663
941
  pSpatialSpecificConfig->tempShapeConfig = SPATIALDEC_TS_TPNOWHITE;
664
941
  pSpatialSpecificConfig->decorrConfig = SPATIALDEC_DECORR_MODE0;
665
666
1.88k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
667
941
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
668
941
  }
669
670
941
  return err;
671
941
}
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
75.3k
                        int numBands) {
689
75.3k
  int i;
690
691
785k
  for (i = startBand; i < startBand + numBands; i++) {
692
710k
    data[i] <<= 1;
693
710k
  }
694
695
75.3k
  if (dataType == t_CLD) {
696
361k
    for (i = startBand; i < startBand + numBands; i++) {
697
328k
      if (data[i] == -14)
698
97.3k
        data[i] = -15;
699
230k
      else if (data[i] == 14)
700
16.0k
        data[i] = 15;
701
328k
    }
702
33.4k
  }
703
75.3k
}
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.9k
                        int numBands) {
721
18.9k
  int i;
722
723
198k
  for (i = startBand; i < startBand + numBands; i++) {
724
    /* Note: the if cases below actually make a difference (negative values) */
725
179k
    if (dataType == t_CLD)
726
80.4k
      data[i] /= 2;
727
98.8k
    else
728
98.8k
      data[i] >>= 1;
729
179k
  }
730
18.9k
}
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
54.0k
                        int *aStrides) {
748
54.0k
  int i, pb, pbStride, dataBands, strOffset;
749
750
54.0k
  pbStride = pbStrideTable[freqResStride];
751
54.0k
  dataBands = (stopBand - startBand - 1) / pbStride + 1;
752
753
54.0k
  aStrides[0] = startBand;
754
275k
  for (pb = 1; pb <= dataBands; pb++) {
755
221k
    aStrides[pb] = aStrides[pb - 1] + pbStride;
756
221k
  }
757
54.0k
  strOffset = 0;
758
402k
  while (aStrides[dataBands] > stopBand) {
759
348k
    if (strOffset < dataBands) strOffset++;
760
703k
    for (i = strOffset; i <= dataBands; i++) {
761
354k
      aStrides[i]--;
762
354k
    }
763
348k
  }
764
765
54.0k
  return dataBands;
766
54.0k
}
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
211k
    int datatype, int boxIdx, int startBand, int stopBand, SCHAR defaultValue) {
789
211k
  SACDEC_ERROR err = MPS_OK;
790
211k
  int i, j, pb, dataSets, setIdx, bsDataPair, dataBands, oldQuantCoarseXXX;
791
211k
  INT aStrides[MAX_PARAMETER_BANDS + 1] = {0};
792
793
211k
  dataSets = 0;
794
548k
  for (i = 0; i < frame->numParameterSets; i++) {
795
339k
    llData->bsXXXDataMode[i] = (SCHAR)FDKreadBits(bitstream, 2);
796
797
339k
    if ((frame->bsIndependencyFlag == 1) && (i == 0) &&
798
174k
        (llData->bsXXXDataMode[i] == 1 ||
799
173k
         llData->bsXXXDataMode[i] == 2)) { /* This check catches bitstreams
800
                                              generated by older encoder that
801
                                              cause trouble */
802
137
      return MPS_PARSE_ERROR;
803
137
    }
804
339k
    if ((i >= frame->numParameterSets - 1) &&
805
211k
        (llData->bsXXXDataMode[i] ==
806
211k
         2)) { /* The interpolation mode must not be active for the last
807
                  parameter set */
808
2.26k
      return MPS_PARSE_ERROR;
809
2.26k
    }
810
811
336k
    if (llData->bsXXXDataMode[i] == 3) {
812
78.2k
      dataSets++;
813
78.2k
    }
814
336k
  }
815
816
209k
  setIdx = 0;
817
209k
  bsDataPair = 0;
818
209k
  oldQuantCoarseXXX = llData->state->bsQuantCoarseXXXprevParse;
819
820
543k
  for (i = 0; i < frame->numParameterSets; i++) {
821
335k
    if (llData->bsXXXDataMode[i] == 0) {
822
2.24M
      for (pb = startBand; pb < stopBand; pb++) {
823
2.02M
        lastdata[boxIdx][pb] = defaultValue;
824
2.02M
      }
825
826
212k
      oldQuantCoarseXXX = 0;
827
212k
    }
828
829
335k
    if (llData->bsXXXDataMode[i] == 3) {
830
77.9k
      if (bsDataPair) {
831
23.9k
        bsDataPair = 0;
832
54.0k
      } else {
833
54.0k
        bsDataPair = FDKreadBits(bitstream, 1);
834
54.0k
        llData->bsQuantCoarseXXX[setIdx] = (UCHAR)FDKreadBits(bitstream, 1);
835
54.0k
        llData->bsFreqResStrideXXX[setIdx] = (UCHAR)FDKreadBits(bitstream, 2);
836
837
54.0k
        if (llData->bsQuantCoarseXXX[setIdx] != oldQuantCoarseXXX) {
838
26.8k
          if (oldQuantCoarseXXX) {
839
7.89k
            coarse2fine(lastdata[boxIdx], (DATA_TYPE)datatype, startBand,
840
7.89k
                        stopBand - startBand);
841
18.9k
          } else {
842
18.9k
            fine2coarse(lastdata[boxIdx], (DATA_TYPE)datatype, startBand,
843
18.9k
                        stopBand - startBand);
844
18.9k
          }
845
26.8k
        }
846
847
54.0k
        dataBands = getStrideMap(llData->bsFreqResStrideXXX[setIdx], startBand,
848
54.0k
                                 stopBand, aStrides);
849
850
275k
        for (pb = 0; pb < dataBands; pb++) {
851
221k
          lastdata[boxIdx][startBand + pb] = lastdata[boxIdx][aStrides[pb]];
852
221k
        }
853
854
54.0k
        if (boxIdx > MAX_NUM_OTT) return MPS_INVALID_BOXIDX;
855
54.0k
        if ((setIdx + bsDataPair) > MAX_PARAMETER_SETS)
856
0
          return MPS_INVALID_SETIDX;
857
858
        /* DECODER_TYPE defined in FDK_tools */
859
54.0k
        DECODER_TYPE this_decoder_type = SAC_DECODER;
860
54.0k
        if (syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) {
861
49.1k
          this_decoder_type = USAC_DECODER;
862
49.1k
        } else if (syntaxFlags & SACDEC_SYNTAX_LD) {
863
4.89k
          this_decoder_type = SAOC_DECODER;
864
4.89k
        }
865
866
54.0k
        err = (SACDEC_ERROR)EcDataPairDec(
867
54.0k
            this_decoder_type, bitstream, data[boxIdx][setIdx + 0],
868
54.0k
            data[boxIdx][setIdx + 1], lastdata[boxIdx], (DATA_TYPE)datatype,
869
54.0k
            startBand, dataBands, bsDataPair, llData->bsQuantCoarseXXX[setIdx],
870
54.0k
            !(frame->bsIndependencyFlag && (i == 0)) || (setIdx > 0));
871
54.0k
        if (err != MPS_OK) goto bail;
872
873
53.0k
        if (datatype == t_IPD) {
874
10.6k
          const SCHAR mask = (llData->bsQuantCoarseXXX[setIdx]) ? 7 : 15;
875
62.3k
          for (pb = 0; pb < dataBands; pb++) {
876
145k
            for (j = aStrides[pb]; j < aStrides[pb + 1]; j++) {
877
93.3k
              lastdata[boxIdx][j] =
878
93.3k
                  data[boxIdx][setIdx + bsDataPair][startBand + pb] & mask;
879
93.3k
            }
880
51.7k
          }
881
42.4k
        } else {
882
207k
          for (pb = 0; pb < dataBands; pb++) {
883
575k
            for (j = aStrides[pb]; j < aStrides[pb + 1]; j++) {
884
410k
              lastdata[boxIdx][j] =
885
410k
                  data[boxIdx][setIdx + bsDataPair][startBand + pb];
886
410k
            }
887
164k
          }
888
42.4k
        }
889
890
53.0k
        oldQuantCoarseXXX = llData->bsQuantCoarseXXX[setIdx];
891
892
53.0k
        if (bsDataPair) {
893
32.6k
          llData->bsQuantCoarseXXX[setIdx + 1] =
894
32.6k
              llData->bsQuantCoarseXXX[setIdx];
895
32.6k
          llData->bsFreqResStrideXXX[setIdx + 1] =
896
32.6k
              llData->bsFreqResStrideXXX[setIdx];
897
32.6k
        }
898
53.0k
        setIdx += bsDataPair + 1;
899
53.0k
      } /* !bsDataPair */
900
77.9k
    }   /* llData->bsXXXDataMode[i] == 3 */
901
335k
  }
902
903
208k
  llData->state->bsQuantCoarseXXXprevParse = oldQuantCoarseXXX;
904
905
209k
bail:
906
209k
  return err;
907
208k
}
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
3.56k
    HANDLE_FDK_BITSTREAM bitstream) {
924
3.56k
  SACDEC_ERROR err = MPS_OK;
925
3.56k
  int ch;
926
3.56k
  int offset = pSSC->nOttBoxes;
927
928
  /* CLD (arbitrary down-mix gains) */
929
6.08k
  for (ch = 0; ch < pSSC->nInputChannels; ch++) {
930
3.56k
    err = ecDataDec(frame, syntaxFlags, bitstream,
931
3.56k
                    &frame->CLDLosslessData[offset + ch],
932
3.56k
                    frame->cmpArbdmxGainIdx, self->cmpArbdmxGainIdxPrev, t_CLD,
933
3.56k
                    ch, 0, pSSC->freqRes, arbdmxGainDefault);
934
3.56k
    if (err != MPS_OK) return err;
935
3.56k
  }
936
937
2.51k
  return err;
938
939
3.56k
} /* parseArbitraryDownmixData */
940
941
/*******************************************************************************
942
 Functionname: SpatialDecParseFrame
943
 *******************************************************************************
944
945
 Description:
946
947
 Arguments:
948
949
 Input:
950
951
 Output:
952
953
*******************************************************************************/
954
955
4.67k
static int nBitsParamSlot(int i) {
956
4.67k
  int bitsParamSlot;
957
958
4.67k
  bitsParamSlot = fMax(0, DFRACT_BITS - 1 - fNormz((FIXP_DBL)i));
959
4.67k
  if ((1 << bitsParamSlot) < i) {
960
82
    bitsParamSlot++;
961
82
  }
962
4.67k
  FDK_ASSERT((bitsParamSlot >= 0) && (bitsParamSlot <= 32));
963
964
4.67k
  return bitsParamSlot;
965
4.67k
}
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
103k
    int fGlobalIndependencyFlag) {
972
103k
  SACDEC_ERROR err = MPS_OK;
973
103k
  int bsFramingType, dataBands, ps, pg, i;
974
103k
  int pb;
975
103k
  int numTempShapeChan = 0;
976
103k
  int bsNumOutputChannels =
977
103k
      treePropertyTable[pSpatialSpecificConfig->treeConfig]
978
103k
          .numOutputChannels; /* CAUTION: Maybe different to
979
                                 pSpatialSpecificConfig->treeConfig in some
980
                                 modes! */
981
103k
  int paramSetErr = 0;
982
103k
  UINT alignAnchor = FDKgetValidBits(
983
103k
      bitstream); /* Anchor for ByteAlign() function. See comment below. */
984
103k
  UINT syntaxFlags;
985
986
103k
  syntaxFlags = pSpatialSpecificConfig->syntaxFlags;
987
988
103k
  if ((syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) &&
989
97.3k
      pSpatialSpecificConfig->bsHighRateMode == 0) {
990
13.0k
    bsFramingType = 0; /* fixed framing */
991
13.0k
    frame->numParameterSets = 1;
992
90.4k
  } else {
993
90.4k
    bsFramingType = FDKreadBits(bitstream, 1);
994
90.4k
    if (syntaxFlags & SACDEC_SYNTAX_LD)
995
6.18k
      frame->numParameterSets = FDKreadBits(bitstream, 1) + 1;
996
84.2k
    else
997
84.2k
      frame->numParameterSets = FDKreadBits(bitstream, 3) + 1;
998
90.4k
  }
999
1000
  /* Any error after this line shall trigger parameter invalidation at bail
1001
   * label. */
1002
103k
  paramSetErr = 1;
1003
1004
103k
  if (frame->numParameterSets >= MAX_PARAMETER_SETS) {
1005
0
    goto bail;
1006
0
  }
1007
1008
  /* Basic config check. */
1009
103k
  if (pSpatialSpecificConfig->nInputChannels <= 0 ||
1010
103k
      pSpatialSpecificConfig->nOutputChannels <= 0) {
1011
0
    err = MPS_UNSUPPORTED_CONFIG;
1012
0
    goto bail;
1013
0
  }
1014
1015
103k
  if (bsFramingType) {
1016
4.67k
    int prevParamSlot = -1;
1017
4.67k
    int bitsParamSlot;
1018
1019
4.67k
    {
1020
4.67k
      bitsParamSlot = nBitsParamSlot(pSpatialSpecificConfig->nTimeSlots);
1021
1022
11.2k
      for (i = 0; i < frame->numParameterSets; i++) {
1023
6.76k
        frame->paramSlot[i] = FDKreadBits(bitstream, bitsParamSlot);
1024
        /* Sanity check */
1025
6.76k
        if ((frame->paramSlot[i] <= prevParamSlot) ||
1026
6.65k
            (frame->paramSlot[i] >= pSpatialSpecificConfig->nTimeSlots)) {
1027
194
          err = MPS_PARSE_ERROR;
1028
194
          goto bail;
1029
194
        }
1030
6.57k
        prevParamSlot = frame->paramSlot[i];
1031
6.57k
      }
1032
4.67k
    }
1033
98.8k
  } else {
1034
249k
    for (i = 0; i < frame->numParameterSets; i++) {
1035
150k
      frame->paramSlot[i] = ((pSpatialSpecificConfig->nTimeSlots * (i + 1)) /
1036
150k
                             frame->numParameterSets) -
1037
150k
                            1;
1038
150k
    }
1039
98.8k
  }
1040
1041
103k
  if ((syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) &&
1042
97.3k
      fGlobalIndependencyFlag) {
1043
81.9k
    frame->bsIndependencyFlag = 1;
1044
81.9k
  } else {
1045
21.3k
    frame->bsIndependencyFlag = (UCHAR)FDKreadBits(bitstream, 1);
1046
21.3k
  }
1047
1048
  /*
1049
   * OttData()
1050
   */
1051
204k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
1052
103k
    err = ecDataDec(frame, syntaxFlags, bitstream, &frame->CLDLosslessData[i],
1053
103k
                    frame->cmpOttCLDidx, self->cmpOttCLDidxPrev, t_CLD, i, 0,
1054
103k
                    pSpatialSpecificConfig->bitstreamOttBands[i],
1055
103k
                    pSpatialSpecificConfig->ottCLDdefault[i]);
1056
103k
    if (err != MPS_OK) {
1057
1.73k
      goto bail;
1058
1.73k
    }
1059
103k
  } /* i < numOttBoxes */
1060
1061
101k
  {
1062
202k
    for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
1063
101k
      err = ecDataDec(frame, syntaxFlags, bitstream, &frame->ICCLosslessData[i],
1064
101k
                      frame->cmpOttICCidx, self->cmpOttICCidxPrev, t_ICC, i, 0,
1065
101k
                      pSpatialSpecificConfig->bitstreamOttBands[i], ICCdefault);
1066
101k
      if (err != MPS_OK) {
1067
560
        goto bail;
1068
560
      }
1069
101k
    } /* i < numOttBoxes */
1070
101k
  }   /* !oneICC */
1071
1072
101k
  if ((pSpatialSpecificConfig->treeConfig == SPATIALDEC_MODE_RSVD7) &&
1073
101k
      (pSpatialSpecificConfig->bsPhaseCoding)) {
1074
9.90k
    frame->phaseMode = FDKreadBits(bitstream, 1);
1075
1076
9.90k
    if (frame->phaseMode == 0) {
1077
44.2k
      for (pb = 0; pb < pSpatialSpecificConfig->numOttBandsIPD; pb++) {
1078
37.4k
        self->cmpOttIPDidxPrev[0][pb] = 0;
1079
251k
        for (i = 0; i < frame->numParameterSets; i++) {
1080
214k
          frame->cmpOttIPDidx[0][i][pb] = 0;
1081
          // frame->ottIPDidx[0][i][pb] = 0;
1082
214k
        }
1083
        /* self->ottIPDidxPrev[0][pb] = 0; */
1084
37.4k
      }
1085
6.85k
      frame->OpdSmoothingMode = 0;
1086
6.85k
    } else {
1087
3.05k
      frame->OpdSmoothingMode = FDKreadBits(bitstream, 1);
1088
3.05k
      err = ecDataDec(frame, syntaxFlags, bitstream, &frame->IPDLosslessData[0],
1089
3.05k
                      frame->cmpOttIPDidx, self->cmpOttIPDidxPrev, t_IPD, 0, 0,
1090
3.05k
                      pSpatialSpecificConfig->numOttBandsIPD, IPDdefault);
1091
3.05k
      if (err != MPS_OK) {
1092
46
        goto bail;
1093
46
      }
1094
3.05k
    }
1095
9.90k
  }
1096
1097
  /*
1098
   * SmgData()
1099
   */
1100
1101
101k
  {
1102
101k
    if (!pSpatialSpecificConfig->bsHighRateMode &&
1103
16.8k
        (syntaxFlags & SACDEC_SYNTAX_USAC)) {
1104
26.1k
      for (ps = 0; ps < frame->numParameterSets; ps++) {
1105
13.0k
        frame->bsSmoothMode[ps] = 0;
1106
13.0k
      }
1107
87.9k
    } else {
1108
228k
      for (ps = 0; ps < frame->numParameterSets; ps++) {
1109
140k
        frame->bsSmoothMode[ps] = (UCHAR)FDKreadBits(bitstream, 2);
1110
140k
        if (frame->bsSmoothMode[ps] >= 2) {
1111
15.3k
          frame->bsSmoothTime[ps] = (UCHAR)FDKreadBits(bitstream, 2);
1112
15.3k
        }
1113
140k
        if (frame->bsSmoothMode[ps] == 3) {
1114
8.90k
          frame->bsFreqResStrideSmg[ps] = (UCHAR)FDKreadBits(bitstream, 2);
1115
8.90k
          dataBands = (pSpatialSpecificConfig->freqRes - 1) /
1116
8.90k
                          pbStrideTable[frame->bsFreqResStrideSmg[ps]] +
1117
8.90k
                      1;
1118
44.5k
          for (pg = 0; pg < dataBands; pg++) {
1119
35.6k
            frame->bsSmgData[ps][pg] = (UCHAR)FDKreadBits(bitstream, 1);
1120
35.6k
          }
1121
8.90k
        }
1122
140k
      } /* ps < numParameterSets */
1123
87.9k
    }
1124
101k
  }
1125
1126
  /*
1127
   * TempShapeData()
1128
   */
1129
101k
  if ((pSpatialSpecificConfig->tempShapeConfig == 3) &&
1130
8.72k
      (syntaxFlags & SACDEC_SYNTAX_USAC)) {
1131
8.72k
    int TsdErr;
1132
8.72k
    TsdErr = TsdRead(bitstream, pSpatialSpecificConfig->nTimeSlots,
1133
8.72k
                     &frame->TsdData[0]);
1134
8.72k
    if (TsdErr) {
1135
0
      err = MPS_PARSE_ERROR;
1136
0
      goto bail;
1137
0
    }
1138
92.2k
  } else {
1139
92.2k
    frame->TsdData[0].bsTsdEnable = 0;
1140
92.2k
  }
1141
1142
303k
  for (i = 0; i < bsNumOutputChannels; i++) {
1143
202k
    frame->tempShapeEnableChannelSTP[i] = 0;
1144
202k
    frame->tempShapeEnableChannelGES[i] = 0;
1145
202k
  }
1146
1147
101k
  if ((pSpatialSpecificConfig->tempShapeConfig == 1) ||
1148
96.2k
      (pSpatialSpecificConfig->tempShapeConfig == 2)) {
1149
85.9k
    int bsTempShapeEnable = FDKreadBits(bitstream, 1);
1150
85.9k
    if (bsTempShapeEnable) {
1151
4.90k
      numTempShapeChan =
1152
4.90k
          tempShapeChanTable[pSpatialSpecificConfig->tempShapeConfig - 1]
1153
4.90k
                            [pSpatialSpecificConfig->treeConfig];
1154
4.90k
      switch (pSpatialSpecificConfig->tempShapeConfig) {
1155
1.83k
        case 1: /* STP */
1156
5.50k
          for (i = 0; i < numTempShapeChan; i++) {
1157
3.67k
            int stpEnable = FDKreadBits(bitstream, 1);
1158
3.67k
            frame->tempShapeEnableChannelSTP[i] = stpEnable;
1159
3.67k
          }
1160
1.83k
          break;
1161
3.06k
        case 2: /* GES */
1162
3.06k
        {
1163
3.06k
          UCHAR gesChannelEnable[MAX_OUTPUT_CHANNELS];
1164
1165
9.19k
          for (i = 0; i < numTempShapeChan; i++) {
1166
6.12k
            gesChannelEnable[i] = (UCHAR)FDKreadBits(bitstream, 1);
1167
6.12k
            frame->tempShapeEnableChannelGES[i] = gesChannelEnable[i];
1168
6.12k
          }
1169
8.99k
          for (i = 0; i < numTempShapeChan; i++) {
1170
6.05k
            if (gesChannelEnable[i]) {
1171
3.09k
              int envShapeData_tmp[MAX_TIME_SLOTS];
1172
3.09k
              if (huff_dec_reshape(bitstream, envShapeData_tmp,
1173
3.09k
                                   pSpatialSpecificConfig->nTimeSlots) != 0) {
1174
128
                err = MPS_PARSE_ERROR;
1175
128
                goto bail;
1176
128
              }
1177
96.2k
              for (int ts = 0; ts < pSpatialSpecificConfig->nTimeSlots; ts++) {
1178
93.2k
                if (!(envShapeData_tmp[ts] >= 0) &&
1179
0
                    (envShapeData_tmp[ts] <= 4)) {
1180
0
                  err = MPS_PARSE_ERROR;
1181
0
                  goto bail;
1182
0
                }
1183
93.2k
                frame->bsEnvShapeData[i][ts] = (UCHAR)envShapeData_tmp[ts];
1184
93.2k
              }
1185
2.96k
            }
1186
6.05k
          }
1187
3.06k
        } break;
1188
2.93k
        default:
1189
0
          err = MPS_INVALID_TEMPSHAPE;
1190
0
          goto bail;
1191
4.90k
      }
1192
4.90k
    } /* bsTempShapeEnable */
1193
85.9k
  }   /* pSpatialSpecificConfig->tempShapeConfig != 0 */
1194
1195
100k
  if (pSpatialSpecificConfig->bArbitraryDownmix != 0) {
1196
3.56k
    err = parseArbitraryDownmixData(self, pSpatialSpecificConfig, syntaxFlags,
1197
3.56k
                                    frame, bitstream);
1198
3.56k
    if (err != MPS_OK) goto bail;
1199
3.56k
  }
1200
1201
99.8k
  if (1 && (!(syntaxFlags & (SACDEC_SYNTAX_USAC)))) {
1202
2.65k
    FDKbyteAlign(bitstream,
1203
2.65k
                 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.65k
  }
1207
1208
103k
bail:
1209
103k
  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.71k
    frame->numParameterSets = 0; /* ... signal that it is corrupt ... */
1213
3.71k
  }
1214
1215
103k
  return err;
1216
1217
99.8k
} /* 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.5k
                          int stopBand, int stride) {
1232
82.5k
  int inBands, outBands, bandsAchived, bandsDiff, incr, k, i;
1233
82.5k
  int vDk[MAX_PARAMETER_BANDS + 1];
1234
82.5k
  inBands = stopBand - startBand;
1235
82.5k
  outBands = (inBands - 1) / stride + 1;
1236
1237
82.5k
  if (outBands < 1) {
1238
1.10k
    outBands = 1;
1239
1.10k
  }
1240
1241
82.5k
  bandsAchived = outBands * stride;
1242
82.5k
  bandsDiff = inBands - bandsAchived;
1243
352k
  for (i = 0; i < outBands; i++) {
1244
269k
    vDk[i] = stride;
1245
269k
  }
1246
1247
82.5k
  if (bandsDiff > 0) {
1248
0
    incr = -1;
1249
0
    k = outBands - 1;
1250
82.5k
  } else {
1251
82.5k
    incr = 1;
1252
82.5k
    k = 0;
1253
82.5k
  }
1254
1255
708k
  while (bandsDiff != 0) {
1256
625k
    vDk[k] = vDk[k] - incr;
1257
625k
    k = k + incr;
1258
625k
    bandsDiff = bandsDiff + incr;
1259
625k
    if (k >= outBands) {
1260
621k
      if (bandsDiff > 0) {
1261
0
        k = outBands - 1;
1262
621k
      } else if (bandsDiff < 0) {
1263
587k
        k = 0;
1264
587k
      }
1265
621k
    }
1266
625k
  }
1267
82.5k
  aMap[0] = startBand;
1268
352k
  for (i = 0; i < outBands; i++) {
1269
269k
    aMap[i + 1] = aMap[i] + vDk[i];
1270
269k
  }
1271
82.5k
} /* 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
74.4k
{
1289
74.4k
  int i, j;
1290
74.4k
  int startBand0 = pMap[0];
1291
1292
313k
  for (i = 0; i < dataBands; i++) {
1293
239k
    int startBand, stopBand, value;
1294
1295
239k
    value = pInput[i + startBand0];
1296
1297
239k
    startBand = pMap[i];
1298
239k
    stopBand = pMap[i + 1];
1299
940k
    for (j = startBand; j < stopBand; j++) {
1300
700k
      pOutput[j] = value;
1301
700k
    }
1302
239k
  }
1303
74.4k
}
1304
1305
/*******************************************************************************
1306
 Functionname: deq
1307
 *******************************************************************************
1308
1309
 Description:
1310
1311
 Arguments:
1312
1313
 Return:
1314
1315
*******************************************************************************/
1316
4.67M
static int deqIdx(int value, int paramType) {
1317
4.67M
  int idx = -1;
1318
1319
4.67M
  switch (paramType) {
1320
2.22M
    case t_CLD:
1321
2.22M
      if (((value + 15) >= 0) && ((value + 15) < 31)) {
1322
2.16M
        idx = (value + 15);
1323
2.16M
      }
1324
2.22M
      break;
1325
1326
1.98M
    case t_ICC:
1327
1.98M
      if ((value >= 0) && (value < 8)) {
1328
1.90M
        idx = value;
1329
1.90M
      }
1330
1.98M
      break;
1331
1332
473k
    case t_IPD:
1333
      /* (+/-)15 * MAX_PARAMETER_BANDS for differential coding in frequency
1334
       * domain (according to rbl) */
1335
473k
      if ((value >= -420) && (value <= 420)) {
1336
473k
        idx = (value & 0xf);
1337
473k
      }
1338
473k
      break;
1339
1340
0
    default:
1341
0
      FDK_ASSERT(0);
1342
4.67M
  }
1343
1344
4.67M
  return idx;
1345
4.67M
}
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
347k
    FIXP_DBL (*pOttVsTotDb2)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]) {
1464
347k
  int aParamSlots[MAX_PARAMETER_SETS];
1465
347k
  int aInterpolate[MAX_PARAMETER_SETS] = {0};
1466
1467
347k
  int dataSets;
1468
347k
  int aMap[MAX_PARAMETER_BANDS + 1];
1469
1470
347k
  int setIdx, i, band, parmSlot;
1471
347k
  int dataBands;
1472
347k
  int ps, pb;
1473
347k
  int i1;
1474
1475
347k
  if (numParameterSets > MAX_PARAMETER_SETS) return MPS_WRONG_PARAMETERSETS;
1476
1477
347k
  dataSets = 0;
1478
837k
  for (i = 0; i < numParameterSets; i++) {
1479
489k
    if (llData->bsXXXDataMode[i] == 3) {
1480
81.2k
      aParamSlots[dataSets] = i;
1481
81.2k
      dataSets++;
1482
81.2k
    }
1483
489k
  }
1484
1485
347k
  setIdx = 0;
1486
1487
  /* Main concealment stage is here: */
1488
347k
  SpatialDecConcealment_Apply(
1489
347k
      concealmentInfo, cmpIdxData[xttIdx],
1490
347k
      (diffIdxData != NULL) ? diffIdxData[xttIdx] : NULL, idxPrev[xttIdx],
1491
347k
      llData->bsXXXDataMode, startBand, stopBand, defaultValue, paramType,
1492
347k
      numParameterSets);
1493
1494
  /* Prepare data */
1495
837k
  for (i = 0; i < numParameterSets; i++) {
1496
489k
    if (llData->bsXXXDataMode[i] == 0) {
1497
317k
      llData->nocmpQuantCoarseXXX[i] = 0;
1498
3.19M
      for (band = startBand; band < stopBand; band++) {
1499
2.87M
        outputIdxData[xttIdx][i][band] = defaultValue;
1500
2.87M
      }
1501
3.19M
      for (band = startBand; band < stopBand; band++) {
1502
2.87M
        idxPrev[xttIdx][band] = outputIdxData[xttIdx][i][band];
1503
2.87M
      }
1504
      /* Because the idxPrev are also set to the defaultValue -> signalize fine
1505
       */
1506
317k
      llData->state->bsQuantCoarseXXXprev = 0;
1507
317k
    }
1508
1509
489k
    if (llData->bsXXXDataMode[i] == 1) {
1510
906k
      for (band = startBand; band < stopBand; band++) {
1511
835k
        outputIdxData[xttIdx][i][band] = idxPrev[xttIdx][band];
1512
835k
      }
1513
70.8k
      llData->nocmpQuantCoarseXXX[i] = llData->state->bsQuantCoarseXXXprev;
1514
70.8k
    }
1515
1516
489k
    if (llData->bsXXXDataMode[i] == 2) {
1517
292k
      for (band = startBand; band < stopBand; band++) {
1518
265k
        outputIdxData[xttIdx][i][band] = idxPrev[xttIdx][band];
1519
265k
      }
1520
26.7k
      llData->nocmpQuantCoarseXXX[i] = llData->state->bsQuantCoarseXXXprev;
1521
26.7k
      aInterpolate[i] = 1;
1522
462k
    } else {
1523
462k
      aInterpolate[i] = 0;
1524
462k
    }
1525
1526
489k
    if (llData->bsXXXDataMode[i] == 3) {
1527
74.4k
      int stride;
1528
1529
74.4k
      parmSlot = aParamSlots[setIdx];
1530
74.4k
      stride = pbStrideTable[llData->bsFreqResStrideXXX[setIdx]];
1531
74.4k
      dataBands = (stopBand - startBand - 1) / stride + 1;
1532
74.4k
      createMapping(aMap, startBand, stopBand, stride);
1533
74.4k
      mapFrequency(&cmpIdxData[xttIdx][setIdx][0],
1534
74.4k
                   &outputIdxData[xttIdx][parmSlot][0], aMap, dataBands);
1535
775k
      for (band = startBand; band < stopBand; band++) {
1536
700k
        idxPrev[xttIdx][band] = outputIdxData[xttIdx][parmSlot][band];
1537
700k
      }
1538
74.4k
      llData->state->bsQuantCoarseXXXprev = llData->bsQuantCoarseXXX[setIdx];
1539
74.4k
      llData->nocmpQuantCoarseXXX[i] = llData->bsQuantCoarseXXX[setIdx];
1540
1541
74.4k
      setIdx++;
1542
74.4k
    }
1543
489k
    if (diffIdxData != NULL) {
1544
2.17M
      for (band = startBand; band < stopBand; band++) {
1545
1.98M
        outputIdxData[xttIdx][i][band] += diffIdxData[xttIdx][i][band];
1546
1.98M
      }
1547
197k
    }
1548
489k
  } /* for( i = 0 ; i < numParameterSets; i++ ) */
1549
1550
  /* Map all coarse data to fine */
1551
837k
  for (i = 0; i < numParameterSets; i++) {
1552
489k
    if (llData->nocmpQuantCoarseXXX[i] == 1) {
1553
67.4k
      coarse2fine(outputIdxData[xttIdx][i], (DATA_TYPE)paramType, startBand,
1554
67.4k
                  stopBand - startBand);
1555
67.4k
      llData->nocmpQuantCoarseXXX[i] = 0;
1556
67.4k
    }
1557
489k
  }
1558
1559
  /* Interpolate */
1560
347k
  i1 = 0;
1561
837k
  for (i = 0; i < numParameterSets; i++) {
1562
489k
    if (aInterpolate[i] != 1) {
1563
462k
      i1 = i;
1564
462k
    } else {
1565
26.7k
      int xi, i2, x1, x2;
1566
1567
67.6k
      for (i2 = i; i2 < numParameterSets; i2++) {
1568
67.5k
        if (aInterpolate[i2] != 1) break;
1569
67.5k
      }
1570
26.7k
      if (i2 >= numParameterSets) return MPS_WRONG_PARAMETERSETS;
1571
1572
26.6k
      x1 = paramSlot[i1];
1573
26.6k
      xi = paramSlot[i];
1574
26.6k
      x2 = paramSlot[i2];
1575
1576
291k
      for (band = startBand; band < stopBand; band++) {
1577
265k
        int yi, y1, y2;
1578
265k
        y1 = outputIdxData[xttIdx][i1][band];
1579
265k
        y2 = outputIdxData[xttIdx][i2][band];
1580
265k
        if (x1 != x2) {
1581
265k
          yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1582
265k
        } else {
1583
0
          yi = y1 /*+ (xi-x1)*(y2-y1)/1e-12*/;
1584
0
        }
1585
265k
        outputIdxData[xttIdx][i][band] = yi;
1586
265k
      }
1587
26.6k
    }
1588
489k
  } /* for( i = 0 ; i < numParameterSets; i++ ) */
1589
1590
  /* Dequantize data and apply factorCLD if necessary */
1591
837k
  for (ps = 0; ps < numParameterSets; ps++) {
1592
489k
    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.16M
    for (band = startBand; band < stopBand; band++) {
1609
4.67M
      outputDataIdx[xttIdx][ps][band] =
1610
4.67M
          deqIdx(outputIdxData[xttIdx][ps][band], paramType);
1611
4.67M
      if (outputDataIdx[xttIdx][ps][band] == -1) {
1612
133k
        outputDataIdx[xttIdx][ps][band] = defaultValue;
1613
133k
      }
1614
4.67M
    }
1615
489k
  } /* for( i = 0 ; i < numParameterSets; i++ ) */
1616
1617
347k
  if (extendFrame) {
1618
6.46k
    if (paramType == t_IPD) {
1619
979
      llData->bsQuantCoarseXXX[numParameterSets] =
1620
979
          llData->bsQuantCoarseXXX[numParameterSets - 1];
1621
979
    }
1622
56.0k
    for (band = startBand; band < stopBand; band++) {
1623
49.6k
      outputDataIdx[xttIdx][numParameterSets][band] =
1624
49.6k
          outputDataIdx[xttIdx][numParameterSets - 1][band];
1625
49.6k
    }
1626
6.46k
  }
1627
1628
347k
  return MPS_OK;
1629
347k
}
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
165k
                                         SPATIAL_BS_FRAME *pCurBs) {
1647
165k
  int i, ottIdx;
1648
165k
  int numOttBoxes;
1649
1650
165k
  SACDEC_ERROR err = MPS_OK;
1651
1652
165k
  numOttBoxes = self->numOttBoxes;
1653
1654
165k
  switch (self->treeConfig) {
1655
165k
    default: {
1656
165k
      if (self->quantMode != 0) {
1657
18.8k
        goto bail;
1658
18.8k
      }
1659
165k
    }
1660
293k
      for (i = 0; i < numOttBoxes; i++) {
1661
146k
        err = mapIndexData(
1662
146k
            &pCurBs->CLDLosslessData[i], /* LOSSLESSDATA *llData,*/
1663
146k
            self->ottCLD__FDK, self->outIdxData,
1664
146k
            pCurBs
1665
146k
                ->cmpOttCLDidx, /* int
1666
                                   cmpIdxData[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1667
                                 */
1668
146k
            NULL,               /* no differential data */
1669
146k
            i, /*  int   xttIdx,  Which ott/ttt index to use for input and
1670
                  output buffers */
1671
146k
            self->ottCLDidxPrev,                        /* int
1672
                                                           idxPrev[MAX_NUM_OTT][MAX_PARAMETER_BANDS],
1673
                                                         */
1674
146k
            i, t_CLD, 0,                                /* int   startBand, */
1675
146k
            self->pConfigCurrent->bitstreamOttBands[i], /*  int   stopBand, */
1676
146k
            self->pConfigCurrent->ottCLDdefault[i], /* int   defaultValue, */
1677
146k
            pCurBs->numParameterSets, /* int   numParameterSets) */
1678
146k
            pCurBs->paramSlot, self->extendFrame, self->quantMode,
1679
146k
            &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1680
146k
        if (err != MPS_OK) goto bail;
1681
1682
146k
      } /* for(i = 0; i < numOttBoxes ; i++ ) */
1683
146k
      break;
1684
165k
  } /* case */
1685
1686
293k
  for (ottIdx = 0; ottIdx < numOttBoxes; ottIdx++) {
1687
    /* Read ICC */
1688
146k
    err = mapIndexData(
1689
146k
        &pCurBs->ICCLosslessData[ottIdx], /* LOSSLESSDATA *llData,*/
1690
146k
        self->ottICC__FDK, self->outIdxData,
1691
146k
        pCurBs
1692
146k
            ->cmpOttICCidx,  /* int
1693
                                cmpIdxData[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1694
                              */
1695
146k
        self->ottICCdiffidx, /* differential data */
1696
146k
        ottIdx, /* int   xttIdx,  Which ott/ttt index to use for input and
1697
                   output buffers */
1698
146k
        self->ottICCidxPrev, /* int   idxPrev[MAX_NUM_OTT][MAX_PARAMETER_BANDS],
1699
                              */
1700
146k
        ottIdx, t_ICC, 0,    /* int   startBand, */
1701
146k
        self->pConfigCurrent->bitstreamOttBands[ottIdx], /* int   stopBand, */
1702
146k
        ICCdefault,               /* int   defaultValue, */
1703
146k
        pCurBs->numParameterSets, /* int   numParameterSets) */
1704
146k
        pCurBs->paramSlot, self->extendFrame, self->quantMode,
1705
146k
        &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1706
146k
    if (err != MPS_OK) goto bail;
1707
146k
  } /* ottIdx */
1708
1709
146k
  if ((self->treeConfig == TREE_212) && (self->phaseCoding)) {
1710
19.9k
    if (pCurBs->phaseMode == 0) {
1711
125k
      for (int pb = 0; pb < self->pConfigCurrent->numOttBandsIPD; pb++) {
1712
109k
        self->ottIPDidxPrev[0][pb] = 0;
1713
109k
      }
1714
16.5k
    }
1715
39.9k
    for (ottIdx = 0; ottIdx < numOttBoxes; ottIdx++) {
1716
19.9k
      err = mapIndexData(
1717
19.9k
          &pCurBs->IPDLosslessData[ottIdx], self->ottIPD__FDK, self->outIdxData,
1718
19.9k
          pCurBs->cmpOttIPDidx, NULL, ottIdx, self->ottIPDidxPrev, ottIdx,
1719
19.9k
          t_IPD, 0, self->numOttBandsIPD, IPDdefault, pCurBs->numParameterSets,
1720
19.9k
          pCurBs->paramSlot, self->extendFrame, self->quantMode,
1721
19.9k
          &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1722
19.9k
    }
1723
19.9k
  }
1724
1725
165k
bail:
1726
1727
165k
  return MPS_OK;
1728
1729
146k
} /* 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
165k
                                         const SPATIAL_BS_FRAME *frame) {
1748
165k
  int ps, pb, pg, pbStride, dataBands, pbStart, pbStop,
1749
165k
      aGroupToBand[MAX_PARAMETER_BANDS + 1];
1750
1751
165k
  if (frame->numParameterSets > MAX_PARAMETER_SETS)
1752
0
    return MPS_WRONG_PARAMETERSETS;
1753
165k
  if (self->bitstreamParameterBands > MAX_PARAMETER_BANDS)
1754
0
    return MPS_WRONG_PARAMETERBANDS;
1755
1756
381k
  for (ps = 0; ps < frame->numParameterSets; ps++) {
1757
216k
    switch (frame->bsSmoothMode[ps]) {
1758
190k
      case 0:
1759
190k
        self->smgTime[ps] = 256;
1760
190k
        FDKmemclear(self->smgData[ps],
1761
190k
                    self->bitstreamParameterBands * sizeof(UCHAR));
1762
190k
        break;
1763
1764
12.0k
      case 1:
1765
12.0k
        if (ps > 0) {
1766
10.7k
          self->smgTime[ps] = self->smgTime[ps - 1];
1767
10.7k
          FDKmemcpy(self->smgData[ps], self->smgData[ps - 1],
1768
10.7k
                    self->bitstreamParameterBands * sizeof(UCHAR));
1769
10.7k
        } else {
1770
1.31k
          self->smgTime[ps] = self->smoothState->prevSmgTime;
1771
1.31k
          FDKmemcpy(self->smgData[ps], self->smoothState->prevSmgData,
1772
1.31k
                    self->bitstreamParameterBands * sizeof(UCHAR));
1773
1.31k
        }
1774
12.0k
        break;
1775
1776
5.54k
      case 2:
1777
5.54k
        self->smgTime[ps] = smgTimeTable[frame->bsSmoothTime[ps]];
1778
62.1k
        for (pb = 0; pb < self->bitstreamParameterBands; pb++) {
1779
56.6k
          self->smgData[ps][pb] = 1;
1780
56.6k
        }
1781
5.54k
        break;
1782
1783
8.18k
      case 3:
1784
8.18k
        self->smgTime[ps] = smgTimeTable[frame->bsSmoothTime[ps]];
1785
8.18k
        pbStride = pbStrideTable[frame->bsFreqResStrideSmg[ps]];
1786
8.18k
        dataBands = (self->bitstreamParameterBands - 1) / pbStride + 1;
1787
8.18k
        createMapping(aGroupToBand, 0, self->bitstreamParameterBands, pbStride);
1788
37.3k
        for (pg = 0; pg < dataBands; pg++) {
1789
29.1k
          pbStart = aGroupToBand[pg];
1790
29.1k
          pbStop = aGroupToBand[pg + 1];
1791
107k
          for (pb = pbStart; pb < pbStop; pb++) {
1792
78.5k
            self->smgData[ps][pb] = frame->bsSmgData[ps][pg];
1793
78.5k
          }
1794
29.1k
        }
1795
8.18k
        break;
1796
216k
    }
1797
216k
  }
1798
1799
165k
  self->smoothState->prevSmgTime = self->smgTime[frame->numParameterSets - 1];
1800
165k
  FDKmemcpy(self->smoothState->prevSmgData,
1801
165k
            self->smgData[frame->numParameterSets - 1],
1802
165k
            self->bitstreamParameterBands * sizeof(UCHAR));
1803
1804
165k
  if (self->extendFrame) {
1805
2.71k
    self->smgTime[frame->numParameterSets] =
1806
2.71k
        self->smgTime[frame->numParameterSets - 1];
1807
2.71k
    FDKmemcpy(self->smgData[frame->numParameterSets],
1808
2.71k
              self->smgData[frame->numParameterSets - 1],
1809
2.71k
              self->bitstreamParameterBands * sizeof(UCHAR));
1810
2.71k
  }
1811
1812
165k
  return MPS_OK;
1813
165k
}
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
34.0k
                                            const SPATIAL_BS_FRAME *frame) {
1831
34.0k
  SACDEC_ERROR err = MPS_OK;
1832
34.0k
  int ch;
1833
34.0k
  int offset = self->numOttBoxes;
1834
1835
68.1k
  for (ch = 0; ch < self->numInputChannels; ch++) {
1836
34.0k
    err = mapIndexData(&frame->CLDLosslessData[offset + ch],
1837
34.0k
                       self->arbdmxGain__FDK, self->outIdxData,
1838
34.0k
                       frame->cmpArbdmxGainIdx, NULL, /* no differential data */
1839
34.0k
                       ch, self->arbdmxGainIdxPrev, offset + ch, t_CLD, 0,
1840
34.0k
                       self->bitstreamParameterBands,
1841
34.0k
                       0 /*self->arbdmxGainDefault*/, frame->numParameterSets,
1842
34.0k
                       frame->paramSlot, self->extendFrame, 0,
1843
34.0k
                       &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1844
34.0k
    if (err != MPS_OK) goto bail;
1845
34.0k
  }
1846
1847
34.0k
bail:
1848
34.0k
  return err;
1849
34.0k
} /* decodeAndMapFrameArbdmx */
1850
1851
/*******************************************************************************
1852
 Functionname: SpatialDecDecodeFrame
1853
 *******************************************************************************
1854
1855
 Description:
1856
1857
 Arguments:
1858
1859
 Return:
1860
1861
*******************************************************************************/
1862
165k
SACDEC_ERROR SpatialDecDecodeFrame(spatialDec *self, SPATIAL_BS_FRAME *frame) {
1863
165k
  SACDEC_ERROR err = MPS_OK;
1864
1865
165k
  self->extendFrame = 0;
1866
165k
  if (frame->paramSlot[frame->numParameterSets - 1] != self->timeSlots - 1) {
1867
2.71k
    self->extendFrame = 1;
1868
2.71k
  }
1869
1870
165k
  self->TsdTs = 0;
1871
1872
  /****** DTDF and MAP DATA ********/
1873
165k
  if ((err = decodeAndMapFrameOtt(self, frame)) != MPS_OK) goto bail;
1874
1875
165k
  if ((err = decodeAndMapFrameSmg(self, frame)) != MPS_OK) goto bail;
1876
1877
165k
  if (self->arbitraryDownmix != 0) {
1878
34.0k
    if ((err = decodeAndMapFrameArbdmx(self, frame)) != MPS_OK) goto bail;
1879
34.0k
  }
1880
1881
165k
  if (self->extendFrame) {
1882
2.71k
    frame->numParameterSets =
1883
2.71k
        fixMin(MAX_PARAMETER_SETS, frame->numParameterSets + 1);
1884
2.71k
    frame->paramSlot[frame->numParameterSets - 1] = self->timeSlots - 1;
1885
1886
10.0k
    for (int p = 0; p < frame->numParameterSets; p++) {
1887
7.31k
      if (frame->paramSlot[p] > self->timeSlots - 1) {
1888
0
        frame->paramSlot[p] = self->timeSlots - 1;
1889
0
        err = MPS_PARSE_ERROR;
1890
0
      }
1891
7.31k
    }
1892
2.71k
    if (err != MPS_OK) {
1893
0
      goto bail;
1894
0
    }
1895
2.71k
  }
1896
1897
165k
bail:
1898
165k
  return err;
1899
165k
} /* 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.3k
    spatialDec *self, SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig) {
1915
60.3k
  SACDEC_ERROR err = MPS_OK;
1916
60.3k
  int i;
1917
1918
60.3k
  self->samplingFreq = pSpatialSpecificConfig->samplingFreq;
1919
60.3k
  self->timeSlots = pSpatialSpecificConfig->nTimeSlots;
1920
60.3k
  self->frameLength = self->timeSlots * self->qmfBands;
1921
60.3k
  self->bitstreamParameterBands = pSpatialSpecificConfig->freqRes;
1922
1923
60.3k
  if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD)
1924
29.4k
    self->hybridBands = self->qmfBands;
1925
30.8k
  else
1926
30.8k
    self->hybridBands = SacGetHybridSubbands(self->qmfBands);
1927
60.3k
  self->tp_hybBandBorder = 12;
1928
1929
60.3k
  self->numParameterBands = self->bitstreamParameterBands;
1930
1931
60.3k
  if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) {
1932
29.4k
    switch (self->numParameterBands) {
1933
419
      case 4:
1934
419
        self->kernels = kernels_4_to_64;
1935
419
        break;
1936
9.97k
      case 5:
1937
9.97k
        self->kernels = kernels_5_to_64;
1938
9.97k
        break;
1939
387
      case 7:
1940
387
        self->kernels = kernels_7_to_64;
1941
387
        break;
1942
14.5k
      case 9:
1943
14.5k
        self->kernels = kernels_9_to_64;
1944
14.5k
        break;
1945
191
      case 12:
1946
191
        self->kernels = kernels_12_to_64;
1947
191
        break;
1948
934
      case 15:
1949
934
        self->kernels = kernels_15_to_64;
1950
934
        break;
1951
2.14k
      case 23:
1952
2.14k
        self->kernels = kernels_23_to_64;
1953
2.14k
        break;
1954
943
      default:
1955
943
        return MPS_INVALID_PARAMETERBANDS; /* unsupported numParameterBands */
1956
29.4k
    }
1957
30.8k
  } else {
1958
30.8k
    switch (self->numParameterBands) {
1959
994
      case 4:
1960
994
        self->kernels = kernels_4_to_71;
1961
994
        break;
1962
1.39k
      case 5:
1963
1.39k
        self->kernels = kernels_5_to_71;
1964
1.39k
        break;
1965
8.84k
      case 7:
1966
8.84k
        self->kernels = kernels_7_to_71;
1967
8.84k
        break;
1968
4.28k
      case 10:
1969
4.28k
        self->kernels = kernels_10_to_71;
1970
4.28k
        break;
1971
3.93k
      case 14:
1972
3.93k
        self->kernels = kernels_14_to_71;
1973
3.93k
        break;
1974
9.29k
      case 20:
1975
9.29k
        self->kernels = kernels_20_to_71;
1976
9.29k
        break;
1977
2.10k
      case 28:
1978
2.10k
        self->kernels = kernels_28_to_71;
1979
2.10k
        break;
1980
0
      default:
1981
0
        return MPS_INVALID_PARAMETERBANDS; /* unsupported numParameterBands */
1982
30.8k
    }
1983
30.8k
  }
1984
1985
  /* create param to hyb band table */
1986
59.3k
  FDKmemclear(self->param2hyb, (MAX_PARAMETER_BANDS + 1) * sizeof(int));
1987
2.87M
  for (i = 0; i < self->hybridBands; i++) {
1988
2.81M
    self->param2hyb[self->kernels[i] + 1] = i + 1;
1989
2.81M
  }
1990
59.3k
  {
1991
59.3k
    int pb = self->kernels[i - 1] + 2;
1992
1.07M
    for (; pb < (MAX_PARAMETER_BANDS + 1); pb++) {
1993
1.01M
      self->param2hyb[pb] = i;
1994
1.01M
    }
1995
1.72M
    for (pb = 0; pb < MAX_PARAMETER_BANDS; pb += 1) {
1996
1.66M
      self->kernels_width[pb] = self->param2hyb[pb + 1] - self->param2hyb[pb];
1997
1.66M
    }
1998
59.3k
  }
1999
2000
59.3k
  self->treeConfig = pSpatialSpecificConfig->treeConfig;
2001
2002
59.3k
  self->numOttBoxes = pSpatialSpecificConfig->nOttBoxes;
2003
2004
59.3k
  self->numInputChannels = pSpatialSpecificConfig->nInputChannels;
2005
2006
59.3k
  self->numOutputChannels = pSpatialSpecificConfig->nOutputChannels;
2007
2008
59.3k
  self->quantMode = pSpatialSpecificConfig->quantMode;
2009
2010
59.3k
  self->arbitraryDownmix = pSpatialSpecificConfig->bArbitraryDownmix;
2011
2012
59.3k
  self->numM2rows = self->numOutputChannels;
2013
2014
59.3k
  {
2015
59.3k
    self->residualCoding = 0;
2016
59.3k
    if (self->arbitraryDownmix == 2)
2017
0
      self->arbitraryDownmix = 1; /* no arbitrary downmix residuals */
2018
59.3k
  }
2019
59.3k
  if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC)) {
2020
30.8k
    self->residualCoding = pSpatialSpecificConfig->bResidualCoding;
2021
30.8k
  }
2022
2023
59.3k
  self->clipProtectGain__FDK =
2024
59.3k
      FX_CFG2FX_DBL(clipGainTable__FDK[pSpatialSpecificConfig->bsFixedGainDMX]);
2025
59.3k
  self->clipProtectGainSF__FDK =
2026
59.3k
      clipGainSFTable__FDK[pSpatialSpecificConfig->bsFixedGainDMX];
2027
2028
59.3k
  self->tempShapeConfig = pSpatialSpecificConfig->tempShapeConfig;
2029
2030
59.3k
  self->decorrConfig = pSpatialSpecificConfig->decorrConfig;
2031
2032
59.3k
  if (self->upmixType == UPMIXTYPE_BYPASS) {
2033
0
    self->numOutputChannels = self->numInputChannels;
2034
0
  }
2035
2036
59.3k
  self->numOutputChannelsAT = self->numOutputChannels;
2037
2038
59.3k
  self->numOttBandsIPD = pSpatialSpecificConfig->numOttBandsIPD;
2039
59.3k
  self->phaseCoding = pSpatialSpecificConfig->bsPhaseCoding;
2040
118k
  for (i = 0; i < self->numOttBoxes; i++) {
2041
59.3k
    {
2042
59.3k
      self->pConfigCurrent->bitstreamOttBands[i] =
2043
59.3k
          self->bitstreamParameterBands;
2044
59.3k
    }
2045
59.3k
    self->numOttBands[i] = self->pConfigCurrent->bitstreamOttBands[i];
2046
59.3k
  } /* i */
2047
2048
59.3k
  if (self->residualCoding) {
2049
9.55k
    int numBoxes = self->numOttBoxes;
2050
19.1k
    for (i = 0; i < numBoxes; i++) {
2051
9.55k
      self->residualPresent[i] =
2052
9.55k
          pSpatialSpecificConfig->ResidualConfig[i].bResidualPresent;
2053
2054
9.55k
      if (self->residualPresent[i]) {
2055
9.55k
        self->residualBands[i] =
2056
9.55k
            pSpatialSpecificConfig->ResidualConfig[i].nResidualBands;
2057
        /* conversion from hybrid bands to qmf bands */
2058
9.55k
        self->residualQMFBands[i] =
2059
9.55k
            fMax(self->param2hyb[self->residualBands[i]] + 3 - 10,
2060
9.55k
                 3); /* simplification for the lowest 10 hybrid bands */
2061
9.55k
      } else {
2062
0
        self->residualBands[i] = 0;
2063
0
        self->residualQMFBands[i] = 0;
2064
0
      }
2065
9.55k
    }
2066
9.55k
  } /* self->residualCoding */
2067
49.8k
  else {
2068
49.8k
    int boxes = self->numOttBoxes;
2069
99.6k
    for (i = 0; i < boxes; i += 1) {
2070
49.8k
      self->residualPresent[i] = 0;
2071
49.8k
      self->residualBands[i] = 0;
2072
49.8k
    }
2073
49.8k
  }
2074
2075
59.3k
  switch (self->treeConfig) {
2076
59.3k
    case TREE_212:
2077
59.3k
      self->numDirektSignals = 1;
2078
59.3k
      self->numDecorSignals = 1;
2079
59.3k
      self->numXChannels = 1;
2080
59.3k
      if (self->arbitraryDownmix == 2) {
2081
0
        self->numXChannels += 1;
2082
0
      }
2083
59.3k
      self->numVChannels = self->numDirektSignals + self->numDecorSignals;
2084
59.3k
      break;
2085
0
    default:
2086
0
      return MPS_INVALID_TREECONFIG;
2087
59.3k
  }
2088
2089
59.3k
  self->highRateMode = pSpatialSpecificConfig->bsHighRateMode;
2090
59.3k
  self->decorrType = pSpatialSpecificConfig->bsDecorrType;
2091
2092
59.3k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
2093
2094
59.3k
  return err;
2095
59.3k
}
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
24.5k
                                     BS_LL_STATE *llState) {
2111
24.5k
  SPATIAL_BS_FRAME *pBs = bsFrame;
2112
2113
24.5k
  const int maxNumOtt = MAX_NUM_OTT;
2114
24.5k
  const int maxNumInputChannels = MAX_INPUT_CHANNELS;
2115
2116
24.5k
  FDK_ALLOCATE_MEMORY_1D_P(
2117
24.5k
      pBs->cmpOttIPDidx, maxNumOtt * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS,
2118
24.5k
      SCHAR, SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS])
2119
2120
  /* Arbitrary Downmix */
2121
24.5k
  FDK_ALLOCATE_MEMORY_1D_P(
2122
24.5k
      pBs->cmpArbdmxGainIdx,
2123
24.5k
      maxNumInputChannels * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS, SCHAR,
2124
24.5k
      SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS])
2125
2126
  /* Lossless control */
2127
24.5k
  FDK_ALLOCATE_MEMORY_1D(pBs->CLDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2128
24.5k
  FDK_ALLOCATE_MEMORY_1D(pBs->ICCLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2129
2130
24.5k
  FDK_ALLOCATE_MEMORY_1D(pBs->IPDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2131
2132
24.5k
  pBs->newBsData = 0;
2133
24.5k
  pBs->numParameterSets = 1;
2134
2135
  /* Link lossless states */
2136
171k
  for (int x = 0; x < MAX_NUM_PARAMETERS; x++) {
2137
147k
    pBs->CLDLosslessData[x].state = &llState->CLDLosslessState[x];
2138
147k
    pBs->ICCLosslessData[x].state = &llState->ICCLosslessState[x];
2139
2140
147k
    pBs->IPDLosslessData[x].state = &llState->IPDLosslessState[x];
2141
147k
  }
2142
2143
24.5k
  return MPS_OK;
2144
2145
0
bail:
2146
0
  return MPS_OUTOFMEMORY;
2147
24.5k
}
2148
2149
/*******************************************************************************
2150
 Functionname: SpatialDecCloseBsFrame
2151
 *******************************************************************************
2152
2153
 Description: Close spatial bitstream structure
2154
2155
 Arguments:   spatialDec* self
2156
2157
 Return:      -
2158
2159
*******************************************************************************/
2160
24.5k
void SpatialDecCloseBsFrame(SPATIAL_BS_FRAME *pBs) {
2161
24.5k
  if (pBs != NULL) {
2162
    /* These arrays contain the compact indices, only one value per pbstride,
2163
     * only paramsets actually containing data. */
2164
2165
24.5k
    FDK_FREE_MEMORY_1D(pBs->cmpOttIPDidx);
2166
2167
    /* Arbitrary Downmix */
2168
24.5k
    FDK_FREE_MEMORY_1D(pBs->cmpArbdmxGainIdx);
2169
2170
    /* Lossless control */
2171
24.5k
    FDK_FREE_MEMORY_1D(pBs->IPDLosslessData);
2172
24.5k
    FDK_FREE_MEMORY_1D(pBs->CLDLosslessData);
2173
    FDK_FREE_MEMORY_1D(pBs->ICCLosslessData);
2174
24.5k
  }
2175
24.5k
}