Coverage Report

Created: 2026-08-31 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libMpegTPDec/src/tpdec_asc.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
5
Forschung e.V. All rights reserved.
6
7
 1.    INTRODUCTION
8
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10
scheme for digital audio. This FDK AAC Codec software is intended to be used on
11
a wide variety of Android devices.
12
13
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14
general perceptual audio codecs. AAC-ELD is considered the best-performing
15
full-bandwidth communications codec by independent studies and is widely
16
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17
specifications.
18
19
Patent licenses for necessary patent claims for the FDK AAC Codec (including
20
those of Fraunhofer) may be obtained through Via Licensing
21
(www.vialicensing.com) or through the respective patent owners individually for
22
the purpose of encoding or decoding bit streams in products that are compliant
23
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24
Android devices already license these patent claims through Via Licensing or
25
directly from the patent owners, and therefore FDK AAC Codec software may
26
already be covered under those patent licenses when it is used for those
27
licensed purposes only.
28
29
Commercially-licensed AAC software libraries, including floating-point versions
30
with enhanced sound quality, are also available from Fraunhofer. Users are
31
encouraged to check the Fraunhofer website for additional applications
32
information and documentation.
33
34
2.    COPYRIGHT LICENSE
35
36
Redistribution and use in source and binary forms, with or without modification,
37
are permitted without payment of copyright license fees provided that you
38
satisfy the following conditions:
39
40
You must retain the complete text of this software license in redistributions of
41
the FDK AAC Codec or your modifications thereto in source code form.
42
43
You must retain the complete text of this software license in the documentation
44
and/or other materials provided with redistributions of the FDK AAC Codec or
45
your modifications thereto in binary form. You must make available free of
46
charge copies of the complete source code of the FDK AAC Codec and your
47
modifications thereto to recipients of copies in binary form.
48
49
The name of Fraunhofer may not be used to endorse or promote products derived
50
from this library without prior written permission.
51
52
You may not charge copyright license fees for anyone to use, copy or distribute
53
the FDK AAC Codec software or your modifications thereto.
54
55
Your modified versions of the FDK AAC Codec must carry prominent notices stating
56
that you changed the software and the date of any change. For modified versions
57
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59
AAC Codec Library for Android."
60
61
3.    NO PATENT LICENSE
62
63
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65
Fraunhofer provides no warranty of patent non-infringement with respect to this
66
software.
67
68
You may use this FDK AAC Codec software or modifications thereto only for
69
purposes that are authorized by appropriate patent licenses.
70
71
4.    DISCLAIMER
72
73
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75
including but not limited to the implied warranties of merchantability and
76
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78
or consequential damages, including but not limited to procurement of substitute
79
goods or services; loss of use, data, or profits, or business interruption,
80
however caused and on any theory of liability, whether in contract, strict
81
liability, or tort (including negligence), arising in any way out of the use of
82
this software, even if advised of the possibility of such damage.
83
84
5.    CONTACT INFORMATION
85
86
Fraunhofer Institute for Integrated Circuits IIS
87
Attention: Audio and Multimedia Departments - FDK AAC LL
88
Am Wolfsmantel 33
89
91058 Erlangen, Germany
90
91
www.iis.fraunhofer.de/amm
92
amm-info@iis.fraunhofer.de
93
----------------------------------------------------------------------------- */
94
95
/******************* MPEG transport format decoder library *********************
96
97
   Author(s):   Daniel Homm
98
99
   Description:
100
101
*******************************************************************************/
102
103
#include "tpdec_lib.h"
104
#include "tp_data.h"
105
106
#include "FDK_crc.h"
107
108
#include "common_fix.h"
109
110
/**
111
 * The following arrays provide the IDs of the consecutive elements for each
112
 * channel configuration. Every channel_configuration has to be finalized with
113
 * ID_NONE.
114
 */
115
static const MP4_ELEMENT_ID channel_configuration_0[] = {ID_NONE};
116
static const MP4_ELEMENT_ID channel_configuration_1[] = {ID_SCE, ID_NONE};
117
static const MP4_ELEMENT_ID channel_configuration_2[] = {ID_CPE, ID_NONE};
118
static const MP4_ELEMENT_ID channel_configuration_3[] = {ID_SCE, ID_CPE,
119
                                                         ID_NONE};
120
static const MP4_ELEMENT_ID channel_configuration_4[] = {ID_SCE, ID_CPE, ID_SCE,
121
                                                         ID_NONE};
122
static const MP4_ELEMENT_ID channel_configuration_5[] = {ID_SCE, ID_CPE, ID_CPE,
123
                                                         ID_NONE};
124
static const MP4_ELEMENT_ID channel_configuration_6[] = {ID_SCE, ID_CPE, ID_CPE,
125
                                                         ID_LFE, ID_NONE};
126
static const MP4_ELEMENT_ID channel_configuration_7[] = {
127
    ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE};
128
static const MP4_ELEMENT_ID channel_configuration_8[] = {
129
    ID_NONE}; /* reserved */
130
static const MP4_ELEMENT_ID channel_configuration_9[] = {
131
    ID_NONE}; /* reserved */
132
static const MP4_ELEMENT_ID channel_configuration_10[] = {
133
    ID_NONE}; /* reserved */
134
static const MP4_ELEMENT_ID channel_configuration_11[] = {
135
    ID_SCE, ID_CPE, ID_CPE, ID_SCE, ID_LFE, ID_NONE};
136
static const MP4_ELEMENT_ID channel_configuration_12[] = {
137
    ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE};
138
static const MP4_ELEMENT_ID channel_configuration_13[] = {
139
    ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_CPE, ID_SCE, ID_LFE, ID_LFE, ID_SCE,
140
    ID_CPE, ID_CPE, ID_SCE, ID_CPE, ID_SCE, ID_SCE, ID_CPE, ID_NONE};
141
static const MP4_ELEMENT_ID channel_configuration_14[] = {
142
    ID_SCE, ID_CPE, ID_CPE, ID_LFE, ID_CPE, ID_NONE};
143
144
static const MP4_ELEMENT_ID *channel_configuration_array[] = {
145
    channel_configuration_0,  channel_configuration_1,
146
    channel_configuration_2,  channel_configuration_3,
147
    channel_configuration_4,  channel_configuration_5,
148
    channel_configuration_6,  channel_configuration_7,
149
    channel_configuration_8,  channel_configuration_9,
150
    channel_configuration_10, channel_configuration_11,
151
    channel_configuration_12, channel_configuration_13,
152
    channel_configuration_14};
