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): Manuel Jander
87 Description:
88
89 ******************************************************************************/
90
91 #include "aacdecoder_lib.h"
92
93 #include "aac_ram.h"
94 #include "aacdecoder.h"
95 #include "tpdec_lib.h"
96 #include "FDK_core.h" /* FDK_tools version info */
97
98
99 #include "sbrdecoder.h"
100
101
102
103
104 #include "conceal.h"
105
106 #include "aacdec_drc.h"
107
108
109
110 /* Decoder library info */
111 #define AACDECODER_LIB_VL0 2
112 #define AACDECODER_LIB_VL1 5
113 #define AACDECODER_LIB_VL2 10
114 #define AACDECODER_LIB_TITLE "AAC Decoder Lib"
115 #ifdef __ANDROID__
116 #define AACDECODER_LIB_BUILD_DATE ""
117 #define AACDECODER_LIB_BUILD_TIME ""
118 #else
119 #define AACDECODER_LIB_BUILD_DATE __DATE__
120 #define AACDECODER_LIB_BUILD_TIME __TIME__
121 #endif
122
123 static AAC_DECODER_ERROR
124 setConcealMethod ( const HANDLE_AACDECODER self,
125 const INT method );
126
127
aacDecoder_GetFreeBytes(const HANDLE_AACDECODER self,UINT * pFreeBytes)128 LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_GetFreeBytes ( const HANDLE_AACDECODER self, UINT *pFreeBytes){
129
130 /* reset free bytes */
131 *pFreeBytes = 0;
132
133 /* check handle */
134 if(!self)
135 return AAC_DEC_INVALID_HANDLE;
136
137 /* return nr of free bytes */
138 HANDLE_FDK_BITSTREAM hBs = transportDec_GetBitstream(self->hInput, 0);
139 *pFreeBytes = FDKgetFreeBits(hBs) >> 3;
140
141 /* success */
142 return AAC_DEC_OK;
143 }
144
145 /**
146 * Config Decoder using a CSAudioSpecificConfig struct.
147 */
148 static
aacDecoder_Config(HANDLE_AACDECODER self,const CSAudioSpecificConfig * pAscStruct)149 LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Config(HANDLE_AACDECODER self, const CSAudioSpecificConfig *pAscStruct)
150 {
151 AAC_DECODER_ERROR err;
152
153 /* Initialize AAC core decoder, and update self->streaminfo */
154 err = CAacDecoder_Init(self, pAscStruct);
155
156 return err;
157 }
158
aacDecoder_ConfigRaw(HANDLE_AACDECODER self,UCHAR * conf[],const UINT length[])159 LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_ConfigRaw (
160 HANDLE_AACDECODER self,
161 UCHAR *conf[],
162 const UINT length[] )
163 {
164 AAC_DECODER_ERROR err = AAC_DEC_OK;
165 TRANSPORTDEC_ERROR errTp;
166 UINT layer, nrOfLayers = self->nrOfLayers;
167
168 for(layer = 0; layer < nrOfLayers; layer++){
169 if(length[layer] > 0){
170 errTp = transportDec_OutOfBandConfig(self->hInput, conf[layer], length[layer], layer);
171 if (errTp != TRANSPORTDEC_OK) {
172 switch (errTp) {
173 case TRANSPORTDEC_NEED_TO_RESTART:
174 err = AAC_DEC_NEED_TO_RESTART;
175 break;
176 case TRANSPORTDEC_UNSUPPORTED_FORMAT:
177 err = AAC_DEC_UNSUPPORTED_FORMAT;
178 break;
179 default:
180 err = AAC_DEC_UNKNOWN;
181 break;
182 }
183 /* if baselayer is OK we continue decoding */
184 if(layer >= 1){
185 self->nrOfLayers = layer;
186 }
187 break;
188 }
189 }
190 }
191
192 return err;
193 }
194
195
196
aacDecoder_ConfigCallback(void * handle,const CSAudioSpecificConfig * pAscStruct)197 static INT aacDecoder_ConfigCallback(void *handle, const CSAudioSpecificConfig *pAscStruct)
198 {
199 HANDLE_AACDECODER self = (HANDLE_AACDECODER)handle;
200 AAC_DECODER_ERROR err = AAC_DEC_OK;
201 TRANSPORTDEC_ERROR errTp;
202
203 {
204 {
205 err = aacDecoder_Config(self, pAscStruct);
206 }
207 }
208 if (err == AAC_DEC_OK) {
209 if ( self->flags & (AC_USAC|AC_RSVD50|AC_LD|AC_ELD)
210 && CConcealment_GetDelay(&self->concealCommonData) > 0 )
211 {
212 /* Revert to error concealment method Noise Substitution.
213 Because interpolation is not implemented for USAC/RSVD50 or
214 the additional delay is unwanted for low delay codecs. */
215 setConcealMethod(self, 1);
216 #ifdef DEBUG
217 FDKprintf(" Concealment method was reverted to 1 !\n");
218 #endif
219 }
220 errTp = TRANSPORTDEC_OK;
221 } else {
222 if (IS_INIT_ERROR(err)) {
223 errTp = TRANSPORTDEC_UNSUPPORTED_FORMAT;
224 } /* Fatal errors */
225 else if (err == AAC_DEC_NEED_TO_RESTART) {
226 errTp = TRANSPORTDEC_NEED_TO_RESTART;
227 } else {
228 errTp = TRANSPORTDEC_UNKOWN_ERROR;
229 }
230 }
231
232 return errTp;
233 }
234
235
236
237 LINKSPEC_CPP AAC_DECODER_ERROR
aacDecoder_AncDataInit(HANDLE_AACDECODER self,UCHAR * buffer,int size)238 aacDecoder_AncDataInit ( HANDLE_AACDECODER self,
239 UCHAR *buffer,
240 int size )
241 {
242 CAncData *ancData = &self->ancData;
243
244 return CAacDecoder_AncDataInit(ancData, buffer, size);
245 }
246
247
248 LINKSPEC_CPP AAC_DECODER_ERROR
aacDecoder_AncDataGet(HANDLE_AACDECODER self,int index,UCHAR ** ptr,int * size)249 aacDecoder_AncDataGet ( HANDLE_AACDECODER self,
250 int index,
251 UCHAR **ptr,
252 int *size )
253 {
254 CAncData *ancData = &self->ancData;
255
256 return CAacDecoder_AncDataGet(ancData, index, ptr, size);
257 }
258
259
260 static AAC_DECODER_ERROR
setConcealMethod(const HANDLE_AACDECODER self,const INT method)261 setConcealMethod ( const HANDLE_AACDECODER self, /*!< Handle of the decoder instance */
262 const INT method )
263 {
264 AAC_DECODER_ERROR errorStatus = AAC_DEC_OK;
265 CConcealParams *pConcealData = NULL;
266 HANDLE_SBRDECODER hSbrDec = NULL;
267 HANDLE_AAC_DRC hDrcInfo = NULL;
268 HANDLE_PCM_DOWNMIX hPcmDmx = NULL;
269 CConcealmentMethod backupMethod = ConcealMethodNone;
270 int backupDelay = 0;
271 int bsDelay = 0;
272
273 /* check decoder handle */
274 if (self != NULL) {
275 pConcealData = &self->concealCommonData;
276 hSbrDec = self->hSbrDecoder;
277 hDrcInfo = self->hDrcInfo;
278 hPcmDmx = self->hPcmUtils;
279 }
280
281
282 /* Get current method/delay */
283 backupMethod = CConcealment_GetMethod(pConcealData);
284 backupDelay = CConcealment_GetDelay(pConcealData);
285
286 /* Be sure to set AAC and SBR concealment method simultaneously! */
287 errorStatus =
288 CConcealment_SetParams(
289 pConcealData,
290 (int)method, // concealMethod
291 AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealFadeOutSlope
292 AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealFadeInSlope
293 AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealMuteRelease
294 AACDEC_CONCEAL_PARAM_NOT_SPECIFIED // concealComfNoiseLevel
295 );
296 if ( (errorStatus != AAC_DEC_OK)
297 && (errorStatus != AAC_DEC_INVALID_HANDLE) ) {
298 goto bail;
299 }
300
301 /* Get new delay */
302 bsDelay = CConcealment_GetDelay(pConcealData);
303
304 {
305 SBR_ERROR sbrErr = SBRDEC_OK;
306
307 /* set SBR bitstream delay */
308 sbrErr = sbrDecoder_SetParam (
309 hSbrDec,
310 SBR_SYSTEM_BITSTREAM_DELAY,
311 bsDelay
312 );
313
314 switch (sbrErr) {
315 case SBRDEC_OK:
316 case SBRDEC_NOT_INITIALIZED:
317 if (self != NULL) {
318 /* save the param value and set later
319 (when SBR has been initialized) */
320 self->sbrParams.bsDelay = bsDelay;
321 }
322 break;
323 default:
324 errorStatus = AAC_DEC_SET_PARAM_FAIL;
325 goto bail;
326 }
327 }
328
329 errorStatus =
330 aacDecoder_drcSetParam (
331 hDrcInfo,
332 DRC_BS_DELAY,
333 bsDelay
334 );
335 if ( (errorStatus != AAC_DEC_OK)
336 && (errorStatus != AAC_DEC_INVALID_HANDLE) ) {
337 goto bail;
338 }
339
340 if (errorStatus == AAC_DEC_OK) {
341 PCMDMX_ERROR err =
342 pcmDmx_SetParam (
343 hPcmDmx,
344 DMX_BS_DATA_DELAY,
345 bsDelay
346 );
347 switch (err) {
348 case PCMDMX_INVALID_HANDLE:
349 errorStatus = AAC_DEC_INVALID_HANDLE;
350 case PCMDMX_OK:
351 break;
352 default:
353 errorStatus = AAC_DEC_SET_PARAM_FAIL;
354 goto bail;
355 }
356 }
357
358
359 bail:
360 if ( (errorStatus != AAC_DEC_OK)
361 && (errorStatus != AAC_DEC_INVALID_HANDLE) )
362 {
363 /* Revert to the initial state */
364 CConcealment_SetParams (
365 pConcealData,
366 (int)backupMethod,
367 AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,
368 AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,
369 AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,
370 AACDEC_CONCEAL_PARAM_NOT_SPECIFIED
371 );
372 /* Revert SBR bitstream delay */
373 sbrDecoder_SetParam (
374 hSbrDec,
375 SBR_SYSTEM_BITSTREAM_DELAY,
376 backupDelay
377 );
378 /* Revert DRC bitstream delay */
379 aacDecoder_drcSetParam (
380 hDrcInfo,
381 DRC_BS_DELAY,
382 backupDelay
383 );
384 /* Revert PCM mixdown bitstream delay */
385 pcmDmx_SetParam (
386 hPcmDmx,
387 DMX_BS_DATA_DELAY,
388 backupDelay
389 );
390 }
391
392 return errorStatus;
393 }
394
395
396 LINKSPEC_CPP AAC_DECODER_ERROR
aacDecoder_SetParam(const HANDLE_AACDECODER self,const AACDEC_PARAM param,const INT value)397 aacDecoder_SetParam ( const HANDLE_AACDECODER self, /*!< Handle of the decoder instance */
398 const AACDEC_PARAM param, /*!< Parameter to set */
399 const INT value) /*!< Parameter valued */
400 {
401 AAC_DECODER_ERROR errorStatus = AAC_DEC_OK;
402 CConcealParams *pConcealData = NULL;
403 HANDLE_AAC_DRC hDrcInfo = NULL;
404 HANDLE_PCM_DOWNMIX hPcmDmx = NULL;
405 TDLimiterPtr hPcmTdl = NULL;
406
407 /* check decoder handle */
408 if (self != NULL) {
409 pConcealData = &self->concealCommonData;
410 hDrcInfo = self->hDrcInfo;
411 hPcmDmx = self->hPcmUtils;
412 hPcmTdl = self->hLimiter;
413 } else {
414 errorStatus = AAC_DEC_INVALID_HANDLE;
415 }
416
417 /* configure the subsystems */
418 switch (param)
419 {
420 case AAC_PCM_OUTPUT_INTERLEAVED:
421 if (value < 0 || value > 1) {
422 return AAC_DEC_SET_PARAM_FAIL;
423 }
424 if (self == NULL) {
425 return AAC_DEC_INVALID_HANDLE;
426 }
427 self->outputInterleaved = value;
428 break;
429
430 case AAC_PCM_MIN_OUTPUT_CHANNELS:
431 if (value < -1 || value > (8)) {
432 return AAC_DEC_SET_PARAM_FAIL;
433 }
434 {
435 PCMDMX_ERROR err;
436
437 err = pcmDmx_SetParam (
438 hPcmDmx,
439 MIN_NUMBER_OF_OUTPUT_CHANNELS,
440 value );
441
442 switch (err) {
443 case PCMDMX_OK:
444 break;
445 case PCMDMX_INVALID_HANDLE:
446 return AAC_DEC_INVALID_HANDLE;
447 default:
448 return AAC_DEC_SET_PARAM_FAIL;
449 }
450 }
451 break;
452
453 case AAC_PCM_MAX_OUTPUT_CHANNELS:
454 if (value < -1 || value > (8)) {
455 return AAC_DEC_SET_PARAM_FAIL;
456 }
457 {
458 PCMDMX_ERROR err;
459
460 err = pcmDmx_SetParam (
461 hPcmDmx,
462 MAX_NUMBER_OF_OUTPUT_CHANNELS,
463 value );
464
465 switch (err) {
466 case PCMDMX_OK:
467 break;
468 case PCMDMX_INVALID_HANDLE:
469 return AAC_DEC_INVALID_HANDLE;
470 default:
471 return AAC_DEC_SET_PARAM_FAIL;
472 }
473 }
474 break;
475
476 case AAC_PCM_DUAL_CHANNEL_OUTPUT_MODE:
477 {
478 PCMDMX_ERROR err;
479
480 err = pcmDmx_SetParam (
481 hPcmDmx,
482 DMX_DUAL_CHANNEL_MODE,
483 value );
484
485 switch (err) {
486 case PCMDMX_OK:
487 break;
488 case PCMDMX_INVALID_HANDLE:
489 return AAC_DEC_INVALID_HANDLE;
490 default:
491 return AAC_DEC_SET_PARAM_FAIL;
492 }
493 }
494 break;
495
496
497 case AAC_PCM_LIMITER_ENABLE:
498 if (value < -1 || value > 1) {
499 return AAC_DEC_SET_PARAM_FAIL;
500 }
501 if (self == NULL) {
502 return AAC_DEC_INVALID_HANDLE;
503 }
504 self->limiterEnableUser = value;
505 break;
506
507 case AAC_PCM_LIMITER_ATTACK_TIME:
508 if (value <= 0) { /* module function converts value to unsigned */
509 return AAC_DEC_SET_PARAM_FAIL;
510 }
511 switch (setLimiterAttack(hPcmTdl, value)) {
512 case TDLIMIT_OK:
513 break;
514 case TDLIMIT_INVALID_HANDLE:
515 return AAC_DEC_INVALID_HANDLE;
516 case TDLIMIT_INVALID_PARAMETER:
517 default:
518 return AAC_DEC_SET_PARAM_FAIL;
519 }
520 break;
521
522 case AAC_PCM_LIMITER_RELEAS_TIME:
523 if (value <= 0) { /* module function converts value to unsigned */
524 return AAC_DEC_SET_PARAM_FAIL;
525 }
526 switch (setLimiterRelease(hPcmTdl, value)) {
527 case TDLIMIT_OK:
528 break;
529 case TDLIMIT_INVALID_HANDLE:
530 return AAC_DEC_INVALID_HANDLE;
531 case TDLIMIT_INVALID_PARAMETER:
532 default:
533 return AAC_DEC_SET_PARAM_FAIL;
534 }
535 break;
536
537 case AAC_PCM_OUTPUT_CHANNEL_MAPPING:
538 switch (value) {
539 case 0:
540 if (self != NULL) {
541 self->channelOutputMapping = channelMappingTablePassthrough;
542 }
543 break;
544 case 1:
545 if (self != NULL) {
546 self->channelOutputMapping = channelMappingTableWAV;
547 }
548 break;
549 default:
550 errorStatus = AAC_DEC_SET_PARAM_FAIL;
551 break;
552 }
553 break;
554
555
556 case AAC_QMF_LOWPOWER:
557 if (value < -1 || value > 1) {
558 return AAC_DEC_SET_PARAM_FAIL;
559 }
560 if (self == NULL) {
561 return AAC_DEC_INVALID_HANDLE;
562 }
563
564 /**
565 * Set QMF mode (might be overriden)
566 * 0:HQ (complex)
567 * 1:LP (partially complex)
568 */
569 self->qmfModeUser = (QMF_MODE)value;
570 break;
571
572
573 case AAC_DRC_ATTENUATION_FACTOR:
574 /* DRC compression factor (where 0 is no and 127 is max compression) */
575 errorStatus =
576 aacDecoder_drcSetParam (
577 hDrcInfo,
578 DRC_CUT_SCALE,
579 value
580 );
581 break;
582
583 case AAC_DRC_BOOST_FACTOR:
584 /* DRC boost factor (where 0 is no and 127 is max boost) */
585 errorStatus =
586 aacDecoder_drcSetParam (
587 hDrcInfo,
588 DRC_BOOST_SCALE,
589 value
590 );
591 break;
592
593 case AAC_DRC_REFERENCE_LEVEL:
594 /* DRC reference level quantized in 0.25dB steps using values [0..127] it is '-' for analog scaling */
595 errorStatus =
596 aacDecoder_drcSetParam (
597 hDrcInfo,
598 TARGET_REF_LEVEL,
599 value
600 );
601 break;
602
603 case AAC_DRC_HEAVY_COMPRESSION:
604 /* Don't need to overwrite cut/boost values */
605 errorStatus =
606 aacDecoder_drcSetParam (
607 hDrcInfo,
608 APPLY_HEAVY_COMPRESSION,
609 value
610 );
611 break;
612
613
614 case AAC_TPDEC_CLEAR_BUFFER:
615 transportDec_SetParam(self->hInput, TPDEC_PARAM_RESET, 1);
616 self->streamInfo.numLostAccessUnits = 0;
617 self->streamInfo.numBadBytes = 0;
618 self->streamInfo.numTotalBytes = 0;
619 /* aacDecoder_SignalInterruption(self); */
620 break;
621
622 case AAC_CONCEAL_METHOD:
623 /* Changing the concealment method can introduce additional bitstream delay. And
624 that in turn affects sub libraries and modules which makes the whole thing quite
625 complex. So the complete changing routine is packed into a helper function which
626 keeps all modules and libs in a consistent state even in the case an error occures. */
627 errorStatus = setConcealMethod ( self, value );
628 break;
629
630 default:
631 return AAC_DEC_SET_PARAM_FAIL;
632 } /* switch(param) */
633
634 return (errorStatus);
635 }
636
637
aacDecoder_Open(TRANSPORT_TYPE transportFmt,UINT nrOfLayers)638 LINKSPEC_CPP HANDLE_AACDECODER aacDecoder_Open(TRANSPORT_TYPE transportFmt, UINT nrOfLayers)
639 {
640 AAC_DECODER_INSTANCE *aacDec = NULL;
641 HANDLE_TRANSPORTDEC pIn;
642 int err = 0;
643
644 /* Allocate transport layer struct. */
645 pIn = transportDec_Open(transportFmt, TP_FLAG_MPEG4);
646 if (pIn == NULL) {
647 return NULL;
648 }
649
650 transportDec_SetParam(pIn, TPDEC_PARAM_IGNORE_BUFFERFULLNESS, 1);
651
652 /* Allocate AAC decoder core struct. */
653 aacDec = CAacDecoder_Open(transportFmt);
654
655 if (aacDec == NULL) {
656 transportDec_Close(&pIn);
657 goto bail;
658 }
659 aacDec->hInput = pIn;
660
661 aacDec->nrOfLayers = nrOfLayers;
662
663 aacDec->channelOutputMapping = channelMappingTableWAV;
664
665 /* Register Config Update callback. */
666 transportDec_RegisterAscCallback(pIn, aacDecoder_ConfigCallback, (void*)aacDec);
667
668 /* open SBR decoder */
669 if ( SBRDEC_OK != sbrDecoder_Open ( &aacDec->hSbrDecoder )) {
670 err = -1;
671 goto bail;
672 }
673 aacDec->qmfModeUser = NOT_DEFINED;
674 transportDec_RegisterSbrCallback(aacDec->hInput, (cbSbr_t)sbrDecoder_Header, (void*)aacDec->hSbrDecoder);
675
676
677 pcmDmx_Open( &aacDec->hPcmUtils );
678 if (aacDec->hPcmUtils == NULL) {
679 err = -1;
680 goto bail;
681 }
682
683 aacDec->hLimiter = createLimiter(TDL_ATTACK_DEFAULT_MS, TDL_RELEASE_DEFAULT_MS, SAMPLE_MAX, (8), 96000);
684 if (NULL == aacDec->hLimiter) {
685 err = -1;
686 goto bail;
687 }
688 aacDec->limiterEnableUser = (UCHAR)-1;
689 aacDec->limiterEnableCurr = 0;
690
691
692
693 /* Assure that all modules have same delay */
694 if ( setConcealMethod(aacDec, CConcealment_GetMethod(&aacDec->concealCommonData)) ) {
695 err = -1;
696 goto bail;
697 }
698
699 bail:
700 if (err == -1) {
701 aacDecoder_Close(aacDec);
702 aacDec = NULL;
703 }
704 return aacDec;
705 }
706
aacDecoder_Fill(HANDLE_AACDECODER self,UCHAR * pBuffer[],const UINT bufferSize[],UINT * pBytesValid)707 LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Fill(
708 HANDLE_AACDECODER self,
709 UCHAR *pBuffer[],
710 const UINT bufferSize[],
711 UINT *pBytesValid
712 )
713 {
714 TRANSPORTDEC_ERROR tpErr;
715 /* loop counter for layers; if not TT_MP4_RAWPACKETS used as index for only
716 available layer */
717 INT layer = 0;
718 INT nrOfLayers = self->nrOfLayers;
719
720 {
721 for (layer = 0; layer < nrOfLayers; layer++){
722 {
723 tpErr = transportDec_FillData( self->hInput, pBuffer[layer], bufferSize[layer], &pBytesValid[layer], layer );
724 if (tpErr != TRANSPORTDEC_OK) {
725 return AAC_DEC_UNKNOWN; /* Must be an internal error */
726 }
727 }
728 }
729 }
730
731 return AAC_DEC_OK;
732 }
733
734
aacDecoder_SignalInterruption(HANDLE_AACDECODER self)735 static void aacDecoder_SignalInterruption(HANDLE_AACDECODER self)
736 {
737 CAacDecoder_SignalInterruption(self);
738
739 if ( self->hSbrDecoder != NULL ) {
740 sbrDecoder_SetParam(self->hSbrDecoder, SBR_BS_INTERRUPTION, 0);
741 }
742 }
743
aacDecoder_UpdateBitStreamCounters(CStreamInfo * pSi,HANDLE_FDK_BITSTREAM hBs,int nBits,AAC_DECODER_ERROR ErrorStatus)744 static void aacDecoder_UpdateBitStreamCounters(CStreamInfo *pSi, HANDLE_FDK_BITSTREAM hBs, int nBits, AAC_DECODER_ERROR ErrorStatus)
745 {
746 /* calculate bit difference (amount of bits moved forward) */
747 nBits = nBits - FDKgetValidBits(hBs);
748
749 /* Note: The amount of bits consumed might become negative when parsing a
750 bit stream with several sub frames, and we find out at the last sub frame
751 that the total frame length does not match the sum of sub frame length.
752 If this happens, the transport decoder might want to rewind to the supposed
753 ending of the transport frame, and this position might be before the last
754 access unit beginning. */
755
756 /* Calc bitrate. */
757 if (pSi->frameSize > 0) {
758 pSi->bitRate = (nBits * pSi->sampleRate)/pSi->frameSize;
759 }
760
761 /* bit/byte counters */
762 {
763 int nBytes;
764
765 nBytes = nBits>>3;
766 pSi->numTotalBytes += nBytes;
767 if (IS_OUTPUT_VALID(ErrorStatus)) {
768 pSi->numTotalAccessUnits++;
769 }
770 if (IS_DECODE_ERROR(ErrorStatus)) {
771 pSi->numBadBytes += nBytes;
772 pSi->numBadAccessUnits++;
773 }
774 }
775 }
776
aacDecoder_EstimateNumberOfLostFrames(HANDLE_AACDECODER self)777 static INT aacDecoder_EstimateNumberOfLostFrames(HANDLE_AACDECODER self)
778 {
779 INT n;
780
781 transportDec_GetMissingAccessUnitCount( &n, self->hInput);
782
783 return n;
784 }
785
aacDecoder_DecodeFrame(HANDLE_AACDECODER self,INT_PCM * pTimeData,const INT timeDataSize,const UINT flags)786 LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame(
787 HANDLE_AACDECODER self,
788 INT_PCM *pTimeData,
789 const INT timeDataSize,
790 const UINT flags)
791 {
792 AAC_DECODER_ERROR ErrorStatus;
793 INT layer;
794 INT nBits;
795 INT interleaved = self->outputInterleaved;
796 HANDLE_FDK_BITSTREAM hBs;
797 int fTpInterruption = 0; /* Transport originated interruption detection. */
798 int fTpConceal = 0; /* Transport originated concealment. */
799
800
801 if (self == NULL) {
802 return AAC_DEC_INVALID_HANDLE;
803 }
804
805 if (flags & AACDEC_INTR) {
806 self->streamInfo.numLostAccessUnits = 0;
807 }
808
809 hBs = transportDec_GetBitstream(self->hInput, 0);
810
811 /* Get current bits position for bitrate calculation. */
812 nBits = FDKgetValidBits(hBs);
813 if (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH) ) )
814 {
815 TRANSPORTDEC_ERROR err;
816
817 for(layer = 0; layer < self->nrOfLayers; layer++)
818 {
819 err = transportDec_ReadAccessUnit(self->hInput, layer);
820 if (err != TRANSPORTDEC_OK) {
821 switch (err) {
822 case TRANSPORTDEC_NOT_ENOUGH_BITS:
823 ErrorStatus = AAC_DEC_NOT_ENOUGH_BITS;
824 goto bail;
825 case TRANSPORTDEC_SYNC_ERROR:
826 self->streamInfo.numLostAccessUnits = aacDecoder_EstimateNumberOfLostFrames(self);
827 fTpInterruption = 1;
828 break;
829 case TRANSPORTDEC_NEED_TO_RESTART:
830 ErrorStatus = AAC_DEC_NEED_TO_RESTART;
831 goto bail;
832 case TRANSPORTDEC_CRC_ERROR:
833 fTpConceal = 1;
834 break;
835 default:
836 ErrorStatus = AAC_DEC_UNKNOWN;
837 goto bail;
838 }
839 }
840 }
841 } else {
842 if (self->streamInfo.numLostAccessUnits > 0) {
843 self->streamInfo.numLostAccessUnits--;
844 }
845 }
846
847 /* Signal bit stream interruption to other modules if required. */
848 if ( fTpInterruption || (flags & (AACDEC_INTR|AACDEC_CLRHIST)) )
849 {
850 sbrDecoder_SetParam(self->hSbrDecoder, SBR_CLEAR_HISTORY, (flags&AACDEC_CLRHIST));
851 aacDecoder_SignalInterruption(self);
852 if ( ! (flags & AACDEC_INTR) ) {
853 ErrorStatus = AAC_DEC_TRANSPORT_SYNC_ERROR;
854 goto bail;
855 }
856 }
857
858 /* Empty bit buffer in case of flush request. */
859 if (flags & AACDEC_FLUSH)
860 {
861 transportDec_SetParam(self->hInput, TPDEC_PARAM_RESET, 1);
862 self->streamInfo.numLostAccessUnits = 0;
863 self->streamInfo.numBadBytes = 0;
864 self->streamInfo.numTotalBytes = 0;
865 }
866 /* Reset the output delay field. The modules will add their figures one after another. */
867 self->streamInfo.outputDelay = 0;
868
869 if (self->limiterEnableUser==(UCHAR)-1) {
870 /* Enbale limiter for all non-lowdelay AOT's. */
871 self->limiterEnableCurr = ( self->flags & (AC_LD|AC_ELD) ) ? 0 : 1;
872 }
873 else {
874 /* Use limiter configuration as requested. */
875 self->limiterEnableCurr = self->limiterEnableUser;
876 }
877 /* reset limiter gain on a per frame basis */
878 self->extGain[0] = FL2FXCONST_DBL(1.0f/(float)(1<<TDL_GAIN_SCALING));
879
880
881 ErrorStatus = CAacDecoder_DecodeFrame(self,
882 flags | (fTpConceal ? AACDEC_CONCEAL : 0),
883 pTimeData,
884 timeDataSize,
885 interleaved);
886
887 if (!(flags & (AACDEC_CONCEAL|AACDEC_FLUSH))) {
888 TRANSPORTDEC_ERROR tpErr;
889 tpErr = transportDec_EndAccessUnit(self->hInput);
890 if (tpErr != TRANSPORTDEC_OK) {
891 self->frameOK = 0;
892 }
893 }
894
895 /* If the current pTimeData does not contain a valid signal, there nothing else we can do, so bail. */
896 if ( ! IS_OUTPUT_VALID(ErrorStatus) ) {
897 goto bail;
898 }
899
900 {
901 /* Export data into streaminfo structure */
902 self->streamInfo.sampleRate = self->streamInfo.aacSampleRate;
903 self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame;
904 }
905 self->streamInfo.numChannels = self->streamInfo.aacNumChannels;
906
907
908
909 CAacDecoder_SyncQmfMode(self);
910
911 /* sbr decoder */
912
913 if (ErrorStatus || (flags & AACDEC_CONCEAL) || self->pAacDecoderStaticChannelInfo[0]->concealmentInfo.concealState > ConcealState_FadeIn)
914 {
915 self->frameOK = 0; /* if an error has occured do concealment in the SBR decoder too */
916 }
917
918 if (self->sbrEnabled)
919 {
920 SBR_ERROR sbrError = SBRDEC_OK;
921 int chOutMapIdx = ((self->chMapIndex==0) && (self->streamInfo.numChannels<7)) ? self->streamInfo.numChannels : self->chMapIndex;
922
923 /* set params */
924 sbrDecoder_SetParam ( self->hSbrDecoder,
925 SBR_SYSTEM_BITSTREAM_DELAY,
926 self->sbrParams.bsDelay);
927 sbrDecoder_SetParam ( self->hSbrDecoder,
928 SBR_FLUSH_DATA,
929 (flags & AACDEC_FLUSH) );
930
931 if ( self->streamInfo.aot == AOT_ER_AAC_ELD ) {
932 /* Configure QMF */
933 sbrDecoder_SetParam ( self->hSbrDecoder,
934 SBR_LD_QMF_TIME_ALIGN,
935 (self->flags & AC_LD_MPS) ? 1 : 0 );
936 }
937
938 {
939 PCMDMX_ERROR dmxErr;
940 INT maxOutCh = 0;
941
942 dmxErr = pcmDmx_GetParam(self->hPcmUtils, MAX_NUMBER_OF_OUTPUT_CHANNELS, &maxOutCh);
943 if ( (dmxErr == PCMDMX_OK) && (maxOutCh == 1) ) {
944 /* Disable PS processing if we have to create a mono output signal. */
945 self->psPossible = 0;
946 }
947 }
948
949
950 /* apply SBR processing */
951 sbrError = sbrDecoder_Apply ( self->hSbrDecoder,
952 pTimeData,
953 &self->streamInfo.numChannels,
954 &self->streamInfo.sampleRate,
955 self->channelOutputMapping[chOutMapIdx],
956 interleaved,
957 self->frameOK,
958 &self->psPossible);
959
960
961 if (sbrError == SBRDEC_OK) {
962 #define UPS_SCALE 2 /* Maximum upsampling factor is 4 (CELP+SBR) */
963 FIXP_DBL upsampleFactor = FL2FXCONST_DBL(1.0f/(1<<UPS_SCALE));
964
965 /* Update data in streaminfo structure. Assume that the SBR upsampling factor is either 1 or 2 */
966 self->flags |= AC_SBR_PRESENT;
967 if (self->streamInfo.aacSampleRate != self->streamInfo.sampleRate) {
968 if (self->streamInfo.frameSize == 768) {
969 upsampleFactor = FL2FXCONST_DBL(8.0f/(3<<UPS_SCALE));
970 } else {
971 upsampleFactor = FL2FXCONST_DBL(2.0f/(1<<UPS_SCALE));
972 }
973 }
974 /* Apply upsampling factor to both the core frame length and the core delay */
975 self->streamInfo.frameSize = (INT)fMult((FIXP_DBL)self->streamInfo.aacSamplesPerFrame<<UPS_SCALE, upsampleFactor);
976 self->streamInfo.outputDelay = (UINT)(INT)fMult((FIXP_DBL)self->streamInfo.outputDelay<<UPS_SCALE, upsampleFactor);
977 self->streamInfo.outputDelay += sbrDecoder_GetDelay( self->hSbrDecoder );
978
979 if (self->psPossible) {
980 self->flags |= AC_PS_PRESENT;
981 self->channelType[0] = ACT_FRONT;
982 self->channelType[1] = ACT_FRONT;
983 self->channelIndices[0] = 0;
984 self->channelIndices[1] = 1;
985 }
986 }
987 }
988
989
990 {
991 INT pcmLimiterScale = 0;
992 PCMDMX_ERROR dmxErr = PCMDMX_OK;
993 if ( flags & (AACDEC_INTR | AACDEC_CLRHIST) ) {
994 /* delete data from the past (e.g. mixdown coeficients) */
995 pcmDmx_Reset( self->hPcmUtils, PCMDMX_RESET_BS_DATA );
996 }
997 /* do PCM post processing */
998 dmxErr = pcmDmx_ApplyFrame (
999 self->hPcmUtils,
1000 pTimeData,
1001 self->streamInfo.frameSize,
1002 &self->streamInfo.numChannels,
1003 interleaved,
1004 self->channelType,
1005 self->channelIndices,
1006 self->channelOutputMapping,
1007 (self->limiterEnableCurr) ? &pcmLimiterScale : NULL
1008 );
1009 if (dmxErr == PCMDMX_INVALID_MODE) {
1010 /* Announce the framework that the current combination of channel configuration and downmix
1011 * settings are not know to produce a predictable behavior and thus maybe produce strange output. */
1012 ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
1013 }
1014
1015 if ( flags & AACDEC_CLRHIST ) {
1016 /* Delete the delayed signal. */
1017 resetLimiter(self->hLimiter);
1018 }
1019 if (self->limiterEnableCurr)
1020 {
1021 /* Set actual signal parameters */
1022 setLimiterNChannels(self->hLimiter, self->streamInfo.numChannels);
1023 setLimiterSampleRate(self->hLimiter, self->streamInfo.sampleRate);
1024
1025 applyLimiter(
1026 self->hLimiter,
1027 pTimeData,
1028 self->extGain,
1029 &pcmLimiterScale,
1030 1,
1031 self->extGainDelay,
1032 self->streamInfo.frameSize
1033 );
1034
1035 /* Announce the additional limiter output delay */
1036 self->streamInfo.outputDelay += getLimiterDelay(self->hLimiter);
1037 }
1038 }
1039
1040
1041 /* Signal interruption to take effect in next frame. */
1042 if ( flags & AACDEC_FLUSH ) {
1043 aacDecoder_SignalInterruption(self);
1044 }
1045
1046 /* Update externally visible copy of flags */
1047 self->streamInfo.flags = self->flags;
1048
1049 bail:
1050
1051 /* Update Statistics */
1052 aacDecoder_UpdateBitStreamCounters(&self->streamInfo, hBs, nBits, ErrorStatus);
1053
1054 return ErrorStatus;
1055 }
1056
aacDecoder_Close(HANDLE_AACDECODER self)1057 LINKSPEC_CPP void aacDecoder_Close ( HANDLE_AACDECODER self )
1058 {
1059 if (self == NULL)
1060 return;
1061
1062
1063 if (self->hLimiter != NULL) {
1064 destroyLimiter(self->hLimiter);
1065 }
1066
1067 if (self->hPcmUtils != NULL) {
1068 pcmDmx_Close( &self->hPcmUtils );
1069 }
1070
1071
1072
1073 if (self->hSbrDecoder != NULL) {
1074 sbrDecoder_Close(&self->hSbrDecoder);
1075 }
1076
1077 if (self->hInput != NULL) {
1078 transportDec_Close(&self->hInput);
1079 }
1080
1081 CAacDecoder_Close(self);
1082 }
1083
1084
aacDecoder_GetStreamInfo(HANDLE_AACDECODER self)1085 LINKSPEC_CPP CStreamInfo* aacDecoder_GetStreamInfo ( HANDLE_AACDECODER self )
1086 {
1087 return CAacDecoder_GetStreamInfo(self);
1088 }
1089
aacDecoder_GetLibInfo(LIB_INFO * info)1090 LINKSPEC_CPP INT aacDecoder_GetLibInfo ( LIB_INFO *info )
1091 {
1092 int i;
1093
1094 if (info == NULL) {
1095 return -1;
1096 }
1097
1098 sbrDecoder_GetLibInfo( info );
1099 transportDec_GetLibInfo( info );
1100 FDK_toolsGetLibInfo( info );
1101 pcmDmx_GetLibInfo( info );
1102
1103 /* search for next free tab */
1104 for (i = 0; i < FDK_MODULE_LAST; i++) {
1105 if (info[i].module_id == FDK_NONE) break;
1106 }
1107 if (i == FDK_MODULE_LAST) {
1108 return -1;
1109 }
1110 info += i;
1111
1112 info->module_id = FDK_AACDEC;
1113 /* build own library info */
1114 info->version = LIB_VERSION(AACDECODER_LIB_VL0, AACDECODER_LIB_VL1, AACDECODER_LIB_VL2);
1115 LIB_VERSION_STRING(info);
1116 info->build_date = AACDECODER_LIB_BUILD_DATE;
1117 info->build_time = AACDECODER_LIB_BUILD_TIME;
1118 info->title = AACDECODER_LIB_TITLE;
1119
1120 /* Set flags */
1121 info->flags = 0
1122 | CAPF_AAC_LC
1123 | CAPF_AAC_VCB11
1124 | CAPF_AAC_HCR
1125 | CAPF_AAC_RVLC
1126 | CAPF_ER_AAC_LD
1127 | CAPF_ER_AAC_ELD
1128 | CAPF_AAC_CONCEALMENT
1129 | CAPF_AAC_DRC
1130
1131 | CAPF_AAC_MPEG4
1132
1133
1134 | CAPF_AAC_1024
1135 | CAPF_AAC_960
1136
1137 | CAPF_AAC_512
1138
1139 | CAPF_AAC_480
1140
1141 ;
1142 /* End of flags */
1143
1144 return 0;
1145 }
1146
1147
1148
1149
1150