Coverage Report

Created: 2023-06-17 06:21

/src/aac/libMpegTPDec/src/tpdec_asc.cpp
Line
Count
Source (jump to first uncovered line)
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
19
void CProgramConfig_Init(CProgramConfig *pPce) {
187
19
  FDKmemclear(pPce, sizeof(CProgramConfig));
188
19
  pPce->SamplingFrequencyIndex = 0xf;
189
19
}
190
191
0
int CProgramConfig_IsValid(const CProgramConfig *pPce) {
192
0
  return ((pPce->isValid) ? 1 : 0);
193
0
}
194
195
0
#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
0
                                        const UINT alignmentAnchor) {
207
0
  int err = 0;
208
0
  FDK_CRCINFO crcInfo; /* CRC state info */
209
0
  INT crcReg;
210
0
  FDKcrcInit(&crcInfo, 0x07, 0xFF, 8);
211
0
  crcReg = FDKcrcStartReg(&crcInfo, bs, 0);
212
0
  UINT startAnchor = FDKgetValidBits(bs);
213
214
0
  FDK_ASSERT(pPce != NULL);
215
0
  FDK_ASSERT(bs != NULL);
216
0
  FDK_ASSERT(bytesAvailable != NULL);
217
218
0
  if ((startAnchor >= 24) && (*bytesAvailable >= 3) &&
219
0
      (FDKreadBits(bs, 8) == PCE_HEIGHT_EXT_SYNC)) {
220
0
    int i;
221
222
0
    for (i = 0; i < pPce->NumFrontChannelElements; i++) {
223
0
      if ((pPce->FrontElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
224
0
          PC_NUM_HEIGHT_LAYER) {
225
0
        err = -2; /* height information is out of the valid range */
226
0
      }
227
0
    }
228
0
    for (i = 0; i < pPce->NumSideChannelElements; i++) {
229
0
      if ((pPce->SideElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
230
0
          PC_NUM_HEIGHT_LAYER) {
231
0
        err = -2; /* height information is out of the valid range */
232
0
      }
233
0
    }
234
0
    for (i = 0; i < pPce->NumBackChannelElements; i++) {
235
0
      if ((pPce->BackElementHeightInfo[i] = (UCHAR)FDKreadBits(bs, 2)) >=
236
0
          PC_NUM_HEIGHT_LAYER) {
237
0
        err = -2; /* height information is out of the valid range */
238
0
      }
239
0
    }
240
0
    FDKbyteAlign(bs, alignmentAnchor);
241
242
0
    FDKcrcEndReg(&crcInfo, bs, crcReg);
243
0
    if ((USHORT)FDKreadBits(bs, 8) != FDKcrcGetCRC(&crcInfo)) {
244
      /* CRC failed */
245
0
      err = -1;
246
0
    }
247
0
    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
0
      FDKmemclear(pPce->FrontElementHeightInfo,
252
0
                  sizeof(pPce->FrontElementHeightInfo));
253
0
      FDKmemclear(pPce->SideElementHeightInfo,
254
0
                  sizeof(pPce->SideElementHeightInfo));
255
0
      FDKmemclear(pPce->BackElementHeightInfo,
256
0
                  sizeof(pPce->BackElementHeightInfo));
257
0
    }
258
0
  } else {
259
    /* No valid extension data found -> restore the initial bitbuffer state */
260
0
    FDKpushBack(bs, (INT)startAnchor - (INT)FDKgetValidBits(bs));
261
0
  }
262
263
  /* Always report the bytes read. */
264
0
  *bytesAvailable -= ((INT)startAnchor - (INT)FDKgetValidBits(bs)) >> 3;
265
266
0
  return (err);
267
0
}
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
0
static int CProgramConfig_Check(CProgramConfig *pPce) {
279
0
  INT i;
280
0
  INT err = 0;
281
0
  INT numBackChannels[3] = {0};
282
0
  INT numSideChannels[3] = {0};
283
0
  INT numFrontChannels[3] = {0};
284
0
  UCHAR *pCpeFront = pPce->FrontElementIsCpe;
285
0
  UCHAR *pCpeSide = pPce->SideElementIsCpe;
286
0
  UCHAR *pCpeBack = pPce->BackElementIsCpe;
287
0
  UCHAR *pHeight;
288
289
0
  pHeight = pPce->BackElementHeightInfo;
290
0
  for (i = 0; i < pPce->NumBackChannelElements; i++) {
291
0
    numBackChannels[*pHeight] += pPce->BackElementIsCpe[i] ? 2 : 1;
292
0
    pHeight++;
293
0
  }
294
0
  pHeight = pPce->SideElementHeightInfo;
295
0
  for (i = 0; i < pPce->NumSideChannelElements; i++) {
296
0
    numSideChannels[*pHeight] += pPce->SideElementIsCpe[i] ? 2 : 1;
297
0
    pHeight++;
298
0
  }
299
0
  pHeight = pPce->FrontElementHeightInfo;
300
0
  for (i = 0; i < pPce->NumFrontChannelElements; i++) {
301
0
    numFrontChannels[*pHeight] += pPce->FrontElementIsCpe[i] ? 2 : 1;
302
0
    pHeight++;
303
0
  }
304
305
  /* 0 = normal height channels, 1 = top height channels, 2 = bottom height
306
   * channels */
307
0
  for (i = 0; i < 3; i++) {
308
    /* if number of channels is odd => first element must be a SCE (front center
309
     * channel) */
310
0
    if (numFrontChannels[i] & 1) {
311
0
      if (*pCpeFront++ == ID_CPE) {
312
0
        err = 1;
313
0
        goto bail;
314
0
      }
315
0
      numFrontChannels[i]--;
316
0
    }
317
0
    while (numFrontChannels[i] > 0) {
318
      /* must be CPE or paired SCE */
319
0
      if (*pCpeFront++ == ID_SCE) {
320
0
        if (*pCpeFront++ == ID_CPE) {
321
0
          err = 1;
322
0
          goto bail;
323
0
        }
324
0
      }
325
0
      numFrontChannels[i] -= 2;
326
0
    };
327
328
    /* in case that a top center surround channel (Ts) is transmitted the number
329
     * of channels can be odd */
330
0
    if (i != 1) {
331
      /* number of channels must be even */
332
0
      if (numSideChannels[i] & 1) {
333
0
        err = 1;
334
0
        goto bail;
335
0
      }
336
0
      while (numSideChannels[i] > 0) {
337
        /* must be CPE or paired SCE */
338
0
        if (*pCpeSide++ == ID_SCE) {
339
0
          if (*pCpeSide++ == ID_CPE) {
340
0
            err = 1;
341
0
            goto bail;
342
0
          }
343
0
        }
344
0
        numSideChannels[i] -= 2;
345
0
      };
346
0
    }
347
348
0
    while (numBackChannels[i] > 1) {
349
      /* must be CPE or paired SCE */
350
0
      if (*pCpeBack++ == ID_SCE) {
351
0
        if (*pCpeBack++ == ID_CPE) {
352
0
          err = 1;
353
0
          goto bail;
354
0
        }
355
0
      }
356
0
      numBackChannels[i] -= 2;
357
0
    };
358
    /* if number of channels is odd => last element must be a SCE (back center
359
     * channel) */
360
0
    if (numBackChannels[i]) {
361
0
      if (*pCpeBack++ == ID_CPE) {
362
0
        err = 1;
363
0
        goto bail;
364
0
      }
365
0
    }
366
0
  }
367
368
0
bail:
369
370
0
  return err;
371
0
}
372
373
void CProgramConfig_Read(CProgramConfig *pPce, HANDLE_FDK_BITSTREAM bs,
374
0
                         UINT alignmentAnchor) {
375
0
  int i;
376
0
  int commentBytes;
377
0
  UCHAR tag, isCpe;
378
0
  UCHAR checkElementTagSelect[3][PC_FSB_CHANNELS_MAX] = {{0}};
379
380
0
  pPce->isValid = 1;
381
0
  pPce->NumEffectiveChannels = 0;
382
0
  pPce->NumChannels = 0;
383
0
  pPce->ElementInstanceTag = (UCHAR)FDKreadBits(bs, 4);
384
0
  pPce->Profile = (UCHAR)FDKreadBits(bs, 2);
385
0
  pPce->SamplingFrequencyIndex = (UCHAR)FDKreadBits(bs, 4);
386
0
  pPce->NumFrontChannelElements = (UCHAR)FDKreadBits(bs, 4);
387
0
  pPce->NumSideChannelElements = (UCHAR)FDKreadBits(bs, 4);
388
0
  pPce->NumBackChannelElements = (UCHAR)FDKreadBits(bs, 4);
389
0
  pPce->NumLfeChannelElements = (UCHAR)FDKreadBits(bs, 2);
390
0
  pPce->NumAssocDataElements = (UCHAR)FDKreadBits(bs, 3);
391
0
  pPce->NumValidCcElements = (UCHAR)FDKreadBits(bs, 4);
392
393
0
  if ((pPce->MonoMixdownPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
394
0
    pPce->MonoMixdownElementNumber = (UCHAR)FDKreadBits(bs, 4);
395
0
  }
396
397
0
  if ((pPce->StereoMixdownPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
398
0
    pPce->StereoMixdownElementNumber = (UCHAR)FDKreadBits(bs, 4);
399
0
  }
400
401
0
  if ((pPce->MatrixMixdownIndexPresent = (UCHAR)FDKreadBits(bs, 1)) != 0) {
402
0
    pPce->MatrixMixdownIndex = (UCHAR)FDKreadBits(bs, 2);
403
0
    pPce->PseudoSurroundEnable = (UCHAR)FDKreadBits(bs, 1);
404
0
  }
405
406
0
  for (i = 0; i < pPce->NumFrontChannelElements; i++) {
407
0
    pPce->FrontElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
408
0
    pPce->FrontElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
409
0
    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
0
    if (checkElementTagSelect[isCpe][tag] == 0) {
414
0
      checkElementTagSelect[isCpe][tag] = 1;
415
0
    } else {
416
0
      pPce->isValid = 0;
417
0
    }
418
0
  }
419
420
0
  for (i = 0; i < pPce->NumSideChannelElements; i++) {
421
0
    pPce->SideElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
422
0
    pPce->SideElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
423
0
    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
0
    if (checkElementTagSelect[isCpe][tag] == 0) {
428
0
      checkElementTagSelect[isCpe][tag] = 1;
429
0
    } else {
430
0
      pPce->isValid = 0;
431
0
    }
432
0
  }
433
434
0
  for (i = 0; i < pPce->NumBackChannelElements; i++) {
435
0
    pPce->BackElementIsCpe[i] = isCpe = (UCHAR)FDKreadBits(bs, 1);
436
0
    pPce->BackElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
437
0
    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
0
    if (checkElementTagSelect[isCpe][tag] == 0) {
442
0
      checkElementTagSelect[isCpe][tag] = 1;
443
0
    } else {
444
0
      pPce->isValid = 0;
445
0
    }
446
0
  }
447
448
0
  pPce->NumEffectiveChannels = pPce->NumChannels;
449
450
0
  for (i = 0; i < pPce->NumLfeChannelElements; i++) {
451
0
    pPce->LfeElementTagSelect[i] = tag = (UCHAR)FDKreadBits(bs, 4);
452
0
    pPce->NumChannels += 1;
453
454
    /* Check element instance tag according to ISO/IEC 13818-7:2003(E),
455
     * chapter 8.2.1.1 */
456
0
    if (checkElementTagSelect[2][tag] == 0) {
457
0
      checkElementTagSelect[2][tag] = 1;
458
0
    } else {
459
0
      pPce->isValid = 0;
460
0
    }
461
0
  }
462
463
0
  for (i = 0; i < pPce->NumAssocDataElements; i++) {
464
0
    pPce->AssocDataElementTagSelect[i] = (UCHAR)FDKreadBits(bs, 4);
465
0
  }
466
467
0
  for (i = 0; i < pPce->NumValidCcElements; i++) {
468
0
    pPce->CcElementIsIndSw[i] = (UCHAR)FDKreadBits(bs, 1);
469
0
    pPce->ValidCcElementTagSelect[i] = (UCHAR)FDKreadBits(bs, 4);
470
0
  }
471
472
0
  FDKbyteAlign(bs, alignmentAnchor);
473
474
0
  pPce->CommentFieldBytes = (UCHAR)FDKreadBits(bs, 8);
475
0
  commentBytes = pPce->CommentFieldBytes;
476
477
  /* Search for height info extension and read it if available */
478
0
  if (CProgramConfig_ReadHeightExt(pPce, bs, &commentBytes, alignmentAnchor)) {
479
0
    pPce->isValid = 0;
480
0
  }
481
482
  /* Check order of elements according to ISO / IEC 13818 - 7:2003(E),
483
   * chapter 8.5.1 */
484
0
  if (CProgramConfig_Check(pPce)) {
485
0
    pPce->isValid = 0;
486
0
  }
487
488
0
  for (i = 0; i < commentBytes; i++) {
489
0
    UCHAR text;
490
491
0
    text = (UCHAR)FDKreadBits(bs, 8);
492
493
0
    if (i < PC_COMMENTLENGTH) {
494
0
      pPce->Comment[i] = text;
495
0
    }
496
0
  }
497
0
}
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
0
                           const CProgramConfig *const pPce2) {
509
0
  int result = 0; /* Innocent until proven false. */
510
511
0
  if (FDKmemcmp(pPce1, pPce2, sizeof(CProgramConfig)) !=
512
0
      0) { /* Configurations are not completely equal.
513
              So look into details and analyse the channel configurations: */
514
0
    result = -1;
515
516
0
    if (pPce1->NumChannels ==
517
0
        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
0
      result = 1;
521
522
      /* Front channels */
523
0
      if (pPce1->NumFrontChannelElements != pPce2->NumFrontChannelElements) {
524
0
        result = 2; /* different number of front channel elements */
525
0
      } else {
526
0
        int el, numCh1 = 0, numCh2 = 0;
527
0
        for (el = 0; el < pPce1->NumFrontChannelElements; el += 1) {
528
0
          if (pPce1->FrontElementHeightInfo[el] !=
529
0
              pPce2->FrontElementHeightInfo[el]) {
530
0
            result = 2; /* different height info */
531
0
            break;
532
0
          }
533
0
          numCh1 += pPce1->FrontElementIsCpe[el] ? 2 : 1;
534
0
          numCh2 += pPce2->FrontElementIsCpe[el] ? 2 : 1;
535
0
        }
536
0
        if (numCh1 != numCh2) {
537
0
          result = 2; /* different number of front channels */
538
0
        }
539
0
      }
540
      /* Side channels */
541
0
      if (pPce1->NumSideChannelElements != pPce2->NumSideChannelElements) {
542
0
        result = 2; /* different number of side channel elements */
543
0
      } else {
544
0
        int el, numCh1 = 0, numCh2 = 0;
545
0
        for (el = 0; el < pPce1->NumSideChannelElements; el += 1) {
546
0
          if (pPce1->SideElementHeightInfo[el] !=
547
0
              pPce2->SideElementHeightInfo[el]) {
548
0
            result = 2; /* different height info */
549
0
            break;
550
0
          }
551
0
          numCh1 += pPce1->SideElementIsCpe[el] ? 2 : 1;
552
0
          numCh2 += pPce2->SideElementIsCpe[el] ? 2 : 1;
553
0
        }
554
0
        if (numCh1 != numCh2) {
555
0
          result = 2; /* different number of side channels */
556
0
        }
557
0
      }
558
      /* Back channels */
559
0
      if (pPce1->NumBackChannelElements != pPce2->NumBackChannelElements) {
560
0
        result = 2; /* different number of back channel elements */
561
0
      } else {
562
0
        int el, numCh1 = 0, numCh2 = 0;
563
0
        for (el = 0; el < pPce1->NumBackChannelElements; el += 1) {
564
0
          if (pPce1->BackElementHeightInfo[el] !=
565
0
              pPce2->BackElementHeightInfo[el]) {
566
0
            result = 2; /* different height info */
567
0
            break;
568
0
          }
569
0
          numCh1 += pPce1->BackElementIsCpe[el] ? 2 : 1;
570
0
          numCh2 += pPce2->BackElementIsCpe[el] ? 2 : 1;
571
0
        }
572
0
        if (numCh1 != numCh2) {
573
0
          result = 2; /* different number of back channels */
574
0
        }
575
0
      }
576
      /* LFE channels */
577
0
      if (pPce1->NumLfeChannelElements != pPce2->NumLfeChannelElements) {
578
0
        result = 2; /* different number of lfe channels */
579
0
      }
580
      /* LFEs are always SCEs so we don't need to count the channels. */
581
0
    }
582
0
  }
583
584
0
  return result;
585
0
}
586
587
0
void CProgramConfig_GetDefault(CProgramConfig *pPce, const UINT channelConfig) {
588
0
  FDK_ASSERT(pPce != NULL);
589
590
  /* Init PCE */
591
0
  CProgramConfig_Init(pPce);
592
0
  pPce->Profile =
593
0
      1; /* Set AAC LC because it is the only supported object type. */
594
595
0
  switch (channelConfig) {
596
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
597
0
    case 32: /* 7.1 side channel configuration as defined in FDK_audio.h */
598
0
      pPce->NumFrontChannelElements = 2;
599
0
      pPce->FrontElementIsCpe[0] = 0;
600
0
      pPce->FrontElementIsCpe[1] = 1;
601
0
      pPce->NumSideChannelElements = 1;
602
0
      pPce->SideElementIsCpe[0] = 1;
603
0
      pPce->NumBackChannelElements = 1;
604
0
      pPce->BackElementIsCpe[0] = 1;
605
0
      pPce->NumLfeChannelElements = 1;
606
0
      pPce->NumChannels = 8;
607
0
      pPce->NumEffectiveChannels = 7;
608
0
      pPce->isValid = 1;
609
0
      break;
610
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
611
0
    case 12: /* 3/0/4.1ch surround back */
612
0
      pPce->BackElementIsCpe[1] = 1;
613
0
      pPce->NumChannels += 1;
614
0
      pPce->NumEffectiveChannels += 1;
615
0
      FDK_FALLTHROUGH;
616
0
    case 11: /* 3/0/3.1ch */
617
0
      pPce->NumFrontChannelElements += 2;
618
0
      pPce->FrontElementIsCpe[0] = 0;
619
0
      pPce->FrontElementIsCpe[1] = 1;
620
0
      pPce->NumBackChannelElements += 2;
621
0
      pPce->BackElementIsCpe[0] = 1;
622
0
      pPce->BackElementIsCpe[1] += 0;
623
0
      pPce->NumLfeChannelElements += 1;
624
0
      pPce->NumChannels += 7;
625
0
      pPce->NumEffectiveChannels += 6;
626
0
      pPce->isValid = 1;
627
0
      break;
628
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
629
0
    case 14:                               /* 2/0/0-3/0/2-0.1ch front height */
630
0
      pPce->FrontElementHeightInfo[2] = 1; /* Top speaker */
631
0
      FDK_FALLTHROUGH;
632
0
    case 7: /* 5/0/2.1ch front */
633
0
      pPce->NumFrontChannelElements += 1;
634
0
      pPce->FrontElementIsCpe[2] = 1;
635
0
      pPce->NumChannels += 2;
636
0
      pPce->NumEffectiveChannels += 2;
637
0
      FDK_FALLTHROUGH;
638
0
    case 6: /* 3/0/2.1ch */
639
0
      pPce->NumLfeChannelElements += 1;
640
0
      pPce->NumChannels += 1;
641
0
      FDK_FALLTHROUGH;
642
0
    case 5: /* 3/0/2.0ch */
643
0
    case 4: /* 3/0/1.0ch */
644
0
      pPce->NumBackChannelElements += 1;
645
0
      pPce->BackElementIsCpe[0] = (channelConfig > 4) ? 1 : 0;
646
0
      pPce->NumChannels += (channelConfig > 4) ? 2 : 1;
647
0
      pPce->NumEffectiveChannels += (channelConfig > 4) ? 2 : 1;
648
0
      FDK_FALLTHROUGH;
649
0
    case 3: /* 3/0/0.0ch */
650
0
      pPce->NumFrontChannelElements += 1;
651
0
      pPce->FrontElementIsCpe[1] = 1;
652
0
      pPce->NumChannels += 2;
653
0
      pPce->NumEffectiveChannels += 2;
654
0
      FDK_FALLTHROUGH;
655
0
    case 1: /* 1/0/0.0ch */
656
0
      pPce->NumFrontChannelElements += 1;
657
0
      pPce->FrontElementIsCpe[0] = 0;
658
0
      pPce->NumChannels += 1;
659
0
      pPce->NumEffectiveChannels += 1;
660
0
      pPce->isValid = 1;
661
0
      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
0
  }
675
676
0
  if (pPce->isValid) {
677
    /* Create valid element instance tags */
678
0
    int el, elTagSce = 0, elTagCpe = 0;
679
680
0
    for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
681
0
      pPce->FrontElementTagSelect[el] =
682
0
          (pPce->FrontElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
683
0
    }
684
0
    for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
685
0
      pPce->SideElementTagSelect[el] =
686
0
          (pPce->SideElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
687
0
    }
688
0
    for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
689
0
      pPce->BackElementTagSelect[el] =
690
0
          (pPce->BackElementIsCpe[el]) ? elTagCpe++ : elTagSce++;
691
0
    }
692
0
    elTagSce = 0;
693
0
    for (el = 0; el < pPce->NumLfeChannelElements; el += 1) {
694
0
      pPce->LfeElementTagSelect[el] = elTagSce++;
695
0
    }
696
0
  }
697
0
}
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
0
                                   const INT elListSize, UCHAR *pChMapIdx) {
1247
0
  int i, el = 0;
1248
1249
0
  FDK_ASSERT(elList != NULL);
1250
0
  FDK_ASSERT(pChMapIdx != NULL);
1251
0
  FDK_ASSERT(pPce != NULL);
1252
1253
0
  *pChMapIdx = 0;
1254
1255
0
  if ((elListSize <
1256
0
       pPce->NumFrontChannelElements + pPce->NumSideChannelElements +
1257
0
           pPce->NumBackChannelElements + pPce->NumLfeChannelElements) ||
1258
0
      (pPce->NumChannels == 0)) {
1259
0
    return 0;
1260
0
  }
1261
1262
0
  for (i = 0; i < pPce->NumFrontChannelElements; i += 1) {
1263
0
    elList[el++] = (pPce->FrontElementIsCpe[i]) ? ID_CPE : ID_SCE;
1264
0
  }
1265
1266
0
  for (i = 0; i < pPce->NumSideChannelElements; i += 1) {
1267
0
    elList[el++] = (pPce->SideElementIsCpe[i]) ? ID_CPE : ID_SCE;
1268
0
  }
1269
1270
0
  for (i = 0; i < pPce->NumBackChannelElements; i += 1) {
1271
0
    elList[el++] = (pPce->BackElementIsCpe[i]) ? ID_CPE : ID_SCE;
1272
0
  }
1273
1274
0
  for (i = 0; i < pPce->NumLfeChannelElements; i += 1) {
1275
0
    elList[el++] = ID_LFE;
1276
0
  }
1277
1278
  /* Find an corresponding channel configuration if possible */
1279
0
  switch (pPce->NumChannels) {
1280
0
    case 1:
1281
0
    case 2:
1282
      /* One and two channels have no alternatives. */
1283
0
      *pChMapIdx = pPce->NumChannels;
1284
0
      break;
1285
0
    case 3:
1286
0
    case 4:
1287
0
    case 5:
1288
0
    case 6: { /* Test if the number of channels can be used as channel config:
1289
               */
1290
0
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1291
      /* Create a PCE for the config to test ... */
1292
0
      CProgramConfig_GetDefault(tmpPce, pPce->NumChannels);
1293
      /* ... and compare it with the given one. */
1294
0
      *pChMapIdx = (!(CProgramConfig_Compare(pPce, tmpPce) & 0xE))
1295
0
                       ? pPce->NumChannels
1296
0
                       : 0;
1297
      /* If compare result is 0 or 1 we can be sure that it is channel
1298
       * config 11. */
1299
0
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1300
0
    } break;
1301
0
    case 7: {
1302
0
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1303
      /* Create a PCE for the config to test ... */
1304
0
      CProgramConfig_GetDefault(tmpPce, 11);
1305
      /* ... and compare it with the given one. */
1306
0
      *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
0
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1310
0
    } break;
1311
0
    case 8: { /* Try the four possible 7.1ch configurations. One after the
1312
                 other. */
1313
0
      UCHAR testCfg[4] = {32, 14, 12, 7};
1314
0
      C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
1315
0
      for (i = 0; i < 4; i += 1) {
1316
        /* Create a PCE for the config to test ... */
1317
0
        CProgramConfig_GetDefault(tmpPce, testCfg[i]);
1318
        /* ... and compare it with the given one. */
1319
0
        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
0
          *pChMapIdx = (testCfg[i] == 32) ? 12 : testCfg[i];
1325
0
        }
1326
0
      }
1327
0
      C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
1328
0
    } break;
1329
0
    default:
1330
      /* The PCE does not match any predefined channel configuration. */
1331
0
      *pChMapIdx = 0;
1332
0
      break;
1333
0
  }
