Coverage Report

Created: 2025-12-31 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libMpegTPDec/src/tpdec_asc.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 transport format decoder library *********************
96
97
   Author(s):   Daniel Homm
98
99
   Description:
100
101
*******************************************************************************/
102
103
#include "tpdec_lib.h"
104
#include "tp_data.h"
105
106
#include "FDK_crc.h"
107
108
#include "common_fix.h"
109
110
/**
111
 * The following arrays provide the IDs of the consecutive elements for each
112
 * channel configuration. Every channel_configuration has to be finalized with
113
 * ID_NONE.
114
 */
115
static const MP4_ELEMENT_ID channel_configuration_0[] = {ID_NONE};
116
static const MP4_ELEMENT_ID channel_configuration_1[] = {ID_SCE, ID_NONE};
117
static const MP4_ELEMENT_ID channel_configuration_2[] = {ID_CPE, ID_NONE};
118
static const MP4_ELEMENT_ID channel_configuration_3[] = {ID_SCE, ID_CPE,
119
                                                         ID_NONE};
120
static const MP4_ELEMENT_ID channel_configuration_4[] = {ID_SCE, ID_CPE, ID_SCE,
121
                                                         ID_NONE};
122
static const MP4_ELEMENT_ID channel_configuration_5[] = {ID_SCE, ID_CPE, ID_CPE,
123
                                                         ID_NONE};
124
static const MP4_ELEMENT_ID channel_configuration_6[] = {ID_SCE, ID_CPE, ID_CPE,
125
                                                         ID_LFE, ID_NONE};
126
static const MP4_ELEMENT_ID channel_configuration_7[] = {
127
    ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE};
128
static const MP4_ELEMENT_ID channel_configuration_8[] = {
129
    ID_NONE}; /* reserved */
130
static const MP4_ELEMENT_ID channel_configuration_9[] = {
131
    ID_NONE}; /* reserved */
132
static const MP4_ELEMENT_ID channel_configuration_10[] = {
133
    ID_NONE}; /* reserved */
134
static const MP4_ELEMENT_ID channel_configuration_11[] = {
135
    ID_SCE, ID_CPE, ID_CPE, ID_SCE, ID_LFE, ID_NONE};
136
static const MP4_ELEMENT_ID channel_configuration_12[] = {
137
    ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE};
138
static const MP4_ELEMENT_ID channel_configuration_13[] = {
139
    ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_CPE, ID_SCE, ID_LFE, ID_LFE, ID_SCE,
140
    ID_CPE, ID_CPE, ID_SCE, ID_CPE, ID_SCE, ID_SCE, ID_CPE, ID_NONE};
141
static const MP4_ELEMENT_ID channel_configuration_14[] = {
142
    ID_SCE, ID_CPE, ID_CPE, ID_LFE, ID_CPE, ID_NONE};
143
144
static const MP4_ELEMENT_ID *channel_configuration_array[] = {
145
    channel_configuration_0,  channel_configuration_1,
146
    channel_configuration_2,  channel_configuration_3,
147
    channel_configuration_4,  channel_configuration_5,
148
    channel_configuration_6,  channel_configuration_7,
149
    channel_configuration_8,  channel_configuration_9,
150
    channel_configuration_10, channel_configuration_11,
151
    channel_configuration_12, channel_configuration_13,
152
    channel_configuration_14};
153
154
#define TP_USAC_MAX_CHANNEL_CONFIGURATION_INDEX (13)
155
#define SC_CHANNEL_CONFIG_TAB_SIZE (TP_USAC_MAX_CHANNEL_CONFIGURATION_INDEX + 1)
156
157
/* channel config structure used for sanity check */
158
typedef struct {
159
  SCHAR nCh;  /* number of channels */
160
  SCHAR nSCE; /* number of SCE's */
161
  SCHAR nCPE; /* number of CPE's */
162
  SCHAR nLFE; /* number of LFE's */
163
} SC_CHANNEL_CONFIG;
164
165
static const SC_CHANNEL_CONFIG sc_chan_config_tab[SC_CHANNEL_CONFIG_TAB_SIZE] =
166
    {
167
        /* nCh, nSCE, nCPE, nLFE,     cci */
168
        {0, 0, 0, 0}, /*  0 */
169
        {1, 1, 0, 0}, /*  1 */
170
        {2, 0, 1, 0}, /*  2 */
171
        {3, 1, 1, 0}, /*  3 */
172
        {4, 2, 1, 0}, /*  4 */
173
        {5, 1, 2, 0}, /*  5 */
174
        {6, 1, 2, 1}, /*  6 */
175
        {8, 1, 3, 1}, /*  7 */
176
        {2, 2, 0, 0}, /*  8 */
177
        {3, 1, 1, 0}, /*  9 */
178
        {4, 0, 2, 0}, /* 10 */
179
        {7, 2, 2, 1}, /* 11 */
180
        {8, 1, 3, 1}, /* 12 */
181
        {24, 6, 8, 2} /* 13 */
182
};
183
184
489k
void CProgramConfig_Reset(CProgramConfig *pPce) { pPce->elCounter = 0; }
185
186
1.55M
void CProgramConfig_Init(CProgramConfig *pPce) {
187
1.55M
  FDKmemclear(pPce, sizeof(CProgramConfig));
188
1.55M
  pPce->SamplingFrequencyIndex = 0xf;
189
1.55M
}
190
191
671k
int CProgramConfig_IsValid(const CProgramConfig *pPce) {
192
671k
  return ((pPce->isValid) ? 1 : 0);
193
671k
}
194
195
16.4k
#define PCE_HEIGHT_EXT_SYNC (0xAC)
196
197
/*
198
 * Read the extension for height info.
199
 * return 0 if successfull,
200
 *       -1 if the CRC failed,
201
 *       -2 if invalid HeightInfo.
202
 */
