Coverage Report

Created: 2025-07-23 06:37

/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
0
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, UPMIXTYPE upmixType) {
120
0
  int i;
121
0
  UINT syntaxFlags;
122
123
  /* Determine bit stream syntax */
124
0
  syntaxFlags = 0;
125
0
  switch (pSpatialSpecificConfig->coreCodec) {
126
0
    case AOT_ER_AAC_ELD:
127
0
    case AOT_ER_AAC_LD:
128
0
      syntaxFlags |= SACDEC_SYNTAX_LD;
129
0
      break;
130
0
    case AOT_USAC:
131
0
      syntaxFlags |= SACDEC_SYNTAX_USAC;
132
0
      break;
133
0
    case AOT_NONE:
134
0
    default:
135
0
      return MPS_UNSUPPORTED_FORMAT;
136
0
  }
137
138
0
  pSpatialSpecificConfig->syntaxFlags = syntaxFlags;
139
140
0
  switch (pSpatialSpecificConfig->treeConfig) {
141
0
    case TREE_212: {
142
0
      pSpatialSpecificConfig->ottCLDdefault[0] = 0;
143
0
    } break;
144
0
    default:
145
0
      return MPS_INVALID_TREECONFIG;
146
0
  }
147
148
0
  if (syntaxFlags & SACDEC_SYNTAX_USAC) {
149
0
    if (pSpatialSpecificConfig->bsOttBandsPhasePresent) {
150
0
      pSpatialSpecificConfig->numOttBandsIPD =
151
0
          pSpatialSpecificConfig->bsOttBandsPhase;
152
0
    } else {
153
0
      int numParameterBands;
154
155
0
      numParameterBands = pSpatialSpecificConfig->freqRes;
156
0
      switch (numParameterBands) {
157
0
        case 4:
158
0
        case 5:
159
0
          pSpatialSpecificConfig->numOttBandsIPD = 2;
160
0
          break;
161
0
        case 7:
162
0
          pSpatialSpecificConfig->numOttBandsIPD = 3;
163
0
          break;
164
0
        case 10:
165
0
          pSpatialSpecificConfig->numOttBandsIPD = 5;
166
0
          break;
167
0
        case 14:
168
0
          pSpatialSpecificConfig->numOttBandsIPD = 7;
169
0
          break;
170
0
        case 20:
171
0
        case 28:
172
0
          pSpatialSpecificConfig->numOttBandsIPD = 10;
173
0
          break;
174
0
        default:
175
0
          return MPS_INVALID_PARAMETERBANDS;
176
0
      }
177
0
    }
178
0
  } else {
179
0
    pSpatialSpecificConfig->numOttBandsIPD = 0;
180
0
  }
181
0
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
182
0
    {
183
0
      pSpatialSpecificConfig->bitstreamOttBands[i] =
184
0
          pSpatialSpecificConfig->freqRes;
185
0
    }
186
0
    {
187
0
      pSpatialSpecificConfig->numOttBands[i] =
188
0
          pSpatialSpecificConfig->bitstreamOttBands[i];
189
0
      if (syntaxFlags & SACDEC_SYNTAX_USAC &&
190
0
          !pSpatialSpecificConfig->bsOttBandsPhasePresent) {
191
0
        if (pSpatialSpecificConfig->bResidualCoding &&
192
0
            pSpatialSpecificConfig->ResidualConfig[i].bResidualPresent &&
193
0
            (pSpatialSpecificConfig->numOttBandsIPD <
194
0
             pSpatialSpecificConfig->ResidualConfig[i].nResidualBands)) {
195
0
          pSpatialSpecificConfig->numOttBandsIPD =
196
0
              pSpatialSpecificConfig->ResidualConfig[i].nResidualBands;
197
0
        }
198
0
      }
199
0
    }
200
0
  } /* i */
201
202
0
  return MPS_OK;
