Coverage Report

Created: 2026-05-30 06:09

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
376k
void CProgramConfig_Reset(CProgramConfig *pPce) { pPce->elCounter = 0; }
185
186
2.05M
void CProgramConfig_Init(CProgramConfig *pPce) {
187
2.05M
  FDKmemclear(pPce, sizeof(CProgramConfig));
188
2.05M
  pPce->SamplingFrequencyIndex = 0xf;
189
2.05M
}
190
191
899k
int CProgramConfig_IsValid(const CProgramConfig *pPce) {
192
899k
  return ((pPce->isValid) ? 1 : 0);
193
899k
}
194
195
22.2k
#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
147k
                                        const UINT alignmentAnchor) {
207
147k
  int err = 0;
208
147k
  FDK_CRCINFO crcInfo; /* CRC state info */
209
147k
  INT crcReg;
210
147k
  FDKcrcInit(&crcInfo, 0x07, 0xFF, 8);
211
147k
  crcReg = FDKcrcStartReg(&crcInfo, bs, 0);
212
147k
  UINT startAnchor = FDKgetValidBits(bs);
213
214
147k
  FDK_ASSERT(pPce != NULL);
215
147k
  FDK_ASSERT(bs != NULL);
216
147k
  FDK_ASSERT(bytesAvailable != NULL);
217
218
147k
  if ((startAnchor >= 24) && (*bytesAvailable >= 3) &&
219
22.2k
      (FDKreadBits(bs, 8) == PCE_HEIGHT_EXT_SYNC)) {
220
5.52k
    int i;
221
222
26.0k
    for (i = 0; i < pPce->NumFrontChannelElements; i++) {
223
20.5k
      if ((pPce->FrontElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
224
20.5k
          PC_NUM_HEIGHT_LAYER) {
225
5.32k
        err = -2; /* height information is out of the valid range */
226
5.32k
      }
227
20.5k
    }
228
28.2k
    for (i = 0; i < pPce->NumSideChannelElements; i++) {
229
22.7k
      if ((pPce->SideElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
230
22.7k
          PC_NUM_HEIGHT_LAYER) {
231
2.88k
        err = -2; /* height information is out of the valid range */
232
2.88k
      }
233
22.7k
    }
234
28.5k
    for (i = 0; i < pPce->NumBackChannelElements; i++) {
235
22.9k
      if ((pPce->BackElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
236
22.9k
          PC_NUM_HEIGHT_LAYER) {
237
2.51k
        err = -2; /* height information is out of the valid range */
238
2.51k
      }
239
22.9k
    }
240
5.52k
    FDKbyteAlign(bs, alignmentAnchor);
241
242
5.52k
    FDKcrcEndReg(&crcInfo, bs, crcReg);
243
5.52k
    if ((USHORT)FDKreadBits(bs, 8) != FDKcrcGetCRC(&crcInfo)) {
244
      /* CRC failed */
245
2.04k
      err = -1;
246
2.04k
    }
247
5.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
2.04k
      FDKmemclear(pPce->FrontElementHeightInfo,
252
2.04k
                  sizeof(pPce->FrontElementHeightInfo));
253
2.04k
      FDKmemclear(pPce->SideElementHeightInfo,
254
2.04k
                  sizeof(pPce->SideElementHeightInfo));
255
2.04k
      FDKmemclear(pPce->BackElementHeightInfo,
256
2.04k
                  sizeof(pPce->BackElementHeightInfo));
257
2.04k
    }
258
141k
  } else {
259
    /* No valid extension data found -> restore the initial bitbuffer state */
260
141k
    FDKpushBack(bs, (INT)startAnchor - (INT)FDKgetValidBits(bs));
261
141k
  }
262
263
  /* Always report the bytes read. */
264
147k
  *bytesAvailable -= ((INT)startAnchor - (INT)FDKgetValidBits(bs)) >> 3;
265
266
147k
  return (err);
267
147k
}
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
147k
static int CProgramConfig_Check(CProgramConfig *pPce) {
279
147k
  INT i;
280
147k
  INT err = 0;
281
147k
  INT numBackChannels[3] = {0};
282
147k
  INT numSideChannels[3] = {0};
283
147k
  INT numFrontChannels[3] = {0};
284
147k
  UCHAR *pCpeFront = pPce->FrontElementIsCpe;
285
147k
  UCHAR *pCpeSide = pPce->SideElementIsCpe;
286
147k
  UCHAR *pCpeBack = pPce->BackElementIsCpe;
287
147k
  UCHAR *pHeight;
288
289
147k
  pHeight = pPce->BackElementHeightInfo;
290
706k
  for (i = 0; i < pPce->NumBackChannelElements; i++) {
291
558k
    numBackChannels[*pHeight] += pPce->BackElementIsCpe[i] ? 2 : 1;
292
558k
    pHeight++;
293
558k
  }
294
147k
  pHeight = pPce->SideElementHeightInfo;
295
239k
  for (i = 0; i < pPce->NumSideChannelElements; i++) {
296
91.9k
    numSideChannels[*pHeight] += pPce->SideElementIsCpe[i] ? 2 : 1;
297
91.9k
    pHeight++;
298
91.9k
  }
299
147k
  pHeight = pPce->FrontElementHeightInfo;
300
237k
  for (i = 0; i < pPce->NumFrontChannelElements; i++) {
301
90.0k
    numFrontChannels[*pHeight] += pPce->FrontElementIsCpe[i] ? 2 : 1;
302
90.0k
    pHeight++;
303
90.0k
  }
304
305
  /* 0 = normal height channels, 1 = top height channels, 2 = bottom height
306
   * channels */
307
544k
  for (i = 0; i < 3; i++) {
308
    /* if number of channels is odd => first element must be a SCE (front center
309
     * channel) */
310
412k
    if (numFrontChannels[i] & 1) {
311
8.02k
      if (*pCpeFront++ == ID_CPE) {
312
1.41k
        err = 1;
313
1.41k
        goto bail;
314
1.41k
      }
315
6.60k
      numFrontChannels[i]--;
316
6.60k
    }
317
440k
    while (numFrontChannels[i] > 0) {
318
      /* must be CPE or paired SCE */
319
33.2k
      if (*pCpeFront++ == ID_SCE) {
320
16.9k
        if (*pCpeFront++ == ID_CPE) {
321
3.30k
          err = 1;
322
3.30k
          goto bail;
323
3.30k
        }
324
16.9k
      }
325
29.9k
      numFrontChannels[i] -= 2;
326
407k
    };
327
328
    /* in case that a top center surround channel (Ts) is transmitted the number
329
     * of channels can be odd */
330
407k
    if (i != 1) {
331
      /* number of channels must be even */
332
275k
      if (numSideChannels[i] & 1) {
333
2.07k
        err = 1;
334
2.07k
        goto bail;
335
2.07k
      }
336
292k
      while (numSideChannels[i] > 0) {
337
        /* must be CPE or paired SCE */
338
19.9k
        if (*pCpeSide++ == ID_SCE) {
339
9.55k
          if (*pCpeSide++ == ID_CPE) {
340
615
            err = 1;
341
615
            goto bail;
342
615
          }
343
9.55k
        }
344
19.3k
        numSideChannels[i] -= 2;
345
272k
      };
346
272k
    }
347
348
758k
    while (numBackChannels[i] > 1) {
349
      /* must be CPE or paired SCE */
350
360k
      if (*pCpeBack++ == ID_SCE) {
351
9.53k
        if (*pCpeBack++ == ID_CPE) {
352
7.27k
          err = 1;
353
7.27k
          goto bail;
354
7.27k
        }
355
9.53k
      }
356
353k
      numBackChannels[i] -= 2;
357
397k
    };
358
    /* if number of channels is odd => last element must be a SCE (back center
359
     * channel) */
360
397k
    if (numBackChannels[i]) {
361
123k
      if (*pCpeBack++ == ID_CPE) {
362
525
        err = 1;
363
525
        goto bail;
364
525
      }
365
123k
    }
366
397k
  }
367
368
147k
bail:
369
370
147k
  return err;
371
147k
}
372
373
void CProgramConfig_Read(CProgramConfig *pPce, HANDLE_FDK_BITSTREAM bs,
374
147k
                         UINT alignmentAnchor) {
375
147k
  int i;
376
147k
  int commentBytes;
377
147k
  UCHAR tag, isCpe;
378
147k
  UCHAR checkElementTagSelect[3][PC_FSB_CHANNELS_MAX] = {{0}};
379
380
147k
  pPce->isValid = 1;
381
147k
  pPce->NumEffectiveChannels = 0;
382
147k
  pPce->NumChannels = 0;
383
147k
  pPce->ElementInstanceTag = (UCHAR)FDKreadBits(bs, 4);
384
147k
  pPce->Profile = (UCHAR)FDKreadBits(bs, 2);
385
147k
  pPce->SamplingFrequencyIndex = (UCHAR)FDKreadBits(bs, 4);
386
147k
  pPce->NumFrontChannelElements = (UCHAR)FDKreadBits(bs, 4);
387
147k
  pPce->NumSideChannelElements = (UCHAR)FDKreadBits(bs, 4);
388
147k
  pPce->NumBackChannelElements = (UCHAR)FDKreadBits(bs, 4);
389
147k
  pPce->NumLfeChannelElements = (UCHAR)FDKreadBits(bs, 2);
390
147k
  pPce->NumAssocDataElements = (UCHAR)FDKreadBits(bs, 3);
391
147k
  pPce->NumValidCcElements = (UCHAR)FDKreadBits(bs, 4);
392
393
147k
  if ((pPce->MonoMixdownPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
394
123k
    pPce->MonoMixdownElementNumber = (UCHAR)FDKreadBits(bs, 4);
395
123k
  }
396
397
147k
  if ((pPce->StereoMixdownPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
398
15.1k
    pPce->StereoMixdownElementNumber = (UCHAR)FDKreadBits(bs, 4);
399
15.1k
  }
400
401
147k
  if ((pPce->MatrixMixdownIndexPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
402
9.12k
    pPce->MatrixMixdownIndex = (UCHAR)FDKreadBits(bs, 2);
403
9.12k
    pPce->PseudoSurroundEnable = (UCHAR)FDKreadBits(bs, 1);
404
9.12k
  }
405
406
237k
  for (i = 0; i < pPce->NumFrontChannelElements; i++) {
407
90.0k
    pPce->FrontElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
408
90.0k
    pPce->FrontElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
409
90.0k
    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
90.0k
    if (checkElementTagSelect[isCpe][tag] == 0) {
414
67.4k
      checkElementTagSelect[isCpe][tag] = 1;
415
67.4k
    } else {
416
22.6k
      pPce->isValid = 0;
417
22.6k
    }
418
90.0k
  }
419
420
239k
  for (i = 0; i < pPce->NumSideChannelElements; i++) {
421
91.9k
    pPce->SideElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
422
91.9k
    pPce->SideElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
423
91.9k
    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
91.9k
    if (checkElementTagSelect[isCpe][tag] == 0) {
428
59.5k
      checkElementTagSelect[isCpe][tag] = 1;
429
59.5k
    } else {
430
32.4k
      pPce->isValid = 0;
431
32.4k
    }
432
91.9k
  }
433
434
706k
  for (i = 0; i < pPce->NumBackChannelElements; i++) {
435
558k
    pPce->BackElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
436
558k
    pPce->BackElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
437
558k
    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
558k
    if (checkElementTagSelect[isCpe][tag] == 0) {
442
520k
      checkElementTagSelect[isCpe][tag] = 1;
443
520k
    } else {
444
38.4k
      pPce->isValid = 0;
445
38.4k
    }
446
558k
  }
447
448
147k
  pPce->NumEffectiveChannels = pPce->NumChannels;
449
450
298k
  for (i = 0; i < pPce->NumLfeChannelElements; i++) {
451
151k
    pPce->LfeElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
452
151k
    pPce->NumChannels += 1;
453
454
    /* Check element instance tag according to ISO/IEC 13818-7:2003(E),
455
     * chapter 8.2.1.1 */
456
151k
    if (checkElementTagSelect[2][tag] == 0) {
457
149k
      checkElementTagSelect[2][tag] = 1;
458
149k
    } else {
459
1.54k
      pPce->isValid = 0;
460
1.54k
    }
461
151k
  }
462
463
216k
  for (i = 0; i < pPce->NumAssocDataElements; i++) {
464
68.6k
    pPce->AssocDataElementTagSelect[i] = (UCHAR)FDKreadBits(bs, 4);
465
68.6k
  }
466
467
420k
  for (i = 0; i < pPce->NumValidCcElements; i++) {
468
272k
    pPce->CcElementIsIndSw[i] = (UCHAR)FDKreadBits(bs, 1);
469
272k
    pPce->ValidCcElementTagSelect[i] = (UCHAR)FDKreadBits(bs, 4);
470
272k
  }
471
472
147k
  FDKbyteAlign(bs, alignmentAnchor);
473
474
147k
  pPce->CommentFieldBytes = (UCHAR)FDKreadBits(bs, 8);
475
147k
  commentBytes = pPce->CommentFieldBytes;
476
477
  /* Search for height info extension and read it if available */
478
147k
  if (CProgramConfig_ReadHeightExt(pPce, bs, &commentBytes, alignmentAnchor)) {
479
2.04k
    pPce->isValid = 0;
480
2.04k
  }
481
482
  /* Check order of elements according to ISO / IEC 13818 - 7:2003(E),
483
   * chapter 8.5.1 */
484
147k
  if (CProgramConfig_Check(pPce)) {
485
15.2k
    pPce->isValid = 0;
486
15.2k
  }
487
488
1.29M
  for (i = 0; i < commentBytes; i++) {
489
1.14M
    UCHAR text;
490
491
1.14M
    text = (UCHAR)FDKreadBits(bs, 8);
492
493
1.14M
    if (i < PC_COMMENTLENGTH) {
494
1.14M
      pPce->Comment[i] = text;
495
1.14M
    }
496
1.14M
  }
497
147k
}
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
486k
                           const CProgramConfig *const pPce2) {
509
486k
  int result = 0; /* Innocent until proven false. */
510
511
486k
  if (FDKmemcmp(pPce1, pPce2, sizeof(CProgramConfig)) !=
512
486k
      0) { /* Configurations are not completely equal.
513
              So look into details and analyse the channel configurations: */
514
485k
    result = -1;
515
516
485k
    if (pPce1->NumChannels ==
517
485k
        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
484k
      result = 1;
521
522
      /* Front channels */
523
484k
      if (pPce1->NumFrontChannelElements != pPce2->NumFrontChannelElements) {
524
479k
        result = 2; /* different number of front channel elements */
525
479k
      } else {
526
5.50k
        int el, numCh1 = 0, numCh2 = 0;
527
15.9k
        for (el = 0; el < pPce1->NumFrontChannelElements; el += 1) {
528
11.4k
          if (pPce1->FrontElementHeightInfo[el] !=
529
11.4k
              pPce2->FrontElementHeightInfo[el]) {
530
1.05k
            result = 2; /* different height info */
531
1.05k
            break;
532
1.05k
          }
533
10.4k
          numCh1 += pPce1->FrontElementIsCpe[el] ? 2 : 1;
534
10.4k
          numCh2 += pPce2->FrontElementIsCpe[el] ? 2 : 1;
535
10.4k
        }
536
5.50k
        if (numCh1 != numCh2) {
537
2.00k
          result = 2; /* different number of front channels */
538
2.00k
        }
539
5.50k
      }
540
      /* Side channels */
541
484k
      if (pPce1->NumSideChannelElements != pPce2->NumSideChannelElements) {
542
118k
        result = 2; /* different number of side channel elements */
543
366k
      } else {
544
366k
        int el, numCh1 = 0, numCh2 = 0;
545
367k
        for (el = 0; el < pPce1->NumSideChannelElements; el += 1) {
546
1.50k
          if (pPce1->SideElementHeightInfo[el] !=
547
1.50k
              pPce2->SideElementHeightInfo[el]) {
548
336
            result = 2; /* different height info */
549
336
            break;
550
336
          }
551
1.16k
          numCh1 += pPce1->SideElementIsCpe[el] ? 2 : 1;
552
1.16k
          numCh2 += pPce2->SideElementIsCpe[el] ? 2 : 1;
553
1.16k
        }
554
366k
        if (numCh1 != numCh2) {
555
0
          result = 2; /* different number of side channels */
556
0
        }
557
366k
      }
558
      /* Back channels */
559
484k
      if (pPce1->NumBackChannelElements != pPce2->NumBackChannelElements) {
560
467k
        result = 2; /* different number of back channel elements */
561
467k
      } else {
562
16.9k
        int el, numCh1 = 0, numCh2 = 0;
563
25.9k
        for (el = 0; el < pPce1->NumBackChannelElements; el += 1) {
564
15.9k
          if (pPce1->BackElementHeightInfo[el] !=
565
15.9k
              pPce2->BackElementHeightInfo[el]) {
566
6.87k
            result = 2; /* different height info */
567
6.87k
            break;
568
6.87k
          }
569
9.02k
          numCh1 += pPce1->BackElementIsCpe[el] ? 2 : 1;
570
9.02k
          numCh2 += pPce2->BackElementIsCpe[el] ? 2 : 1;
571
9.02k
        }
572
16.9k
        if (numCh1 != numCh2) {
573
4.04k
          result = 2; /* different number of back channels */
574
4.04k
        }
575
16.9k
      }
576
      /* LFE channels */
577
484k
      if (pPce1->NumLfeChannelElements != pPce2->NumLfeChannelElements) {
578
6.55k
        result = 2; /* different number of lfe channels */
579
6.55k
      }
580
      /* LFEs are always SCEs so we don't need to count the channels. */
581
484k
    }
582
485k
  }
583
584
486k
  return result;
585
486k
}
586
587
485k
void CProgramConfig_GetDefault(CProgramConfig *pPce, const UINT channelConfig) {
588
485k
  FDK_ASSERT(pPce != NULL);
589
590
  /* Init PCE */
591
485k
  CProgramConfig_Init(pPce);
592
485k
  pPce->Profile =
593
485k
      1; /* Set AAC LC because it is the only supported object type. */
594
595
485k
  switch (channelConfig) {
596
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
597
106k
    case 32: /* 7.1 side channel configuration as defined in FDK_audio.h */
598
106k
      pPce->NumFrontChannelElements = 2;
599
106k
      pPce->FrontElementIsCpe[0] = 0;
600
106k
      pPce->FrontElementIsCpe[1] = 1;
601
106k
      pPce->NumSideChannelElements = 1;
602
106k
      pPce->SideElementIsCpe[0] = 1;
603
106k
      pPce->NumBackChannelElements = 1;
604
106k
      pPce->BackElementIsCpe[0] = 1;
605
106k
      pPce->NumLfeChannelElements = 1;
606
106k
      pPce->NumChannels = 8;
607
106k
      pPce->NumEffectiveChannels = 7;
608
106k
      pPce->isValid = 1;
609
106k
      break;
610
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
611
106k
    case 12: /* 3/0/4.1ch surround back */
612
106k
      pPce->BackElementIsCpe[1] = 1;
613
106k
      pPce->NumChannels += 1;
614
106k
      pPce->NumEffectiveChannels += 1;
615
106k
      FDK_FALLTHROUGH;
616
108k
    case 11: /* 3/0/3.1ch */
617
108k
      pPce->NumFrontChannelElements += 2;
618
108k
      pPce->FrontElementIsCpe[0] = 0;
619
108k
      pPce->FrontElementIsCpe[1] = 1;
620
108k
      pPce->NumBackChannelElements += 2;
621
108k
      pPce->BackElementIsCpe[0] = 1;
622
108k
      pPce->BackElementIsCpe[1] += 0;
623
108k
      pPce->NumLfeChannelElements += 1;
624
108k
      pPce->NumChannels += 7;
625
108k
      pPce->NumEffectiveChannels += 6;
626
108k
      pPce->isValid = 1;
627
108k
      break;
628
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
629
106k
    case 14:                               /* 2/0/0-3/0/2-0.1ch front height */
630
106k
      pPce->FrontElementHeightInfo[2] = 1; /* Top speaker */
631
106k
      FDK_FALLTHROUGH;
632
264k
    case 7: /* 5/0/2.1ch front */
633
264k
      pPce->NumFrontChannelElements += 1;
634
264k
      pPce->FrontElementIsCpe[2] = 1;
635
264k
      pPce->NumChannels += 2;
636
264k
      pPce->NumEffectiveChannels += 2;
637
264k
      FDK_FALLTHROUGH;
638
265k
    case 6: /* 3/0/2.1ch */
639
265k
      pPce->NumLfeChannelElements += 1;
640
265k
      pPce->NumChannels += 1;
641
265k
      FDK_FALLTHROUGH;
642
266k
    case 5: /* 3/0/2.0ch */
643
267k
    case 4: /* 3/0/1.0ch */
644
267k
      pPce->NumBackChannelElements += 1;
645
267k
      pPce->BackElementIsCpe[0] = (channelConfig > 4) ? 1 : 0;
646
267k
      pPce->NumChannels += (channelConfig > 4) ? 2 : 1;
647
267k
      pPce->NumEffectiveChannels += (channelConfig > 4) ? 2 : 1;
648
267k
      FDK_FALLTHROUGH;
649
268k
    case 3: /* 3/0/0.0ch */
650
268k
      pPce->NumFrontChannelElements += 1;
651
268k
      pPce->FrontElementIsCpe[1] = 1;
652
268k
      pPce->NumChannels += 2;
653
268k
      pPce->NumEffectiveChannels += 2;
654
268k
      FDK_FALLTHROUGH;
655
268k
    case 1: /* 1/0/0.0ch */
656
268k
      pPce->NumFrontChannelElements += 1;
657
268k
      pPce->FrontElementIsCpe[0] = 0;
658
268k
      pPce->NumChannels += 1;
659
268k
      pPce->NumEffectiveChannels += 1;
660
268k
      pPce->isValid = 1;
661
268k
      break;
662
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
663
237
    case 2: /* 2/0/0.ch */
664
237
      pPce->NumFrontChannelElements = 1;
665
237
      pPce->FrontElementIsCpe[0] = 1;
666
237
      pPce->NumChannels += 2;
667
237
      pPce->NumEffectiveChannels += 2;
668
237
      pPce->isValid = 1;
669
237
      break;
670
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
671
572
    default:
672
572
      pPce->isValid = 0; /* To be explicit! */
673
572
      break;
674
485k
  }
675
676
485k
  if (pPce->isValid) {
677
    /* Create valid element instance tags */
678
484k
    int el, elTagSce = 0, elTagCpe = 0;
679
680
1.71M
    for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
681
1.23M
      pPce->FrontElementTagSelect[el] =
682
1.23M
          (pPce->FrontElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
683
1.23M
    }
684
591k
    for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
685
106k
      pPce->SideElementTagSelect[el] =
686
106k
          (pPce->SideElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
687
106k
    }
688
1.07M
    for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
689
591k
      pPce->BackElementTagSelect[el] =
690
591k
          (pPce->BackElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
691
591k
    }
692
484k
    elTagSce = 0;
693
965k
    for (el = 0; el < pPce->NumLfeChannelElements; el += 1) {
694
480k
      pPce->LfeElementTagSelect[el] = elTagSce++;
695
480k
    }
696
484k
  }
697
485k
}
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
450k
                                                UINT index) {
710
450k
  if (index < 3) {
711
390k
    *chType = ACT_FRONT;
712
390k
    *chIndex = index;
713
390k
  } else {
714
59.7k
    switch (channelConfig) {
715
184
      case 4: /* SCE, CPE, SCE */
716
268
      case 5: /* SCE, CPE, CPE */
717
605
      case 6: /* SCE, CPE, CPE, LFE */
718
605
        switch (index) {
719
442
          case 3:
720
442
          case 4:
721
442
            *chType = ACT_BACK;
722
442
            *chIndex = index - 3;
723
442
            break;
724
163
          case 5:
725
163
            *chType = ACT_LFE;
726
163
            *chIndex = 0;
727
163
            break;
728
605
        }
729
605
        break;
730
18.1k
      case 7: /* SCE,CPE,CPE,CPE,LFE */
731
18.1k
        switch (index) {
732
6.07k
          case 3:
733
6.07k
          case 4:
734
6.07k
            *chType = ACT_FRONT;
735
6.07k
            *chIndex = index;
736
6.07k
            break;
737
6.04k
          case 5:
738
6.04k
          case 6:
739
6.04k
            *chType = ACT_BACK;
740
6.04k
            *chIndex = index - 5;
741
6.04k
            break;
742
6.01k
          case 7:
743
6.01k
            *chType = ACT_LFE;
744
6.01k
            *chIndex = 0;
745
6.01k
            break;
746
18.1k
        }
747
18.1k
        break;
748
18.1k
      case 11: /* SCE,CPE,CPE,SCE,LFE */
749
7.63k
        if (index < 6) {
750
5.13k
          *chType = ACT_BACK;
751
5.13k
          *chIndex = index - 3;
752
5.13k
        } else {
753
2.49k
          *chType = ACT_LFE;
754
2.49k
          *chIndex = 0;
755
2.49k
        }
756
7.63k
        break;
757
3.87k
      case 12: /* SCE,CPE,CPE,CPE,LFE */
758
3.87k
        if (index < 7) {
759
2.59k
          *chType = ACT_BACK;
760
2.59k
          *chIndex = index - 3;
761
2.59k
        } else {
762
1.28k
          *chType = ACT_LFE;
763
1.28k
          *chIndex = 0;
764
1.28k
        }
765
3.87k
        break;
766
29.4k
      case 14: /* SCE,CPE,CPE,LFE,CPE */
767
29.4k
        switch (index) {
768
9.85k
          case 3:
769
9.85k
          case 4:
770
9.85k
            *chType = ACT_BACK;
771
9.85k
            *chIndex = index - 3;
772
9.85k
            break;
773
9.83k
          case 5:
774
9.83k
            *chType = ACT_LFE;
775
9.83k
            *chIndex = 0;
776
9.83k
            break;
777
9.80k
          case 6:
778
9.80k
          case 7:
779
9.80k
            *chType = ACT_FRONT_TOP;
780
9.80k
            *chIndex = index - 6; /* handle the top layer independently */
781
9.80k
            break;
782
29.4k
        }
783
29.4k
        break;
784
29.4k
      default:
785
0
        *chType = ACT_NONE;
786
0
        break;
787
59.7k
    }
788
59.7k
  }
789
450k
}
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
474k
                                 MP4_ELEMENT_ID elType) {
797
474k
  if (channelConfig > 0) {
798
    /* Constant channel mapping must have
799
       been set during initialization. */
800
465k
    if (IS_CHANNEL_ELEMENT(elType)) {
801
450k
      *elMapping = pPce->elCounter;
802
450k
      if (elList[pPce->elCounter] != elType &&
803
26.6k
          !IS_USAC_CHANNEL_ELEMENT(elType)) {
804
        /* Not in the list */
805
4.86k
        if ((channelConfig == 2) &&
806
4.19k
            (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
4.18k
          channelConfig = 1;
811
4.18k
        } else if ((elList[pPce->elCounter] == ID_LFE) &&
812
615
                   (elType ==
813
615
                    ID_SCE)) { /* Decode bitstreams which wrongly use ID_SCE
814
                                  instead of ID_LFE element type. */
815
614
          ;
816
614
        } else {
817
62
          return 0;
818
62
        }
819
4.86k
      }
820
      /* Assume all front channels */
821
450k
      getImplicitAudioChannelTypeAndIndex(
822
450k
          &chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx);
823
450k
      if (elType == ID_CPE || elType == ID_USAC_CPE) {
824
293k
        chType[channelIdx + 1] = chType[channelIdx];
825
293k
        chIndex[channelIdx + 1] = chIndex[channelIdx] + 1;
826
293k
      }
827
450k
      pPce->elCounter++;
828
450k
    }
829
    /* Accept all non-channel elements, too. */
830
465k
    return 1;
831
465k
  } else {
832
8.97k
    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
8.97k
    } else {
842
      /* Accept the additional channel(s), only if the tag is in the lists */
843
8.97k
      int isCpe = 0, i;
844
      /* Element counter */
845
8.97k
      int ec[PC_NUM_HEIGHT_LAYER] = {0};
846
      /* Channel counters */
847
8.97k
      int cc[PC_NUM_HEIGHT_LAYER] = {0};
848
8.97k
      int fc[PC_NUM_HEIGHT_LAYER] = {0}; /* front channel counter */
849
8.97k
      int sc[PC_NUM_HEIGHT_LAYER] = {0}; /* side channel counter */
850
8.97k
      int bc[PC_NUM_HEIGHT_LAYER] = {0}; /* back channel counter */
851
8.97k
      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
8.97k
      switch (elType) {
865
1.90k
        case ID_CPE:
866
1.90k
          isCpe = 1;
867
1.90k
          FDK_FALLTHROUGH;
868
5.18k
        case ID_SCE:
869
          /* search in front channels */
870
7.25k
          for (i = 0; i < pPce->NumFrontChannelElements; i++) {
871
3.32k
            int heightLayer = pPce->FrontElementHeightInfo[i];
872
3.32k
            if (isCpe == pPce->FrontElementIsCpe[i] &&
873
3.12k
                pPce->FrontElementTagSelect[i] == tag) {
874
1.25k
              int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
875
1.25k
              AUDIO_CHANNEL_TYPE aChType =
876
1.25k
                  (AUDIO_CHANNEL_TYPE)((heightLayer << 4) | ACT_FRONT);
877
1.37k
              for (h = heightLayer - 1; h >= 0; h -= 1) {
878
119
                int el;
879
                /* Count front channels/elements */
880
649
                for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
881
530
                  if (pPce->FrontElementHeightInfo[el] == h) {
882
190
                    elIdx += 1;
883
190
                    chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
884
190
                  }
885
530
                }
886
                /* Count side channels/elements */
887
256
                for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
888
137
                  if (pPce->SideElementHeightInfo[el] == h) {
889
56
                    elIdx += 1;
890
56
                    chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
891
56
                  }
892
137
                }
893
                /* Count back channels/elements */
894
247
                for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
895
128
                  if (pPce->BackElementHeightInfo[el] == h) {
896
42
                    elIdx += 1;
897
42
                    chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
898
42
                  }
899
128
                }
900
119
                if (h == 0) { /* normal height */
901
65
                  elIdx += pPce->NumLfeChannelElements;
902
65
                  chIdx += pPce->NumLfeChannelElements;
903
65
                }
904
119
              }
905
1.25k
              chMapping[chIdx] = channelIdx;
906
1.25k
              chType[chIdx] = aChType;
907
1.25k
              chIndex[chIdx] = fc[heightLayer];
908
1.25k
              if (isCpe) {
909
334
                chMapping[chIdx + 1] = channelIdx + 1;
910
334
                chType[chIdx + 1] = aChType;
911
334
                chIndex[chIdx + 1] = fc[heightLayer] + 1;
912
334
              }
913
1.25k
              *elMapping = elIdx;
914
1.25k
              return 1;
915
1.25k
            }
916
2.07k
            ec[heightLayer] += 1;
917
2.07k
            if (pPce->FrontElementIsCpe[i]) {
918
537
              cc[heightLayer] += 2;
919
537
              fc[heightLayer] += 2;
920
1.53k
            } else {
921
1.53k
              cc[heightLayer] += 1;
922
1.53k
              fc[heightLayer] += 1;
923
1.53k
            }
924
2.07k
          }
925
          /* search in side channels */
926
6.81k
          for (i = 0; i < pPce->NumSideChannelElements; i++) {
927
4.67k
            int heightLayer = pPce->SideElementHeightInfo[i];
928
4.67k
            if (isCpe == pPce->SideElementIsCpe[i] &&
929
4.47k
                pPce->SideElementTagSelect[i] == tag) {
930
1.78k
              int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
931
1.78k
              AUDIO_CHANNEL_TYPE aChType =
932
1.78k
                  (AUDIO_CHANNEL_TYPE)((heightLayer << 4) | ACT_SIDE);
933
1.91k
              for (h = heightLayer - 1; h >= 0; h -= 1) {
934
136
                int el;
935
                /* Count front channels/elements */
936
320
                for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
937
184
                  if (pPce->FrontElementHeightInfo[el] == h) {
938
73
                    elIdx += 1;
939
73
                    chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
940
73
                  }
941
184
                }
942
                /* Count side channels/elements */
943
585
                for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
944
449
                  if (pPce->SideElementHeightInfo[el] == h) {
945
102
                    elIdx += 1;
946
102
                    chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
947
102
                  }
948
449
                }
949
                /* Count back channels/elements */
950
315
                for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
951
179
                  if (pPce->BackElementHeightInfo[el] == h) {
952
54
                    elIdx += 1;
953
54
                    chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
954
54
                  }
955
179
                }
956
136
                if (h ==
957
136
                    0) { /* LFE channels belong to the normal height layer */
958
85
                  elIdx += pPce->NumLfeChannelElements;
959
85
                  chIdx += pPce->NumLfeChannelElements;
960
85
                }
961
136
              }
962
1.78k
              chMapping[chIdx] = channelIdx;
963
1.78k
              chType[chIdx] = aChType;
964
1.78k
              chIndex[chIdx] = sc[heightLayer];
965
1.78k
              if (isCpe) {
966
702
                chMapping[chIdx + 1] = channelIdx + 1;
967
702
                chType[chIdx + 1] = aChType;
968
702
                chIndex[chIdx + 1] = sc[heightLayer] + 1;
969
702
              }
970
1.78k
              *elMapping = elIdx;
971
1.78k
              return 1;
972
1.78k
            }
973
2.89k
            ec[heightLayer] += 1;
974
2.89k
            if (pPce->SideElementIsCpe[i]) {
975
1.25k
              cc[heightLayer] += 2;
976
1.25k
              sc[heightLayer] += 2;
977
1.64k
            } else {
978
1.64k
              cc[heightLayer] += 1;
979
1.64k
              sc[heightLayer] += 1;
980
1.64k
            }
981
2.89k
          }
