Home | History | Annotate | Download | only in src
      1 
      2 /* -----------------------------------------------------------------------------------------------------------
      3 Software License for The Fraunhofer FDK AAC Codec Library for Android
      4 
      5  Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Frderung 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 (at) 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 #define BITRES_MAX_LD   4000
    102 #define BITRES_MIN_LD    500
    103 #define BITRATE_MAX_LD 70000 /* Max assumed bitrate for bitres calculation */
    104 #define BITRATE_MIN_LD 12000 /* Min assumed bitrate for bitres calculation */
    105 
    106 #ifdef __cplusplus
    107 extern "C" {
    108 #endif
    109 
    110 /*
    111  * AAC-LC error codes.
    112  */
    113 typedef enum {
    114   AAC_ENC_OK       = 0x0000,                          /*!< All fine. */
    115 
    116   AAC_ENC_UNKNOWN  = 0x0002,                          /*!< Error condition is of unknown reason, or from another module.              */
    117 
    118   /* initialization errors */
    119   aac_enc_init_error_start      = 0x2000,
    120   AAC_ENC_INVALID_HANDLE        = 0x2020,             /*!< The handle passed to the function call was invalid (probably NULL).        */
    121   AAC_ENC_INVALID_FRAME_LENGTH  = 0x2080,             /*!< Invalid frame length.                                                      */
    122   AAC_ENC_INVALID_N_CHANNELS    = 0x20e0,             /*!< Invalid amount of audio input channels.                                    */
    123   AAC_ENC_INVALID_SFB_TABLE     = 0x2140,             /*!< Internal encoder error.                                                    */
    124 
    125   AAC_ENC_UNSUPPORTED_AOT            = 0x3000,        /*!< The Audio Object Type (AOT) is not supported.                              */
    126   AAC_ENC_UNSUPPORTED_BITRATE        = 0x3020,        /*!< The chosen bitrate is not supported.                                       */
    127   AAC_ENC_UNSUPPORTED_BITRATE_MODE   = 0x3028,        /*!< Unsupported bit rate mode (CBR or VBR).                                    */
    128   AAC_ENC_UNSUPPORTED_ANC_BITRATE    = 0x3040,        /*!< Unsupported ancillay bitrate.                                              */
    129   AAC_ENC_UNSUPPORTED_ANC_MODE       = 0x3060,
    130   AAC_ENC_UNSUPPORTED_TRANSPORT_TYPE = 0x3080,        /*!< The bitstream format is not supported.                                     */
    131   AAC_ENC_UNSUPPORTED_ER_FORMAT      = 0x30a0,        /*!< The error resilience tool format is not supported.                         */
    132   AAC_ENC_UNSUPPORTED_EPCONFIG       = 0x30c0,        /*!< The error protection format is not supported.                              */
    133   AAC_ENC_UNSUPPORTED_CHANNELCONFIG  = 0x30e0,        /*!< The channel configuration (either number or arrangement) is not supported. */
    134   AAC_ENC_UNSUPPORTED_SAMPLINGRATE   = 0x3100,        /*!< Sample rate of audio input is not supported.                               */
    135   AAC_ENC_NO_MEMORY                  = 0x3120,        /*!< Could not allocate memory. */
    136   AAC_ENC_PE_INIT_TABLE_NOT_FOUND    = 0x3140,        /*!< Internal encoder error.    */
    137 
    138   aac_enc_init_error_end,
    139 
    140   /* encode errors */
    141   aac_enc_error_start                       = 0x4000,
    142   AAC_ENC_QUANT_ERROR                       = 0x4020,       /*!< Too many bits used in quantization.             */
    143   AAC_ENC_WRITTEN_BITS_ERROR                = 0x4040,       /*!< Unexpected number of written bits, differs to
    144                                                                  calculated number of bits.                      */
    145   AAC_ENC_PNS_TABLE_ERROR                   = 0x4060,       /*!< PNS level out of range.                         */
    146   AAC_ENC_GLOBAL_GAIN_TOO_HIGH              = 0x4080,       /*!< Internal quantizer error.                       */
    147   AAC_ENC_BITRES_TOO_LOW                    = 0x40a0,       /*!< Too few  bits in bit reservoir.                 */
    148   AAC_ENC_BITRES_TOO_HIGH                   = 0x40a1,       /*!< Too many bits in bit reservoir.                 */
    149   AAC_ENC_INVALID_CHANNEL_BITRATE           = 0x4100,
    150   AAC_ENC_INVALID_ELEMENTINFO_TYPE          = 0x4120,       /*!< Internal encoder error.                         */
    151 
    152   AAC_ENC_WRITE_SCAL_ERROR                  = 0x41e0,       /*!< Error writing scalefacData.                     */
    153   AAC_ENC_WRITE_SEC_ERROR                   = 0x4200,       /*!< Error writing sectionData.                      */
    154   AAC_ENC_WRITE_SPEC_ERROR                  = 0x4220,       /*!< Error writing spectralData.                     */
    155   aac_enc_error_end
    156 
    157 } AAC_ENCODER_ERROR;
    158 /*-------------------------- defines --------------------------------------*/
    159 
    160 #define ANC_DATA_BUFFERSIZE 1024      /* ancBuffer size */
    161 
    162 #define MAX_TOTAL_EXT_PAYLOADS  (((8) * (1)) + (2+2))
    163 
    164 
    165 typedef enum {
    166   AACENC_BR_MODE_INVALID = -1,  /*!< Invalid bitrate mode.                            */
    167   AACENC_BR_MODE_CBR     =  0,  /*!< Constant bitrate mode.                           */
    168   AACENC_BR_MODE_VBR_1   =  1,  /*!< Variable bitrate mode, about 32 kbps/channel.    */
    169   AACENC_BR_MODE_VBR_2   =  2,  /*!< Variable bitrate mode, about 40 kbps/channel.    */
    170   AACENC_BR_MODE_VBR_3   =  3,  /*!< Variable bitrate mode, about 48-56 kbps/channel. */
    171   AACENC_BR_MODE_VBR_4   =  4,  /*!< Variable bitrate mode, about 64 kbps/channel.    */
    172   AACENC_BR_MODE_VBR_5   =  5,  /*!< Variable bitrate mode, about 80-96 kbps/channel. */
    173   AACENC_BR_MODE_FF      =  6,  /*!< Fixed frame mode.                                */
    174   AACENC_BR_MODE_SFR     =  7   /*!< Superframe mode.                                 */
    175 
    176 } AACENC_BITRATE_MODE;
    177 
    178 typedef enum {
    179 
    180   CH_ORDER_MPEG = 0,  /*!< MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE)           */
    181   CH_ORDER_WAV        /*!< WAV fileformat channel ordering (e. g. 5.1: L, R, C, LFE, SL, SR) */
    182 
    183 } CHANNEL_ORDER;
    184 
    185 /*-------------------- structure definitions ------------------------------*/
    186 
    187 struct AACENC_CONFIG {
    188   INT   sampleRate;             /* encoder sample rate */
    189   INT   bitRate;                /* encoder bit rate in bits/sec */
    190   INT   ancDataBitRate;         /* additional bits consumed by anc data or sbr have to be consiedered while configuration */
    191 
    192   INT   nSubFrames;             /* number of frames in super frame (not ADTS/LATM subframes !) */
    193   AUDIO_OBJECT_TYPE audioObjectType;   /* Audio Object Type  */
    194 
    195   INT   averageBits;            /* encoder bit rate in bits/superframe */
    196   INT   bitrateMode;            /* encoder bitrate mode (CBR/VBR) */
    197   INT   nChannels;              /* number of channels to process */
    198   CHANNEL_ORDER channelOrder;   /* Input Channel ordering scheme. */
    199   INT   bandWidth;              /* targeted audio bandwidth in Hz */
    200   CHANNEL_MODE  channelMode;    /* encoder channel mode configuration */
    201   INT   framelength;            /* used frame size */
    202 
    203   UINT  syntaxFlags;            /* bitstreams syntax configuration */
    204   SCHAR epConfig;               /* error protection configuration */
    205 
    206   INT   anc_Rate;               /* ancillary rate, 0 (disabled), -1 (default) else desired rate */
    207   UINT  maxAncBytesPerAU;
    208   INT   minBitsPerFrame;        /* minimum number of bits in AU */
    209   INT   maxBitsPerFrame;        /* maximum number of bits in AU */
    210   INT   bitreservoir;           /* size of bitreservoir */
    211 
    212   INT   audioMuxVersion;        /* audio mux version in loas/latm transport format */
    213 
    214   UINT  sbrRatio;               /* sbr sampling rate ratio: dual- or single-rate */
    215 
    216   UCHAR useTns;                 /* flag: use temporal noise shaping */
    217   UCHAR usePns;                 /* flag: use perceptual noise substitution */
    218   UCHAR useIS;                  /* flag: use intensity coding */
    219 
    220   UCHAR useRequant;             /* flag: use afterburner */
    221 };
    222 
    223 typedef struct {
    224   UCHAR            *pData;      /* pointer to extension payload data */
    225   UINT              dataSize;   /* extension payload data size in bits */
    226   EXT_PAYLOAD_TYPE  dataType;   /* extension payload data type */
    227   INT               associatedChElement;  /* number of the channel element the data is assigned to */
    228 } AACENC_EXT_PAYLOAD;
    229 
    230 typedef struct AAC_ENC *HANDLE_AAC_ENC;
    231 
    232 /**
    233  * \brief Calculate framesize in bits for given bit rate, frame length and sampling rate.
    234  *
    235  * \param bitRate               Ttarget bitrate in bits per second.
    236  * \param frameLength           Number of audio samples in one frame.
    237  * \param samplingRate          Sampling rate in Hz.
    238  *
    239  * \return                      Framesize in bits per frame.
    240 */
    241 INT FDKaacEnc_CalcBitsPerFrame(
    242         const INT bitRate,
    243         const INT frameLength,
    244         const INT samplingRate
    245         );
    246 
    247 /**
    248  * \brief Calculate bitrate in bits per second for given framesize, frame length and sampling rate.
    249  *
    250  * \param bitsPerFrame          Framesize in bits per frame.
    251  * \param frameLength           Number of audio samples in one frame.
    252  * \param samplingRate          Sampling rate in Hz.
    253  *
    254  * \return                      Bitrate in bits per second.
    255 */
    256 INT FDKaacEnc_CalcBitrate(
    257         const INT bitsPerFrame,
    258         const INT frameLength,
    259         const INT samplingRate
    260         );
    261 
    262 /**
    263  * \brief Limit given bit rate to a valid value
    264  * \param hTpEnc transport encoder handle
    265  * \param coreSamplingRate the sample rate to be used for the AAC encoder
    266  * \param frameLength the frameLength to be used for the AAC encoder
    267  * \param nChannels number of total channels
    268  * \param nChannelsEff number of effective channels
    269  * \param bitRate the initial bit rate value for which the closest valid bit rate value is searched for
    270  * \param averageBits average bits per frame for fixed framing. Set to -1 if not available.
    271  * \param optional pointer where the current bits per frame are stored into.
    272  * \param bitrateMode the current bit rate mode
    273  * \param nSubFrames number of sub frames for super framing (not transport frames).
    274  * \return a valid bit rate value as close as possible or identical to bitRate
    275  */
    276 INT FDKaacEnc_LimitBitrate(
    277         HANDLE_TRANSPORTENC hTpEnc,
    278         INT coreSamplingRate,
    279         INT frameLength,
    280         INT nChannels,
    281         INT nChannelsEff,
    282         INT bitRate,
    283         INT averageBits,
    284         INT *pAverageBitsPerFrame,
    285         INT bitrateMode,
    286         INT nSubFrames
    287         );
    288 
    289  /*-----------------------------------------------------------------------------
    290 
    291      functionname: FDKaacEnc_GetVBRBitrate
    292      description:  Get VBR bitrate from vbr quality
    293      input params: int vbrQuality (VBR0, VBR1, VBR2)
    294                    channelMode
    295      returns:      vbr bitrate
    296 
    297  ------------------------------------------------------------------------------*/
    298  INT FDKaacEnc_GetVBRBitrate(INT bitrateMode, CHANNEL_MODE channelMode);
    299 
    300 
    301 /*-----------------------------------------------------------------------------
    302 
    303      functionname: FDKaacEnc_AacInitDefaultConfig
    304      description:  gives reasonable default configuration
    305      returns:      ---
    306 
    307  ------------------------------------------------------------------------------*/
    308 void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG     *config);
    309 
    310 /*---------------------------------------------------------------------------
    311 
    312 	    functionname:FDKaacEnc_Open
    313     description: allocate and initialize a new encoder instance
    314     returns:     0 if success
    315 
    316   ---------------------------------------------------------------------------*/
    317 AAC_ENCODER_ERROR FDKaacEnc_Open(HANDLE_AAC_ENC  *phAacEnc,              /* pointer to an encoder handle, initialized on return */
    318                                  const INT        nElements,             /* number of maximal elements in instance to support */
    319                                  const INT        nChannels,             /* number of maximal channels in instance to support */
    320                                  const INT        nSubFrames);           /* support superframing in instance */
    321 
    322 
    323 AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC     hAacEncoder,   /* pointer to an encoder handle, initialized on return */
    324                                        AACENC_CONFIG    *config,         /* pre-initialized config struct */
    325                                        HANDLE_TRANSPORTENC hTpEnc,
    326                                        ULONG               initFlags);
    327 
    328 
    329 /*---------------------------------------------------------------------------
    330 
    331     functionname: FDKaacEnc_EncodeFrame
    332     description:  encode one frame
    333     returns:      0 if success
    334 
    335   ---------------------------------------------------------------------------*/
    336 
    337 AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC       hAacEnc,         /* encoder handle */
    338                                          HANDLE_TRANSPORTENC  hTpEnc,
    339                                          INT_PCM*             inputBuffer,
    340                                          INT*                 numOutBytes,
    341                                          AACENC_EXT_PAYLOAD   extPayload[MAX_TOTAL_EXT_PAYLOADS]
    342                                        );
    343 
    344 /*---------------------------------------------------------------------------
    345 
    346     functionname:FDKaacEnc_Close
    347     description: delete encoder instance
    348     returns:
    349 
    350   ---------------------------------------------------------------------------*/
    351 
    352 void FDKaacEnc_Close( HANDLE_AAC_ENC*  phAacEnc);   /* encoder handle */
    353 
    354 #ifdef __cplusplus
    355 }
    356 #endif
    357 
    358 #endif /* _aacenc_h_ */
    359 
    360