Coverage Report

Created: 2025-11-16 07:20

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