982
          /* search in back channels */
983
4.11k
          for (i = 0; i < pPce->NumBackChannelElements; i++) {
984
4.08k
            int heightLayer = pPce->BackElementHeightInfo[i];
985
4.08k
            if (isCpe == pPce->BackElementIsCpe[i] &&
986
3.98k
                pPce->BackElementTagSelect[i] == tag) {
987
2.11k
              int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
988
2.11k
              AUDIO_CHANNEL_TYPE aChType =
989
2.11k
                  (AUDIO_CHANNEL_TYPE)((heightLayer << 4) | ACT_BACK);
990
2.29k
              for (h = heightLayer - 1; h >= 0; h -= 1) {
991
182
                int el;
992
                /* Count front channels/elements */
993
407
                for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
994
225
                  if (pPce->FrontElementHeightInfo[el] == h) {
995
75
                    elIdx += 1;
996
75
                    chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
997
75
                  }
998
225
                }
999
                /* Count side channels/elements */
1000
482
                for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
1001
300
                  if (pPce->SideElementHeightInfo[el] == h) {
1002
103
                    elIdx += 1;
1003
103
                    chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
1004
103
                  }
1005
300
                }
1006
                /* Count back channels/elements */
1007
706
                for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
1008
524
                  if (pPce->BackElementHeightInfo[el] == h) {
1009
153
                    elIdx += 1;
1010
153
                    chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
1011
153
                  }
1012
524
                }
