Coverage Report

Created: 2026-05-30 06:04

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