Coverage Report

Created: 2025-07-11 06:54

/src/aac/libSACdec/src/sac_bitdec.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
5
Forschung e.V. All rights reserved.
6
7
 1.    INTRODUCTION
8
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10
scheme for digital audio. This FDK AAC Codec software is intended to be used on
11
a wide variety of Android devices.
12
13
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14
general perceptual audio codecs. AAC-ELD is considered the best-performing
15
full-bandwidth communications codec by independent studies and is widely
16
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17
specifications.
18
19
Patent licenses for necessary patent claims for the FDK AAC Codec (including
20
those of Fraunhofer) may be obtained through Via Licensing
21
(www.vialicensing.com) or through the respective patent owners individually for
22
the purpose of encoding or decoding bit streams in products that are compliant
23
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24
Android devices already license these patent claims through Via Licensing or
25
directly from the patent owners, and therefore FDK AAC Codec software may
26
already be covered under those patent licenses when it is used for those
27
licensed purposes only.
28
29
Commercially-licensed AAC software libraries, including floating-point versions
30
with enhanced sound quality, are also available from Fraunhofer. Users are
31
encouraged to check the Fraunhofer website for additional applications
32
information and documentation.
33
34
2.    COPYRIGHT LICENSE
35
36
Redistribution and use in source and binary forms, with or without modification,
37
are permitted without payment of copyright license fees provided that you
38
satisfy the following conditions:
39
40
You must retain the complete text of this software license in redistributions of
41
the FDK AAC Codec or your modifications thereto in source code form.
42
43
You must retain the complete text of this software license in the documentation
44
and/or other materials provided with redistributions of the FDK AAC Codec or
45
your modifications thereto in binary form. You must make available free of
46
charge copies of the complete source code of the FDK AAC Codec and your
47
modifications thereto to recipients of copies in binary form.
48
49
The name of Fraunhofer may not be used to endorse or promote products derived
50
from this library without prior written permission.
51
52
You may not charge copyright license fees for anyone to use, copy or distribute
53
the FDK AAC Codec software or your modifications thereto.
54
55
Your modified versions of the FDK AAC Codec must carry prominent notices stating
56
that you changed the software and the date of any change. For modified versions
57
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59
AAC Codec Library for Android."
60
61
3.    NO PATENT LICENSE
62
63
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65
Fraunhofer provides no warranty of patent non-infringement with respect to this
66
software.
67
68
You may use this FDK AAC Codec software or modifications thereto only for
69
purposes that are authorized by appropriate patent licenses.
70
71
4.    DISCLAIMER
72
73
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75
including but not limited to the implied warranties of merchantability and
76
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78
or consequential damages, including but not limited to procurement of substitute
79
goods or services; loss of use, data, or profits, or business interruption,
80
however caused and on any theory of liability, whether in contract, strict
81
liability, or tort (including negligence), arising in any way out of the use of
82
this software, even if advised of the possibility of such damage.
83
84
5.    CONTACT INFORMATION
85
86
Fraunhofer Institute for Integrated Circuits IIS
87
Attention: Audio and Multimedia Departments - FDK AAC LL
88
Am Wolfsmantel 33
89
91058 Erlangen, Germany
90
91
www.iis.fraunhofer.de/amm
92
amm-info@iis.fraunhofer.de
93
----------------------------------------------------------------------------- */
94
95
/*********************** MPEG surround decoder library *************************
96
97
   Author(s):
98
99
   Description: SAC 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
253k
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, UPMIXTYPE upmixType) {
120
253k
  int i;
121
253k
  UINT syntaxFlags;
122
123
  /* Determine bit stream syntax */
124
253k
  syntaxFlags = 0;
125
253k
  switch (pSpatialSpecificConfig->coreCodec) {
126
124k
    case AOT_ER_AAC_ELD:
127
124k
    case AOT_ER_AAC_LD:
128
124k
      syntaxFlags |= SACDEC_SYNTAX_LD;
129
124k
      break;
130
127k
    case AOT_USAC:
131
127k
      syntaxFlags |= SACDEC_SYNTAX_USAC;
132
127k
      break;
133
0
    case AOT_NONE:
134
1.07k
    default:
135
1.07k
      return MPS_UNSUPPORTED_FORMAT;
136
253k
  }
137
138
252k
  pSpatialSpecificConfig->syntaxFlags = syntaxFlags;
139
140
252k
  switch (pSpatialSpecificConfig->treeConfig) {
141
252k
    case TREE_212: {
142
252k
      pSpatialSpecificConfig->ottCLDdefault[0] = 0;
143
252k
    } break;
144
0
    default:
145
0
      return MPS_INVALID_TREECONFIG;
146
252k
  }
147
148
252k
  if (syntaxFlags & SACDEC_SYNTAX_USAC) {
149
127k
    if (pSpatialSpecificConfig->bsOttBandsPhasePresent) {
150
26.3k
      pSpatialSpecificConfig->numOttBandsIPD =
151
26.3k
          pSpatialSpecificConfig->bsOttBandsPhase;
152
101k
    } else {
153
101k
      int numParameterBands;
154
155
101k
      numParameterBands = pSpatialSpecificConfig->freqRes;
156
101k
      switch (numParameterBands) {
157
3.23k
        case 4:
158
7.12k
        case 5:
159
7.12k
          pSpatialSpecificConfig->numOttBandsIPD = 2;
160
7.12k
          break;
161
46.9k
        case 7:
162
46.9k
          pSpatialSpecificConfig->numOttBandsIPD = 3;
163
46.9k
          break;
164
15.0k
        case 10:
165
15.0k
          pSpatialSpecificConfig->numOttBandsIPD = 5;
166
15.0k
          break;
167
7.10k
        case 14:
168
7.10k
          pSpatialSpecificConfig->numOttBandsIPD = 7;
169
7.10k
          break;
170
17.2k
        case 20:
171
25.3k
        case 28:
172
25.3k
          pSpatialSpecificConfig->numOttBandsIPD = 10;
173
25.3k
          break;
174
0
        default:
175
0
          return MPS_INVALID_PARAMETERBANDS;
176
101k
      }
177
101k
    }
178
127k
  } else {
179
124k
    pSpatialSpecificConfig->numOttBandsIPD = 0;
180
124k
  }
181
505k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
182
252k
    {
183
252k
      pSpatialSpecificConfig->bitstreamOttBands[i] =
184
252k
          pSpatialSpecificConfig->freqRes;
185
252k
    }
186
252k
    {
187
252k
      pSpatialSpecificConfig->numOttBands[i] =
188
252k
          pSpatialSpecificConfig->bitstreamOttBands[i];
189
252k
      if (syntaxFlags & SACDEC_SYNTAX_USAC &&
190
252k
          !pSpatialSpecificConfig->bsOttBandsPhasePresent) {
191
101k
        if (pSpatialSpecificConfig->bResidualCoding &&
192
101k
            pSpatialSpecificConfig->ResidualConfig[i].bResidualPresent &&
193
101k
            (pSpatialSpecificConfig->numOttBandsIPD <
194
29.7k
             pSpatialSpecificConfig->ResidualConfig[i].nResidualBands)) {
195
6.34k
          pSpatialSpecificConfig->numOttBandsIPD =
196
6.34k
              pSpatialSpecificConfig->ResidualConfig[i].nResidualBands;
197
6.34k
        }
198
101k
      }
199
252k
    }
200
252k
  } /* i */
201
202
252k
  return MPS_OK;
203
252k
}
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
80.7k
    int numOttBoxes, int numTttBoxes, int numOutChan, int bitsAvailable) {
220
80.7k
  SACDEC_ERROR err = MPS_OK;
221
80.7k
  INT ba = bitsAvailable;
222
223
80.7k
  config->sacExtCnt = 0;
224
80.7k
  config->bResidualCoding = 0;
225
226
80.7k
  ba = fMin((int)FDKgetValidBits(bitstream), ba);
227
228
393k
  while ((ba >= 8) && (config->sacExtCnt < MAX_NUM_EXT_TYPES)) {
229
321k
    int bitsRead, nFillBits;
230
321k
    INT tmp;
231
321k
    UINT sacExtLen;
232
233
321k
    config->sacExtType[config->sacExtCnt] = FDKreadBits(bitstream, 4);
234
321k
    ba -= 4;
235
236
321k
    sacExtLen = FDKreadBits(bitstream, 4);
237
321k
    ba -= 4;
238
239
321k
    if (sacExtLen == 15) {
240
69.6k
      sacExtLen += FDKreadBits(bitstream, 8);
241
69.6k
      ba -= 8;
242
69.6k
      if (sacExtLen == 15 + 255) {
243
41.2k
        sacExtLen += FDKreadBits(bitstream, 16);
244
41.2k
        ba -= 16;
245
41.2k
      }
246
69.6k
    }
247
248
321k
    tmp = (INT)FDKgetValidBits(
249
321k
        bitstream); /* Extension config payload start anchor. */
250
321k
    if ((tmp <= 0) || (tmp < (INT)sacExtLen * 8) || (ba < (INT)sacExtLen * 8)) {
251
8.68k
      err = MPS_PARSE_ERROR;
252
8.68k
      goto bail;
253
8.68k
    }
254
255
312k
    switch (config->sacExtType[config->sacExtCnt]) {
256
312k
      default:; /* unknown extension data => do nothing */
257
312k
    }
258
259
    /* skip remaining extension data */
260
312k
    bitsRead = tmp - FDKgetValidBits(bitstream);
261
312k
    nFillBits = 8 * sacExtLen - bitsRead;
262
263
312k
    if (nFillBits < 0) {
264
0
      err = MPS_PARSE_ERROR;
265
0
      goto bail;
266
312k
    } else {
267
      /* Skip fill bits or an unkown extension. */
268
312k
      FDKpushFor(bitstream, nFillBits);
269
312k
    }
270
271
312k
    ba -= 8 * sacExtLen;
272
312k
    config->sacExtCnt++;
273
312k
  }
274
275
80.7k
bail:
276
80.7k
  return err;
277
80.7k
}
278
279
SACDEC_ERROR SpatialDecParseSpecificConfigHeader(
280
    HANDLE_FDK_BITSTREAM bitstream,
281
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig,
282
7.93k
    AUDIO_OBJECT_TYPE coreCodec, SPATIAL_DEC_UPMIX_TYPE upmixType) {
283
7.93k
  SACDEC_ERROR err = MPS_OK;
284
7.93k
  INT numFillBits;
285
7.93k
  int sacHeaderLen = 0;
286
7.93k
  int sacTimeAlignFlag = 0;
287
288
7.93k
  sacTimeAlignFlag = FDKreadBits(bitstream, 1);
289
7.93k
  sacHeaderLen = FDKreadBits(bitstream, 7);
290
291
7.93k
  if (sacHeaderLen == 127) {
292
421
    sacHeaderLen += FDKreadBits(bitstream, 16);
293
421
  }
294
7.93k
  numFillBits = (INT)FDKgetValidBits(bitstream);
295
296
7.93k
  err = SpatialDecParseSpecificConfig(bitstream, pSpatialSpecificConfig,
297
7.93k
                                      sacHeaderLen, coreCodec);
298
299
7.93k
  numFillBits -=
300
7.93k
      (INT)FDKgetValidBits(bitstream); /* the number of read bits (tmpBits) */
301
7.93k
  numFillBits = (8 * sacHeaderLen) - numFillBits;
302
7.93k
  if (numFillBits < 0) {
303
    /* Parsing went wrong */
304
38
    err = MPS_PARSE_ERROR;
305
38
  }
306
  /* Move to the very end of the SSC */
307
7.93k
  FDKpushBiDirectional(bitstream, numFillBits);
308
309
7.93k
  if ((err == MPS_OK) && sacTimeAlignFlag) {
310
    /* not supported */
311
191
    FDKreadBits(bitstream, 16);
312
191
    err = MPS_UNSUPPORTED_CONFIG;
313
191
  }
314
315
  /* Derive additional helper variables */
316
7.93k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, (UPMIXTYPE)upmixType);
317
318
7.93k
  return err;