1013
182
                if (h == 0) { /* normal height */
1014
97
                  elIdx += pPce->NumLfeChannelElements;
1015
97
                  chIdx += pPce->NumLfeChannelElements;
1016
97
                }
1017
182
              }
1018
2.11k
              chMapping[chIdx] = channelIdx;
1019
2.11k
              chType[chIdx] = aChType;
1020
2.11k
              chIndex[chIdx] = bc[heightLayer];
1021
2.11k
              if (isCpe) {
1022
868
                chMapping[chIdx + 1] = channelIdx + 1;
1023
868
                chType[chIdx + 1] = aChType;
1024
868
                chIndex[chIdx + 1] = bc[heightLayer] + 1;
1025
868
              }
1026
2.11k
              *elMapping = elIdx;
1027
2.11k
              return 1;
1028
2.11k
            }
1029
1.97k
            ec[heightLayer] += 1;
1030
1.97k
            if (pPce->BackElementIsCpe[i]) {
1031
614
              cc[heightLayer] += 2;
1032
614
              bc[heightLayer] += 2;
1033
1.35k
            } else {
1034
1.35k
              cc[heightLayer] += 1;
1035
1.35k
              bc[heightLayer] += 1;
1036
1.35k
            }
1037
1.97k
          }
1038
31
          break;
1039
1040
779
        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
1.65k
          for (i = 0; i < pPce->NumFrontChannelElements; i += 1) {
1045
877
            int heightLayer = pPce->FrontElementHeightInfo[i];
1046
877
            ec[heightLayer] += 1;
1047
877
            cc[heightLayer] += (pPce->FrontElementIsCpe[i]) ? 2 : 1;
1048
877
          }
1049
          /* Count side channels/elements at normal height */
1050
1.76k
          for (i = 0; i < pPce->NumSideChannelElements; i += 1) {
1051
985
            int heightLayer = pPce->SideElementHeightInfo[i];
1052
985
            ec[heightLayer] += 1;
1053
985
            cc[heightLayer] += (pPce->SideElementIsCpe[i]) ? 2 : 1;
1054
985
          }
1055
          /* Count back channels/elements at normal height */
1056
1.86k
          for (i = 0; i < pPce->NumBackChannelElements; i += 1) {
1057
1.09k
            int heightLayer = pPce->BackElementHeightInfo[i];
1058
1.09k
            ec[heightLayer] += 1;
1059
1.09k
            cc[heightLayer] += (pPce->BackElementIsCpe[i]) ? 2 : 1;
1060
1.09k
          }
1061
1062
          /* search in lfe channels */
1063
853
          for (i = 0; i < pPce->NumLfeChannelElements; i++) {
1064
840
            int elIdx =
1065
840
                ec[0]; /* LFE channels belong to the normal height layer */
1066
840
            int chIdx = cc[0];
1067
840
            if (pPce->LfeElementTagSelect[i] == tag) {
1068
766
              chMapping[chIdx] = channelIdx;
1069
766
              *elMapping = elIdx;
1070
766
              chType[chIdx] = ACT_LFE;
1071
766
              chIndex[chIdx] = lc;
1072
766
              return 1;
1073
766
            }
1074
74
            ec[0] += 1;
1075
74
            cc[0] += 1;
1076
74
            lc += 1;
1077
74
          }
1078
779
        } break;
1079
1080
        /* Non audio elements */
1081
30
        case ID_CCE:
1082
          /* search in cce channels */
1083
249
          for (i = 0; i < pPce->NumValidCcElements; i++) {
1084
242
            if (pPce->ValidCcElementTagSelect[i] == tag) {
1085
23
              return 1;
1086
23
            }
1087
242
          }
1088
7
          break;
1089
2.98k
        case ID_DSE:
1090
          /* search associated data elements */
1091
5.92k
          for (i = 0; i < pPce->NumAssocDataElements; i++) {
1092
4.14k
            if (pPce->AssocDataElementTagSelect[i] == tag) {
1093
1.20k
              return 1;
1094
1.20k
            }
1095
4.14k
          }
