aboutsummaryrefslogtreecommitdiffstats
path: root/libAACdec/src/aacdecoder_lib.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libAACdec/src/aacdecoder_lib.cpp')
-rw-r--r--libAACdec/src/aacdecoder_lib.cpp1003
1 files changed, 0 insertions, 1003 deletions
diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp
deleted file mode 100644
index ec8f41e..0000000
--- a/libAACdec/src/aacdecoder_lib.cpp
+++ /dev/null
@@ -1,1003 +0,0 @@
-
-/* -----------------------------------------------------------------------------------------------------------
-Software License for The Fraunhofer FDK AAC Codec Library for Android
-
-© Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
- All rights reserved.
-
- 1. INTRODUCTION
-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
-the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
-This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
-
-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
-audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
-independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
-of the MPEG specifications.
-
-Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
-may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
-individually for the purpose of encoding or decoding bit streams in products that are compliant with
-the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
-these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
-software may already be covered under those patent licenses when it is used for those licensed purposes only.
-
-Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
-are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
-applications information and documentation.
-
-2. COPYRIGHT LICENSE
-
-Redistribution and use in source and binary forms, with or without modification, are permitted without
-payment of copyright license fees provided that you satisfy the following conditions:
-
-You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
-your modifications thereto in source code form.
-
-You must retain the complete text of this software license in the documentation and/or other materials
-provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
-You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
-modifications thereto to recipients of copies in binary form.
-
-The name of Fraunhofer may not be used to endorse or promote products derived from this library without
-prior written permission.
-
-You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
-software or your modifications thereto.
-
-Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
-and the date of any change. For modified versions of the FDK AAC Codec, the term
-"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
-"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
-
-3. NO PATENT LICENSE
-
-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
-ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
-respect to this software.
-
-You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
-by appropriate patent licenses.
-
-4. DISCLAIMER
-
-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
-"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
-of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
-including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
-or business interruption, however caused and on any theory of liability, whether in contract, strict
-liability, or tort (including negligence), arising in any way out of the use of this software, even if
-advised of the possibility of such damage.
-
-5. CONTACT INFORMATION
-
-Fraunhofer Institute for Integrated Circuits IIS
-Attention: Audio and Multimedia Departments - FDK AAC LL
-Am Wolfsmantel 33
-91058 Erlangen, Germany
-
-www.iis.fraunhofer.de/amm
-amm-info@iis.fraunhofer.de
------------------------------------------------------------------------------------------------------------ */
-
-/***************************** MPEG-4 AAC Decoder **************************
-
- Author(s): Manuel Jander
- Description:
-
-******************************************************************************/
-
-#include "aacdecoder_lib.h"
-
-#include "aac_ram.h"
-#include "aacdecoder.h"
-#include "tpdec_lib.h"
-#include "FDK_core.h" /* FDK_tools version info */
-
-
- #include "sbrdecoder.h"
-
-
-
-
-#include "conceal.h"
-
- #include "aacdec_drc.h"
-
-
-
-/* Decoder library info */
-#define AACDECODER_LIB_VL0 2
-#define AACDECODER_LIB_VL1 5
-#define AACDECODER_LIB_VL2 5
-#define AACDECODER_LIB_TITLE "AAC Decoder Lib"
-#define AACDECODER_LIB_BUILD_DATE __DATE__
-#define AACDECODER_LIB_BUILD_TIME __TIME__
-
-static AAC_DECODER_ERROR
-setConcealMethod ( const HANDLE_AACDECODER self,
- const INT method );
-
-
-LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_GetFreeBytes ( const HANDLE_AACDECODER self, UINT *pFreeBytes){
-
- /* reset free bytes */
- *pFreeBytes = 0;
-
- /* check handle */
- if(!self)
- return AAC_DEC_INVALID_HANDLE;
-
- /* return nr of free bytes */
- HANDLE_FDK_BITSTREAM hBs = transportDec_GetBitstream(self->hInput, 0);
- *pFreeBytes = FDKgetFreeBits(hBs) >> 3;
-
- /* success */
- return AAC_DEC_OK;
-}
-
-/**
- * Config Decoder using a CSAudioSpecificConfig struct.
- */
-static
-LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Config(HANDLE_AACDECODER self, const CSAudioSpecificConfig *pAscStruct)
-{
- AAC_DECODER_ERROR err;
-
- /* Initialize AAC core decoder, and update self->streaminfo */
- err = CAacDecoder_Init(self, pAscStruct);
-
- return err;
-}
-
-LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_ConfigRaw (
- HANDLE_AACDECODER self,
- UCHAR *conf[],
- const UINT length[] )
-{
- AAC_DECODER_ERROR err = AAC_DEC_OK;
- TRANSPORTDEC_ERROR errTp;
- UINT layer, nrOfLayers = self->nrOfLayers;
-
- for(layer = 0; layer < nrOfLayers; layer++){
- if(length[layer] > 0){
- errTp = transportDec_OutOfBandConfig(self->hInput, conf[layer], length[layer], layer);
- if (errTp != TRANSPORTDEC_OK) {
- switch (errTp) {
- case TRANSPORTDEC_NEED_TO_RESTART:
- err = AAC_DEC_NEED_TO_RESTART;
- break;
- case TRANSPORTDEC_UNSUPPORTED_FORMAT:
- err = AAC_DEC_UNSUPPORTED_FORMAT;
- break;
- default:
- err = AAC_DEC_UNKNOWN;
- break;
- }
- /* if baselayer is OK we continue decoding */
- if(layer >= 1){
- self->nrOfLayers = layer;
- }
- break;
- }
- }
- }
-
- return err;
-}
-
-
-
-static INT aacDecoder_ConfigCallback(void *handle, const CSAudioSpecificConfig *pAscStruct)
-{
- HANDLE_AACDECODER self = (HANDLE_AACDECODER)handle;
- AAC_DECODER_ERROR err = AAC_DEC_OK;
- TRANSPORTDEC_ERROR errTp;
-
- {
- {
- err = aacDecoder_Config(self, pAscStruct);
- }
- }
- if (err == AAC_DEC_OK) {
- if ( self->flags & (AC_USAC|AC_RSVD50|AC_LD|AC_ELD)
- && CConcealment_GetDelay(&self->concealCommonData) > 0 )
- {
- /* Revert to error concealment method Noise Substitution.
- Because interpolation is not implemented for USAC/RSVD50 or
- the additional delay is unwanted for low delay codecs. */
- setConcealMethod(self, 1);
-#ifdef DEBUG
- FDKprintf(" Concealment method was reverted to 1 !\n");
-#endif
- }
- errTp = TRANSPORTDEC_OK;
- } else {
- if (IS_INIT_ERROR(err)) {
- errTp = TRANSPORTDEC_UNSUPPORTED_FORMAT;
- } /* Fatal errors */
- else if (err == AAC_DEC_NEED_TO_RESTART) {
- errTp = TRANSPORTDEC_NEED_TO_RESTART;
- } else {
- errTp = TRANSPORTDEC_UNKOWN_ERROR;
- }
- }
-
- return errTp;
-}
-
-
-
-LINKSPEC_CPP AAC_DECODER_ERROR
-aacDecoder_AncDataInit ( HANDLE_AACDECODER self,
- UCHAR *buffer,
- int size )
-{
- CAncData *ancData = &self->ancData;
-
- return CAacDecoder_AncDataInit(ancData, buffer, size);
-}
-
-
-LINKSPEC_CPP AAC_DECODER_ERROR
-aacDecoder_AncDataGet ( HANDLE_AACDECODER self,
- int index,
- UCHAR **ptr,
- int *size )
-{
- CAncData *ancData = &self->ancData;
-
- return CAacDecoder_AncDataGet(ancData, index, ptr, size);
-}
-
-
-static AAC_DECODER_ERROR
-setConcealMethod ( const HANDLE_AACDECODER self, /*!< Handle of the decoder instance */
- const INT method )
-{
- AAC_DECODER_ERROR errorStatus = AAC_DEC_OK;
- CConcealParams *pConcealData = NULL;
- HANDLE_SBRDECODER hSbrDec = NULL;
- HANDLE_AAC_DRC hDrcInfo = NULL;
- HANDLE_PCM_DOWNMIX hPcmDmx = NULL;
- CConcealmentMethod backupMethod = ConcealMethodNone;
- int backupDelay = 0;
- int bsDelay = 0;
-
- /* check decoder handle */
- if (self != NULL) {
- pConcealData = &self->concealCommonData;
- hSbrDec = self->hSbrDecoder;
- hDrcInfo = self->hDrcInfo;
- hPcmDmx = self->hPcmUtils;
- }
-
-
- /* Get current method/delay */
- backupMethod = CConcealment_GetMethod(pConcealData);
- backupDelay = CConcealment_GetDelay(pConcealData);
-
- /* Be sure to set AAC and SBR concealment method simultaneously! */
- errorStatus =
- CConcealment_SetParams(
- pConcealData,
- (int)method, // concealMethod
- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealFadeOutSlope
- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealFadeInSlope
- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealMuteRelease
- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED // concealComfNoiseLevel
- );
- if ( (errorStatus != AAC_DEC_OK)
- && (errorStatus != AAC_DEC_INVALID_HANDLE) ) {
- goto bail;
- }
-
- /* Get new delay */
- bsDelay = CConcealment_GetDelay(pConcealData);
-
- {
- SBR_ERROR sbrErr = SBRDEC_OK;
-
- /* set SBR bitstream delay */
- sbrErr = sbrDecoder_SetParam (
- hSbrDec,
- SBR_SYSTEM_BITSTREAM_DELAY,
- bsDelay
- );
-
- switch (sbrErr) {
- case SBRDEC_OK:
- case SBRDEC_NOT_INITIALIZED:
- if (self != NULL) {
- /* save the param value and set later
- (when SBR has been initialized) */
- self->sbrParams.bsDelay = bsDelay;
- }
- break;
- default:
- errorStatus = AAC_DEC_SET_PARAM_FAIL;
- goto bail;
- }
- }
-
- errorStatus =
- aacDecoder_drcSetParam (
- hDrcInfo,
- DRC_BS_DELAY,
- bsDelay
- );
- if ( (errorStatus != AAC_DEC_OK)
- && (errorStatus != AAC_DEC_INVALID_HANDLE) ) {
- goto bail;
- }
-
- if (errorStatus == AAC_DEC_OK) {
- PCMDMX_ERROR err =
- pcmDmx_SetParam (
- hPcmDmx,
- DMX_BS_DATA_DELAY,
- bsDelay
- );
- switch (err) {
- case PCMDMX_INVALID_HANDLE:
- errorStatus = AAC_DEC_INVALID_HANDLE;
- case PCMDMX_OK:
- break;
- default:
- errorStatus = AAC_DEC_SET_PARAM_FAIL;
- goto bail;
- }
- }
-
-
-bail:
- if ( (errorStatus != AAC_DEC_OK)
- && (errorStatus != AAC_DEC_INVALID_HANDLE) )
- {
- /* Revert to the initial state */
- CConcealment_SetParams (
- pConcealData,
- (int)backupMethod,
- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,
- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,
- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,
- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED
- );
- /* Revert SBR bitstream delay */
- sbrDecoder_SetParam (
- hSbrDec,
- SBR_SYSTEM_BITSTREAM_DELAY,
- backupDelay
- );
- /* Revert DRC bitstream delay */
- aacDecoder_drcSetParam (
- hDrcInfo,
- DRC_BS_DELAY,
- backupDelay
- );
- /* Revert PCM mixdown bitstream delay */
- pcmDmx_SetParam (
- hPcmDmx,
- DMX_BS_DATA_DELAY,
- backupDelay
- );
- }
-
- return errorStatus;
-}
-
-
-LINKSPEC_CPP AAC_DECODER_ERROR
-aacDecoder_SetParam ( const HANDLE_AACDECODER self, /*!< Handle of the decoder instance */
- const AACDEC_PARAM param, /*!< Parameter to set */
- const INT value) /*!< Parameter valued */
-{
- AAC_DECODER_ERROR errorStatus = AAC_DEC_OK;
- CConcealParams *pConcealData = NULL;
- HANDLE_AAC_DRC hDrcInfo = NULL;
- HANDLE_PCM_DOWNMIX hPcmDmx = NULL;
-
- /* check decoder handle */
- if (self != NULL) {
- pConcealData = &self->concealCommonData;
- hDrcInfo = self->hDrcInfo;
- hPcmDmx = self->hPcmUtils;
- } else {
- errorStatus = AAC_DEC_INVALID_HANDLE;
- }
-
- /* configure the subsystems */
- switch (param)
- {
- case AAC_PCM_OUTPUT_INTERLEAVED:
- if (value < 0 || value > 1) {
- return AAC_DEC_SET_PARAM_FAIL;
- }
- if (self == NULL) {
- return AAC_DEC_INVALID_HANDLE;
- }
- self->outputInterleaved = value;
- break;
-
- case AAC_PCM_OUTPUT_CHANNELS:
- if (value < -1 || value > (6)) {
- return AAC_DEC_SET_PARAM_FAIL;
- }
- {
- PCMDMX_ERROR err;
-
- err = pcmDmx_SetParam (
- hPcmDmx,
- NUMBER_OF_OUTPUT_CHANNELS,
- value );
-
- switch (err) {
- case PCMDMX_OK:
- break;
- case PCMDMX_INVALID_HANDLE:
- return AAC_DEC_INVALID_HANDLE;
- default:
- return AAC_DEC_SET_PARAM_FAIL;
- }
- }
- break;
-
- case AAC_PCM_DUAL_CHANNEL_OUTPUT_MODE:
- {
- PCMDMX_ERROR err;
-
- err = pcmDmx_SetParam (
- hPcmDmx,
- DUAL_CHANNEL_DOWNMIX_MODE,
- value );
-
- switch (err) {
- case PCMDMX_OK:
- break;
- case PCMDMX_INVALID_HANDLE:
- return AAC_DEC_INVALID_HANDLE;
- default:
- return AAC_DEC_SET_PARAM_FAIL;
- }
- }
- break;
-
- case AAC_PCM_OUTPUT_CHANNEL_MAPPING:
- switch (value) {
- case 0:
- if (self != NULL) {
- self->channelOutputMapping = channelMappingTablePassthrough;
- }
- break;
- case 1:
- if (self != NULL) {
- self->channelOutputMapping = channelMappingTableWAV;
- }
- break;
- default:
- errorStatus = AAC_DEC_SET_PARAM_FAIL;
- break;
- }
- break;
-
-
- case AAC_QMF_LOWPOWER:
- if (value < -1 || value > 1) {
- return AAC_DEC_SET_PARAM_FAIL;
- }
- if (self == NULL) {
- return AAC_DEC_INVALID_HANDLE;
- }
-
- /**
- * Set QMF mode (might be overriden)
- * 0:HQ (complex)
- * 1:LP (partially complex)
- */
- self->qmfModeUser = (QMF_MODE)value;
- break;
-
-
- case AAC_DRC_ATTENUATION_FACTOR:
- /* DRC compression factor (where 0 is no and 127 is max compression) */
- errorStatus =
- aacDecoder_drcSetParam (
- hDrcInfo,
- DRC_CUT_SCALE,
- value
- );
- break;
-
- case AAC_DRC_BOOST_FACTOR:
- /* DRC boost factor (where 0 is no and 127 is max boost) */
- errorStatus =
- aacDecoder_drcSetParam (
- hDrcInfo,
- DRC_BOOST_SCALE,
- value
- );
- break;
-
- case AAC_DRC_REFERENCE_LEVEL:
- /* DRC reference level quantized in 0.25dB steps using values [0..127] it is '-' for analog scaling */
- errorStatus =
- aacDecoder_drcSetParam (
- hDrcInfo,
- TARGET_REF_LEVEL,
- value
- );
- break;
-
- case AAC_DRC_HEAVY_COMPRESSION:
- /* Don't need to overwrite cut/boost values */
- errorStatus =
- aacDecoder_drcSetParam (
- hDrcInfo,
- APPLY_HEAVY_COMPRESSION,
- value
- );
- break;
-
-
- case AAC_TPDEC_CLEAR_BUFFER:
- transportDec_SetParam(self->hInput, TPDEC_PARAM_RESET, 1);
- self->streamInfo.numLostAccessUnits = 0;
- self->streamInfo.numBadBytes = 0;
- self->streamInfo.numTotalBytes = 0;
- /* aacDecoder_SignalInterruption(self); */
- break;
-
- case AAC_CONCEAL_METHOD:
- /* Changing the concealment method can introduce additional bitstream delay. And
- that in turn affects sub libraries and modules which makes the whole thing quite
- complex. So the complete changing routine is packed into a helper function which
- keeps all modules and libs in a consistent state even in the case an error occures. */
- errorStatus = setConcealMethod ( self, value );
- break;
-
- default:
- return AAC_DEC_SET_PARAM_FAIL;
- } /* switch(param) */
-
- return (errorStatus);
-}
-
-
-LINKSPEC_CPP HANDLE_AACDECODER aacDecoder_Open(TRANSPORT_TYPE transportFmt, UINT nrOfLayers)
-{
- AAC_DECODER_INSTANCE *aacDec = NULL;
- HANDLE_TRANSPORTDEC pIn;
- int err = 0;
-
- /* Allocate transport layer struct. */
- pIn = transportDec_Open(transportFmt, TP_FLAG_MPEG4);
- if (pIn == NULL) {
- return NULL;
- }
-
- transportDec_SetParam(pIn, TPDEC_PARAM_IGNORE_BUFFERFULLNESS, 1);
-
- /* Allocate AAC decoder core struct. */
- aacDec = CAacDecoder_Open(transportFmt);
-
- if (aacDec == NULL) {
- transportDec_Close(&pIn);
- goto bail;
- }
- aacDec->hInput = pIn;
-
- aacDec->nrOfLayers = nrOfLayers;
-
- aacDec->channelOutputMapping = channelMappingTableWAV;
-
- /* Register Config Update callback. */
- transportDec_RegisterAscCallback(pIn, aacDecoder_ConfigCallback, (void*)aacDec);
-
- /* open SBR decoder */
- if ( SBRDEC_OK != sbrDecoder_Open ( &aacDec->hSbrDecoder )) {
- err = -1;
- goto bail;
- }
- aacDec->qmfModeUser = NOT_DEFINED;
- transportDec_RegisterSbrCallback(aacDec->hInput, (cbSbr_t)sbrDecoder_Header, (void*)aacDec->hSbrDecoder);
-
-
- pcmDmx_Open( &aacDec->hPcmUtils );
- if (aacDec->hPcmUtils == NULL) {
- err = -1;
- goto bail;
- }
-
-
-
- /* Assure that all modules have same delay */
- if ( setConcealMethod(aacDec, CConcealment_GetMethod(&aacDec->concealCommonData)) ) {
- err = -1;
- goto bail;
- }
-
-bail:
- if (err == -1) {
- aacDecoder_Close(aacDec);
- aacDec = NULL;
- }
- return aacDec;
-}
-
-LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Fill(
- HANDLE_AACDECODER self,
- UCHAR *pBuffer[],
- const UINT bufferSize[],
- UINT *pBytesValid
- )
-{
- TRANSPORTDEC_ERROR tpErr;
- /* loop counter for layers; if not TT_MP4_RAWPACKETS used as index for only
- available layer */
- INT layer = 0;
- INT nrOfLayers = self->nrOfLayers;
-
- {
- for (layer = 0; layer < nrOfLayers; layer++){
- {
- tpErr = transportDec_FillData( self->hInput, pBuffer[layer], bufferSize[layer], &pBytesValid[layer], layer );
- if (tpErr != TRANSPORTDEC_OK) {
- return AAC_DEC_UNKNOWN; /* Must be an internal error */
- }
- }
- }
- }
-
- return AAC_DEC_OK;
-}
-
-
-static void aacDecoder_SignalInterruption(HANDLE_AACDECODER self)
-{
- CAacDecoder_SignalInterruption(self);
-
- if ( self->hSbrDecoder != NULL ) {
- sbrDecoder_SetParam(self->hSbrDecoder, SBR_BS_INTERRUPTION, 0);
- }
-}
-
-static void aacDecoder_UpdateBitStreamCounters(CStreamInfo *pSi, HANDLE_FDK_BITSTREAM hBs, int nBits, AAC_DECODER_ERROR ErrorStatus)
-{
- /* calculate bit difference (amount of bits moved forward) */
- nBits = nBits - FDKgetValidBits(hBs);
-
- /* Note: The amount of bits consumed might become negative when parsing a
- bit stream with several sub frames, and we find out at the last sub frame
- that the total frame length does not match the sum of sub frame length.
- If this happens, the transport decoder might want to rewind to the supposed
- ending of the transport frame, and this position might be before the last
- access unit beginning. */
-
- /* Calc bitrate. */
- if (pSi->frameSize > 0) {
- pSi->bitRate = (nBits * pSi->sampleRate)/pSi->frameSize;
- }
-
- /* bit/byte counters */
- {
- int nBytes;
-
- nBytes = nBits>>3;
- pSi->numTotalBytes += nBytes;
- if (IS_OUTPUT_VALID(ErrorStatus)) {
- pSi->numTotalAccessUnits++;
- }
- if (IS_DECODE_ERROR(ErrorStatus)) {
- pSi->numBadBytes += nBytes;
- pSi->numBadAccessUnits++;
- }
- }
-}
-
-static INT aacDecoder_EstimateNumberOfLostFrames(HANDLE_AACDECODER self)
-{
- INT n;
-
- transportDec_GetMissingAccessUnitCount( &n, self->hInput);
-
- return n;
-}
-
-LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame(
- HANDLE_AACDECODER self,
- INT_PCM *pTimeData,
- const INT timeDataSize,
- const UINT flags)
-{
- AAC_DECODER_ERROR ErrorStatus;
- INT layer;
- INT nBits;
- INT interleaved = self->outputInterleaved;
- HANDLE_FDK_BITSTREAM hBs;
- int fTpInterruption = 0; /* Transport originated interruption detection. */
- int fTpConceal = 0; /* Transport originated concealment. */
-
-
- if (self == NULL) {
- return AAC_DEC_INVALID_HANDLE;
- }
-
- if (flags & AACDEC_INTR) {
- self->streamInfo.numLostAccessUnits = 0;
- }
-
- hBs = transportDec_GetBitstream(self->hInput, 0);
-
- /* Get current bits position for bitrate calculation. */
- nBits = FDKgetValidBits(hBs);
- if (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH) ) )
- {
- TRANSPORTDEC_ERROR err;
-
- for(layer = 0; layer < self->nrOfLayers; layer++)
- {
- err = transportDec_ReadAccessUnit(self->hInput, layer);
- if (err != TRANSPORTDEC_OK) {
- switch (err) {
- case TRANSPORTDEC_NOT_ENOUGH_BITS:
- ErrorStatus = AAC_DEC_NOT_ENOUGH_BITS;
- goto bail;
- case TRANSPORTDEC_SYNC_ERROR:
- self->streamInfo.numLostAccessUnits = aacDecoder_EstimateNumberOfLostFrames(self);
- fTpInterruption = 1;
- break;
- case TRANSPORTDEC_NEED_TO_RESTART:
- ErrorStatus = AAC_DEC_NEED_TO_RESTART;
- goto bail;
- case TRANSPORTDEC_CRC_ERROR:
- fTpConceal = 1;
- break;
- default:
- ErrorStatus = AAC_DEC_UNKNOWN;
- goto bail;
- }
- }
- }
- } else {
- if (self->streamInfo.numLostAccessUnits > 0) {
- self->streamInfo.numLostAccessUnits--;
- }
- }
-
- /* Signal bit stream interruption to other modules if required. */
- if ( fTpInterruption || (flags & (AACDEC_INTR|AACDEC_CLRHIST)) )
- {
- aacDecoder_SignalInterruption(self);
- if ( ! (flags & AACDEC_INTR) ) {
- ErrorStatus = AAC_DEC_TRANSPORT_SYNC_ERROR;
- goto bail;
- }
- }
-
- /* Empty bit buffer in case of flush request. */
- if (flags & AACDEC_FLUSH)
- {
- transportDec_SetParam(self->hInput, TPDEC_PARAM_RESET, 1);
- self->streamInfo.numLostAccessUnits = 0;
- self->streamInfo.numBadBytes = 0;
- self->streamInfo.numTotalBytes = 0;
- }
-
-
- ErrorStatus = CAacDecoder_DecodeFrame(self,
- flags | (fTpConceal ? AACDEC_CONCEAL : 0),
- pTimeData,
- timeDataSize,
- interleaved);
-
- if (!(flags & (AACDEC_CONCEAL|AACDEC_FLUSH))) {
- TRANSPORTDEC_ERROR tpErr;
- tpErr = transportDec_EndAccessUnit(self->hInput);
- if (tpErr != TRANSPORTDEC_OK) {
- self->frameOK = 0;
- }
- }
-
- /* If the current pTimeData does not contain a valid signal, there nothing else we can do, so bail. */
- if ( ! IS_OUTPUT_VALID(ErrorStatus) ) {
- goto bail;
- }
-
- {
- /* Export data into streaminfo structure */
- self->streamInfo.sampleRate = self->streamInfo.aacSampleRate;
- self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame;
- }
- self->streamInfo.numChannels = self->streamInfo.aacNumChannels;
-
-
-
- CAacDecoder_SyncQmfMode(self);
-
-/* sbr decoder */
-
- if (ErrorStatus || (flags & AACDEC_CONCEAL) || self->pAacDecoderStaticChannelInfo[0]->concealmentInfo.concealState > ConcealState_FadeIn)
- {
- self->frameOK = 0; /* if an error has occured do concealment in the SBR decoder too */
- }
-
- if (self->sbrEnabled)
- {
- SBR_ERROR sbrError = SBRDEC_OK;
-
- /* set params */
- sbrDecoder_SetParam ( self->hSbrDecoder,
- SBR_SYSTEM_BITSTREAM_DELAY,
- self->sbrParams.bsDelay);
-
- if ( self->streamInfo.aot == AOT_ER_AAC_ELD ) {
- /* Configure QMF */
- sbrDecoder_SetParam ( self->hSbrDecoder,
- SBR_LD_QMF_TIME_ALIGN,
- (self->flags & AC_LD_MPS) ? 1 : 0 );
- }
-
-
-
-
- /* apply SBR processing */
- sbrError = sbrDecoder_Apply ( self->hSbrDecoder,
- pTimeData,
- &self->streamInfo.numChannels,
- &self->streamInfo.sampleRate,
- self->channelOutputMapping[self->streamInfo.numChannels-1],
- interleaved,
- self->frameOK,
- &self->psPossible);
-
-
- if (sbrError == SBRDEC_OK) {
-
- /* Update data in streaminfo structure. Assume that the SBR upsampling factor is either 1 or 2 */
- self->flags |= AC_SBR_PRESENT;
- if (self->streamInfo.aacSampleRate != self->streamInfo.sampleRate) {
- if (self->streamInfo.frameSize == 768) {
- self->streamInfo.frameSize = (self->streamInfo.aacSamplesPerFrame * 8) / 3;
- } else {
- self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame << 1;
- }
- }
-
- if (self->psPossible) {
- self->flags |= AC_PS_PRESENT;
- self->channelType[0] = ACT_FRONT;
- self->channelType[1] = ACT_FRONT;
- self->channelIndices[0] = 0;
- self->channelIndices[1] = 1;
- } else {
- self->flags &= ~AC_PS_PRESENT;
- }
- }
- }
-
-
- if ( flags & (AACDEC_INTR | AACDEC_CLRHIST) ) {
- /* delete data from the past (e.g. mixdown coeficients) */
- pcmDmx_Reset( self->hPcmUtils, PCMDMX_RESET_BS_DATA );
- }
- /* do PCM post processing */
- pcmDmx_ApplyFrame (
- self->hPcmUtils,
- pTimeData,
- self->streamInfo.frameSize,
- &self->streamInfo.numChannels,
- interleaved,
- self->channelType,
- self->channelIndices,
- self->channelOutputMapping
- );
-
-
-
- /* Signal interruption to take effect in next frame. */
- if ( flags & AACDEC_FLUSH ) {
- aacDecoder_SignalInterruption(self);
- }
-
- /* Update externally visible copy of flags */
- self->streamInfo.flags = self->flags;
-
-bail:
-
- /* Update Statistics */
- aacDecoder_UpdateBitStreamCounters(&self->streamInfo, hBs, nBits, ErrorStatus);
-
- return ErrorStatus;
-}
-
-LINKSPEC_CPP void aacDecoder_Close ( HANDLE_AACDECODER self )
-{
- if (self == NULL)
- return;
-
-
-
- if (self->hPcmUtils != NULL) {
- pcmDmx_Close( &self->hPcmUtils );
- }
-
-
-
- if (self->hSbrDecoder != NULL) {
- sbrDecoder_Close(&self->hSbrDecoder);
- }
-
- if (self->hInput != NULL) {
- transportDec_Close(&self->hInput);
- }
-
- CAacDecoder_Close(self);
-}
-
-
-LINKSPEC_CPP CStreamInfo* aacDecoder_GetStreamInfo ( HANDLE_AACDECODER self )
-{
- return CAacDecoder_GetStreamInfo(self);
-}
-
-LINKSPEC_CPP INT aacDecoder_GetLibInfo ( LIB_INFO *info )
-{
- int i;
-
- if (info == NULL) {
- return -1;
- }
-
- sbrDecoder_GetLibInfo( info );
- transportDec_GetLibInfo( info );
- FDK_toolsGetLibInfo( info );
- pcmDmx_GetLibInfo( info );
-
- /* search for next free tab */
- for (i = 0; i < FDK_MODULE_LAST; i++) {
- if (info[i].module_id == FDK_NONE) break;
- }
- if (i == FDK_MODULE_LAST) {
- return -1;
- }
- info += i;
-
- info->module_id = FDK_AACDEC;
- /* build own library info */
- info->version = LIB_VERSION(AACDECODER_LIB_VL0, AACDECODER_LIB_VL1, AACDECODER_LIB_VL2);
- LIB_VERSION_STRING(info);
- info->build_date = AACDECODER_LIB_BUILD_DATE;
- info->build_time = AACDECODER_LIB_BUILD_TIME;
- info->title = AACDECODER_LIB_TITLE;
-
- /* Set flags */
- info->flags = 0
- | CAPF_AAC_LC
- | CAPF_AAC_VCB11
- | CAPF_AAC_HCR
- | CAPF_AAC_RVLC
- | CAPF_ER_AAC_LD
- | CAPF_ER_AAC_ELD
- | CAPF_AAC_CONCEALMENT
- | CAPF_AAC_DRC
-
- | CAPF_AAC_MPEG4
-
-
- | CAPF_AAC_1024
- | CAPF_AAC_960
-
- | CAPF_AAC_512
-
- | CAPF_AAC_480
-
- ;
- /* End of flags */
-
- return 0;
-}
-
-
-
-