203
0
}
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
0
    int numOttBoxes, int numTttBoxes, int numOutChan, int bitsAvailable) {
220
0
  SACDEC_ERROR err = MPS_OK;
221
0
  INT ba = bitsAvailable;
222
223
0
  config->sacExtCnt = 0;
224
0
  config->bResidualCoding = 0;
225
226
0
  ba = fMin((int)FDKgetValidBits(bitstream), ba);
227
228
0
  while ((ba >= 8) && (config->sacExtCnt < MAX_NUM_EXT_TYPES)) {
229
0
    int bitsRead, nFillBits;
230
0
    INT tmp;
231
0
    UINT sacExtLen;
232
233
0
    config->sacExtType[config->sacExtCnt] = FDKreadBits(bitstream, 4);
234
0
    ba -= 4;
235
236
0
    sacExtLen = FDKreadBits(bitstream, 4);
237
0
    ba -= 4;
238
239
0
    if (sacExtLen == 15) {
240
0
      sacExtLen += FDKreadBits(bitstream, 8);
241
0
      ba -= 8;
242
0
      if (sacExtLen == 15 + 255) {
243
0
        sacExtLen += FDKreadBits(bitstream, 16);
244
0
        ba -= 16;
245
0
      }
246
0
    }
247
248
0
    tmp = (INT)FDKgetValidBits(
249
0
        bitstream); /* Extension config payload start anchor. */
250
0
    if ((tmp <= 0) || (tmp < (INT)sacExtLen * 8) || (ba < (INT)sacExtLen * 8)) {
251
0
      err = MPS_PARSE_ERROR;
252
0
      goto bail;
253
0
    }
254
255
0
    switch (config->sacExtType[config->sacExtCnt]) {
256
0
      default:; /* unknown extension data => do nothing */
257
0
    }
258
259
    /* skip remaining extension data */
260
0
    bitsRead = tmp - FDKgetValidBits(bitstream);
261
0
    nFillBits = 8 * sacExtLen - bitsRead;
262
263
0
    if (nFillBits < 0) {
264
0
      err = MPS_PARSE_ERROR;
265
0
      goto bail;
266
0
    } else {
267
      /* Skip fill bits or an unkown extension. */
268
0
      FDKpushFor(bitstream, nFillBits);
269
0
    }
270
271
0
    ba -= 8 * sacExtLen;
272
0
    config->sacExtCnt++;
273
0
  }
274
275
0
bail:
276
0
  return err;
277
0
}
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
0
    INT coreSbrFrameLengthIndex) {
326
0
  int i;
327
328
0
  FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG));
329
330
0
  pSpatialSpecificConfig->stereoConfigIndex = stereoConfigIndex;
331
0
  pSpatialSpecificConfig->coreSbrFrameLengthIndex = coreSbrFrameLengthIndex;
332
0
  pSpatialSpecificConfig->freqRes =
333
0
      (SPATIALDEC_FREQ_RES)freqResTable[FDKreadBits(bitstream, 3)];
334
0
  if (pSpatialSpecificConfig->freqRes == 0) {
335
0
    return MPS_PARSE_ERROR; /* reserved value */
336
0
  }
337
338
0
  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
0
    case AOT_USAC:
349
0
      pSpatialSpecificConfig->bsFixedGainDMX =
350
0
          (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3);
351
0
      pSpatialSpecificConfig->tempShapeConfig =
352
0
          (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2);
353
0
      pSpatialSpecificConfig->decorrConfig =
354
0
          (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2);
355
0
      if (pSpatialSpecificConfig->decorrConfig > 2) {
356
0
        return MPS_PARSE_ERROR; /* reserved value */
357
0
      }
358
0
      pSpatialSpecificConfig->bsDecorrType = 0;
359
0
      break;
360
0
    default:
361
0
      return MPS_UNSUPPORTED_FORMAT;
362
0
  }
363
0
  pSpatialSpecificConfig->nTimeSlots = (coreSbrFrameLengthIndex == 4) ? 64 : 32;
364
0
  pSpatialSpecificConfig->bsHighRateMode = (UCHAR)FDKreadBits(bitstream, 1);
