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