203
static int CProgramConfig_ReadHeightExt(CProgramConfig *pPce,
204
                                        HANDLE_FDK_BITSTREAM bs,
205
                                        int *const bytesAvailable,
206
89.9k
                                        const UINT alignmentAnchor) {
207
89.9k
  int err = 0;
208
89.9k
  FDK_CRCINFO crcInfo; /* CRC state info */
209
89.9k
  INT crcReg;
210
89.9k
  FDKcrcInit(&crcInfo, 0x07, 0xFF, 8);
211
89.9k
  crcReg = FDKcrcStartReg(&crcInfo, bs, 0);
212
89.9k
  UINT startAnchor = FDKgetValidBits(bs);
213
214
89.9k
  FDK_ASSERT(pPce != NULL);
215
89.9k
  FDK_ASSERT(bs != NULL);
216
89.9k
  FDK_ASSERT(bytesAvailable != NULL);
217
218
89.9k
  if ((startAnchor >= 24) && (*bytesAvailable >= 3) &&
219
16.4k
      (FDKreadBits(bs, 8) == PCE_HEIGHT_EXT_SYNC)) {
220
3.52k
    int i;
221
222
13.7k
    for (i = 0; i < pPce->NumFrontChannelElements; i++) {
223
10.2k
      if ((pPce->FrontElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
224
10.2k
          PC_NUM_HEIGHT_LAYER) {
225
2.14k
        err = -2; /* height information is out of the valid range */
226
2.14k
      }
227
10.2k
    }
228
13.7k
    for (i = 0; i < pPce->NumSideChannelElements; i++) {
229
10.1k
      if ((pPce->SideElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
230
10.1k
          PC_NUM_HEIGHT_LAYER) {
231
1.69k
        err = -2; /* height information is out of the valid range */
232
1.69k
      }
233
10.1k
    }
234
17.9k
    for (i = 0; i < pPce->NumBackChannelElements; i++) {
235
14.4k
      if ((pPce->BackElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
236
14.4k
          PC_NUM_HEIGHT_LAYER) {
237
1.60k
        err = -2; /* height information is out of the valid range */
238
1.60k
      }
239
14.4k
    }
240
3.52k
    FDKbyteAlign(bs, alignmentAnchor);
241
242
3.52k
    FDKcrcEndReg(&crcInfo, bs, crcReg);
243
3.52k
    if ((USHORT)FDKreadBits(bs, 8) != FDKcrcGetCRC(&crcInfo)) {
244
      /* CRC failed */
245
967
      err = -1;
246
967
    }
247
3.52k
    if (err != 0) {
248
      /* Reset whole height information in case an error occured during parsing.
249
         The return value ensures that pPce->isValid is set to 0 and implicit
250
         channel mapping is used. */
251
971
      FDKmemclear(pPce->FrontElementHeightInfo,
252
971
                  sizeof(pPce->FrontElementHeightInfo));
253
971
      FDKmemclear(pPce->SideElementHeightInfo,
254
971
                  sizeof(pPce->SideElementHeightInfo));
255
971
      FDKmemclear(pPce->BackElementHeightInfo,
256
971
                  sizeof(pPce->BackElementHeightInfo));
257
971
    }
258
86.4k
  } else {
259
    /* No valid extension data found -> restore the initial bitbuffer state */
260
86.4k
    FDKpushBack(bs, (INT)startAnchor - (INT)FDKgetValidBits(bs));
261
86.4k
  }
262
263
  /* Always report the bytes read. */
264
89.9k
  *bytesAvailable -= ((INT)startAnchor - (INT)FDKgetValidBits(bs)) >> 3;
265
266
89.9k
  return (err);
267
89.9k
}
268
269
/**
270
 * \brief Sanity checks for program config element.
271
 *        Check order of elements according to ISO/IEC 13818-7:2003(E),
272
 * chapter 8.5.1
273
 *
274
 * \param pPce  pointer to program config element.
275
 *
276
 * \return  0 if successful, otherwise 1.
277
 */
278
89.9k
static int CProgramConfig_Check(CProgramConfig *pPce) {
279
89.9k
  INT i;
280
89.9k
  INT err = 0;
281
89.9k
  INT numBackChannels[3] = {0};
282
89.9k
  INT numSideChannels[3] = {0};
283
89.9k
  INT numFrontChannels[3] = {0};
284
89.9k
  UCHAR *pCpeFront = pPce->FrontElementIsCpe;
285
89.9k
  UCHAR *pCpeSide = pPce->SideElementIsCpe;
286
89.9k
  UCHAR *pCpeBack = pPce->BackElementIsCpe;
287
89.9k
  UCHAR *pHeight;
288
289
89.9k
  pHeight = pPce->BackElementHeightInfo;
290
410k
  for (i = 0; i < pPce->NumBackChannelElements; i++) {
291
320k
    numBackChannels[*pHeight] += pPce->BackElementIsCpe[i] ? 2 : 1;
292
320k
    pHeight++;
293
320k
  }
294
89.9k
  pHeight = pPce->SideElementHeightInfo;
295
155k
  for (i = 0; i < pPce->NumSideChannelElements; i++) {
296
65.4k
    numSideChannels[*pHeight] += pPce->SideElementIsCpe[i] ? 2 : 1;
297
65.4k
    pHeight++;
298
65.4k
  }
299
89.9k
  pHeight = pPce->FrontElementHeightInfo;
300
155k
  for (i = 0; i < pPce->NumFrontChannelElements; i++) {
301
65.4k
    numFrontChannels[*pHeight] += pPce->FrontElementIsCpe[i] ? 2 : 1;
302
65.4k
    pHeight++;
303
65.4k
  }
304
305
  /* 0 = normal height channels, 1 = top height channels, 2 = bottom height
306
   * channels */
307
328k
  for (i = 0; i < 3; i++) {
308
    /* if number of channels is odd => first element must be a SCE (front center
309
     * channel) */
310
249k
    if (numFrontChannels[i] & 1) {
311
6.90k
      if (*pCpeFront++ == ID_CPE) {
312
805
        err = 1;
313
805
        goto bail;
314
805
      }
315
6.09k
      numFrontChannels[i]--;
316
6.09k
    }
317
274k
    while (numFrontChannels[i] > 0) {
318
      /* must be CPE or paired SCE */
319
28.8k
      if (*pCpeFront++ == ID_SCE) {
320
15.7k
        if (*pCpeFront++ == ID_CPE) {
321
2.24k
          err = 1;
322
2.24k
          goto bail;
323
2.24k
        }
324
15.7k
      }
325
26.5k
      numFrontChannels[i] -= 2;
326
246k
    };
327
328
    /* in case that a top center surround channel (Ts) is transmitted the number
329
     * of channels can be odd */
330
246k
    if (i != 1) {
331
      /* number of channels must be even */
332
165k
      if (numSideChannels[i] & 1) {
333
1.47k
        err = 1;
334
1.47k
        goto bail;
335
1.47k
      }
336
182k
      while (numSideChannels[i] > 0) {
337
        /* must be CPE or paired SCE */
338
18.8k
        if (*pCpeSide++ == ID_SCE) {
339
11.2k
          if (*pCpeSide++ == ID_CPE) {
340
817
            err = 1;
341
817
            goto bail;
342
817
          }
343
11.2k
        }
344
18.0k
        numSideChannels[i] -= 2;
345
163k
      };
346
163k
    }
347
348
440k
    while (numBackChannels[i] > 1) {
349
      /* must be CPE or paired SCE */
350
201k
      if (*pCpeBack++ == ID_SCE) {
351
6.99k
        if (*pCpeBack++ == ID_CPE) {
352
4.52k
          err = 1;
353
4.52k
          goto bail;
354
4.52k
        }
355
6.99k
      }
356
196k
      numBackChannels[i] -= 2;
357
239k
    };
358
    /* if number of channels is odd => last element must be a SCE (back center
359
     * channel) */
360
239k
    if (numBackChannels[i]) {
361
68.1k
      if (*pCpeBack++ == ID_CPE) {
362
1.16k
        err = 1;
363
1.16k
        goto bail;
364
1.16k
      }
365
68.1k
    }
366
239k
  }
367
368
89.9k
bail:
369
370
89.9k
  return err;
371
89.9k
}
372
373
void CProgramConfig_Read(CProgramConfig *pPce, HANDLE_FDK_BITSTREAM bs,
374
89.9k
                         UINT alignmentAnchor) {
375
89.9k
  int i;
376
89.9k
  int commentBytes;
377
89.9k
  UCHAR tag, isCpe;
378
89.9k
  UCHAR checkElementTagSelect[3][PC_FSB_CHANNELS_MAX] = {{0}};
379
380
89.9k
  pPce->isValid = 1;
381
89.9k
  pPce->NumEffectiveChannels = 0;
382
89.9k
  pPce->NumChannels = 0;
383
89.9k
  pPce->ElementInstanceTag = (UCHAR)FDKreadBits(bs, 4);
384
89.9k
  pPce->Profile = (UCHAR)FDKreadBits(bs, 2);
385
89.9k
  pPce->SamplingFrequencyIndex = (UCHAR)FDKreadBits(bs, 4);
386
89.9k
  pPce->NumFrontChannelElements = (UCHAR)FDKreadBits(bs, 4);
387
89.9k
  pPce->NumSideChannelElements = (UCHAR)FDKreadBits(bs, 4);
388
89.9k
  pPce->NumBackChannelElements = (UCHAR)FDKreadBits(bs, 4);
389
89.9k
  pPce->NumLfeChannelElements = (UCHAR)FDKreadBits(bs, 2);
390
89.9k
  pPce->NumAssocDataElements = (UCHAR)FDKreadBits(bs, 3);
391
89.9k
  pPce->NumValidCcElements = (UCHAR)FDKreadBits(bs, 4);
392
393
89.9k
  if ((pPce->MonoMixdownPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
394
72.5k
    pPce->MonoMixdownElementNumber = (UCHAR)FDKreadBits(bs, 4);
395
72.5k
  }
396
397
89.9k
  if ((pPce->StereoMixdownPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
398
11.7k
    pPce->StereoMixdownElementNumber = (UCHAR)FDKreadBits(bs, 4);
399
11.7k
  }
400
401
89.9k
  if ((pPce->MatrixMixdownIndexPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
402
6.99k
    pPce->MatrixMixdownIndex = (UCHAR)FDKreadBits(bs, 2);
403
6.99k
    pPce->PseudoSurroundEnable = (UCHAR)FDKreadBits(bs, 1);
404
6.99k
  }
405
406
155k
  for (i = 0; i < pPce->NumFrontChannelElements; i++) {
407
65.4k
    pPce->FrontElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
408
65.4k
    pPce->FrontElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
409
65.4k
    pPce->NumChannels += pPce->FrontElementIsCpe[i] ? 2 : 1;
410
411
    /* Check element instance tag according to ISO/IEC 13818-7:2003(E),
412
     * chapter 8.2.1.1 */
413
65.4k
    if (checkElementTagSelect[isCpe][tag] == 0) {
414
52.3k
      checkElementTagSelect[isCpe][tag] = 1;
415
52.3k
    } else {
416
13.1k
      pPce->isValid = 0;
417
13.1k
    }
418
65.4k
  }
419
420
155k
  for (i = 0; i < pPce->NumSideChannelElements; i++) {
421
65.4k
    pPce->SideElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
422
65.4k
    pPce->SideElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
423
65.4k
    pPce->NumChannels += pPce->SideElementIsCpe[i] ? 2 : 1;
424
425
    /* Check element instance tag according to ISO/IEC 13818-7:2003(E),
426
     * chapter 8.2.1.1 */
427
65.4k
    if (checkElementTagSelect[isCpe][tag] == 0) {
428
46.5k
      checkElementTagSelect[isCpe][tag] = 1;
429
46.5k
    } else {
430
18.9k
      pPce->isValid = 0;
431
18.9k
    }
432
65.4k
  }
433
434
410k
  for (i = 0; i < pPce->NumBackChannelElements; i++) {
435
320k
    pPce->BackElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
436
320k
    pPce->BackElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
437
320k
    pPce->NumChannels += pPce->BackElementIsCpe[i] ? 2 : 1;
438
439
    /* Check element instance tag according to ISO/IEC 13818-7:2003(E),
440
     * chapter 8.2.1.1 */
441
320k
    if (checkElementTagSelect[isCpe][tag] == 0) {
442
292k
      checkElementTagSelect[isCpe][tag] = 1;
443
292k
    } else {
444
27.9k
      pPce->isValid = 0;
445
27.9k
    }
446
320k
  }
447
448
89.9k
  pPce->NumEffectiveChannels = pPce->NumChannels;
449
450
180k
  for (i = 0; i < pPce->NumLfeChannelElements; i++) {
451
90.4k
    pPce->LfeElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
452
90.4k
    pPce->NumChannels += 1;
453
454
    /* Check element instance tag according to ISO/IEC 13818-7:2003(E),
455
     * chapter 8.2.1.1 */
456
90.4k
    if (checkElementTagSelect[2][tag] == 0) {
457
88.9k
      checkElementTagSelect[2][tag] = 1;
458
88.9k
    } else {
459
1.57k
      pPce->isValid = 0;
460
1.57k
    }
461
90.4k
  }
462
463
135k
  for (i = 0; i < pPce->NumAssocDataElements; i++) {
464
45.1k
    pPce->AssocDataElementTagSelect[i] = (UCHAR)FDKreadBits(bs, 4);
465
45.1k
  }
466
467
267k
  for (i = 0; i < pPce->NumValidCcElements; i++) {
468
177k
    pPce->CcElementIsIndSw[i] = (UCHAR)FDKreadBits(bs, 1);
469
177k
    pPce->ValidCcElementTagSelect[i] = (UCHAR)FDKreadBits(bs, 4);
470
177k
  }
471
472
89.9k
  FDKbyteAlign(bs, alignmentAnchor);
473
474
89.9k
  pPce->CommentFieldBytes = (UCHAR)FDKreadBits(bs, 8);
475
89.9k
  commentBytes = pPce->CommentFieldBytes;
476
477
  /* Search for height info extension and read it if available */
478
89.9k
  if (CProgramConfig_ReadHeightExt(pPce, bs, &commentBytes, alignmentAnchor)) {
479
971
    pPce->isValid = 0;
480
971
  }
481
482
  /* Check order of elements according to ISO / IEC 13818 - 7:2003(E),
483
   * chapter 8.5.1 */
484
89.9k
  if (CProgramConfig_Check(pPce)) {
485
11.0k
    pPce->isValid = 0;
486
11.0k
  }
487
488
837k
  for (i = 0; i < commentBytes; i++) {
489
747k
    UCHAR text;
490
491
747k
    text = (UCHAR)FDKreadBits(bs, 8);
492
493
747k
    if (i < PC_COMMENTLENGTH) {
494
747k
      pPce->Comment[i] = text;
495
747k
    }
496
747k
  }
497
89.9k
}
498
499
/*
500
 * Compare two program configurations.
501
 * Returns the result of the comparison:
502
 *  -1 - completely different
503
 *   0 - completely equal
504
 *   1 - different but same channel configuration
505
 *   2 - different channel configuration but same number of channels
506
 */
507
int CProgramConfig_Compare(const CProgramConfig *const pPce1,
508
267k
                           const CProgramConfig *const pPce2) {
509
267k
  int result = 0; /* Innocent until proven false. */
510
511
267k
  if (FDKmemcmp(pPce1, pPce2, sizeof(CProgramConfig)) !=
512
267k
      0) { /* Configurations are not completely equal.
513
              So look into details and analyse the channel configurations: */
514
267k
    result = -1;
515
516
267k
    if (pPce1->NumChannels ==
517
267k
        pPce2->NumChannels) { /* Now the logic changes. We first assume to have
518
                                 the same channel configuration and then prove
519
                                 if this assumption is true. */
520
265k
      result = 1;
521
522
      /* Front channels */
523
265k
      if (pPce1->NumFrontChannelElements != pPce2->NumFrontChannelElements) {
524
260k
        result = 2; /* different number of front channel elements */
525
260k
      } else {
526
5.06k
        int el, numCh1 = 0, numCh2 = 0;
527
14.5k
        for (el = 0; el < pPce1->NumFrontChannelElements; el += 1) {
528
10.4k
          if (pPce1->FrontElementHeightInfo[el] !=
529
10.4k
              pPce2->FrontElementHeightInfo[el]) {
530
1.03k
            result = 2; /* different height info */
531
1.03k
            break;
532
1.03k
          }
533
9.43k
          numCh1 += pPce1->FrontElementIsCpe[el] ? 2 : 1;
534
9.43k
          numCh2 += pPce2->FrontElementIsCpe[el] ? 2 : 1;
535
9.43k
        }
536
5.06k
        if (numCh1 != numCh2) {
537
2.03k
          result = 2; /* different number of front channels */
538
2.03k
        }
539
5.06k
      }
540
      /* Side channels */
541
265k
      if (pPce1->NumSideChannelElements != pPce2->NumSideChannelElements) {
542
65.4k
        result = 2; /* different number of side channel elements */
543
200k
      } else {
544
200k
        int el, numCh1 = 0, numCh2 = 0;
545
201k
        for (el = 0; el < pPce1->NumSideChannelElements; el += 1) {
546
1.39k
          if (pPce1->SideElementHeightInfo[el] !=
547
1.39k
              pPce2->SideElementHeightInfo[el]) {
548
237
            result = 2; /* different height info */
549
237
            break;
550
237
          }
551
1.15k
          numCh1 += pPce1->SideElementIsCpe[el] ? 2 : 1;
552
1.15k
          numCh2 += pPce2->SideElementIsCpe[el] ? 2 : 1;
553
1.15k
        }
554
200k
        if (numCh1 != numCh2) {
555
1
          result = 2; /* different number of side channels */
556
1
        }
557
200k
      }
558
      /* Back channels */
559
265k
      if (pPce1->NumBackChannelElements != pPce2->NumBackChannelElements) {
560
255k
        result = 2; /* different number of back channel elements */
561
255k
      } else {
562
10.5k
        int el, numCh1 = 0, numCh2 = 0;
563
17.7k
        for (el = 0; el < pPce1->NumBackChannelElements; el += 1) {
564
9.52k
          if (pPce1->BackElementHeightInfo[el] !=
565
9.52k
              pPce2->BackElementHeightInfo[el]) {
566
2.36k
            result = 2; /* different height info */
567
2.36k
            break;
568
2.36k
          }
569
7.16k
          numCh1 += pPce1->BackElementIsCpe[el] ? 2 : 1;
570
7.16k
          numCh2 += pPce2->BackElementIsCpe[el] ? 2 : 1;
571
7.16k
        }
572
10.5k
        if (numCh1 != numCh2) {
573
2.54k
          result = 2; /* different number of back channels */
574
2.54k
        }
575
10.5k
      }
576
      /* LFE channels */
577
265k
      if (pPce1->NumLfeChannelElements != pPce2->NumLfeChannelElements) {
578
8.68k
        result = 2; /* different number of lfe channels */
579
8.68k
      }
580
      /* LFEs are always SCEs so we don't need to count the channels. */
581
265k
    }
582
267k
  }
583
584
267k
  return result;
585
267k
}
586
587
266k
void CProgramConfig_GetDefault(CProgramConfig *pPce, const UINT channelConfig) {
588
266k
  FDK_ASSERT(pPce != NULL);
589
590
  /* Init PCE */
591
266k
  CProgramConfig_Init(pPce);
592
266k
  pPce->Profile =
593
266k
      1; /* Set AAC LC because it is the only supported object type. */
594
595
266k
  switch (channelConfig) {
596
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
597
57.4k
    case 32: /* 7.1 side channel configuration as defined in FDK_audio.h */
598
57.4k
      pPce->NumFrontChannelElements = 2;
599
57.4k
      pPce->FrontElementIsCpe[0] = 0;
600
57.4k
      pPce->FrontElementIsCpe[1] = 1;
601
57.4k
      pPce->NumSideChannelElements = 1;
602
57.4k
      pPce->SideElementIsCpe[0] = 1;
603
57.4k
      pPce->NumBackChannelElements = 1;
604
57.4k
      pPce->BackElementIsCpe[0] = 1;
605
57.4k
      pPce->NumLfeChannelElements = 1;
606
57.4k
      pPce->NumChannels = 8;
607
57.4k
      pPce->NumEffectiveChannels = 7;
608
57.4k
      pPce->isValid = 1;
609
57.4k
      break;
610
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
611
57.4k
    case 12: /* 3/0/4.1ch surround back */
612
57.4k
      pPce->BackElementIsCpe[1] = 1;
613
57.4k
      pPce->NumChannels += 1;
614
57.4k
      pPce->NumEffectiveChannels += 1;
615
57.4k
      FDK_FALLTHROUGH;
616
59.2k
    case 11: /* 3/0/3.1ch */
617
59.2k
      pPce->NumFrontChannelElements += 2;
618
59.2k
      pPce->FrontElementIsCpe[0] = 0;
619
59.2k
      pPce->FrontElementIsCpe[1] = 1;
620
59.2k
      pPce->NumBackChannelElements += 2;
621
59.2k
      pPce->BackElementIsCpe[0] = 1;
622
59.2k
      pPce->BackElementIsCpe[1] += 0;
623
59.2k
      pPce->NumLfeChannelElements += 1;
624
59.2k
      pPce->NumChannels += 7;
625
59.2k
      pPce->NumEffectiveChannels += 6;
626
59.2k
      pPce->isValid = 1;
627
59.2k
      break;
628
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
629
57.4k
    case 14:                               /* 2/0/0-3/0/2-0.1ch front height */
630
57.4k
      pPce->FrontElementHeightInfo[2] = 1; /* Top speaker */
631
57.4k
      FDK_FALLTHROUGH;
632
142k
    case 7: /* 5/0/2.1ch front */
633
142k
      pPce->NumFrontChannelElements += 1;
634
142k
      pPce->FrontElementIsCpe[2] = 1;
635
142k
      pPce->NumChannels += 2;
636
142k
      pPce->NumEffectiveChannels += 2;
637
142k
      FDK_FALLTHROUGH;
638
143k
    case 6: /* 3/0/2.1ch */
639
143k
      pPce->NumLfeChannelElements += 1;
640
143k
      pPce->NumChannels += 1;
641
143k
      FDK_FALLTHROUGH;
642
146k
    case 5: /* 3/0/2.0ch */
643
147k
    case 4: /* 3/0/1.0ch */
644
147k
      pPce->NumBackChannelElements += 1;
645
147k
      pPce->BackElementIsCpe[0] = (channelConfig > 4) ? 1 : 0;
646
147k
      pPce->NumChannels += (channelConfig > 4) ? 2 : 1;
647
147k
      pPce->NumEffectiveChannels += (channelConfig > 4) ? 2 : 1;
648
147k
      FDK_FALLTHROUGH;
649
148k
    case 3: /* 3/0/0.0ch */
650
148k
      pPce->NumFrontChannelElements += 1;
651
148k
      pPce->FrontElementIsCpe[1] = 1;
652
148k
      pPce->NumChannels += 2;
653
148k
      pPce->NumEffectiveChannels += 2;
654
148k
      FDK_FALLTHROUGH;
655
149k
    case 1: /* 1/0/0.0ch */
656
149k
      pPce->NumFrontChannelElements += 1;
657
149k
      pPce->FrontElementIsCpe[0] = 0;
658
149k
      pPce->NumChannels += 1;
659
149k
      pPce->NumEffectiveChannels += 1;
660
149k
      pPce->isValid = 1;
661
149k
      break;
662
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
663
209
    case 2: /* 2/0/0.ch */
664
209
      pPce->NumFrontChannelElements = 1;
665
209
      pPce->FrontElementIsCpe[0] = 1;
666
209
      pPce->NumChannels += 2;
667
209
      pPce->NumEffectiveChannels += 2;
668
209
      pPce->isValid = 1;
669
209
      break;
670
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
671
424
    default:
672
424
      pPce->isValid = 0; /* To be explicit! */
673
424
      break;
674
266k
  }
675
676
266k
  if (pPce->isValid) {
677
    /* Create valid element instance tags */
678
266k
    int el, elTagSce = 0, elTagCpe = 0;
679
680
939k
    for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
681
673k
      pPce->FrontElementTagSelect[el] =
682
673k
          (pPce->FrontElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
683
673k
    }
684
323k
    for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
685
57.4k
      pPce->SideElementTagSelect[el] =
686
57.4k
          (pPce->SideElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
687
57.4k
    }
688
589k
    for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
689
323k
      pPce->BackElementTagSelect[el] =
690
323k
          (pPce->BackElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
691
323k
    }
692
266k
    elTagSce = 0;
693
526k
    for (el = 0; el < pPce->NumLfeChannelElements; el += 1) {
694
260k
      pPce->LfeElementTagSelect[el] = elTagSce++;
695
260k
    }
696
266k
  }
697
266k
}
698
699
/**
700
 * \brief get implicit audio channel type for given channelConfig and MPEG
701
 * ordered channel index
702
 * \param channelConfig MPEG channelConfiguration from 1 upto 14
703
 * \param index MPEG channel order index
704
 * \return audio channel type.
705
 */
706
static void getImplicitAudioChannelTypeAndIndex(AUDIO_CHANNEL_TYPE *chType,
707
                                                UCHAR *chIndex,
708
                                                UINT channelConfig,
709
584k
                                                UINT index) {
710
584k
  if (index < 3) {
711
507k
    *chType = ACT_FRONT;
712
507k
    *chIndex = index;
713
507k
  } else {
714
76.8k
    switch (channelConfig) {
715
156
      case 4: /* SCE, CPE, SCE */
716
292
      case 5: /* SCE, CPE, CPE */
717
634
      case 6: /* SCE, CPE, CPE, LFE */
718
634
        switch (index) {
719
467
          case 3:
720
467
          case 4:
721
467
            *chType = ACT_BACK;
722
467
            *chIndex = index - 3;
723
467
            break;
724
167
          case 5:
725
167
            *chType = ACT_LFE;
726
167
            *chIndex = 0;
727
167
            break;
728
634
        }
729
634
        break;
730
23.7k
      case 7: /* SCE,CPE,CPE,CPE,LFE */
731
23.7k
        switch (index) {
732
7.97k
          case 3:
733
7.97k
          case 4:
734
7.97k
            *chType = ACT_FRONT;
735
7.97k
            *chIndex = index;
736
7.97k
            break;
737
7.89k
          case 5:
738
7.89k
          case 6:
739
7.89k
            *chType = ACT_BACK;
740
7.89k
            *chIndex = index - 5;
741
7.89k
            break;
742
7.83k
          case 7:
743
7.83k
            *chType = ACT_LFE;
744
7.83k
            *chIndex = 0;
745
7.83k
            break;
746
23.7k
        }
747
23.7k
        break;
748
23.7k
      case 11: /* SCE,CPE,CPE,SCE,LFE */
749
11.1k
        if (index < 6) {
750
7.55k
          *chType = ACT_BACK;
751
7.55k
          *chIndex = index - 3;
752
7.55k
        } else {
753
3.63k
          *chType = ACT_LFE;
754
3.63k
          *chIndex = 0;
755
3.63k
        }
756
11.1k
        break;
757
6.66k
      case 12: /* SCE,CPE,CPE,CPE,LFE */
758
6.66k
        if (index < 7) {
759
4.45k
          *chType = ACT_BACK;
760
4.45k
          *chIndex = index - 3;
761
4.45k
        } else {
762
2.20k
          *chType = ACT_LFE;
763
2.20k
          *chIndex = 0;
764
2.20k
        }
765
6.66k
        break;
766
34.7k
      case 14: /* SCE,CPE,CPE,LFE,CPE */
767
34.7k
        switch (index) {
768
11.6k
          case 3:
769
11.6k
          case 4:
770
11.6k
            *chType = ACT_BACK;
771
11.6k
            *chIndex = index - 3;
772
11.6k
            break;
773
11.5k
          case 5:
774
11.5k
            *chType = ACT_LFE;
775
11.5k
            *chIndex = 0;
776
11.5k
            break;
777
11.5k
          case 6:
778
11.5k
          case 7:
779
11.5k
            *chType = ACT_FRONT_TOP;
780
11.5k
            *chIndex = index - 6; /* handle the top layer independently */
781
11.5k
            break;
782
34.7k
        }
783
34.7k
        break;
784
34.7k
      default:
785
0
        *chType = ACT_NONE;
786
0
        break;
787
76.8k
    }
788
76.8k
  }
789
584k
}
790
791
int CProgramConfig_LookupElement(CProgramConfig *pPce, UINT channelConfig,
792
                                 const UINT tag, const UINT channelIdx,
793
                                 UCHAR chMapping[], AUDIO_CHANNEL_TYPE chType[],
794
                                 UCHAR chIndex[], const UINT chDescrLen,
795
                                 UCHAR *elMapping, MP4_ELEMENT_ID elList[],
796
604k
                                 MP4_ELEMENT_ID elType) {
797
604k
  if (channelConfig > 0) {
798
    /* Constant channel mapping must have
799
       been set during initialization. */
800
594k
    if (IS_CHANNEL_ELEMENT(elType)) {
801
584k
      *elMapping = pPce->elCounter;
802
584k
      if (elList[pPce->elCounter] != elType &&
803
26.2k
          !IS_USAC_CHANNEL_ELEMENT(elType)) {
804
        /* Not in the list */
805
3.88k
        if ((channelConfig == 2) &&
806
2.94k
            (elType == ID_SCE)) { /* This scenario occurs with HE-AAC v2 streams
807
                                     of buggy encoders. In other decoder
808
                                     implementations decoding of this kind of
809
                                     streams is desired. */
810
2.93k
          channelConfig = 1;
811
2.93k
        } else if ((elList[pPce->elCounter] == ID_LFE) &&
812
855
                   (elType ==
813
855
                    ID_SCE)) { /* Decode bitstreams which wrongly use ID_SCE
814
                                  instead of ID_LFE element type. */
815
854
          ;
816
854
        } else {
817
95
          return 0;
818
95
        }
819
3.88k
      }
820
      /* Assume all front channels */
821
584k
      getImplicitAudioChannelTypeAndIndex(
822
584k
          &chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx);
823
584k
      if (elType == ID_CPE || elType == ID_USAC_CPE) {
824
391k
        chType[channelIdx + 1] = chType[channelIdx];
825
391k
        chIndex[channelIdx + 1] = chIndex[channelIdx] + 1;
826
391k
      }
827
584k
      pPce->elCounter++;
828
584k
    }
829
    /* Accept all non-channel elements, too. */
830
594k
    return 1;
831
594k
  } else {
832
10.4k
    if ((!pPce->isValid) || (pPce->NumChannels > chDescrLen)) {
833
      /* Implicit channel mapping. */
834
0
      if (IS_USAC_CHANNEL_ELEMENT(elType)) {
835
0
        *elMapping = pPce->elCounter++;
836
0
      } else if (IS_MP4_CHANNEL_ELEMENT(elType)) {
837
        /* Store all channel element IDs */
838
0
        elList[pPce->elCounter] = elType;
839
0
        *elMapping = pPce->elCounter++;
840
0
      }
841
10.4k
    } else {
842
      /* Accept the additional channel(s), only if the tag is in the lists */
843
10.4k
      int isCpe = 0, i;
844
      /* Element counter */
845
10.4k
      int ec[PC_NUM_HEIGHT_LAYER] = {0};
846
      /* Channel counters */
847
10.4k
      int cc[PC_NUM_HEIGHT_LAYER] = {0};
848
10.4k
      int fc[PC_NUM_HEIGHT_LAYER] = {0}; /* front channel counter */
849
10.4k
      int sc[PC_NUM_HEIGHT_LAYER] = {0}; /* side channel counter */
850
10.4k
      int bc[PC_NUM_HEIGHT_LAYER] = {0}; /* back channel counter */
851
10.4k
      int lc = 0;                        /* lfe channel counter */
852
853
      /* General MPEG (PCE) composition rules:
854
         - Over all:
855
             <normal height channels><top height channels><bottom height
856
         channels>
857
         - Within each height layer:
858
             <front channels><side channels><back channels>
859
         - Exception:
860
             The LFE channels have no height info and thus they are arranged at
861
         the very end of the normal height layer channels.
862
       */
863
864
10.4k
      switch (elType) {
865
2.24k
        case ID_CPE:
866
2.24k
          isCpe = 1;
867
2.24k
          FDK_FALLTHROUGH;
868
6.56k
        case ID_SCE:
869
          /* search in front channels */
870
9.74k
          for (i = 0; i < pPce->NumFrontChannelElements; i++) {
871
5.11k
            int heightLayer = pPce->FrontElementHeightInfo[i];
872
5.11k
            if (isCpe == pPce->FrontElementIsCpe[i] &&
873
4.82k
                pPce->FrontElementTagSelect[i] == tag) {
874
1.93k
              int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
875
1.93k
              AUDIO_CHANNEL_TYPE aChType =
876
1.93k
                  (AUDIO_CHANNEL_TYPE)((heightLayer << 4) | ACT_FRONT);
877
2.11k
              for (h = heightLayer - 1; h >= 0; h -= 1) {
878
174
                int el;
879
                /* Count front channels/elements */
880
914
                for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
881
740
                  if (pPce->FrontElementHeightInfo[el] == h) {
882
268
                    elIdx += 1;
883
268
                    chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
884
268
                  }
885
740
                }
886
                /* Count side channels/elements */
887
397
                for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
888
223
                  if (pPce->SideElementHeightInfo[el] == h) {
889
77
                    elIdx += 1;
890
77
                    chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
891
77
                  }
892
223
                }
893
                /* Count back channels/elements */
894
365
                for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
895
191
                  if (pPce->BackElementHeightInfo[el] == h) {
896
76
                    elIdx += 1;
897
76
                    chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
898
76
                  }
899
191
                }
900
174
                if (h == 0) { /* normal height */
901
100
                  elIdx += pPce->NumLfeChannelElements;
902
100
                  chIdx += pPce->NumLfeChannelElements;
903
100
                }
904
174
              }
905
1.93k
              chMapping[chIdx] = channelIdx;
906
1.93k
              chType[chIdx] = aChType;
907
1.93k
              chIndex[chIdx] = fc[heightLayer];
908
1.93k
              if (isCpe) {
909
516
                chMapping[chIdx + 1] = channelIdx + 1;
910
516
                chType[chIdx + 1] = aChType;
911
516
                chIndex[chIdx + 1] = fc[heightLayer] + 1;
912
516
              }
913
1.93k
              *elMapping = elIdx;
914
1.93k
              return 1;
915
1.93k
            }
916
3.17k
            ec[heightLayer] += 1;
917
3.17k
            if (pPce->FrontElementIsCpe[i]) {
918
787
              cc[heightLayer] += 2;
919
787
              fc[heightLayer] += 2;
920
2.39k
            } else {
921
2.39k
              cc[heightLayer] += 1;
922
2.39k
              fc[heightLayer] += 1;
923
2.39k
            }
924
3.17k
          }
925
          /* search in side channels */
926
8.07k
          for (i = 0; i < pPce->NumSideChannelElements; i++) {
927
5.63k
            int heightLayer = pPce->SideElementHeightInfo[i];
928
5.63k
            if (isCpe == pPce->SideElementIsCpe[i] &&
929
5.41k
                pPce->SideElementTagSelect[i] == tag) {
930
2.18k
              int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
931
2.18k
              AUDIO_CHANNEL_TYPE aChType =
932
2.18k
                  (AUDIO_CHANNEL_TYPE)((heightLayer << 4) | ACT_SIDE);
933
2.35k
              for (h = heightLayer - 1; h >= 0; h -= 1) {
934
164
                int el;
935
                /* Count front channels/elements */
936
387
                for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
937
223
                  if (pPce->FrontElementHeightInfo[el] == h) {
938
88
                    elIdx += 1;
939
88
                    chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
940
88
                  }
941
223
                }
942
                /* Count side channels/elements */
943
704
                for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
944
540
                  if (pPce->SideElementHeightInfo[el] == h) {
945
123
                    elIdx += 1;
946
123
                    chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
947
123
                  }
948
540
                }
949
                /* Count back channels/elements */
950
392
                for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
951
228
                  if (pPce->BackElementHeightInfo[el] == h) {
952
67
                    elIdx += 1;
953
67
                    chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
954
67
                  }
955
228
                }
956
164
                if (h ==
957
164
                    0) { /* LFE channels belong to the normal height layer */
958
105
                  elIdx += pPce->NumLfeChannelElements;
959
105
                  chIdx += pPce->NumLfeChannelElements;
960
105
                }
961
164
              }
962
2.18k
              chMapping[chIdx] = channelIdx;
963
2.18k
              chType[chIdx] = aChType;
964
2.18k
              chIndex[chIdx] = sc[heightLayer];
965
2.18k
              if (isCpe) {
966
919
                chMapping[chIdx + 1] = channelIdx + 1;
967
919
                chType[chIdx + 1] = aChType;
968
919
                chIndex[chIdx + 1] = sc[heightLayer] + 1;
969
919
              }
970
2.18k
              *elMapping = elIdx;
971
2.18k
              return 1;
972
2.18k
            }
973
3.45k
            ec[heightLayer] += 1;
974
3.45k
            if (pPce->SideElementIsCpe[i]) {
975
1.56k
              cc[heightLayer] += 2;
976
1.56k
              sc[heightLayer] += 2;
977
1.88k
            } else {
978
1.88k
              cc[heightLayer] += 1;
979
1.88k
              sc[heightLayer] += 1;
980
1.88k
            }
981
3.45k
          }
982
          /* search in back channels */
983
4.68k
          for (i = 0; i < pPce->NumBackChannelElements; i++) {
984
4.64k
            int heightLayer = pPce->BackElementHeightInfo[i];
985
4.64k
            if (isCpe == pPce->BackElementIsCpe[i] &&
986
4.50k
                pPce->BackElementTagSelect[i] == tag) {
987
2.40k
              int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
988
2.40k
              AUDIO_CHANNEL_TYPE aChType =
989
2.40k
                  (AUDIO_CHANNEL_TYPE)((heightLayer << 4) | ACT_BACK);
990
2.56k
              for (h = heightLayer - 1; h >= 0; h -= 1) {
991
169
                int el;
992
                /* Count front channels/elements */
993
431
                for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
994
262
                  if (pPce->FrontElementHeightInfo[el] == h) {
995
92
                    elIdx += 1;
996
92
                    chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
997
92
                  }
998
262
                }
999
                /* Count side channels/elements */
1000
377
                for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
1001
208
                  if (pPce->SideElementHeightInfo[el] == h) {
1002
56
                    elIdx += 1;
1003
56
                    chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
1004
56
                  }
1005
208
                }
1006
                /* Count back channels/elements */
1007
603
                for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
1008
434
                  if (pPce->BackElementHeightInfo[el] == h) {
1009
104
                    elIdx += 1;
1010
104
                    chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
1011
104
                  }
1012
434
                }
1013
169
                if (h == 0) { /* normal height */
1014
92
                  elIdx += pPce->NumLfeChannelElements;
1015
92
                  chIdx += pPce->NumLfeChannelElements;
1016
92
                }
1017
169
              }
1018
2.40k
              chMapping[chIdx] = channelIdx;
1019
2.40k
              chType[chIdx] = aChType;
1020
2.40k
              chIndex[chIdx] = bc[heightLayer];
1021
2.40k
              if (isCpe) {
1022
797
                chMapping[chIdx + 1] = channelIdx + 1;
1023
797
                chType[chIdx + 1] = aChType;
1024
797
                chIndex[chIdx + 1] = bc[heightLayer] + 1;
1025
797
              }
1026
2.40k
              *elMapping = elIdx;
1027
2.40k
              return 1;
1028
2.40k
            }
1029
2.24k
            ec[heightLayer] += 1;
1030
2.24k
            if (pPce->BackElementIsCpe[i]) {
1031
535
              cc[heightLayer] += 2;
1032
535
              bc[heightLayer] += 2;
1033
1.70k
            } else {
1034
1.70k
              cc[heightLayer] += 1;
1035
1.70k
              bc[heightLayer] += 1;
1036
1.70k
            }
1037
2.24k
          }
1038
42
          break;
1039
1040
1.11k
        case ID_LFE: { /* Unfortunately we have to go through all normal height
1041
                          layer elements to get the position of the LFE
1042
                          channels. Start with counting the front
1043
                          channels/elements at normal height */
1044
2.42k
          for (i = 0; i < pPce->NumFrontChannelElements; i += 1) {
1045
1.31k
            int heightLayer = pPce->FrontElementHeightInfo[i];
1046
1.31k
            ec[heightLayer] += 1;
1047
1.31k
            cc[heightLayer] += (pPce->FrontElementIsCpe[i]) ? 2 : 1;
1048
1.31k
          }
1049
          /* Count side channels/elements at normal height */
1050
2.29k
          for (i = 0; i < pPce->NumSideChannelElements; i += 1) {
1051
1.17k
            int heightLayer = pPce->SideElementHeightInfo[i];
1052
1.17k
            ec[heightLayer] += 1;
1053
1.17k
            cc[heightLayer] += (pPce->SideElementIsCpe[i]) ? 2 : 1;
1054
1.17k
          }
1055
          /* Count back channels/elements at normal height */
1056
2.72k
          for (i = 0; i < pPce->NumBackChannelElements; i += 1) {
1057
1.60k
            int heightLayer = pPce->BackElementHeightInfo[i];
1058
1.60k
            ec[heightLayer] += 1;
1059
1.60k
            cc[heightLayer] += (pPce->BackElementIsCpe[i]) ? 2 : 1;
1060
1.60k
          }
1061
1062
          /* search in lfe channels */
1063
1.28k
          for (i = 0; i < pPce->NumLfeChannelElements; i++) {
1064
1.25k
            int elIdx =
1065
1.25k
                ec[0]; /* LFE channels belong to the normal height layer */
1066
1.25k
            int chIdx = cc[0];
1067
1.25k
            if (pPce->LfeElementTagSelect[i] == tag) {
1068
1.09k
              chMapping[chIdx] = channelIdx;
1069
1.09k
              *elMapping = elIdx;
1070
1.09k
              chType[chIdx] = ACT_LFE;
1071
1.09k
              chIndex[chIdx] = lc;
1072
1.09k
              return 1;
1073
1.09k
            }
1074
167
            ec[0] += 1;
1075
167
            cc[0] += 1;
1076
167
            lc += 1;
1077
167
          }
1078
1.11k
        } break;
1079
1080
        /* Non audio elements */
1081
28
        case ID_CCE:
1082
          /* search in cce channels */
1083
85
          for (i = 0; i < pPce->NumValidCcElements; i++) {
1084
71
            if (pPce->ValidCcElementTagSelect[i] == tag) {
1085
13
              return 1;
1086
13
            }
1087
71
          }
1088
14
          break;
1089
2.70k
        case ID_DSE:
1090
          /* search associated data elements */
1091
4.79k
          for (i = 0; i < pPce->NumAssocDataElements; i++) {
1092
2.47k
            if (pPce->AssocDataElementTagSelect[i] == tag) {
1093
384
              return 1;
1094
384
            }
1095
2.47k
          }
1096
2.32k
          break;
1097
2.32k
        default:
1098
0
          return 0;
1099
10.4k
      }
