Coverage Report

Created: 2025-11-16 06:32

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