153
154
#define TP_USAC_MAX_CHANNEL_CONFIGURATION_INDEX (13)
155
#define SC_CHANNEL_CONFIG_TAB_SIZE (TP_USAC_MAX_CHANNEL_CONFIGURATION_INDEX + 1)
156
157
/* channel config structure used for sanity check */
158
typedef struct {
159
  SCHAR nCh;  /* number of channels */
160
  SCHAR nSCE; /* number of SCE's */
161
  SCHAR nCPE; /* number of CPE's */
162
  SCHAR nLFE; /* number of LFE's */
163
} SC_CHANNEL_CONFIG;
164
165
static const SC_CHANNEL_CONFIG sc_chan_config_tab[SC_CHANNEL_CONFIG_TAB_SIZE] =
166
    {
167
        /* nCh, nSCE, nCPE, nLFE,     cci */
168
        {0, 0, 0, 0}, /*  0 */
169
        {1, 1, 0, 0}, /*  1 */
170
        {2, 0, 1, 0}, /*  2 */
171
        {3, 1, 1, 0}, /*  3 */
172
        {4, 2, 1, 0}, /*  4 */
173
        {5, 1, 2, 0}, /*  5 */
174
        {6, 1, 2, 1}, /*  6 */
175
        {8, 1, 3, 1}, /*  7 */
176
        {2, 2, 0, 0}, /*  8 */
177
        {3, 1, 1, 0}, /*  9 */
178
        {4, 0, 2, 0}, /* 10 */
179
        {7, 2, 2, 1}, /* 11 */
180
        {8, 1, 3, 1}, /* 12 */
181
        {24, 6, 8, 2} /* 13 */
182
};
183
184
375k
void CProgramConfig_Reset(CProgramConfig *pPce) { pPce->elCounter = 0; }
185
186
2.19M
void CProgramConfig_Init(CProgramConfig *pPce) {
187
2.19M
  FDKmemclear(pPce, sizeof(CProgramConfig));
188
2.19M
  pPce->SamplingFrequencyIndex = 0xf;
189
2.19M
}
190
191
945k
int CProgramConfig_IsValid(const CProgramConfig *pPce) {
192
945k
  return ((pPce->isValid) ? 1 : 0);
193
945k
}
194
195
27.1k
#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
188k
                                        const UINT alignmentAnchor) {
207
188k
  int err = 0;
208
188k
  FDK_CRCINFO crcInfo; /* CRC state info */
209
188k
  INT crcReg;
210
188k
  FDKcrcInit(&crcInfo, 0x07, 0xFF, 8);
211
188k
  crcReg = FDKcrcStartReg(&crcInfo, bs, 0);
212
188k
  UINT startAnchor = FDKgetValidBits(bs);
213
214
188k
  FDK_ASSERT(pPce != NULL);
215
188k
  FDK_ASSERT(bs != NULL);
216
188k
  FDK_ASSERT(bytesAvailable != NULL);
217
218
188k
  if ((startAnchor >= 24) && (*bytesAvailable >= 3) &&
219
27.1k
      (FDKreadBits(bs, 8) == PCE_HEIGHT_EXT_SYNC)) {
220
7.39k
    int i;
221
222
26.6k
    for (i = 0; i < pPce->NumFrontChannelElements; i++) {
223
19.2k
      if ((pPce->FrontElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
224
19.2k
          PC_NUM_HEIGHT_LAYER) {
225
3.32k
        err = -2; /* height information is out of the valid range */
226
3.32k
      }
227
19.2k
    }
228
34.9k
    for (i = 0; i < pPce->NumSideChannelElements; i++) {
229
27.5k
      if ((pPce->SideElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
230
27.5k
          PC_NUM_HEIGHT_LAYER) {
231
2.63k
        err = -2; /* height information is out of the valid range */
232
2.63k
      }
233
27.5k
    }
234
29.8k
    for (i = 0; i < pPce->NumBackChannelElements; i++) {
235
22.4k
      if ((pPce->BackElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
236
22.4k
          PC_NUM_HEIGHT_LAYER) {
237
1.76k
        err = -2; /* height information is out of the valid range */
238
1.76k
      }
239
22.4k
    }
240
7.39k
    FDKbyteAlign(bs, alignmentAnchor);
241
242
7.39k
    FDKcrcEndReg(&crcInfo, bs, crcReg);
243
7.39k
    if ((USHORT)FDKreadBits(bs, 8) != FDKcrcGetCRC(&crcInfo)) {
244
      /* CRC failed */
245
2.02k
      err = -1;
246
2.02k
    }
247
7.39k
    if (err != 0) {
248
      /* Reset whole height information in case an error occured during parsing.
249
         The return value ensures that pPce->isValid is set to 0 and implicit
250
         channel mapping is used. */
251
2.03k
      FDKmemclear(pPce->FrontElementHeightInfo,
252
2.03k
                  sizeof(pPce->FrontElementHeightInfo));
253
2.03k
      FDKmemclear(pPce->SideElementHeightInfo,
254
2.03k
                  sizeof(pPce->SideElementHeightInfo));
255
2.03k
      FDKmemclear(pPce->BackElementHeightInfo,
256
2.03k
                  sizeof(pPce->BackElementHeightInfo));
257
2.03k
    }
258
180k
  } else {
259
    /* No valid extension data found -> restore the initial bitbuffer state */
260
180k
    FDKpushBack(bs, (INT)startAnchor - (INT)FDKgetValidBits(bs));
261
180k
  }
262
263
  /* Always report the bytes read. */
264
188k
  *bytesAvailable -= ((INT)startAnchor - (INT)FDKgetValidBits(bs)) >> 3;
265
266
188k
  return (err);
267
188k
}
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
188k
static int CProgramConfig_Check(CProgramConfig *pPce) {
279
188k
  INT i;
280
188k
  INT err = 0;
281
188k
  INT numBackChannels[3] = {0};
282
188k
  INT numSideChannels[3] = {0};
283
188k
  INT numFrontChannels[3] = {0};
284
188k
  UCHAR *pCpeFront = pPce->FrontElementIsCpe;
285
188k
  UCHAR *pCpeSide = pPce->SideElementIsCpe;
286
188k
  UCHAR *pCpeBack = pPce->BackElementIsCpe;
287
188k
  UCHAR *pHeight;
288
289
188k
  pHeight = pPce->BackElementHeightInfo;
290
895k
  for (i = 0; i < pPce->NumBackChannelElements; i++) {
291
706k
    numBackChannels[*pHeight] += pPce->BackElementIsCpe[i] ? 2 : 1;
292
706k
    pHeight++;
293
706k
  }
294
188k
  pHeight = pPce->SideElementHeightInfo;
295
277k
  for (i = 0; i < pPce->NumSideChannelElements; i++) {
296
88.7k
    numSideChannels[*pHeight] += pPce->SideElementIsCpe[i] ? 2 : 1;
297
88.7k
    pHeight++;
298
88.7k
  }
299
188k
  pHeight = pPce->FrontElementHeightInfo;
300
265k
  for (i = 0; i < pPce->NumFrontChannelElements; i++) {
301
76.7k
    numFrontChannels[*pHeight] += pPce->FrontElementIsCpe[i] ? 2 : 1;
302
76.7k
    pHeight++;
303
76.7k
  }
304
305
  /* 0 = normal height channels, 1 = top height channels, 2 = bottom height
306
   * channels */
307
703k
  for (i = 0; i < 3; i++) {
308
    /* if number of channels is odd => first element must be a SCE (front center
309
     * channel) */
310
531k
    if (numFrontChannels[i] & 1) {
311
9.64k
      if (*pCpeFront++ == ID_CPE) {
312
1.16k
        err = 1;
313
1.16k
        goto bail;
314
1.16k
      }
315
8.47k
      numFrontChannels[i]--;
316
8.47k
    }
317
556k
    while (numFrontChannels[i] > 0) {
318
      /* must be CPE or paired SCE */
319
28.5k
      if (*pCpeFront++ == ID_SCE) {
320
15.4k
        if (*pCpeFront++ == ID_CPE) {
321
2.55k
          err = 1;
322
2.55k
          goto bail;
323
2.55k
        }
324
15.4k
      }
325
26.0k
      numFrontChannels[i] -= 2;
326
527k
    };
327
328
    /* in case that a top center surround channel (Ts) is transmitted the number
329
     * of channels can be odd */
330
527k
    if (i != 1) {
331
      /* number of channels must be even */
332
356k
      if (numSideChannels[i] & 1) {
333
2.74k
        err = 1;
334
2.74k
        goto bail;
335
2.74k
      }
336
373k
      while (numSideChannels[i] > 0) {
337
        /* must be CPE or paired SCE */
338
20.9k
        if (*pCpeSide++ == ID_SCE) {
339
8.29k
          if (*pCpeSide++ == ID_CPE) {
340
950
            err = 1;
341
950
            goto bail;
342
950
          }
343
8.29k
        }
344
20.0k
        numSideChannels[i] -= 2;
345
352k
      };
346
352k
    }
347
348
987k
    while (numBackChannels[i] > 1) {
349
      /* must be CPE or paired SCE */
350
472k
      if (*pCpeBack++ == ID_SCE) {
351
12.3k
        if (*pCpeBack++ == ID_CPE) {
352
9.07k
          err = 1;
353
9.07k
          goto bail;
354
9.07k
        }
355
12.3k
      }
356
463k
      numBackChannels[i] -= 2;
357
515k
    };
358
    /* if number of channels is odd => last element must be a SCE (back center
359
     * channel) */
360
515k
    if (numBackChannels[i]) {
361
161k
      if (*pCpeBack++ == ID_CPE) {
362
408
        err = 1;
363
408
        goto bail;
364
408
      }
365
161k
    }
366
515k
  }
367
368
188k
bail:
369
370
188k
  return err;
371
188k
}
372
373
void CProgramConfig_Read(CProgramConfig *pPce, HANDLE_FDK_BITSTREAM bs,
374
188k
                         UINT alignmentAnchor) {
375
188k
  int i;
376
188k
  int commentBytes;
377
188k
  UCHAR tag, isCpe;
378
188k
  UCHAR checkElementTagSelect[3][PC_FSB_CHANNELS_MAX] = {{0}};
379
380
188k
  pPce->isValid = 1;
381
188k
  pPce->NumEffectiveChannels = 0;
382
188k
  pPce->NumChannels = 0;
383
188k
  pPce->ElementInstanceTag = (UCHAR)FDKreadBits(bs, 4);
384
188k
  pPce->Profile = (UCHAR)FDKreadBits(bs, 2);
385
188k
  pPce->SamplingFrequencyIndex = (UCHAR)FDKreadBits(bs, 4);
386
188k
  pPce->NumFrontChannelElements = (UCHAR)FDKreadBits(bs, 4);
387
188k
  pPce->NumSideChannelElements = (UCHAR)FDKreadBits(bs, 4);
388
188k
  pPce->NumBackChannelElements = (UCHAR)FDKreadBits(bs, 4);
389
188k
  pPce->NumLfeChannelElements = (UCHAR)FDKreadBits(bs, 2);
390
188k
  pPce->NumAssocDataElements = (UCHAR)FDKreadBits(bs, 3);
391
188k
  pPce->NumValidCcElements = (UCHAR)FDKreadBits(bs, 4);
392
393
188k
  if ((pPce->MonoMixdownPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
394
158k
    pPce->MonoMixdownElementNumber = (UCHAR)FDKreadBits(bs, 4);
395
158k
  }
396
397
188k
  if ((pPce->StereoMixdownPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
398
19.9k
    pPce->StereoMixdownElementNumber = (UCHAR)FDKreadBits(bs, 4);
399
19.9k
  }
400
401
188k
  if ((pPce->MatrixMixdownIndexPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
402
8.40k
    pPce->MatrixMixdownIndex = (UCHAR)FDKreadBits(bs, 2);
403
8.40k
    pPce->PseudoSurroundEnable = (UCHAR)FDKreadBits(bs, 1);
404
8.40k
  }
405
406
265k
  for (i = 0; i < pPce->NumFrontChannelElements; i++) {
407
76.7k
    pPce->FrontElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
408
76.7k
    pPce->FrontElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
409
76.7k
    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
76.7k
    if (checkElementTagSelect[isCpe][tag] == 0) {
414
59.0k
      checkElementTagSelect[isCpe][tag] = 1;
415
59.0k
    } else {
416
17.6k
      pPce->isValid = 0;
417
17.6k
    }
418
76.7k
  }
419
420
277k
  for (i = 0; i < pPce->NumSideChannelElements; i++) {
421
88.7k
    pPce->SideElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
422
88.7k
    pPce->SideElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
423
88.7k
    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
88.7k
    if (checkElementTagSelect[isCpe][tag] == 0) {
428
59.4k
      checkElementTagSelect[isCpe][tag] = 1;
429
59.4k
    } else {
430
29.3k
      pPce->isValid = 0;
431
29.3k
    }
432
88.7k
  }
433
434
895k
  for (i = 0; i < pPce->NumBackChannelElements; i++) {
435
706k
    pPce->BackElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
436
706k
    pPce->BackElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
437
706k
    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
706k
    if (checkElementTagSelect[isCpe][tag] == 0) {
442
676k
      checkElementTagSelect[isCpe][tag] = 1;
443
676k
    } else {
444
30.5k
      pPce->isValid = 0;
445
30.5k
    }
446
706k
  }
447
448
188k
  pPce->NumEffectiveChannels = pPce->NumChannels;
449
450
378k
  for (i = 0; i < pPce->NumLfeChannelElements; i++) {
451
190k
    pPce->LfeElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
452
190k
    pPce->NumChannels += 1;
453
454
    /* Check element instance tag according to ISO/IEC 13818-7:2003(E),
455
     * chapter 8.2.1.1 */
456
190k
    if (checkElementTagSelect[2][tag] == 0) {
457
188k
      checkElementTagSelect[2][tag] = 1;
458
188k
    } else {
459
2.19k
      pPce->isValid = 0;
460
2.19k
    }
461
190k
  }
462
463
279k
  for (i = 0; i < pPce->NumAssocDataElements; i++) {
464
90.8k
    pPce->AssocDataElementTagSelect[i] = (UCHAR)FDKreadBits(bs, 4);
465
90.8k
  }
466
467
524k
  for (i = 0; i < pPce->NumValidCcElements; i++) {
468
336k
    pPce->CcElementIsIndSw[i] = (UCHAR)FDKreadBits(bs, 1);
469
336k
    pPce->ValidCcElementTagSelect[i] = (UCHAR)FDKreadBits(bs, 4);
470
336k
  }
471
472
188k
  FDKbyteAlign(bs, alignmentAnchor);
473
474
188k
  pPce->CommentFieldBytes = (UCHAR)FDKreadBits(bs, 8);
475
188k
  commentBytes = pPce->CommentFieldBytes;
476
477
  /* Search for height info extension and read it if available */
478
188k
  if (CProgramConfig_ReadHeightExt(pPce, bs, &commentBytes, alignmentAnchor)) {
479
2.03k
    pPce->isValid = 0;
480
2.03k
  }
481
482
  /* Check order of elements according to ISO / IEC 13818 - 7:2003(E),
483
   * chapter 8.5.1 */
484
188k
  if (CProgramConfig_Check(pPce)) {
485
16.9k
    pPce->isValid = 0;
486
16.9k
  }
487
488
1.37M
  for (i = 0; i < commentBytes; i++) {
489
1.18M
    UCHAR text;
490
491
1.18M
    text = (UCHAR)FDKreadBits(bs, 8);
492
493
1.18M
    if (i < PC_COMMENTLENGTH) {
494
1.18M
      pPce->Comment[i] = text;
495
1.18M
    }
496
1.18M
  }
497
188k
}
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
635k
                           const CProgramConfig *const pPce2) {
509
635k
  int result = 0; /* Innocent until proven false. */
510
511
635k
  if (FDKmemcmp(pPce1, pPce2, sizeof(CProgramConfig)) !=
512
635k
      0) { /* Configurations are not completely equal.
513
              So look into details and analyse the channel configurations: */
514
634k
    result = -1;
515
516
634k
    if (pPce1->NumChannels ==
517
634k
        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
634k
      result = 1;
521
522
      /* Front channels */
523
634k
      if (pPce1->NumFrontChannelElements != pPce2->NumFrontChannelElements) {
524
628k
        result = 2; /* different number of front channel elements */
525
628k
      } else {
526
5.25k
        int el, numCh1 = 0, numCh2 = 0;
527
15.2k
        for (el = 0; el < pPce1->NumFrontChannelElements; el += 1) {
528
10.9k
          if (pPce1->FrontElementHeightInfo[el] !=
529
10.9k
              pPce2->FrontElementHeightInfo[el]) {
530
949
            result = 2; /* different height info */
531
949
            break;
532
949
          }
533
10.0k
          numCh1 += pPce1->FrontElementIsCpe[el] ? 2 : 1;
534
10.0k
          numCh2 += pPce2->FrontElementIsCpe[el] ? 2 : 1;
535
10.0k
        }
536
5.25k
        if (numCh1 != numCh2) {
537
1.80k
          result = 2; /* different number of front channels */
538
1.80k
        }
539
5.25k
      }
540
      /* Side channels */
541
634k
      if (pPce1->NumSideChannelElements != pPce2->NumSideChannelElements) {
542
154k
        result = 2; /* different number of side channel elements */
543
479k
      } else {
544
479k
        int el, numCh1 = 0, numCh2 = 0;
545
480k
        for (el = 0; el < pPce1->NumSideChannelElements; el += 1) {
546
2.46k
          if (pPce1->SideElementHeightInfo[el] !=
547
2.46k
              pPce2->SideElementHeightInfo[el]) {
548
1.23k
            result = 2; /* different height info */
549
1.23k
            break;
550
1.23k
          }
551
1.23k
          numCh1 += pPce1->SideElementIsCpe[el] ? 2 : 1;
552
1.23k
          numCh2 += pPce2->SideElementIsCpe[el] ? 2 : 1;
553
1.23k
        }
554
479k
        if (numCh1 != numCh2) {
555
0
          result = 2; /* different number of side channels */
556
0
        }
557
479k
      }
558
      /* Back channels */
559
634k
      if (pPce1->NumBackChannelElements != pPce2->NumBackChannelElements) {
560
614k
        result = 2; /* different number of back channel elements */
561
614k
      } else {
562
19.3k
        int el, numCh1 = 0, numCh2 = 0;
563
28.5k
        for (el = 0; el < pPce1->NumBackChannelElements; el += 1) {
564
18.6k
          if (pPce1->BackElementHeightInfo[el] !=
565
18.6k
              pPce2->BackElementHeightInfo[el]) {
566
9.54k
            result = 2; /* different height info */
567
9.54k
            break;
568
9.54k
          }
569
9.13k
          numCh1 += pPce1->BackElementIsCpe[el] ? 2 : 1;
570
9.13k
          numCh2 += pPce2->BackElementIsCpe[el] ? 2 : 1;
571
9.13k
        }
572
19.3k
        if (numCh1 != numCh2) {
573
3.97k
          result = 2; /* different number of back channels */
574
3.97k
        }
575
19.3k
      }
576
      /* LFE channels */
577
634k
      if (pPce1->NumLfeChannelElements != pPce2->NumLfeChannelElements) {
578
9.99k
        result = 2; /* different number of lfe channels */
579
9.99k
      }
580
      /* LFEs are always SCEs so we don't need to count the channels. */
581
634k
    }
582
634k
  }
583
584
635k
  return result;
585
635k
}
586
587
634k
void CProgramConfig_GetDefault(CProgramConfig *pPce, const UINT channelConfig) {
588
634k
  FDK_ASSERT(pPce != NULL);
589
590
  /* Init PCE */
591
634k
  CProgramConfig_Init(pPce);
592
634k
  pPce->Profile =
593
634k
      1; /* Set AAC LC because it is the only supported object type. */
594
595
634k
  switch (channelConfig) {
596
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
597
140k
    case 32: /* 7.1 side channel configuration as defined in FDK_audio.h */
598
140k
      pPce->NumFrontChannelElements = 2;
599
140k
      pPce->FrontElementIsCpe[0] = 0;
600
140k
      pPce->FrontElementIsCpe[1] = 1;
601
140k
      pPce->NumSideChannelElements = 1;
602
140k
      pPce->SideElementIsCpe[0] = 1;
603
140k
      pPce->NumBackChannelElements = 1;
604
140k
      pPce->BackElementIsCpe[0] = 1;
605
140k
      pPce->NumLfeChannelElements = 1;
606
140k
      pPce->NumChannels = 8;
607
140k
      pPce->NumEffectiveChannels = 7;
608
140k
      pPce->isValid = 1;
609
140k
      break;
610
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
611
140k
    case 12: /* 3/0/4.1ch surround back */
612
140k
      pPce->BackElementIsCpe[1] = 1;
613
140k
      pPce->NumChannels += 1;
614
140k
      pPce->NumEffectiveChannels += 1;
615
140k
      FDK_FALLTHROUGH;
616
141k
    case 11: /* 3/0/3.1ch */
617
141k
      pPce->NumFrontChannelElements += 2;
618
141k
      pPce->FrontElementIsCpe[0] = 0;
619
141k
      pPce->FrontElementIsCpe[1] = 1;
620
141k
      pPce->NumBackChannelElements += 2;
621
141k
      pPce->BackElementIsCpe[0] = 1;
622
141k
      pPce->BackElementIsCpe[1] += 0;
623
141k
      pPce->NumLfeChannelElements += 1;
624
141k
      pPce->NumChannels += 7;
625
141k
      pPce->NumEffectiveChannels += 6;
626
141k
      pPce->isValid = 1;
627
141k
      break;
628
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
629
140k
    case 14:                               /* 2/0/0-3/0/2-0.1ch front height */
630
140k
      pPce->FrontElementHeightInfo[2] = 1; /* Top speaker */
631
140k
      FDK_FALLTHROUGH;
632
347k
    case 7: /* 5/0/2.1ch front */
633
347k
      pPce->NumFrontChannelElements += 1;
634
347k
      pPce->FrontElementIsCpe[2] = 1;
635
347k
      pPce->NumChannels += 2;
636
347k
      pPce->NumEffectiveChannels += 2;
637
347k
      FDK_FALLTHROUGH;
638
348k
    case 6: /* 3/0/2.1ch */
639
348k
      pPce->NumLfeChannelElements += 1;
640
348k
      pPce->NumChannels += 1;
641
348k
      FDK_FALLTHROUGH;
642
349k
    case 5: /* 3/0/2.0ch */
643
350k
    case 4: /* 3/0/1.0ch */
644
350k
      pPce->NumBackChannelElements += 1;
645
350k
      pPce->BackElementIsCpe[0] = (channelConfig > 4) ? 1 : 0;
646
350k
      pPce->NumChannels += (channelConfig > 4) ? 2 : 1;
647
350k
      pPce->NumEffectiveChannels += (channelConfig > 4) ? 2 : 1;
648
350k
      FDK_FALLTHROUGH;
649
351k
    case 3: /* 3/0/0.0ch */
650
351k
      pPce->NumFrontChannelElements += 1;
651
351k
      pPce->FrontElementIsCpe[1] = 1;
652
351k
      pPce->NumChannels += 2;
653
351k
      pPce->NumEffectiveChannels += 2;
654
351k
      FDK_FALLTHROUGH;
655
351k
    case 1: /* 1/0/0.0ch */
656
351k
      pPce->NumFrontChannelElements += 1;
657
351k
      pPce->FrontElementIsCpe[0] = 0;
658
351k
      pPce->NumChannels += 1;
659
351k
      pPce->NumEffectiveChannels += 1;
660
351k
      pPce->isValid = 1;
661
351k
      break;
662
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
663
229
    case 2: /* 2/0/0.ch */
664
229
      pPce->NumFrontChannelElements = 1;
665
229
      pPce->FrontElementIsCpe[0] = 1;
666
229
      pPce->NumChannels += 2;
667
229
      pPce->NumEffectiveChannels += 2;
668
229
      pPce->isValid = 1;
669
229
      break;
670
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
671
302
    default:
672
302
      pPce->isValid = 0; /* To be explicit! */
673
302
      break;
674
634k
  }
675
676
634k
  if (pPce->isValid) {
677
    /* Create valid element instance tags */
678
634k
    int el, elTagSce = 0, elTagCpe = 0;
679
680
2.24M
    for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
681
1.61M
      pPce->FrontElementTagSelect[el] =
682
1.61M
          (pPce->FrontElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
683
1.61M
    }
684
774k
    for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
685
140k
      pPce->SideElementTagSelect[el] =
686
140k
          (pPce->SideElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
687
140k
    }
688
1.40M
    for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
689
774k
      pPce->BackElementTagSelect[el] =
690
774k
          (pPce->BackElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
691
774k
    }
692
634k
    elTagSce = 0;
693
1.26M
    for (el = 0; el < pPce->NumLfeChannelElements; el += 1) {
694
630k
      pPce->LfeElementTagSelect[el] = elTagSce++;
695
630k
    }
696
634k
  }
697
634k
}
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
445k
                                                UINT index) {
710
445k
  if (index < 3) {
711
389k
    *chType = ACT_FRONT;
712
389k
    *chIndex = index;
713
389k
  } else {
714
56.0k
    switch (channelConfig) {
715
127
      case 4: /* SCE, CPE, SCE */
716
169
      case 5: /* SCE, CPE, CPE */
717
298
      case 6: /* SCE, CPE, CPE, LFE */
718
298
        switch (index) {
719
238
          case 3:
720
238
          case 4:
721
238
            *chType = ACT_BACK;
722
238
            *chIndex = index - 3;
723
238
            break;
724
60
          case 5:
725
60
            *chType = ACT_LFE;
726
60
            *chIndex = 0;
727
60
            break;
728
298
        }
729
298
        break;
730
19.4k
      case 7: /* SCE,CPE,CPE,CPE,LFE */
731
19.4k
        switch (index) {
732
6.51k
          case 3:
733
6.51k
          case 4:
734
6.51k
            *chType = ACT_FRONT;
735
6.51k
            *chIndex = index;
736
6.51k
            break;
737
6.47k
          case 5:
738
6.47k
          case 6:
739
6.47k
            *chType = ACT_BACK;
740
6.47k
            *chIndex = index - 5;
741
6.47k
            break;
742
6.43k
          case 7:
743
6.43k
            *chType = ACT_LFE;
744
6.43k
            *chIndex = 0;
745
6.43k
            break;
746
19.4k
        }
747
19.4k
        break;
748
19.4k
      case 11: /* SCE,CPE,CPE,SCE,LFE */
749
5.39k
        if (index < 6) {
750
3.60k
          *chType = ACT_BACK;
751
3.60k
          *chIndex = index - 3;
752
3.60k
        } else {
753
1.78k
          *chType = ACT_LFE;
754
1.78k
          *chIndex = 0;
755
1.78k
        }
756
5.39k
        break;
757
4.83k
      case 12: /* SCE,CPE,CPE,CPE,LFE */
758
4.83k
        if (index < 7) {
759
3.23k
          *chType = ACT_BACK;
760
3.23k
          *chIndex = index - 3;
761
3.23k
        } else {
762
1.59k
          *chType = ACT_LFE;
763
1.59k
          *chIndex = 0;
764
1.59k
        }
765
4.83k
        break;
766
26.1k
      case 14: /* SCE,CPE,CPE,LFE,CPE */
767
26.1k
        switch (index) {
768
8.74k
          case 3:
769
8.74k
          case 4:
770
8.74k
            *chType = ACT_BACK;
771
8.74k
            *chIndex = index - 3;
772
8.74k
            break;
773
8.72k
          case 5:
774
8.72k
            *chType = ACT_LFE;
775
8.72k
            *chIndex = 0;
776
8.72k
            break;
777
8.69k
          case 6:
778
8.69k
          case 7:
779
8.69k
            *chType = ACT_FRONT_TOP;
780
8.69k
            *chIndex = index - 6; /* handle the top layer independently */
781
8.69k
            break;
782
26.1k
        }
783
26.1k
        break;
784
26.1k
      default:
785
0
        *chType = ACT_NONE;
786
0
        break;
787
56.0k
    }
788
56.0k
  }
789
445k
}
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
468k
                                 MP4_ELEMENT_ID elType) {
797
468k
  if (channelConfig > 0) {
798
    /* Constant channel mapping must have
799
       been set during initialization. */
800
460k
    if (IS_CHANNEL_ELEMENT(elType)) {
801
445k
      *elMapping = pPce->elCounter;
802
445k
      if (elList[pPce->elCounter] != elType &&
803
37.9k
          !IS_USAC_CHANNEL_ELEMENT(elType)) {
804
        /* Not in the list */
805
9.95k
        if ((channelConfig == 2) &&
806
9.31k
            (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
9.30k
          channelConfig = 1;
811
9.30k
        } else if ((elList[pPce->elCounter] == ID_LFE) &&
812
585
                   (elType ==
813
585
                    ID_SCE)) { /* Decode bitstreams which wrongly use ID_SCE
814
                                  instead of ID_LFE element type. */
815
585
          ;
816
585
        } else {
817
62
          return 0;
818
62
        }
819
9.95k
      }
820
      /* Assume all front channels */
821
445k
      getImplicitAudioChannelTypeAndIndex(
822
445k
          &chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx);
823
445k
      if (elType == ID_CPE || elType == ID_USAC_CPE) {
824
282k
        chType[channelIdx + 1] = chType[channelIdx];
825
282k
        chIndex[channelIdx + 1] = chIndex[channelIdx] + 1;
826
282k
      }
827
445k
      pPce->elCounter++;
828
445k
    }
829
    /* Accept all non-channel elements, too. */
830
460k
    return 1;
831
460k
  } else {
832
7.65k
    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
7.65k
    } else {
842
      /* Accept the additional channel(s), only if the tag is in the lists */
843
7.65k
      int isCpe = 0, i;
844
      /* Element counter */
845
7.65k
      int ec[PC_NUM_HEIGHT_LAYER] = {0};
846
      /* Channel counters */
847
7.65k
      int cc[PC_NUM_HEIGHT_LAYER] = {0};
848
7.65k
      int fc[PC_NUM_HEIGHT_LAYER] = {0}; /* front channel counter */
849
7.65k
      int sc[PC_NUM_HEIGHT_LAYER] = {0}; /* side channel counter */
850
7.65k
      int bc[PC_NUM_HEIGHT_LAYER] = {0}; /* back channel counter */
851
7.65k
      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
7.65k
      switch (elType) {
865
1.72k
        case ID_CPE:
866
1.72k
          isCpe = 1;
867
1.72k
          FDK_FALLTHROUGH;
868
4.81k
        case ID_SCE:
869
          /* search in front channels */
870
7.42k
          for (i = 0; i < pPce->NumFrontChannelElements; i++) {
871
4.21k
            int heightLayer = pPce->FrontElementHeightInfo[i];
872
4.21k
            if (isCpe == pPce->FrontElementIsCpe[i] &&
873
3.95k
                pPce->FrontElementTagSelect[i] == tag) {
874
1.60k
              int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
875
1.60k
              AUDIO_CHANNEL_TYPE aChType =
876
1.60k
                  (AUDIO_CHANNEL_TYPE)((heightLayer << 4) | ACT_FRONT);
877
1.75k
              for (h = heightLayer - 1; h >= 0; h -= 1) {
878
146
                int el;
879
                /* Count front channels/elements */
880
812
                for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
881
666
                  if (pPce->FrontElementHeightInfo[el] == h) {
882
221
                    elIdx += 1;
883
221
                    chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
884
221
                  }
885
666
                }
886
                /* Count side channels/elements */
887
333
                for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
888
187
                  if (pPce->SideElementHeightInfo[el] == h) {
889
62
                    elIdx += 1;
890
62
                    chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
891
62
                  }
892
187
                }
893
                /* Count back channels/elements */
894
260
                for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
895
114
                  if (pPce->BackElementHeightInfo[el] == h) {
896
38
                    elIdx += 1;
897
38
                    chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
898
38
                  }
899
114
                }
900
146
                if (h == 0) { /* normal height */
901
78
                  elIdx += pPce->NumLfeChannelElements;
902
78
                  chIdx += pPce->NumLfeChannelElements;
903
78
                }
904
146
              }
905
1.60k
              chMapping[chIdx] = channelIdx;
906
1.60k
              chType[chIdx] = aChType;
907
1.60k
              chIndex[chIdx] = fc[heightLayer];
908
1.60k
              if (isCpe) {
909
461
                chMapping[chIdx + 1] = channelIdx + 1;
910
461
                chType[chIdx + 1] = aChType;
911
461
                chIndex[chIdx + 1] = fc[heightLayer] + 1;
912
461
              }
913
1.60k
              *elMapping = elIdx;
914
1.60k
              return 1;
915
1.60k
            }
916
2.61k
            ec[heightLayer] += 1;
917
2.61k
            if (pPce->FrontElementIsCpe[i]) {
918
719
              cc[heightLayer] += 2;
919
719
              fc[heightLayer] += 2;
920
1.89k
            } else {
921
1.89k
              cc[heightLayer] += 1;
922
1.89k
              fc[heightLayer] += 1;
923
1.89k
            }
924
2.61k
          }
925
          /* search in side channels */
926
5.71k
          for (i = 0; i < pPce->NumSideChannelElements; i++) {
927
4.03k
            int heightLayer = pPce->SideElementHeightInfo[i];
928
4.03k
            if (isCpe == pPce->SideElementIsCpe[i] &&
929
3.83k
                pPce->SideElementTagSelect[i] == tag) {
930
1.52k
              int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
931
1.52k
              AUDIO_CHANNEL_TYPE aChType =
932
1.52k
                  (AUDIO_CHANNEL_TYPE)((heightLayer << 4) | ACT_SIDE);
933
1.69k
              for (h = heightLayer - 1; h >= 0; h -= 1) {
934
168
                int el;
935
                /* Count front channels/elements */
936
354
                for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
937
186
                  if (pPce->FrontElementHeightInfo[el] == h) {
938
78
                    elIdx += 1;
939
78
                    chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
940
78
                  }
941
186
                }
942
                /* Count side channels/elements */
943
778
                for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
944
610
                  if (pPce->SideElementHeightInfo[el] == h) {
945
124
                    elIdx += 1;
946
124
                    chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
947
124
                  }
948
610
                }
949
                /* Count back channels/elements */
950
364
                for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
951
196
                  if (pPce->BackElementHeightInfo[el] == h) {
952
60
                    elIdx += 1;
953
60
                    chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
954
60
                  }
955
196
                }
956
168
                if (h ==
957
168
                    0) { /* LFE channels belong to the normal height layer */
958
99
                  elIdx += pPce->NumLfeChannelElements;
959
99
                  chIdx += pPce->NumLfeChannelElements;
960
99
                }
961
168
              }
962
1.52k
              chMapping[chIdx] = channelIdx;
963
1.52k
              chType[chIdx] = aChType;
964
1.52k
              chIndex[chIdx] = sc[heightLayer];
965
1.52k
              if (isCpe) {
966
537
                chMapping[chIdx + 1] = channelIdx + 1;
967
537
                chType[chIdx + 1] = aChType;
968
537
                chIndex[chIdx + 1] = sc[heightLayer] + 1;
969
537
              }
970
1.52k
              *elMapping = elIdx;
971
1.52k
              return 1;
972
1.52k
            }
973
2.50k
            ec[heightLayer] += 1;
974
2.50k
            if (pPce->SideElementIsCpe[i]) {
975
1.00k
              cc[heightLayer] += 2;
976
1.00k
              sc[heightLayer] += 2;
977
1.50k
            } else {
978
1.50k
              cc[heightLayer] += 1;
979
1.50k
              sc[heightLayer] += 1;
980
1.50k
            }
981
2.50k
          }
982
          /* search in back channels */
983
3.25k
          for (i = 0; i < pPce->NumBackChannelElements; i++) {
984
3.22k
            int heightLayer = pPce->BackElementHeightInfo[i];
985
3.22k
            if (isCpe == pPce->BackElementIsCpe[i] &&
986
3.10k
                pPce->BackElementTagSelect[i] == tag) {
987
1.65k
              int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
988
1.65k
              AUDIO_CHANNEL_TYPE aChType =
989
1.65k
                  (AUDIO_CHANNEL_TYPE)((heightLayer << 4) | ACT_BACK);
990
1.82k
              for (h = heightLayer - 1; h >= 0; h -= 1) {
991
176
                int el;
992
                /* Count front channels/elements */
993
400
                for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
994
224
                  if (pPce->FrontElementHeightInfo[el] == h) {
995
77
                    elIdx += 1;
996
77
                    chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
997
77
                  }
998
224
                }
999
                /* Count side channels/elements */
1000
417
                for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
1001
241
                  if (pPce->SideElementHeightInfo[el] == h) {
1002
76
                    elIdx += 1;
1003
76
                    chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
1004
76
                  }
1005
241
                }
1006
                /* Count back channels/elements */
1007
707
                for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
1008
531
                  if (pPce->BackElementHeightInfo[el] == h) {
1009
157
                    elIdx += 1;
1010
157
                    chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
1011
157
                  }
1012
531
                }
1013
176
                if (h == 0) { /* normal height */
1014
94
                  elIdx += pPce->NumLfeChannelElements;
1015
94
                  chIdx += pPce->NumLfeChannelElements;
1016
94
                }
1017
176
              }