1334
1335
0
  return el;
1336
0
}
1337
1338
0
static AUDIO_OBJECT_TYPE getAOT(HANDLE_FDK_BITSTREAM bs) {
1339
0
  int tmp = 0;
1340
1341
0
  tmp = FDKreadBits(bs, 5);
1342
0
  if (tmp == AOT_ESCAPE) {
1343
0
    int tmp2 = FDKreadBits(bs, 6);
1344
0
    tmp = 32 + tmp2;
1345
0
  }
1346
1347
0
  return (AUDIO_OBJECT_TYPE)tmp;
1348
0
}
1349
1350
0
static INT getSampleRate(HANDLE_FDK_BITSTREAM bs, UCHAR *index, int nBits) {
1351
0
  INT sampleRate;
1352
0
  int idx;
1353
1354
0
  idx = FDKreadBits(bs, nBits);
1355
0
  if (idx == (1 << nBits) - 1) {
1356
0
    if (FDKgetValidBits(bs) < 24) {
1357
0
      return 0;
1358
0
    }
1359
0
    sampleRate = FDKreadBits(bs, 24);
1360
0
  } else {
1361
0
    sampleRate = SamplingRateTable[idx];
1362
0
  }
1363
1364
0
  *index = idx;
1365
1366
0
  return sampleRate;
1367
0
}
1368
1369
static TRANSPORTDEC_ERROR GaSpecificConfig_Parse(CSGaSpecificConfig *self,
1370
                                                 CSAudioSpecificConfig *asc,
1371
                                                 HANDLE_FDK_BITSTREAM bs,
1372
0
                                                 UINT ascStartAnchor) {
1373
0
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1374
1375
0
  self->m_frameLengthFlag = FDKreadBits(bs, 1);
1376
1377
0
  self->m_dependsOnCoreCoder = FDKreadBits(bs, 1);
1378
1379
0
  if (self->m_dependsOnCoreCoder) self->m_coreCoderDelay = FDKreadBits(bs, 14);
1380
1381
0
  self->m_extensionFlag = FDKreadBits(bs, 1);
1382
1383
0
  if (asc->m_channelConfiguration == 0) {
1384
0
    CProgramConfig_Read(&asc->m_progrConfigElement, bs, ascStartAnchor);
1385
0
  }
1386
1387
0
  if ((asc->m_aot == AOT_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_SCAL)) {
1388
0
    self->m_layer = FDKreadBits(bs, 3);
1389
0
  }
1390
1391
0
  if (self->m_extensionFlag) {
1392
0
    if (asc->m_aot == AOT_ER_BSAC) {
1393
0
      self->m_numOfSubFrame = FDKreadBits(bs, 5);
1394
0
      self->m_layerLength = FDKreadBits(bs, 11);
1395
0
    }
1396
1397
0
    if ((asc->m_aot == AOT_ER_AAC_LC) || (asc->m_aot == AOT_ER_AAC_LTP) ||
1398
0
        (asc->m_aot == AOT_ER_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_LD)) {
1399
0
      asc->m_vcb11Flag = FDKreadBits(bs, 1); /* aacSectionDataResilienceFlag */
1400
0
      asc->m_rvlcFlag =
1401
0
          FDKreadBits(bs, 1); /* aacScalefactorDataResilienceFlag */
1402
0
      asc->m_hcrFlag = FDKreadBits(bs, 1); /* aacSpectralDataResilienceFlag */
1403
0
    }
1404
1405
0
    self->m_extensionFlag3 = FDKreadBits(bs, 1);
1406
0
  }
1407
0
  return (ErrorStatus);
1408
0
}
1409
1410
0
static INT skipSbrHeader(HANDLE_FDK_BITSTREAM hBs, int isUsac) {
1411
  /* Dummy parse SbrDfltHeader() */
1412
0
  INT dflt_header_extra1, dflt_header_extra2, bitsToSkip = 0;
1413
1414
0
  if (!isUsac) {
1415
0
    bitsToSkip = 6;
1416
0
    FDKpushFor(hBs, 6); /* amp res 1, xover freq 3, reserved 2 */
1417
0
  }
1418
0
  bitsToSkip += 8;
1419
0
  FDKpushFor(hBs, 8); /* start / stop freq */
1420
0
  bitsToSkip += 2;
1421
0
  dflt_header_extra1 = FDKreadBit(hBs);
1422
0
  dflt_header_extra2 = FDKreadBit(hBs);
1423
0
  bitsToSkip += 5 * dflt_header_extra1 + 6 * dflt_header_extra2;
1424
0
  FDKpushFor(hBs, 5 * dflt_header_extra1 + 6 * dflt_header_extra2);
1425
1426
0
  return bitsToSkip;
1427
0
}
1428
1429
static INT ld_sbr_header(CSAudioSpecificConfig *asc, const INT dsFactor,
1430
0
                         HANDLE_FDK_BITSTREAM hBs, CSTpCallBacks *cb) {
1431
0
  const int channelConfiguration = asc->m_channelConfiguration;
1432
0
  int i = 0, j = 0;
1433
0
  INT error = 0;
1434
0
  MP4_ELEMENT_ID element = ID_NONE;
1435
1436
  /* check whether the channelConfiguration is defined in
1437
   * channel_configuration_array */
1438
0
  if (channelConfiguration < 0 ||
1439
0
      channelConfiguration > (INT)(sizeof(channel_configuration_array) /
1440
0
                                       sizeof(MP4_ELEMENT_ID **) -
1441
0
                                   1)) {
1442
0
    return TRANSPORTDEC_PARSE_ERROR;
1443
0
  }
1444
1445
  /* read elements of the passed channel_configuration until there is ID_NONE */
1446
0
  while ((element = channel_configuration_array[channelConfiguration][j]) !=
1447
0
         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
0
    if (element == ID_SCE || element == ID_CPE || element == ID_LFE) {
1453
0
      error |= cb->cbSbr(
1454
0
          cb->cbSbrData, hBs, asc->m_samplingFrequency / dsFactor,
1455
0
          asc->m_extensionSamplingFrequency / dsFactor,
1456
0
          asc->m_samplesPerFrame / dsFactor, AOT_ER_AAC_ELD, element, i++, 0, 0,
1457
0
          asc->configMode, &asc->SbrConfigChanged, dsFactor);
1458
0
      if (error != TRANSPORTDEC_OK) {
1459
0
        goto bail;
1460
0
      }
1461
0
    }
1462
0
    j++;
1463
0
  }
1464
0
bail:
1465
0
  return error;
1466
0
}
1467
1468
static TRANSPORTDEC_ERROR EldSpecificConfig_Parse(CSAudioSpecificConfig *asc,
1469
                                                  HANDLE_FDK_BITSTREAM hBs,
1470
0
                                                  CSTpCallBacks *cb) {
1471
0
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1472
0
  CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig;
1473
0
  UINT eldExtType;
1474
0
  int eldExtLen, len, cnt, ldSbrLen = 0, eldExtLenSum, numSbrHeader = 0,
1475
0
                           sbrIndex, eldExtCnt = 0;
1476
1477
0
  unsigned char downscale_fill_nibble;
1478
1479
0
  FDKmemclear(esc, sizeof(CSEldSpecificConfig));
1480
1481
0
  esc->m_frameLengthFlag = FDKreadBits(hBs, 1);
1482
0
  if (esc->m_frameLengthFlag) {
1483
0
    asc->m_samplesPerFrame = 480;
1484
0
  } else {
1485
0
    asc->m_samplesPerFrame = 512;
1486
0
  }
1487
1488
0
  asc->m_vcb11Flag = FDKreadBits(hBs, 1);
1489
0
  asc->m_rvlcFlag = FDKreadBits(hBs, 1);
1490
0
  asc->m_hcrFlag = FDKreadBits(hBs, 1);
1491
1492
0
  esc->m_sbrPresentFlag = FDKreadBits(hBs, 1);
1493
1494
0
  if (esc->m_sbrPresentFlag == 1) {
1495
0
    esc->m_sbrSamplingRate =
1496
0
        FDKreadBits(hBs, 1); /* 0: single rate, 1: dual rate */
1497
0
    esc->m_sbrCrcFlag = FDKreadBits(hBs, 1);
1498
1499
0
    asc->m_extensionSamplingFrequency = asc->m_samplingFrequency
1500
0
                                        << esc->m_sbrSamplingRate;
1501
1502
0
    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
0
      switch (asc->m_channelConfiguration) {
1507
0
        case 1:
1508
0
        case 2:
1509
0
          numSbrHeader = 1;
1510
0
          break;
1511
0
        case 3:
1512
0
          numSbrHeader = 2;
1513
0
          break;
1514
0
        case 4:
1515
0
        case 5:
1516
0
        case 6:
1517
0
          numSbrHeader = 3;
1518
0
          break;
1519
0
        case 7:
1520
0
        case 11:
1521
0
        case 12:
1522
0
        case 14:
1523
0
          numSbrHeader = 4;
1524
0
          break;
1525
0
        default:
1526
0
          numSbrHeader = 0;
1527
0
          break;
1528
0
      }
1529
0
      for (sbrIndex = 0; sbrIndex < numSbrHeader; sbrIndex++) {
1530
0
        ldSbrLen += skipSbrHeader(hBs, 0);
1531
0
      }
1532
0
    } else {
1533
0
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1534
0
    }
1535
0
  }