1100
2.40k
      return 0; /* not found in any list */
1101
10.4k
    }
1102
10.4k
  }
1103
1104
0
  return 1;
1105
604k
}
1106
1107
34.1k
#define SPEAKER_PLANE_NORMAL 0
1108
9.97k
#define SPEAKER_PLANE_TOP 1
1109
33.9k
#define SPEAKER_PLANE_BOTTOM 2
1110
1111
void CProgramConfig_GetChannelDescription(const UINT chConfig,
1112
                                          const CProgramConfig *pPce,
1113
                                          AUDIO_CHANNEL_TYPE chType[],
1114
0
                                          UCHAR chIndex[]) {
1115
0
  FDK_ASSERT(chType != NULL);
1116
0
  FDK_ASSERT(chIndex != NULL);
1117
1118
0
  if ((chConfig == 0) && (pPce != NULL)) {
1119
0
    if (pPce->isValid) {
1120
0
      int spkPlane, chIdx = 0;
1121
0
      for (spkPlane = SPEAKER_PLANE_NORMAL; spkPlane <= SPEAKER_PLANE_BOTTOM;
1122
0
           spkPlane += 1) {
1123
0
        int elIdx, grpChIdx = 0;
1124
0
        for (elIdx = 0; elIdx < pPce->NumFrontChannelElements; elIdx += 1) {
1125
0
          if (pPce->FrontElementHeightInfo[elIdx] == spkPlane) {
1126
0
            chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_FRONT);
1127
0
            chIndex[chIdx++] = grpChIdx++;
1128
0
            if (pPce->FrontElementIsCpe[elIdx]) {
1129
0
              chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_FRONT);
1130
0
              chIndex[chIdx++] = grpChIdx++;
1131
0
            }
1132
0
          }
1133
0
        }
1134
0
        grpChIdx = 0;
1135
0
        for (elIdx = 0; elIdx < pPce->NumSideChannelElements; elIdx += 1) {
1136
0
          if (pPce->SideElementHeightInfo[elIdx] == spkPlane) {
1137
0
            chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_SIDE);
1138
0
            chIndex[chIdx++] = grpChIdx++;
1139
0
            if (pPce->SideElementIsCpe[elIdx]) {
1140
0
              chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_SIDE);
1141
0
              chIndex[chIdx++] = grpChIdx++;
1142
0
            }
1143
0
          }
1144
0
        }
1145
0
        grpChIdx = 0;
1146
0
        for (elIdx = 0; elIdx < pPce->NumBackChannelElements; elIdx += 1) {
1147
0
          if (pPce->BackElementHeightInfo[elIdx] == spkPlane) {
1148
0
            chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_BACK);
1149
0
            chIndex[chIdx++] = grpChIdx++;
1150
0
            if (pPce->BackElementIsCpe[elIdx]) {
1151
0
              chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_BACK);
1152
0
              chIndex[chIdx++] = grpChIdx++;
1153
0
            }
1154
0
          }
1155
0
        }
1156
0
        grpChIdx = 0;