1018
1.65k
              chMapping[chIdx] = channelIdx;
1019
1.65k
              chType[chIdx] = aChType;
1020
1.65k
              chIndex[chIdx] = bc[heightLayer];
1021
1.65k
              if (isCpe) {
1022
719
                chMapping[chIdx + 1] = channelIdx + 1;
1023
719
                chType[chIdx + 1] = aChType;
1024
719
                chIndex[chIdx + 1] = bc[heightLayer] + 1;
1025
719
              }
1026
1.65k
              *elMapping = elIdx;
1027
1.65k
              return 1;
1028
1.65k
            }
1029
1.57k
            ec[heightLayer] += 1;
1030
1.57k
            if (pPce->BackElementIsCpe[i]) {
1031
562
              cc[heightLayer] += 2;
1032
562
              bc[heightLayer] += 2;
1033
1.01k
            } else {
1034
1.01k
              cc[heightLayer] += 1;
1035
1.01k
              bc[heightLayer] += 1;
1036
1.01k
            }
1037
1.57k
          }
1038
29
          break;
1039
1040
746
        case ID_LFE: { /* Unfortunately we have to go through all normal height
1041
                          layer elements to get the position of the LFE
1042
                          channels. Start with counting the front
1043
                          channels/elements at normal height */
1044
1.78k
          for (i = 0; i < pPce->NumFrontChannelElements; i += 1) {
1045
1.04k
            int heightLayer = pPce->FrontElementHeightInfo[i];
1046
1.04k
            ec[heightLayer] += 1;
1047
1.04k
            cc[heightLayer] += (pPce->FrontElementIsCpe[i]) ? 2 : 1;
1048
1.04k
          }
1049
          /* Count side channels/elements at normal height */
1050
1.61k
          for (i = 0; i < pPce->NumSideChannelElements; i += 1) {
1051
873
            int heightLayer = pPce->SideElementHeightInfo[i];
1052
873
            ec[heightLayer] += 1;
1053
873
            cc[heightLayer] += (pPce->SideElementIsCpe[i]) ? 2 : 1;
1054
873
          }
1055
          /* Count back channels/elements at normal height */
1056
1.63k
          for (i = 0; i < pPce->NumBackChannelElements; i += 1) {
1057
890
            int heightLayer = pPce->BackElementHeightInfo[i];
1058
890
            ec[heightLayer] += 1;
1059
890
            cc[heightLayer] += (pPce->BackElementIsCpe[i]) ? 2 : 1;
1060
890
          }
1061
1062
          /* search in lfe channels */
1063
834
          for (i = 0; i < pPce->NumLfeChannelElements; i++) {
1064
817
            int elIdx =
1065
817
                ec[0]; /* LFE channels belong to the normal height layer */
1066
817
            int chIdx = cc[0];
1067
817
            if (pPce->LfeElementTagSelect[i] == tag) {
1068
729
              chMapping[chIdx] = channelIdx;
1069
729
              *elMapping = elIdx;
1070
729
              chType[chIdx] = ACT_LFE;
1071
729
              chIndex[chIdx] = lc;
1072
729
              return 1;
1073
729
            }
1074
88
            ec[0] += 1;
1075
88
            cc[0] += 1;
1076
88
            lc += 1;
1077
88
          }
1078
746
        } break;