319
7.93k
}
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
98.1k
    INT coreSbrFrameLengthIndex) {
326
98.1k
  int i;
327
328
98.1k
  FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG));
329
330
98.1k
  pSpatialSpecificConfig->stereoConfigIndex = stereoConfigIndex;
331
98.1k
  pSpatialSpecificConfig->coreSbrFrameLengthIndex = coreSbrFrameLengthIndex;
332
98.1k
  pSpatialSpecificConfig->freqRes =
333
98.1k
      (SPATIALDEC_FREQ_RES)freqResTable[FDKreadBits(bitstream, 3)];
334
98.1k
  if (pSpatialSpecificConfig->freqRes == 0) {
335
342
    return MPS_PARSE_ERROR; /* reserved value */
336
342
  }
337
338
97.8k
  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
97.8k
    case AOT_USAC:
349
97.8k
      pSpatialSpecificConfig->bsFixedGainDMX =
350
97.8k
          (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3);
351
97.8k
      pSpatialSpecificConfig->tempShapeConfig =
352
97.8k
          (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2);
353
97.8k
      pSpatialSpecificConfig->decorrConfig =
354
97.8k
          (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2);
355
97.8k
      if (pSpatialSpecificConfig->decorrConfig > 2) {
356
322
        return MPS_PARSE_ERROR; /* reserved value */
357
322
      }
358
97.5k
      pSpatialSpecificConfig->bsDecorrType = 0;
359
97.5k
      break;
360
0
    default:
361
0
      return MPS_UNSUPPORTED_FORMAT;
362
97.8k
  }
363
97.5k
  pSpatialSpecificConfig->nTimeSlots = (coreSbrFrameLengthIndex == 4) ? 64 : 32;
364
97.5k
  pSpatialSpecificConfig->bsHighRateMode = (UCHAR)FDKreadBits(bitstream, 1);
365
366
97.5k
  {
367
97.5k
    pSpatialSpecificConfig->bsPhaseCoding = (UCHAR)FDKreadBits(bitstream, 1);
368
97.5k
    pSpatialSpecificConfig->bsOttBandsPhasePresent =
369
97.5k
        (UCHAR)FDKreadBits(bitstream, 1);
370
97.5k
    if (pSpatialSpecificConfig->bsOttBandsPhasePresent) {
371
24.7k
      if (MAX_PARAMETER_BANDS < (pSpatialSpecificConfig->bsOttBandsPhase =
372
24.7k
                                     FDKreadBits(bitstream, 5))) {
373
232
        return MPS_PARSE_ERROR;
374
232
      }
375
72.8k
    } else {
376
72.8k
      pSpatialSpecificConfig->bsOttBandsPhase = 0;
377
72.8k
    }
378
97.5k
  }
379
380
97.3k
  if (stereoConfigIndex > 1) { /* do residual coding */
381
40.8k
    pSpatialSpecificConfig->bResidualCoding = 1;
382
40.8k
    pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 1;
383
40.8k
    if (pSpatialSpecificConfig->freqRes <
384
40.8k
        (pSpatialSpecificConfig->ResidualConfig->nResidualBands =
385
40.8k
             FDKreadBits(bitstream, 5))) {
386
700
      return MPS_PARSE_ERROR;
387
700
    }
388
40.1k
    pSpatialSpecificConfig->bsOttBandsPhase =
389
40.1k
        fMax(pSpatialSpecificConfig->bsOttBandsPhase,
390
40.1k
             pSpatialSpecificConfig->ResidualConfig->nResidualBands);
391
40.1k
    pSpatialSpecificConfig->bsPseudoLr = (UCHAR)FDKreadBits(bitstream, 1);
392
393
40.1k
    if (pSpatialSpecificConfig->bsPhaseCoding) {
394
10.9k
      pSpatialSpecificConfig->bsPhaseCoding = 3;
395
10.9k
    }
396
56.4k
  } else {
397
56.4k
    pSpatialSpecificConfig->bResidualCoding = 0;
398
56.4k
    pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 0;
399
56.4k
  }
400
401
96.6k
  if (pSpatialSpecificConfig->tempShapeConfig == 2) {
402
62.7k
    switch (coreCodec) {
403
62.7k
      case AOT_USAC:
404
62.7k
        pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1);
405
62.7k
        break;
406
0
      default: /* added to avoid compiler warning */
407
0
        break; /* added to avoid compiler warning */
408
62.7k
    }
409
62.7k
  }
410
411
  /* Static parameters */
412
413
96.6k
  pSpatialSpecificConfig->samplingFreq =
414
96.6k
      samplingRate; /* wrong for stereoConfigIndex == 3 but value is unused */
415
96.6k
  pSpatialSpecificConfig->treeConfig = SPATIALDEC_MODE_RSVD7;
416
96.6k
  pSpatialSpecificConfig->nOttBoxes =
417
96.6k
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
418
96.6k
  pSpatialSpecificConfig->nInputChannels =
419
96.6k
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
420
96.6k
  pSpatialSpecificConfig->nOutputChannels =
421
96.6k
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
422
423
96.6k
  pSpatialSpecificConfig->bArbitraryDownmix = 0;
424
425
193k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
426
96.6k
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
427
96.6k
  }
428
429
96.6k
  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
96.6k
  pSpatialSpecificConfig->coreCodec = coreCodec;
434
435
  /* Derive additional helper variables */
436
96.6k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
437
438
96.6k
  return MPS_OK;
439
96.6k
}
440
441
SACDEC_ERROR SpatialDecParseSpecificConfig(
442
    HANDLE_FDK_BITSTREAM bitstream,
443
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, int sacHeaderLen,
444
133k
    AUDIO_OBJECT_TYPE coreCodec) {
445
133k
  SACDEC_ERROR err = MPS_OK;
446
133k
  int i;
447
133k
  int bsSamplingFreqIndex;
448
133k
  int bsFreqRes, b3DaudioMode = 0;
449
133k
  int numHeaderBits;
450
133k
  int cfgStartPos, bitsAvailable;
451
452
133k
  FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG));
453
454
133k
  cfgStartPos = FDKgetValidBits(bitstream);
455
  /* It might be that we do not know the SSC length beforehand. */
456
133k
  if (sacHeaderLen == 0) {
457
42.9k
    bitsAvailable = cfgStartPos;
458
90.7k
  } else {
459
90.7k
    bitsAvailable = 8 * sacHeaderLen;
460
90.7k
    if (bitsAvailable > cfgStartPos) {
461
1.10k
      err = MPS_PARSE_ERROR;
462
1.10k
      goto bail;
463
1.10k
    }
464
90.7k
  }
465
466
132k
  bsSamplingFreqIndex = FDKreadBits(bitstream, 4);
467
468
132k
  if (bsSamplingFreqIndex == 15) {
469
14.2k
    pSpatialSpecificConfig->samplingFreq = FDKreadBits(bitstream, 24);
470
118k
  } else {
471
118k
    pSpatialSpecificConfig->samplingFreq =
472
118k
        samplingFreqTable[bsSamplingFreqIndex];
473
118k
    if (pSpatialSpecificConfig->samplingFreq == 0) {
474
1.42k
      err = MPS_PARSE_ERROR;
475
1.42k
      goto bail;
476
1.42k
    }
477
118k
  }
478
479
131k
  pSpatialSpecificConfig->nTimeSlots = FDKreadBits(bitstream, 5) + 1;
480
131k
  if ((pSpatialSpecificConfig->nTimeSlots < 1) ||
481
131k
      (pSpatialSpecificConfig->nTimeSlots > MAX_TIME_SLOTS)) {
482
0
    err = MPS_PARSE_ERROR;
483
0
    goto bail;
484
0
  }
485
486
131k
  bsFreqRes = FDKreadBits(bitstream, 3);
487
488
131k
  pSpatialSpecificConfig->freqRes =
489
131k
      (SPATIALDEC_FREQ_RES)freqResTable_LD[bsFreqRes];
490
491
131k
  {
492
131k
    UINT treeConfig = FDKreadBits(bitstream, 4);
493
494
131k
    switch (treeConfig) {
495
83.7k
      case SPATIALDEC_MODE_RSVD7:
496
83.7k
        pSpatialSpecificConfig->treeConfig = (SPATIALDEC_TREE_CONFIG)treeConfig;
497
83.7k
        break;
498
47.4k
      default:
499
47.4k
        err = MPS_UNSUPPORTED_CONFIG;
500
47.4k
        goto bail;
501
131k
    }
502
131k
  }
503
504
83.7k
  {
505
83.7k
    pSpatialSpecificConfig->nOttBoxes =
506
83.7k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
507
83.7k
    pSpatialSpecificConfig->nTttBoxes =
508
83.7k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numTttBoxes;
509
83.7k
    pSpatialSpecificConfig->nInputChannels =
510
83.7k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
511
83.7k
    pSpatialSpecificConfig->nOutputChannels =
512
83.7k
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
513
83.7k
  }
514
515
83.7k
  pSpatialSpecificConfig->quantMode =
516
83.7k
      (SPATIALDEC_QUANT_MODE)FDKreadBits(bitstream, 2);
517
518
83.7k
  pSpatialSpecificConfig->bArbitraryDownmix = FDKreadBits(bitstream, 1);
519
520
83.7k
  pSpatialSpecificConfig->bsFixedGainDMX =
521
83.7k
      (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3);
522
523
83.7k
  pSpatialSpecificConfig->tempShapeConfig =
524
83.7k
      (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2);
525
83.7k
  if (pSpatialSpecificConfig->tempShapeConfig > 2) {
526
1.77k
    return MPS_PARSE_ERROR; /* reserved value */
527
1.77k
  }
528
529
81.9k
  pSpatialSpecificConfig->decorrConfig =