1536
0
  esc->m_useLdQmfTimeAlign = 0;
1537
1538
  /* new ELD syntax */
1539
0
  eldExtLenSum = FDKgetValidBits(hBs);
1540
0
  esc->m_downscaledSamplingFrequency = asc->m_samplingFrequency;
1541
  /* parse ExtTypeConfigData */
1542
0
  while (((eldExtType = FDKreadBits(hBs, 4)) != ELDEXT_TERM) &&
1543
0
         ((INT)FDKgetValidBits(hBs) >= 0) && (eldExtCnt++ < 15)) {
1544
0
    eldExtLen = len = FDKreadBits(hBs, 4);
1545
0
    if (len == 0xf) {
1546
0
      len = FDKreadBits(hBs, 8);
1547
0
      eldExtLen += len;
1548
1549
0
      if (len == 0xff) {
1550
0
        len = FDKreadBits(hBs, 16);
1551
0
        eldExtLen += len;
1552
0
      }
1553
0
    }
1554
1555
0
    switch (eldExtType) {
1556
0
      case ELDEXT_LDSAC:
1557
0
        esc->m_useLdQmfTimeAlign = 1;
1558
0
        if (cb->cbSsc != NULL) {
1559
0
          ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc(
1560
0
              cb->cbSscData, hBs, asc->m_aot,
1561
0
              asc->m_samplingFrequency << esc->m_sbrSamplingRate,
1562
0
              asc->m_samplesPerFrame << esc->m_sbrSamplingRate,
1563
0
              asc->m_channelConfiguration, 1, /* stereoConfigIndex */
1564
0
              -1, /* nTimeSlots: read from bitstream */
1565
0
              eldExtLen, asc->configMode, &asc->SacConfigChanged);
1566
0
          if (ErrorStatus != TRANSPORTDEC_OK) {
1567
0
            return TRANSPORTDEC_PARSE_ERROR;
1568
0
          }
1569
0
          if (esc->m_downscaledSamplingFrequency != asc->m_samplingFrequency) {
1570
0
            return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled
1571
                                                       mode not allowed */
1572
0
          }
1573
0
          break;
1574
0
        }
1575
1576
0
        FDK_FALLTHROUGH;
1577
0
      default:
1578
0
        for (cnt = 0; cnt < eldExtLen; cnt++) {
1579
0
          FDKreadBits(hBs, 8);
1580
0
        }
1581
0
        break;
1582
1583
0
      case ELDEXT_DOWNSCALEINFO:
1584
0
        UCHAR tmpDownscaleFreqIdx;
1585
0
        esc->m_downscaledSamplingFrequency =
1586
0
            getSampleRate(hBs, &tmpDownscaleFreqIdx, 4);
1587
0
        if (esc->m_downscaledSamplingFrequency == 0 ||
1588
0
            esc->m_downscaledSamplingFrequency > 96000) {
1589
0
          return TRANSPORTDEC_PARSE_ERROR;
1590
0
        }
1591
0
        downscale_fill_nibble = FDKreadBits(hBs, 4);
1592
0
        if (downscale_fill_nibble != 0x0) {
1593
0
          return TRANSPORTDEC_PARSE_ERROR;
1594
0
        }
1595
0
        if (esc->m_useLdQmfTimeAlign == 1) {
1596
0
          return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* ELDv2 w/ ELD downscaled
1597
                                                     mode not allowed */
1598
0
        }
1599
0
        break;
1600
0
    }
1601
0
  }