1079
1080
        /* Non audio elements */
1081
21
        case ID_CCE:
1082
          /* search in cce channels */
1083
95
          for (i = 0; i < pPce->NumValidCcElements; i++) {
1084
88
            if (pPce->ValidCcElementTagSelect[i] == tag) {
1085
14
              return 1;
1086
14
            }
1087
88
          }
1088
7
          break;
1089
2.07k
        case ID_DSE:
1090
          /* search associated data elements */
1091
3.67k
          for (i = 0; i < pPce->NumAssocDataElements; i++) {
1092
1.81k
            if (pPce->AssocDataElementTagSelect[i] == tag) {
1093
207
              return 1;
1094
207
            }
1095
1.81k
          }
1096
1.86k
          break;
1097
1.86k
        default:
1098
0
          return 0;
1099
7.65k
      }
1100
1.91k
      return 0; /* not found in any list */
1101
7.65k
    }
1102
7.65k
  }
1103
1104
0
  return 1;
1105
468k
}
1106
1107
24.1k
#define SPEAKER_PLANE_NORMAL 0
1108
6.98k
#define SPEAKER_PLANE_TOP 1
1109
23.7k
#define SPEAKER_PLANE_BOTTOM 2
1110
1111
void CProgramConfig_GetChannelDescription(const UINT chConfig,
1112
                                          const CProgramConfig *pPce,
1113
                                          AUDIO_CHANNEL_TYPE chType[],
1114
0
                                          UCHAR chIndex[]) {
1115
0
  FDK_ASSERT(chType != NULL);
1116
0
  FDK_ASSERT(chIndex != NULL);
1117
1118
0
  if ((chConfig == 0) && (pPce != NULL)) {
1119
0
    if (pPce->isValid) {
1120
0
      int spkPlane, chIdx = 0;
1121
0
      for (spkPlane = SPEAKER_PLANE_NORMAL; spkPlane <= SPEAKER_PLANE_BOTTOM;
1122
0
           spkPlane += 1) {
1123
0
        int elIdx, grpChIdx = 0;
1124
0
        for (elIdx = 0; elIdx < pPce->NumFrontChannelElements; elIdx += 1) {
1125
0
          if (pPce->FrontElementHeightInfo[elIdx] == spkPlane) {
1126
0
            chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_FRONT);
1127
0
            chIndex[chIdx++] = grpChIdx++;
1128
0
            if (pPce->FrontElementIsCpe[elIdx]) {
1129
0
              chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_FRONT);
1130
0
              chIndex[chIdx++] = grpChIdx++;
1131
0
            }
1132
0
          }
1133
0
        }
1134
0
        grpChIdx = 0;
1135
0
        for (elIdx = 0; elIdx < pPce->NumSideChannelElements; elIdx += 1) {
1136
0
          if (pPce->SideElementHeightInfo[elIdx] == spkPlane) {
1137
0
            chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_SIDE);
1138
0
            chIndex[chIdx++] = grpChIdx++;
1139
0
            if (pPce->SideElementIsCpe[elIdx]) {
1140
0
              chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_SIDE);
1141
0
              chIndex[chIdx++] = grpChIdx++;
1142
0
            }
1143
0
          }
1144
0
        }
1145
0
        grpChIdx = 0;
1146
0
        for (elIdx = 0; elIdx < pPce->NumBackChannelElements; elIdx += 1) {
1147
0
          if (pPce->BackElementHeightInfo[elIdx] == spkPlane) {
1148
0
            chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_BACK);
1149
0
            chIndex[chIdx++] = grpChIdx++;
1150
0
            if (pPce->BackElementIsCpe[elIdx]) {
1151
0
              chType[chIdx] = (AUDIO_CHANNEL_TYPE)((spkPlane << 4) | ACT_BACK);
1152
0
              chIndex[chIdx++] = grpChIdx++;
1153
0
            }
1154
0
          }
1155
0
        }
1156
0
        grpChIdx = 0;
1157
0
        if (spkPlane == SPEAKER_PLANE_NORMAL) {
1158
0
          for (elIdx = 0; elIdx < pPce->NumLfeChannelElements; elIdx += 1) {
1159
0
            chType[chIdx] = ACT_LFE;
1160
0
            chIndex[chIdx++] = grpChIdx++;
1161
0
          }
1162
0
        }
1163
0
      }
1164
0
    }
1165
0
  } else {
1166
0
    int chIdx;
1167
0
    for (chIdx = 0; chIdx < getNumberOfTotalChannels(chConfig); chIdx += 1) {
1168
0
      getImplicitAudioChannelTypeAndIndex(&chType[chIdx], &chIndex[chIdx],
1169
0
                                          chConfig, chIdx);
1170
0
    }
1171
0
  }
1172
0
}
1173
1174
int CProgramConfig_GetPceChMap(const CProgramConfig *pPce, UCHAR pceChMap[],
1175
1.39k
                               const UINT pceChMapLen) {
1176
1.39k
  const UCHAR *nElements = &pPce->NumFrontChannelElements;
1177
1.39k
  const UCHAR *elHeight[3], *elIsCpe[3];
1178
1.39k
  unsigned chIdx, plane, grp, offset, totCh[3], numCh[3][4];
1179
1180
1.39k
  FDK_ASSERT(pPce != NULL);
1181
1.39k
  FDK_ASSERT(pceChMap != NULL);
1182
1183
  /* Init counter: */
1184
1.39k
  FDKmemclear(totCh, 3 * sizeof(unsigned));
1185
1.39k
  FDKmemclear(numCh, 3 * 4 * sizeof(unsigned));
1186
1187
  /* Analyse PCE: */
1188
1.39k
  elHeight[0] = pPce->FrontElementHeightInfo;
1189
1.39k
  elIsCpe[0] = pPce->FrontElementIsCpe;
1190
1.39k
  elHeight[1] = pPce->SideElementHeightInfo;
1191
1.39k
  elIsCpe[1] = pPce->SideElementIsCpe;
1192
1.39k
  elHeight[2] = pPce->BackElementHeightInfo;
1193
1.39k
  elIsCpe[2] = pPce->BackElementIsCpe;
1194
1195
5.58k
  for (plane = 0; plane <= SPEAKER_PLANE_BOTTOM; plane += 1) {
1196
16.7k
    for (grp = 0; grp < 3; grp += 1) { /* front, side, back */
1197
12.5k
      unsigned el;
1198
26.0k
      for (el = 0; el < nElements[grp]; el += 1) {
1199
13.5k
        if (elHeight[grp][el] == plane) {
1200
4.50k
          unsigned elCh = elIsCpe[grp][el] ? 2 : 1;
1201
4.50k
          numCh[plane][grp] += elCh;
1202
4.50k
          totCh[plane] += elCh;
1203
4.50k
        }
1204
13.5k
      }
1205
12.5k
    }
1206
4.18k
    if (plane == SPEAKER_PLANE_NORMAL) {
1207
1.39k
      unsigned elCh = pPce->NumLfeChannelElements;
1208
1.39k
      numCh[plane][grp] += elCh;
1209
1.39k
      totCh[plane] += elCh;
1210
1.39k
    }
1211
4.18k
  }
1212
  /* Sanity checks: */
1213
1.39k
  chIdx = totCh[SPEAKER_PLANE_NORMAL] + totCh[SPEAKER_PLANE_TOP] +
1214
1.39k
          totCh[SPEAKER_PLANE_BOTTOM];
1215
1.39k
  if (chIdx > pceChMapLen) {
1216
0
    return -1;
1217
0
  }
1218
1219
  /* Create map: */
1220
1.39k
  offset = grp = 0;
1221
1.39k
  unsigned grpThresh = numCh[SPEAKER_PLANE_NORMAL][grp];
1222
8.41k
  for (chIdx = 0; chIdx < totCh[SPEAKER_PLANE_NORMAL]; chIdx += 1) {
1223
10.1k
    while ((chIdx >= grpThresh) && (grp < 3)) {
1224
3.13k
      offset += numCh[1][grp] + numCh[2][grp];
1225
3.13k
      grp += 1;
1226
3.13k
      grpThresh += numCh[SPEAKER_PLANE_NORMAL][grp];
1227
3.13k
    }
1228
7.01k
    pceChMap[chIdx] = chIdx + offset;
1229
7.01k
  }
1230
1.39k
  offset = 0;
1231
6.98k
  for (grp = 0; grp < 4; grp += 1) { /* front, side, back and lfe */
1232
5.58k
    offset += numCh[SPEAKER_PLANE_NORMAL][grp];
1233
16.7k
    for (plane = SPEAKER_PLANE_TOP; plane <= SPEAKER_PLANE_BOTTOM; plane += 1) {
1234
11.1k
      unsigned mapCh;
1235
11.1k
      for (mapCh = 0; mapCh < numCh[plane][grp]; mapCh += 1) {
1236
0
        pceChMap[chIdx++] = offset;
1237
0
        offset += 1;
1238
0
      }
1239
11.1k
    }
1240
5.58k
  }
1241
1.39k
  return 0;
1242
1.39k
}
1243
1244
int CProgramConfig_GetElementTable(const CProgramConfig *pPce,
1245
                                   MP4_ELEMENT_ID elList[],
1246
148k
                                   const INT elListSize, UCHAR *pChMapIdx) {
1247
148k
  int i, el = 0;
1248
1249
148k
  FDK_ASSERT(elList != NULL);
1250
148k
  FDK_ASSERT(pChMapIdx != NULL);
1251
148k
  FDK_ASSERT(pPce != NULL);
1252
1253
148k
  *pChMapIdx = 0;
1254
1255
148k
  if ((elListSize <
1256
148k
       pPce->NumFrontChannelElements + pPce->NumSideChannelElements +
1257
148k
           pPce->NumBackChannelElements + pPce->NumLfeChannelElements) ||
1258
148k
      (pPce->NumChannels == 0)) {
1259
203
    return 0;
1260
203
  }
1261
1262
161k
  for (i = 0; i < pPce->NumFrontChannelElements; i += 1) {
1263
12.8k
    elList[el++] = (pPce->FrontElementIsCpe[i]) ? ID_CPE : ID_SCE;
1264
12.8k
  }
1265
1266
167k
  for (i = 0; i < pPce->NumSideChannelElements; i += 1) {
1267
18.8k
    elList[el++] = (pPce->SideElementIsCpe[i]) ? ID_CPE : ID_SCE;
1268
18.8k
  }
1269
1270
700k
  for (i = 0; i < pPce->NumBackChannelElements; i += 1) {
1271
552k
    elList[el++] = (pPce->BackElementIsCpe[i]) ? ID_CPE : ID_SCE;
1272
552k
  }
1273
1274
296k
  for (i = 0; i < pPce->NumLfeChannelElements; i += 1) {
1275
148k
    elList[el++] = ID_LFE;
1276
148k
  }
1277
1278
  /* Find an corresponding channel configuration if possible */
1279
148k
  switch (pPce->NumChannels) {
1280
1.52k
    case 1:
1281
2.38k
    case 2:
1282
      /* One and two channels have no alternatives. */
1283
2.38k
      *pChMapIdx = pPce->NumChannels;
1284
2.38k
      break;
1285
1.00k
    case 3:
1286
2.03k
    case 4:
1287
3.26k
    case 5:
1288
3.97k
    case 6: { /* Test if the number of channels can be used as channel config:
1289
               */
1290
3.97k
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1291
      /* Create a PCE for the config to test ... */
1292
3.97k
      CProgramConfig_GetDefault(tmpPce, pPce->NumChannels);
1293
      /* ... and compare it with the given one. */
1294
3.97k
      *pChMapIdx = (!(CProgramConfig_Compare(pPce, tmpPce) & 0xE))
1295
3.97k
                       ? pPce->NumChannels
1296
3.97k
                       : 0;
1297
      /* If compare result is 0 or 1 we can be sure that it is channel
1298
       * config 11. */
1299
3.97k
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1300
3.97k
    } break;
1301
1.39k
    case 7: {
1302
1.39k
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1303
      /* Create a PCE for the config to test ... */
1304
1.39k
      CProgramConfig_GetDefault(tmpPce, 11);
1305
      /* ... and compare it with the given one. */
1306
1.39k
      *pChMapIdx = (!(CProgramConfig_Compare(pPce, tmpPce) & 0xE)) ? 11 : 0;
1307
      /* If compare result is 0 or 1 we can be sure that it is channel
1308
       * config 11. */
1309
1.39k
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1310
1.39k
    } break;
1311
140k
    case 8: { /* Try the four possible 7.1ch configurations. One after the
1312
                 other. */
1313
140k
      UCHAR testCfg[4] = {32, 14, 12, 7};
1314
140k
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1315
701k
      for (i = 0; i < 4; i += 1) {
1316
        /* Create a PCE for the config to test ... */
1317
561k
        CProgramConfig_GetDefault(tmpPce, testCfg[i]);
1318
        /* ... and compare it with the given one. */
1319
561k
        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
1.03k
          *pChMapIdx = (testCfg[i] == 32) ? 12 : testCfg[i];
1325
1.03k
        }
1326
561k
      }
1327
140k
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1328
140k
    } break;
1329
254
    default:
1330
      /* The PCE does not match any predefined channel configuration. */
1331
254
      *pChMapIdx = 0;
1332
254
      break;
1333
148k
  }