530
81.9k
      (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2);
531
81.9k
  if (pSpatialSpecificConfig->decorrConfig > 2) {
532
781
    return MPS_PARSE_ERROR; /* reserved value */
533
781
  }
534
535
162k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
536
81.1k
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
537
81.1k
  }
538
539
81.1k
  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
81.1k
  if (pSpatialSpecificConfig->tempShapeConfig == 2) {
549
49.9k
    pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1);
550
49.9k
  }
551
552
81.1k
  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
81.1k
  FDKbyteAlign(bitstream,
578
81.1k
               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
81.1k
  numHeaderBits = cfgStartPos - (INT)FDKgetValidBits(bitstream);
583
81.1k
  bitsAvailable -= numHeaderBits;
584
81.1k
  if (bitsAvailable < 0) {
585
478
    err = MPS_PARSE_ERROR;
586
478
    goto bail;
587
478
  }
588
589
80.7k
  pSpatialSpecificConfig->sacExtCnt = 0;
590
80.7k
  pSpatialSpecificConfig->bResidualCoding = 0;
591
592
80.7k
  err = SpatialDecParseExtensionConfig(
593
80.7k
      bitstream, pSpatialSpecificConfig, pSpatialSpecificConfig->nOttBoxes,
594
80.7k
      pSpatialSpecificConfig->nTttBoxes,
595
80.7k
      pSpatialSpecificConfig->nOutputChannels, bitsAvailable);
596
597
80.7k
  FDKbyteAlign(
598
80.7k
      bitstream,
599
80.7k
      cfgStartPos); /* Same alignment anchor as above because
600
                       SpatialExtensionConfig() always reads full bytes */
601
602
80.7k
  pSpatialSpecificConfig->coreCodec = coreCodec;
603
604
80.7k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
605
606
131k
bail:
607
131k
  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
88.5k
    FDKpushBiDirectional(
611
88.5k
        bitstream,
612
88.5k
        (sacHeaderLen * 8) - (cfgStartPos - (INT)FDKgetValidBits(bitstream)));
613
88.5k
  }
614
615
131k
  return err;
616
80.7k
}
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
990
{
624
990
  int err = MPS_OK;
625
990
  int i;
626
627
990
  FDK_ASSERT(coreCodec != AOT_NONE);
628
990
  FDK_ASSERT(nTimeSlots > 0);
629
990
  FDK_ASSERT(samplingFreq > 0);
630
631
990
  pSpatialSpecificConfig->coreCodec = coreCodec;
632
990
  pSpatialSpecificConfig->samplingFreq = samplingFreq;
633
990
  pSpatialSpecificConfig->nTimeSlots = nTimeSlots;
634
990
  if ((pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_ELD) ||
635
990
      (pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_LD))
636
990
    pSpatialSpecificConfig->freqRes = SPATIALDEC_FREQ_RES_23;
637
0
  else
638
0
    pSpatialSpecificConfig->freqRes = SPATIALDEC_FREQ_RES_28;
639
640
990
  {
641
990
    pSpatialSpecificConfig->treeConfig =
642
990
        SPATIALDEC_MODE_RSVD7; /* 212  configuration */
643
990
  }
644
645
990
  {
646
990
    pSpatialSpecificConfig->nOttBoxes =
647
990
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
648
990
    pSpatialSpecificConfig->nInputChannels =
649
990
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
650
990
    pSpatialSpecificConfig->nOutputChannels =
651
990
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
652
990
  }
653
654
990
  pSpatialSpecificConfig->quantMode = SPATIALDEC_QUANT_FINE_DEF;
655
990
  pSpatialSpecificConfig->bArbitraryDownmix = 0;
656
990
  pSpatialSpecificConfig->bResidualCoding = 0;
657
990
  if ((pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_ELD) ||
658
990
      (pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_LD))
659
990
    pSpatialSpecificConfig->bsFixedGainDMX = SPATIALDEC_GAIN_RSVD2;
660
0
  else
661
0
    pSpatialSpecificConfig->bsFixedGainDMX = SPATIALDEC_GAIN_MODE0;
662
663
990
  pSpatialSpecificConfig->tempShapeConfig = SPATIALDEC_TS_TPNOWHITE;
664
990
  pSpatialSpecificConfig->decorrConfig = SPATIALDEC_DECORR_MODE0;
665
666
1.98k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
667
990
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
668
990
  }
669
670
990
  return err;