1096
1.78k
          break;
1097
1.78k
        default:
1098
0
          return 0;
1099
8.97k
      }
1100
1.83k
      return 0; /* not found in any list */
1101
8.97k
    }
1102
8.97k
  }
1103
1104
0
  return 1;
1105
474k
}
1106
1107
26.8k
#define SPEAKER_PLANE_NORMAL 0
1108
7.82k
#define SPEAKER_PLANE_TOP 1
1109
26.5k
#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.56k
                               const UINT pceChMapLen) {
1176
1.56k
  const UCHAR *nElements = &pPce->NumFrontChannelElements;
1177
1.56k
  const UCHAR *elHeight[3], *elIsCpe[3];
1178
1.56k
  unsigned chIdx, plane, grp, offset, totCh[3], numCh[3][4];
1179
1180
1.56k
  FDK_ASSERT(pPce != NULL);
1181
1.56k
  FDK_ASSERT(pceChMap != NULL);
1182
1183
  /* Init counter: */
1184
1.56k
  FDKmemclear(totCh, 3 * sizeof(unsigned));
1185
1.56k
  FDKmemclear(numCh, 3 * 4 * sizeof(unsigned));
1186
1187
  /* Analyse PCE: */
1188
1.56k
  elHeight[0] = pPce->FrontElementHeightInfo;
1189
1.56k
  elIsCpe[0] = pPce->FrontElementIsCpe;
1190
1.56k
  elHeight[1] = pPce->SideElementHeightInfo;
1191
1.56k
  elIsCpe[1] = pPce->SideElementIsCpe;
1192
1.56k
  elHeight[2] = pPce->BackElementHeightInfo;
1193
1.56k
  elIsCpe[2] = pPce->BackElementIsCpe;
1194
1195
6.25k
  for (plane = 0; plane <= SPEAKER_PLANE_BOTTOM; plane += 1) {
1196
18.7k
    for (grp = 0; grp < 3; grp += 1) { /* front, side, back */
1197
14.0k
      unsigned el;
1198
28.7k
      for (el = 0; el < nElements[grp]; el += 1) {
1199
14.6k
        if (elHeight[grp][el] == plane) {
1200
4.88k
          unsigned elCh = elIsCpe[grp][el] ? 2 : 1;
1201
4.88k
          numCh[plane][grp] += elCh;
1202
4.88k
          totCh[plane] += elCh;
1203
4.88k
        }
1204
14.6k
      }
1205
14.0k
    }
1206
4.69k
    if (plane == SPEAKER_PLANE_NORMAL) {
1207
1.56k
      unsigned elCh = pPce->NumLfeChannelElements;
1208
1.56k
      numCh[plane][grp] += elCh;
1209
1.56k
      totCh[plane] += elCh;
1210
1.56k
    }
1211
4.69k
  }
1212
  /* Sanity checks: */
1213
1.56k
  chIdx = totCh[SPEAKER_PLANE_NORMAL] + totCh[SPEAKER_PLANE_TOP] +
1214
1.56k
          totCh[SPEAKER_PLANE_BOTTOM];
1215
1.56k
  if (chIdx > pceChMapLen) {
1216
0
    return -1;
1217
0
  }
1218
1219
  /* Create map: */
1220
1.56k
  offset = grp = 0;
1221
1.56k
  unsigned grpThresh = numCh[SPEAKER_PLANE_NORMAL][grp];
1222
9.17k
  for (chIdx = 0; chIdx < totCh[SPEAKER_PLANE_NORMAL]; chIdx += 1) {
1223
11.1k
    while ((chIdx >= grpThresh) && (grp < 3)) {
1224
3.57k
      offset += numCh[1][grp] + numCh[2][grp];
1225
3.57k
      grp += 1;
1226
3.57k
      grpThresh += numCh[SPEAKER_PLANE_NORMAL][grp];
1227
3.57k
    }
1228
7.61k
    pceChMap[chIdx] = chIdx + offset;
1229
7.61k
  }
1230
1.56k
  offset = 0;
1231
7.82k
  for (grp = 0; grp < 4; grp += 1) { /* front, side, back and lfe */
1232
6.25k
    offset += numCh[SPEAKER_PLANE_NORMAL][grp];
1233
18.7k
    for (plane = SPEAKER_PLANE_TOP; plane <= SPEAKER_PLANE_BOTTOM; plane += 1) {
1234
12.5k
      unsigned mapCh;
1235
12.5k
      for (mapCh = 0; mapCh < numCh[plane][grp]; mapCh += 1) {
1236
0
        pceChMap[chIdx++] = offset;
1237
0
        offset += 1;
1238
0
      }
1239
12.5k
    }
1240
6.25k
  }
1241
1.56k
  return 0;
1242
1.56k
}
1243
1244
int CProgramConfig_GetElementTable(const CProgramConfig *pPce,
1245
                                   MP4_ELEMENT_ID elList[],
1246
114k
                                   const INT elListSize, UCHAR *pChMapIdx) {
1247
114k
  int i, el = 0;
1248
1249
114k
  FDK_ASSERT(elList != NULL);
1250
114k
  FDK_ASSERT(pChMapIdx != NULL);
1251
114k
  FDK_ASSERT(pPce != NULL);
1252
1253
114k
  *pChMapIdx = 0;
1254
1255
114k
  if ((elListSize <
1256
114k
       pPce->NumFrontChannelElements + pPce->NumSideChannelElements +
1257
114k
           pPce->NumBackChannelElements + pPce->NumLfeChannelElements) ||
1258
114k
      (pPce->NumChannels == 0)) {
1259
195
    return 0;
1260
195
  }
1261
1262
125k
  for (i = 0; i < pPce->NumFrontChannelElements; i += 1) {
1263
11.1k
    elList[el++] = (pPce->FrontElementIsCpe[i]) ? ID_CPE : ID_SCE;
1264
11.1k
  }
1265
1266
132k
  for (i = 0; i < pPce->NumSideChannelElements; i += 1) {
1267
18.4k
    elList[el++] = (pPce->SideElementIsCpe[i]) ? ID_CPE : ID_SCE;
1268
18.4k
  }
1269
1270
533k
  for (i = 0; i < pPce->NumBackChannelElements; i += 1) {
1271
419k
    elList[el++] = (pPce->BackElementIsCpe[i]) ? ID_CPE : ID_SCE;
1272
419k
  }
1273
1274
229k
  for (i = 0; i < pPce->NumLfeChannelElements; i += 1) {
1275
115k
    elList[el++] = ID_LFE;
1276
115k
  }
1277
1278
  /* Find an corresponding channel configuration if possible */
1279
114k
  switch (pPce->NumChannels) {
1280
1.26k
    case 1:
1281
1.92k
    case 2:
1282
      /* One and two channels have no alternatives. */
1283
1.92k
      *pChMapIdx = pPce->NumChannels;
1284
1.92k
      break;
1285
492
    case 3:
1286
1.39k
    case 4:
1287
2.80k
    case 5:
1288
3.72k
    case 6: { /* Test if the number of channels can be used as channel config:
1289
               */
1290
3.72k
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1291
      /* Create a PCE for the config to test ... */
1292
3.72k
      CProgramConfig_GetDefault(tmpPce, pPce->NumChannels);
1293
      /* ... and compare it with the given one. */
1294
3.72k
      *pChMapIdx = (!(CProgramConfig_Compare(pPce, tmpPce) & 0xE))
1295
3.72k
                       ? pPce->NumChannels
1296
3.72k
                       : 0;
1297
      /* If compare result is 0 or 1 we can be sure that it is channel
1298
       * config 11. */
1299
3.72k
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1300
3.72k
    } break;
1301
1.47k
    case 7: {
1302
1.47k
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1303
      /* Create a PCE for the config to test ... */
1304
1.47k
      CProgramConfig_GetDefault(tmpPce, 11);
1305
      /* ... and compare it with the given one. */
1306
1.47k
      *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.47k
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1310
1.47k
    } break;
1311
106k
    case 8: { /* Try the four possible 7.1ch configurations. One after the
1312
                 other. */
1313
106k
      UCHAR testCfg[4] = {32, 14, 12, 7};
1314
106k
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1315
533k
      for (i = 0; i < 4; i += 1) {
1316
        /* Create a PCE for the config to test ... */
1317
427k
        CProgramConfig_GetDefault(tmpPce, testCfg[i]);
1318
        /* ... and compare it with the given one. */
1319
427k
        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
981
          *pChMapIdx = (testCfg[i] == 32) ? 12 : testCfg[i];
1325
981
        }
1326
427k
      }
1327
106k
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1328
106k
    } break;
1329
238
    default:
1330
      /* The PCE does not match any predefined channel configuration. */
1331
238
      *pChMapIdx = 0;
1332
238
      break;
1333
114k
  }
1334
1335
114k
  return el;