1334
1335
148k
  return el;
1336
148k
}
1337
1338
913k
static AUDIO_OBJECT_TYPE getAOT(HANDLE_FDK_BITSTREAM bs) {
1339
913k
  int tmp = 0;
1340
1341
913k
  tmp = FDKreadBits(bs, 5);
1342
913k
  if (tmp == AOT_ESCAPE) {
1343
429k
    int tmp2 = FDKreadBits(bs, 6);
1344
429k
    tmp = 32 + tmp2;
1345
429k
  }
1346
1347
913k
  return (AUDIO_OBJECT_TYPE)tmp;
1348
913k
}
1349
1350
1.18M
static INT getSampleRate(HANDLE_FDK_BITSTREAM bs, UCHAR *index, int nBits) {
1351
1.18M
  INT sampleRate;
1352
1.18M
  int idx;
1353
1354
1.18M
  idx = FDKreadBits(bs, nBits);
1355
1.18M
  if (idx == (1 << nBits) - 1) {
1356
23.6k
    if (FDKgetValidBits(bs) < 24) {
1357
254
      return 0;
1358
254
    }
1359
23.3k
    sampleRate = FDKreadBits(bs, 24);
1360
1.15M
  } else {
1361
1.15M
    sampleRate = SamplingRateTable[idx];
1362
1.15M
  }
1363
1364
1.18M
  *index = idx;
1365
1366
1.18M
  return sampleRate;
1367
1.18M
}
1368
1369
static TRANSPORTDEC_ERROR GaSpecificConfig_Parse(CSGaSpecificConfig *self,
1370
                                                 CSAudioSpecificConfig *asc,
1371
                                                 HANDLE_FDK_BITSTREAM bs,
1372
446k
                                                 UINT ascStartAnchor) {
1373
446k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1374
1375
446k
  self->m_frameLengthFlag = FDKreadBits(bs, 1);
1376
1377
446k
  self->m_dependsOnCoreCoder = FDKreadBits(bs, 1);
1378
1379
446k
  if (self->m_dependsOnCoreCoder) self->m_coreCoderDelay = FDKreadBits(bs, 14);
1380
1381
446k
  self->m_extensionFlag = FDKreadBits(bs, 1);
1382
1383
446k
  if (asc->m_channelConfiguration == 0) {
1384
186k
    CProgramConfig_Read(&asc->m_progrConfigElement, bs, ascStartAnchor);
1385
186k
  }
1386
1387
446k
  if ((asc->m_aot == AOT_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_SCAL)) {
1388
56.1k
    self->m_layer = FDKreadBits(bs, 3);
1389
56.1k
  }
1390
1391
446k
  if (self->m_extensionFlag) {
1392
230k
    if (asc->m_aot == AOT_ER_BSAC) {
1393
2.20k
      self->m_numOfSubFrame = FDKreadBits(bs, 5);
1394
2.20k
      self->m_layerLength = FDKreadBits(bs, 11);
1395
2.20k
    }
1396
1397
230k
    if ((asc->m_aot == AOT_ER_AAC_LC) || (asc->m_aot == AOT_ER_AAC_LTP) ||
1398
229k
        (asc->m_aot == AOT_ER_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_LD)) {
1399
42.5k
      asc->m_vcb11Flag = FDKreadBits(bs, 1); /* aacSectionDataResilienceFlag */
1400
42.5k
      asc->m_rvlcFlag =
1401
42.5k
          FDKreadBits(bs, 1); /* aacScalefactorDataResilienceFlag */
1402
42.5k
      asc->m_hcrFlag = FDKreadBits(bs, 1); /* aacSpectralDataResilienceFlag */
1403
42.5k
    }
1404
1405
230k
    self->m_extensionFlag3 = FDKreadBits(bs, 1);
1406
230k
  }
1407
446k
  return (ErrorStatus);
1408
446k
}
1409
1410
406k
static INT skipSbrHeader(HANDLE_FDK_BITSTREAM hBs, int isUsac) {
1411
  /* Dummy parse SbrDfltHeader() */
1412
406k
  INT dflt_header_extra1, dflt_header_extra2, bitsToSkip = 0;
1413
1414
406k
  if (!isUsac) {
1415
266k
    bitsToSkip = 6;
1416
266k
    FDKpushFor(hBs, 6); /* amp res 1, xover freq 3, reserved 2 */
1417
266k
  }
1418
406k
  bitsToSkip += 8;
1419
406k
  FDKpushFor(hBs, 8); /* start / stop freq */
1420
406k
  bitsToSkip += 2;
1421
406k
  dflt_header_extra1 = FDKreadBit(hBs);
1422
406k
  dflt_header_extra2 = FDKreadBit(hBs);
1423
406k
  bitsToSkip += 5 * dflt_header_extra1 + 6 * dflt_header_extra2;
1424
406k
  FDKpushFor(hBs, 5 * dflt_header_extra1 + 6 * dflt_header_extra2);
1425
1426
406k
  return bitsToSkip;
1427
406k
}
1428
1429
static INT ld_sbr_header(CSAudioSpecificConfig *asc, const INT dsFactor,
1430
87.4k
                         HANDLE_FDK_BITSTREAM hBs, CSTpCallBacks *cb) {
1431
87.4k
  const int channelConfiguration = asc->m_channelConfiguration;
1432
87.4k
  int i = 0, j = 0;
1433
87.4k
  INT error = 0;
1434
87.4k
  MP4_ELEMENT_ID element = ID_NONE;
1435
1436
  /* check whether the channelConfiguration is defined in
1437
   * channel_configuration_array */
1438
87.4k
  if (channelConfiguration < 0 ||
1439
87.4k
      channelConfiguration > (INT)(sizeof(channel_configuration_array) /
1440
87.4k
                                       sizeof(MP4_ELEMENT_ID **) -
1441
87.4k
                                   1)) {
1442
0
    return TRANSPORTDEC_PARSE_ERROR;
1443
0
  }
1444
1445
  /* read elements of the passed channel_configuration until there is ID_NONE */
1446
379k
  while ((element = channel_configuration_array[channelConfiguration][j]) !=
1447
379k
         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
300k
    if (element == ID_SCE || element == ID_CPE || element == ID_LFE) {
1453
300k
      error |= cb->cbSbr(
1454
300k
          cb->cbSbrData, hBs, asc->m_samplingFrequency / dsFactor,
1455
300k
          asc->m_extensionSamplingFrequency / dsFactor,
1456
300k
          asc->m_samplesPerFrame / dsFactor, AOT_ER_AAC_ELD, element, i++, 0, 0,
1457
300k
          asc->configMode, &asc->SbrConfigChanged, dsFactor);
1458
300k
      if (error != TRANSPORTDEC_OK) {
1459
8.26k
        goto bail;
1460
8.26k
      }
1461
300k
    }
1462
292k
    j++;
1463
292k
  }
1464
87.4k
bail:
1465
87.4k
  return error;
1466
87.4k
}
1467
1468
static TRANSPORTDEC_ERROR EldSpecificConfig_Parse(CSAudioSpecificConfig *asc,
1469
                                                  HANDLE_FDK_BITSTREAM hBs,
1470
181k
                                                  CSTpCallBacks *cb) {
1471
181k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1472
181k
  CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig;
1473
181k
  UINT eldExtType;
1474
181k
  int eldExtLen, len, cnt, ldSbrLen = 0, eldExtLenSum, numSbrHeader = 0,
1475
181k
                           sbrIndex, eldExtCnt = 0;
1476
1477
181k
  unsigned char downscale_fill_nibble;
1478
1479
181k
  FDKmemclear(esc, sizeof(CSEldSpecificConfig));
1480
1481
181k
  esc->m_frameLengthFlag = FDKreadBits(hBs, 1);
1482
181k
  if (esc->m_frameLengthFlag) {
1483
96.1k
    asc->m_samplesPerFrame = 480;
1484
96.1k
  } else {
1485
85.1k
    asc->m_samplesPerFrame = 512;
1486
85.1k
  }
1487
1488
181k
  asc->m_vcb11Flag = FDKreadBits(hBs, 1);
1489
181k
  asc->m_rvlcFlag = FDKreadBits(hBs, 1);
1490
181k
  asc->m_hcrFlag = FDKreadBits(hBs, 1);
1491
1492
181k
  esc->m_sbrPresentFlag = FDKreadBits(hBs, 1);
1493
1494
181k
  if (esc->m_sbrPresentFlag == 1) {
1495
92.9k
    esc->m_sbrSamplingRate =
1496
92.9k
        FDKreadBits(hBs, 1); /* 0: single rate, 1: dual rate */
1497
92.9k
    esc->m_sbrCrcFlag = FDKreadBits(hBs, 1);
1498
1499
92.9k
    asc->m_extensionSamplingFrequency = asc->m_samplingFrequency
1500
92.9k
                                        << esc->m_sbrSamplingRate;
1501
1502
92.9k
    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
92.9k
      switch (asc->m_channelConfiguration) {
1507
8.67k
        case 1:
1508
31.7k
        case 2:
1509
31.7k
          numSbrHeader = 1;
1510
31.7k
          break;
1511
1.32k
        case 3:
1512
1.32k
          numSbrHeader = 2;
1513
1.32k
          break;
1514
4.43k
        case 4:
1515
5.16k
        case 5:
1516
6.08k
        case 6:
1517
6.08k
          numSbrHeader = 3;
1518
6.08k
          break;
1519
7.92k
        case 7:
1520
13.1k
        case 11:
1521
18.9k
        case 12:
1522
53.5k
        case 14:
1523
53.5k
          numSbrHeader = 4;
1524
53.5k
          break;
1525
187
        default:
1526
187
          numSbrHeader = 0;
1527
187
          break;
1528
92.9k
      }
1529
359k
      for (sbrIndex = 0; sbrIndex < numSbrHeader; sbrIndex++) {
1530
266k
        ldSbrLen += skipSbrHeader(hBs, 0);
1531
266k
      }
1532
92.9k
    } else {
1533
0
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1534
0
    }
1535
92.9k
  }
1536
181k
  esc->m_useLdQmfTimeAlign = 0;
1537
1538
  /* new ELD syntax */
1539
181k
  eldExtLenSum = FDKgetValidBits(hBs);
1540
181k
  esc->m_downscaledSamplingFrequency = asc->m_samplingFrequency;
1541
  /* parse ExtTypeConfigData */
1542
498k
  while (((eldExtType = FDKreadBits(hBs, 4)) != ELDEXT_TERM) &&
1543
346k
         ((INT)FDKgetValidBits(hBs) >= 0) && (eldExtCnt++ < 15)) {
1544
342k
    eldExtLen = len = FDKreadBits(hBs, 4);
1545
342k
    if (len == 0xf) {
1546
10.6k
      len = FDKreadBits(hBs, 8);
1547
10.6k
      eldExtLen += len;
1548
1549
10.6k
      if (len == 0xff) {
1550
2.20k
        len = FDKreadBits(hBs, 16);
1551
2.20k
        eldExtLen += len;
1552
2.20k
      }
1553
10.6k
    }
1554
1555
342k
    switch (eldExtType) {
1556
129k
      case ELDEXT_LDSAC:
1557
129k
        esc->m_useLdQmfTimeAlign = 1;
1558
129k
        if (cb->cbSsc != NULL) {
1559
129k
          ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc(
1560
129k
              cb->cbSscData, hBs, asc->m_aot,
1561
129k
              asc->m_samplingFrequency << esc->m_sbrSamplingRate,
1562
129k
              asc->m_samplesPerFrame << esc->m_sbrSamplingRate,
1563
129k
              asc->m_channelConfiguration, 1, /* stereoConfigIndex */
1564
129k
              -1, /* nTimeSlots: read from bitstream */
1565
129k
              eldExtLen, asc->configMode, &asc->SacConfigChanged);
1566
129k
          if (ErrorStatus != TRANSPORTDEC_OK) {
1567
22.7k
            return TRANSPORTDEC_PARSE_ERROR;
1568
22.7k
          }
1569
107k
          if (esc->m_downscaledSamplingFrequency != asc->m_samplingFrequency) {
1570
286
            return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled
1571
                                                       mode not allowed */
1572
286
          }
1573
106k
          break;
1574
107k
        }
1575
1576
0
        FDK_FALLTHROUGH;
1577
184k
      default:
1578
95.1M
        for (cnt = 0; cnt < eldExtLen; cnt++) {
1579
95.0M
          FDKreadBits(hBs, 8);
1580
95.0M
        }
1581
184k
        break;
1582
1583
28.8k
      case ELDEXT_DOWNSCALEINFO:
1584
28.8k
        UCHAR tmpDownscaleFreqIdx;
1585
28.8k
        esc->m_downscaledSamplingFrequency =
1586
28.8k
            getSampleRate(hBs, &tmpDownscaleFreqIdx, 4);
1587
28.8k
        if (esc->m_downscaledSamplingFrequency == 0 ||
1588
28.4k
            esc->m_downscaledSamplingFrequency > 96000) {
1589
625
          return TRANSPORTDEC_PARSE_ERROR;
1590
625
        }
1591
28.2k
        downscale_fill_nibble = FDKreadBits(hBs, 4);
1592
28.2k
        if (downscale_fill_nibble != 0x0) {
1593
1.48k
          return TRANSPORTDEC_PARSE_ERROR;
1594
1.48k
        }
1595
26.7k
        if (esc->m_useLdQmfTimeAlign == 1) {
1596
866
          return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled
1597
                                                     mode not allowed */
1598
866
        }
1599
25.8k
        break;
1600
342k
    }
1601
342k
  }