671
990
}
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
81.6k
                        int numBands) {
689
81.6k
  int i;
690
691
848k
  for (i = startBand; i < startBand + numBands; i++) {
692
767k
    data[i] <<= 1;
693
767k
  }
694
695
81.6k
  if (dataType == t_CLD) {
696
374k
    for (i = startBand; i < startBand + numBands; i++) {
697
339k
      if (data[i] == -14)
698
108k
        data[i] = -15;
699
231k
      else if (data[i] == 14)
700
21.2k
        data[i] = 15;
701
339k
    }
702
34.5k
  }
703
81.6k
}
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
21.0k
                        int numBands) {
721
21.0k
  int i;
722
723
220k
  for (i = startBand; i < startBand + numBands; i++) {
724
    /* Note: the if cases below actually make a difference (negative values) */
725
199k
    if (dataType == t_CLD)
726
93.4k
      data[i] /= 2;
727
106k
    else
728
106k
      data[i] >>= 1;
729
199k
  }
730
21.0k
}
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
57.9k
                        int *aStrides) {
748
57.9k
  int i, pb, pbStride, dataBands, strOffset;
749
750
57.9k
  pbStride = pbStrideTable[freqResStride];
751
57.9k
  dataBands = (stopBand - startBand - 1) / pbStride + 1;
752
753
57.9k
  aStrides[0] = startBand;
754
306k
  for (pb = 1; pb <= dataBands; pb++) {
755
248k
    aStrides[pb] = aStrides[pb - 1] + pbStride;
756
248k
  }
757
57.9k
  strOffset = 0;
758
393k
  while (aStrides[dataBands] > stopBand) {
759
335k
    if (strOffset < dataBands) strOffset++;
760
675k
    for (i = strOffset; i <= dataBands; i++) {
761
339k
      aStrides[i]--;
762
339k
    }
763
335k
  }
764
765
57.9k
  return dataBands;
766
57.9k
}
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
301k
    int datatype, int boxIdx, int startBand, int stopBand, SCHAR defaultValue) {
789
301k
  SACDEC_ERROR err = MPS_OK;
790
301k
  int i, j, pb, dataSets, setIdx, bsDataPair, dataBands, oldQuantCoarseXXX;
791
301k
  INT aStrides[MAX_PARAMETER_BANDS + 1] = {0};
792
793
301k
  dataSets = 0;
794
737k
  for (i = 0; i < frame->numParameterSets; i++) {
795
439k
    llData->bsXXXDataMode[i] = (SCHAR)FDKreadBits(bitstream, 2);
796
797
439k
    if ((frame->bsIndependencyFlag == 1) && (i == 0) &&
798
439k
        (llData->bsXXXDataMode[i] == 1 ||
799
257k
         llData->bsXXXDataMode[i] == 2)) { /* This check catches bitstreams
800
                                              generated by older encoder that
801
                                              cause trouble */
802
150
      return MPS_PARSE_ERROR;
803
150
    }
804
439k
    if ((i >= frame->numParameterSets - 1) &&
805
439k
        (llData->bsXXXDataMode[i] ==
806
301k
         2)) { /* The interpolation mode must not be active for the last
807
                  parameter set */
808
2.97k
      return MPS_PARSE_ERROR;
809
2.97k
    }
810
811
436k
    if (llData->bsXXXDataMode[i] == 3) {
812
84.0k
      dataSets++;
813
84.0k
    }
814
436k
  }
815
816
298k
  setIdx = 0;
817
298k
  bsDataPair = 0;
818
298k
  oldQuantCoarseXXX = llData->state->bsQuantCoarseXXXprevParse;
819
820
732k
  for (i = 0; i < frame->numParameterSets; i++) {
821
434k
    if (llData->bsXXXDataMode[i] == 0) {
822
3.02M
      for (pb = startBand; pb < stopBand; pb++) {
823
2.72M
        lastdata[boxIdx][pb] = defaultValue;
824
2.72M
      }
825
826
304k
      oldQuantCoarseXXX = 0;
827
304k
    }
828
829
434k
    if (llData->bsXXXDataMode[i] == 3) {
830
83.4k
      if (bsDataPair) {
831
25.5k
        bsDataPair = 0;
832
57.9k
      } else {
833
57.9k
        bsDataPair = FDKreadBits(bitstream, 1);
834
57.9k
        llData->bsQuantCoarseXXX[setIdx] = (UCHAR)FDKreadBits(bitstream, 1);
835
57.9k
        llData->bsFreqResStrideXXX[setIdx] = (UCHAR)FDKreadBits(bitstream, 2);
836
837
57.9k
        if (llData->bsQuantCoarseXXX[setIdx] != oldQuantCoarseXXX) {
838
30.2k
          if (oldQuantCoarseXXX) {
839
9.14k
            coarse2fine(lastdata[boxIdx], (DATA_TYPE)datatype, startBand,
840
9.14k
                        stopBand - startBand);
841
21.0k
          } else {
842
21.0k
            fine2coarse(lastdata[boxIdx], (DATA_TYPE)datatype, startBand,
843
21.0k
                        stopBand - startBand);
844
21.0k
          }
845
30.2k
        }
846
847
57.9k
        dataBands = getStrideMap(llData->bsFreqResStrideXXX[setIdx], startBand,
848
57.9k
                                 stopBand, aStrides);
849
850
306k
        for (pb = 0; pb < dataBands; pb++) {
851
248k
          lastdata[boxIdx][startBand + pb] = lastdata[boxIdx][aStrides[pb]];
852
248k
        }
853
854
57.9k
        if (boxIdx > MAX_NUM_OTT) return MPS_INVALID_BOXIDX;
855
57.9k
        if ((setIdx + bsDataPair) > MAX_PARAMETER_SETS)
856
0
          return MPS_INVALID_SETIDX;
857
858
        /* DECODER_TYPE defined in FDK_tools */
859
57.9k
        DECODER_TYPE this_decoder_type = SAC_DECODER;
860
57.9k
        if (syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) {
861
53.1k
          this_decoder_type = USAC_DECODER;
862
53.1k
        } else if (syntaxFlags & SACDEC_SYNTAX_LD) {
863
4.82k
          this_decoder_type = SAOC_DECODER;
864
4.82k
        }
865
866
57.9k
        err = (SACDEC_ERROR)EcDataPairDec(
867
57.9k
            this_decoder_type, bitstream, data[boxIdx][setIdx + 0],
868
57.9k
            data[boxIdx][setIdx + 1], lastdata[boxIdx], (DATA_TYPE)datatype,
869
57.9k
            startBand, dataBands, bsDataPair, llData->bsQuantCoarseXXX[setIdx],
870
57.9k
            !(frame->bsIndependencyFlag && (i == 0)) || (setIdx > 0));
871
57.9k
        if (err != MPS_OK) goto bail;
872
873
56.7k
        if (datatype == t_IPD) {
874
10.5k
          const SCHAR mask = (llData->bsQuantCoarseXXX[setIdx]) ? 7 : 15;
875
56.3k
          for (pb = 0; pb < dataBands; pb++) {
876
127k
            for (j = aStrides[pb]; j < aStrides[pb + 1]; j++) {
877
81.5k
              lastdata[boxIdx][j] =
878
81.5k
                  data[boxIdx][setIdx + bsDataPair][startBand + pb] & mask;
879
81.5k
            }
880
45.8k
          }
881
46.2k
        } else {
882
242k
          for (pb = 0; pb < dataBands; pb++) {
883
651k
            for (j = aStrides[pb]; j < aStrides[pb + 1]; j++) {
884
455k
              lastdata[boxIdx][j] =
885
455k
                  data[boxIdx][setIdx + bsDataPair][startBand + pb];
886
455k
            }
887
196k
          }
888
46.2k
        }
889
890
56.7k
        oldQuantCoarseXXX = llData->bsQuantCoarseXXX[setIdx];
891
892
56.7k
        if (bsDataPair) {
893
34.3k
          llData->bsQuantCoarseXXX[setIdx + 1] =
894
34.3k
              llData->bsQuantCoarseXXX[setIdx];
895
34.3k
          llData->bsFreqResStrideXXX[setIdx + 1] =
896
34.3k
              llData->bsFreqResStrideXXX[setIdx];
897
34.3k
        }
898
56.7k
        setIdx += bsDataPair + 1;
899
56.7k
      } /* !bsDataPair */
900
83.4k
    }   /* llData->bsXXXDataMode[i] == 3 */
901
434k
  }
902
903
297k
  llData->state->bsQuantCoarseXXXprevParse = oldQuantCoarseXXX;
904
905
298k
bail:
906
298k
  return err;
907
297k
}
908
909
/*******************************************************************************
910
 Functionname: parseArbitraryDownmixData
911
 *******************************************************************************
912
913
 Description:
914
915
 Arguments:
916
917
 Return:
918
919
*******************************************************************************/
920
static SACDEC_ERROR parseArbitraryDownmixData(
921
    spatialDec *self, const SPATIAL_SPECIFIC_CONFIG *pSSC,
922
    const UINT syntaxFlags, const SPATIAL_BS_FRAME *frame,
923
4.35k
    HANDLE_FDK_BITSTREAM bitstream) {
924
4.35k
  SACDEC_ERROR err = MPS_OK;
925
4.35k
  int ch;
926
4.35k
  int offset = pSSC->nOttBoxes;
927
928
  /* CLD (arbitrary down-mix gains) */
929
7.38k
  for (ch = 0; ch < pSSC->nInputChannels; ch++) {
930
4.35k
    err = ecDataDec(frame, syntaxFlags, bitstream,
931
4.35k
                    &frame->CLDLosslessData[offset + ch],
932
4.35k
                    frame->cmpArbdmxGainIdx, self->cmpArbdmxGainIdxPrev, t_CLD,
933
4.35k
                    ch, 0, pSSC->freqRes, arbdmxGainDefault);
934
4.35k
    if (err != MPS_OK) return err;
935
4.35k
  }
936
937
3.02k
  return err;
938
939
4.35k
} /* parseArbitraryDownmixData */
940
941
/*******************************************************************************
942
 Functionname: SpatialDecParseFrame
943
 *******************************************************************************
944
945
 Description:
946
947
 Arguments:
948
949
 Input:
950
951
 Output:
952
953
*******************************************************************************/
954
955
6.59k
static int nBitsParamSlot(int i) {
956
6.59k
  int bitsParamSlot;
957
958
6.59k
  bitsParamSlot = fMax(0, DFRACT_BITS - 1 - fNormz((FIXP_DBL)i));
959
6.59k
  if ((1 << bitsParamSlot) < i) {
960
87
    bitsParamSlot++;
961
87
  }
962
6.59k
  FDK_ASSERT((bitsParamSlot >= 0) && (bitsParamSlot <= 32));
963
964
6.59k
  return bitsParamSlot;
965
6.59k
}
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
148k
    int fGlobalIndependencyFlag) {
972
148k
  SACDEC_ERROR err = MPS_OK;
973
148k
  int bsFramingType, dataBands, ps, pg, i;
974
148k
  int pb;
975
148k
  int numTempShapeChan = 0;
976
148k
  int bsNumOutputChannels =
977
148k
      treePropertyTable[pSpatialSpecificConfig->treeConfig]
978
148k
          .numOutputChannels; /* CAUTION: Maybe different to
979
                                 pSpatialSpecificConfig->treeConfig in some
980
                                 modes! */
981
148k
  int paramSetErr = 0;
982
148k
  UINT alignAnchor = FDKgetValidBits(
983
148k
      bitstream); /* Anchor for ByteAlign() function. See comment below. */
984
148k
  UINT syntaxFlags;
985
986
148k
  syntaxFlags = pSpatialSpecificConfig->syntaxFlags;
987
988
148k
  if ((syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) &&
989
148k
      pSpatialSpecificConfig->bsHighRateMode == 0) {
990
16.9k
    bsFramingType = 0; /* fixed framing */
991
16.9k
    frame->numParameterSets = 1;
992
131k
  } else {
993
131k
    bsFramingType = FDKreadBits(bitstream, 1);
994
131k
    if (syntaxFlags & SACDEC_SYNTAX_LD)
995
7.72k
      frame->numParameterSets = FDKreadBits(bitstream, 1) + 1;
996
123k
    else
997
123k
      frame->numParameterSets = FDKreadBits(bitstream, 3) + 1;
998
131k
  }
999
1000
  /* Any error after this line shall trigger parameter invalidation at bail
1001
   * label. */
1002
148k
  paramSetErr = 1;
1003
1004
148k
  if (frame->numParameterSets >= MAX_PARAMETER_SETS) {
1005
0
    goto bail;
1006
0
  }
1007
1008
  /* Basic config check. */
1009
148k
  if (pSpatialSpecificConfig->nInputChannels <= 0 ||
1010
148k
      pSpatialSpecificConfig->nOutputChannels <= 0) {
1011
0
    err = MPS_UNSUPPORTED_CONFIG;
1012
0
    goto bail;
1013
0
  }
1014
1015
148k
  if (bsFramingType) {
1016
6.59k
    int prevParamSlot = -1;
1017
6.59k
    int bitsParamSlot;
1018
1019
6.59k
    {
1020
6.59k
      bitsParamSlot = nBitsParamSlot(pSpatialSpecificConfig->nTimeSlots);
1021
1022
15.4k
      for (i = 0; i < frame->numParameterSets; i++) {
1023
9.22k
        frame->paramSlot[i] = FDKreadBits(bitstream, bitsParamSlot);
1024
        /* Sanity check */
1025
9.22k
        if ((frame->paramSlot[i] <= prevParamSlot) ||
1026
9.22k
            (frame->paramSlot[i] >= pSpatialSpecificConfig->nTimeSlots)) {
1027
336
          err = MPS_PARSE_ERROR;
1028
336
          goto bail;
1029
336
        }
1030
8.88k
        prevParamSlot = frame->paramSlot[i];
1031
8.88k
      }
1032
6.59k
    }
1033
141k
  } else {
1034
341k
    for (i = 0; i < frame->numParameterSets; i++) {
1035
199k
      frame->paramSlot[i] = ((pSpatialSpecificConfig->nTimeSlots * (i + 1)) /
1036
199k
                             frame->numParameterSets) -
1037
199k
                            1;
1038
199k
    }
1039
141k
  }
1040
1041
148k
  if ((syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) &&
1042
148k
      fGlobalIndependencyFlag) {
1043
123k
    frame->bsIndependencyFlag = 1;
1044
123k
  } else {
1045
24.8k
    frame->bsIndependencyFlag = (UCHAR)FDKreadBits(bitstream, 1);
1046
24.8k
  }
1047
1048
  /*
1049
   * OttData()
1050
   */
1051
294k
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
1052
148k
    err = ecDataDec(frame, syntaxFlags, bitstream, &frame->CLDLosslessData[i],
1053
148k
                    frame->cmpOttCLDidx, self->cmpOttCLDidxPrev, t_CLD, i, 0,
1054
148k
                    pSpatialSpecificConfig->bitstreamOttBands[i],
1055
148k
                    pSpatialSpecificConfig->ottCLDdefault[i]);
1056
148k
    if (err != MPS_OK) {
1057
2.32k
      goto bail;
1058
2.32k
    }
1059
148k
  } /* i < numOttBoxes */
1060
1061
145k
  {
1062
291k
    for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
1063
145k
      err = ecDataDec(frame, syntaxFlags, bitstream, &frame->ICCLosslessData[i],
1064
145k
                      frame->cmpOttICCidx, self->cmpOttICCidxPrev, t_ICC, i, 0,
1065
145k
                      pSpatialSpecificConfig->bitstreamOttBands[i], ICCdefault);
1066
145k
      if (err != MPS_OK) {
1067
602
        goto bail;
1068
602
      }
1069
145k
    } /* i < numOttBoxes */
1070
145k
  }   /* !oneICC */
1071
1072
145k
  if ((pSpatialSpecificConfig->treeConfig == SPATIALDEC_MODE_RSVD7) &&
1073
145k
      (pSpatialSpecificConfig->bsPhaseCoding)) {
1074
12.5k
    frame->phaseMode = FDKreadBits(bitstream, 1);
1075
1076
12.5k
    if (frame->phaseMode == 0) {
1077
56.5k
      for (pb = 0; pb < pSpatialSpecificConfig->numOttBandsIPD; pb++) {
1078
47.0k
        self->cmpOttIPDidxPrev[0][pb] = 0;
1079
305k
        for (i = 0; i < frame->numParameterSets; i++) {
1080
258k
          frame->cmpOttIPDidx[0][i][pb] = 0;
1081
          // frame->ottIPDidx[0][i][pb] = 0;
1082
258k
        }
1083
        /* self->ottIPDidxPrev[0][pb] = 0; */
1084
47.0k
      }
1085
9.49k
      frame->OpdSmoothingMode = 0;
1086
9.49k
    } else {
1087
3.08k
      frame->OpdSmoothingMode = FDKreadBits(bitstream, 1);
1088
3.08k
      err = ecDataDec(frame, syntaxFlags, bitstream, &frame->IPDLosslessData[0],
1089
3.08k
                      frame->cmpOttIPDidx, self->cmpOttIPDidxPrev, t_IPD, 0, 0,
1090
3.08k
                      pSpatialSpecificConfig->numOttBandsIPD, IPDdefault);
1091
3.08k
      if (err != MPS_OK) {
1092
66
        goto bail;
1093
66
      }
1094
3.08k
    }
1095
12.5k
  }