1157
0
        if (spkPlane == SPEAKER_PLANE_NORMAL) {
1158
0
          for (elIdx = 0; elIdx < pPce->NumLfeChannelElements; elIdx += 1) {
1159
0
            chType[chIdx] = ACT_LFE;
1160
0
            chIndex[chIdx++] = grpChIdx++;
1161
0
          }
1162
0
        }
1163
0
      }
1164
0
    }
1165
0
  } else {
1166
0
    int chIdx;
1167
0
    for (chIdx = 0; chIdx < getNumberOfTotalChannels(chConfig); chIdx += 1) {
1168
0
      getImplicitAudioChannelTypeAndIndex(&chType[chIdx], &chIndex[chIdx],
1169
0
                                          chConfig, chIdx);
1170
0
    }
1171
0
  }
1172
0
}
1173
1174
int CProgramConfig_GetPceChMap(const CProgramConfig *pPce, UCHAR pceChMap[],
1175
1.99k
                               const UINT pceChMapLen) {
1176
1.99k
  const UCHAR *nElements = &pPce->NumFrontChannelElements;
1177
1.99k
  const UCHAR *elHeight[3], *elIsCpe[3];
1178
1.99k
  unsigned chIdx, plane, grp, offset, totCh[3], numCh[3][4];
1179
1180
1.99k
  FDK_ASSERT(pPce != NULL);
1181
1.99k
  FDK_ASSERT(pceChMap != NULL);
1182
1183
  /* Init counter: */
1184
1.99k
  FDKmemclear(totCh, 3 * sizeof(unsigned));
1185
1.99k
  FDKmemclear(numCh, 3 * 4 * sizeof(unsigned));
1186
1187
  /* Analyse PCE: */
1188
1.99k
  elHeight[0] = pPce->FrontElementHeightInfo;
1189
1.99k
  elIsCpe[0] = pPce->FrontElementIsCpe;
1190
1.99k
  elHeight[1] = pPce->SideElementHeightInfo;
1191
1.99k
  elIsCpe[1] = pPce->SideElementIsCpe;
1192
1.99k
  elHeight[2] = pPce->BackElementHeightInfo;
1193
1.99k
  elIsCpe[2] = pPce->BackElementIsCpe;
1194
1195
7.98k
  for (plane = 0; plane <= SPEAKER_PLANE_BOTTOM; plane += 1) {
1196
23.9k
    for (grp = 0; grp < 3; grp += 1) { /* front, side, back */
1197
17.9k
      unsigned el;
1198
36.5k
      for (el = 0; el < nElements[grp]; el += 1) {
1199
18.6k
        if (elHeight[grp][el] == plane) {
1200
6.21k
          unsigned elCh = elIsCpe[grp][el] ? 2 : 1;
1201
6.21k
          numCh[plane][grp] += elCh;
1202
6.21k
          totCh[plane] += elCh;
1203
6.21k
        }
1204
18.6k
      }
1205
17.9k
    }
1206
5.98k
    if (plane == SPEAKER_PLANE_NORMAL) {
1207
1.99k
      unsigned elCh = pPce->NumLfeChannelElements;
1208
1.99k
      numCh[plane][grp] += elCh;
1209
1.99k
      totCh[plane] += elCh;
1210
1.99k
    }
1211
5.98k
  }
1212
  /* Sanity checks: */
1213
1.99k
  chIdx = totCh[SPEAKER_PLANE_NORMAL] + totCh[SPEAKER_PLANE_TOP] +
1214
1.99k
          totCh[SPEAKER_PLANE_BOTTOM];
1215
1.99k
  if (chIdx > pceChMapLen) {
1216
0
    return -1;
1217
0
  }
1218
1219
  /* Create map: */
1220
1.99k
  offset = grp = 0;
1221
1.99k
  unsigned grpThresh = numCh[SPEAKER_PLANE_NORMAL][grp];
1222
11.6k
  for (chIdx = 0; chIdx < totCh[SPEAKER_PLANE_NORMAL]; chIdx += 1) {
1223
14.1k
    while ((chIdx >= grpThresh) && (grp < 3)) {
1224
4.54k
      offset += numCh[1][grp] + numCh[2][grp];
1225
4.54k
      grp += 1;
1226
4.54k
      grpThresh += numCh[SPEAKER_PLANE_NORMAL][grp];
1227
4.54k
    }
1228
9.63k
    pceChMap[chIdx] = chIdx + offset;
1229
9.63k
  }
1230
1.99k
  offset = 0;
1231
9.97k
  for (grp = 0; grp < 4; grp += 1) { /* front, side, back and lfe */
1232
7.98k
    offset += numCh[SPEAKER_PLANE_NORMAL][grp];
1233
23.9k
    for (plane = SPEAKER_PLANE_TOP; plane <= SPEAKER_PLANE_BOTTOM; plane += 1) {
1234
15.9k
      unsigned mapCh;
1235
15.9k
      for (mapCh = 0; mapCh < numCh[plane][grp]; mapCh += 1) {
1236
0
        pceChMap[chIdx++] = offset;
1237
0
        offset += 1;
1238
0
      }
1239
15.9k
    }
1240
7.98k
  }
1241
1.99k
  return 0;
1242
1.99k
}
1243
1244
int CProgramConfig_GetElementTable(const CProgramConfig *pPce,
1245
                                   MP4_ELEMENT_ID elList[],
1246
67.7k
                                   const INT elListSize, UCHAR *pChMapIdx) {
1247
67.7k
  int i, el = 0;
1248
1249
67.7k
  FDK_ASSERT(elList != NULL);
1250
67.7k
  FDK_ASSERT(pChMapIdx != NULL);
1251
67.7k
  FDK_ASSERT(pPce != NULL);
1252
1253
67.7k
  *pChMapIdx = 0;
1254
1255
67.7k
  if ((elListSize <
1256
67.7k
       pPce->NumFrontChannelElements + pPce->NumSideChannelElements +
1257
67.7k
           pPce->NumBackChannelElements + pPce->NumLfeChannelElements) ||
1258
67.5k
      (pPce->NumChannels == 0)) {
1259
194
    return 0;
1260
194
  }
1261
1262
79.6k
  for (i = 0; i < pPce->NumFrontChannelElements; i += 1) {
1263
12.1k
    elList[el++] = (pPce->FrontElementIsCpe[i]) ? ID_CPE : ID_SCE;
1264
12.1k
  }
1265
1266
86.0k
  for (i = 0; i < pPce->NumSideChannelElements; i += 1) {
1267
18.5k
    elList[el++] = (pPce->SideElementIsCpe[i]) ? ID_CPE : ID_SCE;
1268
18.5k
  }
1269
1270
294k
  for (i = 0; i < pPce->NumBackChannelElements; i += 1) {
1271
227k
    elList[el++] = (pPce->BackElementIsCpe[i]) ? ID_CPE : ID_SCE;
1272
227k
  }
1273
1274
135k
  for (i = 0; i < pPce->NumLfeChannelElements; i += 1) {
1275
67.5k
    elList[el++] = ID_LFE;
1276
67.5k
  }
1277
1278
  /* Find an corresponding channel configuration if possible */
1279
67.5k
  switch (pPce->NumChannels) {
1280
1.49k
    case 1:
1281
2.50k
    case 2:
1282
      /* One and two channels have no alternatives. */
1283
2.50k
      *pChMapIdx = pPce->NumChannels;
1284
2.50k
      break;
1285
446
    case 3:
1286
1.87k
    case 4:
1287
4.77k
    case 5:
1288
5.84k
    case 6: { /* Test if the number of channels can be used as channel config:
1289
               */
1290
5.84k
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1291
      /* Create a PCE for the config to test ... */
1292
5.84k
      CProgramConfig_GetDefault(tmpPce, pPce->NumChannels);
1293
      /* ... and compare it with the given one. */
1294
5.84k
      *pChMapIdx = (!(CProgramConfig_Compare(pPce, tmpPce) & 0xE))
1295
5.84k
                       ? pPce->NumChannels
1296
5.84k
                       : 0;
1297
      /* If compare result is 0 or 1 we can be sure that it is channel
1298
       * config 11. */
1299
5.84k
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1300
5.84k
    } break;
1301
1.45k
    case 7: {
1302
1.45k
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1303
      /* Create a PCE for the config to test ... */
1304
1.45k
      CProgramConfig_GetDefault(tmpPce, 11);
1305
      /* ... and compare it with the given one. */
1306
1.45k
      *pChMapIdx = (!(CProgramConfig_Compare(pPce, tmpPce) & 0xE)) ? 11 : 0;
1307
      /* If compare result is 0 or 1 we can be sure that it is channel
1308
       * config 11. */
1309
1.45k
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1310
1.45k
    } break;
1311
57.4k
    case 8: { /* Try the four possible 7.1ch configurations. One after the
1312
                 other. */
1313
57.4k
      UCHAR testCfg[4] = {32, 14, 12, 7};
1314
57.4k
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1315
287k
      for (i = 0; i < 4; i += 1) {
1316
        /* Create a PCE for the config to test ... */
1317
229k
        CProgramConfig_GetDefault(tmpPce, testCfg[i]);
1318
        /* ... and compare it with the given one. */
1319
229k
        if (!(CProgramConfig_Compare(pPce, tmpPce) & 0xE)) {
1320
          /* If the compare result is 0 or 1 than the two channel configurations
1321
           * match. */
1322
          /* Explicit mapping of 7.1 side channel configuration to 7.1 rear
1323
           * channel mapping. */
1324
802
          *pChMapIdx = (testCfg[i] == 32) ? 12 : testCfg[i];
1325
802
        }
1326
229k
      }
1327
57.4k
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1328
57.4k
    } break;
1329
251
    default:
1330
      /* The PCE does not match any predefined channel configuration. */
1331
251
      *pChMapIdx = 0;
1332
251
      break;
1333
67.5k
  }
1334
1335
67.5k
  return el;
1336
67.5k
}
1337
1338
742k
static AUDIO_OBJECT_TYPE getAOT(HANDLE_FDK_BITSTREAM bs) {
1339
742k
  int tmp = 0;
1340
1341
742k
  tmp = FDKreadBits(bs, 5);
1342
742k
  if (tmp == AOT_ESCAPE) {
1343
483k
    int tmp2 = FDKreadBits(bs, 6);
1344
483k
    tmp = 32 + tmp2;
1345
483k
  }
1346
1347
742k
  return (AUDIO_OBJECT_TYPE)tmp;
1348
742k
}
1349
1350
1.02M
static INT getSampleRate(HANDLE_FDK_BITSTREAM bs, UCHAR *index, int nBits) {
1351
1.02M
  INT sampleRate;
1352
1.02M
  int idx;
1353
1354
1.02M
  idx = FDKreadBits(bs, nBits);
1355
1.02M
  if (idx == (1 << nBits) - 1) {
1356
28.7k
    if (FDKgetValidBits(bs) < 24) {
1357
223
      return 0;
1358
223
    }
1359
28.4k
    sampleRate = FDKreadBits(bs, 24);
1360
998k
  } else {
1361
998k
    sampleRate = SamplingRateTable[idx];
1362
998k
  }
1363
1364
1.02M
  *index = idx;
1365
1366
1.02M
  return sampleRate;
1367
1.02M
}
1368
1369
static TRANSPORTDEC_ERROR GaSpecificConfig_Parse(CSGaSpecificConfig *self,
1370
                                                 CSAudioSpecificConfig *asc,
1371
                                                 HANDLE_FDK_BITSTREAM bs,
1372
239k
                                                 UINT ascStartAnchor) {
1373
239k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1374
1375
239k
  self->m_frameLengthFlag = FDKreadBits(bs, 1);
1376
1377
239k
  self->m_dependsOnCoreCoder = FDKreadBits(bs, 1);
1378
1379
239k
  if (self->m_dependsOnCoreCoder) self->m_coreCoderDelay = FDKreadBits(bs, 14);
1380
1381
239k
  self->m_extensionFlag = FDKreadBits(bs, 1);
1382
1383
239k
  if (asc->m_channelConfiguration == 0) {
1384
88.2k
    CProgramConfig_Read(&asc->m_progrConfigElement, bs, ascStartAnchor);
1385
88.2k
  }
1386
1387
239k
  if ((asc->m_aot == AOT_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_SCAL)) {
1388
66.0k
    self->m_layer = FDKreadBits(bs, 3);
1389
66.0k
  }
1390
1391
239k
  if (self->m_extensionFlag) {
1392
119k
    if (asc->m_aot == AOT_ER_BSAC) {
1393
1.90k
      self->m_numOfSubFrame = FDKreadBits(bs, 5);
1394
1.90k
      self->m_layerLength = FDKreadBits(bs, 11);
1395
1.90k
    }
1396
1397
119k
    if ((asc->m_aot == AOT_ER_AAC_LC) || (asc->m_aot == AOT_ER_AAC_LTP) ||
1398
118k
        (asc->m_aot == AOT_ER_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_LD)) {
1399
44.9k
      asc->m_vcb11Flag = FDKreadBits(bs, 1); /* aacSectionDataResilienceFlag */
1400
44.9k
      asc->m_rvlcFlag =
1401
44.9k
          FDKreadBits(bs, 1); /* aacScalefactorDataResilienceFlag */
1402
44.9k
      asc->m_hcrFlag = FDKreadBits(bs, 1); /* aacSpectralDataResilienceFlag */
1403
44.9k
    }
1404
1405
119k
    self->m_extensionFlag3 = FDKreadBits(bs, 1);
1406
119k
  }
1407
239k
  return (ErrorStatus);
1408
239k
}
1409
1410
531k
static INT skipSbrHeader(HANDLE_FDK_BITSTREAM hBs, int isUsac) {
1411
  /* Dummy parse SbrDfltHeader() */
1412
531k
  INT dflt_header_extra1, dflt_header_extra2, bitsToSkip = 0;
1413
1414
531k
  if (!isUsac) {
1415
359k
    bitsToSkip = 6;
1416
359k
    FDKpushFor(hBs, 6); /* amp res 1, xover freq 3, reserved 2 */
1417
359k
  }
1418
531k
  bitsToSkip += 8;
1419
531k
  FDKpushFor(hBs, 8); /* start / stop freq */
1420
531k
  bitsToSkip += 2;
1421
531k
  dflt_header_extra1 = FDKreadBit(hBs);
1422
531k
  dflt_header_extra2 = FDKreadBit(hBs);
1423
531k
  bitsToSkip += 5 * dflt_header_extra1 + 6 * dflt_header_extra2;
1424
531k
  FDKpushFor(hBs, 5 * dflt_header_extra1 + 6 * dflt_header_extra2);
1425
1426
531k
  return bitsToSkip;
1427
531k
}
1428
1429
static INT ld_sbr_header(CSAudioSpecificConfig *asc, const INT dsFactor,
1430
111k
                         HANDLE_FDK_BITSTREAM hBs, CSTpCallBacks *cb) {
1431
111k
  const int channelConfiguration = asc->m_channelConfiguration;
1432
111k
  int i = 0, j = 0;
1433
111k
  INT error = 0;
1434
111k
  MP4_ELEMENT_ID element = ID_NONE;
1435
1436
  /* check whether the channelConfiguration is defined in
1437
   * channel_configuration_array */
1438
111k
  if (channelConfiguration < 0 ||
1439
111k
      channelConfiguration > (INT)(sizeof(channel_configuration_array) /
1440
111k
                                       sizeof(MP4_ELEMENT_ID **) -
1441
111k
                                   1)) {
1442
0
    return TRANSPORTDEC_PARSE_ERROR;
1443
0
  }
1444
1445
  /* read elements of the passed channel_configuration until there is ID_NONE */
1446
535k
  while ((element = channel_configuration_array[channelConfiguration][j]) !=
1447
535k
         ID_NONE) {
1448
    /* Setup LFE element for upsampling too. This is essential especially for
1449
     * channel configs where the LFE element is not at the last position for
1450
     * example in channel config 13 or 14. It leads to memory leaks if the setup
1451
     * of the LFE element would be done later in the core. */
1452
428k
    if (element == ID_SCE || element == ID_CPE || element == ID_LFE) {
1453
428k
      error |= cb->cbSbr(
1454
428k
          cb->cbSbrData, hBs, asc->m_samplingFrequency / dsFactor,
1455
428k
          asc->m_extensionSamplingFrequency / dsFactor,
1456
428k
          asc->m_samplesPerFrame / dsFactor, AOT_ER_AAC_ELD, element, i++, 0, 0,
1457
428k
          asc->configMode, &asc->SbrConfigChanged, dsFactor);
1458
428k
      if (error != TRANSPORTDEC_OK) {
1459
5.64k
        goto bail;
1460
5.64k
      }
1461
428k
    }
1462
423k
    j++;
1463
423k
  }
1464
111k
bail:
1465
111k
  return error;
1466
111k
}
1467
1468
static TRANSPORTDEC_ERROR EldSpecificConfig_Parse(CSAudioSpecificConfig *asc,
1469
                                                  HANDLE_FDK_BITSTREAM hBs,
1470
213k
                                                  CSTpCallBacks *cb) {
1471
213k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1472
213k
  CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig;
1473
213k
  UINT eldExtType;
1474
213k
  int eldExtLen, len, cnt, ldSbrLen = 0, eldExtLenSum, numSbrHeader = 0,
1475
213k
                           sbrIndex, eldExtCnt = 0;
1476
1477
213k
  unsigned char downscale_fill_nibble;
1478
1479
213k
  FDKmemclear(esc, sizeof(CSEldSpecificConfig));
1480
1481
213k
  esc->m_frameLengthFlag = FDKreadBits(hBs, 1);
1482
213k
  if (esc->m_frameLengthFlag) {
1483
104k
    asc->m_samplesPerFrame = 480;
1484
108k
  } else {
1485
108k
    asc->m_samplesPerFrame = 512;
1486
108k
  }
1487
1488
213k
  asc->m_vcb11Flag = FDKreadBits(hBs, 1);
1489
213k
  asc->m_rvlcFlag = FDKreadBits(hBs, 1);
1490
213k
  asc->m_hcrFlag = FDKreadBits(hBs, 1);
1491
1492
213k
  esc->m_sbrPresentFlag = FDKreadBits(hBs, 1);
1493
1494
213k
  if (esc->m_sbrPresentFlag == 1) {
1495
115k
    esc->m_sbrSamplingRate =
1496
115k
        FDKreadBits(hBs, 1); /* 0: single rate, 1: dual rate */
1497
115k
    esc->m_sbrCrcFlag = FDKreadBits(hBs, 1);
1498
1499
115k
    asc->m_extensionSamplingFrequency = asc->m_samplingFrequency
1500
115k
                                        << esc->m_sbrSamplingRate;
1501
1502
115k
    if (cb->cbSbr != NULL) {
1503
      /* ELD reduced delay mode: LD-SBR initialization has to know the downscale
1504
         information. Postpone LD-SBR initialization and read ELD extension
1505
         information first. */
1506
115k
      switch (asc->m_channelConfiguration) {
1507
9.50k
        case 1:
1508
31.8k
        case 2:
1509
31.8k
          numSbrHeader = 1;
1510
31.8k
          break;
1511
956
        case 3:
1512
956
          numSbrHeader = 2;
1513
956
          break;
1514
1.76k
        case 4:
1515
2.03k
        case 5:
1516
2.44k
        case 6:
1517
2.44k
          numSbrHeader = 3;
1518
2.44k
          break;
1519
11.7k
        case 7:
1520
30.6k
        case 11:
1521
39.4k
        case 12:
1522
79.6k
        case 14:
1523
79.6k
          numSbrHeader = 4;
1524
79.6k
          break;
1525
547
        default:
1526
547
          numSbrHeader = 0;
1527
547
          break;
1528
115k
      }
1529
474k
      for (sbrIndex = 0; sbrIndex < numSbrHeader; sbrIndex++) {
1530
359k
        ldSbrLen += skipSbrHeader(hBs, 0);
1531
359k
      }
1532
115k
    } else {
1533
0
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1534
0
    }
1535
115k
  }
1536
213k
  esc->m_useLdQmfTimeAlign = 0;
1537
1538
  /* new ELD syntax */
1539
213k
  eldExtLenSum = FDKgetValidBits(hBs);
1540
213k
  esc->m_downscaledSamplingFrequency = asc->m_samplingFrequency;
1541
  /* parse ExtTypeConfigData */
1542
509k
  while (((eldExtType = FDKreadBits(hBs, 4)) != ELDEXT_TERM) &&
1543
320k
         ((INT)FDKgetValidBits(hBs) >= 0) && (eldExtCnt++ < 15)) {
1544
317k
    eldExtLen = len = FDKreadBits(hBs, 4);
1545
317k
    if (len == 0xf) {
1546
14.7k
      len = FDKreadBits(hBs, 8);
1547
14.7k
      eldExtLen += len;
1548
1549
14.7k
      if (len == 0xff) {
1550
4.56k
        len = FDKreadBits(hBs, 16);
1551
4.56k
        eldExtLen += len;
1552
4.56k
      }
1553
14.7k
    }
1554
1555
317k
    switch (eldExtType) {
1556
105k
      case ELDEXT_LDSAC:
1557
105k
        esc->m_useLdQmfTimeAlign = 1;
1558
105k
        if (cb->cbSsc != NULL) {
1559
105k
          ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc(
1560
105k
              cb->cbSscData, hBs, asc->m_aot,
1561
105k
              asc->m_samplingFrequency << esc->m_sbrSamplingRate,
1562
105k
              asc->m_samplesPerFrame << esc->m_sbrSamplingRate,
1563
105k
              asc->m_channelConfiguration, 1, /* stereoConfigIndex */
1564
105k
              -1, /* nTimeSlots: read from bitstream */
1565
105k
              eldExtLen, asc->configMode, &asc->SacConfigChanged);
1566
105k
          if (ErrorStatus != TRANSPORTDEC_OK) {
1567
19.6k
            return TRANSPORTDEC_PARSE_ERROR;
1568
19.6k
          }
1569
85.7k
          if (esc->m_downscaledSamplingFrequency != asc->m_samplingFrequency) {
1570
240
            return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled
1571
                                                       mode not allowed */
1572
240
          }
1573
85.4k
          break;
1574
85.7k
        }
1575
1576
0
        FDK_FALLTHROUGH;
1577
188k
      default:
1578
115M
        for (cnt = 0; cnt < eldExtLen; cnt++) {
1579
115M
          FDKreadBits(hBs, 8);
1580
115M
        }
1581
188k
        break;
1582
1583
23.6k
      case ELDEXT_DOWNSCALEINFO:
1584
23.6k
        UCHAR tmpDownscaleFreqIdx;
1585
23.6k
        esc->m_downscaledSamplingFrequency =
1586
23.6k
            getSampleRate(hBs, &tmpDownscaleFreqIdx, 4);
1587
23.6k
        if (esc->m_downscaledSamplingFrequency == 0 ||
1588
23.4k
            esc->m_downscaledSamplingFrequency > 96000) {
1589
620
          return TRANSPORTDEC_PARSE_ERROR;
1590
620
        }
1591
23.0k
        downscale_fill_nibble = FDKreadBits(hBs, 4);
1592
23.0k
        if (downscale_fill_nibble != 0x0) {
1593
903
          return TRANSPORTDEC_PARSE_ERROR;
1594
903
        }
1595
22.1k
        if (esc->m_useLdQmfTimeAlign == 1) {
1596
319
          return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled
1597
                                                     mode not allowed */
1598
319
        }
1599
21.8k
        break;
1600
317k
    }
1601
317k
  }
1602
191k
  if (eldExtType != ELDEXT_TERM) {
1603
2.36k
    return TRANSPORTDEC_PARSE_ERROR;
1604
2.36k
  }
1605
1606
189k
  if ((INT)FDKgetValidBits(hBs) < 0) {
1607
623
    return TRANSPORTDEC_PARSE_ERROR;
1608
623
  }
1609
1610
188k
  if (esc->m_sbrPresentFlag == 1 && numSbrHeader != 0) {
1611
112k
    INT dsFactor = 1; /* Downscale factor must be 1 or even for SBR */
1612
112k
    if (esc->m_downscaledSamplingFrequency != 0) {
1613
112k
      if (asc->m_samplingFrequency % esc->m_downscaledSamplingFrequency != 0) {
1614
216
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1615
216
      }
1616
112k
      dsFactor = asc->m_samplingFrequency / esc->m_downscaledSamplingFrequency;
1617
112k
      if (dsFactor != 1 && (dsFactor)&1) {
1618
194
        return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* SBR needs an even downscale
1619
                                                   factor */
1620
194
      }
1621
111k
      if (dsFactor != 1 && dsFactor != 2 && dsFactor != 4) {
1622
207
        dsFactor = 1; /* don't apply dsf for not yet supported even dsfs */
1623
207
      }
1624
111k
      if ((INT)asc->m_samplesPerFrame % dsFactor != 0) {
1625
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* frameSize/dsf must be an
1626
                                                   integer number */
1627
0
      }
1628
111k
    }
1629
111k
    eldExtLenSum = eldExtLenSum - FDKgetValidBits(hBs);
1630
111k
    FDKpushBack(hBs, eldExtLenSum + ldSbrLen);
1631
111k
    if (0 != ld_sbr_header(asc, dsFactor, hBs, cb)) {
1632
5.64k
      return TRANSPORTDEC_PARSE_ERROR;
1633
5.64k
    }
1634
106k
    FDKpushFor(hBs, eldExtLenSum);
1635
106k
  }
1636
182k
  return (ErrorStatus);
1637
188k
}
1638
1639
/*
1640
Subroutine to store config in UCHAR buffer. Bit stream position does not change.
1641
*/
1642
static UINT StoreConfigAsBitstream(
1643
    HANDLE_FDK_BITSTREAM hBs, const INT configSize_bits, /* If < 0 (> 0) config
1644
                                                            to read is before
1645
                                                            (after) current bit
1646
                                                            stream position. */
1647
469k
    UCHAR *configTargetBuffer, const USHORT configTargetBufferSize_bytes) {
1648
469k
  FDK_BITSTREAM usacConf;
1649
469k
  UINT const nBits = fAbs(configSize_bits);
1650
469k
  UINT j, tmp;
1651
1652
469k
  if (nBits > 8 * (UINT)configTargetBufferSize_bytes) {
1653
454
    return 1;
1654
454
  }
1655
468k
  FDKmemclear(configTargetBuffer, configTargetBufferSize_bytes);
1656
1657
468k
  FDKinitBitStream(&usacConf, configTargetBuffer, configTargetBufferSize_bytes,
1658
468k
                   nBits, BS_WRITER);
1659
468k
  if (configSize_bits < 0) {
1660
468k
    FDKpushBack(hBs, nBits);
1661
468k
  }
1662
1.39M
  for (j = nBits; j > 31; j -= 32) {
1663
930k
    tmp = FDKreadBits(hBs, 32);
1664
930k
    FDKwriteBits(&usacConf, tmp, 32);
1665
930k
  }
1666
468k
  if (j > 0) {
1667
457k
    tmp = FDKreadBits(hBs, j);
1668
457k
    FDKwriteBits(&usacConf, tmp, j);
1669
457k
  }
1670
468k
  FDKsyncCache(&usacConf);
1671
468k
  if (configSize_bits > 0) {
1672
0
    FDKpushBack(hBs, nBits);
1673
0
  }
1674
1675
468k
  return 0;
1676
469k
}
1677
1678
/* maps coreSbrFrameLengthIndex to coreCoderFrameLength */
1679
static const USHORT usacFrameLength[8] = {768, 1024, 2048, 2048, 4096, 0, 0, 0};
1680
/* maps coreSbrFrameLengthIndex to sbrRatioIndex */
1681
static const UCHAR sbrRatioIndex[8] = {0, 0, 2, 3, 1, 0, 0, 0};
1682
1683
/*
1684
  subroutine for parsing extension element configuration:
1685
  UsacExtElementConfig() q.v. ISO/IEC FDIS 23003-3:2011(E) Table 14
1686
  rsv603daExtElementConfig() q.v. ISO/IEC DIS 23008-3 Table 13
1687
*/
1688
static TRANSPORTDEC_ERROR extElementConfig(CSUsacExtElementConfig *extElement,
1689
                                           HANDLE_FDK_BITSTREAM hBs,
1690
                                           const CSTpCallBacks *cb,
1691
                                           const UCHAR numSignalsInGroup,
1692
                                           const UINT coreFrameLength,
1693
                                           const int subStreamIndex,
1694
273k
                                           const AUDIO_OBJECT_TYPE aot) {
1695
273k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1696
1697
273k
  UINT usacExtElementType = escapedValue(hBs, 4, 8, 16);
1698
1699
  /* recurve extension elements which are invalid for USAC */
1700
273k
  if (aot == AOT_USAC) {
1701
273k
    switch (usacExtElementType) {
1702
19.9k
      case ID_EXT_ELE_FILL:
1703
20.0k
      case ID_EXT_ELE_MPEGS:
1704
25.0k
      case ID_EXT_ELE_SAOC:
1705
31.6k
      case ID_EXT_ELE_AUDIOPREROLL:
1706
169k
      case ID_EXT_ELE_UNI_DRC:
1707
169k
        break;
1708
104k
      default:
1709
104k
        usacExtElementType = ID_EXT_ELE_UNKNOWN;
1710
104k
        break;
1711
273k
    }
1712
273k
  }
1713
1714
273k
  int usacExtElementConfigLength = escapedValue(hBs, 4, 8, 16);
1715
273k
  extElement->usacExtElementConfigLength = (USHORT)usacExtElementConfigLength;
1716
273k
  INT bsAnchor;
1717
1718
273k
  if (FDKreadBit(hBs)) /* usacExtElementDefaultLengthPresent */
1719
5.76k
    extElement->usacExtElementDefaultLength = escapedValue(hBs, 8, 16, 0) + 1;
1720
267k
  else
1721
267k
    extElement->usacExtElementDefaultLength = 0;
1722
1723
273k
  extElement->usacExtElementPayloadFrag = FDKreadBit(hBs);
1724
1725
273k
  bsAnchor = (INT)FDKgetValidBits(hBs);
1726
1727
273k
  switch (usacExtElementType) {
1728
104k
    case ID_EXT_ELE_UNKNOWN:
1729
124k
    case ID_EXT_ELE_FILL:
1730
124k
      break;
1731
6.58k
    case ID_EXT_ELE_AUDIOPREROLL:
1732
      /* No configuration element */
1733
6.58k
      extElement->usacExtElementHasAudioPreRoll = 1;
1734
6.58k
      break;
1735
137k
    case ID_EXT_ELE_UNI_DRC: {
1736
137k
      if (cb->cbUniDrc != NULL) {
1737
137k
        ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1738
137k
            cb->cbUniDrcData, hBs, usacExtElementConfigLength,
1739
137k
            0, /* uniDrcConfig */
1740
137k
            subStreamIndex, 0, aot);
1741
137k
        if (ErrorStatus != TRANSPORTDEC_OK) {
1742
0
          return ErrorStatus;
1743
0
        }
1744
137k
      }
1745
137k
    } break;
1746
137k
    default:
1747
5.12k
      usacExtElementType = ID_EXT_ELE_UNKNOWN;
1748
5.12k
      break;
1749
273k
  }