1602
155k
  if (eldExtType != ELDEXT_TERM) {
1603
3.12k
    return TRANSPORTDEC_PARSE_ERROR;
1604
3.12k
  }
1605
1606
152k
  if ((INT)FDKgetValidBits(hBs) < 0) {
1607
969
    return TRANSPORTDEC_PARSE_ERROR;
1608
969
  }
1609
1610
151k
  if (esc->m_sbrPresentFlag == 1 && numSbrHeader != 0) {
1611
87.8k
    INT dsFactor = 1; /* Downscale factor must be 1 or even for SBR */
1612
87.8k
    if (esc->m_downscaledSamplingFrequency != 0) {
1613
87.8k
      if (asc->m_samplingFrequency % esc->m_downscaledSamplingFrequency != 0) {
1614
234
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1615
234
      }
1616
87.6k
      dsFactor = asc->m_samplingFrequency / esc->m_downscaledSamplingFrequency;
1617
87.6k
      if (dsFactor != 1 && (dsFactor)&1) {
1618
199
        return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* SBR needs an even downscale
1619
                                                   factor */
1620
199
      }
1621
87.4k
      if (dsFactor != 1 && dsFactor != 2 && dsFactor != 4) {
1622
2.30k
        dsFactor = 1; /* don't apply dsf for not yet supported even dsfs */
1623
2.30k
      }
1624
87.4k
      if ((INT)asc->m_samplesPerFrame % dsFactor != 0) {
1625
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* frameSize/dsf must be an
1626
                                                   integer number */
1627
0
      }
1628
87.4k
    }
1629
87.4k
    eldExtLenSum = eldExtLenSum - FDKgetValidBits(hBs);
1630
87.4k
    FDKpushBack(hBs, eldExtLenSum + ldSbrLen);
1631
87.4k
    if (0 != ld_sbr_header(asc, dsFactor, hBs, cb)) {
1632
8.26k
      return TRANSPORTDEC_PARSE_ERROR;
1633
8.26k
    }
1634
79.1k
    FDKpushFor(hBs, eldExtLenSum);
1635
79.1k
  }
1636
142k
  return (ErrorStatus);
1637
151k
}
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
394k
    UCHAR *configTargetBuffer, const USHORT configTargetBufferSize_bytes) {
1648
394k
  FDK_BITSTREAM usacConf;
1649
394k
  UINT const nBits = fAbs(configSize_bits);
1650
394k
  UINT j, tmp;
1651
1652
394k
  if (nBits > 8 * (UINT)configTargetBufferSize_bytes) {
1653
2.77k
    return 1;
1654
2.77k
  }
1655
392k
  FDKmemclear(configTargetBuffer, configTargetBufferSize_bytes);
1656
1657
392k
  FDKinitBitStream(&usacConf, configTargetBuffer, configTargetBufferSize_bytes,
1658
392k
                   nBits, BS_WRITER);
1659
392k
  if (configSize_bits < 0) {
1660
392k
    FDKpushBack(hBs, nBits);
1661
392k
  }
1662
1.28M
  for (j = nBits; j > 31; j -= 32) {
1663
887k
    tmp = FDKreadBits(hBs, 32);
1664
887k
    FDKwriteBits(&usacConf, tmp, 32);
1665
887k
  }
1666
392k
  if (j > 0) {
1667
390k
    tmp = FDKreadBits(hBs, j);
1668
390k
    FDKwriteBits(&usacConf, tmp, j);
1669
390k
  }
1670
392k
  FDKsyncCache(&usacConf);
1671
392k
  if (configSize_bits > 0) {
1672
0
    FDKpushBack(hBs, nBits);
1673
0
  }
1674
1675
392k
  return 0;
1676
394k
}
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
274k
                                           const AUDIO_OBJECT_TYPE aot) {
1695
274k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1696
1697
274k
  UINT usacExtElementType = escapedValue(hBs, 4, 8, 16);
1698
1699
  /* recurve extension elements which are invalid for USAC */
1700
274k
  if (aot == AOT_USAC) {
1701
274k
    switch (usacExtElementType) {
1702
20.1k
      case ID_EXT_ELE_FILL:
1703
23.6k
      case ID_EXT_ELE_MPEGS:
1704
27.5k
      case ID_EXT_ELE_SAOC:
1705
36.3k
      case ID_EXT_ELE_AUDIOPREROLL:
1706
202k
      case ID_EXT_ELE_UNI_DRC:
1707
202k
        break;
1708
72.0k
      default:
1709
72.0k
        usacExtElementType = ID_EXT_ELE_UNKNOWN;
1710
72.0k
        break;
1711
274k
    }
1712
274k
  }
1713
1714
274k
  int usacExtElementConfigLength = escapedValue(hBs, 4, 8, 16);
1715
274k
  extElement->usacExtElementConfigLength = (USHORT)usacExtElementConfigLength;
1716
274k
  INT bsAnchor;
1717
1718
274k
  if (FDKreadBit(hBs)) /* usacExtElementDefaultLengthPresent */
1719
19.3k
    extElement->usacExtElementDefaultLength = escapedValue(hBs, 8, 16, 0) + 1;
1720
255k
  else
1721
255k
    extElement->usacExtElementDefaultLength = 0;
1722
1723
274k
  extElement->usacExtElementPayloadFrag = FDKreadBit(hBs);
1724
1725
274k
  bsAnchor = (INT)FDKgetValidBits(hBs);
1726
1727
274k
  switch (usacExtElementType) {
1728
72.0k
    case ID_EXT_ELE_UNKNOWN:
1729
92.1k
    case ID_EXT_ELE_FILL:
1730
92.1k
      break;
1731
8.81k
    case ID_EXT_ELE_AUDIOPREROLL:
1732
      /* No configuration element */
1733
8.81k
      extElement->usacExtElementHasAudioPreRoll = 1;
1734
8.81k
      break;
1735
166k
    case ID_EXT_ELE_UNI_DRC: {
1736
166k
      if (cb->cbUniDrc != NULL) {
1737
166k
        ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1738
166k
            cb->cbUniDrcData, hBs, usacExtElementConfigLength,
1739
166k
            0, /* uniDrcConfig */
1740
166k
            subStreamIndex, 0, aot);
1741
166k
        if (ErrorStatus != TRANSPORTDEC_OK) {
1742
0
          return ErrorStatus;
1743
0
        }
1744
166k
      }
1745
166k
    } break;
1746
166k
    default:
1747
7.45k
      usacExtElementType = ID_EXT_ELE_UNKNOWN;
1748
7.45k
      break;
1749
274k
  }
1750
274k
  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
274k
  {
1755
274k
    INT left_bits = (usacExtElementConfigLength << 3) -
1756
274k
                    (bsAnchor - (INT)FDKgetValidBits(hBs));
1757
274k
    if (left_bits >= 0) {
1758
267k
      FDKpushFor(hBs, left_bits);
1759
267k
    } else {
1760
      /* parsed too many bits */
1761
7.10k
      ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
1762
7.10k
    }
1763
274k
  }
1764
1765
274k
  return ErrorStatus;
1766
274k
}
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
18.8k
                                          const CSTpCallBacks *cb) {
1776
18.8k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1777
1778
18.8k
  int numConfigExtensions;
1779
18.8k
  UINT usacConfigExtType;
1780
18.8k
  int usacConfigExtLength;
1781
18.8k
  int loudnessInfoSetIndex =
1782
18.8k
      -1; /* index of loudnessInfoSet config extension. -1 if not contained. */
1783
18.8k
  int tmp_subStreamIndex = 0;
1784
18.8k
  AUDIO_OBJECT_TYPE tmp_aot = AOT_USAC;
1785
1786
18.8k
  numConfigExtensions = (int)escapedValue(hBs, 2, 4, 8) + 1;
1787
95.0k
  for (int confExtIdx = 0; confExtIdx < numConfigExtensions; confExtIdx++) {
1788
87.7k
    INT nbits;
1789
87.7k
    int loudnessInfoSetConfigExtensionPosition = FDKgetValidBits(hBs);
1790
87.7k
    usacConfigExtType = escapedValue(hBs, 4, 8, 16);
1791
87.7k
    usacConfigExtLength = (int)escapedValue(hBs, 4, 8, 16);
1792
1793
    /* Start bit position of config extension */
1794
87.7k
    nbits = (INT)FDKgetValidBits(hBs);
1795
1796
    /* Return an error in case the bitbuffer fill level is too low. */
1797
87.7k
    if (nbits < usacConfigExtLength * 8) {
1798
4.80k
      return TRANSPORTDEC_PARSE_ERROR;
1799
4.80k
    }
1800
1801
82.9k
    switch (usacConfigExtType) {
1802
19.5k
      case ID_CONFIG_EXT_FILL:
1803
22.8k
        for (int i = 0; i < usacConfigExtLength; i++) {
1804
4.22k
          if (FDKreadBits(hBs, 8) != 0xa5) {
1805
905
            return TRANSPORTDEC_PARSE_ERROR;
1806
905
          }
1807
4.22k
        }
1808
18.6k
        break;
1809
23.8k
      case ID_CONFIG_EXT_LOUDNESS_INFO: {
1810
23.8k
        if (cb->cbUniDrc != NULL) {
1811
23.8k
          ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1812
23.8k
              cb->cbUniDrcData, hBs, usacConfigExtLength,
1813
23.8k
              1, /* loudnessInfoSet */
1814
23.8k
              tmp_subStreamIndex, loudnessInfoSetConfigExtensionPosition,
1815
23.8k
              tmp_aot);
1816
23.8k
          if (ErrorStatus != TRANSPORTDEC_OK) {
1817
0
            return ErrorStatus;
1818
0
          }
1819
23.8k
          loudnessInfoSetIndex = confExtIdx;
1820
23.8k
        }
1821
23.8k
      } break;
1822
39.5k
      default:
1823
39.5k
        break;
1824
82.9k
    }
1825
1826
    /* Skip remaining bits. If too many bits were parsed, assume error. */
1827
82.0k
    usacConfigExtLength =
1828
82.0k
        8 * usacConfigExtLength - (nbits - (INT)FDKgetValidBits(hBs));
1829
82.0k
    if (usacConfigExtLength < 0) {
1830
5.86k
      return TRANSPORTDEC_PARSE_ERROR;
1831
5.86k
    }
1832
76.1k
    FDKpushFor(hBs, usacConfigExtLength);
1833
76.1k
  }
1834
1835
7.26k
  if (loudnessInfoSetIndex == -1 && cb->cbUniDrc != NULL) {
1836
    /* no loudnessInfoSet contained. Clear the loudnessInfoSet struct by feeding
1837
     * an empty config extension */
1838
2.73k
    ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1839
2.73k
        cb->cbUniDrcData, NULL, 0, 1 /* loudnessInfoSet */, tmp_subStreamIndex,
1840
2.73k
        0, tmp_aot);
1841
2.73k
    if (ErrorStatus != TRANSPORTDEC_OK) {
1842
0
      return ErrorStatus;
1843
0
    }
1844
2.73k
  }
1845
1846
7.26k
  return ErrorStatus;
1847
7.26k
}
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
235k
    const CSTpCallBacks *cb) {
1856
235k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1857
235k
  CSUsacConfig *usc = &asc->m_sc.m_usacConfig;
1858
235k
  int i, numberOfElements;
1859
235k
  int channelElementIdx =
1860
235k
      0; /* index for elements which contain audio channels (sce, cpe, lfe) */
1861
235k
  SC_CHANNEL_CONFIG sc_chan_config = {0, 0, 0, 0};
1862
235k
  int uniDrcElement =
1863
235k
      -1; /* index of uniDrc extension element. -1 if not contained. */
1864
1865
235k
  numberOfElements = (int)escapedValue(hBs, 4, 8, 16) + 1;
1866
235k
  usc->m_usacNumElements = numberOfElements;
1867
235k
  if (numberOfElements > TP_USAC_MAX_ELEMENTS) {
1868
717
    return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1869
717
  }
1870
234k
  usc->m_nUsacChannels = 0;
1871
234k
  usc->m_channelConfigurationIndex = asc->m_channelConfiguration;
1872
1873
234k
  if (asc->m_aot == AOT_USAC) {
1874
234k
    sc_chan_config = sc_chan_config_tab[usc->m_channelConfigurationIndex];
1875
1876
234k
    if (sc_chan_config.nCh > (SCHAR)TP_USAC_MAX_SPEAKERS) {
1877
0
      return TRANSPORTDEC_PARSE_ERROR;
1878
0
    }
1879
234k
  }
1880
1881
719k
  for (i = 0; i < numberOfElements; i++) {
1882
505k
    MP4_ELEMENT_ID usacElementType = (MP4_ELEMENT_ID)(
1883
505k
        FDKreadBits(hBs, 2) | USAC_ID_BIT); /* set USAC_ID_BIT to map
1884
                                               usacElementType to
1885
                                               MP4_ELEMENT_ID enum */
1886
505k
    usc->element[i].usacElementType = usacElementType;
1887
1888
    /* sanity check: update element counter */
1889
505k
    if (asc->m_aot == AOT_USAC) {
1890
505k
      switch (usacElementType) {
1891
80.8k
        case ID_USAC_SCE:
1892
80.8k
          sc_chan_config.nSCE--;
1893
80.8k
          break;
1894
147k
        case ID_USAC_CPE:
1895
147k
          sc_chan_config.nCPE--;
1896
147k
          break;
1897
1.64k
        case ID_USAC_LFE:
1898
1.64k
          sc_chan_config.nLFE--;
1899
1.64k
          break;
1900
274k
        default:
1901
274k
          break;
1902
505k
      }
1903
505k
      if (usc->m_channelConfigurationIndex) {
1904
        /* sanity check: no element counter may be smaller zero */
1905
505k
        if (sc_chan_config.nCPE < 0 || sc_chan_config.nSCE < 0 ||
1906
498k
            sc_chan_config.nLFE < 0) {
1907
7.78k
          return TRANSPORTDEC_PARSE_ERROR;
1908
7.78k
        }
1909
505k
      }
1910
505k
    }
1911
1912
497k
    switch (usacElementType) {
1913
77.0k
      case ID_USAC_SCE:
1914
        /* UsacCoreConfig() ISO/IEC FDIS 23003-3  Table 10 */
1915
77.0k
        if (FDKreadBit(hBs)) { /* tw_mdct */
1916
670
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1917
670
        }
1918
76.3k
        usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1);
1919
        /* end of UsacCoreConfig() */
1920
76.3k
        if (usc->m_sbrRatioIndex > 0) {
1921
41.7k
          if (cb->cbSbr == NULL) {
1922
0
            return TRANSPORTDEC_UNKOWN_ERROR;
1923
0
          }
1924
          /* SbrConfig() ISO/IEC FDIS 23003-3  Table 11 */
1925
41.7k
          usc->element[i].m_harmonicSBR = FDKreadBit(hBs);
1926
41.7k
          usc->element[i].m_interTes = FDKreadBit(hBs);
1927
41.7k
          usc->element[i].m_pvc = FDKreadBit(hBs);
1928
41.7k
          if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
1929
41.7k
                        asc->m_extensionSamplingFrequency,
1930
41.7k
                        asc->m_samplesPerFrame, asc->m_aot, ID_SCE,
1931
41.7k
                        channelElementIdx, usc->element[i].m_harmonicSBR,
1932
41.7k
                        usc->element[i].m_stereoConfigIndex, asc->configMode,
1933
41.7k
                        &asc->SbrConfigChanged, 1)) {
1934
434
            return TRANSPORTDEC_PARSE_ERROR;
1935
434
          }
1936
          /* end of SbrConfig() */
1937
41.7k
        }