1096
1097
  /*
1098
   * SmgData()
1099
   */
1100
1101
145k
  {
1102
145k
    if (!pSpatialSpecificConfig->bsHighRateMode &&
1103
145k
        (syntaxFlags & SACDEC_SYNTAX_USAC)) {
1104
33.8k
      for (ps = 0; ps < frame->numParameterSets; ps++) {
1105
16.9k
        frame->bsSmoothMode[ps] = 0;
1106
16.9k
      }
1107
128k
    } else {
1108
314k
      for (ps = 0; ps < frame->numParameterSets; ps++) {
1109
186k
        frame->bsSmoothMode[ps] = (UCHAR)FDKreadBits(bitstream, 2);
1110
186k
        if (frame->bsSmoothMode[ps] >= 2) {
1111
16.8k
          frame->bsSmoothTime[ps] = (UCHAR)FDKreadBits(bitstream, 2);
1112
16.8k
        }
1113
186k
        if (frame->bsSmoothMode[ps] == 3) {
1114
8.52k
          frame->bsFreqResStrideSmg[ps] = (UCHAR)FDKreadBits(bitstream, 2);
1115
8.52k
          dataBands = (pSpatialSpecificConfig->freqRes - 1) /
1116
8.52k
                          pbStrideTable[frame->bsFreqResStrideSmg[ps]] +
1117
8.52k
                      1;
1118
45.6k
          for (pg = 0; pg < dataBands; pg++) {
1119
37.1k
            frame->bsSmgData[ps][pg] = (UCHAR)FDKreadBits(bitstream, 1);
1120
37.1k
          }
1121
8.52k
        }
1122
186k
      } /* ps < numParameterSets */
1123
128k
    }
1124
145k
  }
1125
1126
  /*
1127
   * TempShapeData()
1128
   */
1129
145k
  if ((pSpatialSpecificConfig->tempShapeConfig == 3) &&
1130
145k
      (syntaxFlags & SACDEC_SYNTAX_USAC)) {
1131
10.4k
    int TsdErr;
1132
10.4k
    TsdErr = TsdRead(bitstream, pSpatialSpecificConfig->nTimeSlots,
1133
10.4k
                     &frame->TsdData[0]);
1134
10.4k
    if (TsdErr) {
1135
0
      err = MPS_PARSE_ERROR;
1136
0
      goto bail;
1137
0
    }
1138
134k
  } else {
1139
134k
    frame->TsdData[0].bsTsdEnable = 0;
1140
134k
  }
1141
1142
435k
  for (i = 0; i < bsNumOutputChannels; i++) {
1143
290k
    frame->tempShapeEnableChannelSTP[i] = 0;
1144
290k
    frame->tempShapeEnableChannelGES[i] = 0;
1145
290k
  }
1146
1147
145k
  if ((pSpatialSpecificConfig->tempShapeConfig == 1) ||
1148
145k
      (pSpatialSpecificConfig->tempShapeConfig == 2)) {
1149
130k
    int bsTempShapeEnable = FDKreadBits(bitstream, 1);
1150
130k
    if (bsTempShapeEnable) {
1151
6.46k
      numTempShapeChan =
1152
6.46k
          tempShapeChanTable[pSpatialSpecificConfig->tempShapeConfig - 1]
1153
6.46k
                            [pSpatialSpecificConfig->treeConfig];
1154
6.46k
      switch (pSpatialSpecificConfig->tempShapeConfig) {
1155
2.73k
        case 1: /* STP */
1156
8.19k
          for (i = 0; i < numTempShapeChan; i++) {
1157
5.46k
            int stpEnable = FDKreadBits(bitstream, 1);
1158
5.46k
            frame->tempShapeEnableChannelSTP[i] = stpEnable;
1159
5.46k
          }
1160
2.73k
          break;
1161
3.73k
        case 2: /* GES */
1162
3.73k
        {
1163
3.73k
          UCHAR gesChannelEnable[MAX_OUTPUT_CHANNELS];
1164
1165
11.2k
          for (i = 0; i < numTempShapeChan; i++) {
1166
7.47k
            gesChannelEnable[i] = (UCHAR)FDKreadBits(bitstream, 1);
1167
7.47k
            frame->tempShapeEnableChannelGES[i] = gesChannelEnable[i];
1168
7.47k
          }
1169
10.9k
          for (i = 0; i < numTempShapeChan; i++) {
1170
7.39k
            if (gesChannelEnable[i]) {
1171
3.75k
              int envShapeData_tmp[MAX_TIME_SLOTS];
1172
3.75k
              if (huff_dec_reshape(bitstream, envShapeData_tmp,
1173
3.75k
                                   pSpatialSpecificConfig->nTimeSlots) != 0) {
1174
144
                err = MPS_PARSE_ERROR;
1175
144
                goto bail;
1176
144
              }
1177
118k
              for (int ts = 0; ts < pSpatialSpecificConfig->nTimeSlots; ts++) {
1178
114k
                if (!(envShapeData_tmp[ts] >= 0) &&
1179
114k
                    (envShapeData_tmp[ts] <= 4)) {
1180
0
                  err = MPS_PARSE_ERROR;
1181
0
                  goto bail;
1182
0
                }
1183
114k
                frame->bsEnvShapeData[i][ts] = (UCHAR)envShapeData_tmp[ts];
1184
114k
              }
1185
3.60k
            }
1186
7.39k
          }
1187
3.73k
        } break;
1188
3.59k
        default:
1189
0
          err = MPS_INVALID_TEMPSHAPE;
1190
0
          goto bail;
1191
6.46k
      }
1192
6.46k
    } /* bsTempShapeEnable */
1193
130k
  }   /* pSpatialSpecificConfig->tempShapeConfig != 0 */
1194
1195
145k
  if (pSpatialSpecificConfig->bArbitraryDownmix != 0) {
1196
4.35k
    err = parseArbitraryDownmixData(self, pSpatialSpecificConfig, syntaxFlags,
1197
4.35k
                                    frame, bitstream);
1198
4.35k
    if (err != MPS_OK) goto bail;
1199
4.35k
  }