1750
273k
  extElement->usacExtElementType = (USAC_EXT_ELEMENT_TYPE)usacExtElementType;
1751
1752
  /* Adjust bit stream position. This is required because of byte alignment and
1753
   * unhandled extensions. */
1754
273k
  {
1755
273k
    INT left_bits = (usacExtElementConfigLength << 3) -
1756
273k
                    (bsAnchor - (INT)FDKgetValidBits(hBs));
1757
273k
    if (left_bits >= 0) {
1758
269k
      FDKpushFor(hBs, left_bits);
1759
269k
    } else {
1760
      /* parsed too many bits */
1761
4.15k
      ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
1762
4.15k
    }
1763
273k
  }
1764
1765
273k
  return ErrorStatus;
1766
273k
}
1767
1768
/*
1769
  subroutine for parsing the USAC / RSVD60 configuration extension:
1770
  UsacConfigExtension() q.v. ISO/IEC FDIS 23003-3:2011(E) Table 15
1771
  rsv603daConfigExtension() q.v. ISO/IEC DIS 23008-3 Table 14
1772
*/
1773
static TRANSPORTDEC_ERROR configExtension(CSUsacConfig *usc,
1774
                                          HANDLE_FDK_BITSTREAM hBs,
1775
21.4k
                                          const CSTpCallBacks *cb) {
1776
21.4k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1777
1778
21.4k
  int numConfigExtensions;
1779
21.4k
  UINT usacConfigExtType;
1780
21.4k
  int usacConfigExtLength;
1781
21.4k
  int loudnessInfoSetIndex =
1782
21.4k
      -1; /* index of loudnessInfoSet config extension. -1 if not contained. */
1783
21.4k
  int tmp_subStreamIndex = 0;
1784
21.4k
  AUDIO_OBJECT_TYPE tmp_aot = AOT_USAC;
1785
1786
21.4k
  numConfigExtensions = (int)escapedValue(hBs, 2, 4, 8) + 1;
1787
118k
  for (int confExtIdx = 0; confExtIdx < numConfigExtensions; confExtIdx++) {
1788
104k
    INT nbits;
1789
104k
    int loudnessInfoSetConfigExtensionPosition = FDKgetValidBits(hBs);
1790
104k
    usacConfigExtType = escapedValue(hBs, 4, 8, 16);
1791
104k
    usacConfigExtLength = (int)escapedValue(hBs, 4, 8, 16);
1792
1793
    /* Start bit position of config extension */
1794
104k
    nbits = (INT)FDKgetValidBits(hBs);
1795
1796
    /* Return an error in case the bitbuffer fill level is too low. */
1797
104k
    if (nbits < usacConfigExtLength * 8) {
1798
2.94k
      return TRANSPORTDEC_PARSE_ERROR;
1799
2.94k
    }
1800
1801
101k
    switch (usacConfigExtType) {
1802
28.4k
      case ID_CONFIG_EXT_FILL:
1803
31.7k
        for (int i = 0; i < usacConfigExtLength; i++) {
1804
4.53k
          if (FDKreadBits(hBs, 8) != 0xa5) {
1805
1.24k
            return TRANSPORTDEC_PARSE_ERROR;
1806
1.24k
          }
1807
4.53k
        }
1808
27.2k
        break;
1809
27.2k
      case ID_CONFIG_EXT_LOUDNESS_INFO: {
1810
23.9k
        if (cb->cbUniDrc != NULL) {
1811
23.9k
          ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1812
23.9k
              cb->cbUniDrcData, hBs, usacConfigExtLength,
1813
23.9k
              1, /* loudnessInfoSet */
1814
23.9k
              tmp_subStreamIndex, loudnessInfoSetConfigExtensionPosition,
1815
23.9k
              tmp_aot);
1816
23.9k
          if (ErrorStatus != TRANSPORTDEC_OK) {
1817
0
            return ErrorStatus;
1818
0
          }
1819
23.9k
          loudnessInfoSetIndex = confExtIdx;
1820
23.9k
        }
1821
23.9k
      } break;
1822
49.0k
      default:
1823
49.0k
        break;
1824
101k
    }
1825
1826
    /* Skip remaining bits. If too many bits were parsed, assume error. */
1827
100k
    usacConfigExtLength =
1828
100k
        8 * usacConfigExtLength - (nbits - (INT)FDKgetValidBits(hBs));
1829
100k
    if (usacConfigExtLength < 0) {
1830
3.34k
      return TRANSPORTDEC_PARSE_ERROR;
1831
3.34k
    }
1832
96.9k
    FDKpushFor(hBs, usacConfigExtLength);
1833
96.9k
  }