365
366
0
  {
367
0
    pSpatialSpecificConfig->bsPhaseCoding = (UCHAR)FDKreadBits(bitstream, 1);
368
0
    pSpatialSpecificConfig->bsOttBandsPhasePresent =
369
0
        (UCHAR)FDKreadBits(bitstream, 1);
370
0
    if (pSpatialSpecificConfig->bsOttBandsPhasePresent) {
371
0
      if (MAX_PARAMETER_BANDS < (pSpatialSpecificConfig->bsOttBandsPhase =
372
0
                                     FDKreadBits(bitstream, 5))) {
373
0
        return MPS_PARSE_ERROR;
374
0
      }
375
0
    } else {
376
0
      pSpatialSpecificConfig->bsOttBandsPhase = 0;
377
0
    }
378
0
  }
379
380
0
  if (stereoConfigIndex > 1) { /* do residual coding */
381
0
    pSpatialSpecificConfig->bResidualCoding = 1;
382
0
    pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 1;
383
0
    if (pSpatialSpecificConfig->freqRes <
384
0
        (pSpatialSpecificConfig->ResidualConfig->nResidualBands =
385
0
             FDKreadBits(bitstream, 5))) {
386
0
      return MPS_PARSE_ERROR;
387
0
    }
388
0
    pSpatialSpecificConfig->bsOttBandsPhase =
389
0
        fMax(pSpatialSpecificConfig->bsOttBandsPhase,
390
0
             pSpatialSpecificConfig->ResidualConfig->nResidualBands);
391
0
    pSpatialSpecificConfig->bsPseudoLr = (UCHAR)FDKreadBits(bitstream, 1);
392
393
0
    if (pSpatialSpecificConfig->bsPhaseCoding) {
394
0
      pSpatialSpecificConfig->bsPhaseCoding = 3;
395
0
    }
396
0
  } else {
397
0
    pSpatialSpecificConfig->bResidualCoding = 0;
398
0
    pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 0;
399
0
  }
400
401
0
  if (pSpatialSpecificConfig->tempShapeConfig == 2) {
402
0
    switch (coreCodec) {
403
0
      case AOT_USAC:
404
0
        pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1);
405
0
        break;
406
0
      default: /* added to avoid compiler warning */
407
0
        break; /* added to avoid compiler warning */
408
0
    }
409
0
  }
410
411
  /* Static parameters */
412
413
0
  pSpatialSpecificConfig->samplingFreq =
414
0
      samplingRate; /* wrong for stereoConfigIndex == 3 but value is unused */
415
0
  pSpatialSpecificConfig->treeConfig = SPATIALDEC_MODE_RSVD7;
416
0
  pSpatialSpecificConfig->nOttBoxes =
417
0
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
418
0
  pSpatialSpecificConfig->nInputChannels =
419
0
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
420
0
  pSpatialSpecificConfig->nOutputChannels =
421
0
      treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
422
423
0
  pSpatialSpecificConfig->bArbitraryDownmix = 0;
424
425
0
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
426
0
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
427
0
  }
428
429
0
  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
0
  pSpatialSpecificConfig->coreCodec = coreCodec;
434
435
  /* Derive additional helper variables */
436
0
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
437
438
0
  return MPS_OK;
439
0
}
440
441
SACDEC_ERROR SpatialDecParseSpecificConfig(
442
    HANDLE_FDK_BITSTREAM bitstream,
443
    SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, int sacHeaderLen,
444
0
    AUDIO_OBJECT_TYPE coreCodec) {
445
0
  SACDEC_ERROR err = MPS_OK;
446
0
  int i;
447
0
  int bsSamplingFreqIndex;
448
0
  int bsFreqRes, b3DaudioMode = 0;
449
0
  int numHeaderBits;
450
0
  int cfgStartPos, bitsAvailable;
451
452
0
  FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG));
453
454
0
  cfgStartPos = FDKgetValidBits(bitstream);
455
  /* It might be that we do not know the SSC length beforehand. */
456
0
  if (sacHeaderLen == 0) {
457
0
    bitsAvailable = cfgStartPos;
458
0
  } else {
459
0
    bitsAvailable = 8 * sacHeaderLen;
460
0
    if (bitsAvailable > cfgStartPos) {
461
0
      err = MPS_PARSE_ERROR;
462
0
      goto bail;
463
0
    }
464
0
  }
