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 functions
     88 
     89 ******************************************************************************/
     90 
     91 #include "aacenc.h"
     92 
     93 #include "bitenc.h"
     94 #include "interface.h"
     95 #include "psy_configuration.h"
     96 #include "psy_main.h"
     97 #include "qc_main.h"
     98 #include "bandwidth.h"
     99 #include "channel_map.h"
    100 #include "tns_func.h"
    101 #include "aacEnc_ram.h"
    102 
    103 #include "genericStds.h"
    104 
    105 
    106 
    107 
    108 #define MIN_BUFSIZE_PER_EFF_CHAN 6144
    109 
    110 INT FDKaacEnc_CalcBitsPerFrame(
    111         const INT bitRate,
    112         const INT frameLength,
    113         const INT samplingRate
    114         )
    115 {
    116     int shift = 0;
    117     while ((frameLength & ~((1 << (shift + 1)) - 1)) == frameLength
    118         && (samplingRate & ~((1 << (shift + 1)) - 1)) == samplingRate)
    119     {
    120       shift++;
    121     }
    122 
    123     return (bitRate*(frameLength>>shift)) / (samplingRate>>shift);
    124 }
    125 
    126 INT FDKaacEnc_CalcBitrate(
    127         const INT bitsPerFrame,
    128         const INT frameLength,
    129         const INT samplingRate
    130         )
    131 {
    132     int shift = 0;
    133     while ((frameLength & ~((1 << (shift + 1)) - 1)) == frameLength
    134         && (samplingRate & ~((1 << (shift + 1)) - 1)) == samplingRate)
    135     {
    136       shift++;
    137     }
    138 
    139     return (bitsPerFrame * (samplingRate>>shift)) / ( frameLength>>shift) ;
    140 
    141 }
    142 
    143 static AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate,
    144                                                       INT framelength,
    145                                                       INT ancillaryRate,
    146                                                       INT *ancillaryBitsPerFrame,
    147                                                       INT sampleRate);
    148 
    149 INT FDKaacEnc_LimitBitrate(
    150         HANDLE_TRANSPORTENC hTpEnc,
    151         INT coreSamplingRate,
    152         INT frameLength,
    153         INT nChannels,
    154         INT nChannelsEff,
    155         INT bitRate,
    156         INT averageBits,
    157         INT *pAverageBitsPerFrame,
    158         INT bitrateMode,
    159         INT nSubFrames
    160         )
    161 {
    162   INT transportBits, prevBitRate, averageBitsPerFrame, shift = 0, iter=0;
    163 
    164   while ( (frameLength & ~((1<<(shift+1))-1)) == frameLength
    165     && (coreSamplingRate & ~((1<<(shift+1))-1)) == coreSamplingRate )
    166   {
    167     shift ++;
    168   }
    169 
    170   do {
    171     prevBitRate = bitRate;
    172      averageBitsPerFrame = (bitRate*(frameLength>>shift)) / (coreSamplingRate>>shift) / nSubFrames;
    173 
    174     if (pAverageBitsPerFrame != NULL) {
    175       *pAverageBitsPerFrame = averageBitsPerFrame;
    176     }
    177 
    178     if (hTpEnc != NULL) {
    179       transportBits = transportEnc_GetStaticBits(hTpEnc, averageBitsPerFrame);
    180     } else {
    181       /* Assume some worst case */
    182       transportBits = 208;
    183     }
    184 
    185     bitRate = FDKmax(bitRate, ((((40 * nChannels) + transportBits) * (coreSamplingRate)) / frameLength) );
    186     FDK_ASSERT(bitRate >= 0);
    187 
    188     bitRate = FDKmin(bitRate, ((nChannelsEff * MIN_BUFSIZE_PER_EFF_CHAN)*(coreSamplingRate>>shift)) / (frameLength>>shift)) ;
    189     FDK_ASSERT(bitRate >= 0);
    190 
    191   } while (prevBitRate != bitRate && iter++ < 3) ;
    192 
    193   return bitRate;
    194 }
    195 
    196 
    197 typedef struct
    198 {
    199   AACENC_BITRATE_MODE bitrateMode;
    200   int chanBitrate[2]; /* mono/stereo settings */
    201 } CONFIG_TAB_ENTRY_VBR;
    202 
    203 static const CONFIG_TAB_ENTRY_VBR configTabVBR[] = {
    204   {AACENC_BR_MODE_CBR,   {     0,     0}} ,
    205   {AACENC_BR_MODE_VBR_1, { 32000, 20000}} ,
    206   {AACENC_BR_MODE_VBR_2, { 40000, 32000}} ,
    207   {AACENC_BR_MODE_VBR_3, { 56000, 48000}} ,
    208   {AACENC_BR_MODE_VBR_4, { 72000, 64000}} ,
    209   {AACENC_BR_MODE_VBR_5, {112000, 96000}}
    210 };
    211 
    212 /*-----------------------------------------------------------------------------
    213 
    214      functionname: FDKaacEnc_GetVBRBitrate
    215      description:  Get VBR bitrate from vbr quality
    216      input params: int vbrQuality (VBR0, VBR1, VBR2)
    217                    channelMode
    218      returns:      vbr bitrate
    219 
    220  ------------------------------------------------------------------------------*/
    221 INT FDKaacEnc_GetVBRBitrate(INT bitrateMode, CHANNEL_MODE channelMode)
    222 {
    223   INT bitrate = 0;
    224   INT monoStereoMode = 0; /* default mono */
    225 
    226   if (FDKaacEnc_GetMonoStereoMode(channelMode)==EL_MODE_STEREO) {
    227       monoStereoMode = 1;
    228   }
    229 
    230   switch((AACENC_BITRATE_MODE)bitrateMode){
    231   case AACENC_BR_MODE_VBR_1:
    232   case AACENC_BR_MODE_VBR_2:
    233   case AACENC_BR_MODE_VBR_3:
    234   case AACENC_BR_MODE_VBR_4:
    235   case AACENC_BR_MODE_VBR_5:
    236     bitrate = configTabVBR[bitrateMode].chanBitrate[monoStereoMode];
    237     break;
    238   case AACENC_BR_MODE_INVALID:
    239   case AACENC_BR_MODE_CBR:
    240   case AACENC_BR_MODE_SFR:
    241   case AACENC_BR_MODE_FF:
    242   default:
    243     bitrate = 0;
    244     break;
    245   }
    246 
    247   /* convert channel bitrate to overall bitrate*/
    248   bitrate *= FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff;
    249 
    250   return bitrate;
    251 }
    252 
    253 /**
    254  * \brief  Convert encoder bitreservoir value for transport library.
    255  *
    256  * \param hAacEnc               Encoder handle
    257  *
    258  * \return  Corrected bitreservoir level used in transport library.
    259  */
    260 static INT FDKaacEnc_EncBitresToTpBitres(
    261         const HANDLE_AAC_ENC      hAacEnc
    262         )
    263 {
    264   INT transporBitreservoir = 0;
    265 
    266   switch (hAacEnc->bitrateMode) {
    267     case AACENC_BR_MODE_CBR:
    268       transporBitreservoir = hAacEnc->qcKernel->bitResTot; /* encoder bitreservoir level */
    269       break;
    270     case AACENC_BR_MODE_VBR_1:
    271     case AACENC_BR_MODE_VBR_2:
    272     case AACENC_BR_MODE_VBR_3:
    273     case AACENC_BR_MODE_VBR_4:
    274     case AACENC_BR_MODE_VBR_5:
    275       transporBitreservoir = FDK_INT_MAX; /* signal variable bitrate */
    276       break;
    277     case AACENC_BR_MODE_FF:
    278     case AACENC_BR_MODE_SFR:
    279       transporBitreservoir = 0;           /* super framing and fixed framing */
    280       break;                              /* without bitreservoir signaling */
    281     default:
    282     case AACENC_BR_MODE_INVALID:
    283       transporBitreservoir = 0;           /* invalid configuration*/
    284       FDK_ASSERT(0);
    285   }
    286 
    287   if (hAacEnc->config->audioMuxVersion==2) {
    288     transporBitreservoir = MIN_BUFSIZE_PER_EFF_CHAN * hAacEnc->channelMapping.nChannelsEff;
    289   }
    290 
    291   return transporBitreservoir;
    292 }
    293 
    294 /*-----------------------------------------------------------------------------
    295 
    296      functionname: FDKaacEnc_AacInitDefaultConfig
    297      description:  gives reasonable default configuration
    298      returns:      ---
    299 
    300  ------------------------------------------------------------------------------*/
    301 void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config)
    302 {
    303     /* make thepre initialization of the structs flexible */
    304     FDKmemclear(config, sizeof(AACENC_CONFIG));
    305 
    306     /* default ancillary */
    307     config->anc_Rate = 0;         /* no ancillary data */
    308     config->ancDataBitRate = 0;   /* no additional consumed bitrate */
    309 
    310     /* default configurations */
    311     config->bitRate         = -1;                   /* bitrate must be set*/
    312     config->averageBits     = -1;                   /* instead of bitrate/s we can configure bits/superframe */
    313     config->bitrateMode     = 0;
    314     config->bandWidth       = 0;                    /* get bandwidth from table */
    315     config->useTns          = TNS_ENABLE_MASK;      /* tns enabled completly */
    316     config->usePns          = 1;                    /* depending on channelBitrate this might be set to 0 later */
    317     config->useIS           = 1;                    /* Intensity Stereo Configuration */
    318     config->framelength     = -1;                   /* Framesize not configured */
    319     config->syntaxFlags     = 0;                    /* default syntax with no specialities */
    320     config->epConfig        = -1;                   /* no ER syntax -> no additional error protection */
    321     config->nSubFrames      = 1;                    /* default, no sub frames */
    322     config->channelOrder    = CH_ORDER_MPEG;        /* Use MPEG channel ordering. */
    323     config->channelMode     = MODE_UNKNOWN;
    324     config->minBitsPerFrame = -1;                   /* minum number of bits in each AU */
    325     config->maxBitsPerFrame = -1;                   /* minum number of bits in each AU */
    326     config->bitreservoir    = -1;                   /* default, uninitialized value */
    327     config->audioMuxVersion = -1;                   /* audio mux version not configured */
    328 
    329     /* init tabs in fixpoint_math */
    330     InitLdInt();
    331     InitInvSqrtTab();
    332 }
    333 
    334 
    335 /*---------------------------------------------------------------------------
    336 
    337     functionname: FDKaacEnc_Open
    338     description:  allocate and initialize a new encoder instance
    339     returns:      error code
    340 
    341   ---------------------------------------------------------------------------*/
    342 AAC_ENCODER_ERROR FDKaacEnc_Open(HANDLE_AAC_ENC  *phAacEnc,
    343                                  const INT        nElements,
    344                                  const INT        nChannels,
    345                                  const INT        nSubFrames)
    346 {
    347   AAC_ENCODER_ERROR ErrorStatus;
    348   AAC_ENC           *hAacEnc = NULL;
    349   UCHAR             *dynamicRAM = NULL;
    350 
    351   if (phAacEnc==NULL) {
    352     return AAC_ENC_INVALID_HANDLE;
    353   }
    354 
    355   /* allocate encoder structure */
    356   hAacEnc = GetRam_aacEnc_AacEncoder();
    357   if (hAacEnc == NULL) {
    358     ErrorStatus = AAC_ENC_NO_MEMORY;
    359     goto bail;
    360   }
    361   FDKmemclear(hAacEnc, sizeof(AAC_ENC));
    362 
    363   hAacEnc->dynamic_RAM = GetAACdynamic_RAM();
    364   dynamicRAM = (UCHAR*)hAacEnc->dynamic_RAM;
    365 
    366   /* allocate the Psy aud Psy Out structure */
    367    ErrorStatus = FDKaacEnc_PsyNew(&hAacEnc->psyKernel,
    368                                   nElements,
    369                                   nChannels
    370                                  ,dynamicRAM
    371                                  );
    372    if (ErrorStatus != AAC_ENC_OK)
    373      goto bail;
    374 
    375    ErrorStatus = FDKaacEnc_PsyOutNew(hAacEnc->psyOut,
    376                                      nElements,
    377                                      nChannels,
    378                                      nSubFrames
    379                                     ,dynamicRAM
    380                                     );
    381    if (ErrorStatus != AAC_ENC_OK)
    382      goto bail;
    383 
    384   /* allocate the Q&C Out structure */
    385   ErrorStatus = FDKaacEnc_QCOutNew(hAacEnc->qcOut,
    386                                    nElements,
    387                                    nChannels,
    388                                    nSubFrames
    389                                   ,dynamicRAM
    390                                    );
    391   if (ErrorStatus != AAC_ENC_OK)
    392     goto bail;
    393 
    394   /* allocate the Q&C kernel */
    395   ErrorStatus = FDKaacEnc_QCNew(&hAacEnc->qcKernel,
    396                                  nElements
    397                                 ,dynamicRAM
    398                                 );
    399   if (ErrorStatus != AAC_ENC_OK)
    400     goto bail;
    401 
    402   hAacEnc->maxChannels = nChannels;
    403   hAacEnc->maxElements = nElements;
    404   hAacEnc->maxFrames   = nSubFrames;
    405 
    406 bail:
    407   *phAacEnc = hAacEnc;
    408   return ErrorStatus;
    409 }
    410 
    411 
    412 AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC      hAacEnc,
    413                                        AACENC_CONFIG      *config,     /* pre-initialized config struct */
    414                                        HANDLE_TRANSPORTENC hTpEnc,
    415                                        ULONG               initFlags)
    416 {
    417   AAC_ENCODER_ERROR ErrorStatus;
    418   INT psyBitrate, tnsMask; //INT profile = 1;
    419   CHANNEL_MAPPING   *cm = NULL;
    420 
    421   INT qmbfac, qbw;
    422   FIXP_DBL mbfac, bw_ratio;
    423   QC_INIT qcInit;
    424   INT averageBitsPerFrame = 0;
    425 
    426   if (config==NULL)
    427     return AAC_ENC_INVALID_HANDLE;
    428 
    429   /******************* sanity checks *******************/
    430 
    431   /* check config structure */
    432   if (config->nChannels  < 1 || config->nChannels > (8)) {
    433     return AAC_ENC_UNSUPPORTED_CHANNELCONFIG;
    434   }
    435 
    436   /* check sample rate */
    437   switch (config->sampleRate)
    438   {
    439     case 8000:
    440     case 11025:
    441     case 12000:
    442     case 16000:
    443     case 22050:
    444     case 24000:
    445     case 32000:
    446     case 44100:
    447     case 48000:
    448     case 64000:
    449     case 88200:
    450     case 96000:
    451       break;
    452     default:
    453       return AAC_ENC_UNSUPPORTED_SAMPLINGRATE;
    454   }
    455 
    456   /* bitrate has to be set */
    457   if (config->bitRate==-1) {
    458       return AAC_ENC_UNSUPPORTED_BITRATE;
    459   }
    460 
    461   /* check bit rate */
    462 
    463   if (FDKaacEnc_LimitBitrate(
    464           hTpEnc,
    465           config->sampleRate,
    466           config->framelength,
    467           config->nChannels,
    468           FDKaacEnc_GetChannelModeConfiguration(config->channelMode)->nChannelsEff,
    469           config->bitRate,
    470           config->averageBits,
    471          &averageBitsPerFrame,
    472           config->bitrateMode,
    473           config->nSubFrames
    474           ) != config->bitRate
    475       && !((config->bitrateMode>=1) && (config->bitrateMode<=5))
    476      )
    477   {
    478     return AAC_ENC_UNSUPPORTED_BITRATE;
    479   }
    480 
    481   if (config->syntaxFlags & AC_ER_VCB11) {
    482       return AAC_ENC_UNSUPPORTED_ER_FORMAT;
    483   }
    484   if (config->syntaxFlags & AC_ER_HCR) {
    485       return AAC_ENC_UNSUPPORTED_ER_FORMAT;
    486   }
    487 
    488   /* check frame length */
    489   switch (config->framelength)
    490   {
    491     case 1024:
    492       if ( config->audioObjectType == AOT_ER_AAC_LD
    493         || config->audioObjectType == AOT_ER_AAC_ELD )
    494       {
    495         return AAC_ENC_INVALID_FRAME_LENGTH;
    496       }
    497       break;
    498     case 512:
    499     case 480:
    500       if ( config->audioObjectType != AOT_ER_AAC_LD
    501         && config->audioObjectType != AOT_ER_AAC_ELD )
    502       {
    503         return AAC_ENC_INVALID_FRAME_LENGTH;
    504       }
    505       break;
    506     default:
    507       return AAC_ENC_INVALID_FRAME_LENGTH;
    508   }
    509 
    510   if (config->anc_Rate != 0) {
    511 
    512      ErrorStatus = FDKaacEnc_InitCheckAncillary(config->bitRate,
    513                                                 config->framelength,
    514                                                 config->anc_Rate,
    515                                                &hAacEnc->ancillaryBitsPerFrame,
    516                                                 config->sampleRate);
    517      if (ErrorStatus != AAC_ENC_OK)
    518        goto bail;
    519 
    520 
    521      /* update estimated consumed bitrate */
    522      config->ancDataBitRate += ( (hAacEnc->ancillaryBitsPerFrame * config->sampleRate) / config->framelength );
    523 
    524   }
    525 
    526   /* maximal allowed DSE bytes in frame */
    527   {
    528   /* fixpoint calculation*/
    529   INT q_res, encBitrate, sc;
    530   FIXP_DBL tmp = fDivNorm(config->framelength, config->sampleRate, &q_res);
    531   encBitrate = (config->bitRate/*-config->ancDataBitRate*/)- (INT)(config->nChannels*8000);
    532   sc = CountLeadingBits(encBitrate);
    533   config->maxAncBytesPerAU = FDKmin( (256), FDKmax(0,(INT)(fMultDiv2(tmp, (FIXP_DBL)(encBitrate<<sc))>>(-q_res+sc-1+3))) );
    534   }
    535 
    536   /* bind config to hAacEnc->config */
    537   hAacEnc->config = config;
    538 
    539   /* set hAacEnc->bitrateMode */
    540   hAacEnc->bitrateMode = (AACENC_BITRATE_MODE)config->bitrateMode;
    541 
    542   hAacEnc->encoderMode = config->channelMode;
    543 
    544   ErrorStatus = FDKaacEnc_InitChannelMapping(hAacEnc->encoderMode, config->channelOrder, &hAacEnc->channelMapping);
    545   if (ErrorStatus != AAC_ENC_OK)
    546     goto bail;
    547 
    548   cm = &hAacEnc->channelMapping;
    549 
    550   ErrorStatus = FDKaacEnc_DetermineBandWidth(&hAacEnc->config->bandWidth,
    551                                              config->bandWidth,
    552                                              config->bitRate - config->ancDataBitRate,
    553                                              hAacEnc->bitrateMode,
    554                                              config->sampleRate,
    555                                              config->framelength,
    556                                              cm,
    557                                              hAacEnc->encoderMode);
    558   if (ErrorStatus != AAC_ENC_OK)
    559     goto bail;
    560 
    561   hAacEnc->bandwidth90dB = (INT)hAacEnc->config->bandWidth;
    562 
    563   tnsMask = config->useTns ? TNS_ENABLE_MASK : 0x0;
    564   psyBitrate = config->bitRate - config->ancDataBitRate;
    565 
    566   ErrorStatus = FDKaacEnc_psyInit(hAacEnc->psyKernel,
    567                                   hAacEnc->psyOut,
    568                                   hAacEnc->maxFrames,
    569                                   hAacEnc->maxChannels,
    570                                   config->audioObjectType,
    571                                   cm);
    572   if (ErrorStatus != AAC_ENC_OK)
    573     goto bail;
    574 
    575   ErrorStatus = FDKaacEnc_psyMainInit(hAacEnc->psyKernel,
    576                                       config->audioObjectType,
    577                                       cm,
    578                                       config->sampleRate,
    579                                       config->framelength,
    580                                       psyBitrate,
    581                                       tnsMask,
    582                                       hAacEnc->bandwidth90dB,
    583                                       config->usePns,
    584                                       config->useIS,
    585                                       config->syntaxFlags,
    586                                       initFlags);
    587   if (ErrorStatus != AAC_ENC_OK)
    588     goto bail;
    589 
    590   ErrorStatus = FDKaacEnc_QCOutInit(hAacEnc->qcOut, hAacEnc->maxFrames, cm);
    591   if (ErrorStatus != AAC_ENC_OK)
    592     goto bail;
    593 
    594 
    595 
    596   qcInit.channelMapping      = &hAacEnc->channelMapping;
    597   qcInit.sceCpe              = 0;
    598 
    599   if ((config->bitrateMode>=1) && (config->bitrateMode<=5)) {
    600       qcInit.averageBits     = (averageBitsPerFrame+7)&~7;
    601       qcInit.bitRes          = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff;
    602       qcInit.maxBits         = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff;
    603       qcInit.maxBits         = (config->maxBitsPerFrame!=-1) ? fixMin(qcInit.maxBits, config->maxBitsPerFrame) : qcInit.maxBits;
    604       qcInit.maxBits         = fixMax(qcInit.maxBits, (averageBitsPerFrame+7)&~7);
    605       qcInit.minBits         = (config->minBitsPerFrame!=-1) ? config->minBitsPerFrame : 0;
    606       qcInit.minBits         = fixMin(qcInit.minBits, averageBitsPerFrame&~7);
    607   }
    608   else
    609   {
    610       int maxBitres;
    611       qcInit.averageBits     = (averageBitsPerFrame+7)&~7;
    612       maxBitres              = (MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff) - qcInit.averageBits;
    613       qcInit.bitRes          = (config->bitreservoir!=-1) ? FDKmin(config->bitreservoir, maxBitres) : maxBitres;
    614 
    615       qcInit.maxBits         = fixMin(MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes);
    616       qcInit.maxBits         = (config->maxBitsPerFrame!=-1) ? fixMin(qcInit.maxBits, config->maxBitsPerFrame) : qcInit.maxBits;
    617       qcInit.maxBits         = fixMin(MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff, fixMax(qcInit.maxBits, (averageBitsPerFrame+7+8)&~7));
    618 
    619       qcInit.minBits         = fixMax(0, ((averageBitsPerFrame-1)&~7)-qcInit.bitRes-transportEnc_GetStaticBits(hTpEnc, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes));
    620       qcInit.minBits         = (config->minBitsPerFrame!=-1) ? fixMax(qcInit.minBits, config->minBitsPerFrame) : qcInit.minBits;
    621       qcInit.minBits         = fixMin(qcInit.minBits, (averageBitsPerFrame - transportEnc_GetStaticBits(hTpEnc, qcInit.maxBits))&~7);
    622   }
    623 
    624   qcInit.sampleRate          = config->sampleRate;
    625   qcInit.advancedBitsToPe    = isLowDelay(config->audioObjectType) ? 1 : 0 ;
    626   qcInit.nSubFrames          = config->nSubFrames;
    627   qcInit.padding.paddingRest = config->sampleRate;
    628 
    629   /* Calc meanPe: qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config->sampleRate/2.0f); */
    630   bw_ratio = fDivNorm((FIXP_DBL)(10*config->framelength*hAacEnc->bandwidth90dB), (FIXP_DBL)(config->sampleRate), &qbw);
    631   qcInit.meanPe = FDKmax((INT)scaleValue(bw_ratio, qbw+1-(DFRACT_BITS-1)), 1);
    632 
    633   /* Calc maxBitFac */
    634   mbfac = fDivNorm((MIN_BUFSIZE_PER_EFF_CHAN-744)*cm->nChannelsEff, qcInit.averageBits/qcInit.nSubFrames, &qmbfac);
    635   qmbfac = DFRACT_BITS-1-qmbfac;
    636   qcInit.maxBitFac = (qmbfac > 24) ? (mbfac >> (qmbfac - 24)):(mbfac << (24 - qmbfac));
    637 
    638   switch(config->bitrateMode){
    639   case AACENC_BR_MODE_CBR:
    640     qcInit.bitrateMode = QCDATA_BR_MODE_CBR;
    641     break;
    642   case AACENC_BR_MODE_VBR_1:
    643     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_1;
    644     break;
    645   case AACENC_BR_MODE_VBR_2:
    646     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_2;
    647     break;
    648   case AACENC_BR_MODE_VBR_3:
    649     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_3;
    650     break;
    651   case AACENC_BR_MODE_VBR_4:
    652     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_4;
    653     break;
    654   case AACENC_BR_MODE_VBR_5:
    655     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_5;
    656     break;
    657   case AACENC_BR_MODE_SFR:
    658     qcInit.bitrateMode = QCDATA_BR_MODE_SFR;
    659     break;
    660   case AACENC_BR_MODE_FF:
    661     qcInit.bitrateMode = QCDATA_BR_MODE_FF;
    662     break;
    663   default:
    664     ErrorStatus = AAC_ENC_UNSUPPORTED_BITRATE_MODE;
    665     goto bail;
    666   }
    667 
    668   qcInit.invQuant = (config->useRequant)?2:0;
    669 
    670   /* maxIterations should be set to the maximum number of requantization iterations that are
    671    * allowed before the crash recovery functionality is activated. This setting should be adjusted
    672    * to the processing power available, i.e. to the processing power headroom in one frame that is
    673    * still left after normal encoding without requantization. Please note that if activated this
    674    * functionality is used most likely only in cases where the encoder is operating beyond
    675    * recommended settings, i.e. the audio quality is suboptimal anyway. Activating the crash
    676    * recovery does not further reduce audio quality significantly in these cases. */
    677   if ( (config->audioObjectType == AOT_ER_AAC_LD) || (config->audioObjectType == AOT_ER_AAC_ELD) ) {
    678     qcInit.maxIterations = 2;
    679   }
    680   else
    681   {
    682     qcInit.maxIterations = 5;
    683   }
    684 
    685   qcInit.bitrate = config->bitRate - config->ancDataBitRate;
    686 
    687   qcInit.staticBits = transportEnc_GetStaticBits(hTpEnc, qcInit.averageBits/qcInit.nSubFrames);
    688 
    689   ErrorStatus = FDKaacEnc_QCInit(hAacEnc->qcKernel, &qcInit);
    690   if (ErrorStatus != AAC_ENC_OK)
    691     goto bail;
    692 
    693   hAacEnc->aot = hAacEnc->config->audioObjectType;
    694 
    695   /* common things */
    696 
    697   return AAC_ENC_OK;
    698 
    699 bail:
    700 
    701   return ErrorStatus;
    702 }
    703 
    704 
    705 /*---------------------------------------------------------------------------
    706 
    707     functionname: FDKaacEnc_EncodeFrame
    708     description:  encodes one frame
    709     returns:      error code
    710 
    711   ---------------------------------------------------------------------------*/
    712 AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC       hAacEnc,          /* encoder handle */
    713                                          HANDLE_TRANSPORTENC  hTpEnc,
    714                                          INT_PCM* RESTRICT    inputBuffer,
    715                                          INT*                 nOutBytes,
    716                                          AACENC_EXT_PAYLOAD   extPayload[MAX_TOTAL_EXT_PAYLOADS]
    717                                        )
    718 {
    719     AAC_ENCODER_ERROR ErrorStatus;
    720     int    el, n, c=0;
    721     UCHAR  extPayloadUsed[MAX_TOTAL_EXT_PAYLOADS];
    722 
    723     CHANNEL_MAPPING *cm      = &hAacEnc->channelMapping;
    724 
    725 
    726 
    727     PSY_OUT *psyOut = hAacEnc->psyOut[c];
    728     QC_OUT  *qcOut  = hAacEnc->qcOut[c];
    729 
    730     FDKmemclear(extPayloadUsed, MAX_TOTAL_EXT_PAYLOADS * sizeof(UCHAR));
    731 
    732     qcOut->elementExtBits = 0; /* sum up all extended bit of each element */
    733     qcOut->staticBits     = 0; /* sum up side info bits of each element */
    734     qcOut->totalNoRedPe   = 0; /* sum up PE */
    735 
    736     /* advance psychoacoustics */
    737     for (el=0; el<cm->nElements; el++) {
    738         ELEMENT_INFO elInfo = cm->elInfo[el];
    739 
    740         if ( (elInfo.elType == ID_SCE)
    741           || (elInfo.elType == ID_CPE)
    742           || (elInfo.elType == ID_LFE) )
    743         {
    744             int ch;
    745 
    746             /* update pointer!*/
    747             for(ch=0;ch<elInfo.nChannelsInEl;ch++) {
    748                 PSY_OUT_CHANNEL *psyOutChan = psyOut->psyOutElement[el]->psyOutChannel[ch];
    749                 QC_OUT_CHANNEL  *qcOutChan = qcOut->qcElement[el]->qcOutChannel[ch];
    750 
    751                 psyOutChan->mdctSpectrum       = qcOutChan->mdctSpectrum;
    752                 psyOutChan->sfbSpreadEnergy  = qcOutChan->sfbSpreadEnergy;
    753                 psyOutChan->sfbEnergy          = qcOutChan->sfbEnergy;
    754                 psyOutChan->sfbEnergyLdData    = qcOutChan->sfbEnergyLdData;
    755                 psyOutChan->sfbMinSnrLdData    = qcOutChan->sfbMinSnrLdData;
    756                 psyOutChan->sfbThresholdLdData = qcOutChan->sfbThresholdLdData;
    757 
    758             }
    759 
    760             FDKaacEnc_psyMain(elInfo.nChannelsInEl,
    761                               hAacEnc->psyKernel->psyElement[el],
    762                               hAacEnc->psyKernel->psyDynamic,
    763                               hAacEnc->psyKernel->psyConf,
    764                               psyOut->psyOutElement[el],
    765                               inputBuffer,
    766                               cm->elInfo[el].ChannelIndex,
    767                               cm->nChannels
    768 
    769                     );
    770 
    771             /* FormFactor, Pe and staticBitDemand calculation */
    772             ErrorStatus = FDKaacEnc_QCMainPrepare(&elInfo,
    773                                                    hAacEnc->qcKernel->hAdjThr->adjThrStateElem[el],
    774                                                    psyOut->psyOutElement[el],
    775                                                    qcOut->qcElement[el],
    776                                                    hAacEnc->aot,
    777                                                    hAacEnc->config->syntaxFlags,
    778                                                    hAacEnc->config->epConfig);
    779 
    780             if (ErrorStatus != AAC_ENC_OK)
    781               return ErrorStatus;
    782 
    783             /*-------------------------------------------- */
    784 
    785             qcOut->qcElement[el]->extBitsUsed = 0;
    786             qcOut->qcElement[el]->nExtensions = 0;
    787             /* reset extension payload */
    788             FDKmemclear(&qcOut->qcElement[el]->extension, (1)*sizeof(QC_OUT_EXTENSION));
    789 
    790             for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) {
    791                 if ( !extPayloadUsed[n]
    792                   && (extPayload[n].associatedChElement == el)
    793                   && (extPayload[n].dataSize > 0)
    794                   && (extPayload[n].pData != NULL) )
    795                 {
    796                     int idx = qcOut->qcElement[el]->nExtensions++;
    797 
    798                     qcOut->qcElement[el]->extension[idx].type         = extPayload[n].dataType;   /* Perform a sanity check on the type? */
    799                     qcOut->qcElement[el]->extension[idx].nPayloadBits = extPayload[n].dataSize;
    800                     qcOut->qcElement[el]->extension[idx].pPayload = extPayload[n].pData;
    801                     /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */
    802                     qcOut->qcElement[el]->extBitsUsed +=
    803                           FDKaacEnc_writeExtensionData( NULL,
    804                                                        &qcOut->qcElement[el]->extension[idx],
    805                                                         0, 0,
    806                                                         hAacEnc->config->syntaxFlags,
    807                                                         hAacEnc->aot,
    808                                                         hAacEnc->config->epConfig );
    809                     extPayloadUsed[n] = 1;
    810                 }
    811             }
    812 
    813             /* sum up extension and static bits for all channel elements */
    814             qcOut->elementExtBits += qcOut->qcElement[el]->extBitsUsed;
    815             qcOut->staticBits   += qcOut->qcElement[el]->staticBitsUsed;
    816 
    817             /* sum up pe */
    818             qcOut->totalNoRedPe += qcOut->qcElement[el]->peData.pe;
    819         }
    820     }
    821 
    822     qcOut->nExtensions   = 0;
    823     qcOut->globalExtBits = 0;
    824 
    825     /* reset extension payload */
    826     FDKmemclear(&qcOut->extension, (2+2)*sizeof(QC_OUT_EXTENSION));
    827 
    828     /* Add extension payload not assigned to an channel element
    829       (Ancillary data is the only supported type up to now) */
    830     for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) {
    831         if ( !extPayloadUsed[n]
    832           && (extPayload[n].associatedChElement == -1)
    833           && (extPayload[n].pData != NULL) )
    834         {
    835             UINT payloadBits = 0;
    836 
    837             if (extPayload[n].dataType == EXT_DATA_ELEMENT) {
    838                 if (hAacEnc->ancillaryBitsPerFrame) {
    839                     /* granted frame dse bitrate */
    840                     payloadBits = hAacEnc->ancillaryBitsPerFrame;
    841                 }
    842                 else {
    843                     /* write anc data if bitrate constraint fulfilled */
    844                     if ((extPayload[n].dataSize>>3) <= hAacEnc->config->maxAncBytesPerAU) {
    845                         payloadBits = extPayload[n].dataSize;
    846                     }
    847                 }
    848                 payloadBits = fixMin( extPayload[n].dataSize, payloadBits );
    849             } else {
    850                 payloadBits = extPayload[n].dataSize;
    851             }
    852 
    853             if (payloadBits > 0)
    854             {
    855                 int idx = qcOut->nExtensions++;
    856 
    857                 qcOut->extension[idx].type         = extPayload[n].dataType;   /* Perform a sanity check on the type? */
    858                 qcOut->extension[idx].nPayloadBits = payloadBits;
    859                 qcOut->extension[idx].pPayload = extPayload[n].pData;
    860                 /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */
    861                 qcOut->globalExtBits += FDKaacEnc_writeExtensionData( NULL,
    862                                                                      &qcOut->extension[idx],
    863                                                                       0, 0,
    864                                                                       hAacEnc->config->syntaxFlags,
    865                                                                       hAacEnc->aot,
    866                                                                       hAacEnc->config->epConfig );
    867                 if (extPayload[n].dataType == EXT_DATA_ELEMENT) {
    868                     /* substract the processed bits */
    869                     extPayload[n].dataSize -= payloadBits;
    870                 }
    871                 extPayloadUsed[n] = 1;
    872             }
    873         }
    874     }
    875 
    876     if (!(hAacEnc->config->syntaxFlags & (AC_SCALABLE|AC_ER))) {
    877       qcOut->globalExtBits += EL_ID_BITS;  /* add bits for ID_END */
    878     }
    879 
    880     /* build bitstream all nSubFrames */
    881     {
    882         INT totalBits    = 0;   /* Total AU bits */;
    883         INT avgTotalBits = 0;
    884 
    885         /*-------------------------------------------- */
    886         /* Get average total bits */
    887         /*-------------------------------------------- */
    888         {
    889             /* frame wise bitrate adaption */
    890             FDKaacEnc_AdjustBitrate(hAacEnc->qcKernel,
    891                                     cm,
    892                                    &avgTotalBits,
    893                                     hAacEnc->config->bitRate,
    894                                     hAacEnc->config->sampleRate,
    895                                     hAacEnc->config->framelength);
    896 
    897             /* adjust super frame bitrate */
    898             avgTotalBits *= hAacEnc->config->nSubFrames;
    899         }
    900 
    901         /* Make first estimate of transport header overhead.
    902            Take maximum possible frame size into account to prevent bitreservoir underrun. */
    903         hAacEnc->qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, avgTotalBits + hAacEnc->qcKernel->bitResTot);
    904 
    905 
    906         /*-------------------------------------------- */
    907         /*-------------------------------------------- */
    908         /*-------------------------------------------- */
    909 
    910         ErrorStatus = FDKaacEnc_QCMain(hAacEnc->qcKernel,
    911                                        hAacEnc->psyOut,
    912                                        hAacEnc->qcOut,
    913                                        avgTotalBits,
    914                                        cm
    915                                       ,hAacEnc->aot,
    916                                        hAacEnc->config->syntaxFlags,
    917                                        hAacEnc->config->epConfig);
    918 
    919         if (ErrorStatus != AAC_ENC_OK)
    920             return ErrorStatus;
    921         /*-------------------------------------------- */
    922 
    923         /*-------------------------------------------- */
    924         ErrorStatus = FDKaacEnc_updateFillBits(cm,
    925                                                hAacEnc->qcKernel,
    926                                                hAacEnc->qcKernel->elementBits,
    927                                                hAacEnc->qcOut);
    928         if (ErrorStatus != AAC_ENC_OK)
    929             return ErrorStatus;
    930 
    931             /*-------------------------------------------- */
    932             ErrorStatus = FDKaacEnc_FinalizeBitConsumption(cm,
    933                                                            hAacEnc->qcKernel,
    934                                                            qcOut,
    935                                                            qcOut->qcElement,
    936                                                            hTpEnc,
    937                                                            hAacEnc->aot,
    938                                                            hAacEnc->config->syntaxFlags,
    939                                                            hAacEnc->config->epConfig);
    940             if (ErrorStatus != AAC_ENC_OK)
    941                 return ErrorStatus;
    942             /*-------------------------------------------- */
    943             totalBits += qcOut->totalBits;
    944 
    945 
    946         /*-------------------------------------------- */
    947         FDKaacEnc_updateBitres(cm,
    948                                hAacEnc->qcKernel,
    949                                hAacEnc->qcOut);
    950 
    951         /*-------------------------------------------- */
    952 
    953         /* for ( all sub frames ) ... */
    954               /* write bitstream header */
    955               transportEnc_WriteAccessUnit(
    956                     hTpEnc,
    957                     totalBits,
    958                     FDKaacEnc_EncBitresToTpBitres(hAacEnc),
    959                     cm->nChannelsEff);
    960 
    961               /* write bitstream */
    962               ErrorStatus = FDKaacEnc_WriteBitstream(
    963                     hTpEnc,
    964                     cm,
    965                     qcOut,
    966                     psyOut,
    967                     hAacEnc->qcKernel,
    968                     hAacEnc->aot,
    969                     hAacEnc->config->syntaxFlags,
    970                     hAacEnc->config->epConfig);
    971 
    972               if (ErrorStatus != AAC_ENC_OK)
    973                 return ErrorStatus;
    974 
    975               /* transportEnc_EndAccessUnit() is being called inside FDKaacEnc_WriteBitstream() */
    976               transportEnc_GetFrame(hTpEnc, nOutBytes);
    977 
    978     } /* -end- if (curFrame==hAacEnc->qcKernel->nSubFrames) */
    979 
    980 
    981     /*-------------------------------------------- */
    982     return AAC_ENC_OK;
    983 }
    984 
    985 /*---------------------------------------------------------------------------
    986 
    987     functionname:FDKaacEnc_Close
    988     description: delete encoder instance
    989     returns:
    990 
    991   ---------------------------------------------------------------------------*/
    992 
    993 void FDKaacEnc_Close( HANDLE_AAC_ENC*  phAacEnc)   /* encoder handle */
    994 {
    995     if (*phAacEnc == NULL) {
    996       return;
    997     }
    998     AAC_ENC *hAacEnc = (AAC_ENC*)*phAacEnc;
    999 
   1000    if (hAacEnc->dynamic_RAM != NULL)
   1001        FreeAACdynamic_RAM(&hAacEnc->dynamic_RAM);
   1002 
   1003     FDKaacEnc_PsyClose(&hAacEnc->psyKernel,hAacEnc->psyOut);
   1004 
   1005     FDKaacEnc_QCClose(&hAacEnc->qcKernel, hAacEnc->qcOut);
   1006 
   1007     FreeRam_aacEnc_AacEncoder(phAacEnc);
   1008 }
   1009 
   1010 
   1011 /* The following functions are in this source file only for convenience and */
   1012 /* need not be visible outside of a possible encoder library. */
   1013 
   1014 /* basic defines for ancillary data */
   1015 #define MAX_ANCRATE 19200            /* ancillary rate >= 19200 isn't valid */
   1016 
   1017 /*---------------------------------------------------------------------------
   1018 
   1019     functionname:  FDKaacEnc_InitCheckAncillary
   1020     description:   initialize and check ancillary data struct
   1021     return:        if success or NULL if error
   1022 
   1023   ---------------------------------------------------------------------------*/
   1024 static AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate,
   1025                                                       INT framelength,
   1026                                                       INT ancillaryRate,
   1027                                                       INT *ancillaryBitsPerFrame,
   1028                                                       INT sampleRate)
   1029 {
   1030   INT diffToByteAlign;
   1031 
   1032   /* don't use negative ancillary rates */
   1033   if ( ancillaryRate < -1 )
   1034     return AAC_ENC_UNSUPPORTED_ANC_BITRATE;
   1035 
   1036   /* check if ancillary rate is ok */
   1037   if ( (ancillaryRate != (-1)) && (ancillaryRate != 0) ) {
   1038     /* ancRate <= 15% of bitrate && ancRate < 19200 */
   1039     if ( ( ancillaryRate >= MAX_ANCRATE ) ||
   1040          ( (ancillaryRate * 20) > (bitRate * 3) ) ) {
   1041       return AAC_ENC_UNSUPPORTED_ANC_BITRATE;
   1042     }
   1043   }
   1044   else if (ancillaryRate == -1) {
   1045     /* if no special ancRate is requested but a ancillary file is
   1046        stated, then generate a ancillary rate matching to the bitrate */
   1047     if (bitRate >= (MAX_ANCRATE * 10)) {
   1048       /* ancillary rate is 19199 */
   1049       ancillaryRate = (MAX_ANCRATE - 1);
   1050     }
   1051     else { /* 10% of bitrate */
   1052       ancillaryRate = bitRate / 10;
   1053     }
   1054   }
   1055 
   1056   /* make ancillaryBitsPerFrame byte align */
   1057   *ancillaryBitsPerFrame = (ancillaryRate * framelength ) / sampleRate;
   1058   diffToByteAlign = *ancillaryBitsPerFrame % 8;
   1059   *ancillaryBitsPerFrame = *ancillaryBitsPerFrame - diffToByteAlign;
   1060 
   1061   return AAC_ENC_OK;
   1062 }
   1063