1834
1835
13.8k
  if (loudnessInfoSetIndex == -1 && cb->cbUniDrc != NULL) {
1836
    /* no loudnessInfoSet contained. Clear the loudnessInfoSet struct by feeding
1837
     * an empty config extension */
1838
2.05k
    ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1839
2.05k
        cb->cbUniDrcData, NULL, 0, 1 /* loudnessInfoSet */, tmp_subStreamIndex,
1840
2.05k
        0, tmp_aot);
1841
2.05k
    if (ErrorStatus != TRANSPORTDEC_OK) {
1842
0
      return ErrorStatus;
1843
0
    }
1844
2.05k
  }
1845
1846
13.8k
  return ErrorStatus;
1847
13.8k
}
1848
1849
/* This function unifies decoder config parsing of USAC and RSV60:
1850
   rsv603daDecoderConfig() ISO/IEC DIS 23008-3   Table 8
1851
   UsacDecoderConfig()     ISO/IEC FDIS 23003-3  Table 6
1852
  */
1853
static TRANSPORTDEC_ERROR UsacRsv60DecoderConfig_Parse(
1854
    CSAudioSpecificConfig *asc, HANDLE_FDK_BITSTREAM hBs,
1855
259k
    const CSTpCallBacks *cb) {
1856
259k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1857
259k
  CSUsacConfig *usc = &asc->m_sc.m_usacConfig;
1858
259k
  int i, numberOfElements;
1859
259k
  int channelElementIdx =
1860
259k
      0; /* index for elements which contain audio channels (sce, cpe, lfe) */
1861
259k
  SC_CHANNEL_CONFIG sc_chan_config = {0, 0, 0, 0};
1862
259k
  int uniDrcElement =
1863
259k
      -1; /* index of uniDrc extension element. -1 if not contained. */
1864
1865
259k
  numberOfElements = (int)escapedValue(hBs, 4, 8, 16) + 1;
1866
259k
  usc->m_usacNumElements = numberOfElements;
1867
259k
  if (numberOfElements > TP_USAC_MAX_ELEMENTS) {
1868
316
    return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1869
316
  }
1870
258k
  usc->m_nUsacChannels = 0;
1871
258k
  usc->m_channelConfigurationIndex = asc->m_channelConfiguration;
1872
1873
258k
  if (asc->m_aot == AOT_USAC) {
1874
258k
    sc_chan_config = sc_chan_config_tab[usc->m_channelConfigurationIndex];
1875
1876
258k
    if (sc_chan_config.nCh > (SCHAR)TP_USAC_MAX_SPEAKERS) {
1877
0
      return TRANSPORTDEC_PARSE_ERROR;
1878
0
    }
1879
258k
  }
1880
1881
773k
  for (i = 0; i < numberOfElements; i++) {
1882
527k
    MP4_ELEMENT_ID usacElementType = (MP4_ELEMENT_ID)(
1883
527k
        FDKreadBits(hBs, 2) | USAC_ID_BIT); /* set USAC_ID_BIT to map
1884
                                               usacElementType to
1885
                                               MP4_ELEMENT_ID enum */
1886
527k
    usc->element[i].usacElementType = usacElementType;
1887
1888
    /* sanity check: update element counter */
1889
527k
    if (asc->m_aot == AOT_USAC) {
1890
527k
      switch (usacElementType) {
1891
59.6k
        case ID_USAC_SCE:
1892
59.6k
          sc_chan_config.nSCE--;
1893
59.6k
          break;
1894
192k
        case ID_USAC_CPE:
1895
192k
          sc_chan_config.nCPE--;
1896
192k
          break;
1897
1.16k
        case ID_USAC_LFE:
1898
1.16k
          sc_chan_config.nLFE--;
1899
1.16k
          break;
1900
273k
        default:
1901
273k
          break;
1902
527k
      }
1903
527k
      if (usc->m_channelConfigurationIndex) {
1904
        /* sanity check: no element counter may be smaller zero */
1905
527k
        if (sc_chan_config.nCPE < 0 || sc_chan_config.nSCE < 0 ||
1906
523k
            sc_chan_config.nLFE < 0) {
1907
4.62k
          return TRANSPORTDEC_PARSE_ERROR;
1908
4.62k
        }
1909
527k
      }
1910
527k
    }
1911
1912
522k
    switch (usacElementType) {
1913
57.8k
      case ID_USAC_SCE:
1914
        /* UsacCoreConfig() ISO/IEC FDIS 23003-3  Table 10 */
1915
57.8k
        if (FDKreadBit(hBs)) { /* tw_mdct */
1916
323
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1917
323
        }
1918
57.5k
        usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1);
1919
        /* end of UsacCoreConfig() */
1920
57.5k
        if (usc->m_sbrRatioIndex > 0) {
1921
28.2k
          if (cb->cbSbr == NULL) {
1922
0
            return TRANSPORTDEC_UNKOWN_ERROR;
1923
0
          }
1924
          /* SbrConfig() ISO/IEC FDIS 23003-3  Table 11 */
1925
28.2k
          usc->element[i].m_harmonicSBR = FDKreadBit(hBs);
1926
28.2k
          usc->element[i].m_interTes = FDKreadBit(hBs);
1927
28.2k
          usc->element[i].m_pvc = FDKreadBit(hBs);
1928
28.2k
          if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
1929
28.2k
                        asc->m_extensionSamplingFrequency,
1930
28.2k
                        asc->m_samplesPerFrame, asc->m_aot, ID_SCE,
1931
28.2k
                        channelElementIdx, usc->element[i].m_harmonicSBR,
1932
28.2k
                        usc->element[i].m_stereoConfigIndex, asc->configMode,
1933
28.2k
                        &asc->SbrConfigChanged, 1)) {
1934
408
            return TRANSPORTDEC_PARSE_ERROR;
1935
408
          }
1936
          /* end of SbrConfig() */
1937
28.2k
        }
1938
57.0k
        usc->m_nUsacChannels += 1;
1939
57.0k
        channelElementIdx++;
1940
57.0k
        break;
1941
1942
190k
      case ID_USAC_CPE:
1943
        /* UsacCoreConfig() ISO/IEC FDIS 23003-3  Table 10 */
1944
190k
        if (FDKreadBit(hBs)) { /* tw_mdct */
1945
273
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1946
273
        }
1947
190k
        usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1);
1948
        /* end of UsacCoreConfig() */
1949
190k
        if (usc->m_sbrRatioIndex > 0) {
1950
171k
          if (cb->cbSbr == NULL) return TRANSPORTDEC_UNKOWN_ERROR;
1951
          /* SbrConfig() ISO/IEC FDIS 23003-3 */
1952
171k
          usc->element[i].m_harmonicSBR = FDKreadBit(hBs);
1953
171k
          usc->element[i].m_interTes = FDKreadBit(hBs);
1954
171k
          usc->element[i].m_pvc = FDKreadBit(hBs);
1955
171k
          {
1956
171k
            INT bitsToSkip = skipSbrHeader(hBs, 1);
1957
            /* read stereoConfigIndex */
1958
171k
            usc->element[i].m_stereoConfigIndex = FDKreadBits(hBs, 2);
1959
            /* rewind */
1960
171k
            FDKpushBack(hBs, bitsToSkip + 2);
1961
171k
          }
1962
171k
          {
1963
171k
            MP4_ELEMENT_ID el_type =
1964
171k
                (usc->element[i].m_stereoConfigIndex == 1 ||
1965
111k
                 usc->element[i].m_stereoConfigIndex == 2)
1966
171k
                    ? ID_SCE
1967
171k
                    : ID_CPE;
1968
171k
            if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
1969
171k
                          asc->m_extensionSamplingFrequency,
1970
171k
                          asc->m_samplesPerFrame, asc->m_aot, el_type,
1971
171k
                          channelElementIdx, usc->element[i].m_harmonicSBR,
1972
171k
                          usc->element[i].m_stereoConfigIndex, asc->configMode,
1973
171k
                          &asc->SbrConfigChanged, 1)) {
1974
819
              return TRANSPORTDEC_PARSE_ERROR;
1975
819
            }
1976
171k
          }
1977
          /* end of SbrConfig() */
1978
1979
170k
          usc->element[i].m_stereoConfigIndex =
1980
170k
              FDKreadBits(hBs, 2); /* Needed in RM5 syntax */
1981
1982
170k
          if (usc->element[i].m_stereoConfigIndex > 0) {
1983
114k
            if (cb->cbSsc != NULL) {
1984
114k
              int samplesPerFrame = asc->m_samplesPerFrame;
1985
1986
114k
              if (usc->m_sbrRatioIndex == 1) samplesPerFrame <<= 2;
1987
114k
              if (usc->m_sbrRatioIndex == 2)
1988
26.6k
                samplesPerFrame = (samplesPerFrame * 8) / 3;
1989
114k
              if (usc->m_sbrRatioIndex == 3) samplesPerFrame <<= 1;
1990
1991
              /* Mps212Config() ISO/IEC FDIS 23003-3 */
1992
114k
              if (cb->cbSsc(cb->cbSscData, hBs, asc->m_aot,
1993
114k
                            asc->m_extensionSamplingFrequency, samplesPerFrame,
1994
114k
                            1, /* only downmix channels (residual channels are
1995
                                  not counted) */
1996
114k
                            usc->element[i].m_stereoConfigIndex,
1997
114k
                            usc->m_coreSbrFrameLengthIndex,
1998
114k
                            0, /* don't know the length */
1999
114k
                            asc->configMode, &asc->SacConfigChanged)) {
2000
1.71k
                return TRANSPORTDEC_PARSE_ERROR;
2001
1.71k
              }
2002
              /* end of Mps212Config() */
2003
114k
            } else {
2004
0
              return TRANSPORTDEC_UNKOWN_ERROR;
2005
0
            }
2006
114k
          }
2007
170k
        } else {
2008
18.9k
          usc->element[i].m_stereoConfigIndex = 0;
2009
18.9k
        }
2010
188k
        usc->m_nUsacChannels += 2;
2011
2012
188k
        channelElementIdx++;
2013
188k
        break;
2014
2015
0
      case ID_USAC_LFE:
2016
0
        usc->element[i].m_noiseFilling = 0;
2017
0
        usc->m_nUsacChannels += 1;
2018
0
        if (usc->m_sbrRatioIndex > 0) {
2019
          /* Use SBR for upsampling */
2020
0
          if (cb->cbSbr == NULL) return ErrorStatus = TRANSPORTDEC_UNKOWN_ERROR;
2021
0
          usc->element[i].m_harmonicSBR = (UCHAR)0;
2022
0
          usc->element[i].m_interTes = (UCHAR)0;
2023
0
          usc->element[i].m_pvc = (UCHAR)0;
2024
0
          if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
2025
0
                        asc->m_extensionSamplingFrequency,
2026
0
                        asc->m_samplesPerFrame, asc->m_aot, ID_LFE,
2027
0
                        channelElementIdx, usc->element[i].m_harmonicSBR,
2028
0
                        usc->element[i].m_stereoConfigIndex, asc->configMode,
2029
0
                        &asc->SbrConfigChanged, 1)) {
2030
0
            return ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2031
0
          }
2032
0
        }
2033
0
        channelElementIdx++;
2034
0
        break;
2035
2036
273k
      case ID_USAC_EXT:
2037
273k
        ErrorStatus = extElementConfig(&usc->element[i].extElement, hBs, cb, 0,
2038
273k
                                       asc->m_samplesPerFrame, 0, asc->m_aot);
2039
273k
        if (usc->element[i].extElement.usacExtElementType ==
2040
273k
            ID_EXT_ELE_UNI_DRC) {
2041
137k
          uniDrcElement = i;
2042
137k
        }
2043
2044
273k
        if (ErrorStatus) {
2045
4.15k
          return ErrorStatus;
2046
4.15k
        }
2047
269k
        break;
2048
2049
269k
      default:
2050
        /* non USAC-element encountered */
2051
0
        return TRANSPORTDEC_PARSE_ERROR;
2052
522k
    }
2053
522k
  }
2054
2055
246k
  if (asc->m_aot == AOT_USAC) {
2056
246k
    if (usc->m_channelConfigurationIndex) {
2057
      /* sanity check: all element counter must be zero */
2058
246k
      if (sc_chan_config.nCPE | sc_chan_config.nSCE | sc_chan_config.nLFE) {
2059
4.00k
        return TRANSPORTDEC_PARSE_ERROR;
2060
4.00k
      }
2061
246k
    } else {
2062
      /* sanity check: number of audio channels shall be equal to or smaller
2063
       * than the accumulated sum of all channels */
2064
0
      if ((INT)(-2 * sc_chan_config.nCPE - sc_chan_config.nSCE -
2065
0
                sc_chan_config.nLFE) < (INT)usc->numAudioChannels) {
2066
0
        return TRANSPORTDEC_PARSE_ERROR;
2067
0
      }
2068
0
    }
2069
246k
  }
2070
2071
242k
  if (uniDrcElement == -1 && cb->cbUniDrc != NULL) {
2072
    /* no uniDrcConfig contained. Clear the uniDrcConfig struct by feeding an
2073
     * empty extension element */
2074
237k
    int subStreamIndex = 0;
2075
237k
    ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
2076
237k
        cb->cbUniDrcData, NULL, 0, 0 /* uniDrcConfig */, subStreamIndex, 0,
2077
237k
        asc->m_aot);
2078
237k
    if (ErrorStatus != TRANSPORTDEC_OK) {
2079
0
      return ErrorStatus;
2080
0
    }
2081
237k
  }
2082
2083
242k
  return ErrorStatus;
2084
242k
}
2085
2086
/* Mapping of coreSbrFrameLengthIndex defined by Table 70 in ISO/IEC 23003-3 */
2087
static TRANSPORTDEC_ERROR UsacConfig_SetCoreSbrFrameLengthIndex(
2088
261k
    CSAudioSpecificConfig *asc, int coreSbrFrameLengthIndex) {
2089
261k
  int sbrRatioIndex_val;
2090
2091
261k
  if (coreSbrFrameLengthIndex > 4) {
2092
834
    return TRANSPORTDEC_PARSE_ERROR; /* reserved values */
2093
834
  }
2094
261k
  asc->m_sc.m_usacConfig.m_coreSbrFrameLengthIndex = coreSbrFrameLengthIndex;
2095
261k
  asc->m_samplesPerFrame = usacFrameLength[coreSbrFrameLengthIndex];
2096
261k
  sbrRatioIndex_val = sbrRatioIndex[coreSbrFrameLengthIndex];
2097
261k
  asc->m_sc.m_usacConfig.m_sbrRatioIndex = sbrRatioIndex_val;
2098
2099
261k
  if (sbrRatioIndex_val > 0) {
2100
203k
    asc->m_sbrPresentFlag = 1;
2101
203k
    asc->m_extensionSamplingFrequency = asc->m_samplingFrequency;
2102
203k
    asc->m_extensionSamplingFrequencyIndex = asc->m_samplingFrequencyIndex;
2103
203k
    switch (sbrRatioIndex_val) {
2104
24.3k
      case 1: /* sbrRatio = 4:1 */
2105
24.3k
        asc->m_samplingFrequency >>= 2;
2106
24.3k
        asc->m_samplesPerFrame >>= 2;
2107
24.3k
        break;
2108
70.7k
      case 2: /* sbrRatio = 8:3 */
2109
70.7k
        asc->m_samplingFrequency = (asc->m_samplingFrequency * 3) / 8;
2110
70.7k
        asc->m_samplesPerFrame = (asc->m_samplesPerFrame * 3) / 8;
2111
70.7k
        break;
2112
108k
      case 3: /* sbrRatio = 2:1 */
2113
108k
        asc->m_samplingFrequency >>= 1;
2114
108k
        asc->m_samplesPerFrame >>= 1;
2115
108k
        break;
2116
0
      default:
2117
0
        return TRANSPORTDEC_PARSE_ERROR;
2118
203k
    }
2119
203k
    asc->m_samplingFrequencyIndex =
2120
203k
        getSamplingRateIndex(asc->m_samplingFrequency, 4);
2121
203k
  }
2122
2123
261k
  return TRANSPORTDEC_OK;
2124
261k
}
2125
2126
static TRANSPORTDEC_ERROR UsacConfig_Parse(CSAudioSpecificConfig *asc,
2127
                                           HANDLE_FDK_BITSTREAM hBs,
2128
263k
                                           CSTpCallBacks *cb) {
2129
263k
  int usacSamplingFrequency, channelConfigurationIndex, coreSbrFrameLengthIndex;
2130
263k
  TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK;
2131
2132
  /* Start bit position of usacConfig */
2133
263k
  INT nbits = (INT)FDKgetValidBits(hBs);
2134
2135
263k
  usacSamplingFrequency = getSampleRate(hBs, &asc->m_samplingFrequencyIndex, 5);
2136
263k
  if (usacSamplingFrequency == 0 || usacSamplingFrequency > 96000) {
2137
1.17k
    return TRANSPORTDEC_PARSE_ERROR;
2138
1.17k
  }
2139
261k
  asc->m_samplingFrequency = (UINT)usacSamplingFrequency;
2140
2141
261k
  coreSbrFrameLengthIndex = FDKreadBits(hBs, 3);
2142
261k
  if (UsacConfig_SetCoreSbrFrameLengthIndex(asc, coreSbrFrameLengthIndex) !=
2143
261k
      TRANSPORTDEC_OK) {
2144
834
    return TRANSPORTDEC_PARSE_ERROR;
2145
834
  }
2146
2147
261k
  channelConfigurationIndex = FDKreadBits(hBs, 5);
2148
261k
  if (channelConfigurationIndex > 2) {
2149
1.43k
    return TRANSPORTDEC_PARSE_ERROR; /* only channelConfigurationIndex = [1,2]
2150
                                        are supported */
2151
1.43k
  }
2152
2153
259k
  if (channelConfigurationIndex == 0) {
2154
665
    return TRANSPORTDEC_PARSE_ERROR; /* only channelConfigurationIndex = [1,2]
2155
                                        are supported */
2156
665
  }
2157
259k
  asc->m_channelConfiguration = channelConfigurationIndex;
2158
2159
259k
  err = UsacRsv60DecoderConfig_Parse(asc, hBs, cb);
2160
259k
  if (err != TRANSPORTDEC_OK) {
2161
16.6k
    return err;
2162
16.6k
  }
2163
2164
242k
  if (FDKreadBits(hBs, 1)) { /* usacConfigExtensionPresent */
2165
21.4k
    err = configExtension(&asc->m_sc.m_usacConfig, hBs, cb);
2166
21.4k
    if (err != TRANSPORTDEC_OK) {
2167
7.53k
      return err;
2168
7.53k
    }
2169
220k
  } else if (cb->cbUniDrc != NULL) {
2170
    /* no loudnessInfoSet contained. Clear the loudnessInfoSet struct by feeding
2171
     * an empty config extension */
2172
220k
    err = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
2173
220k
        cb->cbUniDrcData, NULL, 0, 1 /* loudnessInfoSet */, 0, 0, asc->m_aot);
2174
220k
    if (err != TRANSPORTDEC_OK) {
2175
0
      return err;
2176
0
    }
2177
220k
  }