1336
114k
}
1337
1338
898k
static AUDIO_OBJECT_TYPE getAOT(HANDLE_FDK_BITSTREAM bs) {
1339
898k
  int tmp = 0;
1340
1341
898k
  tmp = FDKreadBits(bs, 5);
1342
898k
  if (tmp == AOT_ESCAPE) {
1343
399k
    int tmp2 = FDKreadBits(bs, 6);
1344
399k
    tmp = 32 + tmp2;
1345
399k
  }
1346
1347
898k
  return (AUDIO_OBJECT_TYPE)tmp;
1348
898k
}
1349
1350
1.13M
static INT getSampleRate(HANDLE_FDK_BITSTREAM bs, UCHAR *index, int nBits) {
1351
1.13M
  INT sampleRate;
1352
1.13M
  int idx;
1353
1354
1.13M
  idx = FDKreadBits(bs, nBits);
1355
1.13M
  if (idx == (1 << nBits) - 1) {
1356
27.2k
    if (FDKgetValidBits(bs) < 24) {
1357
475
      return 0;
1358
475
    }
1359
26.7k
    sampleRate = FDKreadBits(bs, 24);
1360
1.10M
  } else {
1361
1.10M
    sampleRate = SamplingRateTable[idx];
1362
1.10M
  }
1363
1364
1.13M
  *index = idx;
1365
1366
1.13M
  return sampleRate;
1367
1.13M
}
1368
1369
static TRANSPORTDEC_ERROR GaSpecificConfig_Parse(CSGaSpecificConfig *self,
1370
                                                 CSAudioSpecificConfig *asc,
1371
                                                 HANDLE_FDK_BITSTREAM bs,
1372
465k
                                                 UINT ascStartAnchor) {
1373
465k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1374
1375
465k
  self->m_frameLengthFlag = FDKreadBits(bs, 1);
1376
1377
465k
  self->m_dependsOnCoreCoder = FDKreadBits(bs, 1);
1378
1379
465k
  if (self->m_dependsOnCoreCoder) self->m_coreCoderDelay = FDKreadBits(bs, 14);
1380
1381
465k
  self->m_extensionFlag = FDKreadBits(bs, 1);
1382
1383
465k
  if (asc->m_channelConfiguration == 0) {
1384
145k
    CProgramConfig_Read(&asc->m_progrConfigElement, bs, ascStartAnchor);
1385
145k
  }
1386
1387
465k
  if ((asc->m_aot == AOT_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_SCAL)) {
1388
58.4k
    self->m_layer = FDKreadBits(bs, 3);
1389
58.4k
  }
1390
1391
465k
  if (self->m_extensionFlag) {
1392
173k
    if (asc->m_aot == AOT_ER_BSAC) {
1393
3.28k
      self->m_numOfSubFrame = FDKreadBits(bs, 5);
1394
3.28k
      self->m_layerLength = FDKreadBits(bs, 11);
1395
3.28k
    }
1396
1397
173k
    if ((asc->m_aot == AOT_ER_AAC_LC) || (asc->m_aot == AOT_ER_AAC_LTP) ||
1398
173k
        (asc->m_aot == AOT_ER_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_LD)) {
1399
42.8k
      asc->m_vcb11Flag = FDKreadBits(bs, 1); /* aacSectionDataResilienceFlag */
1400
42.8k
      asc->m_rvlcFlag =
1401
42.8k
          FDKreadBits(bs, 1); /* aacScalefactorDataResilienceFlag */
1402
42.8k
      asc->m_hcrFlag = FDKreadBits(bs, 1); /* aacSpectralDataResilienceFlag */
1403
42.8k
    }
1404
1405
173k
    self->m_extensionFlag3 = FDKreadBits(bs, 1);
1406
173k
  }
1407
465k
  return (ErrorStatus);
1408
465k
}
1409
1410
466k
static INT skipSbrHeader(HANDLE_FDK_BITSTREAM hBs, int isUsac) {
1411
  /* Dummy parse SbrDfltHeader() */
1412
466k
  INT dflt_header_extra1, dflt_header_extra2, bitsToSkip = 0;
1413
1414
466k
  if (!isUsac) {
1415
334k
    bitsToSkip = 6;
1416
334k
    FDKpushFor(hBs, 6); /* amp res 1, xover freq 3, reserved 2 */
1417
334k
  }
1418
466k
  bitsToSkip += 8;
1419
466k
  FDKpushFor(hBs, 8); /* start / stop freq */
1420
466k
  bitsToSkip += 2;
1421
466k
  dflt_header_extra1 = FDKreadBit(hBs);
1422
466k
  dflt_header_extra2 = FDKreadBit(hBs);
1423
466k
  bitsToSkip += 5 * dflt_header_extra1 + 6 * dflt_header_extra2;
1424
466k
  FDKpushFor(hBs, 5 * dflt_header_extra1 + 6 * dflt_header_extra2);
1425
1426
466k
  return bitsToSkip;
1427
466k
}
1428
1429
static INT ld_sbr_header(CSAudioSpecificConfig *asc, const INT dsFactor,
1430
94.5k
                         HANDLE_FDK_BITSTREAM hBs, CSTpCallBacks *cb) {
1431
94.5k
  const int channelConfiguration = asc->m_channelConfiguration;
1432
94.5k
  int i = 0, j = 0;
1433
94.5k
  INT error = 0;
1434
94.5k
  MP4_ELEMENT_ID element = ID_NONE;
1435
1436
  /* check whether the channelConfiguration is defined in
1437
   * channel_configuration_array */
1438
94.5k
  if (channelConfiguration < 0 ||
1439
94.5k
      channelConfiguration > (INT)(sizeof(channel_configuration_array) /
1440
94.5k
                                       sizeof(MP4_ELEMENT_ID **) -
1441
94.5k
                                   1)) {
1442
0
    return TRANSPORTDEC_PARSE_ERROR;
1443
0
  }
1444
1445
  /* read elements of the passed channel_configuration until there is ID_NONE */
1446
458k
  while ((element = channel_configuration_array[channelConfiguration][j]) !=
1447
458k
         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
371k
    if (element == ID_SCE || element == ID_CPE || element == ID_LFE) {
1453
371k
      error |= cb->cbSbr(
1454
371k
          cb->cbSbrData, hBs, asc->m_samplingFrequency / dsFactor,
1455
371k
          asc->m_extensionSamplingFrequency / dsFactor,
1456
371k
          asc->m_samplesPerFrame / dsFactor, AOT_ER_AAC_ELD, element, i++, 0, 0,
1457
371k
          asc->configMode, &asc->SbrConfigChanged, dsFactor);
1458
371k
      if (error != TRANSPORTDEC_OK) {
1459
8.13k
        goto bail;
1460
8.13k
      }
1461
371k
    }
1462
363k
    j++;
1463
363k
  }
1464
94.5k
bail:
1465
94.5k
  return error;
1466
94.5k
}
1467
1468
static TRANSPORTDEC_ERROR EldSpecificConfig_Parse(CSAudioSpecificConfig *asc,
1469
                                                  HANDLE_FDK_BITSTREAM hBs,
1470
176k
                                                  CSTpCallBacks *cb) {
1471
176k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1472
176k
  CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig;
1473
176k
  UINT eldExtType;
1474
176k
  int eldExtLen, len, cnt, ldSbrLen = 0, eldExtLenSum, numSbrHeader = 0,
1475
176k
                           sbrIndex, eldExtCnt = 0;
1476
1477
176k
  unsigned char downscale_fill_nibble;
1478
1479
176k
  FDKmemclear(esc, sizeof(CSEldSpecificConfig));
1480
1481
176k
  esc->m_frameLengthFlag = FDKreadBits(hBs, 1);
1482
176k
  if (esc->m_frameLengthFlag) {
1483
103k
    asc->m_samplesPerFrame = 480;
1484
103k
  } else {
1485
73.0k
    asc->m_samplesPerFrame = 512;
1486
73.0k
  }
1487
1488
176k
  asc->m_vcb11Flag = FDKreadBits(hBs, 1);
1489
176k
  asc->m_rvlcFlag = FDKreadBits(hBs, 1);
1490
176k
  asc->m_hcrFlag = FDKreadBits(hBs, 1);
1491
1492
176k
  esc->m_sbrPresentFlag = FDKreadBits(hBs, 1);
1493
1494
176k
  if (esc->m_sbrPresentFlag == 1) {
1495
103k
    esc->m_sbrSamplingRate =
1496
103k
        FDKreadBits(hBs, 1); /* 0: single rate, 1: dual rate */
1497
103k
    esc->m_sbrCrcFlag = FDKreadBits(hBs, 1);
1498
1499
103k
    asc->m_extensionSamplingFrequency = asc->m_samplingFrequency
1500
103k
                                        << esc->m_sbrSamplingRate;
1501
1502
103k
    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
103k
      switch (asc->m_channelConfiguration) {
1507
6.06k
        case 1:
1508
22.8k
        case 2:
1509
22.8k
          numSbrHeader = 1;
1510
22.8k
          break;
1511
645
        case 3:
1512
645
          numSbrHeader = 2;
1513
645
          break;
1514
5.00k
        case 4:
1515
5.70k
        case 5:
1516
6.56k
        case 6:
1517
6.56k
          numSbrHeader = 3;
1518
6.56k
          break;
1519
5.19k
        case 7:
1520
27.2k
        case 11:
1521
33.7k
        case 12:
1522
72.6k
        case 14:
1523
72.6k
          numSbrHeader = 4;
1524
72.6k
          break;
1525
350
        default:
1526
350
          numSbrHeader = 0;
1527
350
          break;
1528
103k
      }
1529
437k
      for (sbrIndex = 0; sbrIndex < numSbrHeader; sbrIndex++) {
1530
334k
        ldSbrLen += skipSbrHeader(hBs, 0);
1531
334k
      }
1532
103k
    } else {
1533
0
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1534
0
    }
1535
103k
  }
1536
176k
  esc->m_useLdQmfTimeAlign = 0;
1537
1538
  /* new ELD syntax */
1539
176k
  eldExtLenSum = FDKgetValidBits(hBs);
1540
176k
  esc->m_downscaledSamplingFrequency = asc->m_samplingFrequency;
1541
  /* parse ExtTypeConfigData */
1542
501k
  while (((eldExtType = FDKreadBits(hBs, 4)) != ELDEXT_TERM) &&
1543
348k
         ((INT)FDKgetValidBits(hBs) >= 0) && (eldExtCnt++ < 15)) {
1544
342k
    eldExtLen = len = FDKreadBits(hBs, 4);
1545
342k
    if (len == 0xf) {
1546
11.8k
      len = FDKreadBits(hBs, 8);
1547
11.8k
      eldExtLen += len;
1548
1549
11.8k
      if (len == 0xff) {
1550
2.51k
        len = FDKreadBits(hBs, 16);
1551
2.51k
        eldExtLen += len;
1552
2.51k
      }
1553
11.8k
    }
1554
1555
342k
    switch (eldExtType) {
1556
67.6k
      case ELDEXT_LDSAC:
1557
67.6k
        esc->m_useLdQmfTimeAlign = 1;
1558
67.6k
        if (cb->cbSsc != NULL) {
1559
67.6k
          ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc(
1560
67.6k
              cb->cbSscData, hBs, asc->m_aot,
1561
67.6k
              asc->m_samplingFrequency << esc->m_sbrSamplingRate,
1562
67.6k
              asc->m_samplesPerFrame << esc->m_sbrSamplingRate,
1563
67.6k
              asc->m_channelConfiguration, 1, /* stereoConfigIndex */
1564
67.6k
              -1, /* nTimeSlots: read from bitstream */
1565
67.6k
              eldExtLen, asc->configMode, &asc->SacConfigChanged);
1566
67.6k
          if (ErrorStatus != TRANSPORTDEC_OK) {
1567
14.8k
            return TRANSPORTDEC_PARSE_ERROR;
1568
14.8k
          }
1569
52.7k
          if (esc->m_downscaledSamplingFrequency != asc->m_samplingFrequency) {
1570
218
            return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled
1571
                                                       mode not allowed */
1572
218
          }
1573
52.5k
          break;
1574
52.7k
        }
1575
1576
0
        FDK_FALLTHROUGH;
1577
253k
      default:
1578
104M
        for (cnt = 0; cnt < eldExtLen; cnt++) {
1579
104M
          FDKreadBits(hBs, 8);
1580
104M
        }
1581
253k
        break;
1582
1583
21.1k
      case ELDEXT_DOWNSCALEINFO:
1584
21.1k
        UCHAR tmpDownscaleFreqIdx;
1585
21.1k
        esc->m_downscaledSamplingFrequency =
1586
21.1k
            getSampleRate(hBs, &tmpDownscaleFreqIdx, 4);
1587
21.1k
        if (esc->m_downscaledSamplingFrequency == 0 ||
1588
20.8k
            esc->m_downscaledSamplingFrequency > 96000) {
1589
574
          return TRANSPORTDEC_PARSE_ERROR;
1590
574
        }
1591
20.5k
        downscale_fill_nibble = FDKreadBits(hBs, 4);
1592
20.5k
        if (downscale_fill_nibble != 0x0) {
1593
1.46k
          return TRANSPORTDEC_PARSE_ERROR;
1594
1.46k
        }
1595
19.0k
        if (esc->m_useLdQmfTimeAlign == 1) {
1596
313
          return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled
1597
                                                     mode not allowed */
1598
313
        }
1599
18.7k
        break;
1600
342k
    }
1601
342k
  }
1602
159k
  if (eldExtType != ELDEXT_TERM) {
1603
5.84k
    return TRANSPORTDEC_PARSE_ERROR;
1604
5.84k
  }
1605
1606
153k
  if ((INT)FDKgetValidBits(hBs) < 0) {
1607
1.11k
    return TRANSPORTDEC_PARSE_ERROR;
1608
1.11k
  }
1609
1610
152k
  if (esc->m_sbrPresentFlag == 1 && numSbrHeader != 0) {
1611
95.0k
    INT dsFactor = 1; /* Downscale factor must be 1 or even for SBR */
1612
95.0k
    if (esc->m_downscaledSamplingFrequency != 0) {
1613
95.0k
      if (asc->m_samplingFrequency % esc->m_downscaledSamplingFrequency != 0) {
1614
211
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1615
211
      }
1616
94.8k
      dsFactor = asc->m_samplingFrequency / esc->m_downscaledSamplingFrequency;
1617
94.8k
      if (dsFactor != 1 && (dsFactor)&1) {
1618
278
        return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* SBR needs an even downscale
1619
                                                   factor */
1620
278
      }
1621
94.5k
      if (dsFactor != 1 && dsFactor != 2 && dsFactor != 4) {
1622
1.92k
        dsFactor = 1; /* don't apply dsf for not yet supported even dsfs */
1623
1.92k
      }
1624
94.5k
      if ((INT)asc->m_samplesPerFrame % dsFactor != 0) {
1625
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* frameSize/dsf must be an
1626
                                                   integer number */
1627
0
      }
1628
94.5k
    }
1629
94.5k
    eldExtLenSum = eldExtLenSum - FDKgetValidBits(hBs);
1630
94.5k
    FDKpushBack(hBs, eldExtLenSum + ldSbrLen);
1631
94.5k
    if (0 != ld_sbr_header(asc, dsFactor, hBs, cb)) {
1632
8.13k
      return TRANSPORTDEC_PARSE_ERROR;
1633
8.13k
    }
1634
86.4k
    FDKpushFor(hBs, eldExtLenSum);
1635
86.4k
  }
1636
143k
  return (ErrorStatus);