1938
75.9k
        usc->m_nUsacChannels += 1;
1939
75.9k
        channelElementIdx++;
1940
75.9k
        break;
1941
1942
145k
      case ID_USAC_CPE:
1943
        /* UsacCoreConfig() ISO/IEC FDIS 23003-3  Table 10 */
1944
145k
        if (FDKreadBit(hBs)) { /* tw_mdct */
1945
575
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1946
575
        }
1947
144k
        usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1);
1948
        /* end of UsacCoreConfig() */
1949
144k
        if (usc->m_sbrRatioIndex > 0) {
1950
139k
          if (cb->cbSbr == NULL) return TRANSPORTDEC_UNKOWN_ERROR;
1951
          /* SbrConfig() ISO/IEC FDIS 23003-3 */
1952
139k
          usc->element[i].m_harmonicSBR = FDKreadBit(hBs);
1953
139k
          usc->element[i].m_interTes = FDKreadBit(hBs);
1954
139k
          usc->element[i].m_pvc = FDKreadBit(hBs);
1955
139k
          {
1956
139k
            INT bitsToSkip = skipSbrHeader(hBs, 1);
1957
            /* read stereoConfigIndex */
1958
139k
            usc->element[i].m_stereoConfigIndex = FDKreadBits(hBs, 2);
1959
            /* rewind */
1960
139k
            FDKpushBack(hBs, bitsToSkip + 2);
1961
139k
          }
1962
139k
          {
1963
139k
            MP4_ELEMENT_ID el_type =
1964
139k
                (usc->element[i].m_stereoConfigIndex == 1 ||
1965
91.4k
                 usc->element[i].m_stereoConfigIndex == 2)
1966
139k
                    ? ID_SCE
1967
139k
                    : ID_CPE;
1968
139k
            if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
1969
139k
                          asc->m_extensionSamplingFrequency,
1970
139k
                          asc->m_samplesPerFrame, asc->m_aot, el_type,
1971
139k
                          channelElementIdx, usc->element[i].m_harmonicSBR,
1972
139k
                          usc->element[i].m_stereoConfigIndex, asc->configMode,
1973
139k
                          &asc->SbrConfigChanged, 1)) {
1974
2.10k
              return TRANSPORTDEC_PARSE_ERROR;
1975
2.10k
            }
1976
139k
          }
1977
          /* end of SbrConfig() */
1978
1979
137k
          usc->element[i].m_stereoConfigIndex =
1980
137k
              FDKreadBits(hBs, 2); /* Needed in RM5 syntax */
1981
1982
137k
          if (usc->element[i].m_stereoConfigIndex > 0) {
1983
87.4k
            if (cb->cbSsc != NULL) {
1984
87.4k
              int samplesPerFrame = asc->m_samplesPerFrame;
1985
1986
87.4k
              if (usc->m_sbrRatioIndex == 1) samplesPerFrame <<= 2;
1987
87.4k
              if (usc->m_sbrRatioIndex == 2)
1988
17.6k
                samplesPerFrame = (samplesPerFrame * 8) / 3;
1989
87.4k
              if (usc->m_sbrRatioIndex == 3) samplesPerFrame <<= 1;
1990
1991
              /* Mps212Config() ISO/IEC FDIS 23003-3 */
1992
87.4k
              if (cb->cbSsc(cb->cbSscData, hBs, asc->m_aot,
1993
87.4k
                            asc->m_extensionSamplingFrequency, samplesPerFrame,
1994
87.4k
                            1, /* only downmix channels (residual channels are
1995
                                  not counted) */
1996
87.4k
                            usc->element[i].m_stereoConfigIndex,
1997
87.4k
                            usc->m_coreSbrFrameLengthIndex,
1998
87.4k
                            0, /* don't know the length */
1999
87.4k
                            asc->configMode, &asc->SacConfigChanged)) {
2000
2.15k
                return TRANSPORTDEC_PARSE_ERROR;
2001
2.15k
              }
2002
              /* end of Mps212Config() */
2003
87.4k
            } else {
2004
0
              return TRANSPORTDEC_UNKOWN_ERROR;
2005
0
            }
2006
87.4k
          }
2007
137k
        } else {
2008
5.57k
          usc->element[i].m_stereoConfigIndex = 0;
2009
5.57k
        }
2010
140k
        usc->m_nUsacChannels += 2;
2011
2012
140k
        channelElementIdx++;
2013
140k
        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
274k
      case ID_USAC_EXT:
2037
274k
        ErrorStatus = extElementConfig(&usc->element[i].extElement, hBs, cb, 0,
2038
274k
                                       asc->m_samplesPerFrame, 0, asc->m_aot);
2039
274k
        if (usc->element[i].extElement.usacExtElementType ==
2040
274k
            ID_EXT_ELE_UNI_DRC) {
2041
166k
          uniDrcElement = i;
2042
166k
        }
2043
2044
274k
        if (ErrorStatus) {
2045
7.10k
          return ErrorStatus;
2046
7.10k
        }
2047
267k
        break;
2048
2049
267k
      default:
2050
        /* non USAC-element encountered */
2051
0
        return TRANSPORTDEC_PARSE_ERROR;
2052
497k
    }
2053
497k
  }
2054
2055
214k
  if (asc->m_aot == AOT_USAC) {
2056
214k
    if (usc->m_channelConfigurationIndex) {
2057
      /* sanity check: all element counter must be zero */
2058
214k
      if (sc_chan_config.nCPE | sc_chan_config.nSCE | sc_chan_config.nLFE) {
2059
3.82k
        return TRANSPORTDEC_PARSE_ERROR;
2060
3.82k
      }
2061
214k
    } 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
214k
  }
2070
2071
210k
  if (uniDrcElement == -1 && cb->cbUniDrc != NULL) {
2072
    /* no uniDrcConfig contained. Clear the uniDrcConfig struct by feeding an
2073
     * empty extension element */
2074
198k
    int subStreamIndex = 0;
2075
198k
    ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
2076
198k
        cb->cbUniDrcData, NULL, 0, 0 /* uniDrcConfig */, subStreamIndex, 0,
2077
198k
        asc->m_aot);
2078
198k
    if (ErrorStatus != TRANSPORTDEC_OK) {
2079
0
      return ErrorStatus;
2080
0
    }
2081
198k
  }
2082
2083
210k
  return ErrorStatus;
2084
210k
}
2085
2086
/* Mapping of coreSbrFrameLengthIndex defined by Table 70 in ISO/IEC 23003-3 */
2087
static TRANSPORTDEC_ERROR UsacConfig_SetCoreSbrFrameLengthIndex(
2088
241k
    CSAudioSpecificConfig *asc, int coreSbrFrameLengthIndex) {
2089
241k
  int sbrRatioIndex_val;
2090
2091
241k
  if (coreSbrFrameLengthIndex > 4) {
2092
2.11k
    return TRANSPORTDEC_PARSE_ERROR; /* reserved values */
2093
2.11k
  }
2094
239k
  asc->m_sc.m_usacConfig.m_coreSbrFrameLengthIndex = coreSbrFrameLengthIndex;
2095
239k
  asc->m_samplesPerFrame = usacFrameLength[coreSbrFrameLengthIndex];
2096
239k
  sbrRatioIndex_val = sbrRatioIndex[coreSbrFrameLengthIndex];
2097
239k
  asc->m_sc.m_usacConfig.m_sbrRatioIndex = sbrRatioIndex_val;
2098
2099
239k
  if (sbrRatioIndex_val > 0) {
2100
189k
    asc->m_sbrPresentFlag = 1;
2101
189k
    asc->m_extensionSamplingFrequency = asc->m_samplingFrequency;
2102
189k
    asc->m_extensionSamplingFrequencyIndex = asc->m_samplingFrequencyIndex;
2103
189k
    switch (sbrRatioIndex_val) {
2104
41.8k
      case 1: /* sbrRatio = 4:1 */
2105
41.8k
        asc->m_samplingFrequency >>= 2;
2106
41.8k
        asc->m_samplesPerFrame >>= 2;
2107
41.8k
        break;
2108
65.1k
      case 2: /* sbrRatio = 8:3 */
2109
65.1k
        asc->m_samplingFrequency = (asc->m_samplingFrequency * 3) / 8;
2110
65.1k
        asc->m_samplesPerFrame = (asc->m_samplesPerFrame * 3) / 8;
2111
65.1k
        break;
2112
82.1k
      case 3: /* sbrRatio = 2:1 */
2113
82.1k
        asc->m_samplingFrequency >>= 1;
2114
82.1k
        asc->m_samplesPerFrame >>= 1;
2115
82.1k
        break;
2116
0
      default:
2117
0
        return TRANSPORTDEC_PARSE_ERROR;
2118
189k
    }
2119
189k
    asc->m_samplingFrequencyIndex =
2120
189k
        getSamplingRateIndex(asc->m_samplingFrequency, 4);
2121
189k
  }
2122
2123
239k
  return TRANSPORTDEC_OK;
2124
239k
}
2125
2126
static TRANSPORTDEC_ERROR UsacConfig_Parse(CSAudioSpecificConfig *asc,
2127
                                           HANDLE_FDK_BITSTREAM hBs,
2128
242k
                                           CSTpCallBacks *cb) {
2129
242k
  int usacSamplingFrequency, channelConfigurationIndex, coreSbrFrameLengthIndex;
2130
242k
  TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK;
2131
2132
  /* Start bit position of usacConfig */
2133
242k
  INT nbits = (INT)FDKgetValidBits(hBs);
2134
2135
242k
  usacSamplingFrequency = getSampleRate(hBs, &asc->m_samplingFrequencyIndex, 5);
2136
242k
  if (usacSamplingFrequency == 0 || usacSamplingFrequency > 96000) {
2137
859
    return TRANSPORTDEC_PARSE_ERROR;
2138
859
  }
2139
241k
  asc->m_samplingFrequency = (UINT)usacSamplingFrequency;
2140
2141
241k
  coreSbrFrameLengthIndex = FDKreadBits(hBs, 3);
2142
241k
  if (UsacConfig_SetCoreSbrFrameLengthIndex(asc, coreSbrFrameLengthIndex) !=
2143
241k
      TRANSPORTDEC_OK) {
2144
2.11k
    return TRANSPORTDEC_PARSE_ERROR;
2145
2.11k
  }
2146
2147
239k
  channelConfigurationIndex = FDKreadBits(hBs, 5);
2148
239k
  if (channelConfigurationIndex > 2) {
2149
2.39k
    return TRANSPORTDEC_PARSE_ERROR; /* only channelConfigurationIndex = [1,2]
2150
                                        are supported */
2151
2.39k
  }
2152
2153
236k
  if (channelConfigurationIndex == 0) {
2154
1.14k
    return TRANSPORTDEC_PARSE_ERROR; /* only channelConfigurationIndex = [1,2]
2155
                                        are supported */
2156
1.14k
  }
2157
235k
  asc->m_channelConfiguration = channelConfigurationIndex;
2158
2159
235k
  err = UsacRsv60DecoderConfig_Parse(asc, hBs, cb);
2160
235k
  if (err != TRANSPORTDEC_OK) {
2161
25.3k
    return err;
2162
25.3k
  }
2163
2164
210k
  if (FDKreadBits(hBs, 1)) { /* usacConfigExtensionPresent */
2165
18.8k
    err = configExtension(&asc->m_sc.m_usacConfig, hBs, cb);
2166
18.8k
    if (err != TRANSPORTDEC_OK) {
2167
11.5k
      return err;
2168
11.5k
    }
2169
191k
  } else if (cb->cbUniDrc != NULL) {
2170
    /* no loudnessInfoSet contained. Clear the loudnessInfoSet struct by feeding
2171
     * an empty config extension */
2172
191k
    err = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
2173
191k
        cb->cbUniDrcData, NULL, 0, 1 /* loudnessInfoSet */, 0, 0, asc->m_aot);
2174
191k
    if (err != TRANSPORTDEC_OK) {
2175
0
      return err;
2176
0
    }
2177
191k
  }
2178
2179
  /* sanity check whether number of channels signaled in UsacDecoderConfig()
2180
     matches the number of channels required by channelConfigurationIndex */