2178
2179
  /* sanity check whether number of channels signaled in UsacDecoderConfig()
2180
     matches the number of channels required by channelConfigurationIndex */
2181
234k
  if ((channelConfigurationIndex > 0) &&
2182
234k
      (sc_chan_config_tab[channelConfigurationIndex].nCh !=
2183
234k
       asc->m_sc.m_usacConfig.m_nUsacChannels)) {
2184
0
    return TRANSPORTDEC_PARSE_ERROR;
2185
0
  }
2186
2187
  /* Copy UsacConfig() to asc->m_sc.m_usacConfig.UsacConfig[] buffer. */
2188
234k
  INT configSize_bits = (INT)FDKgetValidBits(hBs) - nbits;
2189
234k
  if (StoreConfigAsBitstream(hBs, configSize_bits,
2190
234k
                             asc->m_sc.m_usacConfig.UsacConfig,
2191
234k
                             TP_USAC_MAX_CONFIG_LEN)) {
2192
258
    return TRANSPORTDEC_PARSE_ERROR;
2193
258
  }
2194
234k
  asc->m_sc.m_usacConfig.UsacConfigBits = fAbs(configSize_bits);
2195
2196
234k
  return err;
2197
234k
}
2198
2199
static TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse(
2200
6.61k
    CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, CSTpCallBacks *cb) {
2201
6.61k
  TP_ASC_EXTENSION_ID lastAscExt, ascExtId = ASCEXT_UNKOWN;
2202
6.61k
  INT bitsAvailable = (INT)FDKgetValidBits(bs);
2203
2204
16.1k
  while (bitsAvailable >= 11) {
2205
12.2k
    lastAscExt = ascExtId;
2206
12.2k
    ascExtId = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11);
2207
12.2k
    bitsAvailable -= 11;
2208
2209
12.2k
    switch (ascExtId) {
2210
3.49k
      case ASCEXT_SBR: /* 0x2b7 */
2211
3.49k
        if ((self->m_extensionAudioObjectType != AOT_SBR) &&
2212
3.18k
            (bitsAvailable >= 5)) {
2213
2.91k
          self->m_extensionAudioObjectType = getAOT(bs);
2214
2215
2.91k
          if ((self->m_extensionAudioObjectType == AOT_SBR) ||
2216
2.16k
              (self->m_extensionAudioObjectType ==
2217
2.16k
               AOT_ER_BSAC)) { /* Get SBR extension configuration */
2218
1.88k
            self->m_sbrPresentFlag = FDKreadBits(bs, 1);
2219
1.88k
            if (self->m_aot == AOT_USAC && self->m_sbrPresentFlag > 0 &&
2220
0
                self->m_sc.m_usacConfig.m_sbrRatioIndex == 0) {
2221
0
              return TRANSPORTDEC_PARSE_ERROR;
2222
0
            }
2223
2224
1.88k
            if (self->m_sbrPresentFlag == 1) {
2225
806
              self->m_extensionSamplingFrequency = getSampleRate(
2226
806
                  bs, &self->m_extensionSamplingFrequencyIndex, 4);
2227
2228
806
              if (self->m_extensionSamplingFrequency == 0 ||
2229
613
                  self->m_extensionSamplingFrequency > 96000) {
2230
206
                return TRANSPORTDEC_PARSE_ERROR;
2231
206
              }
2232
806
            }
2233
1.67k
            if (self->m_extensionAudioObjectType == AOT_ER_BSAC) {
2234
935
              self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
2235
935
            }
2236
1.67k
          }
2237
          /* Update counter because of variable length fields (AOT and sampling
2238
           * rate) */
2239
2.71k
          bitsAvailable = (INT)FDKgetValidBits(bs);
2240
2.71k
        }
2241
3.28k
        break;
2242
3.28k
      case ASCEXT_PS: /* 0x548 */
2243
1.33k
        if ((lastAscExt == ASCEXT_SBR) &&
2244
1.11k
            (self->m_extensionAudioObjectType == AOT_SBR) &&
2245
395
            (bitsAvailable > 0)) { /* Get PS extension configuration */
2246
195
          self->m_psPresentFlag = FDKreadBits(bs, 1);
2247
195
          bitsAvailable -= 1;
2248
195
        }
2249
1.33k
        break;
2250
399
      case ASCEXT_MPS: /* 0x76a */
2251
399
        if (self->m_extensionAudioObjectType == AOT_MPEGS) break;
2252
205
        FDK_FALLTHROUGH;
2253
1.90k
      case ASCEXT_LDMPS: /* 0x7cc */
2254
1.90k
        if ((ascExtId == ASCEXT_LDMPS) &&
2255
1.69k
            (self->m_extensionAudioObjectType == AOT_LD_MPEGS))
2256
194
          break;
2257
1.71k
        if (bitsAvailable >= 1) {
2258
1.51k
          bitsAvailable -= 1;
2259
1.51k
          if (FDKreadBits(bs, 1)) { /* self->m_mpsPresentFlag */
2260
979
            int sscLen = FDKreadBits(bs, 8);
2261
979
            bitsAvailable -= 8;
2262
979
            if (sscLen == 0xFF) {
2263
397
              sscLen += FDKreadBits(bs, 16);
2264
397
              bitsAvailable -= 16;
2265
397
            }
2266
979
            FDKpushFor(bs, sscLen); /* Skip SSC to be able to read the next
2267
                                       extension if there is one. */
2268
2269
979
            bitsAvailable -= sscLen * 8;
2270
979
          }
2271
1.51k
        }
2272
1.71k
        break;
2273
2.78k
      case ASCEXT_SAOC:
2274
2.78k
        if ((ascExtId == ASCEXT_SAOC) &&
2275
2.78k
            (self->m_extensionAudioObjectType == AOT_SAOC))
2276
217
          break;
2277
2.56k
        if (FDKreadBits(bs, 1)) { /* saocPresent */
2278
2.06k
          int saocscLen = FDKreadBits(bs, 8);
2279
2.06k
          bitsAvailable -= 8;
2280
2.06k
          if (saocscLen == 0xFF) {
2281
579
            saocscLen += FDKreadBits(bs, 16);
2282
579
            bitsAvailable -= 16;
2283
579
          }
2284
2.06k
          FDKpushFor(bs, saocscLen);
2285
2.06k
          bitsAvailable -= saocscLen * 8;
2286
2.06k
        }
2287
2.56k
        break;
2288
2.50k
      default:
2289
        /* Just ignore anything. */
2290
2.50k
        return TRANSPORTDEC_OK;
2291
12.2k
    }
2292
12.2k
  }
2293
2294
3.89k
  return TRANSPORTDEC_OK;
2295
6.61k
}
2296
2297
/*
2298
 * API Functions
2299
 */
2300
2301
735k
void AudioSpecificConfig_Init(CSAudioSpecificConfig *asc) {
2302
735k
  FDKmemclear(asc, sizeof(CSAudioSpecificConfig));
2303
2304
  /* Init all values that should not be zero. */
2305
735k
  asc->m_aot = AOT_NONE;
2306
735k
  asc->m_samplingFrequencyIndex = 0xf;
2307
735k
  asc->m_epConfig = -1;
2308
735k
  asc->m_extensionAudioObjectType = AOT_NULL_OBJECT;
2309
735k
  CProgramConfig_Init(&asc->m_progrConfigElement);
2310
735k
}
2311
2312
TRANSPORTDEC_ERROR AudioSpecificConfig_Parse(
2313
    CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs,
2314
    int fExplicitBackwardCompatible, CSTpCallBacks *cb, UCHAR configMode,
2315
735k
    UCHAR configChanged, AUDIO_OBJECT_TYPE m_aot) {
2316
735k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
2317
735k
  UINT ascStartAnchor = FDKgetValidBits(bs);
2318
735k
  int frameLengthFlag = -1;
2319
2320
735k
  AudioSpecificConfig_Init(self);
2321
2322
735k
  self->configMode = configMode;
2323
735k
  self->AacConfigChanged = configChanged;
2324
735k
  self->SbrConfigChanged = configChanged;
2325
735k
  self->SacConfigChanged = configChanged;
2326
2327
735k
  if (m_aot != AOT_NULL_OBJECT) {
2328
52
    self->m_aot = m_aot;
2329
735k
  } else {
2330
735k
    self->m_aot = getAOT(bs);
2331
735k
    self->m_samplingFrequency =
2332
735k
        getSampleRate(bs, &self->m_samplingFrequencyIndex, 4);
2333
735k
    if (self->m_samplingFrequency <= 0 ||
2334
733k
        (self->m_samplingFrequency > 96000 && self->m_aot != 39) ||
2335
732k
        self->m_samplingFrequency > 4 * 96000) {
2336
3.28k
      return TRANSPORTDEC_PARSE_ERROR;
2337
3.28k
    }
2338
2339
732k
    self->m_channelConfiguration = FDKreadBits(bs, 4);
2340
2341
    /* MPEG-04 standard ISO/IEC 14496-3: channelConfiguration == 0 is reserved
2342
       in er_raw_data_block (table 4.19) and er_raw_data_block_eld (table 4.75)
2343
       MPEG-04 conformance ISO/IEC 14496-4: channelConfiguration == 0 is not
2344
       permitted for AOT_ER_AAC_LC, AOT_ER_AAC_LTP, AOT_ER_AAC_LD,
2345
       AOT_ER_AAC_SCAL (chapter 6.6.4.1.2.1.1) */
2346
732k
    if ((self->m_channelConfiguration == 0) &&
2347
105k
        ((self->m_aot == AOT_ER_AAC_LC) || (self->m_aot == AOT_ER_AAC_LTP) ||
2348
104k
         (self->m_aot == AOT_ER_AAC_LD) || (self->m_aot == AOT_ER_AAC_SCAL) ||
2349
103k
         (self->m_aot == AOT_ER_AAC_ELD))) {
2350
2.09k
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2351
2.09k
    }
2352
    /* MPEG-04 conformance ISO/IEC 14496-4: channelConfiguration > 2 is not
2353
     * permitted for AOT_AAC_SCAL and AOT_ER_AAC_SCAL (chapter 6.6.4.1.2.1.1) */
2354
730k
    if ((self->m_channelConfiguration > 2) &&
2355
303k
        ((self->m_aot == AOT_AAC_SCAL) || (self->m_aot == AOT_ER_AAC_SCAL))) {
2356
647
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2357
647
    }
2358
2359
    /* SBR extension ( explicit non-backwards compatible mode ) */
2360
729k
    self->m_sbrPresentFlag = 0;
2361
729k
    self->m_psPresentFlag = 0;
2362
2363
729k
    if (self->m_aot == AOT_SBR || self->m_aot == AOT_PS) {
2364
4.47k
      self->m_extensionAudioObjectType = AOT_SBR;
2365
2366
4.47k
      self->m_sbrPresentFlag = 1;
2367
4.47k
      if (self->m_aot == AOT_PS) {
2368
2.51k
        self->m_psPresentFlag = 1;
2369
2.51k
      }
2370
2371
4.47k
      self->m_extensionSamplingFrequency =
2372
4.47k
          getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
2373
4.47k
      if (self->m_extensionSamplingFrequency == 0 ||
2374
4.09k
          self->m_extensionSamplingFrequency > 96000) {
2375
606
        return TRANSPORTDEC_PARSE_ERROR;
2376
606
      }
2377
3.86k
      self->m_aot = getAOT(bs);
2378
2379
3.86k
      switch (self->m_aot) {
2380
2.56k
        case AOT_AAC_LC:
2381
2.56k
          break;
2382
692
        case AOT_ER_BSAC:
2383
692
          break;
2384
612
        default:
2385
612
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2386
3.86k
      }
2387
2388
3.25k
      if (self->m_aot == AOT_ER_BSAC) {
2389
692
        self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
2390
692
      }
2391
724k
    } else {
2392
724k
      self->m_extensionAudioObjectType = AOT_NULL_OBJECT;
2393
724k
    }
2394
729k
  }
2395
2396
  /* Parse whatever specific configs */
2397
728k
  switch (self->m_aot) {
2398
160k
    case AOT_AAC_LC:
2399
162k
    case AOT_AAC_SCAL:
2400
163k
    case AOT_ER_AAC_LC:
2401
172k
    case AOT_ER_AAC_LD:
2402
237k
    case AOT_ER_AAC_SCAL:
2403
239k
    case AOT_ER_BSAC:
2404
239k
      if ((ErrorStatus = GaSpecificConfig_Parse(&self->m_sc.m_gaSpecificConfig,
2405
239k
                                                self, bs, ascStartAnchor)) !=
2406
239k
          TRANSPORTDEC_OK) {
2407
0
        return (ErrorStatus);
2408
0
      }
2409
239k
      frameLengthFlag = self->m_sc.m_gaSpecificConfig.m_frameLengthFlag;
2410
239k
      break;
2411
239
    case AOT_MPEGS:
2412
239
      if (cb->cbSsc != NULL) {
2413
239
        if (cb->cbSsc(cb->cbSscData, bs, self->m_aot, self->m_samplingFrequency,
2414
239
                      self->m_samplesPerFrame, self->m_channelConfiguration, 1,
2415
239
                      -1, /* nTimeSlots: read from bitstream */
2416
239
                      0,  /* don't know the length */
2417
239
                      self->configMode, &self->SacConfigChanged)) {
2418
239
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2419
239
        }
2420
239
      } else {
2421
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2422
0
      }
2423
0
      break;
2424
213k
    case AOT_ER_AAC_ELD:
2425
213k
      if ((ErrorStatus = EldSpecificConfig_Parse(self, bs, cb)) !=
2426
213k
          TRANSPORTDEC_OK) {
2427
30.8k
        return (ErrorStatus);
2428
30.8k
      }
2429
182k
      frameLengthFlag = self->m_sc.m_eldSpecificConfig.m_frameLengthFlag;
2430
182k
      self->m_sbrPresentFlag = self->m_sc.m_eldSpecificConfig.m_sbrPresentFlag;
2431
182k
      self->m_extensionSamplingFrequency =
2432
182k
          (self->m_sc.m_eldSpecificConfig.m_sbrSamplingRate + 1) *
2433
182k
          self->m_samplingFrequency;
2434
182k
      break;
2435
263k
    case AOT_USAC:
2436
263k
      if ((ErrorStatus = UsacConfig_Parse(self, bs, cb)) != TRANSPORTDEC_OK) {
2437
28.5k
        return (ErrorStatus);
2438
28.5k
      }
2439
234k
      break;
2440
2441
234k
    default:
2442
11.7k
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2443
728k
  }
2444
2445
  /* Frame length */
2446
656k
  switch (self->m_aot) {
2447
160k
    case AOT_AAC_LC:
2448
162k
    case AOT_AAC_SCAL:
2449
163k
    case AOT_ER_AAC_LC:
2450
227k
    case AOT_ER_AAC_SCAL:
2451
229k
    case AOT_ER_BSAC:
2452
      /*case AOT_USAC:*/
2453
229k
      if (!frameLengthFlag)
2454
104k
        self->m_samplesPerFrame = 1024;
2455
125k
      else
2456
125k
        self->m_samplesPerFrame = 960;
2457
229k
      break;
2458
9.55k
    case AOT_ER_AAC_LD:
2459
9.55k
      if (!frameLengthFlag)
2460
5.38k
        self->m_samplesPerFrame = 512;
2461
4.17k
      else
2462
4.17k
        self->m_samplesPerFrame = 480;
2463
9.55k
      break;
2464
417k
    default:
2465
417k
      break;
2466
656k
  }
2467
2468
656k
  switch (self->m_aot) {
2469
942
    case AOT_ER_AAC_LC:
2470
10.4k
    case AOT_ER_AAC_LD:
2471
193k
    case AOT_ER_AAC_ELD:
2472
257k
    case AOT_ER_AAC_SCAL:
2473
257k
    case AOT_ER_CELP:
2474
257k
    case AOT_ER_HVXC:
2475
260k
    case AOT_ER_BSAC:
2476
260k
      self->m_epConfig = FDKreadBits(bs, 2);
2477
2478
260k
      if (self->m_epConfig > 1) {
2479
1.46k
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;  // EPCONFIG;
2480
1.46k
      }
2481
258k
      break;
2482
396k
    default:
2483
396k
      break;
2484
656k
  }
2485
2486
655k
  if (fExplicitBackwardCompatible &&
2487
9.02k
      (self->m_aot == AOT_AAC_LC || self->m_aot == AOT_ER_AAC_LD ||
2488
6.61k
       self->m_aot == AOT_ER_BSAC)) {
2489
6.61k
    ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb);
2490
6.61k
  }