1200
1201
143k
  if (1 && (!(syntaxFlags & (SACDEC_SYNTAX_USAC)))) {
1202
3.14k
    FDKbyteAlign(bitstream,
1203
3.14k
                 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
3.14k
  }
1207
1208
148k
bail:
1209
148k
  if (err != MPS_OK && paramSetErr != 0) {
1210
    /* Since the parameter set data has already been written to the instance we
1211
     * need to ... */
1212
4.80k
    frame->numParameterSets = 0; /* ... signal that it is corrupt ... */
1213
4.80k
  }
1214
1215
148k
  return err;
1216
1217
143k
} /* 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
92.8k
                          int stopBand, int stride) {
1232
92.8k
  int inBands, outBands, bandsAchived, bandsDiff, incr, k, i;
1233
92.8k
  int vDk[MAX_PARAMETER_BANDS + 1];
1234
92.8k
  inBands = stopBand - startBand;
1235
92.8k
  outBands = (inBands - 1) / stride + 1;
1236
1237
92.8k
  if (outBands < 1) {
1238
3.34k
    outBands = 1;
1239
3.34k
  }
1240
1241
92.8k
  bandsAchived = outBands * stride;
1242
92.8k
  bandsDiff = inBands - bandsAchived;
1243
406k
  for (i = 0; i < outBands; i++) {
1244
313k
    vDk[i] = stride;
1245
313k
  }
1246
1247
92.8k
  if (bandsDiff > 0) {
1248
0
    incr = -1;
1249
0
    k = outBands - 1;
1250
92.8k
  } else {
1251
92.8k
    incr = 1;
1252
92.8k
    k = 0;
1253
92.8k
  }
1254
1255
720k
  while (bandsDiff != 0) {
1256
627k
    vDk[k] = vDk[k] - incr;
1257
627k
    k = k + incr;
1258
627k
    bandsDiff = bandsDiff + incr;
1259
627k
    if (k >= outBands) {
1260
622k
      if (bandsDiff > 0) {
1261
0
        k = outBands - 1;
1262
622k
      } else if (bandsDiff < 0) {
1263
586k
        k = 0;
1264
586k
      }
1265
622k
    }
1266
627k
  }
1267
92.8k
  aMap[0] = startBand;
1268
406k
  for (i = 0; i < outBands; i++) {
1269
313k
    aMap[i + 1] = aMap[i] + vDk[i];
1270
313k
  }
1271
92.8k
} /* 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
84.9k
{
1289
84.9k
  int i, j;
1290
84.9k
  int startBand0 = pMap[0];
1291
1292
362k
  for (i = 0; i < dataBands; i++) {
1293
277k
    int startBand, stopBand, value;
1294
1295
277k
    value = pInput[i + startBand0];
1296
1297
277k
    startBand = pMap[i];
1298
277k
    stopBand = pMap[i + 1];
1299
1.05M
    for (j = startBand; j < stopBand; j++) {
1300
781k
      pOutput[j] = value;
1301
781k
    }
1302
277k
  }
1303
84.9k
}
1304
1305
/*******************************************************************************
1306
 Functionname: deq
1307
 *******************************************************************************
1308
1309
 Description:
1310
1311
 Arguments:
1312
1313
 Return:
1314
1315
*******************************************************************************/
1316
5.47M
static int deqIdx(int value, int paramType) {
1317
5.47M
  int idx = -1;
1318
1319
5.47M
  switch (paramType) {
1320
2.66M
    case t_CLD:
1321
2.66M
      if (((value + 15) >= 0) && ((value + 15) < 31)) {
1322
2.62M
        idx = (value + 15);
1323
2.62M
      }
1324
2.66M
      break;
1325
1326
2.35M
    case t_ICC:
1327
2.35M
      if ((value >= 0) && (value < 8)) {
1328
2.26M
        idx = value;
1329
2.26M
      }
1330
2.35M
      break;
1331
1332
455k
    case t_IPD:
1333
      /* (+/-)15 * MAX_PARAMETER_BANDS for differential coding in frequency
1334
       * domain (according to rbl) */
1335
455k
      if ((value >= -420) && (value <= 420)) {
1336
455k
        idx = (value & 0xf);
1337
455k
      }
1338
455k
      break;
1339
1340
0
    default:
1341
0
      FDK_ASSERT(0);
1342
5.47M
  }
1343
1344
5.47M
  return idx;
1345
5.47M
}
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
452k
    FIXP_DBL (*pOttVsTotDb2)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]) {
1464
452k
  int aParamSlots[MAX_PARAMETER_SETS];
1465
452k
  int aInterpolate[MAX_PARAMETER_SETS] = {0};
1466
1467
452k
  int dataSets;
1468
452k
  int aMap[MAX_PARAMETER_BANDS + 1];
1469
1470
452k
  int setIdx, i, band, parmSlot;
1471
452k
  int dataBands;
1472
452k
  int ps, pb;
1473
452k
  int i1;
1474
1475
452k
  if (numParameterSets > MAX_PARAMETER_SETS) return MPS_WRONG_PARAMETERSETS;
1476
1477
452k
  dataSets = 0;
1478
1.06M
  for (i = 0; i < numParameterSets; i++) {
1479
610k
    if (llData->bsXXXDataMode[i] == 3) {
1480
93.0k
      aParamSlots[dataSets] = i;
1481
93.0k
      dataSets++;
1482
93.0k
    }
1483
610k
  }
1484
1485
452k
  setIdx = 0;
1486
1487
  /* Main concealment stage is here: */
1488
452k
  SpatialDecConcealment_Apply(
1489
452k
      concealmentInfo, cmpIdxData[xttIdx],
1490
452k
      (diffIdxData != NULL) ? diffIdxData[xttIdx] : NULL, idxPrev[xttIdx],
1491
452k
      llData->bsXXXDataMode, startBand, stopBand, defaultValue, paramType,
1492
452k
      numParameterSets);
1493
1494
  /* Prepare data */
1495
1.06M
  for (i = 0; i < numParameterSets; i++) {
1496
610k
    if (llData->bsXXXDataMode[i] == 0) {
1497
417k
      llData->nocmpQuantCoarseXXX[i] = 0;
1498
3.91M
      for (band = startBand; band < stopBand; band++) {
1499
3.49M
        outputIdxData[xttIdx][i][band] = defaultValue;
1500
3.49M
      }
1501
3.91M
      for (band = startBand; band < stopBand; band++) {
1502
3.49M
        idxPrev[xttIdx][band] = outputIdxData[xttIdx][i][band];
1503
3.49M
      }
1504
      /* Because the idxPrev are also set to the defaultValue -> signalize fine
1505
       */
1506
417k
      llData->state->bsQuantCoarseXXXprev = 0;
1507
417k
    }
1508
1509
610k
    if (llData->bsXXXDataMode[i] == 1) {
1510
1.01M
      for (band = startBand; band < stopBand; band++) {
1511
936k
        outputIdxData[xttIdx][i][band] = idxPrev[xttIdx][band];
1512
936k
      }
1513
81.7k
      llData->nocmpQuantCoarseXXX[i] = llData->state->bsQuantCoarseXXXprev;
1514
81.7k
    }
1515
1516
610k
    if (llData->bsXXXDataMode[i] == 2) {
1517
290k
      for (band = startBand; band < stopBand; band++) {
1518
263k
        outputIdxData[xttIdx][i][band] = idxPrev[xttIdx][band];
1519
263k
      }
1520
26.6k
      llData->nocmpQuantCoarseXXX[i] = llData->state->bsQuantCoarseXXXprev;
1521
26.6k
      aInterpolate[i] = 1;
1522
583k
    } else {
1523
583k
      aInterpolate[i] = 0;
1524
583k
    }
1525
1526
610k
    if (llData->bsXXXDataMode[i] == 3) {
1527
84.9k
      int stride;
1528
1529
84.9k
      parmSlot = aParamSlots[setIdx];
1530
84.9k
      stride = pbStrideTable[llData->bsFreqResStrideXXX[setIdx]];
1531
84.9k
      dataBands = (stopBand - startBand - 1) / stride + 1;
1532
84.9k
      createMapping(aMap, startBand, stopBand, stride);
1533
84.9k
      mapFrequency(&cmpIdxData[xttIdx][setIdx][0],
1534
84.9k
                   &outputIdxData[xttIdx][parmSlot][0], aMap, dataBands);
1535
866k
      for (band = startBand; band < stopBand; band++) {
1536
781k
        idxPrev[xttIdx][band] = outputIdxData[xttIdx][parmSlot][band];
1537
781k
      }
1538
84.9k
      llData->state->bsQuantCoarseXXXprev = llData->bsQuantCoarseXXX[setIdx];
1539
84.9k
      llData->nocmpQuantCoarseXXX[i] = llData->bsQuantCoarseXXX[setIdx];
1540
1541
84.9k
      setIdx++;
1542
84.9k
    }
1543
610k
    if (diffIdxData != NULL) {
1544
2.60M
      for (band = startBand; band < stopBand; band++) {
1545
2.35M
        outputIdxData[xttIdx][i][band] += diffIdxData[xttIdx][i][band];
1546
2.35M
      }
1547
250k
    }
1548
610k
  } /* for( i = 0 ; i < numParameterSets; i++ ) */
1549
1550
  /* Map all coarse data to fine */
1551
1.06M
  for (i = 0; i < numParameterSets; i++) {
1552
610k
    if (llData->nocmpQuantCoarseXXX[i] == 1) {
1553
72.5k
      coarse2fine(outputIdxData[xttIdx][i], (DATA_TYPE)paramType, startBand,
1554
72.5k
                  stopBand - startBand);
1555
72.5k
      llData->nocmpQuantCoarseXXX[i] = 0;
1556
72.5k
    }
1557
610k
  }
1558
1559
  /* Interpolate */
1560
452k
  i1 = 0;
1561
1.06M
  for (i = 0; i < numParameterSets; i++) {
1562
610k
    if (aInterpolate[i] != 1) {
1563
583k
      i1 = i;
1564
583k
    } else {
1565
26.6k
      int xi, i2, x1, x2;
1566
1567
66.8k
      for (i2 = i; i2 < numParameterSets; i2++) {
1568
66.7k
        if (aInterpolate[i2] != 1) break;
1569
66.7k
      }
1570
26.6k
      if (i2 >= numParameterSets) return MPS_WRONG_PARAMETERSETS;
1571
1572
26.5k
      x1 = paramSlot[i1];
1573
26.5k
      xi = paramSlot[i];
1574
26.5k
      x2 = paramSlot[i2];
1575
1576
288k
      for (band = startBand; band < stopBand; band++) {
1577
262k
        int yi, y1, y2;
1578
262k
        y1 = outputIdxData[xttIdx][i1][band];
1579
262k
        y2 = outputIdxData[xttIdx][i2][band];
1580
262k
        if (x1 != x2) {
1581
262k
          yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1582
262k
        } else {
1583
0
          yi = y1 /*+ (xi-x1)*(y2-y1)/1e-12*/;
1584
0
        }
1585
262k
        outputIdxData[xttIdx][i][band] = yi;
1586
262k
      }
1587
26.5k
    }
1588
610k
  } /* for( i = 0 ; i < numParameterSets; i++ ) */
1589
1590
  /* Dequantize data and apply factorCLD if necessary */
1591
1.06M
  for (ps = 0; ps < numParameterSets; ps++) {
1592
610k
    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
6.08M
    for (band = startBand; band < stopBand; band++) {
1609
5.47M
      outputDataIdx[xttIdx][ps][band] =
1610
5.47M
          deqIdx(outputIdxData[xttIdx][ps][band], paramType);
1611
5.47M
      if (outputDataIdx[xttIdx][ps][band] == -1) {
1612
134k
        outputDataIdx[xttIdx][ps][band] = defaultValue;
1613
134k
      }
1614
5.47M
    }
1615
610k
  } /* for( i = 0 ; i < numParameterSets; i++ ) */
1616
1617
452k
  if (extendFrame) {
1618
8.42k
    if (paramType == t_IPD) {
1619
1.38k
      llData->bsQuantCoarseXXX[numParameterSets] =
1620
1.38k
          llData->bsQuantCoarseXXX[numParameterSets - 1];
1621
1.38k
    }
1622
71.2k
    for (band = startBand; band < stopBand; band++) {
1623
62.8k
      outputDataIdx[xttIdx][numParameterSets][band] =
1624
62.8k
          outputDataIdx[xttIdx][numParameterSets - 1][band];
1625
62.8k
    }
1626
8.42k
  }
1627
1628
452k
  return MPS_OK;
1629
452k
}
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
220k
                                         SPATIAL_BS_FRAME *pCurBs) {
1647
220k
  int i, ottIdx;
1648
220k
  int numOttBoxes;
1649
1650
220k
  SACDEC_ERROR err = MPS_OK;
1651
1652
220k
  numOttBoxes = self->numOttBoxes;
1653
1654
220k
  switch (self->treeConfig) {
1655
220k
    default: {
1656
220k
      if (self->quantMode != 0) {
1657
25.5k
        goto bail;
1658
25.5k
      }
1659
220k
    }
1660
389k
      for (i = 0; i < numOttBoxes; i++) {
1661
194k
        err = mapIndexData(
1662
194k
            &pCurBs->CLDLosslessData[i], /* LOSSLESSDATA *llData,*/
1663
194k
            self->ottCLD__FDK, self->outIdxData,
1664
194k
            pCurBs
1665
194k
                ->cmpOttCLDidx, /* int
1666
                                   cmpIdxData[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1667
                                 */
1668
194k
            NULL,               /* no differential data */
1669
194k
            i, /*  int   xttIdx,  Which ott/ttt index to use for input and
1670
                  output buffers */
1671
194k
            self->ottCLDidxPrev,                        /* int
1672
                                                           idxPrev[MAX_NUM_OTT][MAX_PARAMETER_BANDS],
1673
                                                         */
1674
194k
            i, t_CLD, 0,                                /* int   startBand, */
1675
194k
            self->pConfigCurrent->bitstreamOttBands[i], /*  int   stopBand, */
1676
194k
            self->pConfigCurrent->ottCLDdefault[i], /* int   defaultValue, */
1677
194k
            pCurBs->numParameterSets, /* int   numParameterSets) */
1678
194k
            pCurBs->paramSlot, self->extendFrame, self->quantMode,
1679
194k
            &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1680
194k
        if (err != MPS_OK) goto bail;
1681
1682
194k
      } /* for(i = 0; i < numOttBoxes ; i++ ) */
1683
194k
      break;
1684
220k
  } /* case */
1685
1686
389k
  for (ottIdx = 0; ottIdx < numOttBoxes; ottIdx++) {
1687
    /* Read ICC */
1688
194k
    err = mapIndexData(
1689
194k
        &pCurBs->ICCLosslessData[ottIdx], /* LOSSLESSDATA *llData,*/
1690
194k
        self->ottICC__FDK, self->outIdxData,
1691
194k
        pCurBs
1692
194k
            ->cmpOttICCidx,  /* int
1693
                                cmpIdxData[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1694
                              */
1695
194k
        self->ottICCdiffidx, /* differential data */
1696
194k
        ottIdx, /* int   xttIdx,  Which ott/ttt index to use for input and
1697
                   output buffers */
1698
194k
        self->ottICCidxPrev, /* int   idxPrev[MAX_NUM_OTT][MAX_PARAMETER_BANDS],
1699
                              */
1700
194k
        ottIdx, t_ICC, 0,    /* int   startBand, */
1701
194k
        self->pConfigCurrent->bitstreamOttBands[ottIdx], /* int   stopBand, */
1702
194k
        ICCdefault,               /* int   defaultValue, */
1703
194k
        pCurBs->numParameterSets, /* int   numParameterSets) */
1704
194k
        pCurBs->paramSlot, self->extendFrame, self->quantMode,
1705
194k
        &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1706
194k
    if (err != MPS_OK) goto bail;
1707
194k
  } /* ottIdx */
1708
1709
194k
  if ((self->treeConfig == TREE_212) && (self->phaseCoding)) {
1710
18.6k
    if (pCurBs->phaseMode == 0) {
1711
97.8k
      for (int pb = 0; pb < self->pConfigCurrent->numOttBandsIPD; pb++) {
1712
82.7k
        self->ottIPDidxPrev[0][pb] = 0;
1713
82.7k
      }
1714
15.0k
    }
1715
37.2k
    for (ottIdx = 0; ottIdx < numOttBoxes; ottIdx++) {
1716
18.6k
      err = mapIndexData(
1717
18.6k
          &pCurBs->IPDLosslessData[ottIdx], self->ottIPD__FDK, self->outIdxData,
1718
18.6k
          pCurBs->cmpOttIPDidx, NULL, ottIdx, self->ottIPDidxPrev, ottIdx,
1719
18.6k
          t_IPD, 0, self->numOttBandsIPD, IPDdefault, pCurBs->numParameterSets,
1720
18.6k
          pCurBs->paramSlot, self->extendFrame, self->quantMode,
1721
18.6k
          &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1722
18.6k
    }
1723
18.6k
  }
1724
1725
220k
bail:
1726
1727
220k
  return MPS_OK;
1728
1729
194k
} /* 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
220k
                                         const SPATIAL_BS_FRAME *frame) {
1748
220k
  int ps, pb, pg, pbStride, dataBands, pbStart, pbStop,
1749
220k
      aGroupToBand[MAX_PARAMETER_BANDS + 1];
1750
1751
220k
  if (frame->numParameterSets > MAX_PARAMETER_SETS)
1752
0
    return MPS_WRONG_PARAMETERSETS;
1753
220k
  if (self->bitstreamParameterBands > MAX_PARAMETER_BANDS)
1754
0
    return MPS_WRONG_PARAMETERBANDS;
1755
1756
496k
  for (ps = 0; ps < frame->numParameterSets; ps++) {
1757
275k
    switch (frame->bsSmoothMode[ps]) {
1758
245k
      case 0:
1759
245k
        self->smgTime[ps] = 256;
1760
245k
        FDKmemclear(self->smgData[ps],
1761
245k
                    self->bitstreamParameterBands * sizeof(UCHAR));
1762
245k
        break;
1763
1764
15.1k
      case 1:
1765
15.1k
        if (ps > 0) {
1766
13.3k
          self->smgTime[ps] = self->smgTime[ps - 1];
1767
13.3k
          FDKmemcpy(self->smgData[ps], self->smgData[ps - 1],
1768
13.3k
                    self->bitstreamParameterBands * sizeof(UCHAR));
1769
13.3k
        } else {
1770
1.79k
          self->smgTime[ps] = self->smoothState->prevSmgTime;
1771
1.79k
          FDKmemcpy(self->smgData[ps], self->smoothState->prevSmgData,
1772
1.79k
                    self->bitstreamParameterBands * sizeof(UCHAR));
1773
1.79k
        }
1774
15.1k
        break;
1775
1776
6.82k
      case 2:
1777
6.82k
        self->smgTime[ps] = smgTimeTable[frame->bsSmoothTime[ps]];
1778
76.0k
        for (pb = 0; pb < self->bitstreamParameterBands; pb++) {
1779
69.2k
          self->smgData[ps][pb] = 1;
1780
69.2k
        }
1781
6.82k
        break;
1782
1783
7.96k
      case 3:
1784
7.96k
        self->smgTime[ps] = smgTimeTable[frame->bsSmoothTime[ps]];
1785
7.96k
        pbStride = pbStrideTable[frame->bsFreqResStrideSmg[ps]];
1786
7.96k
        dataBands = (self->bitstreamParameterBands - 1) / pbStride + 1;
1787
7.96k
        createMapping(aGroupToBand, 0, self->bitstreamParameterBands, pbStride);
1788
41.2k
        for (pg = 0; pg < dataBands; pg++) {
1789
33.2k
          pbStart = aGroupToBand[pg];
1790
33.2k
          pbStop = aGroupToBand[pg + 1];
1791
113k
          for (pb = pbStart; pb < pbStop; pb++) {
1792
80.3k
            self->smgData[ps][pb] = frame->bsSmgData[ps][pg];
1793
80.3k
          }
1794
33.2k
        }
1795
7.96k
        break;
1796
275k
    }
1797
275k
  }
1798
1799
220k
  self->smoothState->prevSmgTime = self->smgTime[frame->numParameterSets - 1];
1800
220k
  FDKmemcpy(self->smoothState->prevSmgData,
1801
220k
            self->smgData[frame->numParameterSets - 1],
1802
220k
            self->bitstreamParameterBands * sizeof(UCHAR));
1803
1804
220k
  if (self->extendFrame) {
1805
3.51k
    self->smgTime[frame->numParameterSets] =
1806
3.51k
        self->smgTime[frame->numParameterSets - 1];
1807
3.51k
    FDKmemcpy(self->smgData[frame->numParameterSets],
1808
3.51k
              self->smgData[frame->numParameterSets - 1],
1809
3.51k
              self->bitstreamParameterBands * sizeof(UCHAR));
1810
3.51k
  }
1811
1812
220k
  return MPS_OK;
1813
220k
}
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
44.2k
                                            const SPATIAL_BS_FRAME *frame) {
1831
44.2k
  SACDEC_ERROR err = MPS_OK;
1832
44.2k
  int ch;
1833
44.2k
  int offset = self->numOttBoxes;
1834
1835
88.4k
  for (ch = 0; ch < self->numInputChannels; ch++) {
1836
44.2k
    err = mapIndexData(&frame->CLDLosslessData[offset + ch],
1837
44.2k
                       self->arbdmxGain__FDK, self->outIdxData,
1838
44.2k
                       frame->cmpArbdmxGainIdx, NULL, /* no differential data */
1839
44.2k
                       ch, self->arbdmxGainIdxPrev, offset + ch, t_CLD, 0,
1840
44.2k
                       self->bitstreamParameterBands,
1841
44.2k
                       0 /*self->arbdmxGainDefault*/, frame->numParameterSets,
1842
44.2k
                       frame->paramSlot, self->extendFrame, 0,
1843
44.2k
                       &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL);
1844
44.2k
    if (err != MPS_OK) goto bail;
1845
44.2k
  }
1846
1847
44.2k
bail:
1848
44.2k
  return err;
1849
44.2k
} /* decodeAndMapFrameArbdmx */
1850
1851
/*******************************************************************************
1852
 Functionname: SpatialDecDecodeFrame
1853
 *******************************************************************************
1854
1855
 Description:
1856
1857
 Arguments:
1858
1859
 Return:
1860
1861
*******************************************************************************/
1862
220k
SACDEC_ERROR SpatialDecDecodeFrame(spatialDec *self, SPATIAL_BS_FRAME *frame) {
1863
220k
  SACDEC_ERROR err = MPS_OK;
1864
1865
220k
  self->extendFrame = 0;
1866
220k
  if (frame->paramSlot[frame->numParameterSets - 1] != self->timeSlots - 1) {
1867
3.51k
    self->extendFrame = 1;
1868
3.51k
  }
1869
1870
220k
  self->TsdTs = 0;
1871
1872
  /****** DTDF and MAP DATA ********/
1873
220k
  if ((err = decodeAndMapFrameOtt(self, frame)) != MPS_OK) goto bail;
1874
1875
220k
  if ((err = decodeAndMapFrameSmg(self, frame)) != MPS_OK) goto bail;
1876
1877
220k
  if (self->arbitraryDownmix != 0) {
1878
44.2k
    if ((err = decodeAndMapFrameArbdmx(self, frame)) != MPS_OK) goto bail;
1879
44.2k
  }
1880
1881
220k
  if (self->extendFrame) {
1882
3.51k
    frame->numParameterSets =
1883
3.51k
        fixMin(MAX_PARAMETER_SETS, frame->numParameterSets + 1);
1884
3.51k
    frame->paramSlot[frame->numParameterSets - 1] = self->timeSlots - 1;
1885
1886
12.7k
    for (int p = 0; p < frame->numParameterSets; p++) {
1887
9.21k
      if (frame->paramSlot[p] > self->timeSlots - 1) {
1888
0
        frame->paramSlot[p] = self->timeSlots - 1;
1889
0
        err = MPS_PARSE_ERROR;
1890
0
      }
1891
9.21k
    }
1892
3.51k
    if (err != MPS_OK) {
1893
0
      goto bail;
1894
0
    }
1895
3.51k
  }
1896
1897
220k
bail:
1898
220k
  return err;
1899
220k
} /* SpatialDecDecodeFrame() */
1900
1901
/*******************************************************************************
1902
 Functionname: SpatialDecodeHeader
1903
 *******************************************************************************
1904
1905
 Description:
1906
1907
 Arguments:
1908
1909
 Return:
1910
1911
*******************************************************************************/
1912
1913
SACDEC_ERROR SpatialDecDecodeHeader(
1914
69.6k
    spatialDec *self, SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig) {
1915
69.6k
  SACDEC_ERROR err = MPS_OK;
1916
69.6k
  int i;
1917
1918
69.6k
  self->samplingFreq = pSpatialSpecificConfig->samplingFreq;
1919
69.6k
  self->timeSlots = pSpatialSpecificConfig->nTimeSlots;
1920
69.6k
  self->frameLength = self->timeSlots * self->qmfBands;
1921
69.6k
  self->bitstreamParameterBands = pSpatialSpecificConfig->freqRes;
1922
1923
69.6k
  if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD)