465
466
0
  bsSamplingFreqIndex = FDKreadBits(bitstream, 4);
467
468
0
  if (bsSamplingFreqIndex == 15) {
469
0
    pSpatialSpecificConfig->samplingFreq = FDKreadBits(bitstream, 24);
470
0
  } else {
471
0
    pSpatialSpecificConfig->samplingFreq =
472
0
        samplingFreqTable[bsSamplingFreqIndex];
473
0
    if (pSpatialSpecificConfig->samplingFreq == 0) {
474
0
      err = MPS_PARSE_ERROR;
475
0
      goto bail;
476
0
    }
477
0
  }
478
479
0
  pSpatialSpecificConfig->nTimeSlots = FDKreadBits(bitstream, 5) + 1;
480
0
  if ((pSpatialSpecificConfig->nTimeSlots < 1) ||
481
0
      (pSpatialSpecificConfig->nTimeSlots > MAX_TIME_SLOTS)) {
482
0
    err = MPS_PARSE_ERROR;
483
0
    goto bail;
484
0
  }
485
486
0
  bsFreqRes = FDKreadBits(bitstream, 3);
487
488
0
  pSpatialSpecificConfig->freqRes =
489
0
      (SPATIALDEC_FREQ_RES)freqResTable_LD[bsFreqRes];
490
491
0
  {
492
0
    UINT treeConfig = FDKreadBits(bitstream, 4);
493
494
0
    switch (treeConfig) {
495
0
      case SPATIALDEC_MODE_RSVD7:
496
0
        pSpatialSpecificConfig->treeConfig = (SPATIALDEC_TREE_CONFIG)treeConfig;
497
0
        break;
498
0
      default:
499
0
        err = MPS_UNSUPPORTED_CONFIG;
500
0
        goto bail;
501
0
    }
502
0
  }
503
504
0
  {
505
0
    pSpatialSpecificConfig->nOttBoxes =
506
0
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes;
507
0
    pSpatialSpecificConfig->nTttBoxes =
508
0
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numTttBoxes;
509
0
    pSpatialSpecificConfig->nInputChannels =
510
0
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels;
511
0
    pSpatialSpecificConfig->nOutputChannels =
512
0
        treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels;
513
0
  }
514
515
0
  pSpatialSpecificConfig->quantMode =
516
0
      (SPATIALDEC_QUANT_MODE)FDKreadBits(bitstream, 2);
517
518
0
  pSpatialSpecificConfig->bArbitraryDownmix = FDKreadBits(bitstream, 1);
519
520
0
  pSpatialSpecificConfig->bsFixedGainDMX =
521
0
      (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3);
522
523
0
  pSpatialSpecificConfig->tempShapeConfig =
524
0
      (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2);
525
0
  if (pSpatialSpecificConfig->tempShapeConfig > 2) {
526
0
    return MPS_PARSE_ERROR; /* reserved value */
527
0
  }
528
529
0
  pSpatialSpecificConfig->decorrConfig =
530
0
      (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2);
531
0
  if (pSpatialSpecificConfig->decorrConfig > 2) {
532
0
    return MPS_PARSE_ERROR; /* reserved value */
533
0
  }
534
535
0
  for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) {
536
0
    pSpatialSpecificConfig->OttConfig[i].nOttBands = 0;
537
0
  }
538
539
0
  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
0
  if (pSpatialSpecificConfig->tempShapeConfig == 2) {
549
0
    pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1);
550
0
  }
551
552
0
  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