1602
0
  if (eldExtType != ELDEXT_TERM) {
1603
0
    return TRANSPORTDEC_PARSE_ERROR;
1604
0
  }
1605
1606
0
  if ((INT)FDKgetValidBits(hBs) < 0) {
1607
0
    return TRANSPORTDEC_PARSE_ERROR;
1608
0
  }
1609
1610
0
  if (esc->m_sbrPresentFlag == 1 && numSbrHeader != 0) {
1611
0
    INT dsFactor = 1; /* Downscale factor must be 1 or even for SBR */
1612
0
    if (esc->m_downscaledSamplingFrequency != 0) {
1613
0
      if (asc->m_samplingFrequency % esc->m_downscaledSamplingFrequency != 0) {
1614
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1615
0
      }
1616
0
      dsFactor = asc->m_samplingFrequency / esc->m_downscaledSamplingFrequency;
1617
0
      if (dsFactor != 1 && (dsFactor)&1) {
1618
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* SBR needs an even downscale
1619
                                                   factor */
1620
0
      }
1621
0
      if (dsFactor != 1 && dsFactor != 2 && dsFactor != 4) {
1622
0
        dsFactor = 1; /* don't apply dsf for not yet supported even dsfs */
1623
0
      }
1624
0
      if ((INT)asc->m_samplesPerFrame % dsFactor != 0) {
1625
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT; /* frameSize/dsf must be an
1626
                                                   integer number */
1627
0
      }
1628
0
    }
1629
0
    eldExtLenSum = eldExtLenSum - FDKgetValidBits(hBs);
1630
0
    FDKpushBack(hBs, eldExtLenSum + ldSbrLen);
1631
0
    if (0 != ld_sbr_header(asc, dsFactor, hBs, cb)) {
1632
0
      return TRANSPORTDEC_PARSE_ERROR;
1633
0
    }
1634
0
    FDKpushFor(hBs, eldExtLenSum);
1635
0
  }