1924
38.2k
    self->hybridBands = self->qmfBands;
1925
31.3k
  else
1926
31.3k
    self->hybridBands = SacGetHybridSubbands(self->qmfBands);
1927
69.6k
  self->tp_hybBandBorder = 12;
1928
1929
69.6k
  self->numParameterBands = self->bitstreamParameterBands;
1930
1931
69.6k
  if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) {
1932
38.2k
    switch (self->numParameterBands) {
1933
566
      case 4:
1934
566
        self->kernels = kernels_4_to_64;
1935
566
        break;
1936
12.7k
      case 5:
1937
12.7k
        self->kernels = kernels_5_to_64;
1938
12.7k
        break;
1939
937
      case 7:
1940
937
        self->kernels = kernels_7_to_64;
1941
937
        break;
1942
18.8k
      case 9:
1943
18.8k
        self->kernels = kernels_9_to_64;
1944
18.8k
        break;
1945
142
      case 12:
1946
142
        self->kernels = kernels_12_to_64;
1947
142
        break;
1948
1.82k
      case 15:
1949
1.82k
        self->kernels = kernels_15_to_64;
1950
1.82k
        break;
1951
2.18k
      case 23:
1952
2.18k
        self->kernels = kernels_23_to_64;
1953
2.18k
        break;
1954
1.00k
      default:
1955
1.00k
        return MPS_INVALID_PARAMETERBANDS; /* unsupported numParameterBands */
1956
38.2k
    }
1957
38.2k
  } else {
1958
31.3k
    switch (self->numParameterBands) {
1959
1.06k
      case 4:
1960
1.06k
        self->kernels = kernels_4_to_71;
1961
1.06k
        break;
1962
1.15k
      case 5:
1963
1.15k
        self->kernels = kernels_5_to_71;
1964
1.15k
        break;
1965
12.0k
      case 7:
1966
12.0k
        self->kernels = kernels_7_to_71;
1967
12.0k
        break;
1968
4.95k
      case 10:
1969
4.95k
        self->kernels = kernels_10_to_71;
1970
4.95k
        break;
1971
1.80k
      case 14:
1972
1.80k
        self->kernels = kernels_14_to_71;
1973
1.80k
        break;
1974
7.78k
      case 20:
1975
7.78k
        self->kernels = kernels_20_to_71;
1976
7.78k
        break;
1977
2.53k
      case 28:
1978
2.53k
        self->kernels = kernels_28_to_71;
1979
2.53k
        break;
1980
0
      default:
1981
0
        return MPS_INVALID_PARAMETERBANDS; /* unsupported numParameterBands */
1982
31.3k
    }
1983
31.3k
  }