1637
152k
}
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
360k
    UCHAR *configTargetBuffer, const USHORT configTargetBufferSize_bytes) {
1648
360k
  FDK_BITSTREAM usacConf;
1649
360k
  UINT const nBits = fAbs(configSize_bits);
1650
360k
  UINT j, tmp;
1651
1652
360k
  if (nBits > 8 * (UINT)configTargetBufferSize_bytes) {
1653
3.20k
    return 1;
1654
3.20k
  }
1655
357k
  FDKmemclear(configTargetBuffer, configTargetBufferSize_bytes);
1656
1657
357k
  FDKinitBitStream(&usacConf, configTargetBuffer, configTargetBufferSize_bytes,
1658
357k
                   nBits, BS_WRITER);
1659
357k
  if (configSize_bits < 0) {
1660
357k
    FDKpushBack(hBs, nBits);
1661
357k
  }
1662
1.10M
  for (j = nBits; j > 31; j -= 32) {
1663
748k
    tmp = FDKreadBits(hBs, 32);
1664
748k
    FDKwriteBits(&usacConf, tmp, 32);
1665
748k
  }
1666
357k
  if (j > 0) {
1667
355k
    tmp = FDKreadBits(hBs, j);
1668
355k
    FDKwriteBits(&usacConf, tmp, j);
1669
355k
  }
1670
357k
  FDKsyncCache(&usacConf);
1671
357k
  if (configSize_bits > 0) {
1672
0
    FDKpushBack(hBs, nBits);
1673
0
  }
1674
1675
357k
  return 0;
1676
360k
}
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
213k
                                           const AUDIO_OBJECT_TYPE aot) {
1695
213k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1696
1697
213k
  UINT usacExtElementType = escapedValue(hBs, 4, 8, 16);
1698
1699
  /* recurve extension elements which are invalid for USAC */
1700
213k
  if (aot == AOT_USAC) {
1701
213k
    switch (usacExtElementType) {
1702
29.6k
      case ID_EXT_ELE_FILL:
1703
30.0k
      case ID_EXT_ELE_MPEGS:
1704
34.1k
      case ID_EXT_ELE_SAOC:
1705
40.5k
      case ID_EXT_ELE_AUDIOPREROLL:
1706
148k
      case ID_EXT_ELE_UNI_DRC:
1707
148k
        break;
1708
64.9k
      default:
1709
64.9k
        usacExtElementType = ID_EXT_ELE_UNKNOWN;
1710
64.9k
        break;
1711
213k
    }
1712
213k
  }
1713
1714
213k
  int usacExtElementConfigLength = escapedValue(hBs, 4, 8, 16);
1715
213k
  extElement->usacExtElementConfigLength = (USHORT)usacExtElementConfigLength;
1716
213k
  INT bsAnchor;
1717
1718
213k
  if (FDKreadBit(hBs)) /* usacExtElementDefaultLengthPresent */
1719
6.48k
    extElement->usacExtElementDefaultLength = escapedValue(hBs, 8, 16, 0) + 1;
1720
207k
  else
1721
207k
    extElement->usacExtElementDefaultLength = 0;
1722
1723
213k
  extElement->usacExtElementPayloadFrag = FDKreadBit(hBs);
1724
1725
213k
  bsAnchor = (INT)FDKgetValidBits(hBs);
1726
1727
213k
  switch (usacExtElementType) {
1728
64.9k
    case ID_EXT_ELE_UNKNOWN:
1729
94.6k
    case ID_EXT_ELE_FILL:
1730
94.6k
      break;
1731
6.37k
    case ID_EXT_ELE_AUDIOPREROLL:
1732
      /* No configuration element */
1733
6.37k
      extElement->usacExtElementHasAudioPreRoll = 1;
1734
6.37k
      break;
1735
108k
    case ID_EXT_ELE_UNI_DRC: {
1736
108k
      if (cb->cbUniDrc != NULL) {
1737
108k
        ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1738
108k
            cb->cbUniDrcData, hBs, usacExtElementConfigLength,
1739
108k
            0, /* uniDrcConfig */
1740
108k
            subStreamIndex, 0, aot);
1741
108k
        if (ErrorStatus != TRANSPORTDEC_OK) {
1742
0
          return ErrorStatus;
1743
0
        }
1744
108k
      }
1745
108k
    } break;
1746
108k
    default:
1747
4.52k
      usacExtElementType = ID_EXT_ELE_UNKNOWN;
1748
4.52k
      break;
1749
213k
  }
1750
213k
  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
213k
  {
1755
213k
    INT left_bits = (usacExtElementConfigLength << 3) -
1756
213k
                    (bsAnchor - (INT)FDKgetValidBits(hBs));
1757
213k
    if (left_bits >= 0) {
1758
207k
      FDKpushFor(hBs, left_bits);
1759
207k
    } else {
1760
      /* parsed too many bits */
1761
5.72k
      ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
1762
5.72k
    }
1763
213k
  }
1764
1765
213k
  return ErrorStatus;
1766
213k
}
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
10.6k
                                          const CSTpCallBacks *cb) {
1776
10.6k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1777
1778
10.6k
  int numConfigExtensions;
1779
10.6k
  UINT usacConfigExtType;
1780
10.6k
  int usacConfigExtLength;
1781
10.6k
  int loudnessInfoSetIndex =
1782
10.6k
      -1; /* index of loudnessInfoSet config extension. -1 if not contained. */
1783
10.6k
  int tmp_subStreamIndex = 0;
1784
10.6k
  AUDIO_OBJECT_TYPE tmp_aot = AOT_USAC;
1785
1786
10.6k
  numConfigExtensions = (int)escapedValue(hBs, 2, 4, 8) + 1;
1787
104k
  for (int confExtIdx = 0; confExtIdx < numConfigExtensions; confExtIdx++) {
1788
101k
    INT nbits;
1789
101k
    int loudnessInfoSetConfigExtensionPosition = FDKgetValidBits(hBs);
1790
101k
    usacConfigExtType = escapedValue(hBs, 4, 8, 16);
1791
101k
    usacConfigExtLength = (int)escapedValue(hBs, 4, 8, 16);
1792
1793
    /* Start bit position of config extension */
1794
101k
    nbits = (INT)FDKgetValidBits(hBs);
1795
1796
    /* Return an error in case the bitbuffer fill level is too low. */
1797
101k
    if (nbits < usacConfigExtLength * 8) {
1798
3.01k
      return TRANSPORTDEC_PARSE_ERROR;
1799
3.01k
    }
1800
1801
98.3k
    switch (usacConfigExtType) {
1802
33.6k
      case ID_CONFIG_EXT_FILL:
1803
36.4k
        for (int i = 0; i < usacConfigExtLength; i++) {
1804
3.87k
          if (FDKreadBits(hBs, 8) != 0xa5) {
1805
1.07k
            return TRANSPORTDEC_PARSE_ERROR;
1806
1.07k
          }
1807
3.87k
        }
1808
32.5k
        break;
1809
32.5k
      case ID_CONFIG_EXT_LOUDNESS_INFO: {
1810
10.8k
        if (cb->cbUniDrc != NULL) {
1811
10.8k
          ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1812
10.8k
              cb->cbUniDrcData, hBs, usacConfigExtLength,
1813
10.8k
              1, /* loudnessInfoSet */
1814
10.8k
              tmp_subStreamIndex, loudnessInfoSetConfigExtensionPosition,
1815
10.8k
              tmp_aot);
1816
10.8k
          if (ErrorStatus != TRANSPORTDEC_OK) {
1817
0
            return ErrorStatus;
1818
0
          }
1819
10.8k
          loudnessInfoSetIndex = confExtIdx;
1820
10.8k
        }
1821
10.8k
      } break;
1822
53.8k
      default:
1823
53.8k
        break;
1824
98.3k
    }
1825
1826
    /* Skip remaining bits. If too many bits were parsed, assume error. */
1827
97.2k
    usacConfigExtLength =
1828
97.2k
        8 * usacConfigExtLength - (nbits - (INT)FDKgetValidBits(hBs));
1829
97.2k
    if (usacConfigExtLength < 0) {
1830
3.03k
      return TRANSPORTDEC_PARSE_ERROR;
1831
3.03k
    }
1832
94.2k
    FDKpushFor(hBs, usacConfigExtLength);
1833
94.2k
  }
1834
1835
3.49k
  if (loudnessInfoSetIndex == -1 && cb->cbUniDrc != NULL) {
1836
    /* no loudnessInfoSet contained. Clear the loudnessInfoSet struct by feeding
1837
     * an empty config extension */
1838
1.44k
    ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1839
1.44k
        cb->cbUniDrcData, NULL, 0, 1 /* loudnessInfoSet */, tmp_subStreamIndex,
1840
1.44k
        0, tmp_aot);
1841
1.44k
    if (ErrorStatus != TRANSPORTDEC_OK) {
1842
0
      return ErrorStatus;
1843
0
    }
1844
1.44k
  }
1845
1846
3.49k
  return ErrorStatus;
1847
3.49k
}
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
211k
    const CSTpCallBacks *cb) {
1856
211k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1857
211k
  CSUsacConfig *usc = &asc->m_sc.m_usacConfig;
1858
211k
  int i, numberOfElements;
1859
211k
  int channelElementIdx =
1860
211k
      0; /* index for elements which contain audio channels (sce, cpe, lfe) */
1861
211k
  SC_CHANNEL_CONFIG sc_chan_config = {0, 0, 0, 0};
1862
211k
  int uniDrcElement =
1863
211k
      -1; /* index of uniDrc extension element. -1 if not contained. */
1864
1865
211k
  numberOfElements = (int)escapedValue(hBs, 4, 8, 16) + 1;
1866
211k
  usc->m_usacNumElements = numberOfElements;
1867
211k
  if (numberOfElements > TP_USAC_MAX_ELEMENTS) {
1868
784
    return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1869
784
  }
1870
210k
  usc->m_nUsacChannels = 0;
1871
210k
  usc->m_channelConfigurationIndex = asc->m_channelConfiguration;
1872
1873
210k
  if (asc->m_aot == AOT_USAC) {
1874
210k
    sc_chan_config = sc_chan_config_tab[usc->m_channelConfigurationIndex];
1875
1876
210k
    if (sc_chan_config.nCh > (SCHAR)TP_USAC_MAX_SPEAKERS) {
1877
0
      return TRANSPORTDEC_PARSE_ERROR;
1878
0
    }
1879
210k
  }
1880
1881
613k
  for (i = 0; i < numberOfElements; i++) {
1882
422k
    MP4_ELEMENT_ID usacElementType = (MP4_ELEMENT_ID)(
1883
422k
        FDKreadBits(hBs, 2) | USAC_ID_BIT); /* set USAC_ID_BIT to map
1884
                                               usacElementType to
1885
                                               MP4_ELEMENT_ID enum */
1886
422k
    usc->element[i].usacElementType = usacElementType;
1887
1888
    /* sanity check: update element counter */
1889
422k
    if (asc->m_aot == AOT_USAC) {
1890
422k
      switch (usacElementType) {
1891
66.8k
        case ID_USAC_SCE:
1892
66.8k
          sc_chan_config.nSCE--;
1893
66.8k
          break;
1894
139k
        case ID_USAC_CPE:
1895
139k
          sc_chan_config.nCPE--;
1896
139k
          break;
1897
2.08k
        case ID_USAC_LFE:
1898
2.08k
          sc_chan_config.nLFE--;
1899
2.08k
          break;
1900
213k
        default:
1901
213k
          break;
1902
422k
      }
1903
422k
      if (usc->m_channelConfigurationIndex) {
1904
        /* sanity check: no element counter may be smaller zero */
1905
422k
        if (sc_chan_config.nCPE < 0 || sc_chan_config.nSCE < 0 ||
1906
417k
            sc_chan_config.nLFE < 0) {
1907
7.47k
          return TRANSPORTDEC_PARSE_ERROR;
1908
7.47k
        }
1909
422k
      }
1910
422k
    }
1911
1912
415k
    switch (usacElementType) {
1913
62.9k
      case ID_USAC_SCE:
1914
        /* UsacCoreConfig() ISO/IEC FDIS 23003-3  Table 10 */
1915
62.9k
        if (FDKreadBit(hBs)) { /* tw_mdct */
1916
491
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1917
491
        }
1918
62.4k
        usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1);
1919
        /* end of UsacCoreConfig() */
1920
62.4k
        if (usc->m_sbrRatioIndex > 0) {
1921
35.3k
          if (cb->cbSbr == NULL) {
1922
0
            return TRANSPORTDEC_UNKOWN_ERROR;
1923
0
          }
1924
          /* SbrConfig() ISO/IEC FDIS 23003-3  Table 11 */
1925
35.3k
          usc->element[i].m_harmonicSBR = FDKreadBit(hBs);
1926
35.3k
          usc->element[i].m_interTes = FDKreadBit(hBs);
1927
35.3k
          usc->element[i].m_pvc = FDKreadBit(hBs);
1928
35.3k
          if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
1929
35.3k
                        asc->m_extensionSamplingFrequency,
1930
35.3k
                        asc->m_samplesPerFrame, asc->m_aot, ID_SCE,
1931
35.3k
                        channelElementIdx, usc->element[i].m_harmonicSBR,
1932
35.3k
                        usc->element[i].m_stereoConfigIndex, asc->configMode,
1933
35.3k
                        &asc->SbrConfigChanged, 1)) {
1934
278
            return TRANSPORTDEC_PARSE_ERROR;
1935
278
          }
1936
          /* end of SbrConfig() */
1937
35.3k
        }
1938
62.1k
        usc->m_nUsacChannels += 1;
1939
62.1k
        channelElementIdx++;
1940
62.1k
        break;
1941
1942
138k
      case ID_USAC_CPE:
1943
        /* UsacCoreConfig() ISO/IEC FDIS 23003-3  Table 10 */
1944
138k
        if (FDKreadBit(hBs)) { /* tw_mdct */
1945
279
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1946
279
        }
1947
138k
        usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1);
1948
        /* end of UsacCoreConfig() */
1949
138k
        if (usc->m_sbrRatioIndex > 0) {
1950
132k
          if (cb->cbSbr == NULL) return TRANSPORTDEC_UNKOWN_ERROR;
1951
          /* SbrConfig() ISO/IEC FDIS 23003-3 */
1952
132k
          usc->element[i].m_harmonicSBR = FDKreadBit(hBs);
1953
132k
          usc->element[i].m_interTes = FDKreadBit(hBs);
1954
132k
          usc->element[i].m_pvc = FDKreadBit(hBs);
1955
132k
          {
1956
132k
            INT bitsToSkip = skipSbrHeader(hBs, 1);
1957
            /* read stereoConfigIndex */
1958
132k
            usc->element[i].m_stereoConfigIndex = FDKreadBits(hBs, 2);
1959
            /* rewind */
1960
132k
            FDKpushBack(hBs, bitsToSkip + 2);
1961
132k
          }
1962
132k
          {
1963
132k
            MP4_ELEMENT_ID el_type =
1964
132k
                (usc->element[i].m_stereoConfigIndex == 1 ||
1965
86.4k
                 usc->element[i].m_stereoConfigIndex == 2)
1966
132k
                    ? ID_SCE
1967
132k
                    : ID_CPE;
1968
132k
            if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
1969
132k
                          asc->m_extensionSamplingFrequency,
1970
132k
                          asc->m_samplesPerFrame, asc->m_aot, el_type,
1971
132k
                          channelElementIdx, usc->element[i].m_harmonicSBR,
1972
132k
                          usc->element[i].m_stereoConfigIndex, asc->configMode,
1973
132k
                          &asc->SbrConfigChanged, 1)) {
1974
1.62k
              return TRANSPORTDEC_PARSE_ERROR;
1975
1.62k
            }