1636
0
  return (ErrorStatus);
1637
0
}
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
0
    UCHAR *configTargetBuffer, const USHORT configTargetBufferSize_bytes) {
1648
0
  FDK_BITSTREAM usacConf;
1649
0
  UINT const nBits = fAbs(configSize_bits);
1650
0
  UINT j, tmp;
1651
1652
0
  if (nBits > 8 * (UINT)configTargetBufferSize_bytes) {
1653
0
    return 1;
1654
0
  }
1655
0
  FDKmemclear(configTargetBuffer, configTargetBufferSize_bytes);
1656
1657
0
  FDKinitBitStream(&usacConf, configTargetBuffer, configTargetBufferSize_bytes,
1658
0
                   nBits, BS_WRITER);
1659
0
  if (configSize_bits < 0) {
1660
0
    FDKpushBack(hBs, nBits);
1661
0
  }
1662
0
  for (j = nBits; j > 31; j -= 32) {
1663
0
    tmp = FDKreadBits(hBs, 32);
1664
0
    FDKwriteBits(&usacConf, tmp, 32);
1665
0
  }
1666
0
  if (j > 0) {
1667
0
    tmp = FDKreadBits(hBs, j);
1668
0
    FDKwriteBits(&usacConf, tmp, j);
1669
0
  }
1670
0
  FDKsyncCache(&usacConf);
1671
0
  if (configSize_bits > 0) {
1672
0
    FDKpushBack(hBs, nBits);
1673
0
  }
1674
1675
0
  return 0;
1676
0
}
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
0
                                           const AUDIO_OBJECT_TYPE aot) {
1695
0
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1696
1697
0
  UINT usacExtElementType = escapedValue(hBs, 4, 8, 16);
1698
1699
  /* recurve extension elements which are invalid for USAC */
1700
0
  if (aot == AOT_USAC) {
1701
0
    switch (usacExtElementType) {
1702
0
      case ID_EXT_ELE_FILL:
1703
0
      case ID_EXT_ELE_MPEGS:
1704
0
      case ID_EXT_ELE_SAOC:
1705
0
      case ID_EXT_ELE_AUDIOPREROLL:
1706
0
      case ID_EXT_ELE_UNI_DRC:
1707
0
        break;
1708
0
      default:
1709
0
        usacExtElementType = ID_EXT_ELE_UNKNOWN;
1710
0
        break;
1711
0
    }
1712
0
  }
1713
1714
0
  int usacExtElementConfigLength = escapedValue(hBs, 4, 8, 16);
1715
0
  extElement->usacExtElementConfigLength = (USHORT)usacExtElementConfigLength;
1716
0
  INT bsAnchor;
1717
1718
0
  if (FDKreadBit(hBs)) /* usacExtElementDefaultLengthPresent */
1719
0
    extElement->usacExtElementDefaultLength = escapedValue(hBs, 8, 16, 0) + 1;
1720
0
  else
1721
0
    extElement->usacExtElementDefaultLength = 0;
1722
1723
0
  extElement->usacExtElementPayloadFrag = FDKreadBit(hBs);
1724
1725
0
  bsAnchor = (INT)FDKgetValidBits(hBs);
1726
1727
0
  switch (usacExtElementType) {
1728
0
    case ID_EXT_ELE_UNKNOWN:
1729
0
    case ID_EXT_ELE_FILL:
1730
0
      break;
1731
0
    case ID_EXT_ELE_AUDIOPREROLL:
1732
      /* No configuration element */
1733
0
      extElement->usacExtElementHasAudioPreRoll = 1;
1734
0
      break;
1735
0
    case ID_EXT_ELE_UNI_DRC: {
1736
0
      if (cb->cbUniDrc != NULL) {
1737
0
        ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1738
0
            cb->cbUniDrcData, hBs, usacExtElementConfigLength,
1739
0
            0, /* uniDrcConfig */
1740
0
            subStreamIndex, 0, aot);
1741
0
        if (ErrorStatus != TRANSPORTDEC_OK) {
1742
0
          return ErrorStatus;
1743
0
        }
1744
0
      }
1745
0
    } break;
1746
0
    default:
1747
0
      usacExtElementType = ID_EXT_ELE_UNKNOWN;
1748
0
      break;
1749
0
  }
1750
0
  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
0
  {
1755
0
    INT left_bits = (usacExtElementConfigLength << 3) -
1756
0
                    (bsAnchor - (INT)FDKgetValidBits(hBs));
1757
0
    if (left_bits >= 0) {
1758
0
      FDKpushFor(hBs, left_bits);
1759
0
    } else {
1760
      /* parsed too many bits */
1761
0
      ErrorStatus = TRANSPORTDEC_PARSE_ERROR;
1762
0
    }
1763
0
  }
1764
1765
0
  return ErrorStatus;
1766
0
}
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
0
                                          const CSTpCallBacks *cb) {
1776
0
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1777
1778
0
  int numConfigExtensions;
1779
0
  UINT usacConfigExtType;
1780
0
  int usacConfigExtLength;
1781
0
  int loudnessInfoSetIndex =
1782
0
      -1; /* index of loudnessInfoSet config extension. -1 if not contained. */
1783
0
  int tmp_subStreamIndex = 0;
1784
0
  AUDIO_OBJECT_TYPE tmp_aot = AOT_USAC;
1785
1786
0
  numConfigExtensions = (int)escapedValue(hBs, 2, 4, 8) + 1;
1787
0
  for (int confExtIdx = 0; confExtIdx < numConfigExtensions; confExtIdx++) {
1788
0
    INT nbits;
1789
0
    int loudnessInfoSetConfigExtensionPosition = FDKgetValidBits(hBs);
1790
0
    usacConfigExtType = escapedValue(hBs, 4, 8, 16);
1791
0
    usacConfigExtLength = (int)escapedValue(hBs, 4, 8, 16);
1792
1793
    /* Start bit position of config extension */
1794
0
    nbits = (INT)FDKgetValidBits(hBs);
1795
1796
    /* Return an error in case the bitbuffer fill level is too low. */
1797
0
    if (nbits < usacConfigExtLength * 8) {
1798
0
      return TRANSPORTDEC_PARSE_ERROR;
1799
0
    }
1800
1801
0
    switch (usacConfigExtType) {
1802
0
      case ID_CONFIG_EXT_FILL:
1803
0
        for (int i = 0; i < usacConfigExtLength; i++) {
1804
0
          if (FDKreadBits(hBs, 8) != 0xa5) {
1805
0
            return TRANSPORTDEC_PARSE_ERROR;
1806
0
          }
1807
0
        }
1808
0
        break;
1809
0
      case ID_CONFIG_EXT_LOUDNESS_INFO: {
1810
0
        if (cb->cbUniDrc != NULL) {
1811
0
          ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1812
0
              cb->cbUniDrcData, hBs, usacConfigExtLength,
1813
0
              1, /* loudnessInfoSet */
1814
0
              tmp_subStreamIndex, loudnessInfoSetConfigExtensionPosition,
1815
0
              tmp_aot);
1816
0
          if (ErrorStatus != TRANSPORTDEC_OK) {
1817
0
            return ErrorStatus;
1818
0
          }
1819
0
          loudnessInfoSetIndex = confExtIdx;
1820
0
        }
1821
0
      } break;
1822
0
      default:
1823
0
        break;
1824
0
    }
1825
1826
    /* Skip remaining bits. If too many bits were parsed, assume error. */
1827
0
    usacConfigExtLength =
1828
0
        8 * usacConfigExtLength - (nbits - (INT)FDKgetValidBits(hBs));
1829
0
    if (usacConfigExtLength < 0) {
1830
0
      return TRANSPORTDEC_PARSE_ERROR;
1831
0
    }
1832
0
    FDKpushFor(hBs, usacConfigExtLength);
1833
0
  }
1834
1835
0
  if (loudnessInfoSetIndex == -1 && cb->cbUniDrc != NULL) {
1836
    /* no loudnessInfoSet contained. Clear the loudnessInfoSet struct by feeding
1837
     * an empty config extension */
1838
0
    ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
1839
0
        cb->cbUniDrcData, NULL, 0, 1 /* loudnessInfoSet */, tmp_subStreamIndex,
1840
0
        0, tmp_aot);
1841
0
    if (ErrorStatus != TRANSPORTDEC_OK) {
1842
0
      return ErrorStatus;
1843
0
    }
1844
0
  }
1845
1846
0
  return ErrorStatus;
