| /* ----------------------------------------------------------------------------- |
| 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 encoder library ****************************** |
| |
| Author(s): M. Schug / A. Groeschel |
| |
| Description: fast aac coder interface library functions |
| |
| *******************************************************************************/ |
| |
| #ifndef AACENC_H |
| #define AACENC_H |
| |
| #include "common_fix.h" |
| #include "FDK_audio.h" |
| |
| #include "tpenc_lib.h" |
| |
| #include "sbr_encoder.h" |
| |
| #define MIN_BUFSIZE_PER_EFF_CHAN 6144 |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* |
| * AAC-LC error codes. |
| */ |
| typedef enum { |
| AAC_ENC_OK = 0x0000, /*!< All fine. */ |
| |
| AAC_ENC_UNKNOWN = 0x0002, /*!< Error condition is of unknown reason, or from |
| another module. */ |
| |
| /* initialization errors */ |
| aac_enc_init_error_start = 0x2000, |
| AAC_ENC_INVALID_HANDLE = 0x2020, /*!< The handle passed to the function call |
| was invalid (probably NULL). */ |
| AAC_ENC_INVALID_FRAME_LENGTH = |
| 0x2080, /*!< Invalid frame length (must be 1024 or 960). */ |
| AAC_ENC_INVALID_N_CHANNELS = |
| 0x20e0, /*!< Invalid amount of audio input channels. */ |
| AAC_ENC_INVALID_SFB_TABLE = 0x2140, /*!< Internal encoder error. */ |
| |
| AAC_ENC_UNSUPPORTED_AOT = |
| 0x3000, /*!< The Audio Object Type (AOT) is not supported. */ |
| AAC_ENC_UNSUPPORTED_FILTERBANK = |
| 0x3010, /*!< Filterbank type is not supported. */ |
| AAC_ENC_UNSUPPORTED_BITRATE = |
| 0x3020, /*!< The chosen bitrate is not supported. */ |
| AAC_ENC_UNSUPPORTED_BITRATE_MODE = |
| 0x3028, /*!< Unsupported bit rate mode (CBR or VBR). */ |
| AAC_ENC_UNSUPPORTED_ANC_BITRATE = |
| 0x3040, /*!< Unsupported ancillay bitrate. */ |
| AAC_ENC_UNSUPPORTED_ANC_MODE = 0x3060, |
| AAC_ENC_UNSUPPORTED_TRANSPORT_TYPE = |
| 0x3080, /*!< The bitstream format is not supported. */ |
| AAC_ENC_UNSUPPORTED_ER_FORMAT = |
| 0x30a0, /*!< The error resilience tool format is not supported. */ |
| AAC_ENC_UNSUPPORTED_EPCONFIG = |
| 0x30c0, /*!< The error protection format is not supported. */ |
| AAC_ENC_UNSUPPORTED_CHANNELCONFIG = |
| 0x30e0, /*!< The channel configuration (either number or arrangement) is |
| not supported. */ |
| AAC_ENC_UNSUPPORTED_SAMPLINGRATE = |
| 0x3100, /*!< Sample rate of audio input is not supported. */ |
| AAC_ENC_NO_MEMORY = 0x3120, /*!< Could not allocate memory. */ |
| AAC_ENC_PE_INIT_TABLE_NOT_FOUND = 0x3140, /*!< Internal encoder error. */ |
| |
| aac_enc_init_error_end, |
| |
| /* encode errors */ |
| aac_enc_error_start = 0x4000, |
| AAC_ENC_QUANT_ERROR = 0x4020, /*!< Too many bits used in quantization. */ |
| AAC_ENC_WRITTEN_BITS_ERROR = |
| 0x4040, /*!< Unexpected number of written bits, differs to |
| calculated number of bits. */ |
| AAC_ENC_PNS_TABLE_ERROR = 0x4060, /*!< PNS level out of range. */ |
| AAC_ENC_GLOBAL_GAIN_TOO_HIGH = 0x4080, /*!< Internal quantizer error. */ |
| AAC_ENC_BITRES_TOO_LOW = 0x40a0, /*!< Too few bits in bit reservoir. */ |
| AAC_ENC_BITRES_TOO_HIGH = 0x40a1, /*!< Too many bits in bit reservoir. */ |
| AAC_ENC_INVALID_CHANNEL_BITRATE = 0x4100, |
| AAC_ENC_INVALID_ELEMENTINFO_TYPE = 0x4120, /*!< Internal encoder error. */ |
| |
| AAC_ENC_WRITE_SCAL_ERROR = 0x41e0, /*!< Error writing scalefacData. */ |
| AAC_ENC_WRITE_SEC_ERROR = 0x4200, /*!< Error writing sectionData. */ |
| AAC_ENC_WRITE_SPEC_ERROR = 0x4220, /*!< Error writing spectralData. */ |
| aac_enc_error_end |
| |
| } AAC_ENCODER_ERROR; |
| /*-------------------------- defines --------------------------------------*/ |
| |
| #define ANC_DATA_BUFFERSIZE 1024 /* ancBuffer size */ |
| |
| #define MAX_TOTAL_EXT_PAYLOADS ((((8)) * (1)) + (2 + 2)) |
| |
| typedef enum { |
| AACENC_BR_MODE_INVALID = -1, /*!< Invalid bitrate mode. */ |
| AACENC_BR_MODE_CBR = 0, /*!< Constant bitrate mode. */ |
| AACENC_BR_MODE_VBR_1 = 1, /*!< Variable bitrate mode, very low bitrate. */ |
| AACENC_BR_MODE_VBR_2 = 2, /*!< Variable bitrate mode, low bitrate. */ |
| AACENC_BR_MODE_VBR_3 = 3, /*!< Variable bitrate mode, medium bitrate. */ |
| AACENC_BR_MODE_VBR_4 = 4, /*!< Variable bitrate mode, high bitrate. */ |
| AACENC_BR_MODE_VBR_5 = 5, /*!< Variable bitrate mode, very high bitrate. */ |
| AACENC_BR_MODE_FF = 6, /*!< Fixed frame mode. */ |
| AACENC_BR_MODE_SFR = 7 /*!< Superframe mode. */ |
| |
| } AACENC_BITRATE_MODE; |
| |
| #define AACENC_BR_MODE_IS_VBR(brMode) ((brMode >= 1) && (brMode <= 5)) |
| |
| typedef enum { |
| |
| CH_ORDER_MPEG = |
| 0, /*!< MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE) */ |
| CH_ORDER_WAV /*!< WAV fileformat channel ordering (e. g. 5.1: L, R, C, LFE, |
| SL, SR) */ |
| |
| } CHANNEL_ORDER; |
| |
| /*-------------------- structure definitions ------------------------------*/ |
| |
| struct AACENC_CONFIG { |
| INT sampleRate; /* encoder sample rate */ |
| INT bitRate; /* encoder bit rate in bits/sec */ |
| INT ancDataBitRate; /* additional bits consumed by anc data or sbr have to be |
| consiedered while configuration */ |
| |
| INT nSubFrames; /* number of frames in super frame (not ADTS/LATM subframes !) |
| */ |
| AUDIO_OBJECT_TYPE audioObjectType; /* Audio Object Type */ |
| |
| INT averageBits; /* encoder bit rate in bits/superframe */ |
| AACENC_BITRATE_MODE bitrateMode; /* encoder bitrate mode (CBR/VBR) */ |
| INT nChannels; /* number of channels to process */ |
| CHANNEL_ORDER channelOrder; /* input Channel ordering scheme. */ |
| INT bandWidth; /* targeted audio bandwidth in Hz */ |
| CHANNEL_MODE channelMode; /* encoder channel mode configuration */ |
| INT framelength; /* used frame size */ |
| |
| UINT syntaxFlags; /* bitstreams syntax configuration */ |
| SCHAR epConfig; /* error protection configuration */ |
| |
| INT anc_Rate; /* ancillary rate, 0 (disabled), -1 (default) else desired rate |
| */ |
| UINT maxAncBytesPerAU; |
| INT minBitsPerFrame; /* minimum number of bits in AU */ |
| INT maxBitsPerFrame; /* maximum number of bits in AU */ |
| |
| INT audioMuxVersion; /* audio mux version in loas/latm transport format */ |
| |
| UINT sbrRatio; /* sbr sampling rate ratio: dual- or single-rate */ |
| |
| UCHAR useTns; /* flag: use temporal noise shaping */ |
| UCHAR usePns; /* flag: use perceptual noise substitution */ |
| UCHAR useIS; /* flag: use intensity coding */ |
| UCHAR useMS; /* flag: use ms stereo tool */ |
| |
| UCHAR useRequant; /* flag: use afterburner */ |
| |
| UINT downscaleFactor; |
| }; |
| |
| typedef struct { |
| UCHAR *pData; /* pointer to extension payload data */ |
| UINT dataSize; /* extension payload data size in bits */ |
| EXT_PAYLOAD_TYPE dataType; /* extension payload data type */ |
| INT associatedChElement; /* number of the channel element the data is assigned |
| to */ |
| } AACENC_EXT_PAYLOAD; |
| |
| typedef struct AAC_ENC *HANDLE_AAC_ENC; |
| |
| /** |
| * \brief Calculate framesize in bits for given bit rate, frame length and |
| * sampling rate. |
| * |
| * \param bitRate Ttarget bitrate in bits per second. |
| * \param frameLength Number of audio samples in one frame. |
| * \param samplingRate Sampling rate in Hz. |
| * |
| * \return Framesize in bits per frame. |
| */ |
| INT FDKaacEnc_CalcBitsPerFrame(const INT bitRate, const INT frameLength, |
| const INT samplingRate); |
| |
| /** |
| * \brief Calculate bitrate in bits per second for given framesize, frame length |
| * and sampling rate. |
| * |
| * \param bitsPerFrame Framesize in bits per frame |
| * \param frameLength Number of audio samples in one frame. |
| * \param samplingRate Sampling rate in Hz. |
| * |
| * \return Bitrate in bits per second. |
| */ |
| INT FDKaacEnc_CalcBitrate(const INT bitsPerFrame, const INT frameLength, |
| const INT samplingRate); |
| |
| /** |
| * \brief Limit given bit rate to a valid value |
| * \param hTpEnc transport encoder handle |
| * \param aot audio object type |
| * \param coreSamplingRate the sample rate to be used for the AAC encoder |
| * \param frameLength the frameLength to be used for the AAC encoder |
| * \param nChannels number of total channels |
| * \param nChannelsEff number of effective channels |
| * \param bitRate the initial bit rate value for which the closest valid bit |
| * rate value is searched for |
| * \param averageBits average bits per frame for fixed framing. Set to -1 if not |
| * available. |
| * \param optional pointer where the current bits per frame are stored into. |
| * \param bitrateMode the current bit rate mode |
| * \param nSubFrames number of sub frames for super framing (not transport |
| * frames). |
| * \return a valid bit rate value as close as possible or identical to bitRate |
| */ |
| INT FDKaacEnc_LimitBitrate(HANDLE_TRANSPORTENC hTpEnc, AUDIO_OBJECT_TYPE aot, |
| INT coreSamplingRate, INT frameLength, INT nChannels, |
| INT nChannelsEff, INT bitRate, INT averageBits, |
| INT *pAverageBitsPerFrame, |
| AACENC_BITRATE_MODE bitrateMode, INT nSubFrames); |
| |
| /** |
| * \brief Get current state of the bit reservoir |
| * \param hAacEncoder encoder handle |
| * \return bit reservoir state in bits |
| */ |
| INT FDKaacEnc_GetBitReservoirState(const HANDLE_AAC_ENC hAacEncoder); |
| |
| /*----------------------------------------------------------------------------- |
| |
| functionname: FDKaacEnc_GetVBRBitrate |
| description: Get VBR bitrate from vbr quality |
| input params: int vbrQuality (VBR0, VBR1, VBR2) |
| channelMode |
| returns: vbr bitrate |
| |
| ------------------------------------------------------------------------------*/ |
| INT FDKaacEnc_GetVBRBitrate(AACENC_BITRATE_MODE bitrateMode, |
| CHANNEL_MODE channelMode); |
| |
| /*----------------------------------------------------------------------------- |
| |
| functionname: FDKaacEnc_AacInitDefaultConfig |
| description: gives reasonable default configuration |
| returns: --- |
| |
| ------------------------------------------------------------------------------*/ |
| void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config); |
| |
| /*--------------------------------------------------------------------------- |
| |
| functionname:FDKaacEnc_Open |
| description: allocate and initialize a new encoder instance |
| returns: 0 if success |
| |
| ---------------------------------------------------------------------------*/ |
| AAC_ENCODER_ERROR FDKaacEnc_Open( |
| HANDLE_AAC_ENC |
| *phAacEnc, /* pointer to an encoder handle, initialized on return */ |
| const INT nElements, /* number of maximal elements in instance to support */ |
| const INT nChannels, /* number of maximal channels in instance to support */ |
| const INT nSubFrames); /* support superframing in instance */ |
| |
| AAC_ENCODER_ERROR FDKaacEnc_Initialize( |
| HANDLE_AAC_ENC |
| hAacEncoder, /* pointer to an encoder handle, initialized on return */ |
| AACENC_CONFIG *config, /* pre-initialized config struct */ |
| HANDLE_TRANSPORTENC hTpEnc, ULONG initFlags); |
| |
| /*--------------------------------------------------------------------------- |
| |
| functionname: FDKaacEnc_EncodeFrame |
| description: encode one frame |
| returns: 0 if success |
| |
| ---------------------------------------------------------------------------*/ |
| |
| AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( |
| HANDLE_AAC_ENC hAacEnc, /* encoder handle */ |
| HANDLE_TRANSPORTENC hTpEnc, INT_PCM *inputBuffer, |
| const UINT inputBufferBufSize, INT *numOutBytes, |
| AACENC_EXT_PAYLOAD extPayload[MAX_TOTAL_EXT_PAYLOADS]); |
| |
| /*--------------------------------------------------------------------------- |
| |
| functionname:FDKaacEnc_Close |
| description: delete encoder instance |
| returns: |
| |
| ---------------------------------------------------------------------------*/ |
| |
| void FDKaacEnc_Close(HANDLE_AAC_ENC *phAacEnc); /* encoder handle */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* AACENC_H */ |