2491
2492
  /* Copy config() to asc->config[] buffer. */
2493
655k
  if ((ErrorStatus == TRANSPORTDEC_OK) && (self->m_aot == AOT_USAC)) {
2494
234k
    INT configSize_bits = (INT)FDKgetValidBits(bs) - (INT)ascStartAnchor;
2495
234k
    if (StoreConfigAsBitstream(bs, configSize_bits, self->config,
2496
234k
                               TP_USAC_MAX_CONFIG_LEN)) {
2497
196
      return TRANSPORTDEC_PARSE_ERROR;
2498
196
    }
2499
234k
    self->configBits = fAbs(configSize_bits);
2500
234k
  }
2501
2502
655k
  return (ErrorStatus);
2503
655k
}
2504
2505
static TRANSPORTDEC_ERROR Drm_xHEAACDecoderConfig(
2506
    CSAudioSpecificConfig *asc, HANDLE_FDK_BITSTREAM hBs, int audioMode,
2507
    CSTpCallBacks *cb /* use cb == NULL to signal config check only mode */
2508
0
) {
2509
0
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
2510
0
  CSUsacConfig *usc = &asc->m_sc.m_usacConfig;
2511
0
  int elemIdx = 0;
2512
2513
0
  usc->element[elemIdx].m_stereoConfigIndex = 0;
2514
2515
0
  usc->m_usacNumElements = 1; /* Currently all extension elements are skipped
2516
                                 -> only one SCE or CPE. */
2517
2518
0
  switch (audioMode) {
2519
0
    case 0: /* mono: ID_USAC_SCE */
2520
0
      usc->element[elemIdx].usacElementType = ID_USAC_SCE;
2521
0
      usc->m_nUsacChannels = 1;
2522
0
      usc->element[elemIdx].m_noiseFilling = FDKreadBits(hBs, 1);
2523
0
      if (usc->m_sbrRatioIndex > 0) {
2524
0
        if (cb == NULL) {
2525
0
          return ErrorStatus;
2526
0
        }
2527
0
        if (cb->cbSbr != NULL) {
2528
0
          usc->element[elemIdx].m_harmonicSBR = FDKreadBit(hBs);
2529
0
          usc->element[elemIdx].m_interTes = FDKreadBit(hBs);
2530
0
          usc->element[elemIdx].m_pvc = FDKreadBit(hBs);
2531
0
          if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
2532
0
                        asc->m_extensionSamplingFrequency,
2533
0
                        asc->m_samplesPerFrame, asc->m_aot, ID_SCE, elemIdx,
2534
0
                        usc->element[elemIdx].m_harmonicSBR,
2535
0
                        usc->element[elemIdx].m_stereoConfigIndex,
2536
0
                        asc->configMode, &asc->SbrConfigChanged, 1)) {
2537
0
            return ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2538
0
          }
2539
0
        }
2540
0
      }
2541
0
      break;
2542
0
    case 2: /* stereo: ID_USAC_CPE */
2543
0
      usc->element[elemIdx].usacElementType = ID_USAC_CPE;
2544
0
      usc->m_nUsacChannels = 2;
2545
0
      usc->element[elemIdx].m_noiseFilling = FDKreadBits(hBs, 1);
2546
0
      if (usc->m_sbrRatioIndex > 0) {
2547
0
        usc->element[elemIdx].m_harmonicSBR = FDKreadBit(hBs);
2548
0
        usc->element[elemIdx].m_interTes = FDKreadBit(hBs);
2549
0
        usc->element[elemIdx].m_pvc = FDKreadBit(hBs);
2550
0
        {
2551
0
          INT bitsToSkip = skipSbrHeader(hBs, 1);
2552
          /* read stereoConfigIndex */
2553
0
          usc->element[elemIdx].m_stereoConfigIndex = FDKreadBits(hBs, 2);
2554
          /* rewind */
2555
0
          FDKpushBack(hBs, bitsToSkip + 2);
2556
0
        }
2557
        /*
2558
        The application of the following tools is mutually exclusive per audio
2559
        stream configuration (see clause 5.3.2, xHE-AAC codec configuration):
2560
        - MPS212 parametric stereo tool with residual coding
2561
        (stereoConfigIndex>1); and
2562
        - QMF based Harmonic Transposer (harmonicSBR==1).
2563
        */
2564
0
        if ((usc->element[elemIdx].m_stereoConfigIndex > 1) &&
2565
0
            usc->element[elemIdx].m_harmonicSBR) {
2566
0
          return ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2567
0
        }
2568
        /*
2569
        The 4:1 sbrRatio (sbrRatioIndex==1 in [11]) may only be employed:
2570
        - in mono operation; or
2571
        - in stereo operation if parametric stereo (MPS212) without residual
2572
        coding is applied, i.e. if stereoConfigIndex==1 (see clause 5.3.2,
2573
        xHE-AAC codec configuration).
2574
        */
2575
0
        if ((usc->m_sbrRatioIndex == 1) &&
2576
0
            (usc->element[elemIdx].m_stereoConfigIndex != 1)) {
2577
0
          return ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2578
0
        }
2579
0
        if (cb == NULL) {
2580
0
          return ErrorStatus;
2581
0
        }
2582
0
        {
2583
0
          MP4_ELEMENT_ID el_type =
2584
0
              (usc->element[elemIdx].m_stereoConfigIndex == 1 ||
2585
0
               usc->element[elemIdx].m_stereoConfigIndex == 2)
2586
0
                  ? ID_SCE
2587
0
                  : ID_CPE;
2588
0
          if (cb->cbSbr == NULL) return ErrorStatus = TRANSPORTDEC_UNKOWN_ERROR;
2589
0
          if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
2590
0
                        asc->m_extensionSamplingFrequency,
2591
0
                        asc->m_samplesPerFrame, asc->m_aot, el_type, elemIdx,
2592
0
                        usc->element[elemIdx].m_harmonicSBR,
2593
0
                        usc->element[elemIdx].m_stereoConfigIndex,
2594
0
                        asc->configMode, &asc->SbrConfigChanged, 1)) {
2595
0
            return ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2596
0
          }
2597
0
        }
2598
0
        /*usc->element[elemIdx].m_stereoConfigIndex =*/FDKreadBits(hBs, 2);
2599
0
        if (usc->element[elemIdx].m_stereoConfigIndex > 0) {
2600
0
          if (cb->cbSsc != NULL) {
2601
0
            int samplesPerFrame = asc->m_samplesPerFrame;
2602
2603
0
            if (usc->m_sbrRatioIndex == 1) samplesPerFrame <<= 2;
2604
0
            if (usc->m_sbrRatioIndex == 2)
2605
0
              samplesPerFrame = (samplesPerFrame * 8) / 3;
2606
0
            if (usc->m_sbrRatioIndex == 3) samplesPerFrame <<= 1;
2607
2608
0
            ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc(
2609
0
                cb->cbSscData, hBs,
2610
0
                AOT_DRM_USAC, /* syntax differs from MPEG Mps212Config() */
2611
0
                asc->m_extensionSamplingFrequency, samplesPerFrame,
2612
0
                1, /* only downmix channels (residual channels are not
2613
                      counted) */
2614
0
                usc->element[elemIdx].m_stereoConfigIndex,
2615
0
                usc->m_coreSbrFrameLengthIndex, 0, /* don't know the length */
2616
0
                asc->configMode, &asc->SacConfigChanged);
2617
0
          } else {
2618
            /* ErrorStatus = TRANSPORTDEC_UNSUPPORTED_FORMAT; */
2619
0
          }
2620
0
        }
2621
0
      }
2622
0
      break;
2623
0
    default:
2624
0
      return TRANSPORTDEC_PARSE_ERROR;
2625
0
  }
2626
2627
0
  return ErrorStatus;
2628
0
}
2629
2630
TRANSPORTDEC_ERROR Drm_xHEAACStaticConfig(
2631
    CSAudioSpecificConfig *asc, HANDLE_FDK_BITSTREAM bs, int audioMode,
2632
    CSTpCallBacks *cb /* use cb == NULL to signal config check only mode */
2633
0
) {
2634
0
  int coreSbrFrameLengthIndexDrm = FDKreadBits(bs, 2);
2635
0
  if (UsacConfig_SetCoreSbrFrameLengthIndex(
2636
0
          asc, coreSbrFrameLengthIndexDrm + 1) != TRANSPORTDEC_OK) {
2637
0
    return TRANSPORTDEC_PARSE_ERROR;
2638
0
  }
2639
2640
0
  asc->m_channelConfiguration = (audioMode) ? 2 : 1;
2641
2642
0
  if (Drm_xHEAACDecoderConfig(asc, bs, audioMode, cb) != TRANSPORTDEC_OK) {
2643
0
    return TRANSPORTDEC_PARSE_ERROR;
2644
0
  }
2645
2646
0
  return TRANSPORTDEC_OK;
2647
0
}
2648
2649
/* Mapping of DRM audio sampling rate field to MPEG usacSamplingFrequencyIndex
2650
 */
2651
const UCHAR mapSr2MPEGIdx[8] = {
2652
    0x1b, /*  9.6 kHz */
2653
    0x09, /* 12.0 kHz */
2654
    0x08, /* 16.0 kHz */
2655
    0x17, /* 19.2 kHz */
2656
    0x06, /* 24.0 kHz */
2657
    0x05, /* 32.0 kHz */
2658
    0x12, /* 38.4 kHz */
2659
    0x03  /* 48.0 kHz */
2660
};
2661
2662
TRANSPORTDEC_ERROR DrmRawSdcAudioConfig_Parse(
2663
    CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs,
2664
    CSTpCallBacks *cb, /* use cb == NULL to signal config check only mode */
2665
0
    UCHAR configMode, UCHAR configChanged) {
2666
0
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
2667
2668
0
  AudioSpecificConfig_Init(self);
2669
2670
0
  if ((INT)FDKgetValidBits(bs) < 16) {
2671
0
    ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2672
0
    goto bail;
2673
0
  } else {
2674
    /* DRM - Audio information data entity - type 9
2675
       - Short Id            2 bits (not part of the config buffer)
2676
       - Stream Id           2 bits (not part of the config buffer)
2677
       - audio coding        2 bits
2678
       - SBR flag            1 bit
2679
       - audio mode          2 bits
2680
       - audio sampling rate 3 bits
2681
       - text flag           1 bit
2682
       - enhancement flag    1 bit
2683
       - coder field         5 bits
2684
       - rfa                 1 bit  */
2685
2686
0
    int audioCoding, audioMode, cSamplingFreq, coderField, sfIdx, sbrFlag;
2687
2688
0
    self->configMode = configMode;
2689
0
    self->AacConfigChanged = configChanged;
2690
0
    self->SbrConfigChanged = configChanged;
2691
0
    self->SacConfigChanged = configChanged;
2692
2693
    /* Read the SDC field */
2694
0
    audioCoding = FDKreadBits(bs, 2);
2695
0
    sbrFlag = FDKreadBits(bs, 1);
2696
0
    audioMode = FDKreadBits(bs, 2);
2697
0
    cSamplingFreq = FDKreadBits(bs, 3); /* audio sampling rate */
2698
2699
0
    FDKreadBits(bs, 2); /* Text and enhancement flag */
2700
0
    coderField = FDKreadBits(bs, 5);
2701
0
    FDKreadBits(bs, 1); /* rfa */
2702
2703
    /* Evaluate configuration and fill the ASC */
2704
0
    if (audioCoding == 3) {
2705
0
      sfIdx = (int)mapSr2MPEGIdx[cSamplingFreq];
2706
0
      sbrFlag = 0; /* rfa */
2707
0
    } else {
2708
0
      switch (cSamplingFreq) {
2709
0
        case 0: /*  8 kHz */
2710
0
          sfIdx = 11;
2711
0
          break;
2712
0
        case 1: /* 12 kHz */
2713
0
          sfIdx = 9;
2714
0
          break;
2715
0
        case 2: /* 16 kHz */
2716
0
          sfIdx = 8;
2717
0
          break;
2718
0
        case 3: /* 24 kHz */
2719
0
          sfIdx = 6;
2720
0
          break;
2721
0
        case 5: /* 48 kHz */
2722
0
          sfIdx = 3;
2723
0
          break;
2724
0
        case 4: /* reserved */
2725
0
        case 6: /* reserved */
2726
0
        case 7: /* reserved */
2727
0
        default:
2728
0
          ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2729
0
          goto bail;
2730
0
      }
2731
0
    }
2732
2733
0
    self->m_samplingFrequencyIndex = sfIdx;
2734
0
    self->m_samplingFrequency = SamplingRateTable[sfIdx];
2735
2736
0
    if (sbrFlag) {
2737
0
      UINT i;
2738
0
      int tmp = -1;
2739
0
      self->m_sbrPresentFlag = 1;
2740
0
      self->m_extensionAudioObjectType = AOT_SBR;
2741
0
      self->m_extensionSamplingFrequency = self->m_samplingFrequency << 1;
2742
0
      for (i = 0;
2743
0
           i < (sizeof(SamplingRateTable) / sizeof(SamplingRateTable[0]));
2744
0
           i++) {
2745
0
        if (SamplingRateTable[i] == self->m_extensionSamplingFrequency) {
2746
0
          tmp = i;
2747
0
          break;
2748
0
        }
2749
0
      }
2750
0
      self->m_extensionSamplingFrequencyIndex = tmp;
2751
0
    }
2752
2753
0
    switch (audioCoding) {
2754
0
      case 0: /* AAC */
2755
0
        if ((coderField >> 2) && (audioMode != 1)) {
2756
0
          self->m_aot = AOT_DRM_SURROUND; /* Set pseudo AOT for Drm Surround */
2757
0
        } else {
2758
0
          self->m_aot = AOT_DRM_AAC; /* Set pseudo AOT for Drm AAC */
2759
0
        }
2760
0
        switch (audioMode) {
2761
0
          case 1: /* parametric stereo */
2762
0
            self->m_psPresentFlag = 1;
2763
0
            FDK_FALLTHROUGH;
2764
0
          case 0: /* mono */
2765
0
            self->m_channelConfiguration = 1;
2766
0
            break;
2767
0
          case 2: /* stereo */
2768
0
            self->m_channelConfiguration = 2;
2769
0
            break;
2770
0
          default:
2771
0
            ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2772
0
            goto bail;
2773
0
        }
2774
0
        self->m_vcb11Flag = 1;
2775
0
        self->m_hcrFlag = 1;
2776
0
        self->m_samplesPerFrame = 960;
2777
0
        self->m_epConfig = 1;
2778
0
        break;
2779
0
      case 1: /* CELP */
2780
0
        self->m_aot = AOT_ER_CELP;
2781
0
        self->m_channelConfiguration = 1;
2782
0
        break;
2783
0
      case 2: /* HVXC */
2784
0
        self->m_aot = AOT_ER_HVXC;
2785
0
        self->m_channelConfiguration = 1;
2786
0
        break;
2787
0
      case 3: /* xHE-AAC */
2788
0
      {
2789
        /* payload is MPEG conform -> no pseudo DRM AOT needed */
2790
0
        self->m_aot = AOT_USAC;
2791
0
      }
2792
0
        switch (audioMode) {
2793
0
          case 0: /* mono */
2794
0
          case 2: /* stereo */
2795
            /* codec specific config 8n bits */
2796
0
            ErrorStatus = Drm_xHEAACStaticConfig(self, bs, audioMode, cb);
2797
0
            break;
2798
0
          default:
2799
0
            ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2800
0
            goto bail;
2801
0
        }
2802
0
        break;
2803
0
      default:
2804
0
        ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2805
0
        self->m_aot = AOT_NONE;
2806
0
        break;
2807
0
    }
2808
2809
0
    if (self->m_psPresentFlag && !self->m_sbrPresentFlag) {
2810
0
      ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
2811
0
      goto bail;
2812
0
    }
2813
0
  }
2814
2815
0
bail:
2816
0
  return (ErrorStatus);
2817
0
}