1984
1985
  /* create param to hyb band table */
1986
68.6k
  FDKmemclear(self->param2hyb, (MAX_PARAMETER_BANDS + 1) * sizeof(int));
1987
3.31M
  for (i = 0; i < self->hybridBands; i++) {
1988
3.24M
    self->param2hyb[self->kernels[i] + 1] = i + 1;
1989
3.24M
  }
1990
68.6k
  {
1991
68.6k
    int pb = self->kernels[i - 1] + 2;
1992
1.28M
    for (; pb < (MAX_PARAMETER_BANDS + 1); pb++) {
1993
1.21M
      self->param2hyb[pb] = i;
1994
1.21M
    }
1995
1.98M
    for (pb = 0; pb < MAX_PARAMETER_BANDS; pb += 1) {
1996
1.92M
      self->kernels_width[pb] = self->param2hyb[pb + 1] - self->param2hyb[pb];
1997
1.92M
    }
1998
68.6k
  }
1999
2000
68.6k
  self->treeConfig = pSpatialSpecificConfig->treeConfig;
2001
2002
68.6k
  self->numOttBoxes = pSpatialSpecificConfig->nOttBoxes;
2003
2004
68.6k
  self->numInputChannels = pSpatialSpecificConfig->nInputChannels;
2005
2006
68.6k
  self->numOutputChannels = pSpatialSpecificConfig->nOutputChannels;
2007
2008
68.6k
  self->quantMode = pSpatialSpecificConfig->quantMode;
2009
2010
68.6k
  self->arbitraryDownmix = pSpatialSpecificConfig->bArbitraryDownmix;
2011
2012
68.6k
  self->numM2rows = self->numOutputChannels;
2013
2014
68.6k
  {
2015
68.6k
    self->residualCoding = 0;
2016
68.6k
    if (self->arbitraryDownmix == 2)
2017
0
      self->arbitraryDownmix = 1; /* no arbitrary downmix residuals */
2018
68.6k
  }
2019
68.6k
  if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC)) {
2020
31.3k
    self->residualCoding = pSpatialSpecificConfig->bResidualCoding;
2021
31.3k
  }
2022
2023
68.6k
  self->clipProtectGain__FDK =
2024
68.6k
      FX_CFG2FX_DBL(clipGainTable__FDK[pSpatialSpecificConfig->bsFixedGainDMX]);
2025
68.6k
  self->clipProtectGainSF__FDK =
2026
68.6k
      clipGainSFTable__FDK[pSpatialSpecificConfig->bsFixedGainDMX];
2027
2028
68.6k
  self->tempShapeConfig = pSpatialSpecificConfig->tempShapeConfig;
2029
2030
68.6k
  self->decorrConfig = pSpatialSpecificConfig->decorrConfig;
2031
2032
68.6k
  if (self->upmixType == UPMIXTYPE_BYPASS) {
2033
0
    self->numOutputChannels = self->numInputChannels;
2034
0
  }
2035
2036
68.6k
  self->numOutputChannelsAT = self->numOutputChannels;
2037
2038
68.6k
  self->numOttBandsIPD = pSpatialSpecificConfig->numOttBandsIPD;
2039
68.6k
  self->phaseCoding = pSpatialSpecificConfig->bsPhaseCoding;
2040
137k
  for (i = 0; i < self->numOttBoxes; i++) {
2041
68.6k
    {
2042
68.6k
      self->pConfigCurrent->bitstreamOttBands[i] =
2043
68.6k
          self->bitstreamParameterBands;
2044
68.6k
    }
2045
68.6k
    self->numOttBands[i] = self->pConfigCurrent->bitstreamOttBands[i];
2046
68.6k
  } /* i */
2047
2048
68.6k
  if (self->residualCoding) {
2049
6.51k
    int numBoxes = self->numOttBoxes;
2050
13.0k
    for (i = 0; i < numBoxes; i++) {
2051
6.51k
      self->residualPresent[i] =
2052
6.51k
          pSpatialSpecificConfig->ResidualConfig[i].bResidualPresent;
2053
2054
6.51k
      if (self->residualPresent[i]) {
2055
6.51k
        self->residualBands[i] =
2056
6.51k
            pSpatialSpecificConfig->ResidualConfig[i].nResidualBands;
2057
        /* conversion from hybrid bands to qmf bands */
2058
6.51k
        self->residualQMFBands[i] =
2059
6.51k
            fMax(self->param2hyb[self->residualBands[i]] + 3 - 10,
2060
6.51k
                 3); /* simplification for the lowest 10 hybrid bands */
2061
6.51k
      } else {
2062
0
        self->residualBands[i] = 0;
2063
0
        self->residualQMFBands[i] = 0;
2064
0
      }
2065
6.51k
    }
2066
6.51k
  } /* self->residualCoding */
2067
62.0k
  else {
2068
62.0k
    int boxes = self->numOttBoxes;
2069
124k
    for (i = 0; i < boxes; i += 1) {
2070
62.0k
      self->residualPresent[i] = 0;
2071
62.0k
      self->residualBands[i] = 0;
2072
62.0k
    }
2073
62.0k
  }
2074
2075
68.6k
  switch (self->treeConfig) {
2076
68.6k
    case TREE_212:
2077
68.6k
      self->numDirektSignals = 1;
2078
68.6k
      self->numDecorSignals = 1;
2079
68.6k
      self->numXChannels = 1;
2080
68.6k
      if (self->arbitraryDownmix == 2) {
2081
0
        self->numXChannels += 1;
2082
0
      }
2083
68.6k
      self->numVChannels = self->numDirektSignals + self->numDecorSignals;
2084
68.6k
      break;
2085
0
    default:
2086
0
      return MPS_INVALID_TREECONFIG;
2087
68.6k
  }
2088
2089
68.6k
  self->highRateMode = pSpatialSpecificConfig->bsHighRateMode;
2090
68.6k
  self->decorrType = pSpatialSpecificConfig->bsDecorrType;
2091
2092
68.6k
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
2093
2094
68.6k
  return err;
2095
68.6k
}
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
34.2k
                                     BS_LL_STATE *llState) {
2111
34.2k
  SPATIAL_BS_FRAME *pBs = bsFrame;
2112
2113
34.2k
  const int maxNumOtt = MAX_NUM_OTT;
2114
34.2k
  const int maxNumInputChannels = MAX_INPUT_CHANNELS;
2115
2116
34.2k
  FDK_ALLOCATE_MEMORY_1D_P(
2117
34.2k
      pBs->cmpOttIPDidx, maxNumOtt * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS,
2118
34.2k
      SCHAR, SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS])
2119
2120
  /* Arbitrary Downmix */
2121
34.2k
  FDK_ALLOCATE_MEMORY_1D_P(
2122
34.2k
      pBs->cmpArbdmxGainIdx,
2123
34.2k
      maxNumInputChannels * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS, SCHAR,
2124
34.2k
      SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS])
2125
2126
  /* Lossless control */
2127
34.2k
  FDK_ALLOCATE_MEMORY_1D(pBs->CLDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2128
34.2k
  FDK_ALLOCATE_MEMORY_1D(pBs->ICCLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2129
2130
34.2k
  FDK_ALLOCATE_MEMORY_1D(pBs->IPDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2131
2132
34.2k
  pBs->newBsData = 0;
2133
34.2k
  pBs->numParameterSets = 1;
2134
2135
  /* Link lossless states */
2136
239k
  for (int x = 0; x < MAX_NUM_PARAMETERS; x++) {
2137
205k
    pBs->CLDLosslessData[x].state = &llState->CLDLosslessState[x];
2138
205k
    pBs->ICCLosslessData[x].state = &llState->ICCLosslessState[x];
2139
2140
205k
    pBs->IPDLosslessData[x].state = &llState->IPDLosslessState[x];
2141
205k
  }
2142
2143
34.2k
  return MPS_OK;
2144
2145
0
bail:
2146
0
  return MPS_OUTOFMEMORY;
2147
34.2k
}
2148
2149
/*******************************************************************************
2150
 Functionname: SpatialDecCloseBsFrame
2151
 *******************************************************************************
2152
2153
 Description: Close spatial bitstream structure
2154
2155
 Arguments:   spatialDec* self
2156
2157
 Return:      -
2158
2159
*******************************************************************************/
2160
34.2k
void SpatialDecCloseBsFrame(SPATIAL_BS_FRAME *pBs) {
2161
34.2k
  if (pBs != NULL) {
2162
    /* These arrays contain the compact indices, only one value per pbstride,
2163
     * only paramsets actually containing data. */
2164
2165
34.2k
    FDK_FREE_MEMORY_1D(pBs->cmpOttIPDidx);
2166
2167
    /* Arbitrary Downmix */
2168
34.2k
    FDK_FREE_MEMORY_1D(pBs->cmpArbdmxGainIdx);
2169
2170
    /* Lossless control */
2171
34.2k
    FDK_FREE_MEMORY_1D(pBs->IPDLosslessData);
2172
34.2k
    FDK_FREE_MEMORY_1D(pBs->CLDLosslessData);
2173
34.2k
    FDK_FREE_MEMORY_1D(pBs->ICCLosslessData);
2174
34.2k
  }
2175
34.2k
}