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