Coverage Report

Created: 2025-11-16 07:20

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