Coverage Report

Created: 2025-12-31 06:47

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