| /* ----------------------------------------------------------------------------- |
| Software License for The Fraunhofer FDK AAC Codec Library for Android |
| |
| © Copyright 1995 - 2018 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 |
| ----------------------------------------------------------------------------- */ |
| |
| /**************************** AAC decoder library ****************************** |
| |
| Author(s): Josef Hoepfl |
| |
| Description: |
| |
| *******************************************************************************/ |
| |
| #ifndef AACDECODER_H |
| #define AACDECODER_H |
| |
| #include "common_fix.h" |
| |
| #include "FDK_bitstream.h" |
| |
| #include "channel.h" |
| |
| #include "tpdec_lib.h" |
| #include "FDK_audio.h" |
| |
| #include "block.h" |
| |
| #include "genericStds.h" |
| |
| #include "FDK_qmf_domain.h" |
| |
| #include "sbrdecoder.h" |
| |
| #include "aacdec_drc.h" |
| |
| #include "pcmdmx_lib.h" |
| |
| #include "FDK_drcDecLib.h" |
| |
| #include "limiter.h" |
| |
| #include "FDK_delay.h" |
| |
| #define TIME_DATA_FLUSH_SIZE (128) |
| #define TIME_DATA_FLUSH_SIZE_SF (7) |
| |
| #define AACDEC_MAX_NUM_PREROLL_AU_USAC (3) |
| #if (AACDEC_MAX_NUM_PREROLL_AU < 3) |
| #undef AACDEC_MAX_NUM_PREROLL_AU |
| #define AACDEC_MAX_NUM_PREROLL_AU AACDEC_MAX_NUM_PREROLL_AU_USAC |
| #endif |
| |
| typedef struct AAC_DECODER_INSTANCE *HANDLE_AACDECODER; |
| |
| enum { L = 0, R = 1 }; |
| |
| typedef struct { |
| unsigned char *buffer; |
| int bufferSize; |
| int offset[8]; |
| int nrElements; |
| } CAncData; |
| |
| typedef enum { NOT_DEFINED = -1, MODE_HQ = 0, MODE_LP = 1 } QMF_MODE; |
| |
| typedef struct { |
| int bsDelay; |
| } SBR_PARAMS; |
| |
| enum { |
| AACDEC_FLUSH_OFF = 0, |
| AACDEC_RSV60_CFG_CHANGE_ATSC_FLUSH_ON = 1, |
| AACDEC_RSV60_DASH_IPF_ATSC_FLUSH_ON = 2, |
| AACDEC_USAC_DASH_IPF_FLUSH_ON = 3 |
| }; |
| |
| enum { |
| AACDEC_BUILD_UP_OFF = 0, |
| AACDEC_RSV60_BUILD_UP_ON = 1, |
| AACDEC_RSV60_BUILD_UP_ON_IN_BAND = 2, |
| AACDEC_USAC_BUILD_UP_ON = 3, |
| AACDEC_RSV60_BUILD_UP_IDLE = 4, |
| AACDEC_RSV60_BUILD_UP_IDLE_IN_BAND = 5 |
| }; |
| |
| typedef struct { |
| /* Usac Extension Elements */ |
| USAC_EXT_ELEMENT_TYPE usacExtElementType[(3)]; |
| UINT usacExtElementDefaultLength[(3)]; |
| UCHAR usacExtElementPayloadFrag[(3)]; |
| } CUsacCoreExtensions; |
| |
| /* AAC decoder (opaque toward userland) struct declaration */ |
| struct AAC_DECODER_INSTANCE { |
| INT aacChannels; /*!< Amount of AAC decoder channels allocated. */ |
| INT ascChannels[(1 * |
| 1)]; /*!< Amount of AAC decoder channels signalled in ASC. */ |
| INT blockNumber; /*!< frame counter */ |
| |
| INT nrOfLayers; |
| |
| INT outputInterleaved; /*!< PCM output format (interleaved/none interleaved). |
| */ |
| |
| HANDLE_TRANSPORTDEC hInput; /*!< Transport layer handle. */ |
| |
| SamplingRateInfo |
| samplingRateInfo[(1 * 1)]; /*!< Sampling Rate information table */ |
| |
| UCHAR |
| frameOK; /*!< Will be unset if a consistency check, e.g. CRC etc. fails */ |
| |
| UINT flags[(1 * 1)]; /*!< Flags for internal decoder use. DO NOT USE |
| self::streaminfo::flags ! */ |
| UINT elFlags[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + |
| 1)]; /*!< Flags for internal decoder use (element specific). DO |
| NOT USE self::streaminfo::flags ! */ |
| |
| MP4_ELEMENT_ID elements[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + |
| 1)]; /*!< Table where the element Id's are listed */ |
| UCHAR elTags[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + |
| 1)]; /*!< Table where the elements id Tags are listed */ |
| UCHAR chMapping[((8) * 2)]; /*!< Table of MPEG canonical order to bitstream |
| channel order mapping. */ |
| |
| AUDIO_CHANNEL_TYPE channelType[(8)]; /*!< Audio channel type of each output |
| audio channel (from 0 upto |
| numChannels). */ |
| UCHAR channelIndices[(8)]; /*!< Audio channel index for each output audio |
| channel (from 0 upto numChannels). */ |
| /* See ISO/IEC 13818-7:2005(E), 8.5.3.2 Explicit channel mapping using a |
| * program_config_element() */ |
| |
| FDK_channelMapDescr mapDescr; /*!< Describes the output channel mapping. */ |
| UCHAR chMapIndex; /*!< Index to access one line of the channelOutputMapping |
| table. This is required because not all 8 channel |
| configurations have the same output mapping. */ |
| INT sbrDataLen; /*!< Expected length of the SBR remaining in bitbuffer after |
| the AAC payload has been pared. */ |
| |
| CProgramConfig pce; |
| CStreamInfo |
| streamInfo; /*!< Pointer to StreamInfo data (read from the bitstream) */ |
| CAacDecoderChannelInfo |
| *pAacDecoderChannelInfo[(8)]; /*!< Temporal channel memory */ |
| CAacDecoderStaticChannelInfo |
| *pAacDecoderStaticChannelInfo[(8)]; /*!< Persistent channel memory */ |
| |
| FIXP_DBL *workBufferCore2; |
| PCM_DEC *pTimeData2; |
| INT timeData2Size; |
| |
| CpePersistentData *cpeStaticData[( |
| 3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + |
| 1)]; /*!< Pointer to persistent data shared by both channels of a CPE. |
| This structure is allocated once for each CPE. */ |
| |
| CConcealParams concealCommonData; |
| CConcealmentMethod concealMethodUser; |
| |
| CUsacCoreExtensions usacCoreExt; /*!< Data and handles to extend USAC FD/LPD |
| core decoder (SBR, MPS, ...) */ |
| UINT numUsacElements[(1 * 1)]; |
| UCHAR usacStereoConfigIndex[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 1)]; |
| const CSUsacConfig *pUsacConfig[(1 * 1)]; |
| INT nbDiv; /*!< number of frame divisions in LPD-domain */ |
| |
| UCHAR useLdQmfTimeAlign; |
| |
| INT aacChannelsPrev; /*!< The amount of AAC core channels of the last |
| successful decode call. */ |
| AUDIO_CHANNEL_TYPE channelTypePrev[(8)]; /*!< Array holding the channelType |
| values of the last successful |
| decode call. */ |
| UCHAR |
| channelIndicesPrev[(8)]; /*!< Array holding the channelIndices values of |
| the last successful decode call. */ |
| |
| UCHAR |
| downscaleFactor; /*!< Variable to store a supported ELD downscale factor |
| of 1, 2, 3 or 4 */ |
| UCHAR downscaleFactorInBS; /*!< Variable to store the (not necessarily |
| supported) ELD downscale factor discovered in |
| the bitstream */ |
| |
| HANDLE_SBRDECODER hSbrDecoder; /*!< SBR decoder handle. */ |
| UCHAR sbrEnabled; /*!< flag to store if SBR has been detected */ |
| UCHAR sbrEnabledPrev; /*!< flag to store if SBR has been detected from |
| previous frame */ |
| UCHAR psPossible; /*!< flag to store if PS is possible */ |
| SBR_PARAMS sbrParams; /*!< struct to store all sbr parameters */ |
| |
| UCHAR *pDrmBsBuffer; /*!< Pointer to dynamic buffer which is used to reverse |
| the bits of the DRM SBR payload */ |
| USHORT drmBsBufferSize; /*!< Size of the dynamic buffer which is used to |
| reverse the bits of the DRM SBR payload */ |
| FDK_QMF_DOMAIN |
| qmfDomain; /*!< Instance of module for QMF domain data handling */ |
| |
| QMF_MODE qmfModeCurr; /*!< The current QMF mode */ |
| QMF_MODE qmfModeUser; /*!< The QMF mode requested by the library user */ |
| |
| HANDLE_AAC_DRC hDrcInfo; /*!< handle to DRC data structure */ |
| INT metadataExpiry; /*!< Metadata expiry time in milli-seconds. */ |
| |
| void *pMpegSurroundDecoder; /*!< pointer to mpeg surround decoder structure */ |
| UCHAR mpsEnableUser; /*!< MPS enable user flag */ |
| UCHAR mpsEnableCurr; /*!< MPS enable decoder state */ |
| UCHAR mpsApplicable; /*!< MPS applicable */ |
| SCHAR mpsOutputMode; /*!< setting: normal = 0, binaural = 1, stereo = 2, 5.1ch |
| = 3 */ |
| INT mpsOutChannelsLast; /*!< The amount of channels returned by the last |
| successful MPS decoder call. */ |
| INT mpsFrameSizeLast; /*!< The frame length returned by the last successful |
| MPS decoder call. */ |
| |
| CAncData ancData; /*!< structure to handle ancillary data */ |
| |
| HANDLE_PCM_DOWNMIX hPcmUtils; /*!< privat data for the PCM utils. */ |
| |
| TDLimiterPtr hLimiter; /*!< Handle of time domain limiter. */ |
| UCHAR limiterEnableUser; /*!< The limiter configuration requested by the |
| library user */ |
| UCHAR limiterEnableCurr; /*!< The current limiter configuration. */ |
| FIXP_DBL extGain[1]; /*!< Gain that must be applied to the output signal. */ |
| UINT extGainDelay; /*!< Delay that must be accounted for extGain. */ |
| |
| INT_PCM pcmOutputBuffer[(8) * (1024 * 2)]; |
| |
| HANDLE_DRC_DECODER hUniDrcDecoder; |
| UCHAR multibandDrcPresent; |
| UCHAR numTimeSlots; |
| UINT loudnessInfoSetPosition[3]; |
| SCHAR defaultTargetLoudness; |
| |
| INT_PCM |
| *pTimeDataFlush[((8) * 2)]; /*!< Pointer to the flushed time data which |
| will be used for the crossfade in case of |
| an USAC DASH IPF config change */ |
| |
| UCHAR flushStatus; /*!< Indicates flush status: on|off */ |
| SCHAR flushCnt; /*!< Flush frame counter */ |
| UCHAR buildUpStatus; /*!< Indicates build up status: on|off */ |
| SCHAR buildUpCnt; /*!< Build up frame counter */ |
| UCHAR hasAudioPreRoll; /*!< Indicates preRoll status: on|off */ |
| UINT prerollAULength[AACDEC_MAX_NUM_PREROLL_AU + 1]; /*!< Relative offset of |
| the prerollAU end |
| position to the AU |
| start position in the |
| bitstream */ |
| INT accessUnit; /*!< Number of the actual processed preroll accessUnit */ |
| UCHAR applyCrossfade; /*!< if set crossfade for seamless stream switching is |
| applied */ |
| |
| FDK_SignalDelay usacResidualDelay; /*!< Delay residual signal to compensate |
| for eSBR delay of DMX signal in case of |
| stereoConfigIndex==2. */ |
| }; |
| |
| #define AAC_DEBUG_EXTHLP \ |
| "\ |
| --- AAC-Core ---\n\ |
| 0x00010000 Header data\n\ |
| 0x00020000 CRC data\n\ |
| 0x00040000 Channel info\n\ |
| 0x00080000 Section data\n\ |
| 0x00100000 Scalefactor data\n\ |
| 0x00200000 Pulse data\n\ |
| 0x00400000 Tns data\n\ |
| 0x00800000 Quantized spectrum\n\ |
| 0x01000000 Requantized spectrum\n\ |
| 0x02000000 Time output\n\ |
| 0x04000000 Fatal errors\n\ |
| 0x08000000 Buffer fullness\n\ |
| 0x10000000 Average bitrate\n\ |
| 0x20000000 Synchronization\n\ |
| 0x40000000 Concealment\n\ |
| 0x7FFF0000 all AAC-Core-Info\n\ |
| " |
| |
| /** |
| * \brief Synchronise QMF mode for all modules using QMF data. |
| * \param self decoder handle |
| */ |
| void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self); |
| |
| /** |
| * \brief Signal a bit stream interruption to the decoder |
| * \param self decoder handle |
| */ |
| void CAacDecoder_SignalInterruption(HANDLE_AACDECODER self); |
| |
| /*! |
| \brief Initialize ancillary buffer |
| |
| \ancData Pointer to ancillary data structure |
| \buffer Pointer to (external) anc data buffer |
| \size Size of the buffer pointed on by buffer |
| |
| \return Error code |
| */ |
| AAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData, |
| unsigned char *buffer, int size); |
| |
| /*! |
| \brief Get one ancillary data element |
| |
| \ancData Pointer to ancillary data structure |
| \index Index of the anc data element to get |
| \ptr Pointer to a buffer receiving a pointer to the requested anc data element |
| \size Pointer to a buffer receiving the length of the requested anc data |
| element |
| |
| \return Error code |
| */ |
| AAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index, |
| unsigned char **ptr, int *size); |
| |
| /* initialization of aac decoder */ |
| LINKSPEC_H HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat); |
| |
| /* Initialization of channel elements */ |
| LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, |
| const CSAudioSpecificConfig *asc, |
| UCHAR configMode, |
| UCHAR *configChanged); |
| /*! |
| \brief Decodes one aac frame |
| |
| The function decodes one aac frame. The decoding of coupling channel |
| elements are not supported. The transport layer might signal, that the |
| data of the current frame is invalid, e.g. as a result of a packet |
| loss in streaming mode. |
| The bitstream position of transportDec_GetBitstream(self->hInput) must |
| be exactly the end of the access unit, including all byte alignment bits. |
| For this purpose, the variable auStartAnchor is used. |
| |
| \return error status |
| */ |
| LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_DecodeFrame( |
| HANDLE_AACDECODER self, const UINT flags, FIXP_PCM *pTimeData, |
| const INT timeDataSize, const int timeDataChannelOffset); |
| |
| /* Free config dependent AAC memory */ |
| LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_FreeMem(HANDLE_AACDECODER self, |
| const int subStreamIndex); |
| |
| /* Prepare crossfade for USAC DASH IPF config change */ |
| LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_PrepareCrossFade( |
| const INT_PCM *pTimeData, INT_PCM **pTimeDataFlush, const INT numChannels, |
| const INT frameSize, const INT interleaved); |
| |
| /* Apply crossfade for USAC DASH IPF config change */ |
| LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_ApplyCrossFade( |
| INT_PCM *pTimeData, INT_PCM **pTimeDataFlush, const INT numChannels, |
| const INT frameSize, const INT interleaved); |
| |
| /* Set flush and build up mode */ |
| LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_CtrlCFGChange(HANDLE_AACDECODER self, |
| UCHAR flushStatus, |
| SCHAR flushCnt, |
| UCHAR buildUpStatus, |
| SCHAR buildUpCnt); |
| |
| /* Parse preRoll Extension Payload */ |
| LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_PreRollExtensionPayloadParse( |
| HANDLE_AACDECODER self, UINT *numPrerollAU, UINT *prerollAUOffset, |
| UINT *prerollAULength); |
| |
| /* Destroy aac decoder */ |
| LINKSPEC_H void CAacDecoder_Close(HANDLE_AACDECODER self); |
| |
| /* get streaminfo handle from decoder */ |
| LINKSPEC_H CStreamInfo *CAacDecoder_GetStreamInfo(HANDLE_AACDECODER self); |
| |
| #endif /* #ifndef AACDECODER_H */ |