Coverage Report

Created: 2025-10-28 06:45

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