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 - 2013 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 #ifdef __cplusplus
    102 extern "C" {
    103 #endif
    104 
    105 /*
    106  * AAC-LC error codes.
    107  */
    108 typedef 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 
    160 typedef 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 
    173 typedef 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 
    182 struct 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 
    216 typedef 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 
    223 typedef 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  */
    239 INT 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  ------------------------------------------------------------------------------*/
    271 void 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   ---------------------------------------------------------------------------*/
    280 AAC_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 
    286 AAC_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 
    300 AAC_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 
    315 void FDKaacEnc_Close( HANDLE_AAC_ENC*  phAacEnc);   /* encoder handle */
    316 
    317 #ifdef __cplusplus
    318 }
    319 #endif
    320 
    321 #endif /* _aacenc_h_ */
    322 
    323