1976
132k
          }
1977
          /* end of SbrConfig() */
1978
1979
130k
          usc->element[i].m_stereoConfigIndex =
1980
130k
              FDKreadBits(hBs, 2); /* Needed in RM5 syntax */
1981
1982
130k
          if (usc->element[i].m_stereoConfigIndex > 0) {
1983
80.6k
            if (cb->cbSsc != NULL) {
1984
80.6k
              int samplesPerFrame = asc->m_samplesPerFrame;
1985
1986
80.6k
              if (usc->m_sbrRatioIndex == 1) samplesPerFrame <<= 2;
1987
80.6k
              if (usc->m_sbrRatioIndex == 2)
1988
13.7k
                samplesPerFrame = (samplesPerFrame * 8) / 3;
1989
80.6k
              if (usc->m_sbrRatioIndex == 3) samplesPerFrame <<= 1;
1990
1991
              /* Mps212Config() ISO/IEC FDIS 23003-3 */
1992
80.6k
              if (cb->cbSsc(cb->cbSscData, hBs, asc->m_aot,
1993
80.6k
                            asc->m_extensionSamplingFrequency, samplesPerFrame,
1994
80.6k
                            1, /* only downmix channels (residual channels are
1995
                                  not counted) */
1996
80.6k
                            usc->element[i].m_stereoConfigIndex,
1997
80.6k
                            usc->m_coreSbrFrameLengthIndex,
1998
80.6k
                            0, /* don't know the length */
1999
80.6k
                            asc->configMode, &asc->SacConfigChanged)) {
2000
3.65k
                return TRANSPORTDEC_PARSE_ERROR;
2001
3.65k
              }
2002
              /* end of Mps212Config() */
2003
80.6k
            } else {
2004
0
              return TRANSPORTDEC_UNKOWN_ERROR;
2005
0
            }
2006
80.6k
          }
2007
130k
        } else {
2008
5.86k
          usc->element[i].m_stereoConfigIndex = 0;
2009
5.86k
        }
2010
132k
        usc->m_nUsacChannels += 2;
2011
2012
132k
        channelElementIdx++;
2013
132k
        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
213k
      case ID_USAC_EXT:
2037
213k
        ErrorStatus = extElementConfig(&usc->element[i].extElement, hBs, cb, 0,
2038
213k
                                       asc->m_samplesPerFrame, 0, asc->m_aot);
2039
213k
        if (usc->element[i].extElement.usacExtElementType ==
2040
213k
            ID_EXT_ELE_UNI_DRC) {
2041
108k
          uniDrcElement = i;
2042
108k
        }
2043
2044
213k
        if (ErrorStatus) {
2045
5.72k
          return ErrorStatus;
2046
5.72k
        }
2047
207k
        break;
2048
2049
207k
      default:
2050
        /* non USAC-element encountered */
2051
0
        return TRANSPORTDEC_PARSE_ERROR;
2052
415k
    }
2053
415k
  }
2054
2055
191k
  if (asc->m_aot == AOT_USAC) {
2056
191k
    if (usc->m_channelConfigurationIndex) {
2057
      /* sanity check: all element counter must be zero */
2058
191k
      if (sc_chan_config.nCPE | sc_chan_config.nSCE | sc_chan_config.nLFE) {
2059
2.39k
        return TRANSPORTDEC_PARSE_ERROR;
2060
2.39k
      }
2061
191k
    } 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
191k
  }
2070
2071
188k
  if (uniDrcElement == -1 && cb->cbUniDrc != NULL) {
2072
    /* no uniDrcConfig contained. Clear the uniDrcConfig struct by feeding an
2073
     * empty extension element */
2074
181k
    int subStreamIndex = 0;
2075
181k
    ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
2076
181k
        cb->cbUniDrcData, NULL, 0, 0 /* uniDrcConfig */, subStreamIndex, 0,
2077
181k
        asc->m_aot);
2078
181k
    if (ErrorStatus != TRANSPORTDEC_OK) {
2079
0
      return ErrorStatus;
2080
0
    }
2081
181k
  }
2082
2083
188k
  return ErrorStatus;
2084
188k
}
2085
2086
/* Mapping of coreSbrFrameLengthIndex defined by Table 70 in ISO/IEC 23003-3 */
2087
static TRANSPORTDEC_ERROR UsacConfig_SetCoreSbrFrameLengthIndex(
2088
216k
    CSAudioSpecificConfig *asc, int coreSbrFrameLengthIndex) {
2089
216k
  int sbrRatioIndex_val;
2090
2091
216k
  if (coreSbrFrameLengthIndex > 4) {
2092
1.16k
    return TRANSPORTDEC_PARSE_ERROR; /* reserved values */
2093
1.16k
  }
2094
214k
  asc->m_sc.m_usacConfig.m_coreSbrFrameLengthIndex = coreSbrFrameLengthIndex;
2095
214k
  asc->m_samplesPerFrame = usacFrameLength[coreSbrFrameLengthIndex];
2096
214k
  sbrRatioIndex_val = sbrRatioIndex[coreSbrFrameLengthIndex];
2097
214k
  asc->m_sc.m_usacConfig.m_sbrRatioIndex = sbrRatioIndex_val;
2098
2099
214k
  if (sbrRatioIndex_val > 0) {
2100
174k
    asc->m_sbrPresentFlag = 1;
2101
174k
    asc->m_extensionSamplingFrequency = asc->m_samplingFrequency;
2102
174k
    asc->m_extensionSamplingFrequencyIndex = asc->m_samplingFrequencyIndex;
2103
174k
    switch (sbrRatioIndex_val) {
2104
30.3k
      case 1: /* sbrRatio = 4:1 */
2105
30.3k
        asc->m_samplingFrequency >>= 2;
2106
30.3k
        asc->m_samplesPerFrame >>= 2;
2107
30.3k
        break;
2108
57.9k
      case 2: /* sbrRatio = 8:3 */
2109
57.9k
        asc->m_samplingFrequency = (asc->m_samplingFrequency * 3) / 8;
2110
57.9k
        asc->m_samplesPerFrame = (asc->m_samplesPerFrame * 3) / 8;
2111
57.9k
        break;
2112
85.8k
      case 3: /* sbrRatio = 2:1 */
2113
85.8k
        asc->m_samplingFrequency >>= 1;
2114
85.8k
        asc->m_samplesPerFrame >>= 1;
2115
85.8k
        break;
2116
0
      default:
2117
0
        return TRANSPORTDEC_PARSE_ERROR;
2118
174k
    }
2119
174k
    asc->m_samplingFrequencyIndex =
2120
174k
        getSamplingRateIndex(asc->m_samplingFrequency, 4);
2121
174k
  }
2122
2123
214k
  return TRANSPORTDEC_OK;
2124
214k
}
2125
2126
static TRANSPORTDEC_ERROR UsacConfig_Parse(CSAudioSpecificConfig *asc,
2127
                                           HANDLE_FDK_BITSTREAM hBs,
2128
216k
                                           CSTpCallBacks *cb) {
2129
216k
  int usacSamplingFrequency, channelConfigurationIndex, coreSbrFrameLengthIndex;
2130
216k
  TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK;
2131
2132
  /* Start bit position of usacConfig */
2133
216k
  INT nbits = (INT)FDKgetValidBits(hBs);
2134
2135
216k
  usacSamplingFrequency = getSampleRate(hBs, &asc->m_samplingFrequencyIndex, 5);
2136
216k
  if (usacSamplingFrequency == 0 || usacSamplingFrequency > 96000) {
2137
666
    return TRANSPORTDEC_PARSE_ERROR;
2138
666
  }
2139
216k
  asc->m_samplingFrequency = (UINT)usacSamplingFrequency;
2140
2141
216k
  coreSbrFrameLengthIndex = FDKreadBits(hBs, 3);
2142
216k
  if (UsacConfig_SetCoreSbrFrameLengthIndex(asc, coreSbrFrameLengthIndex) !=
2143
216k
      TRANSPORTDEC_OK) {
2144
1.16k
    return TRANSPORTDEC_PARSE_ERROR;
2145
1.16k
  }
2146
2147
214k
  channelConfigurationIndex = FDKreadBits(hBs, 5);
2148
214k
  if (channelConfigurationIndex > 2) {
2149
2.55k
    return TRANSPORTDEC_PARSE_ERROR; /* only channelConfigurationIndex = [1,2]
2150
                                        are supported */
2151
2.55k
  }
2152
2153
212k
  if (channelConfigurationIndex == 0) {
2154
921
    return TRANSPORTDEC_PARSE_ERROR; /* only channelConfigurationIndex = [1,2]
2155
                                        are supported */
2156
921
  }
2157
211k
  asc->m_channelConfiguration = channelConfigurationIndex;
2158
2159
211k
  err = UsacRsv60DecoderConfig_Parse(asc, hBs, cb);
2160
211k
  if (err != TRANSPORTDEC_OK) {
2161
22.7k
    return err;
2162
22.7k
  }
2163
2164
188k
  if (FDKreadBits(hBs, 1)) { /* usacConfigExtensionPresent */
2165
10.6k
    err = configExtension(&asc->m_sc.m_usacConfig, hBs, cb);
2166
10.6k
    if (err != TRANSPORTDEC_OK) {
2167
7.11k
      return err;
2168
7.11k
    }
2169
178k
  } else if (cb->cbUniDrc != NULL) {
2170
    /* no loudnessInfoSet contained. Clear the loudnessInfoSet struct by feeding
2171
     * an empty config extension */
2172
178k
    err = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
2173
178k
        cb->cbUniDrcData, NULL, 0, 1 /* loudnessInfoSet */, 0, 0, asc->m_aot);
2174
178k
    if (err != TRANSPORTDEC_OK) {
2175
0
      return err;
2176
0
    }
2177
178k
  }
2178
2179
  /* sanity check whether number of channels signaled in UsacDecoderConfig()
2180
     matches the number of channels required by channelConfigurationIndex */
