1 2/* ----------------------------------------------------------------------------------------------------------- 3Software 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 9The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 10the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 11This FDK AAC Codec software is intended to be used on a wide variety of Android devices. 12 13AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 14audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 15independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 16of the MPEG specifications. 17 18Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 19may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 20individually for the purpose of encoding or decoding bit streams in products that are compliant with 21the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 22these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 23software may already be covered under those patent licenses when it is used for those licensed purposes only. 24 25Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 26are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 27applications information and documentation. 28 292. COPYRIGHT LICENSE 30 31Redistribution and use in source and binary forms, with or without modification, are permitted without 32payment of copyright license fees provided that you satisfy the following conditions: 33 34You must retain the complete text of this software license in redistributions of the FDK AAC Codec or 35your modifications thereto in source code form. 36 37You must retain the complete text of this software license in the documentation and/or other materials 38provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 39You must make available free of charge copies of the complete source code of the FDK AAC Codec and your 40modifications thereto to recipients of copies in binary form. 41 42The name of Fraunhofer may not be used to endorse or promote products derived from this library without 43prior written permission. 44 45You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 46software or your modifications thereto. 47 48Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 49and 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 533. NO PATENT LICENSE 54 55NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 56ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 57respect to this software. 58 59You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 60by appropriate patent licenses. 61 624. DISCLAIMER 63 64This 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 66of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 67CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 68including but not limited to procurement of substitute goods or services; loss of use, data, or profits, 69or business interruption, however caused and on any theory of liability, whether in contract, strict 70liability, or tort (including negligence), arising in any way out of the use of this software, even if 71advised of the possibility of such damage. 72 735. CONTACT INFORMATION 74 75Fraunhofer Institute for Integrated Circuits IIS 76Attention: Audio and Multimedia Departments - FDK AAC LL 77Am Wolfsmantel 33 7891058 Erlangen, Germany 79 80www.iis.fraunhofer.de/amm 81amm-info@iis.fraunhofer.de 82----------------------------------------------------------------------------------------------------------- */ 83 84/************************* Fast MPEG AAC Audio Encoder ********************** 85 86 Initial author: M. Schug / A. Groeschel 87 contents/description: fast aac coder interface library functions 88 89******************************************************************************/ 90 91#ifndef _aacenc_h_ 92#define _aacenc_h_ 93 94#include "common_fix.h" 95#include "FDK_audio.h" 96 97#include "tpenc_lib.h" 98 99#include "sbr_encoder.h" 100 101#ifdef __cplusplus 102extern "C" { 103#endif 104 105/* 106 * AAC-LC error codes. 107 */ 108typedef enum { 109 AAC_ENC_OK = 0x0000, /*!< All fine. */ 110 111 AAC_ENC_UNKNOWN = 0x0002, /*!< Error condition is of unknown reason, or from another module. */ 112 113 /* initialization errors */ 114 aac_enc_init_error_start = 0x2000, 115 AAC_ENC_INVALID_HANDLE = 0x2020, /*!< The handle passed to the function call was invalid (probably NULL). */ 116 AAC_ENC_INVALID_FRAME_LENGTH = 0x2080, /*!< Invalid frame length. */ 117 AAC_ENC_INVALID_N_CHANNELS = 0x20e0, /*!< Invalid amount of audio input channels. */ 118 AAC_ENC_INVALID_SFB_TABLE = 0x2140, /*!< Internal encoder error. */ 119 120 AAC_ENC_UNSUPPORTED_AOT = 0x3000, /*!< The Audio Object Type (AOT) is not supported. */ 121 AAC_ENC_UNSUPPORTED_BITRATE = 0x3020, /*!< The chosen bitrate is not supported. */ 122 AAC_ENC_UNSUPPORTED_BITRATE_MODE = 0x3028, /*!< Unsupported bit rate mode (CBR or VBR). */ 123 AAC_ENC_UNSUPPORTED_ANC_BITRATE = 0x3040, /*!< Unsupported ancillay bitrate. */ 124 AAC_ENC_UNSUPPORTED_ANC_MODE = 0x3060, 125 AAC_ENC_UNSUPPORTED_TRANSPORT_TYPE = 0x3080, /*!< The bitstream format is not supported. */ 126 AAC_ENC_UNSUPPORTED_ER_FORMAT = 0x30a0, /*!< The error resilience tool format is not supported. */ 127 AAC_ENC_UNSUPPORTED_EPCONFIG = 0x30c0, /*!< The error protection format is not supported. */ 128 AAC_ENC_UNSUPPORTED_CHANNELCONFIG = 0x30e0, /*!< The channel configuration (either number or arrangement) is not supported. */ 129 AAC_ENC_UNSUPPORTED_SAMPLINGRATE = 0x3100, /*!< Sample rate of audio input is not supported. */ 130 AAC_ENC_NO_MEMORY = 0x3120, /*!< Could not allocate memory. */ 131 AAC_ENC_PE_INIT_TABLE_NOT_FOUND = 0x3140, /*!< Internal encoder error. */ 132 133 aac_enc_init_error_end, 134 135 /* encode errors */ 136 aac_enc_error_start = 0x4000, 137 AAC_ENC_QUANT_ERROR = 0x4020, /*!< Too many bits used in quantization. */ 138 AAC_ENC_WRITTEN_BITS_ERROR = 0x4040, /*!< Unexpected number of written bits, differs to 139 calculated number of bits. */ 140 AAC_ENC_PNS_TABLE_ERROR = 0x4060, /*!< PNS level out of range. */ 141 AAC_ENC_GLOBAL_GAIN_TOO_HIGH = 0x4080, /*!< Internal quantizer error. */ 142 AAC_ENC_BITRES_TOO_LOW = 0x40a0, /*!< Too few bits in bit reservoir. */ 143 AAC_ENC_BITRES_TOO_HIGH = 0x40a1, /*!< Too many bits in bit reservoir. */ 144 AAC_ENC_INVALID_CHANNEL_BITRATE = 0x4100, 145 AAC_ENC_INVALID_ELEMENTINFO_TYPE = 0x4120, /*!< Internal encoder error. */ 146 147 AAC_ENC_WRITE_SCAL_ERROR = 0x41e0, /*!< Error writing scalefacData. */ 148 AAC_ENC_WRITE_SEC_ERROR = 0x4200, /*!< Error writing sectionData. */ 149 AAC_ENC_WRITE_SPEC_ERROR = 0x4220, /*!< Error writing spectralData. */ 150 aac_enc_error_end 151 152} AAC_ENCODER_ERROR; 153/*-------------------------- defines --------------------------------------*/ 154 155#define ANC_DATA_BUFFERSIZE 1024 /* ancBuffer size */ 156 157#define MAX_TOTAL_EXT_PAYLOADS (((8) * (1)) + (2+2)) 158 159 160typedef enum { 161 AACENC_BR_MODE_INVALID = -1, /*!< Invalid bitrate mode. */ 162 AACENC_BR_MODE_CBR = 0, /*!< Constant bitrate mode. */ 163 AACENC_BR_MODE_VBR_1 = 1, /*!< Variable bitrate mode, about 32 kbps/channel. */ 164 AACENC_BR_MODE_VBR_2 = 2, /*!< Variable bitrate mode, about 40 kbps/channel. */ 165 AACENC_BR_MODE_VBR_3 = 3, /*!< Variable bitrate mode, about 48-56 kbps/channel. */ 166 AACENC_BR_MODE_VBR_4 = 4, /*!< Variable bitrate mode, about 64 kbps/channel. */ 167 AACENC_BR_MODE_VBR_5 = 5, /*!< Variable bitrate mode, about 80-96 kbps/channel. */ 168 AACENC_BR_MODE_FF = 6, /*!< Fixed frame mode. */ 169 AACENC_BR_MODE_SFR = 7 /*!< Superframe mode. */ 170 171} AACENC_BITRATE_MODE; 172 173typedef enum { 174 175 CH_ORDER_MPEG = 0, /*!< MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE) */ 176 CH_ORDER_WAV /*!< WAV fileformat channel ordering (e. g. 5.1: L, R, C, LFE, SL, SR) */ 177 178} CHANNEL_ORDER; 179 180/*-------------------- structure definitions ------------------------------*/ 181 182struct AACENC_CONFIG { 183 INT sampleRate; /* encoder sample rate */ 184 INT bitRate; /* encoder bit rate in bits/sec */ 185 INT ancDataBitRate; /* additional bits consumed by anc data or sbr have to be consiedered while configuration */ 186 187 INT nSubFrames; /* number of frames in super frame (not ADTS/LATM subframes !) */ 188 AUDIO_OBJECT_TYPE audioObjectType; /* Audio Object Type */ 189 190 INT averageBits; /* encoder bit rate in bits/superframe */ 191 INT bitrateMode; /* encoder bitrate mode (CBR/VBR) */ 192 INT nChannels; /* number of channels to process */ 193 CHANNEL_ORDER channelOrder; /* Input Channel ordering scheme. */ 194 INT bandWidth; /* targeted audio bandwidth in Hz */ 195 CHANNEL_MODE channelMode; /* encoder channel mode configuration */ 196 INT framelength; /* used frame size */ 197 198 UINT syntaxFlags; /* bitstreams syntax configuration */ 199 SCHAR epConfig; /* error protection configuration */ 200 201 INT anc_Rate; /* ancillary rate, 0 (disabled), -1 (default) else desired rate */ 202 UINT maxAncBytesPerAU; 203 INT minBitsPerFrame; /* minimum number of bits in AU */ 204 INT maxBitsPerFrame; /* maximum number of bits in AU */ 205 INT bitreservoir; /* size of bitreservoir */ 206 207 UINT sbrRatio; /* sbr sampling rate ratio: dual- or single-rate */ 208 209 UCHAR useTns; /* flag: use temporal noise shaping */ 210 UCHAR usePns; /* flag: use perceptual noise substitution */ 211 UCHAR useIS; /* flag: use intensity coding */ 212 213 UCHAR useRequant; /* flag: use afterburner */ 214}; 215 216typedef struct { 217 UCHAR *pData; /* pointer to extension payload data */ 218 UINT dataSize; /* extension payload data size in bits */ 219 EXT_PAYLOAD_TYPE dataType; /* extension payload data type */ 220 INT associatedChElement; /* number of the channel element the data is assigned to */ 221} AACENC_EXT_PAYLOAD; 222 223typedef struct AAC_ENC *HANDLE_AAC_ENC; 224 225/** 226 * \brief Limit given bit rate to a valid value 227 * \param hTpEnc transport encoder handle 228 * \param coreSamplingRate the sample rate to be used for the AAC encoder 229 * \param frameLength the frameLength to be used for the AAC encoder 230 * \param nChannels number of total channels 231 * \param nChannelsEff number of effective channels 232 * \param bitRate the initial bit rate value for which the closest valid bit rate value is searched for 233 * \param averageBits average bits per frame for fixed framing. Set to -1 if not available. 234 * \param optional pointer where the current bits per frame are stored into. 235 * \param bitrateMode the current bit rate mode 236 * \param nSubFrames number of sub frames for super framing (not transport frames). 237 * \return a valid bit rate value as close as possible or identical to bitRate 238 */ 239INT FDKaacEnc_LimitBitrate( 240 HANDLE_TRANSPORTENC hTpEnc, 241 INT coreSamplingRate, 242 INT frameLength, 243 INT nChannels, 244 INT nChannelsEff, 245 INT bitRate, 246 INT averageBits, 247 INT *pAverageBitsPerFrame, 248 INT bitrateMode, 249 INT nSubFrames 250 ); 251 252 /*----------------------------------------------------------------------------- 253 254 functionname: FDKaacEnc_GetVBRBitrate 255 description: Get VBR bitrate from vbr quality 256 input params: int vbrQuality (VBR0, VBR1, VBR2) 257 channelMode 258 returns: vbr bitrate 259 260 ------------------------------------------------------------------------------*/ 261 INT FDKaacEnc_GetVBRBitrate(INT bitrateMode, CHANNEL_MODE channelMode); 262 263 264/*----------------------------------------------------------------------------- 265 266 functionname: FDKaacEnc_AacInitDefaultConfig 267 description: gives reasonable default configuration 268 returns: --- 269 270 ------------------------------------------------------------------------------*/ 271void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config); 272 273/*--------------------------------------------------------------------------- 274 275 functionname:FDKaacEnc_Open 276 description: allocate and initialize a new encoder instance 277 returns: 0 if success 278 279 ---------------------------------------------------------------------------*/ 280AAC_ENCODER_ERROR FDKaacEnc_Open(HANDLE_AAC_ENC *phAacEnc, /* pointer to an encoder handle, initialized on return */ 281 const INT nElements, /* number of maximal elements in instance to support */ 282 const INT nChannels, /* number of maximal channels in instance to support */ 283 const INT nSubFrames); /* support superframing in instance */ 284 285 286AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC hAacEncoder, /* pointer to an encoder handle, initialized on return */ 287 AACENC_CONFIG *config, /* pre-initialized config struct */ 288 HANDLE_TRANSPORTENC hTpEnc, 289 ULONG initFlags); 290 291 292/*--------------------------------------------------------------------------- 293 294 functionname: FDKaacEnc_EncodeFrame 295 description: encode one frame 296 returns: 0 if success 297 298 ---------------------------------------------------------------------------*/ 299 300AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC hAacEnc, /* encoder handle */ 301 HANDLE_TRANSPORTENC hTpEnc, 302 INT_PCM* inputBuffer, 303 INT* numOutBytes, 304 AACENC_EXT_PAYLOAD extPayload[MAX_TOTAL_EXT_PAYLOADS] 305 ); 306 307/*--------------------------------------------------------------------------- 308 309 functionname:FDKaacEnc_Close 310 description: delete encoder instance 311 returns: 312 313 ---------------------------------------------------------------------------*/ 314 315void FDKaacEnc_Close( HANDLE_AAC_ENC* phAacEnc); /* encoder handle */ 316 317#ifdef __cplusplus 318} 319#endif 320 321#endif /* _aacenc_h_ */ 322 323