1847
0
}
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
0
    const CSTpCallBacks *cb) {
1856
0
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1857
0
  CSUsacConfig *usc = &asc->m_sc.m_usacConfig;
1858
0
  int i, numberOfElements;
1859
0
  int channelElementIdx =
1860
0
      0; /* index for elements which contain audio channels (sce, cpe, lfe) */
1861
0
  SC_CHANNEL_CONFIG sc_chan_config = {0, 0, 0, 0};
1862
0
  int uniDrcElement =
1863
0
      -1; /* index of uniDrc extension element. -1 if not contained. */
1864
1865
0
  numberOfElements = (int)escapedValue(hBs, 4, 8, 16) + 1;
1866
0
  usc->m_usacNumElements = numberOfElements;
1867
0
  if (numberOfElements > TP_USAC_MAX_ELEMENTS) {
1868
0
    return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1869
0
  }
1870
0
  usc->m_nUsacChannels = 0;
1871
0
  usc->m_channelConfigurationIndex = asc->m_channelConfiguration;
1872
1873
0
  if (asc->m_aot == AOT_USAC) {
1874
0
    sc_chan_config = sc_chan_config_tab[usc->m_channelConfigurationIndex];
1875
1876
0
    if (sc_chan_config.nCh > (SCHAR)TP_USAC_MAX_SPEAKERS) {
1877
0
      return TRANSPORTDEC_PARSE_ERROR;
1878
0
    }
1879
0
  }
1880
1881
0
  for (i = 0; i < numberOfElements; i++) {
1882
0
    MP4_ELEMENT_ID usacElementType = (MP4_ELEMENT_ID)(
1883
0
        FDKreadBits(hBs, 2) | USAC_ID_BIT); /* set USAC_ID_BIT to map
1884
                                               usacElementType to
1885
                                               MP4_ELEMENT_ID enum */
1886
0
    usc->element[i].usacElementType = usacElementType;
1887
1888
    /* sanity check: update element counter */
1889
0
    if (asc->m_aot == AOT_USAC) {
1890
0
      switch (usacElementType) {
1891
0
        case ID_USAC_SCE:
1892
0
          sc_chan_config.nSCE--;
1893
0
          break;
1894
0
        case ID_USAC_CPE:
1895
0
          sc_chan_config.nCPE--;
1896
0
          break;
1897
0
        case ID_USAC_LFE:
1898
0
          sc_chan_config.nLFE--;
1899
0
          break;
1900
0
        default:
1901
0
          break;
1902
0
      }
1903
0
      if (usc->m_channelConfigurationIndex) {
1904
        /* sanity check: no element counter may be smaller zero */
1905
0
        if (sc_chan_config.nCPE < 0 || sc_chan_config.nSCE < 0 ||
1906
0
            sc_chan_config.nLFE < 0) {
1907
0
          return TRANSPORTDEC_PARSE_ERROR;
1908
0
        }
1909
0
      }
1910
0
    }
1911
1912
0
    switch (usacElementType) {
1913
0
      case ID_USAC_SCE:
1914
        /* UsacCoreConfig() ISO/IEC FDIS 23003-3  Table 10 */
1915
0
        if (FDKreadBit(hBs)) { /* tw_mdct */
1916
0
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1917
0
        }
1918
0
        usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1);
1919
        /* end of UsacCoreConfig() */
1920
0
        if (usc->m_sbrRatioIndex > 0) {
1921
0
          if (cb->cbSbr == NULL) {
1922
0
            return TRANSPORTDEC_UNKOWN_ERROR;
1923
0
          }
1924
          /* SbrConfig() ISO/IEC FDIS 23003-3  Table 11 */
1925
0
          usc->element[i].m_harmonicSBR = FDKreadBit(hBs);
1926
0
          usc->element[i].m_interTes = FDKreadBit(hBs);
1927
0
          usc->element[i].m_pvc = FDKreadBit(hBs);
1928
0
          if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
1929
0
                        asc->m_extensionSamplingFrequency,
1930
0
                        asc->m_samplesPerFrame, asc->m_aot, ID_SCE,
1931
0
                        channelElementIdx, usc->element[i].m_harmonicSBR,
1932
0
                        usc->element[i].m_stereoConfigIndex, asc->configMode,
1933
0
                        &asc->SbrConfigChanged, 1)) {
1934
0
            return TRANSPORTDEC_PARSE_ERROR;
1935
0
          }
1936
          /* end of SbrConfig() */
1937
0
        }
1938
0
        usc->m_nUsacChannels += 1;
1939
0
        channelElementIdx++;
1940
0
        break;
1941
1942
0
      case ID_USAC_CPE:
1943
        /* UsacCoreConfig() ISO/IEC FDIS 23003-3  Table 10 */
1944
0
        if (FDKreadBit(hBs)) { /* tw_mdct */
1945
0
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1946
0
        }
1947
0
        usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1);
1948
        /* end of UsacCoreConfig() */
1949
0
        if (usc->m_sbrRatioIndex > 0) {
1950
0
          if (cb->cbSbr == NULL) return TRANSPORTDEC_UNKOWN_ERROR;
1951
          /* SbrConfig() ISO/IEC FDIS 23003-3 */
1952
0
          usc->element[i].m_harmonicSBR = FDKreadBit(hBs);
1953
0
          usc->element[i].m_interTes = FDKreadBit(hBs);
1954
0
          usc->element[i].m_pvc = FDKreadBit(hBs);
1955
0
          {
1956
0
            INT bitsToSkip = skipSbrHeader(hBs, 1);
1957
            /* read stereoConfigIndex */
1958
0
            usc->element[i].m_stereoConfigIndex = FDKreadBits(hBs, 2);
1959
            /* rewind */
1960
0
            FDKpushBack(hBs, bitsToSkip + 2);
1961
0
          }
1962
0
          {
1963
0
            MP4_ELEMENT_ID el_type =
1964
0
                (usc->element[i].m_stereoConfigIndex == 1 ||
1965
0
                 usc->element[i].m_stereoConfigIndex == 2)
1966
0
                    ? ID_SCE
1967
0
                    : ID_CPE;
1968
0
            if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency,
1969
0
                          asc->m_extensionSamplingFrequency,
1970
0
                          asc->m_samplesPerFrame, asc->m_aot, el_type,
1971
0
                          channelElementIdx, usc->element[i].m_harmonicSBR,
1972
0
                          usc->element[i].m_stereoConfigIndex, asc->configMode,
1973
0
                          &asc->SbrConfigChanged, 1)) {
1974
0
              return TRANSPORTDEC_PARSE_ERROR;
1975
0
            }
1976
0
          }
1977
          /* end of SbrConfig() */
1978
1979
0
          usc->element[i].m_stereoConfigIndex =
1980
0
              FDKreadBits(hBs, 2); /* Needed in RM5 syntax */
1981
1982
0
          if (usc->element[i].m_stereoConfigIndex > 0) {
1983
0
            if (cb->cbSsc != NULL) {
1984
0
              int samplesPerFrame = asc->m_samplesPerFrame;
1985
1986
0
              if (usc->m_sbrRatioIndex == 1) samplesPerFrame <<= 2;
1987
0
              if (usc->m_sbrRatioIndex == 2)
1988
0
                samplesPerFrame = (samplesPerFrame * 8) / 3;
1989
0
              if (usc->m_sbrRatioIndex == 3) samplesPerFrame <<= 1;
1990
1991
              /* Mps212Config() ISO/IEC FDIS 23003-3 */
1992
0
              if (cb->cbSsc(cb->cbSscData, hBs, asc->m_aot,
1993
0
                            asc->m_extensionSamplingFrequency, samplesPerFrame,
1994
0
                            1, /* only downmix channels (residual channels are
1995
                                  not counted) */
1996
0
                            usc->element[i].m_stereoConfigIndex,
1997
0
                            usc->m_coreSbrFrameLengthIndex,
1998
0
                            0, /* don't know the length */
1999
0
                            asc->configMode, &asc->SacConfigChanged)) {
2000
0
                return TRANSPORTDEC_PARSE_ERROR;
2001
0
              }
2002
              /* end of Mps212Config() */
2003
0
            } else {
2004
0
              return TRANSPORTDEC_UNKOWN_ERROR;
2005
0
            }
2006
0
          }
2007
0
        } else {
2008
0
          usc->element[i].m_stereoConfigIndex = 0;
2009
0
        }
2010
0
        usc->m_nUsacChannels += 2;
2011
2012
0
        channelElementIdx++;
2013
0
        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
0
      case ID_USAC_EXT:
2037
0
        ErrorStatus = extElementConfig(&usc->element[i].extElement, hBs, cb, 0,
2038
0
                                       asc->m_samplesPerFrame, 0, asc->m_aot);
2039
0
        if (usc->element[i].extElement.usacExtElementType ==
2040
0
            ID_EXT_ELE_UNI_DRC) {
2041
0
          uniDrcElement = i;
2042
0
        }
2043
2044
0
        if (ErrorStatus) {
2045
0
          return ErrorStatus;
2046
0
        }
2047
0
        break;
2048
2049
0
      default:
2050
        /* non USAC-element encountered */
2051
0
        return TRANSPORTDEC_PARSE_ERROR;
2052
0
    }
2053
0
  }
2054
2055
0
  if (asc->m_aot == AOT_USAC) {
2056
0
    if (usc->m_channelConfigurationIndex) {
2057
      /* sanity check: all element counter must be zero */
2058
0
      if (sc_chan_config.nCPE | sc_chan_config.nSCE | sc_chan_config.nLFE) {
2059
0
        return TRANSPORTDEC_PARSE_ERROR;
2060
0
      }
2061
0
    } 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
0
  }
2070
2071
0
  if (uniDrcElement == -1 && cb->cbUniDrc != NULL) {
2072
    /* no uniDrcConfig contained. Clear the uniDrcConfig struct by feeding an
2073
     * empty extension element */
2074
0
    int subStreamIndex = 0;
2075
0
    ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
2076
0
        cb->cbUniDrcData, NULL, 0, 0 /* uniDrcConfig */, subStreamIndex, 0,
2077
0
        asc->m_aot);
2078
0
    if (ErrorStatus != TRANSPORTDEC_OK) {
2079
0
      return ErrorStatus;
2080
0
    }
2081
0
  }
2082
2083
0
  return ErrorStatus;