2181
181k
  if ((channelConfigurationIndex > 0) &&
2182
181k
      (sc_chan_config_tab[channelConfigurationIndex].nCh !=
2183
181k
       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
181k
  INT configSize_bits = (INT)FDKgetValidBits(hBs) - nbits;
2189
181k
  if (StoreConfigAsBitstream(hBs, configSize_bits,
2190
181k
                             asc->m_sc.m_usacConfig.UsacConfig,
2191
181k
                             TP_USAC_MAX_CONFIG_LEN)) {
2192
2.97k
    return TRANSPORTDEC_PARSE_ERROR;
2193
2.97k
  }
2194
178k
  asc->m_sc.m_usacConfig.UsacConfigBits = fAbs(configSize_bits);
2195
2196
178k
  return err;
2197
181k
}
2198
2199
static TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse(
2200
6.56k
    CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, CSTpCallBacks *cb) {
2201
6.56k
  TP_ASC_EXTENSION_ID lastAscExt, ascExtId = ASCEXT_UNKOWN;
2202
6.56k
  INT bitsAvailable = (INT)FDKgetValidBits(bs);
2203
2204
15.7k
  while (bitsAvailable >= 11) {
2205
11.8k
    lastAscExt = ascExtId;
2206
11.8k
    ascExtId = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11);
2207
11.8k
    bitsAvailable -= 11;
2208
2209
11.8k
    switch (ascExtId) {
2210
3.52k
      case ASCEXT_SBR: /* 0x2b7 */
2211
3.52k
        if ((self->m_extensionAudioObjectType != AOT_SBR) &&
2212
3.31k
            (bitsAvailable >= 5)) {
2213
3.00k
          self->m_extensionAudioObjectType = getAOT(bs);
2214
2215
3.00k
          if ((self->m_extensionAudioObjectType == AOT_SBR) ||
2216
2.17k
              (self->m_extensionAudioObjectType ==
2217
2.17k
               AOT_ER_BSAC)) { /* Get SBR extension configuration */
2218
2.04k
            self->m_sbrPresentFlag = FDKreadBits(bs, 1);
2219
2.04k
            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
2.04k
            if (self->m_sbrPresentFlag == 1) {
2225
1.00k
              self->m_extensionSamplingFrequency = getSampleRate(
2226
1.00k
                  bs, &self->m_extensionSamplingFrequencyIndex, 4);
2227
2228
1.00k
              if (self->m_extensionSamplingFrequency == 0 ||
2229
818
                  self->m_extensionSamplingFrequency > 96000) {
2230
200
                return TRANSPORTDEC_PARSE_ERROR;
2231
200
              }
2232
1.00k
            }
2233
1.84k
            if (self->m_extensionAudioObjectType == AOT_ER_BSAC) {
2234
1.01k
              self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
2235
1.01k
            }
2236
1.84k
          }
2237
          /* Update counter because of variable length fields (AOT and sampling
2238
           * rate) */
2239
2.80k
          bitsAvailable = (INT)FDKgetValidBits(bs);
2240
2.80k
        }
2241
3.32k
        break;
2242
3.32k
      case ASCEXT_PS: /* 0x548 */
2243
1.46k
        if ((lastAscExt == ASCEXT_SBR) &&
2244
1.40k
            (self->m_extensionAudioObjectType == AOT_SBR) &&
2245
585
            (bitsAvailable > 0)) { /* Get PS extension configuration */
2246
376
          self->m_psPresentFlag = FDKreadBits(bs, 1);
2247
376
          bitsAvailable -= 1;
2248
376
        }
2249
1.46k
        break;
2250
542
      case ASCEXT_MPS: /* 0x76a */
2251
542
        if (self->m_extensionAudioObjectType == AOT_MPEGS) break;
2252
346
        FDK_FALLTHROUGH;
2253
2.11k
      case ASCEXT_LDMPS: /* 0x7cc */
2254
2.11k
        if ((ascExtId == ASCEXT_LDMPS) &&
2255
1.76k
            (self->m_extensionAudioObjectType == AOT_LD_MPEGS))
2256
201
          break;
2257
1.91k
        if (bitsAvailable >= 1) {
2258
1.71k
          bitsAvailable -= 1;
2259
1.71k
          if (FDKreadBits(bs, 1)) { /* self->m_mpsPresentFlag */
2260
1.16k
            int sscLen = FDKreadBits(bs, 8);
2261
1.16k
            bitsAvailable -= 8;
2262
1.16k
            if (sscLen == 0xFF) {
2263
529
              sscLen += FDKreadBits(bs, 16);
2264
529
              bitsAvailable -= 16;
2265
529
            }
2266
1.16k
            FDKpushFor(bs, sscLen); /* Skip SSC to be able to read the next
2267
                                       extension if there is one. */
2268
2269
1.16k
            bitsAvailable -= sscLen * 8;
2270
1.16k
          }
2271
1.71k
        }
2272
1.91k
        break;
2273
2.02k
      case ASCEXT_SAOC:
2274
2.02k
        if ((ascExtId == ASCEXT_SAOC) &&
2275
2.02k
            (self->m_extensionAudioObjectType == AOT_SAOC))
2276
202
          break;
2277
1.82k
        if (FDKreadBits(bs, 1)) { /* saocPresent */
2278
1.61k
          int saocscLen = FDKreadBits(bs, 8);
2279
1.61k
          bitsAvailable -= 8;
2280
1.61k
          if (saocscLen == 0xFF) {
2281
414
            saocscLen += FDKreadBits(bs, 16);
2282
414
            bitsAvailable -= 16;
2283
414
          }
2284
1.61k
          FDKpushFor(bs, saocscLen);
2285
1.61k
          bitsAvailable -= saocscLen * 8;
2286
1.61k
        }
2287
1.82k
        break;
2288
2.51k
      default:
2289
        /* Just ignore anything. */
2290
2.51k
        return TRANSPORTDEC_OK;
2291
11.8k
    }
2292
11.8k
  }
2293
2294
3.85k
  return TRANSPORTDEC_OK;
2295
6.56k
}
2296
2297
/*
2298
 * API Functions
2299
 */
2300
2301
889k
void AudioSpecificConfig_Init(CSAudioSpecificConfig *asc) {
2302
889k
  FDKmemclear(asc, sizeof(CSAudioSpecificConfig));
2303
2304
  /* Init all values that should not be zero. */
2305
889k
  asc->m_aot = AOT_NONE;
2306
889k
  asc->m_samplingFrequencyIndex = 0xf;
2307
889k
  asc->m_epConfig = -1;
2308
889k
  asc->m_extensionAudioObjectType = AOT_NULL_OBJECT;
2309
889k
  CProgramConfig_Init(&asc->m_progrConfigElement);
2310
889k
}
2311
2312
TRANSPORTDEC_ERROR AudioSpecificConfig_Parse(
2313
    CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs,
2314
    int fExplicitBackwardCompatible, CSTpCallBacks *cb, UCHAR configMode,
2315
889k
    UCHAR configChanged, AUDIO_OBJECT_TYPE m_aot) {
2316
889k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
2317
889k
  UINT ascStartAnchor = FDKgetValidBits(bs);
2318
889k
  int frameLengthFlag = -1;
2319
2320
889k
  AudioSpecificConfig_Init(self);
2321
2322
889k
  self->configMode = configMode;
2323
889k
  self->AacConfigChanged = configChanged;
2324
889k
  self->SbrConfigChanged = configChanged;
2325
889k
  self->SacConfigChanged = configChanged;
2326
2327
889k
  if (m_aot != AOT_NULL_OBJECT) {
2328
52
    self->m_aot = m_aot;
2329
889k
  } else {
2330
889k
    self->m_aot = getAOT(bs);
2331
889k
    self->m_samplingFrequency =
2332
889k
        getSampleRate(bs, &self->m_samplingFrequencyIndex, 4);
2333
889k
    if (self->m_samplingFrequency <= 0 ||
2334
887k
        (self->m_samplingFrequency > 96000 && self->m_aot != 39) ||
2335
886k
        self->m_samplingFrequency > 4 * 96000) {
2336
3.97k
      return TRANSPORTDEC_PARSE_ERROR;
2337
3.97k
    }
2338
2339
885k
    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
885k
    if ((self->m_channelConfiguration == 0) &&
2347
170k
        ((self->m_aot == AOT_ER_AAC_LC) || (self->m_aot == AOT_ER_AAC_LTP) ||
2348
169k
         (self->m_aot == AOT_ER_AAC_LD) || (self->m_aot == AOT_ER_AAC_SCAL) ||
2349
168k
         (self->m_aot == AOT_ER_AAC_ELD))) {
2350
2.19k
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2351
2.19k
    }
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
883k
    if ((self->m_channelConfiguration > 2) &&
2355
463k
        ((self->m_aot == AOT_AAC_SCAL) || (self->m_aot == AOT_ER_AAC_SCAL))) {
2356
757
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2357
757
    }
2358
2359
    /* SBR extension ( explicit non-backwards compatible mode ) */
2360
882k
    self->m_sbrPresentFlag = 0;
2361
882k
    self->m_psPresentFlag = 0;
2362
2363
882k
    if (self->m_aot == AOT_SBR || self->m_aot == AOT_PS) {
2364
6.29k
      self->m_extensionAudioObjectType = AOT_SBR;
2365
2366
6.29k
      self->m_sbrPresentFlag = 1;
2367
6.29k
      if (self->m_aot == AOT_PS) {
2368
3.13k
        self->m_psPresentFlag = 1;
2369
3.13k
      }
2370
2371
6.29k
      self->m_extensionSamplingFrequency =
2372
6.29k
          getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
2373
6.29k
      if (self->m_extensionSamplingFrequency == 0 ||
2374
5.75k
          self->m_extensionSamplingFrequency > 96000) {
2375
848
        return TRANSPORTDEC_PARSE_ERROR;
2376
848
      }
2377
5.44k
      self->m_aot = getAOT(bs);
2378
2379
5.44k
      switch (self->m_aot) {
2380
3.17k
        case AOT_AAC_LC:
2381
3.17k
          break;
2382
1.18k
        case AOT_ER_BSAC:
2383
1.18k
          break;
2384
1.08k
        default:
2385
1.08k
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2386
5.44k
      }
2387
2388
4.36k
      if (self->m_aot == AOT_ER_BSAC) {
2389
1.18k
        self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
2390
1.18k
      }
2391
876k
    } else {
2392
876k
      self->m_extensionAudioObjectType = AOT_NULL_OBJECT;
2393
876k
    }
2394
882k
  }
2395
2396
  /* Parse whatever specific configs */
2397
880k
  switch (self->m_aot) {
2398
390k
    case AOT_AAC_LC:
2399
392k
    case AOT_AAC_SCAL:
2400
394k
    case AOT_ER_AAC_LC:
2401
404k
    case AOT_ER_AAC_LD:
2402
461k
    case AOT_ER_AAC_SCAL:
2403
465k
    case AOT_ER_BSAC:
2404
465k
      if ((ErrorStatus = GaSpecificConfig_Parse(&self->m_sc.m_gaSpecificConfig,
2405
465k
                                                self, bs, ascStartAnchor)) !=
2406
465k
          TRANSPORTDEC_OK) {
2407
0
        return (ErrorStatus);
2408
0
      }
2409
465k
      frameLengthFlag = self->m_sc.m_gaSpecificConfig.m_frameLengthFlag;
2410
465k
      break;
2411
3.07k
    case AOT_MPEGS:
2412
3.07k
      if (cb->cbSsc != NULL) {
2413
3.07k
        if (cb->cbSsc(cb->cbSscData, bs, self->m_aot, self->m_samplingFrequency,
2414
3.07k
                      self->m_samplesPerFrame, self->m_channelConfiguration, 1,
2415
3.07k
                      -1, /* nTimeSlots: read from bitstream */
2416
3.07k
                      0,  /* don't know the length */
2417
3.07k
                      self->configMode, &self->SacConfigChanged)) {
2418
3.07k
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2419
3.07k
        }
2420
3.07k
      } else {
2421
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2422
0
      }
2423
0
      break;
2424
176k
    case AOT_ER_AAC_ELD:
2425
176k
      if ((ErrorStatus = EldSpecificConfig_Parse(self, bs, cb)) !=
2426
176k
          TRANSPORTDEC_OK) {
2427
33.0k
        return (ErrorStatus);
2428
33.0k
      }
2429
143k
      frameLengthFlag = self->m_sc.m_eldSpecificConfig.m_frameLengthFlag;
2430
143k
      self->m_sbrPresentFlag = self->m_sc.m_eldSpecificConfig.m_sbrPresentFlag;
2431
143k
      self->m_extensionSamplingFrequency =
2432
143k
          (self->m_sc.m_eldSpecificConfig.m_sbrSamplingRate + 1) *
2433
143k
          self->m_samplingFrequency;
2434
143k
      break;
2435
216k
    case AOT_USAC:
2436
216k
      if ((ErrorStatus = UsacConfig_Parse(self, bs, cb)) != TRANSPORTDEC_OK) {
2437
38.1k
        return (ErrorStatus);
2438
38.1k
      }
2439
178k
      break;
2440
2441
178k
    default:
2442
18.7k
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2443
880k
  }
2444
2445
  /* Frame length */
2446
788k
  switch (self->m_aot) {
2447
390k
    case AOT_AAC_LC:
2448
392k
    case AOT_AAC_SCAL:
2449
394k
    case AOT_ER_AAC_LC:
2450
450k
    case AOT_ER_AAC_SCAL:
2451
454k
    case AOT_ER_BSAC:
2452
      /*case AOT_USAC:*/
2453
454k
      if (!frameLengthFlag)
2454
161k
        self->m_samplesPerFrame = 1024;
2455
293k
      else
2456
293k
        self->m_samplesPerFrame = 960;
2457
454k
      break;
2458
10.6k
    case AOT_ER_AAC_LD:
2459
10.6k
      if (!frameLengthFlag)
2460
5.29k
        self->m_samplesPerFrame = 512;
2461
5.38k
      else
2462
5.38k
        self->m_samplesPerFrame = 480;
2463
10.6k
      break;
2464
322k
    default:
2465
322k
      break;
2466
788k
  }
2467
2468
788k
  switch (self->m_aot) {
2469
1.24k
    case AOT_ER_AAC_LC:
2470
11.9k
    case AOT_ER_AAC_LD:
2471
155k
    case AOT_ER_AAC_ELD:
2472
212k
    case AOT_ER_AAC_SCAL:
2473
212k
    case AOT_ER_CELP:
2474
212k
    case AOT_ER_HVXC:
2475
216k
    case AOT_ER_BSAC:
2476
216k
      self->m_epConfig = FDKreadBits(bs, 2);
2477
2478
216k
      if (self->m_epConfig > 1) {
2479
2.71k
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;  // EPCONFIG;
2480
2.71k
      }
2481
213k
      break;
2482
571k
    default:
2483
571k
      break;
2484
788k
  }
2485
2486
785k
  if (fExplicitBackwardCompatible &&
2487
9.02k
      (self->m_aot == AOT_AAC_LC || self->m_aot == AOT_ER_AAC_LD ||
2488
6.56k
       self->m_aot == AOT_ER_BSAC)) {
2489
6.56k
    ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb);
2490
6.56k
  }
2491
2492
  /* Copy config() to asc->config[] buffer. */
2493
785k
  if ((ErrorStatus == TRANSPORTDEC_OK) && (self->m_aot == AOT_USAC)) {
2494
178k
    INT configSize_bits = (INT)FDKgetValidBits(bs) - (INT)ascStartAnchor;
2495
178k
    if (StoreConfigAsBitstream(bs, configSize_bits, self->config,
2496
178k
                               TP_USAC_MAX_CONFIG_LEN)) {
2497
226
      return TRANSPORTDEC_PARSE_ERROR;
2498
226
    }
2499
178k
    self->configBits = fAbs(configSize_bits);
2500
178k
  }
2501
2502
785k
  return (ErrorStatus);
2503
785k
}
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
}