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) * (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     = -1;                   /* Framesize not configured */
    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_ER_AAC_LD
    455         || config->audioObjectType == AOT_ER_AAC_ELD )
    456       {
    457         return AAC_ENC_INVALID_FRAME_LENGTH;
    458       }
    459       break;
    460     case 512:
    461     case 480:
    462       if ( config->audioObjectType != AOT_ER_AAC_LD
    463         && config->audioObjectType != AOT_ER_AAC_ELD )
    464       {
    465         return AAC_ENC_INVALID_FRAME_LENGTH;
    466       }
    467       break;
    468     default:
    469       return AAC_ENC_INVALID_FRAME_LENGTH;
    470   }
    471 
    472   if (config->anc_Rate != 0) {
    473 
    474      ErrorStatus = FDKaacEnc_InitCheckAncillary(config->bitRate,
    475                                                 config->framelength,
    476                                                 config->anc_Rate,
    477                                                &hAacEnc->ancillaryBitsPerFrame,
    478                                                 config->sampleRate);
    479      if (ErrorStatus != AAC_ENC_OK)
    480        goto bail;
    481 
    482 
    483      /* update estimated consumed bitrate */
    484      config->ancDataBitRate += ( (hAacEnc->ancillaryBitsPerFrame * config->sampleRate) / config->framelength );
    485 
    486   }
    487 
    488   /* maximal allowed DSE bytes in frame */
    489   {
    490   /* fixpoint calculation*/
    491   INT q_res, encBitrate, sc;
    492   FIXP_DBL tmp = fDivNorm(config->framelength, config->sampleRate, &q_res);
    493   encBitrate = (config->bitRate/*-config->ancDataBitRate*/)- (INT)(config->nChannels*8000);
    494   sc = CountLeadingBits(encBitrate);
    495   config->maxAncBytesPerAU = FDKmin( (256), FDKmax(0,(INT)(fMultDiv2(tmp, (FIXP_DBL)(encBitrate<<sc))>>(-q_res+sc-1+3))) );
    496   }
    497 
    498   /* bind config to hAacEnc->config */
    499   hAacEnc->config = config;
    500 
    501   /* set hAacEnc->bitrateMode */
    502   hAacEnc->bitrateMode = (AACENC_BITRATE_MODE)config->bitrateMode;
    503 
    504   hAacEnc->encoderMode = config->channelMode;
    505 
    506   ErrorStatus = FDKaacEnc_InitChannelMapping(hAacEnc->encoderMode, config->channelOrder, &hAacEnc->channelMapping);
    507   if (ErrorStatus != AAC_ENC_OK)
    508     goto bail;
    509 
    510   cm = &hAacEnc->channelMapping;
    511 
    512   ErrorStatus = FDKaacEnc_DetermineBandWidth(&hAacEnc->config->bandWidth,
    513                                              config->bandWidth,
    514                                              config->bitRate - config->ancDataBitRate,
    515                                              hAacEnc->bitrateMode,
    516                                              config->sampleRate,
    517                                              config->framelength,
    518                                              cm,
    519                                              hAacEnc->encoderMode);
    520   if (ErrorStatus != AAC_ENC_OK)
    521     goto bail;
    522 
    523   hAacEnc->bandwidth90dB = (INT)hAacEnc->config->bandWidth;
    524 
    525   tnsMask = config->useTns ? TNS_ENABLE_MASK : 0x0;
    526   psyBitrate = config->bitRate - config->ancDataBitRate;
    527 
    528   ErrorStatus = FDKaacEnc_psyInit(hAacEnc->psyKernel,
    529                                   hAacEnc->psyOut,
    530                                   hAacEnc->maxFrames,
    531                                   hAacEnc->maxChannels,
    532                                   config->audioObjectType,
    533                                   cm);
    534   if (ErrorStatus != AAC_ENC_OK)
    535     goto bail;
    536 
    537   ErrorStatus = FDKaacEnc_psyMainInit(hAacEnc->psyKernel,
    538                                       config->audioObjectType,
    539                                       cm,
    540                                       config->sampleRate,
    541                                       config->framelength,
    542                                       psyBitrate,
    543                                       tnsMask,
    544                                       hAacEnc->bandwidth90dB,
    545                                       config->usePns,
    546                                       config->useIS,
    547                                       config->syntaxFlags,
    548                                       initFlags);
    549   if (ErrorStatus != AAC_ENC_OK)
    550     goto bail;
    551 
    552   ErrorStatus = FDKaacEnc_QCOutInit(hAacEnc->qcOut, hAacEnc->maxFrames, cm);
    553   if (ErrorStatus != AAC_ENC_OK)
    554     goto bail;
    555 
    556 
    557 
    558   qcInit.channelMapping      = &hAacEnc->channelMapping;
    559   qcInit.sceCpe              = 0;
    560 
    561   {
    562       int maxBitres;
    563       qcInit.averageBits     = (averageBitsPerFrame+7)&~7;
    564       maxBitres              = (MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff) - qcInit.averageBits;
    565       qcInit.bitRes          = (config->bitreservoir!=-1) ? FDKmin(config->bitreservoir, maxBitres) : maxBitres;
    566 
    567       qcInit.maxBits         = fixMin(MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes);
    568       qcInit.maxBits         = (config->maxBitsPerFrame!=-1) ? fixMin(qcInit.maxBits, config->maxBitsPerFrame) : qcInit.maxBits;
    569 
    570       qcInit.minBits         = fixMax(0, ((averageBitsPerFrame-1)&~7)-qcInit.bitRes-transportEnc_GetStaticBits(hTpEnc, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes));
    571       qcInit.minBits         = (config->minBitsPerFrame!=-1) ? fixMax(qcInit.minBits, config->minBitsPerFrame) : qcInit.minBits;
    572   }
    573 
    574   qcInit.nSubFrames          = config->nSubFrames;
    575   qcInit.padding.paddingRest = config->sampleRate;
    576 
    577   /* Calc meanPe */
    578   bw_ratio = fDivNorm((FIXP_DBL)hAacEnc->bandwidth90dB, (FIXP_DBL)(config->sampleRate>>1), &qbw);
    579   qbw = DFRACT_BITS-1-qbw;
    580   /* qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config->sampleRate/2.0f); */
    581   qcInit.meanPe = fMult(bw_ratio, (FIXP_DBL)((10*config->framelength)<<16)) >> (qbw-15);
    582 
    583   /* Calc maxBitFac */
    584   mbfac = fDivNorm((MIN_BUFSIZE_PER_EFF_CHAN-744)*cm->nChannelsEff, qcInit.averageBits/qcInit.nSubFrames, &qmbfac);
    585   qmbfac = DFRACT_BITS-1-qmbfac;
    586   qcInit.maxBitFac = (qmbfac > 24) ? (mbfac >> (qmbfac - 24)):(mbfac << (24 - qmbfac));
    587 
    588   switch(config->bitrateMode){
    589   case AACENC_BR_MODE_CBR:
    590     qcInit.bitrateMode = QCDATA_BR_MODE_CBR;
    591     break;
    592   case AACENC_BR_MODE_VBR_1:
    593     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_1;
    594     break;
    595   case AACENC_BR_MODE_VBR_2:
    596     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_2;
    597     break;
    598   case AACENC_BR_MODE_VBR_3:
    599     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_3;
    600     break;
    601   case AACENC_BR_MODE_VBR_4:
    602     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_4;
    603     break;
    604   case AACENC_BR_MODE_VBR_5:
    605     qcInit.bitrateMode = QCDATA_BR_MODE_VBR_5;
    606     break;
    607   case AACENC_BR_MODE_SFR:
    608     qcInit.bitrateMode = QCDATA_BR_MODE_SFR;
    609     break;
    610   case AACENC_BR_MODE_FF:
    611     qcInit.bitrateMode = QCDATA_BR_MODE_FF;
    612     break;
    613   default:
    614     ErrorStatus = AAC_ENC_UNSUPPORTED_BITRATE_MODE;
    615     goto bail;
    616   }
    617 
    618   qcInit.invQuant = (config->useRequant)?2:0;
    619 
    620   /* maxIterations should be set to the maximum number of requantization iterations that are
    621    * allowed before the crash recovery functionality is activated. This setting should be adjusted
    622    * to the processing power available, i.e. to the processing power headroom in one frame that is
    623    * still left after normal encoding without requantization. Please note that if activated this
    624    * functionality is used most likely only in cases where the encoder is operating beyond
    625    * recommended settings, i.e. the audio quality is suboptimal anyway. Activating the crash
    626    * recovery does not further reduce audio quality significantly in these cases. */
    627   if ( (config->audioObjectType == AOT_ER_AAC_LD) || (config->audioObjectType == AOT_ER_AAC_ELD) ) {
    628     qcInit.maxIterations = 2;
    629   }
    630   else
    631   {
    632     qcInit.maxIterations = 5;
    633   }
    634 
    635   qcInit.bitrate = config->bitRate - config->ancDataBitRate;
    636 
    637   qcInit.staticBits = transportEnc_GetStaticBits(hTpEnc, qcInit.averageBits/qcInit.nSubFrames);
    638 
    639   ErrorStatus = FDKaacEnc_QCInit(hAacEnc->qcKernel, &qcInit);
    640   if (ErrorStatus != AAC_ENC_OK)
    641     goto bail;
    642 
    643   /* Map virtual aot's to intern aot used in bitstream writer. */
    644   switch (hAacEnc->config->audioObjectType) {
    645     case AOT_MP2_AAC_LC:
    646     case AOT_DABPLUS_AAC_LC:
    647       hAacEnc->aot = AOT_AAC_LC;
    648       break;
    649     case AOT_MP2_SBR:
    650     case AOT_DABPLUS_SBR:
    651       hAacEnc->aot = AOT_SBR;
    652       break;
    653     case AOT_MP2_PS:
    654     case AOT_DABPLUS_PS:
    655       hAacEnc->aot = AOT_PS;
    656       break;
    657     default:
    658       hAacEnc->aot = hAacEnc->config->audioObjectType;
    659   }
    660 
    661   /* common things */
    662 
    663   return AAC_ENC_OK;
    664 
    665 bail:
    666 
    667   return ErrorStatus;
    668 }
    669 
    670 
    671 /*---------------------------------------------------------------------------
    672 
    673     functionname: FDKaacEnc_EncodeFrame
    674     description:  encodes one frame
    675     returns:      error code
    676 
    677   ---------------------------------------------------------------------------*/
    678 AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC       hAacEnc,          /* encoder handle */
    679                                          HANDLE_TRANSPORTENC  hTpEnc,
    680                                          INT_PCM* RESTRICT    inputBuffer,
    681                                          INT*                 nOutBytes,
    682                                          AACENC_EXT_PAYLOAD   extPayload[MAX_TOTAL_EXT_PAYLOADS]
    683                                        )
    684 {
    685     AAC_ENCODER_ERROR ErrorStatus;
    686     int    el, n, c=0;
    687     UCHAR  extPayloadUsed[MAX_TOTAL_EXT_PAYLOADS];
    688 
    689     CHANNEL_MAPPING *cm      = &hAacEnc->channelMapping;
    690 
    691 
    692 
    693     PSY_OUT *psyOut = hAacEnc->psyOut[c];
    694     QC_OUT  *qcOut  = hAacEnc->qcOut[c];
    695 
    696     FDKmemclear(extPayloadUsed, MAX_TOTAL_EXT_PAYLOADS * sizeof(UCHAR));
    697 
    698     qcOut->elementExtBits = 0; /* sum up all extended bit of each element */
    699     qcOut->staticBits     = 0; /* sum up side info bits of each element */
    700     qcOut->totalNoRedPe   = 0; /* sum up PE */
    701 
    702     /* advance psychoacoustics */
    703     for (el=0; el<cm->nElements; el++) {
    704         ELEMENT_INFO elInfo = cm->elInfo[el];
    705 
    706         if ( (elInfo.elType == ID_SCE)
    707           || (elInfo.elType == ID_CPE)
    708           || (elInfo.elType == ID_LFE) )
    709         {
    710             int ch;
    711 
    712             /* update pointer!*/
    713             for(ch=0;ch<elInfo.nChannelsInEl;ch++) {
    714                 PSY_OUT_CHANNEL *psyOutChan = psyOut->psyOutElement[el]->psyOutChannel[ch];
    715                 QC_OUT_CHANNEL  *qcOutChan = qcOut->qcElement[el]->qcOutChannel[ch];
    716 
    717                 psyOutChan->mdctSpectrum       = qcOutChan->mdctSpectrum;
    718                 psyOutChan->sfbSpreadEnergy  = qcOutChan->sfbSpreadEnergy;
    719                 psyOutChan->sfbEnergy          = qcOutChan->sfbEnergy;
    720                 psyOutChan->sfbEnergyLdData    = qcOutChan->sfbEnergyLdData;
    721                 psyOutChan->sfbMinSnrLdData    = qcOutChan->sfbMinSnrLdData;
    722                 psyOutChan->sfbThresholdLdData = qcOutChan->sfbThresholdLdData;
    723 
    724             }
    725 
    726             FDKaacEnc_psyMain(elInfo.nChannelsInEl,
    727                               hAacEnc->psyKernel->psyElement[el],
    728                               hAacEnc->psyKernel->psyDynamic,
    729                               hAacEnc->psyKernel->psyConf,
    730                               psyOut->psyOutElement[el],
    731                               inputBuffer,
    732                               cm->elInfo[el].ChannelIndex,
    733                               cm->nChannels
    734 
    735                     );
    736 
    737             /* FormFactor, Pe and staticBitDemand calculation */
    738             ErrorStatus = FDKaacEnc_QCMainPrepare(&elInfo,
    739                                                    hAacEnc->qcKernel->hAdjThr->adjThrStateElem[el],
    740                                                    psyOut->psyOutElement[el],
    741                                                    qcOut->qcElement[el],
    742                                                    hAacEnc->aot,
    743                                                    hAacEnc->config->syntaxFlags,
    744                                                    hAacEnc->config->epConfig);
    745 
    746             if (ErrorStatus != AAC_ENC_OK)
    747               return ErrorStatus;
    748 
    749             /*-------------------------------------------- */
    750 
    751             qcOut->qcElement[el]->extBitsUsed = 0;
    752             qcOut->qcElement[el]->nExtensions = 0;
    753             /* reset extension payload */
    754             FDKmemclear(&qcOut->qcElement[el]->extension, (1)*sizeof(QC_OUT_EXTENSION));
    755 
    756             for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) {
    757                 if ( !extPayloadUsed[n]
    758                   && (extPayload[n].associatedChElement == el)
    759                   && (extPayload[n].dataSize > 0)
    760                   && (extPayload[n].pData != NULL) )
    761                 {
    762                     int idx = qcOut->qcElement[el]->nExtensions++;
    763 
    764                     qcOut->qcElement[el]->extension[idx].type         = extPayload[n].dataType;   /* Perform a sanity check on the type? */
    765                     qcOut->qcElement[el]->extension[idx].nPayloadBits = extPayload[n].dataSize;
    766                     qcOut->qcElement[el]->extension[idx].pPayload = extPayload[n].pData;
    767                     /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */
    768                     qcOut->qcElement[el]->extBitsUsed +=
    769                           FDKaacEnc_writeExtensionData( NULL,
    770                                                        &qcOut->qcElement[el]->extension[idx],
    771                                                         0, 0,
    772                                                         hAacEnc->config->syntaxFlags,
    773                                                         hAacEnc->aot,
    774                                                         hAacEnc->config->epConfig );
    775                     extPayloadUsed[n] = 1;
    776                 }
    777             }
    778 
    779             /* sum up extension and static bits for all channel elements */
    780             qcOut->elementExtBits += qcOut->qcElement[el]->extBitsUsed;
    781             qcOut->staticBits   += qcOut->qcElement[el]->staticBitsUsed;
    782 
    783             /* sum up pe */
    784             qcOut->totalNoRedPe += qcOut->qcElement[el]->peData.pe;
    785         }
    786     }
    787 
    788     qcOut->nExtensions   = 0;
    789     qcOut->globalExtBits = 0;
    790 
    791     /* reset extension payload */
    792     FDKmemclear(&qcOut->extension, (2+2)*sizeof(QC_OUT_EXTENSION));
    793 
    794     /* Add extension payload not assigned to an channel element
    795       (Ancillary data is the only supported type up to now) */
    796     for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) {
    797         if ( !extPayloadUsed[n]
    798           && (extPayload[n].associatedChElement == -1)
    799           && (extPayload[n].pData != NULL) )
    800         {
    801             UINT payloadBits = 0;
    802 
    803             if (extPayload[n].dataType == EXT_DATA_ELEMENT) {
    804                 if (hAacEnc->ancillaryBitsPerFrame) {
    805                     /* granted frame dse bitrate */
    806                     payloadBits = hAacEnc->ancillaryBitsPerFrame;
    807                 }
    808                 else {
    809                     /* write anc data if bitrate constraint fulfilled */
    810                     if ((extPayload[n].dataSize>>3) <= hAacEnc->config->maxAncBytesPerAU) {
    811                         payloadBits = extPayload[n].dataSize;
    812                     }
    813                 }
    814                 payloadBits = fixMin( extPayload[n].dataSize, payloadBits );
    815             } else {
    816                 payloadBits = extPayload[n].dataSize;
    817             }
    818 
    819             if (payloadBits > 0)
    820             {
    821                 int idx = qcOut->nExtensions++;
    822 
    823                 qcOut->extension[idx].type         = extPayload[n].dataType;   /* Perform a sanity check on the type? */
    824                 qcOut->extension[idx].nPayloadBits = payloadBits;
    825                 qcOut->extension[idx].pPayload = extPayload[n].pData;
    826                 /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */
    827                 qcOut->globalExtBits += FDKaacEnc_writeExtensionData( NULL,
    828                                                                      &qcOut->extension[idx],
    829                                                                       0, 0,
    830                                                                       hAacEnc->config->syntaxFlags,
    831                                                                       hAacEnc->aot,
    832                                                                       hAacEnc->config->epConfig );
    833                 if (extPayload[n].dataType == EXT_DATA_ELEMENT) {
    834                     /* substract the processed bits */
    835                     extPayload[n].dataSize -= payloadBits;
    836                 }
    837                 extPayloadUsed[n] = 1;
    838             }
    839         }
    840     }
    841 
    842     if (!(hAacEnc->config->syntaxFlags & (AC_SCALABLE|AC_ER))) {
    843       qcOut->globalExtBits += EL_ID_BITS;  /* add bits for ID_END */
    844     }
    845 
    846     /* build bitstream all nSubFrames */
    847     {
    848         INT totalBits    = 0;   /* Total AU bits */;
    849         INT avgTotalBits = 0;
    850 
    851         /*-------------------------------------------- */
    852         /* Get average total bits */
    853         /*-------------------------------------------- */
    854         {
    855             /* frame wise bitrate adaption */
    856             FDKaacEnc_AdjustBitrate(hAacEnc->qcKernel,
    857                                     cm,
    858                                    &avgTotalBits,
    859                                     hAacEnc->config->bitRate,
    860                                     hAacEnc->config->sampleRate,
    861                                     hAacEnc->config->framelength);
    862 
    863             /* adjust super frame bitrate */
    864             avgTotalBits *= hAacEnc->config->nSubFrames;
    865         }
    866 
    867         /* Make first estimate of transport header overhead.
    868            Take maximum possible frame size into account to prevent bitreservoir underrun. */
    869         hAacEnc->qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, avgTotalBits + hAacEnc->qcKernel->bitResTot);
    870 
    871 
    872         /*-------------------------------------------- */
    873         /*-------------------------------------------- */
    874         /*-------------------------------------------- */
    875 
    876         ErrorStatus = FDKaacEnc_QCMain(hAacEnc->qcKernel,
    877                                        hAacEnc->psyOut,
    878                                        hAacEnc->qcOut,
    879                                        avgTotalBits,
    880                                        cm
    881                                       ,hAacEnc->aot,
    882                                        hAacEnc->config->syntaxFlags,
    883                                        hAacEnc->config->epConfig);
    884 
    885         if (ErrorStatus != AAC_ENC_OK)
    886             return ErrorStatus;
    887         /*-------------------------------------------- */
    888 
    889         /*-------------------------------------------- */
    890         ErrorStatus = FDKaacEnc_updateFillBits(cm,
    891                                                hAacEnc->qcKernel,
    892                                                hAacEnc->qcKernel->elementBits,
    893                                                hAacEnc->qcOut);
    894         if (ErrorStatus != AAC_ENC_OK)
    895             return ErrorStatus;
    896 
    897             /*-------------------------------------------- */
    898             ErrorStatus = FDKaacEnc_FinalizeBitConsumption(cm,
    899                                                            hAacEnc->qcKernel,
    900                                                            qcOut,
    901                                                            qcOut->qcElement,
    902                                                            hTpEnc,
    903                                                            hAacEnc->aot,
    904                                                            hAacEnc->config->syntaxFlags,
    905                                                            hAacEnc->config->epConfig);
    906             if (ErrorStatus != AAC_ENC_OK)
    907                 return ErrorStatus;
    908             /*-------------------------------------------- */
    909             totalBits += qcOut->totalBits;
    910 
    911 
    912         /*-------------------------------------------- */
    913         FDKaacEnc_updateBitres(cm,
    914                                hAacEnc->qcKernel,
    915                                hAacEnc->qcOut);
    916 
    917         /*-------------------------------------------- */
    918 
    919         /* for ( all sub frames ) ... */
    920               /* write bitstream header */
    921               transportEnc_WriteAccessUnit(
    922                     hTpEnc,
    923                     totalBits,
    924                     FDKaacEnc_EncBitresToTpBitres(hAacEnc->bitrateMode, hAacEnc->qcKernel->bitResTot),
    925                     cm->nChannelsEff);
    926 
    927               /* write bitstream */
    928               ErrorStatus = FDKaacEnc_WriteBitstream(
    929                     hTpEnc,
    930                     cm,
    931                     qcOut,
    932                     psyOut,
    933                     hAacEnc->qcKernel,
    934                     hAacEnc->aot,
    935                     hAacEnc->config->syntaxFlags,
    936                     hAacEnc->config->epConfig);
    937 
    938               if (ErrorStatus != AAC_ENC_OK)
    939                 return ErrorStatus;
    940 
    941               /* transportEnc_EndAccessUnit() is being called inside FDKaacEnc_WriteBitstream() */
    942               transportEnc_GetFrame(hTpEnc, nOutBytes);
    943 
    944     } /* -end- if (curFrame==hAacEnc->qcKernel->nSubFrames) */
    945 
    946 
    947     /*-------------------------------------------- */
    948     return AAC_ENC_OK;
    949 }
    950 
    951 /*---------------------------------------------------------------------------
    952 
    953     functionname:FDKaacEnc_Close
    954     description: delete encoder instance
    955     returns:
    956 
    957   ---------------------------------------------------------------------------*/
    958 
    959 void FDKaacEnc_Close( HANDLE_AAC_ENC*  phAacEnc)   /* encoder handle */
    960 {
    961     if (*phAacEnc == NULL) {
    962       return;
    963     }
    964     AAC_ENC *hAacEnc = (AAC_ENC*)*phAacEnc;
    965 
    966    if (hAacEnc->dynamic_RAM != NULL)
    967        FreeAACdynamic_RAM(&hAacEnc->dynamic_RAM);
    968 
    969     FDKaacEnc_PsyClose(&hAacEnc->psyKernel,hAacEnc->psyOut);
    970 
    971     FDKaacEnc_QCClose(&hAacEnc->qcKernel, hAacEnc->qcOut);
    972 
    973     FreeRam_aacEnc_AacEncoder(phAacEnc);
    974 }
    975 
    976 
    977 /* The following functions are in this source file only for convenience and */
    978 /* need not be visible outside of a possible encoder library. */
    979 
    980 /* basic defines for ancillary data */
    981 #define MAX_ANCRATE 19200            /* ancillary rate >= 19200 isn't valid */
    982 
    983 /*---------------------------------------------------------------------------
    984 
    985     functionname:  FDKaacEnc_InitCheckAncillary
    986     description:   initialize and check ancillary data struct
    987     return:        if success or NULL if error
    988 
    989   ---------------------------------------------------------------------------*/
    990 static AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate,
    991                                                       INT framelength,
    992                                                       INT ancillaryRate,
    993                                                       INT *ancillaryBitsPerFrame,
    994                                                       INT sampleRate)
    995 {
    996   INT diffToByteAlign;
    997 
    998   /* don't use negative ancillary rates */
    999   if ( ancillaryRate < -1 )
   1000     return AAC_ENC_UNSUPPORTED_ANC_BITRATE;
   1001 
   1002   /* check if ancillary rate is ok */
   1003   if ( (ancillaryRate != (-1)) && (ancillaryRate != 0) ) {
   1004     /* ancRate <= 15% of bitrate && ancRate < 19200 */
   1005     if ( ( ancillaryRate >= MAX_ANCRATE ) ||
   1006          ( (ancillaryRate * 20) > (bitRate * 3) ) ) {
   1007       return AAC_ENC_UNSUPPORTED_ANC_BITRATE;
   1008     }
   1009   }
   1010   else if (ancillaryRate == -1) {
   1011     /* if no special ancRate is requested but a ancillary file is
   1012        stated, then generate a ancillary rate matching to the bitrate */
   1013     if (bitRate >= (MAX_ANCRATE * 10)) {
   1014       /* ancillary rate is 19199 */
   1015       ancillaryRate = (MAX_ANCRATE - 1);
   1016     }
   1017     else { /* 10% of bitrate */
   1018       ancillaryRate = bitRate / 10;
   1019     }
   1020   }
   1021 
   1022   /* make ancillaryBitsPerFrame byte align */
   1023   *ancillaryBitsPerFrame = (ancillaryRate * framelength ) / sampleRate;
   1024   diffToByteAlign = *ancillaryBitsPerFrame % 8;
   1025   *ancillaryBitsPerFrame = *ancillaryBitsPerFrame - diffToByteAlign;
   1026 
   1027   return AAC_ENC_OK;
   1028 }
   1029