2181
198k
  if ((channelConfigurationIndex > 0) &&
2182
198k
      (sc_chan_config_tab[channelConfigurationIndex].nCh !=
2183
198k
       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
198k
  INT configSize_bits = (INT)FDKgetValidBits(hBs) - nbits;
2189
198k
  if (StoreConfigAsBitstream(hBs, configSize_bits,
2190
198k
                             asc->m_sc.m_usacConfig.UsacConfig,
2191
198k
                             TP_USAC_MAX_CONFIG_LEN)) {
2192
2.56k
    return TRANSPORTDEC_PARSE_ERROR;
2193
2.56k
  }
2194
196k
  asc->m_sc.m_usacConfig.UsacConfigBits = fAbs(configSize_bits);
2195
2196
196k
  return err;
2197
198k
}
2198
2199
static TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse(
2200
32.2k
    CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, CSTpCallBacks *cb) {
2201
32.2k
  TP_ASC_EXTENSION_ID lastAscExt, ascExtId = ASCEXT_UNKOWN;
2202
32.2k
  INT bitsAvailable = (INT)FDKgetValidBits(bs);
2203
2204
90.8k
  while (bitsAvailable >= 11) {
2205
67.3k
    lastAscExt = ascExtId;
2206
67.3k
    ascExtId = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11);
2207
67.3k
    bitsAvailable -= 11;
2208
2209
67.3k
    switch (ascExtId) {
2210
7.90k
      case ASCEXT_SBR: /* 0x2b7 */
2211
7.90k
        if ((self->m_extensionAudioObjectType != AOT_SBR) &&
2212
7.56k
            (bitsAvailable >= 5)) {
2213
7.33k
          self->m_extensionAudioObjectType = getAOT(bs);
2214
2215
7.33k
          if ((self->m_extensionAudioObjectType == AOT_SBR) ||
2216
6.27k
              (self->m_extensionAudioObjectType ==
2217
6.27k
               AOT_ER_BSAC)) { /* Get SBR extension configuration */
2218
5.67k
            self->m_sbrPresentFlag = FDKreadBits(bs, 1);
2219
5.67k
            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
5.67k
            if (self->m_sbrPresentFlag == 1) {
2225
3.06k
              self->m_extensionSamplingFrequency = getSampleRate(
2226
3.06k
                  bs, &self->m_extensionSamplingFrequencyIndex, 4);
2227
2228
3.06k
              if (self->m_extensionSamplingFrequency == 0 ||
2229
2.83k
                  self->m_extensionSamplingFrequency > 96000) {
2230
311
                return TRANSPORTDEC_PARSE_ERROR;
2231
311
              }
2232
3.06k
            }
2233
5.36k
            if (self->m_extensionAudioObjectType == AOT_ER_BSAC) {
2234
4.31k
              self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
2235
4.31k
            }
2236
5.36k
          }
2237
          /* Update counter because of variable length fields (AOT and sampling
2238
           * rate) */
2239
7.02k
          bitsAvailable = (INT)FDKgetValidBits(bs);
2240
7.02k
        }
2241
7.59k
        break;
2242
7.59k
      case ASCEXT_PS: /* 0x548 */
2243
3.83k
        if ((lastAscExt == ASCEXT_SBR) &&
2244
3.40k
            (self->m_extensionAudioObjectType == AOT_SBR) &&
2245
894
            (bitsAvailable > 0)) { /* Get PS extension configuration */
2246
695
          self->m_psPresentFlag = FDKreadBits(bs, 1);
2247
695
          bitsAvailable -= 1;
2248
695
        }
2249
3.83k
        break;
2250
679
      case ASCEXT_MPS: /* 0x76a */
2251
679
        if (self->m_extensionAudioObjectType == AOT_MPEGS) break;
2252
546
        FDK_FALLTHROUGH;
2253
5.59k
      case ASCEXT_LDMPS: /* 0x7cc */
2254
5.59k
        if ((ascExtId == ASCEXT_LDMPS) &&
2255
5.05k
            (self->m_extensionAudioObjectType == AOT_LD_MPEGS))
2256
389
          break;
2257
5.20k
        if (bitsAvailable >= 1) {
2258
5.00k
          bitsAvailable -= 1;
2259
5.00k
          if (FDKreadBits(bs, 1)) { /* self->m_mpsPresentFlag */
2260
1.76k
            int sscLen = FDKreadBits(bs, 8);
2261
1.76k
            bitsAvailable -= 8;
2262
1.76k
            if (sscLen == 0xFF) {
2263
440
              sscLen += FDKreadBits(bs, 16);
2264
440
              bitsAvailable -= 16;
2265
440
            }
2266
1.76k
            FDKpushFor(bs, sscLen); /* Skip SSC to be able to read the next
2267
                                       extension if there is one. */
2268
2269
1.76k
            bitsAvailable -= sscLen * 8;
2270
1.76k
          }
2271
5.00k
        }
2272
5.20k
        break;
2273
41.4k
      case ASCEXT_SAOC:
2274
41.4k
        if ((ascExtId == ASCEXT_SAOC) &&
2275
41.4k
            (self->m_extensionAudioObjectType == AOT_SAOC))
2276
281
          break;
2277
41.1k
        if (FDKreadBits(bs, 1)) { /* saocPresent */
2278
39.9k
          int saocscLen = FDKreadBits(bs, 8);
2279
39.9k
          bitsAvailable -= 8;
2280
39.9k
          if (saocscLen == 0xFF) {
2281
15.9k
            saocscLen += FDKreadBits(bs, 16);
2282
15.9k
            bitsAvailable -= 16;
2283
15.9k
          }
2284
39.9k
          FDKpushFor(bs, saocscLen);
2285
39.9k
          bitsAvailable -= saocscLen * 8;
2286
39.9k
        }
2287
41.1k
        break;
2288
8.37k
      default:
2289
        /* Just ignore anything. */
2290
8.37k
        return TRANSPORTDEC_OK;
2291
67.3k
    }
2292
67.3k
  }
2293
2294
23.5k
  return TRANSPORTDEC_OK;
2295
32.2k
}
2296
2297
/*
2298
 * API Functions
2299
 */
2300
2301
899k
void AudioSpecificConfig_Init(CSAudioSpecificConfig *asc) {
2302
899k
  FDKmemclear(asc, sizeof(CSAudioSpecificConfig));
2303
2304
  /* Init all values that should not be zero. */
2305
899k
  asc->m_aot = AOT_NONE;
2306
899k
  asc->m_samplingFrequencyIndex = 0xf;
2307
899k
  asc->m_epConfig = -1;
2308
899k
  asc->m_extensionAudioObjectType = AOT_NULL_OBJECT;
2309
899k
  CProgramConfig_Init(&asc->m_progrConfigElement);
2310
899k
}
2311
2312
TRANSPORTDEC_ERROR AudioSpecificConfig_Parse(
2313
    CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs,
2314
    int fExplicitBackwardCompatible, CSTpCallBacks *cb, UCHAR configMode,
2315
899k
    UCHAR configChanged, AUDIO_OBJECT_TYPE m_aot) {
2316
899k
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
2317
899k
  UINT ascStartAnchor = FDKgetValidBits(bs);
2318
899k
  int frameLengthFlag = -1;
2319
2320
899k
  AudioSpecificConfig_Init(self);
2321
2322
899k
  self->configMode = configMode;
2323
899k
  self->AacConfigChanged = configChanged;
2324
899k
  self->SbrConfigChanged = configChanged;
2325
899k
  self->SacConfigChanged = configChanged;
2326
2327
899k
  if (m_aot != AOT_NULL_OBJECT) {
2328
52
    self->m_aot = m_aot;
2329
899k
  } else {
2330
899k
    self->m_aot = getAOT(bs);
2331
899k
    self->m_samplingFrequency =
2332
899k
        getSampleRate(bs, &self->m_samplingFrequencyIndex, 4);
2333
899k
    if (self->m_samplingFrequency <= 0 ||
2334
897k
        (self->m_samplingFrequency > 96000 && self->m_aot != 39) ||
2335
897k
        self->m_samplingFrequency > 4 * 96000) {
2336
3.03k
      return TRANSPORTDEC_PARSE_ERROR;
2337
3.03k
    }
2338
2339
896k
    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
896k
    if ((self->m_channelConfiguration == 0) &&
2347
216k
        ((self->m_aot == AOT_ER_AAC_LC) || (self->m_aot == AOT_ER_AAC_LTP) ||
2348
215k
         (self->m_aot == AOT_ER_AAC_LD) || (self->m_aot == AOT_ER_AAC_SCAL) ||
2349
214k
         (self->m_aot == AOT_ER_AAC_ELD))) {
2350
1.82k
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2351
1.82k
    }
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
894k
    if ((self->m_channelConfiguration > 2) &&
2355
399k
        ((self->m_aot == AOT_AAC_SCAL) || (self->m_aot == AOT_ER_AAC_SCAL))) {
2356
737
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2357
737
    }
2358
2359
    /* SBR extension ( explicit non-backwards compatible mode ) */
2360
894k
    self->m_sbrPresentFlag = 0;
2361
894k
    self->m_psPresentFlag = 0;
2362
2363
894k
    if (self->m_aot == AOT_SBR || self->m_aot == AOT_PS) {
2364
8.23k
      self->m_extensionAudioObjectType = AOT_SBR;
2365
2366
8.23k
      self->m_sbrPresentFlag = 1;
2367
8.23k
      if (self->m_aot == AOT_PS) {
2368
3.93k
        self->m_psPresentFlag = 1;
2369
3.93k
      }
2370
2371
8.23k
      self->m_extensionSamplingFrequency =
2372
8.23k
          getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
2373
8.23k
      if (self->m_extensionSamplingFrequency == 0 ||
2374
7.96k
          self->m_extensionSamplingFrequency > 96000) {
2375
2.25k
        return TRANSPORTDEC_PARSE_ERROR;
2376
2.25k
      }
2377
5.97k
      self->m_aot = getAOT(bs);
2378
2379
5.97k
      switch (self->m_aot) {
2380
4.03k
        case AOT_AAC_LC:
2381
4.03k
          break;
2382
811
        case AOT_ER_BSAC:
2383
811
          break;
2384
1.13k
        default:
2385
1.13k
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2386
5.97k
      }
2387
2388
4.84k
      if (self->m_aot == AOT_ER_BSAC) {
2389
811
        self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
2390
811
      }
2391
885k
    } else {
2392
885k
      self->m_extensionAudioObjectType = AOT_NULL_OBJECT;
2393
885k
    }
2394
894k
  }
2395
2396
  /* Parse whatever specific configs */
2397
890k
  switch (self->m_aot) {
2398
372k
    case AOT_AAC_LC:
2399
374k
    case AOT_AAC_SCAL:
2400
377k
    case AOT_ER_AAC_LC:
2401
389k
    case AOT_ER_AAC_LD:
2402
443k
    case AOT_ER_AAC_SCAL:
2403
446k
    case AOT_ER_BSAC:
2404
446k
      if ((ErrorStatus = GaSpecificConfig_Parse(&self->m_sc.m_gaSpecificConfig,
2405
446k
                                                self, bs, ascStartAnchor)) !=
2406
446k
          TRANSPORTDEC_OK) {
2407
0
        return (ErrorStatus);
2408
0
      }
2409
446k
      frameLengthFlag = self->m_sc.m_gaSpecificConfig.m_frameLengthFlag;
2410
446k
      break;
2411
569
    case AOT_MPEGS:
2412
569
      if (cb->cbSsc != NULL) {
2413
569
        if (cb->cbSsc(cb->cbSscData, bs, self->m_aot, self->m_samplingFrequency,
2414
569
                      self->m_samplesPerFrame, self->m_channelConfiguration, 1,
2415
569
                      -1, /* nTimeSlots: read from bitstream */
2416
569
                      0,  /* don't know the length */
2417
569
                      self->configMode, &self->SacConfigChanged)) {
2418
569
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2419
569
        }
2420
569
      } else {
2421
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2422
0
      }
2423
0
      break;
2424
181k
    case AOT_ER_AAC_ELD:
2425
181k
      if ((ErrorStatus = EldSpecificConfig_Parse(self, bs, cb)) !=
2426
181k
          TRANSPORTDEC_OK) {
2427
38.8k
        return (ErrorStatus);
2428
38.8k
      }
2429
142k
      frameLengthFlag = self->m_sc.m_eldSpecificConfig.m_frameLengthFlag;
2430
142k
      self->m_sbrPresentFlag = self->m_sc.m_eldSpecificConfig.m_sbrPresentFlag;
2431
142k
      self->m_extensionSamplingFrequency =
2432
142k
          (self->m_sc.m_eldSpecificConfig.m_sbrSamplingRate + 1) *
2433
142k
          self->m_samplingFrequency;
2434
142k
      break;
2435
242k
    case AOT_USAC:
2436
242k
      if ((ErrorStatus = UsacConfig_Parse(self, bs, cb)) != TRANSPORTDEC_OK) {
2437
46.0k
        return (ErrorStatus);
2438
46.0k
      }
2439
196k
      break;
2440
2441
196k
    default:
2442
20.4k
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2443
890k
  }
2444
2445
  /* Frame length */
2446
784k
  switch (self->m_aot) {
2447
372k
    case AOT_AAC_LC:
2448
374k
    case AOT_AAC_SCAL:
2449
377k
    case AOT_ER_AAC_LC:
2450
431k
    case AOT_ER_AAC_SCAL:
2451
434k
    case AOT_ER_BSAC:
2452
      /*case AOT_USAC:*/
2453
434k
      if (!frameLengthFlag)
2454
206k
        self->m_samplesPerFrame = 1024;
2455
228k
      else
2456
228k
        self->m_samplesPerFrame = 960;
2457
434k
      break;
2458
11.6k
    case AOT_ER_AAC_LD:
2459
11.6k
      if (!frameLengthFlag)
2460
6.67k
        self->m_samplesPerFrame = 512;
2461
4.98k
      else
2462
4.98k
        self->m_samplesPerFrame = 480;
2463
11.6k
      break;
2464
338k
    default:
2465
338k
      break;
2466
784k
  }
2467
2468
784k
  switch (self->m_aot) {
2469
2.97k
    case AOT_ER_AAC_LC:
2470
14.6k
    case AOT_ER_AAC_LD:
2471
157k
    case AOT_ER_AAC_ELD:
2472
211k
    case AOT_ER_AAC_SCAL:
2473
211k
    case AOT_ER_CELP:
2474
211k
    case AOT_ER_HVXC:
2475
214k
    case AOT_ER_BSAC:
2476
214k
      self->m_epConfig = FDKreadBits(bs, 2);
2477
2478
214k
      if (self->m_epConfig > 1) {
2479
1.79k
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;  // EPCONFIG;
2480
1.79k
      }
2481
212k
      break;
2482
570k
    default:
2483
570k
      break;
2484
784k
  }
2485
2486
783k
  if (fExplicitBackwardCompatible &&
2487
45.5k
      (self->m_aot == AOT_AAC_LC || self->m_aot == AOT_ER_AAC_LD ||
2488
32.2k
       self->m_aot == AOT_ER_BSAC)) {
2489
32.2k
    ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb);
2490
32.2k
  }
2491
2492
  /* Copy config() to asc->config[] buffer. */
2493
783k
  if ((ErrorStatus == TRANSPORTDEC_OK) && (self->m_aot == AOT_USAC)) {
2494
196k
    INT configSize_bits = (INT)FDKgetValidBits(bs) - (INT)ascStartAnchor;
2495
196k
    if (StoreConfigAsBitstream(bs, configSize_bits, self->config,
2496
196k
                               TP_USAC_MAX_CONFIG_LEN)) {
2497
210
      return TRANSPORTDEC_PARSE_ERROR;
2498
210
    }
2499
195k
    self->configBits = fAbs(configSize_bits);
2500
195k
  }
2501
2502
782k
  return (ErrorStatus);
2503
783k
}
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
}