0
  FDKbyteAlign(bitstream,
578
0
               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
0
  numHeaderBits = cfgStartPos - (INT)FDKgetValidBits(bitstream);
583
0
  bitsAvailable -= numHeaderBits;
584
0
  if (bitsAvailable < 0) {
585
0
    err = MPS_PARSE_ERROR;
586
0
    goto bail;
587
0
  }
588
589
0
  pSpatialSpecificConfig->sacExtCnt = 0;
590
0
  pSpatialSpecificConfig->bResidualCoding = 0;
591
592
0
  err = SpatialDecParseExtensionConfig(
593
0
      bitstream, pSpatialSpecificConfig, pSpatialSpecificConfig->nOttBoxes,
594
0
      pSpatialSpecificConfig->nTttBoxes,
595
0
      pSpatialSpecificConfig->nOutputChannels, bitsAvailable);
596
597
0
  FDKbyteAlign(
598
0
      bitstream,
599
0
      cfgStartPos); /* Same alignment anchor as above because
600
                       SpatialExtensionConfig() always reads full bytes */
601
602
0
  pSpatialSpecificConfig->coreCodec = coreCodec;
603
604
0
  SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL);
605
606
0
bail:
607
0
  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
0
    FDKpushBiDirectional(
611
0
        bitstream,
612
0
        (sacHeaderLen * 8) - (cfgStartPos - (INT)FDKgetValidBits(bitstream)));
613
0
  }
614
615
0
  return err;
616
0
}
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
26
                                     BS_LL_STATE *llState) {
2111
26
  SPATIAL_BS_FRAME *pBs = bsFrame;
2112
2113
26
  const int maxNumOtt = MAX_NUM_OTT;
2114
26
  const int maxNumInputChannels = MAX_INPUT_CHANNELS;
2115
2116
26
  FDK_ALLOCATE_MEMORY_1D_P(
2117
26
      pBs->cmpOttIPDidx, maxNumOtt * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS,
2118
26
      SCHAR, SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS])
2119
2120
  /* Arbitrary Downmix */
2121
26
  FDK_ALLOCATE_MEMORY_1D_P(
2122
26
      pBs->cmpArbdmxGainIdx,
2123
26
      maxNumInputChannels * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS, SCHAR,
2124
26
      SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS])
2125
2126
  /* Lossless control */
2127
26
  FDK_ALLOCATE_MEMORY_1D(pBs->CLDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2128
26
  FDK_ALLOCATE_MEMORY_1D(pBs->ICCLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2129
2130
26
  FDK_ALLOCATE_MEMORY_1D(pBs->IPDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA)
2131
2132
26
  pBs->newBsData = 0;
2133
26
  pBs->numParameterSets = 1;
2134
2135
  /* Link lossless states */
2136
182
  for (int x = 0; x < MAX_NUM_PARAMETERS; x++) {
2137
156
    pBs->CLDLosslessData[x].state = &llState->CLDLosslessState[x];
2138
156
    pBs->ICCLosslessData[x].state = &llState->ICCLosslessState[x];
2139
2140
156
    pBs->IPDLosslessData[x].state = &llState->IPDLosslessState[x];
2141
156
  }
2142
2143
26
  return MPS_OK;
2144
2145
0
bail:
2146
0
  return MPS_OUTOFMEMORY;
2147
26
}
2148
2149
/*******************************************************************************
2150
 Functionname: SpatialDecCloseBsFrame
2151
 *******************************************************************************
2152
2153
 Description: Close spatial bitstream structure
2154
2155
 Arguments:   spatialDec* self
2156
2157
 Return:      -
2158
2159
*******************************************************************************/
2160
26
void SpatialDecCloseBsFrame(SPATIAL_BS_FRAME *pBs) {
2161
26
  if (pBs != NULL) {
2162
    /* These arrays contain the compact indices, only one value per pbstride,
2163
     * only paramsets actually containing data. */
2164
2165
26
    FDK_FREE_MEMORY_1D(pBs->cmpOttIPDidx);
2166
2167
    /* Arbitrary Downmix */
2168
26
    FDK_FREE_MEMORY_1D(pBs->cmpArbdmxGainIdx);
2169
2170
    /* Lossless control */
2171
26
    FDK_FREE_MEMORY_1D(pBs->IPDLosslessData);
2172
26
    FDK_FREE_MEMORY_1D(pBs->CLDLosslessData);
2173
26
    FDK_FREE_MEMORY_1D(pBs->ICCLosslessData);
2174
26
  }
2175
26
}