1
2 /* -----------------------------------------------------------------------------------------------------------
3 Software License for The Fraunhofer FDK AAC Codec Library for Android
4
5 � Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
6 All rights reserved.
7
8 1. INTRODUCTION
9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
12
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
16 of the MPEG specifications.
17
18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
20 individually for the purpose of encoding or decoding bit streams in products that are compliant with
21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
23 software may already be covered under those patent licenses when it is used for those licensed purposes only.
24
25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
27 applications information and documentation.
28
29 2. COPYRIGHT LICENSE
30
31 Redistribution and use in source and binary forms, with or without modification, are permitted without
32 payment of copyright license fees provided that you satisfy the following conditions:
33
34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
35 your modifications thereto in source code form.
36
37 You must retain the complete text of this software license in the documentation and/or other materials
38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
40 modifications thereto to recipients of copies in binary form.
41
42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
43 prior written permission.
44
45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
46 software or your modifications thereto.
47
48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
49 and the date of any change. For modified versions of the FDK AAC Codec, the term
50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
52
53 3. NO PATENT LICENSE
54
55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
57 respect to this software.
58
59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
60 by appropriate patent licenses.
61
62 4. DISCLAIMER
63
64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
69 or business interruption, however caused and on any theory of liability, whether in contract, strict
70 liability, or tort (including negligence), arising in any way out of the use of this software, even if
71 advised of the possibility of such damage.
72
73 5. CONTACT INFORMATION
74
75 Fraunhofer Institute for Integrated Circuits IIS
76 Attention: Audio and Multimedia Departments - FDK AAC LL
77 Am Wolfsmantel 33
78 91058 Erlangen, Germany
79
80 www.iis.fraunhofer.de/amm
81 amm-info@iis.fraunhofer.de
82 ----------------------------------------------------------------------------------------------------------- */
83
84 /***************************** MPEG-4 AAC Decoder **************************
85
86 Author(s): Daniel Homm
87 Description:
88
89 ******************************************************************************/
90
91 #include "tpdec_lib.h"
92 #include "tp_data.h"
93 #ifdef TP_PCE_ENABLE
94 #include "FDK_crc.h"
95 #endif
96
97
CProgramConfig_Reset(CProgramConfig * pPce)98 void CProgramConfig_Reset(CProgramConfig *pPce)
99 {
100 pPce->elCounter = 0;
101 }
102
CProgramConfig_Init(CProgramConfig * pPce)103 void CProgramConfig_Init(CProgramConfig *pPce)
104 {
105 FDKmemclear(pPce, sizeof(CProgramConfig));
106 #ifdef TP_PCE_ENABLE
107 pPce->SamplingFrequencyIndex = 0xf;
108 #endif
109 }
110
CProgramConfig_IsValid(const CProgramConfig * pPce)111 int CProgramConfig_IsValid ( const CProgramConfig *pPce )
112 {
113 return ( (pPce->isValid) ? 1 : 0);
114 }
115
116 #ifdef TP_PCE_ENABLE
117 #define PCE_HEIGHT_EXT_SYNC ( 0xAC )
118
119 /*
120 * Read the extension for height info.
121 * return 0 if successfull or -1 if the CRC failed.
122 */
123 static
CProgramConfig_ReadHeightExt(CProgramConfig * pPce,HANDLE_FDK_BITSTREAM bs,int * const bytesAvailable,const UINT alignmentAnchor)124 int CProgramConfig_ReadHeightExt(
125 CProgramConfig *pPce,
126 HANDLE_FDK_BITSTREAM bs,
127 int * const bytesAvailable,
128 const UINT alignmentAnchor
129 )
130 {
131 int err = 0;
132 FDK_CRCINFO crcInfo; /* CRC state info */
133 INT crcReg;
134 FDKcrcInit(&crcInfo, 0x07, 0xFF, 8);
135 crcReg = FDKcrcStartReg(&crcInfo, bs, 0);
136 UINT startAnchor = FDKgetValidBits(bs);
137
138 FDK_ASSERT(pPce != NULL);
139 FDK_ASSERT(bs != NULL);
140 FDK_ASSERT(bytesAvailable != NULL);
141
142 if ( (startAnchor >= 24) && (*bytesAvailable >= 3)
143 && (FDKreadBits(bs,8) == PCE_HEIGHT_EXT_SYNC) )
144 {
145 int i;
146
147 for (i=0; i < pPce->NumFrontChannelElements; i++)
148 {
149 pPce->FrontElementHeightInfo[i] = (UCHAR) FDKreadBits(bs,2);
150 }
151 for (i=0; i < pPce->NumSideChannelElements; i++)
152 {
153 pPce->SideElementHeightInfo[i] = (UCHAR) FDKreadBits(bs,2);
154 }
155 for (i=0; i < pPce->NumBackChannelElements; i++)
156 {
157 pPce->BackElementHeightInfo[i] = (UCHAR) FDKreadBits(bs,2);
158 }
159 FDKbyteAlign(bs, alignmentAnchor);
160
161 FDKcrcEndReg(&crcInfo, bs, crcReg);
162 if ((USHORT)FDKreadBits(bs,8) != FDKcrcGetCRC(&crcInfo)) {
163 /* CRC failed */
164 err = -1;
165 }
166 }
167 else {
168 /* No valid extension data found -> restore the initial bitbuffer state */
169 FDKpushBack(bs, startAnchor - FDKgetValidBits(bs));
170 }
171
172 /* Always report the bytes read. */
173 *bytesAvailable -= (startAnchor - FDKgetValidBits(bs)) >> 3;
174
175 return (err);
176 }
177
CProgramConfig_Read(CProgramConfig * pPce,HANDLE_FDK_BITSTREAM bs,UINT alignmentAnchor)178 void CProgramConfig_Read(
179 CProgramConfig *pPce,
180 HANDLE_FDK_BITSTREAM bs,
181 UINT alignmentAnchor
182 )
183 {
184 int i, err = 0;
185 int commentBytes;
186
187 pPce->NumEffectiveChannels = 0;
188 pPce->NumChannels = 0;
189 pPce->ElementInstanceTag = (UCHAR) FDKreadBits(bs,4);
190 pPce->Profile = (UCHAR) FDKreadBits(bs,2);
191 pPce->SamplingFrequencyIndex = (UCHAR) FDKreadBits(bs,4);
192 pPce->NumFrontChannelElements = (UCHAR) FDKreadBits(bs,4);
193 pPce->NumSideChannelElements = (UCHAR) FDKreadBits(bs,4);
194 pPce->NumBackChannelElements = (UCHAR) FDKreadBits(bs,4);
195 pPce->NumLfeChannelElements = (UCHAR) FDKreadBits(bs,2);
196 pPce->NumAssocDataElements = (UCHAR) FDKreadBits(bs,3);
197 pPce->NumValidCcElements = (UCHAR) FDKreadBits(bs,4);
198
199 if ((pPce->MonoMixdownPresent = (UCHAR) FDKreadBits(bs,1)) != 0)
200 {
201 pPce->MonoMixdownElementNumber = (UCHAR) FDKreadBits(bs,4);
202 }
203
204 if ((pPce->StereoMixdownPresent = (UCHAR) FDKreadBits(bs,1)) != 0)
205 {
206 pPce->StereoMixdownElementNumber = (UCHAR) FDKreadBits(bs,4);
207 }
208
209 if ((pPce->MatrixMixdownIndexPresent = (UCHAR) FDKreadBits(bs,1)) != 0)
210 {
211 pPce->MatrixMixdownIndex = (UCHAR) FDKreadBits(bs,2);
212 pPce->PseudoSurroundEnable = (UCHAR) FDKreadBits(bs,1);
213 }
214
215 for (i=0; i < pPce->NumFrontChannelElements; i++)
216 {
217 pPce->FrontElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1);
218 pPce->FrontElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
219 pPce->NumChannels += pPce->FrontElementIsCpe[i] ? 2 : 1;
220 }
221
222 for (i=0; i < pPce->NumSideChannelElements; i++)
223 {
224 pPce->SideElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1);
225 pPce->SideElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
226 pPce->NumChannels += pPce->SideElementIsCpe[i] ? 2 : 1;
227 }
228
229 for (i=0; i < pPce->NumBackChannelElements; i++)
230 {
231 pPce->BackElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1);
232 pPce->BackElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
233 pPce->NumChannels += pPce->BackElementIsCpe[i] ? 2 : 1;
234 }
235
236 pPce->NumEffectiveChannels = pPce->NumChannels;
237
238 for (i=0; i < pPce->NumLfeChannelElements; i++)
239 {
240 pPce->LfeElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
241 pPce->NumChannels += 1;
242 }
243
244 for (i=0; i < pPce->NumAssocDataElements; i++)
245 {
246 pPce->AssocDataElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
247 }
248
249 for (i=0; i < pPce->NumValidCcElements; i++)
250 {
251 pPce->CcElementIsIndSw[i] = (UCHAR) FDKreadBits(bs,1);
252 pPce->ValidCcElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
253 }
254
255 FDKbyteAlign(bs, alignmentAnchor);
256
257 pPce->CommentFieldBytes = (UCHAR) FDKreadBits(bs,8);
258 commentBytes = pPce->CommentFieldBytes;
259
260 /* Search for height info extension and read it if available */
261 err = CProgramConfig_ReadHeightExt( pPce, bs, &commentBytes, alignmentAnchor );
262
263 for (i=0; i < commentBytes; i++)
264 {
265 UCHAR text;
266
267 text = (UCHAR)FDKreadBits(bs,8);
268
269 if (i < PC_COMMENTLENGTH)
270 {
271 pPce->Comment[i] = text;
272 }
273 }
274
275 pPce->isValid = (err) ? 0 : 1;
276 }
277
278 /*
279 * Compare two program configurations.
280 * Returns the result of the comparison:
281 * -1 - completely different
282 * 0 - completely equal
283 * 1 - different but same channel configuration
284 * 2 - different channel configuration but same number of channels
285 */
CProgramConfig_Compare(const CProgramConfig * const pPce1,const CProgramConfig * const pPce2)286 int CProgramConfig_Compare ( const CProgramConfig * const pPce1,
287 const CProgramConfig * const pPce2 )
288 {
289 int result = 0; /* Innocent until proven false. */
290
291 if (FDKmemcmp(pPce1, pPce2, sizeof(CProgramConfig)) != 0)
292 { /* Configurations are not completely different.
293 So look into details and analyse the channel configurations: */
294 result = -1;
295
296 if (pPce1->NumChannels == pPce2->NumChannels)
297 { /* Now the logic changes. We first assume to have the same channel configuration
298 and then prove if this assumption is true. */
299 result = 1;
300
301 /* Front channels */
302 if (pPce1->NumFrontChannelElements != pPce2->NumFrontChannelElements) {
303 result = 2; /* different number of front channel elements */
304 } else {
305 int el, numCh1 = 0, numCh2 = 0;
306 for (el = 0; el < pPce1->NumFrontChannelElements; el += 1) {
307 if (pPce1->FrontElementHeightInfo[el] != pPce2->FrontElementHeightInfo[el]) {
308 result = 2; /* different height info */
309 break;
310 }
311 numCh1 += pPce1->FrontElementIsCpe[el] ? 2 : 1;
312 numCh2 += pPce2->FrontElementIsCpe[el] ? 2 : 1;
313 }
314 if (numCh1 != numCh2) {
315 result = 2; /* different number of front channels */
316 }
317 }
318 /* Side channels */
319 if (pPce1->NumSideChannelElements != pPce2->NumSideChannelElements) {
320 result = 2; /* different number of side channel elements */
321 } else {
322 int el, numCh1 = 0, numCh2 = 0;
323 for (el = 0; el < pPce1->NumSideChannelElements; el += 1) {
324 if (pPce1->SideElementHeightInfo[el] != pPce2->SideElementHeightInfo[el]) {
325 result = 2; /* different height info */
326 break;
327 }
328 numCh1 += pPce1->SideElementIsCpe[el] ? 2 : 1;
329 numCh2 += pPce2->SideElementIsCpe[el] ? 2 : 1;
330 }
331 if (numCh1 != numCh2) {
332 result = 2; /* different number of side channels */
333 }
334 }
335 /* Back channels */
336 if (pPce1->NumBackChannelElements != pPce2->NumBackChannelElements) {
337 result = 2; /* different number of back channel elements */
338 } else {
339 int el, numCh1 = 0, numCh2 = 0;
340 for (el = 0; el < pPce1->NumBackChannelElements; el += 1) {
341 if (pPce1->BackElementHeightInfo[el] != pPce2->BackElementHeightInfo[el]) {
342 result = 2; /* different height info */
343 break;
344 }
345 numCh1 += pPce1->BackElementIsCpe[el] ? 2 : 1;
346 numCh2 += pPce2->BackElementIsCpe[el] ? 2 : 1;
347 }
348 if (numCh1 != numCh2) {
349 result = 2; /* different number of back channels */
350 }
351 }
352 /* LFE channels */
353 if (pPce1->NumLfeChannelElements != pPce2->NumLfeChannelElements) {
354 result = 2; /* different number of lfe channels */
355 }
356 /* LFEs are always SCEs so we don't need to count the channels. */
357 }
358 }
359
360 return result;
361 }
362
CProgramConfig_GetDefault(CProgramConfig * pPce,const UINT channelConfig)363 void CProgramConfig_GetDefault( CProgramConfig *pPce,
364 const UINT channelConfig )
365 {
366 FDK_ASSERT(pPce != NULL);
367
368 /* Init PCE */
369 CProgramConfig_Init(pPce);
370 pPce->Profile = 1; /* Set AAC LC because it is the only supported object type. */
371
372 switch (channelConfig) {
373 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
374 case 32: /* 7.1 side channel configuration as defined in FDK_audio.h */
375 pPce->NumFrontChannelElements = 2;
376 pPce->FrontElementIsCpe[0] = 0;
377 pPce->FrontElementIsCpe[1] = 1;
378 pPce->NumSideChannelElements = 1;
379 pPce->SideElementIsCpe[0] = 1;
380 pPce->NumBackChannelElements = 1;
381 pPce->BackElementIsCpe[0] = 1;
382 pPce->NumLfeChannelElements = 1;
383 pPce->NumChannels = 8;
384 pPce->NumEffectiveChannels = 7;
385 pPce->isValid = 1;
386 break;
387 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
388 case 12: /* 3/0/4.1ch surround back */
389 pPce->BackElementIsCpe[1] = 1;
390 pPce->NumChannels += 1;
391 pPce->NumEffectiveChannels += 1;
392 case 11: /* 3/0/3.1ch */
393 pPce->NumFrontChannelElements += 2;
394 pPce->FrontElementIsCpe[0] = 0;
395 pPce->FrontElementIsCpe[1] = 1;
396 pPce->NumBackChannelElements += 2;
397 pPce->BackElementIsCpe[0] = 1;
398 pPce->BackElementIsCpe[1] += 0;
399 pPce->NumLfeChannelElements += 1;
400 pPce->NumChannels += 7;
401 pPce->NumEffectiveChannels += 6;
402 pPce->isValid = 1;
403 break;
404 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
405 case 14: /* 2/0/0-3/0/2-0.1ch front height */
406 pPce->FrontElementHeightInfo[2] = 1; /* Top speaker */
407 case 7: /* 5/0/2.1ch front */
408 pPce->NumFrontChannelElements += 1;
409 pPce->FrontElementIsCpe[2] = 1;
410 pPce->NumChannels += 2;
411 pPce->NumEffectiveChannels += 2;
412 case 6: /* 3/0/2.1ch */
413 pPce->NumLfeChannelElements += 1;
414 pPce->NumChannels += 1;
415 case 5: /* 3/0/2.0ch */
416 case 4: /* 3/0/1.0ch */
417 pPce->NumBackChannelElements += 1;
418 pPce->BackElementIsCpe[0] = (channelConfig>4) ? 1 : 0;
419 pPce->NumChannels += (channelConfig>4) ? 2 : 1;
420 pPce->NumEffectiveChannels += (channelConfig>4) ? 2 : 1;
421 case 3: /* 3/0/0.0ch */
422 pPce->NumFrontChannelElements += 1;
423 pPce->FrontElementIsCpe[1] = 1;
424 pPce->NumChannels += 2;
425 pPce->NumEffectiveChannels += 2;
426 case 1: /* 1/0/0.0ch */
427 pPce->NumFrontChannelElements += 1;
428 pPce->FrontElementIsCpe[0] = 0;
429 pPce->NumChannels += 1;
430 pPce->NumEffectiveChannels += 1;
431 pPce->isValid = 1;
432 break;
433 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
434 case 2: /* 2/0/0.ch */
435 pPce->NumFrontChannelElements = 1;
436 pPce->FrontElementIsCpe[0] = 1;
437 pPce->NumChannels += 2;
438 pPce->NumEffectiveChannels += 2;
439 pPce->isValid = 1;
440 break;
441 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
442 default:
443 pPce->isValid = 0; /* To be explicit! */
444 break;
445 }
446
447 if (pPce->isValid) {
448 /* Create valid element instance tags */
449 int el, elTagSce = 0, elTagCpe = 0;
450
451 for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
452 pPce->FrontElementTagSelect[el] = (pPce->FrontElementIsCpe) ? elTagCpe++ : elTagSce++;
453 }
454 for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
455 pPce->SideElementTagSelect[el] = (pPce->SideElementIsCpe) ? elTagCpe++ : elTagSce++;
456 }
457 for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
458 pPce->BackElementTagSelect[el] = (pPce->BackElementIsCpe) ? elTagCpe++ : elTagSce++;
459 }
460 elTagSce = 0;
461 for (el = 0; el < pPce->NumLfeChannelElements; el += 1) {
462 pPce->LfeElementTagSelect[el] = elTagSce++;
463 }
464 }
465 }
466 #endif /* TP_PCE_ENABLE */
467
468 /**
469 * \brief get implicit audio channel type for given channelConfig and MPEG ordered channel index
470 * \param channelConfig MPEG channelConfiguration from 1 upto 14
471 * \param index MPEG channel order index
472 * \return audio channel type.
473 */
474 static
getImplicitAudioChannelTypeAndIndex(AUDIO_CHANNEL_TYPE * chType,UCHAR * chIndex,UINT channelConfig,UINT index)475 void getImplicitAudioChannelTypeAndIndex(
476 AUDIO_CHANNEL_TYPE *chType,
477 UCHAR *chIndex,
478 UINT channelConfig,
479 UINT index
480 )
481 {
482 if (index < 3) {
483 *chType = ACT_FRONT;
484 *chIndex = index;
485 } else {
486 switch (channelConfig) {
487 case 4: /* SCE, CPE, SCE */
488 case 5: /* SCE, CPE, CPE */
489 case 6: /* SCE, CPE, CPE, LFE */
490 switch (index) {
491 case 3:
492 case 4:
493 *chType = ACT_BACK;
494 *chIndex = index - 3;
495 break;
496 case 5:
497 *chType = ACT_LFE;
498 *chIndex = 0;
499 break;
500 }
501 break;
502 case 7: /* SCE,CPE,CPE,CPE,LFE */
503 switch (index) {
504 case 3:
505 case 4:
506 *chType = ACT_FRONT;
507 *chIndex = index;
508 break;
509 case 5:
510 case 6:
511 *chType = ACT_BACK;
512 *chIndex = index - 5;
513 break;
514 case 7:
515 *chType = ACT_LFE;
516 *chIndex = 0;
517 break;
518 }
519 break;
520 case 11: /* SCE,CPE,CPE,SCE,LFE */
521 if (index < 6) {
522 *chType = ACT_BACK;
523 *chIndex = index - 3;
524 } else {
525 *chType = ACT_LFE;
526 *chIndex = 0;
527 }
528 break;
529 case 12: /* SCE,CPE,CPE,CPE,LFE */
530 if (index < 7) {
531 *chType = ACT_BACK;
532 *chIndex = index - 3;
533 } else {
534 *chType = ACT_LFE;
535 *chIndex = 0;
536 }
537 break;
538 case 14: /* SCE,CPE,CPE,LFE,CPE */
539 switch (index) {
540 case 3:
541 case 4:
542 *chType = ACT_BACK;
543 *chIndex = index - 3;
544 break;
545 case 5:
546 *chType = ACT_LFE;
547 *chIndex = 0;
548 break;
549 case 6:
550 case 7:
551 *chType = ACT_FRONT_TOP;
552 *chIndex = index - 6; /* handle the top layer independently */
553 break;
554 }
555 break;
556 default:
557 *chType = ACT_NONE;
558 break;
559 }
560 }
561 }
562
CProgramConfig_LookupElement(CProgramConfig * pPce,UINT channelConfig,const UINT tag,const UINT channelIdx,UCHAR chMapping[],AUDIO_CHANNEL_TYPE chType[],UCHAR chIndex[],UCHAR * elMapping,MP4_ELEMENT_ID elList[],MP4_ELEMENT_ID elType)563 int CProgramConfig_LookupElement(
564 CProgramConfig *pPce,
565 UINT channelConfig,
566 const UINT tag,
567 const UINT channelIdx,
568 UCHAR chMapping[],
569 AUDIO_CHANNEL_TYPE chType[],
570 UCHAR chIndex[],
571 UCHAR *elMapping,
572 MP4_ELEMENT_ID elList[],
573 MP4_ELEMENT_ID elType
574 )
575 {
576 if (channelConfig > 0)
577 {
578 /* Constant channel mapping must have
579 been set during initialization. */
580 if ( elType == ID_SCE
581 || elType == ID_CPE
582 || elType == ID_LFE )
583 {
584 *elMapping = pPce->elCounter;
585 if (elList[pPce->elCounter] != elType) {
586 /* Not in the list */
587 if ( (channelConfig == 2) && (elType == ID_SCE) )
588 { /* This scenario occurs with HE-AAC v2 streams of buggy encoders.
589 Due to other decoder implementations decoding of these kind of streams is desired. */
590 channelConfig = 1;
591 } else {
592 return 0;
593 }
594 }
595 /* Assume all front channels */
596 getImplicitAudioChannelTypeAndIndex(&chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx);
597 if (elType == ID_CPE) {
598 chType[channelIdx+1] = chType[channelIdx];
599 chIndex[channelIdx+1] = chIndex[channelIdx]+1;
600 }
601 pPce->elCounter++;
602 }
603 /* Accept all non-channel elements, too. */
604 return 1;
605 }
606 else
607 {
608 #ifdef TP_PCE_ENABLE
609 if (!pPce->isValid)
610 #endif /* TP_PCE_ENABLE */
611 {
612 /* Implicit channel mapping. */
613 if ( elType == ID_SCE
614 || elType == ID_CPE
615 || elType == ID_LFE )
616 {
617 /* Store all channel element IDs */
618 elList[pPce->elCounter] = elType;
619 *elMapping = pPce->elCounter++;
620 }
621 }
622 #ifdef TP_PCE_ENABLE
623 else {
624 /* Accept the additional channel(s), only if the tag is in the lists */
625 int isCpe = 0, i;
626 /* Element counter */
627 int ec[PC_NUM_HEIGHT_LAYER] = {0};
628 /* Channel counters */
629 int cc[PC_NUM_HEIGHT_LAYER] = {0};
630 int fc[PC_NUM_HEIGHT_LAYER] = {0};
631 int sc[PC_NUM_HEIGHT_LAYER] = {0};
632 int bc[PC_NUM_HEIGHT_LAYER] = {0};
633 int lc = 0;;
634
635 /* General MPEG (PCE) composition rules:
636 - Over all:
637 <normal height channels><top height channels><bottom height channels>
638 - Within each height layer:
639 <front channels><side channels><back channels>
640 - Exception:
641 The LFE channels have no height info and thus they are arranged at the very
642 end of the normal height layer channels.
643 */
644
645 switch (elType)
646 {
647 case ID_CPE:
648 isCpe = 1;
649 case ID_SCE:
650 /* search in front channels */
651 for (i = 0; i < pPce->NumFrontChannelElements; i++) {
652 int heightLayer = pPce->FrontElementHeightInfo[i];
653 if (isCpe == pPce->FrontElementIsCpe[i] && pPce->FrontElementTagSelect[i] == tag) {
654 int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
655 AUDIO_CHANNEL_TYPE aChType = (AUDIO_CHANNEL_TYPE)((heightLayer<<4) | ACT_FRONT);
656 for (h = heightLayer-1; h >= 0; h-=1) {
657 int el;
658 /* Count front channels/elements */
659 for (el = 0; el < pPce->NumFrontChannelElements; el+=1) {
660 if (pPce->FrontElementHeightInfo[el] == h) {
661 elIdx += 1;
662 chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
663 }
664 }
665 /* Count side channels/elements */
666 for (el = 0; el < pPce->NumSideChannelElements; el+=1) {
667 if (pPce->SideElementHeightInfo[el] == h) {
668 elIdx += 1;
669 chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
670 }
671 }
672 /* Count back channels/elements */
673 for (el = 0; el < pPce->NumBackChannelElements; el+=1) {
674 if (pPce->BackElementHeightInfo[el] == h) {
675 elIdx += 1;
676 chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
677 }
678 }
679 if (h == 0) { /* normal height */
680 elIdx += pPce->NumLfeChannelElements;
681 chIdx += pPce->NumLfeChannelElements;
682 }
683 }
684 chMapping[chIdx] = channelIdx;
685 chType[chIdx] = aChType;
686 chIndex[chIdx] = fc[heightLayer];
687 if (isCpe) {
688 chMapping[chIdx+1] = channelIdx+1;
689 chType[chIdx+1] = aChType;
690 chIndex[chIdx+1] = fc[heightLayer]+1;
691 }
692 *elMapping = elIdx;
693 return 1;
694 }
695 ec[heightLayer] += 1;
696 if (pPce->FrontElementIsCpe[i]) {
697 cc[heightLayer] += 2;
698 fc[heightLayer] += 2;
699 } else {
700 cc[heightLayer] += 1;
701 fc[heightLayer] += 1;
702 }
703 }
704 /* search in side channels */
705 for (i = 0; i < pPce->NumSideChannelElements; i++) {
706 int heightLayer = pPce->SideElementHeightInfo[i];
707 if (isCpe == pPce->SideElementIsCpe[i] && pPce->SideElementTagSelect[i] == tag) {
708 int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
709 AUDIO_CHANNEL_TYPE aChType = (AUDIO_CHANNEL_TYPE)((heightLayer<<4) | ACT_SIDE);
710 for (h = heightLayer-1; h >= 0; h-=1) {
711 int el;
712 /* Count front channels/elements */
713 for (el = 0; el < pPce->NumFrontChannelElements; el+=1) {
714 if (pPce->FrontElementHeightInfo[el] == h) {
715 elIdx += 1;
716 chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
717 }
718 }
719 /* Count side channels/elements */
720 for (el = 0; el < pPce->NumSideChannelElements; el+=1) {
721 if (pPce->SideElementHeightInfo[el] == h) {
722 elIdx += 1;
723 chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
724 }
725 }
726 /* Count back channels/elements */
727 for (el = 0; el < pPce->NumBackChannelElements; el+=1) {
728 if (pPce->BackElementHeightInfo[el] == h) {
729 elIdx += 1;
730 chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
731 }
732 }
733 if (h == 0) { /* LFE channels belong to the normal height layer */
734 elIdx += pPce->NumLfeChannelElements;
735 chIdx += pPce->NumLfeChannelElements;
736 }
737 }
738 chMapping[chIdx] = channelIdx;
739 chType[chIdx] = aChType;
740 chIndex[chIdx] = sc[heightLayer];
741 if (isCpe) {
742 chMapping[chIdx+1] = channelIdx+1;
743 chType[chIdx+1] = aChType;
744 chIndex[chIdx+1] = sc[heightLayer]+1;
745 }
746 *elMapping = elIdx;
747 return 1;
748 }
749 ec[heightLayer] += 1;
750 if (pPce->SideElementIsCpe[i]) {
751 cc[heightLayer] += 2;
752 sc[heightLayer] += 2;
753 } else {
754 cc[heightLayer] += 1;
755 sc[heightLayer] += 1;
756 }
757 }
758 /* search in back channels */
759 for (i = 0; i < pPce->NumBackChannelElements; i++) {
760 int heightLayer = pPce->BackElementHeightInfo[i];
761 if (isCpe == pPce->BackElementIsCpe[i] && pPce->BackElementTagSelect[i] == tag) {
762 int h, elIdx = ec[heightLayer], chIdx = cc[heightLayer];
763 AUDIO_CHANNEL_TYPE aChType = (AUDIO_CHANNEL_TYPE)((heightLayer<<4) | ACT_BACK);
764 for (h = heightLayer-1; h >= 0; h-=1) {
765 int el;
766 /* Count front channels/elements */
767 for (el = 0; el < pPce->NumFrontChannelElements; el+=1) {
768 if (pPce->FrontElementHeightInfo[el] == h) {
769 elIdx += 1;
770 chIdx += (pPce->FrontElementIsCpe[el]) ? 2 : 1;
771 }
772 }
773 /* Count side channels/elements */
774 for (el = 0; el < pPce->NumSideChannelElements; el+=1) {
775 if (pPce->SideElementHeightInfo[el] == h) {
776 elIdx += 1;
777 chIdx += (pPce->SideElementIsCpe[el]) ? 2 : 1;
778 }
779 }
780 /* Count back channels/elements */
781 for (el = 0; el < pPce->NumBackChannelElements; el+=1) {
782 if (pPce->BackElementHeightInfo[el] == h) {
783 elIdx += 1;
784 chIdx += (pPce->BackElementIsCpe[el]) ? 2 : 1;
785 }
786 }
787 if (h == 0) { /* normal height */
788 elIdx += pPce->NumLfeChannelElements;
789 chIdx += pPce->NumLfeChannelElements;
790 }
791 }
792 chMapping[chIdx] = channelIdx;
793 chType[chIdx] = aChType;
794 chIndex[chIdx] = bc[heightLayer];
795 if (isCpe) {
796 chMapping[chIdx+1] = channelIdx+1;
797 chType[chIdx+1] = aChType;
798 chIndex[chIdx+1] = bc[heightLayer]+1;
799 }
800 *elMapping = elIdx;
801 return 1;
802 }
803 ec[heightLayer] += 1;
804 if (pPce->BackElementIsCpe[i]) {
805 cc[heightLayer] += 2;
806 bc[heightLayer] += 2;
807 } else {
808 cc[heightLayer] += 1;
809 bc[heightLayer] += 1;
810 }
811 }
812 break;
813
814 case ID_LFE:
815 { /* Unfortunately we have to go through all normal height
816 layer elements to get the position of the LFE channels.
817 Start with counting the front channels/elements at normal height */
818 for (i = 0; i < pPce->NumFrontChannelElements; i+=1) {
819 int heightLayer = pPce->FrontElementHeightInfo[i];
820 ec[heightLayer] += 1;
821 cc[heightLayer] += (pPce->FrontElementIsCpe[i]) ? 2 : 1;
822 }
823 /* Count side channels/elements at normal height */
824 for (i = 0; i < pPce->NumSideChannelElements; i+=1) {
825 int heightLayer = pPce->SideElementHeightInfo[i];
826 ec[heightLayer] += 1;
827 cc[heightLayer] += (pPce->SideElementIsCpe[i]) ? 2 : 1;
828 }
829 /* Count back channels/elements at normal height */
830 for (i = 0; i < pPce->NumBackChannelElements; i+=1) {
831 int heightLayer = pPce->BackElementHeightInfo[i];
832 ec[heightLayer] += 1;
833 cc[heightLayer] += (pPce->BackElementIsCpe[i]) ? 2 : 1;
834 }
835
836 /* search in lfe channels */
837 for (i = 0; i < pPce->NumLfeChannelElements; i++) {
838 int elIdx = ec[0]; /* LFE channels belong to the normal height layer */
839 int chIdx = cc[0];
840 if ( pPce->LfeElementTagSelect[i] == tag ) {
841 chMapping[chIdx] = channelIdx;
842 *elMapping = elIdx;
843 chType[chIdx] = ACT_LFE;
844 chIndex[chIdx] = lc;
845 return 1;
846 }
847 ec[0] += 1;
848 cc[0] += 1;
849 lc += 1;
850 }
851 } break;
852
853 /* Non audio elements */
854 case ID_CCE:
855 /* search in cce channels */
856 for (i = 0; i < pPce->NumValidCcElements; i++) {
857 if (pPce->ValidCcElementTagSelect[i] == tag) {
858 return 1;
859 }
860 }
861 break;
862 case ID_DSE:
863 /* search associated data elements */
864 for (i = 0; i < pPce->NumAssocDataElements; i++) {
865 if (pPce->AssocDataElementTagSelect[i] == tag) {
866 return 1;
867 }
868 }
869 break;
870 default:
871 return 0;
872 }
873 return 0; /* not found in any list */
874 }
875 #endif /* TP_PCE_ENABLE */
876 }
877
878 return 1;
879 }
880
881 #ifdef TP_PCE_ENABLE
CProgramConfig_GetElementTable(const CProgramConfig * pPce,MP4_ELEMENT_ID elList[],const INT elListSize,UCHAR * pChMapIdx)882 int CProgramConfig_GetElementTable(
883 const CProgramConfig *pPce,
884 MP4_ELEMENT_ID elList[],
885 const INT elListSize,
886 UCHAR *pChMapIdx
887 )
888 {
889 int i, el = 0;
890
891 FDK_ASSERT(elList != NULL);
892 FDK_ASSERT(pChMapIdx != NULL);
893
894 *pChMapIdx = 0;
895
896 if ( elListSize
897 < pPce->NumFrontChannelElements + pPce->NumSideChannelElements + pPce->NumBackChannelElements + pPce->NumLfeChannelElements
898 )
899 {
900 return 0;
901 }
902
903 for (i=0; i < pPce->NumFrontChannelElements; i++)
904 {
905 elList[el++] = (pPce->FrontElementIsCpe[i]) ? ID_CPE : ID_SCE;
906 }
907
908 for (i=0; i < pPce->NumSideChannelElements; i++)
909 {
910 elList[el++] = (pPce->SideElementIsCpe[i]) ? ID_CPE : ID_SCE;
911 }
912
913 for (i=0; i < pPce->NumBackChannelElements; i++)
914 {
915 elList[el++] = (pPce->BackElementIsCpe[i]) ? ID_CPE : ID_SCE;
916 }
917
918 for (i=0; i < pPce->NumLfeChannelElements; i++)
919 {
920 elList[el++] = ID_LFE;
921 }
922
923
924 /* Find an corresponding channel configuration if possible */
925 switch (pPce->NumChannels) {
926 case 1: case 2: case 3: case 4: case 5: case 6:
927 /* One and two channels have no alternatives. The other ones are mapped directly to the
928 corresponding channel config. Because of legacy reasons or for lack of alternative mappings. */
929 *pChMapIdx = pPce->NumChannels;
930 break;
931 case 7:
932 {
933 C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
934 /* Create a PCE for the config to test ... */
935 CProgramConfig_GetDefault(tmpPce, 11);
936 /* ... and compare it with the given one. */
937 *pChMapIdx = (!(CProgramConfig_Compare(pPce, tmpPce)&0xE)) ? 11 : 0;
938 /* If compare result is 0 or 1 we can be sure that it is channel config 11. */
939 C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
940 }
941 break;
942 case 8:
943 { /* Try the four possible 7.1ch configurations. One after the other. */
944 UCHAR testCfg[4] = { 32, 14, 12, 7};
945 C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
946 for (i=0; i<4; i+=1) {
947 /* Create a PCE for the config to test ... */
948 CProgramConfig_GetDefault(tmpPce, testCfg[i]);
949 /* ... and compare it with the given one. */
950 if (!(CProgramConfig_Compare(pPce, tmpPce)&0xE)) {
951 /* If the compare result is 0 or 1 than the two channel configurations match. */
952 /* Explicit mapping of 7.1 side channel configuration to 7.1 rear channel mapping. */
953 *pChMapIdx = (testCfg[i]==32) ? 12 : testCfg[i];
954 }
955 }
956 C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
957 }
958 break;
959 default:
960 /* The PCE does not match any predefined channel configuration. */
961 *pChMapIdx = 0;
962 break;
963 }
964
965 return el;
966 }
967 #endif
968
getAOT(HANDLE_FDK_BITSTREAM bs)969 static AUDIO_OBJECT_TYPE getAOT(HANDLE_FDK_BITSTREAM bs)
970 {
971 int tmp = 0;
972
973 tmp = FDKreadBits(bs,5);
974 if (tmp == AOT_ESCAPE) {
975 int tmp2 = FDKreadBits(bs,6);
976 tmp = 32 + tmp2;
977 }
978
979 return (AUDIO_OBJECT_TYPE)tmp;
980 }
981
getSampleRate(HANDLE_FDK_BITSTREAM bs,UCHAR * index,int nBits)982 static INT getSampleRate(HANDLE_FDK_BITSTREAM bs, UCHAR *index, int nBits)
983 {
984 INT sampleRate;
985 int idx;
986
987 idx = FDKreadBits(bs, nBits);
988 if( idx == (1<<nBits)-1 ) {
989 if(FDKgetValidBits(bs) < 24) {
990 return 0;
991 }
992 sampleRate = FDKreadBits(bs,24);
993 } else {
994 sampleRate = SamplingRateTable[idx];
995 }
996
997 *index = idx;
998
999 return sampleRate;
1000 }
1001
1002 #ifdef TP_GA_ENABLE
1003 static
GaSpecificConfig_Parse(CSGaSpecificConfig * self,CSAudioSpecificConfig * asc,HANDLE_FDK_BITSTREAM bs,UINT ascStartAnchor)1004 TRANSPORTDEC_ERROR GaSpecificConfig_Parse( CSGaSpecificConfig *self,
1005 CSAudioSpecificConfig *asc,
1006 HANDLE_FDK_BITSTREAM bs,
1007 UINT ascStartAnchor )
1008 {
1009 TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1010
1011 self->m_frameLengthFlag = FDKreadBits(bs,1);
1012
1013 self->m_dependsOnCoreCoder = FDKreadBits(bs,1);
1014
1015 if( self->m_dependsOnCoreCoder )
1016 self->m_coreCoderDelay = FDKreadBits(bs,14);
1017
1018 self->m_extensionFlag = FDKreadBits(bs,1);
1019
1020 if( asc->m_channelConfiguration == 0 ) {
1021 CProgramConfig_Read(&asc->m_progrConfigElement, bs, ascStartAnchor);
1022 }
1023
1024 if ((asc->m_aot == AOT_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_SCAL)) {
1025 self->m_layer = FDKreadBits(bs,3);
1026 }
1027
1028 if (self->m_extensionFlag) {
1029 if (asc->m_aot == AOT_ER_BSAC) {
1030 self->m_numOfSubFrame = FDKreadBits(bs,5);
1031 self->m_layerLength = FDKreadBits(bs,11);
1032 }
1033
1034 if ((asc->m_aot == AOT_ER_AAC_LC) || (asc->m_aot == AOT_ER_AAC_LTP) ||
1035 (asc->m_aot == AOT_ER_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_LD))
1036 {
1037 asc->m_vcb11Flag = FDKreadBits(bs,1); /* aacSectionDataResilienceFlag */
1038 asc->m_rvlcFlag = FDKreadBits(bs,1); /* aacScalefactorDataResilienceFlag */
1039 asc->m_hcrFlag = FDKreadBits(bs,1); /* aacSpectralDataResilienceFlag */
1040 }
1041
1042 self->m_extensionFlag3 = FDKreadBits(bs,1);
1043
1044 }
1045 return (ErrorStatus);
1046 }
1047 #endif /* TP_GA_ENABLE */
1048
1049
1050
1051
1052
1053 #ifdef TP_ELD_ENABLE
1054
ld_sbr_header(const CSAudioSpecificConfig * asc,HANDLE_FDK_BITSTREAM hBs,CSTpCallBacks * cb)1055 static INT ld_sbr_header( const CSAudioSpecificConfig *asc,
1056 HANDLE_FDK_BITSTREAM hBs,
1057 CSTpCallBacks *cb )
1058 {
1059 const int channelConfiguration = asc->m_channelConfiguration;
1060 int i = 0;
1061 INT error = 0;
1062
1063 if (channelConfiguration == 2) {
1064 error = cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
1065 } else {
1066 error = cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++);
1067 }
1068
1069 switch ( channelConfiguration ) {
1070 case 14:
1071 case 12:
1072 case 7:
1073 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
1074 case 6:
1075 case 5:
1076 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
1077 case 3:
1078 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
1079 break;
1080
1081 case 11:
1082 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
1083 case 4:
1084 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
1085 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++);
1086 break;
1087 }
1088
1089 return error;
1090 }
1091
1092 static
EldSpecificConfig_Parse(CSAudioSpecificConfig * asc,HANDLE_FDK_BITSTREAM hBs,CSTpCallBacks * cb)1093 TRANSPORTDEC_ERROR EldSpecificConfig_Parse(
1094 CSAudioSpecificConfig *asc,
1095 HANDLE_FDK_BITSTREAM hBs,
1096 CSTpCallBacks *cb
1097 )
1098 {
1099 TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1100 CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig;
1101 ASC_ELD_EXT_TYPE eldExtType;
1102 int eldExtLen, len, cnt;
1103
1104 FDKmemclear(esc, sizeof(CSEldSpecificConfig));
1105
1106 esc->m_frameLengthFlag = FDKreadBits(hBs, 1 );
1107 if (esc->m_frameLengthFlag) {
1108 asc->m_samplesPerFrame = 480;
1109 } else {
1110 asc->m_samplesPerFrame = 512;
1111 }
1112
1113 asc->m_vcb11Flag = FDKreadBits(hBs, 1 );
1114 asc->m_rvlcFlag = FDKreadBits(hBs, 1 );
1115 asc->m_hcrFlag = FDKreadBits(hBs, 1 );
1116
1117 esc->m_sbrPresentFlag = FDKreadBits(hBs, 1 );
1118
1119 if (esc->m_sbrPresentFlag == 1) {
1120 esc->m_sbrSamplingRate = FDKreadBits(hBs, 1 ); /* 0: single rate, 1: dual rate */
1121 esc->m_sbrCrcFlag = FDKreadBits(hBs, 1 );
1122
1123 asc->m_extensionSamplingFrequency = asc->m_samplingFrequency << esc->m_sbrSamplingRate;
1124
1125 if (cb->cbSbr != NULL){
1126 if ( 0 != ld_sbr_header(asc, hBs, cb) ) {
1127 return TRANSPORTDEC_PARSE_ERROR;
1128 }
1129 }
1130 }
1131 esc->m_useLdQmfTimeAlign = 0;
1132
1133 /* new ELD syntax */
1134 /* parse ExtTypeConfigData */
1135 while ((eldExtType = (ASC_ELD_EXT_TYPE)FDKreadBits(hBs, 4 )) != ELDEXT_TERM) {
1136 eldExtLen = len = FDKreadBits(hBs, 4 );
1137 if ( len == 0xf ) {
1138 len = FDKreadBits(hBs, 8 );
1139 eldExtLen += len;
1140
1141 if ( len == 0xff ) {
1142 len = FDKreadBits(hBs, 16 );
1143 eldExtLen += len;
1144 }
1145 }
1146
1147 switch (eldExtType) {
1148 default:
1149 for(cnt=0; cnt<len; cnt++) {
1150 FDKreadBits(hBs, 8 );
1151 }
1152 break;
1153 /* add future eld extension configs here */
1154 }
1155 }
1156 bail:
1157 return (ErrorStatus);
1158 }
1159 #endif /* TP_ELD_ENABLE */
1160
1161
1162 static
AudioSpecificConfig_ExtensionParse(CSAudioSpecificConfig * self,HANDLE_FDK_BITSTREAM bs,CSTpCallBacks * cb)1163 TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse(CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, CSTpCallBacks *cb)
1164 {
1165 TP_ASC_EXTENSION_ID lastAscExt, ascExtId = ASCEXT_UNKOWN;
1166 INT bitsAvailable = (INT)FDKgetValidBits(bs);
1167
1168 while (bitsAvailable >= 11)
1169 {
1170 lastAscExt = ascExtId;
1171 ascExtId = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11);
1172 bitsAvailable -= 11;
1173
1174 switch (ascExtId) {
1175 case ASCEXT_SBR: /* 0x2b7 */
1176 if ( (self->m_extensionAudioObjectType != AOT_SBR) && (bitsAvailable >= 5) ) {
1177 self->m_extensionAudioObjectType = getAOT(bs);
1178
1179 if ( (self->m_extensionAudioObjectType == AOT_SBR)
1180 || (self->m_extensionAudioObjectType == AOT_ER_BSAC) )
1181 { /* Get SBR extension configuration */
1182 self->m_sbrPresentFlag = FDKreadBits(bs, 1);
1183 bitsAvailable -= 1;
1184
1185 if ( self->m_sbrPresentFlag == 1 ) {
1186 self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
1187
1188 if ((INT)self->m_extensionSamplingFrequency <= 0) {
1189 return TRANSPORTDEC_PARSE_ERROR;
1190 }
1191 }
1192 if ( self->m_extensionAudioObjectType == AOT_ER_BSAC ) {
1193 self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
1194 bitsAvailable -= 4;
1195 }
1196 }
1197 /* Update counter because of variable length fields (AOT and sampling rate) */
1198 bitsAvailable = (INT)FDKgetValidBits(bs);
1199 }
1200 break;
1201 case ASCEXT_PS: /* 0x548 */
1202 if ( (lastAscExt == ASCEXT_SBR)
1203 && (self->m_extensionAudioObjectType == AOT_SBR)
1204 && (bitsAvailable > 0) )
1205 { /* Get PS extension configuration */
1206 self->m_psPresentFlag = FDKreadBits(bs, 1);
1207 bitsAvailable -= 1;
1208 }
1209 break;
1210 default:
1211 /* Just ignore anything. */
1212 return TRANSPORTDEC_OK;
1213 }
1214 }
1215
1216 return TRANSPORTDEC_OK;
1217 }
1218
1219 /*
1220 * API Functions
1221 */
1222
AudioSpecificConfig_Init(CSAudioSpecificConfig * asc)1223 void AudioSpecificConfig_Init(CSAudioSpecificConfig *asc)
1224 {
1225 FDKmemclear(asc, sizeof(CSAudioSpecificConfig));
1226
1227 /* Init all values that should not be zero. */
1228 asc->m_aot = AOT_NONE;
1229 asc->m_samplingFrequencyIndex = 0xf;
1230 asc->m_epConfig = -1;
1231 asc->m_extensionAudioObjectType = AOT_NULL_OBJECT;
1232 #ifdef TP_PCE_ENABLE
1233 CProgramConfig_Init(&asc->m_progrConfigElement);
1234 #endif
1235 }
1236
AudioSpecificConfig_Parse(CSAudioSpecificConfig * self,HANDLE_FDK_BITSTREAM bs,int fExplicitBackwardCompatible,CSTpCallBacks * cb)1237 TRANSPORTDEC_ERROR AudioSpecificConfig_Parse(
1238 CSAudioSpecificConfig *self,
1239 HANDLE_FDK_BITSTREAM bs,
1240 int fExplicitBackwardCompatible,
1241 CSTpCallBacks *cb
1242 )
1243 {
1244 TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
1245 UINT ascStartAnchor = FDKgetValidBits(bs);
1246 int frameLengthFlag = -1;
1247
1248 AudioSpecificConfig_Init(self);
1249
1250 self->m_aot = getAOT(bs);
1251 self->m_samplingFrequency = getSampleRate(bs, &self->m_samplingFrequencyIndex, 4);
1252 if (self->m_samplingFrequency <= 0) {
1253 return TRANSPORTDEC_PARSE_ERROR;
1254 }
1255
1256 self->m_channelConfiguration = FDKreadBits(bs,4);
1257
1258 /* SBR extension ( explicit non-backwards compatible mode ) */
1259 self->m_sbrPresentFlag = 0;
1260 self->m_psPresentFlag = 0;
1261
1262 if ( self->m_aot == AOT_SBR || self->m_aot == AOT_PS ) {
1263 self->m_extensionAudioObjectType = AOT_SBR;
1264
1265 self->m_sbrPresentFlag = 1;
1266 if ( self->m_aot == AOT_PS ) {
1267 self->m_psPresentFlag = 1;
1268 }
1269
1270 self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
1271 self->m_aot = getAOT(bs);
1272
1273 } else {
1274 self->m_extensionAudioObjectType = AOT_NULL_OBJECT;
1275 }
1276
1277 /* Parse whatever specific configs */
1278 switch (self->m_aot)
1279 {
1280 #ifdef TP_GA_ENABLE
1281 case AOT_AAC_LC:
1282 case AOT_ER_AAC_LC:
1283 case AOT_ER_AAC_LD:
1284 case AOT_ER_AAC_SCAL:
1285 case AOT_ER_BSAC:
1286 if ((ErrorStatus = GaSpecificConfig_Parse(&self->m_sc.m_gaSpecificConfig, self, bs, ascStartAnchor)) != TRANSPORTDEC_OK ) {
1287 return (ErrorStatus);
1288 }
1289 frameLengthFlag = self->m_sc.m_gaSpecificConfig.m_frameLengthFlag;
1290 break;
1291 #endif /* TP_GA_ENABLE */
1292 case AOT_MPEGS:
1293 if (cb->cbSsc != NULL) {
1294 cb->cbSsc(
1295 cb->cbSscData,
1296 bs,
1297 self->m_aot,
1298 self->m_samplingFrequency,
1299 1,
1300 0 /* don't know the length */
1301 );
1302 } else {
1303 return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1304 }
1305 break;
1306 #ifdef TP_ELD_ENABLE
1307 case AOT_ER_AAC_ELD:
1308 if ((ErrorStatus = EldSpecificConfig_Parse(self, bs, cb)) != TRANSPORTDEC_OK ) {
1309 return (ErrorStatus);
1310 }
1311 frameLengthFlag = self->m_sc.m_eldSpecificConfig.m_frameLengthFlag;
1312 self->m_sbrPresentFlag = self->m_sc.m_eldSpecificConfig.m_sbrPresentFlag;
1313 self->m_extensionSamplingFrequency = (self->m_sc.m_eldSpecificConfig.m_sbrSamplingRate+1) * self->m_samplingFrequency;
1314 break;
1315 #endif /* TP_ELD_ENABLE */
1316
1317 default:
1318 return TRANSPORTDEC_UNSUPPORTED_FORMAT;
1319 break;
1320 }
1321
1322 /* Frame length */
1323 switch (self->m_aot)
1324 {
1325 #if defined(TP_GA_ENABLE) || defined(TP_USAC_ENABLE)
1326 case AOT_AAC_LC:
1327 case AOT_ER_AAC_LC:
1328 case AOT_ER_AAC_SCAL:
1329 case AOT_ER_BSAC:
1330 /*case AOT_USAC:*/
1331 if (!frameLengthFlag)
1332 self->m_samplesPerFrame = 1024;
1333 else
1334 self->m_samplesPerFrame = 960;
1335 break;
1336 #endif /* TP_GA_ENABLE */
1337 #if defined(TP_GA_ENABLE)
1338 case AOT_ER_AAC_LD:
1339 if (!frameLengthFlag)
1340 self->m_samplesPerFrame = 512;
1341 else
1342 self->m_samplesPerFrame = 480;
1343 break;
1344 #endif /* defined(TP_GA_ENABLE) */
1345 default:
1346 break;
1347 }
1348
1349 switch (self->m_aot)
1350 {
1351 case AOT_ER_AAC_LC:
1352 case AOT_ER_AAC_LD:
1353 case AOT_ER_AAC_ELD:
1354 case AOT_ER_AAC_SCAL:
1355 case AOT_ER_CELP:
1356 case AOT_ER_HVXC:
1357 case AOT_ER_BSAC:
1358 self->m_epConfig = FDKreadBits(bs,2);
1359
1360 if (self->m_epConfig > 1) {
1361 return TRANSPORTDEC_UNSUPPORTED_FORMAT; // EPCONFIG;
1362 }
1363 break;
1364 default:
1365 break;
1366 }
1367
1368 if (fExplicitBackwardCompatible) {
1369 ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb);
1370 }
1371
1372 return (ErrorStatus);
1373 }
1374
1375
1376