2084
0
}
2085
2086
/* Mapping of coreSbrFrameLengthIndex defined by Table 70 in ISO/IEC 23003-3 */
2087
static TRANSPORTDEC_ERROR UsacConfig_SetCoreSbrFrameLengthIndex(
2088
0
    CSAudioSpecificConfig *asc, int coreSbrFrameLengthIndex) {
2089
0
  int sbrRatioIndex_val;
2090
2091
0
  if (coreSbrFrameLengthIndex > 4) {
2092
0
    return TRANSPORTDEC_PARSE_ERROR; /* reserved values */
2093
0
  }
2094
0
  asc->m_sc.m_usacConfig.m_coreSbrFrameLengthIndex = coreSbrFrameLengthIndex;
2095
0
  asc->m_samplesPerFrame = usacFrameLength[coreSbrFrameLengthIndex];
2096
0
  sbrRatioIndex_val = sbrRatioIndex[coreSbrFrameLengthIndex];
2097
0
  asc->m_sc.m_usacConfig.m_sbrRatioIndex = sbrRatioIndex_val;
2098
2099
0
  if (sbrRatioIndex_val > 0) {
2100
0
    asc->m_sbrPresentFlag = 1;
2101
0
    asc->m_extensionSamplingFrequency = asc->m_samplingFrequency;
2102
0
    asc->m_extensionSamplingFrequencyIndex = asc->m_samplingFrequencyIndex;
2103
0
    switch (sbrRatioIndex_val) {
2104
0
      case 1: /* sbrRatio = 4:1 */
2105
0
        asc->m_samplingFrequency >>= 2;
2106
0
        asc->m_samplesPerFrame >>= 2;
2107
0
        break;
2108
0
      case 2: /* sbrRatio = 8:3 */
2109
0
        asc->m_samplingFrequency = (asc->m_samplingFrequency * 3) / 8;
2110
0
        asc->m_samplesPerFrame = (asc->m_samplesPerFrame * 3) / 8;
2111
0
        break;
2112
0
      case 3: /* sbrRatio = 2:1 */
2113
0
        asc->m_samplingFrequency >>= 1;
2114
0
        asc->m_samplesPerFrame >>= 1;
2115
0
        break;
2116
0
      default:
2117
0
        return TRANSPORTDEC_PARSE_ERROR;
2118
0
    }
2119
0
    asc->m_samplingFrequencyIndex =
2120
0
        getSamplingRateIndex(asc->m_samplingFrequency, 4);
2121
0
  }
2122
2123
0
  return TRANSPORTDEC_OK;
2124
0
}
2125
2126
static TRANSPORTDEC_ERROR UsacConfig_Parse(CSAudioSpecificConfig *asc,
2127
                                           HANDLE_FDK_BITSTREAM hBs,
2128
0
                                           CSTpCallBacks *cb) {
2129
0
  int usacSamplingFrequency, channelConfigurationIndex, coreSbrFrameLengthIndex;
2130
0
  TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK;
2131
2132
  /* Start bit position of usacConfig */
2133
0
  INT nbits = (INT)FDKgetValidBits(hBs);
2134
2135
0
  usacSamplingFrequency = getSampleRate(hBs, &asc->m_samplingFrequencyIndex, 5);
2136
0
  if (usacSamplingFrequency == 0 || usacSamplingFrequency > 96000) {
2137
0
    return TRANSPORTDEC_PARSE_ERROR;
2138
0
  }
2139
0
  asc->m_samplingFrequency = (UINT)usacSamplingFrequency;
2140
2141
0
  coreSbrFrameLengthIndex = FDKreadBits(hBs, 3);
2142
0
  if (UsacConfig_SetCoreSbrFrameLengthIndex(asc, coreSbrFrameLengthIndex) !=
2143
0
      TRANSPORTDEC_OK) {
2144
0
    return TRANSPORTDEC_PARSE_ERROR;
2145
0
  }
2146
2147
0
  channelConfigurationIndex = FDKreadBits(hBs, 5);
2148
0
  if (channelConfigurationIndex > 2) {
2149
0
    return TRANSPORTDEC_PARSE_ERROR; /* only channelConfigurationIndex = [1,2]
2150
                                        are supported */
2151
0
  }
2152
2153
0
  if (channelConfigurationIndex == 0) {
2154
0
    return TRANSPORTDEC_PARSE_ERROR; /* only channelConfigurationIndex = [1,2]
2155
                                        are supported */
2156
0
  }
2157
0
  asc->m_channelConfiguration = channelConfigurationIndex;
2158
2159
0
  err = UsacRsv60DecoderConfig_Parse(asc, hBs, cb);
2160
0
  if (err != TRANSPORTDEC_OK) {
2161
0
    return err;
2162
0
  }
2163
2164
0
  if (FDKreadBits(hBs, 1)) { /* usacConfigExtensionPresent */
2165
0
    err = configExtension(&asc->m_sc.m_usacConfig, hBs, cb);
2166
0
    if (err != TRANSPORTDEC_OK) {
2167
0
      return err;
2168
0
    }
2169
0
  } else if (cb->cbUniDrc != NULL) {
2170
    /* no loudnessInfoSet contained. Clear the loudnessInfoSet struct by feeding
2171
     * an empty config extension */
2172
0
    err = (TRANSPORTDEC_ERROR)cb->cbUniDrc(
2173
0
        cb->cbUniDrcData, NULL, 0, 1 /* loudnessInfoSet */, 0, 0, asc->m_aot);
2174
0
    if (err != TRANSPORTDEC_OK) {
2175
0
      return err;
2176
0
    }
2177
0
  }
2178
2179
  /* sanity check whether number of channels signaled in UsacDecoderConfig()
2180
     matches the number of channels required by channelConfigurationIndex */
2181
0
  if ((channelConfigurationIndex > 0) &&
2182
0
      (sc_chan_config_tab[channelConfigurationIndex].nCh !=
2183
0
       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
0
  INT configSize_bits = (INT)FDKgetValidBits(hBs) - nbits;
2189
0
  if (StoreConfigAsBitstream(hBs, configSize_bits,
2190
0
                             asc->m_sc.m_usacConfig.UsacConfig,
2191
0
                             TP_USAC_MAX_CONFIG_LEN)) {
2192
0
    return TRANSPORTDEC_PARSE_ERROR;
2193
0
  }
2194
0
  asc->m_sc.m_usacConfig.UsacConfigBits = fAbs(configSize_bits);
2195
2196
0
  return err;
2197
0
}
2198
2199
static TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse(
2200
0
    CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, CSTpCallBacks *cb) {
2201
0
  TP_ASC_EXTENSION_ID lastAscExt, ascExtId = ASCEXT_UNKOWN;
2202
0
  INT bitsAvailable = (INT)FDKgetValidBits(bs);
2203
2204
0
  while (bitsAvailable >= 11) {
2205
0
    lastAscExt = ascExtId;
2206
0
    ascExtId = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11);
2207
0
    bitsAvailable -= 11;
2208
2209
0
    switch (ascExtId) {
2210
0
      case ASCEXT_SBR: /* 0x2b7 */
2211
0
        if ((self->m_extensionAudioObjectType != AOT_SBR) &&
2212
0
            (bitsAvailable >= 5)) {
2213
0
          self->m_extensionAudioObjectType = getAOT(bs);
2214
2215
0
          if ((self->m_extensionAudioObjectType == AOT_SBR) ||
2216
0
              (self->m_extensionAudioObjectType ==
2217
0
               AOT_ER_BSAC)) { /* Get SBR extension configuration */
2218
0
            self->m_sbrPresentFlag = FDKreadBits(bs, 1);
2219
0
            if (self->m_aot == AOT_USAC && self->m_sbrPresentFlag > 0 &&
2220
0
                self->m_sc.m_usacConfig.m_sbrRatioIndex == 0) {
2221
0
              return TRANSPORTDEC_PARSE_ERROR;
2222
0
            }
2223
2224
0
            if (self->m_sbrPresentFlag == 1) {
2225
0
              self->m_extensionSamplingFrequency = getSampleRate(
2226
0
                  bs, &self->m_extensionSamplingFrequencyIndex, 4);
2227
2228
0
              if (self->m_extensionSamplingFrequency == 0 ||
2229
0
                  self->m_extensionSamplingFrequency > 96000) {
2230
0
                return TRANSPORTDEC_PARSE_ERROR;
2231
0
              }
2232
0
            }
2233
0
            if (self->m_extensionAudioObjectType == AOT_ER_BSAC) {
2234
0
              self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
2235
0
            }
2236
0
          }
2237
          /* Update counter because of variable length fields (AOT and sampling
2238
           * rate) */
2239
0
          bitsAvailable = (INT)FDKgetValidBits(bs);
2240
0
        }
2241
0
        break;
2242
0
      case ASCEXT_PS: /* 0x548 */
2243
0
        if ((lastAscExt == ASCEXT_SBR) &&
2244
0
            (self->m_extensionAudioObjectType == AOT_SBR) &&
2245
0
            (bitsAvailable > 0)) { /* Get PS extension configuration */
2246
0
          self->m_psPresentFlag = FDKreadBits(bs, 1);
2247
0
          bitsAvailable -= 1;
2248
0
        }
2249
0
        break;
2250
0
      case ASCEXT_MPS: /* 0x76a */
2251
0
        if (self->m_extensionAudioObjectType == AOT_MPEGS) break;
2252
0
        FDK_FALLTHROUGH;
2253
0
      case ASCEXT_LDMPS: /* 0x7cc */
2254
0
        if ((ascExtId == ASCEXT_LDMPS) &&
2255
0
            (self->m_extensionAudioObjectType == AOT_LD_MPEGS))
2256
0
          break;
2257
0
        if (bitsAvailable >= 1) {
2258
0
          bitsAvailable -= 1;
2259
0
          if (FDKreadBits(bs, 1)) { /* self->m_mpsPresentFlag */
2260
0
            int sscLen = FDKreadBits(bs, 8);
2261
0
            bitsAvailable -= 8;
2262
0
            if (sscLen == 0xFF) {
2263
0
              sscLen += FDKreadBits(bs, 16);
2264
0
              bitsAvailable -= 16;
2265
0
            }
2266
0
            FDKpushFor(bs, sscLen); /* Skip SSC to be able to read the next
2267
                                       extension if there is one. */
2268
2269
0
            bitsAvailable -= sscLen * 8;
2270
0
          }
2271
0
        }
2272
0
        break;
2273
0
      case ASCEXT_SAOC:
2274
0
        if ((ascExtId == ASCEXT_SAOC) &&
2275
0
            (self->m_extensionAudioObjectType == AOT_SAOC))
2276
0
          break;
2277
0
        if (FDKreadBits(bs, 1)) { /* saocPresent */
2278
0
          int saocscLen = FDKreadBits(bs, 8);
2279
0
          bitsAvailable -= 8;
2280
0
          if (saocscLen == 0xFF) {
2281
0
            saocscLen += FDKreadBits(bs, 16);
2282
0
            bitsAvailable -= 16;
2283
0
          }
2284
0
          FDKpushFor(bs, saocscLen);
2285
0
          bitsAvailable -= saocscLen * 8;
2286
0
        }
2287
0
        break;
2288
0
      default:
2289
        /* Just ignore anything. */
2290
0
        return TRANSPORTDEC_OK;
2291
0
    }
2292
0
  }
2293
2294
0
  return TRANSPORTDEC_OK;
2295
0
}
2296
2297
/*
2298
 * API Functions
2299
 */
2300
2301
0
void AudioSpecificConfig_Init(CSAudioSpecificConfig *asc) {
2302
0
  FDKmemclear(asc, sizeof(CSAudioSpecificConfig));
2303
2304
  /* Init all values that should not be zero. */
2305
0
  asc->m_aot = AOT_NONE;
2306
0
  asc->m_samplingFrequencyIndex = 0xf;
2307
0
  asc->m_epConfig = -1;
2308
0
  asc->m_extensionAudioObjectType = AOT_NULL_OBJECT;
2309
0
  CProgramConfig_Init(&asc->m_progrConfigElement);
2310
0
}
2311
2312
TRANSPORTDEC_ERROR AudioSpecificConfig_Parse(
2313
    CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs,
2314
    int fExplicitBackwardCompatible, CSTpCallBacks *cb, UCHAR configMode,
2315
0
    UCHAR configChanged, AUDIO_OBJECT_TYPE m_aot) {
2316
0
  TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
2317
0
  UINT ascStartAnchor = FDKgetValidBits(bs);
2318
0
  int frameLengthFlag = -1;
2319
2320
0
  AudioSpecificConfig_Init(self);
2321
2322
0
  self->configMode = configMode;
2323
0
  self->AacConfigChanged = configChanged;
2324
0
  self->SbrConfigChanged = configChanged;
2325
0
  self->SacConfigChanged = configChanged;
2326
2327
0
  if (m_aot != AOT_NULL_OBJECT) {
2328
0
    self->m_aot = m_aot;
2329
0
  } else {
2330
0
    self->m_aot = getAOT(bs);
2331
0
    self->m_samplingFrequency =
2332
0
        getSampleRate(bs, &self->m_samplingFrequencyIndex, 4);
2333
0
    if (self->m_samplingFrequency <= 0 ||
2334
0
        (self->m_samplingFrequency > 96000 && self->m_aot != 39) ||
2335
0
        self->m_samplingFrequency > 4 * 96000) {
2336
0
      return TRANSPORTDEC_PARSE_ERROR;
2337
0
    }
2338
2339
0
    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
0
    if ((self->m_channelConfiguration == 0) &&
2347
0
        ((self->m_aot == AOT_ER_AAC_LC) || (self->m_aot == AOT_ER_AAC_LTP) ||
2348
0
         (self->m_aot == AOT_ER_AAC_LD) || (self->m_aot == AOT_ER_AAC_SCAL) ||
2349
0
         (self->m_aot == AOT_ER_AAC_ELD))) {
2350
0
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2351
0
    }
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
0
    if ((self->m_channelConfiguration > 2) &&
2355
0
        ((self->m_aot == AOT_AAC_SCAL) || (self->m_aot == AOT_ER_AAC_SCAL))) {
2356
0
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2357
0
    }
2358
2359
    /* SBR extension ( explicit non-backwards compatible mode ) */
2360
0
    self->m_sbrPresentFlag = 0;
2361
0
    self->m_psPresentFlag = 0;
2362
2363
0
    if (self->m_aot == AOT_SBR || self->m_aot == AOT_PS) {
2364
0
      self->m_extensionAudioObjectType = AOT_SBR;
2365
2366
0
      self->m_sbrPresentFlag = 1;
2367
0
      if (self->m_aot == AOT_PS) {
2368
0
        self->m_psPresentFlag = 1;
2369
0
      }
2370
2371
0
      self->m_extensionSamplingFrequency =
2372
0
          getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
2373
0
      if (self->m_extensionSamplingFrequency == 0 ||
2374
0
          self->m_extensionSamplingFrequency > 96000) {
2375
0
        return TRANSPORTDEC_PARSE_ERROR;
2376
0
      }
2377
0
      self->m_aot = getAOT(bs);
2378
2379
0
      switch (self->m_aot) {
2380
0
        case AOT_AAC_LC:
2381
0
          break;
2382
0
        case AOT_ER_BSAC:
2383
0
          break;
2384
0
        default:
2385
0
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2386
0
      }
2387
2388
0
      if (self->m_aot == AOT_ER_BSAC) {
2389
0
        self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
2390
0
      }
2391
0
    } else {
2392
0
      self->m_extensionAudioObjectType = AOT_NULL_OBJECT;
2393
0
    }
2394
0
  }
2395
2396
  /* Parse whatever specific configs */
2397
0
  switch (self->m_aot) {
2398
0
    case AOT_AAC_LC:
2399
0
    case AOT_AAC_SCAL:
2400
0
    case AOT_ER_AAC_LC:
2401
0
    case AOT_ER_AAC_LD:
2402
0
    case AOT_ER_AAC_SCAL:
2403
0
    case AOT_ER_BSAC:
2404
0
      if ((ErrorStatus = GaSpecificConfig_Parse(&self->m_sc.m_gaSpecificConfig,
2405
0
                                                self, bs, ascStartAnchor)) !=
2406
0
          TRANSPORTDEC_OK) {
2407
0
        return (ErrorStatus);
2408
0
      }
2409
0
      frameLengthFlag = self->m_sc.m_gaSpecificConfig.m_frameLengthFlag;
2410
0
      break;
2411
0
    case AOT_MPEGS:
2412
0
      if (cb->cbSsc != NULL) {
2413
0
        if (cb->cbSsc(cb->cbSscData, bs, self->m_aot, self->m_samplingFrequency,
2414
0
                      self->m_samplesPerFrame, self->m_channelConfiguration, 1,
2415
0
                      -1, /* nTimeSlots: read from bitstream */
2416
0
                      0,  /* don't know the length */
2417
0
                      self->configMode, &self->SacConfigChanged)) {
2418
0
          return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2419
0
        }
2420
0
      } else {
2421
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2422
0
      }
2423
0
      break;
2424
0
    case AOT_ER_AAC_ELD:
2425
0
      if ((ErrorStatus = EldSpecificConfig_Parse(self, bs, cb)) !=
2426
0
          TRANSPORTDEC_OK) {
2427
0
        return (ErrorStatus);
2428
0
      }
2429
0
      frameLengthFlag = self->m_sc.m_eldSpecificConfig.m_frameLengthFlag;
2430
0
      self->m_sbrPresentFlag = self->m_sc.m_eldSpecificConfig.m_sbrPresentFlag;
2431
0
      self->m_extensionSamplingFrequency =
2432
0
          (self->m_sc.m_eldSpecificConfig.m_sbrSamplingRate + 1) *
2433
0
          self->m_samplingFrequency;
2434
0
      break;
2435
0
    case AOT_USAC:
2436
0
      if ((ErrorStatus = UsacConfig_Parse(self, bs, cb)) != TRANSPORTDEC_OK) {
2437
0
        return (ErrorStatus);
2438
0
      }
2439
0
      break;
2440
2441
0
    default:
2442
0
      return TRANSPORTDEC_UNSUPPORTED_FORMAT;
2443
0
  }
2444
2445
  /* Frame length */
2446
0
  switch (self->m_aot) {
2447
0
    case AOT_AAC_LC:
2448
0
    case AOT_AAC_SCAL:
2449
0
    case AOT_ER_AAC_LC:
2450
0
    case AOT_ER_AAC_SCAL:
2451
0
    case AOT_ER_BSAC:
2452
      /*case AOT_USAC:*/
2453
0
      if (!frameLengthFlag)
2454
0
        self->m_samplesPerFrame = 1024;
2455
0
      else
2456
0
        self->m_samplesPerFrame = 960;
2457
0
      break;
2458
0
    case AOT_ER_AAC_LD:
2459
0
      if (!frameLengthFlag)
2460
0
        self->m_samplesPerFrame = 512;
2461
0
      else
2462
0
        self->m_samplesPerFrame = 480;
2463
0
      break;
2464
0
    default:
2465
0
      break;
2466
0
  }
2467
2468
0
  switch (self->m_aot) {
2469
0
    case AOT_ER_AAC_LC:
2470
0
    case AOT_ER_AAC_LD:
2471
0
    case AOT_ER_AAC_ELD:
2472
0
    case AOT_ER_AAC_SCAL:
2473
0
    case AOT_ER_CELP:
2474
0
    case AOT_ER_HVXC:
2475
0
    case AOT_ER_BSAC:
2476
0
      self->m_epConfig = FDKreadBits(bs, 2);
2477
2478
0
      if (self->m_epConfig > 1) {
2479
0
        return TRANSPORTDEC_UNSUPPORTED_FORMAT;  // EPCONFIG;
2480
0
      }
2481
0
      break;
2482
0
    default:
2483
0
      break;
2484
0
  }
2485
2486
0
  if (fExplicitBackwardCompatible &&
2487
0
      (self->m_aot == AOT_AAC_LC || self->m_aot == AOT_ER_AAC_LD ||
2488
0
       self->m_aot == AOT_ER_BSAC)) {
2489
0
    ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb);
2490
0
  }
2491
2492
  /* Copy config() to asc->config[] buffer. */
2493
0
  if ((ErrorStatus == TRANSPORTDEC_OK) && (self->m_aot == AOT_USAC)) {
2494
0
    INT configSize_bits = (INT)FDKgetValidBits(bs) - (INT)ascStartAnchor;
2495
0
    if (StoreConfigAsBitstream(bs, configSize_bits, self->config,
2496
0
                               TP_USAC_MAX_CONFIG_LEN)) {
2497
0
      return TRANSPORTDEC_PARSE_ERROR;
2498
0
    }
2499
0
    self->configBits = fAbs(configSize_bits);
2500
0
  }
2501
2502
0
  return (ErrorStatus);
2503
0
}
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
}