Home | History | Annotate | Download | only in src
      1 
      2 /* -----------------------------------------------------------------------------------------------------------
      3 Software License for The Fraunhofer FDK AAC Codec Library for Android
      4 
      5  Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V.
      6   All rights reserved.
      7 
      8  1.    INTRODUCTION
      9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
     10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
     11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
     14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
     15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
     16 of the MPEG specifications.
     17 
     18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
     19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
     20 individually for the purpose of encoding or decoding bit streams in products that are compliant with
     21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
     22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
     23 software may already be covered under those patent licenses when it is used for those licensed purposes only.
     24 
     25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
     26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
     27 applications information and documentation.
     28 
     29 2.    COPYRIGHT LICENSE
     30 
     31 Redistribution and use in source and binary forms, with or without modification, are permitted without
     32 payment of copyright license fees provided that you satisfy the following conditions:
     33 
     34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
     35 your modifications thereto in source code form.
     36 
     37 You must retain the complete text of this software license in the documentation and/or other materials
     38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
     39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
     40 modifications thereto to recipients of copies in binary form.
     41 
     42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
     43 prior written permission.
     44 
     45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
     46 software or your modifications thereto.
     47 
     48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
     49 and the date of any change. For modified versions of the FDK AAC Codec, the term
     50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
     51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
     52 
     53 3.    NO PATENT LICENSE
     54 
     55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
     56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
     57 respect to this software.
     58 
     59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
     60 by appropriate patent licenses.
     61 
     62 4.    DISCLAIMER
     63 
     64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
     65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
     66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
     68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
     69 or business interruption, however caused and on any theory of liability, whether in contract, strict
     70 liability, or tort (including negligence), arising in any way out of the use of this software, even if
     71 advised of the possibility of such damage.
     72 
     73 5.    CONTACT INFORMATION
     74 
     75 Fraunhofer Institute for Integrated Circuits IIS
     76 Attention: Audio and Multimedia Departments - FDK AAC LL
     77 Am Wolfsmantel 33
     78 91058 Erlangen, Germany
     79 
     80 www.iis.fraunhofer.de/amm
     81 amm-info (at) iis.fraunhofer.de
     82 ----------------------------------------------------------------------------------------------------------- */
     83 
     84 /***************************  Fraunhofer IIS FDK Tools  ***********************
     85 
     86    Author(s): Andreas Ehret, Tobias Chalupka
     87    Description: SBR encoder top level processing.
     88 
     89 ******************************************************************************/
     90 
     91 #include "sbr_encoder.h"
     92 
     93 #include "sbr_ram.h"
     94 #include "sbr_rom.h"
     95 #include "sbrenc_freq_sca.h"
     96 #include "env_bit.h"
     97 #include "cmondata.h"
     98 #include "sbr_misc.h"
     99 #include "sbr.h"
    100 #include "qmf.h"
    101 
    102 #include "ps_main.h"
    103 
    104 #define SBRENCODER_LIB_VL0 3
    105 #define SBRENCODER_LIB_VL1 3
    106 #define SBRENCODER_LIB_VL2 4
    107 
    108 
    109 
    110 /***************************************************************************/
    111 /*
    112  * SBR Delay balancing definitions.
    113  */
    114 
    115 /*
    116       input buffer (1ch)
    117 
    118       |------------ 1537   -------------|-----|---------- 2048 -------------|
    119            (core2sbr delay     )          ds     (read, core and ds area)
    120 */
    121 
    122 #define SFB(dwnsmp)        (32 << (dwnsmp-1))     /* SBR Frequency bands: 64 for dual-rate, 32 for single-rate */
    123 #define STS(fl)            (((fl)==1024)?32:30)   /* SBR Time Slots: 32 for core frame length 1024, 30 for core frame length 960 */
    124 
    125 #define DELAY_QMF_ANA(dwnsmp) ((320<<((dwnsmp)-1)) - (32<<((dwnsmp)-1))) /* Full bandwidth */
    126 #define DELAY_HYB_ANA         (10*64)       /* + 0.5 */              /*  */
    127 #define DELAY_HYB_SYN         (6*64 - 32)                            /*  */
    128 #define DELAY_QMF_POSTPROC(dwnsmp) (32*(dwnsmp))                     /* QMF postprocessing delay */
    129 #define DELAY_DEC_QMF(dwnsmp) (6 * SFB(dwnsmp) )                     /* Decoder QMF overlap */
    130 #define DELAY_QMF_SYN         (2)                                    /* NO_POLY/2=2.5, rounded down to 2 */
    131 #define DELAY_QMF_DS          (32)                                   /* QMF synthesis for downsampled time signal */
    132 
    133 /* Delay in QMF paths */
    134 #define DELAY_SBR(fl,dwnsmp)     (DELAY_QMF_ANA(dwnsmp) + (SFB(dwnsmp)*STS(fl) - 1) + DELAY_QMF_SYN)
    135 #define DELAY_PS(fl,dwnsmp)      (DELAY_QMF_ANA(dwnsmp) + DELAY_HYB_ANA + DELAY_DEC_QMF(dwnsmp) + (SFB(dwnsmp)*STS(fl)-1) + DELAY_HYB_SYN + DELAY_QMF_SYN)
    136 #define DELAY_ELDSBR(fl,dwnsmp)  ( ( ((fl)/2)*(dwnsmp) ) - 1 + DELAY_QMF_POSTPROC(dwnsmp) )
    137 
    138 /* Delay differences for SBR and SBR+PS */
    139 #define MAX_DS_FILTER_DELAY (5)                                           /* the additional max downsampler filter delay (source fs) */
    140 #define DELAY_AAC2SBR(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_QMF_SYN) - DELAY_SBR((fl),(dwnsmp)))
    141 #define DELAY_ELD2SBR(fl,dwnsmp) ((DELAY_QMF_POSTPROC(dwnsmp)) - DELAY_ELDSBR(fl,dwnsmp))
    142 #define DELAY_AAC2PS(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_QMF_DS + /*(DELAY_AAC(fl)*2) + */ DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_HYB_SYN + DELAY_QMF_SYN) - DELAY_PS(fl,dwnsmp)) /* 2048 - 463*2 */
    143 
    144 /* Assumption: The sample delay resulting of of DELAY_AAC2PS is always smaller than the sample delay implied by DELAY_AAC2SBR */
    145 #define MAX_SAMPLE_DELAY       (DELAY_AAC2SBR(1024,2) + MAX_DS_FILTER_DELAY) /* maximum delay: frame length of 1024 and dual-rate sbr */
    146 
    147 /***************************************************************************/
    148 
    149 
    150 
    151 #define INVALID_TABLE_IDX -1
    152 
    153 /***************************************************************************/
    154 /*!
    155 
    156   \brief  Selects the SBR tuning settings to use dependent on number of
    157           channels, bitrate, sample rate and core coder
    158 
    159   \return Index to the appropriate table
    160 
    161 ****************************************************************************/
    162 #define DISTANCE_CEIL_VALUE 5000000
    163 static INT
    164 getSbrTuningTableIndex(UINT bitrate,    /*! the total bitrate in bits/sec */
    165                        UINT numChannels,/*! the number of channels for the core coder */
    166                        UINT sampleRate,  /*! the sampling rate of the core coder */
    167                        AUDIO_OBJECT_TYPE core,
    168                        UINT *pBitRateClosest
    169                        )
    170 {
    171   int i, bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1, found = 0;
    172   UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE;
    173   int isforThisCodec=0;
    174 
    175   #define isForThisCore(i) \
    176     ( ( sbrTuningTable[i].coreCoder == CODEC_AACLD && core == AOT_ER_AAC_ELD ) || \
    177       ( sbrTuningTable[i].coreCoder == CODEC_AAC   && core != AOT_ER_AAC_ELD ) )
    178 
    179   for (i=0; i < sbrTuningTableSize ; i++) {
    180     if ( isForThisCore(i) ) /* tuning table is for this core codec */
    181     {
    182       if ( numChannels == sbrTuningTable [i].numChannels
    183         && sampleRate == sbrTuningTable [i].sampleRate )
    184       {
    185         found = 1;
    186         if ((bitrate >= sbrTuningTable [i].bitrateFrom) &&
    187             (bitrate < sbrTuningTable [i].bitrateTo)) {
    188               bitRateClosestLower = bitrate;
    189               bitRateClosestUpper = bitrate;
    190               //FDKprintf("entry %d\n", i);
    191           return i ;
    192         } else {
    193           if ( sbrTuningTable [i].bitrateFrom > bitrate ) {
    194             if (sbrTuningTable [i].bitrateFrom < bitRateClosestLower) {
    195               bitRateClosestLower = sbrTuningTable [i].bitrateFrom;
    196               bitRateClosestLowerIndex = i;
    197             }
    198           }
    199           if ( sbrTuningTable [i].bitrateTo <= bitrate ) {
    200             if (sbrTuningTable [i].bitrateTo > bitRateClosestUpper) {
    201               bitRateClosestUpper = sbrTuningTable [i].bitrateTo-1;
    202               bitRateClosestUpperIndex = i;
    203             }
    204           }
    205         }
    206       }
    207     }
    208   }
    209 
    210   if (pBitRateClosest != NULL)
    211   {
    212     /* If there was at least one matching tuning entry found then pick the least distance bit rate */
    213     if (found)
    214     {
    215       int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE;
    216       if (bitRateClosestLowerIndex >= 0) {
    217         distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate;
    218       }
    219       if (bitRateClosestUpperIndex >= 0) {
    220         distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo;
    221       }
    222       if ( distanceUpper < distanceLower )
    223       {
    224         *pBitRateClosest = bitRateClosestUpper;
    225       } else {
    226         *pBitRateClosest = bitRateClosestLower;
    227       }
    228     } else {
    229       *pBitRateClosest = 0;
    230     }
    231   }
    232 
    233   return INVALID_TABLE_IDX;
    234 }
    235 
    236 /***************************************************************************/
    237 /*!
    238 
    239   \brief  Selects the PS tuning settings to use dependent on bitrate
    240   and core coder
    241 
    242   \return Index to the appropriate table
    243 
    244 ****************************************************************************/
    245 static INT
    246 getPsTuningTableIndex(UINT bitrate, UINT *pBitRateClosest){
    247 
    248   INT i, paramSets = sizeof (psTuningTable) / sizeof (psTuningTable [0]);
    249   int bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1;
    250   UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE;
    251 
    252   for (i = 0 ; i < paramSets ; i++)  {
    253     if ((bitrate >= psTuningTable [i].bitrateFrom) &&
    254         (bitrate < psTuningTable [i].bitrateTo)) {
    255       return i ;
    256     } else {
    257       if ( psTuningTable [i].bitrateFrom > bitrate ) {
    258         if (psTuningTable [i].bitrateFrom < bitRateClosestLower) {
    259           bitRateClosestLower = psTuningTable [i].bitrateFrom;
    260           bitRateClosestLowerIndex = i;
    261         }
    262       }
    263       if ( psTuningTable [i].bitrateTo <= bitrate ) {
    264         if (psTuningTable [i].bitrateTo > bitRateClosestUpper) {
    265           bitRateClosestUpper = psTuningTable [i].bitrateTo-1;
    266           bitRateClosestUpperIndex = i;
    267         }
    268       }
    269     }
    270   }
    271 
    272   if (pBitRateClosest != NULL)
    273   {
    274     int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE;
    275     if (bitRateClosestLowerIndex >= 0) {
    276       distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate;
    277     }
    278     if (bitRateClosestUpperIndex >= 0) {
    279       distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo;
    280     }
    281     if ( distanceUpper < distanceLower )
    282     {
    283       *pBitRateClosest = bitRateClosestUpper;
    284     } else {
    285       *pBitRateClosest = bitRateClosestLower;
    286     }
    287   }
    288 
    289   return INVALID_TABLE_IDX;
    290 }
    291 
    292 /***************************************************************************/
    293 /*!
    294 
    295   \brief  In case of downsampled SBR we may need to lower the stop freq
    296           of a tuning setting to fit into the lower half of the
    297           spectrum ( which is sampleRate/4 )
    298 
    299   \return the adapted stop frequency index (-1 -> error)
    300 
    301   \ingroup SbrEncCfg
    302 
    303 ****************************************************************************/
    304 static INT
    305 FDKsbrEnc_GetDownsampledStopFreq (
    306         const INT sampleRateCore,
    307         const INT startFreq,
    308               INT stopFreq,
    309         const INT downSampleFactor
    310         )
    311 {
    312   INT maxStopFreqRaw = sampleRateCore / 2;
    313   INT startBand, stopBand;
    314   HANDLE_ERROR_INFO err;
    315 
    316   while (stopFreq > 0 && FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > maxStopFreqRaw) {
    317     stopFreq--;
    318   }
    319 
    320   if (FDKsbrEnc_getSbrStopFreqRAW( stopFreq, sampleRateCore) > maxStopFreqRaw)
    321     return -1;
    322 
    323   err = FDKsbrEnc_FindStartAndStopBand (
    324                 sampleRateCore<<(downSampleFactor-1),
    325                 sampleRateCore,
    326                 32<<(downSampleFactor-1),
    327                 startFreq,
    328                 stopFreq,
    329                &startBand,
    330                &stopBand
    331                 );
    332   if (err)
    333     return -1;
    334 
    335   return stopFreq;
    336 }
    337 
    338 
    339 /***************************************************************************/
    340 /*!
    341 
    342   \brief  tells us, if for the given coreCoder, bitrate, number of channels
    343           and input sampling rate an SBR setting is available. If yes, it
    344           tells us also the core sampling rate we would need to run with
    345 
    346   \return a flag indicating success: yes (1) or no (0)
    347 
    348 ****************************************************************************/
    349 static UINT
    350 FDKsbrEnc_IsSbrSettingAvail (
    351         UINT bitrate,           /*! the total bitrate in bits/sec */
    352         UINT vbrMode,           /*! the vbr paramter, 0 means constant bitrate */
    353         UINT numOutputChannels, /*! the number of channels for the core coder */
    354         UINT sampleRateInput,   /*! the input sample rate [in Hz] */
    355         UINT sampleRateCore,    /*! the core's sampling rate */
    356         AUDIO_OBJECT_TYPE core
    357         )
    358 {
    359   INT idx = INVALID_TABLE_IDX;
    360 
    361   if (sampleRateInput < 16000)
    362     return 0;
    363 
    364   if (bitrate==0) {
    365     /* map vbr quality to bitrate */
    366     if (vbrMode < 30)
    367       bitrate = 24000;
    368     else if (vbrMode < 40)
    369       bitrate = 28000;
    370     else if (vbrMode < 60)
    371       bitrate = 32000;
    372     else if (vbrMode < 75)
    373       bitrate = 40000;
    374     else
    375       bitrate = 48000;
    376     bitrate *= numOutputChannels;
    377   }
    378 
    379   idx = getSbrTuningTableIndex(bitrate, numOutputChannels, sampleRateCore, core, NULL);
    380 
    381   return (idx == INVALID_TABLE_IDX ? 0 : 1);
    382 }
    383 
    384 
    385 /***************************************************************************/
    386 /*!
    387 
    388   \brief  Adjusts the SBR settings according to the chosen core coder
    389           settings which are accessible via config->codecSettings
    390 
    391   \return A flag indicating success: yes (1) or no (0)
    392 
    393 ****************************************************************************/
    394 static UINT
    395 FDKsbrEnc_AdjustSbrSettings (const sbrConfigurationPtr config, /*! output, modified */
    396                    UINT bitRate,             /*! the total bitrate in bits/sec */
    397                    UINT numChannels,         /*! the core coder number of channels */
    398                    UINT sampleRateCore,      /*! the core coder sampling rate in Hz */
    399                    UINT sampleRateSbr,       /*! the sbr coder sampling rate in Hz */
    400                    UINT transFac,            /*! the short block to long block ratio */
    401                    UINT standardBitrate,     /*! the standard bitrate per channel in bits/sec */
    402                    UINT vbrMode,             /*! the vbr paramter, 0 poor quality .. 100 high quality*/
    403                    UINT useSpeechConfig,     /*!< adapt tuning parameters for speech ? */
    404                    UINT lcsMode,             /*! the low complexity stereo mode */
    405                    UINT bParametricStereo,   /*!< use parametric stereo */
    406                    AUDIO_OBJECT_TYPE core)   /* Core audio codec object type */
    407 {
    408   INT idx = INVALID_TABLE_IDX;
    409   /* set the core codec settings */
    410   config->codecSettings.bitRate         = bitRate;
    411   config->codecSettings.nChannels       = numChannels;
    412   config->codecSettings.sampleFreq      = sampleRateCore;
    413   config->codecSettings.transFac        = transFac;
    414   config->codecSettings.standardBitrate = standardBitrate;
    415 
    416   if (bitRate==0) {
    417     /* map vbr quality to bitrate */
    418     if (vbrMode < 30)
    419       bitRate = 24000;
    420     else if (vbrMode < 40)
    421       bitRate = 28000;
    422     else if (vbrMode < 60)
    423       bitRate = 32000;
    424     else if (vbrMode < 75)
    425       bitRate = 40000;
    426     else
    427       bitRate = 48000;
    428     bitRate *= numChannels;
    429     /* fix to enable mono vbrMode<40 @ 44.1 of 48kHz */
    430     if (numChannels==1) {
    431       if (sampleRateSbr==44100 || sampleRateSbr==48000) {
    432         if (vbrMode<40) bitRate = 32000;
    433       }
    434     }
    435   }
    436 
    437   idx = getSbrTuningTableIndex(bitRate,numChannels,sampleRateCore, core, NULL);
    438 
    439   if (idx != INVALID_TABLE_IDX) {
    440     config->startFreq       = sbrTuningTable[idx].startFreq ;
    441     config->stopFreq        = sbrTuningTable[idx].stopFreq ;
    442     if (useSpeechConfig) {
    443       config->startFreq     = sbrTuningTable[idx].startFreqSpeech;
    444       config->stopFreq      = sbrTuningTable[idx].stopFreqSpeech;
    445     }
    446 
    447     /* Adapt stop frequency in case of downsampled SBR - only 32 bands then */
    448     if (1 == config->downSampleFactor) {
    449       INT dsStopFreq = FDKsbrEnc_GetDownsampledStopFreq(
    450                                sampleRateCore,
    451                                config->startFreq,
    452                                config->stopFreq,
    453                                config->downSampleFactor
    454                                );
    455       if (dsStopFreq < 0) {
    456         return 0;
    457       }
    458 
    459       config->stopFreq = dsStopFreq;
    460     }
    461 
    462     config->sbr_noise_bands = sbrTuningTable[idx].numNoiseBands ;
    463     if (core == AOT_ER_AAC_ELD)
    464       config->init_amp_res_FF = SBR_AMP_RES_1_5;
    465     config->noiseFloorOffset= sbrTuningTable[idx].noiseFloorOffset;
    466 
    467     config->ana_max_level   = sbrTuningTable[idx].noiseMaxLevel ;
    468     config->stereoMode      = sbrTuningTable[idx].stereoMode ;
    469     config->freqScale       = sbrTuningTable[idx].freqScale ;
    470 
    471     /* adjust usage of parametric coding dependent on bitrate and speech config flag */
    472     if (useSpeechConfig)
    473       config->parametricCoding  = 0;
    474 
    475     if (core == AOT_ER_AAC_ELD) {
    476       if (bitRate < 28000)
    477         config->init_amp_res_FF = SBR_AMP_RES_3_0;
    478       config->SendHeaderDataTime = -1;
    479     }
    480 
    481     if (numChannels == 1) {
    482       if (bitRate < 16000) {
    483         config->parametricCoding  = 0;
    484       }
    485     }
    486     else {
    487       if (bitRate < 20000) {
    488         config->parametricCoding  = 0;
    489       }
    490     }
    491 
    492     config->useSpeechConfig = useSpeechConfig;
    493 
    494     /* PS settings */
    495     config->bParametricStereo = bParametricStereo;
    496 
    497     return 1 ;
    498   }
    499   else {
    500     return 0 ;
    501   }
    502 }
    503 
    504 /*****************************************************************************
    505 
    506  functionname: FDKsbrEnc_InitializeSbrDefaults
    507  description:  initializes the SBR confifuration
    508  returns:      error status
    509  input:        - core codec type,
    510                - factor of SBR to core frame length,
    511                - core frame length
    512  output:       initialized SBR configuration
    513 
    514 *****************************************************************************/
    515 static UINT
    516 FDKsbrEnc_InitializeSbrDefaults (sbrConfigurationPtr config,
    517                                  INT                 downSampleFactor,
    518                                  UINT                codecGranuleLen
    519                                  )
    520 {
    521     if ( (downSampleFactor < 1 || downSampleFactor > 2) ||
    522          (codecGranuleLen*downSampleFactor > QMF_CHANNELS*QMF_MAX_TIME_SLOTS) )
    523        return(0); /* error */
    524 
    525     config->SendHeaderDataTime     = 1000;
    526     config->useWaveCoding          = 0;
    527     config->crcSbr                 = 0;
    528     config->dynBwSupported         = 1;
    529     config->tran_thr               = 13000;
    530     config->parametricCoding       = 1;
    531 
    532     config->sbrFrameSize           = codecGranuleLen * downSampleFactor;
    533     config->downSampleFactor       = downSampleFactor;
    534 
    535     /* sbr default parameters */
    536     config->sbr_data_extra         = 0;
    537     config->amp_res                = SBR_AMP_RES_3_0 ;
    538     config->tran_fc                = 0 ;
    539     config->tran_det_mode          = 1 ;
    540     config->spread                 = 1 ;
    541     config->stat                   = 0 ;
    542     config->e                      = 1 ;
    543     config->deltaTAcrossFrames     = 1 ;
    544     config->dF_edge_1stEnv         = FL2FXCONST_DBL(0.3f) ;
    545     config->dF_edge_incr           = FL2FXCONST_DBL(0.3f) ;
    546 
    547     config->sbr_invf_mode   = INVF_SWITCHED;
    548     config->sbr_xpos_mode   = XPOS_LC;
    549     config->sbr_xpos_ctrl   = SBR_XPOS_CTRL_DEFAULT;
    550     config->sbr_xpos_level  = 0;
    551     config->useSaPan        = 0;
    552     config->dynBwEnabled    = 0;
    553 
    554 
    555     /* the following parameters are overwritten by the FDKsbrEnc_AdjustSbrSettings() function since
    556        they are included in the tuning table */
    557     config->stereoMode             = SBR_SWITCH_LRC;
    558     config->ana_max_level          = 6;
    559     config->noiseFloorOffset       = 0;
    560     config->startFreq              = 5; /*  5.9 respectively  6.0 kHz at fs = 44.1/48 kHz */
    561     config->stopFreq               = 9; /* 16.2 respectively 16.8 kHz at fs = 44.1/48 kHz */
    562 
    563 
    564     /* header_extra_1 */
    565     config->freqScale       = SBR_FREQ_SCALE_DEFAULT;
    566     config->alterScale      = SBR_ALTER_SCALE_DEFAULT;
    567     config->sbr_noise_bands = SBR_NOISE_BANDS_DEFAULT;
    568 
    569     /* header_extra_2 */
    570     config->sbr_limiter_bands    = SBR_LIMITER_BANDS_DEFAULT;
    571     config->sbr_limiter_gains    = SBR_LIMITER_GAINS_DEFAULT;
    572     config->sbr_interpol_freq    = SBR_INTERPOL_FREQ_DEFAULT;
    573     config->sbr_smoothing_length = SBR_SMOOTHING_LENGTH_DEFAULT;
    574 
    575     return 1;
    576 }
    577 
    578 
    579 /*****************************************************************************
    580 
    581  functionname: DeleteEnvChannel
    582  description:  frees memory of one SBR channel
    583  returns:      -
    584  input:        handle of channel
    585  output:       released handle
    586 
    587 *****************************************************************************/
    588 static void
    589 deleteEnvChannel (HANDLE_ENV_CHANNEL hEnvCut)
    590 {
    591   if (hEnvCut) {
    592 
    593     FDKsbrEnc_DeleteTonCorrParamExtr(&hEnvCut->TonCorr);
    594 
    595     FDKsbrEnc_deleteExtractSbrEnvelope (&hEnvCut->sbrExtractEnvelope);
    596   }
    597 
    598 }
    599 
    600 
    601 /*****************************************************************************
    602 
    603  functionname: sbrEncoder_ChannelClose
    604  description:  close the channel coding handle
    605  returns:
    606  input:        phSbrChannel
    607  output:
    608 
    609 *****************************************************************************/
    610 static void
    611 sbrEncoder_ChannelClose(HANDLE_SBR_CHANNEL hSbrChannel)
    612 {
    613   if (hSbrChannel != NULL)
    614   {
    615     deleteEnvChannel (&hSbrChannel->hEnvChannel);
    616   }
    617 }
    618 
    619 /*****************************************************************************
    620 
    621  functionname: sbrEncoder_ElementClose
    622  description:  close the channel coding handle
    623  returns:
    624  input:        phSbrChannel
    625  output:
    626 
    627 *****************************************************************************/
    628 static void
    629 sbrEncoder_ElementClose(HANDLE_SBR_ELEMENT *phSbrElement)
    630 {
    631   HANDLE_SBR_ELEMENT hSbrElement = *phSbrElement;
    632 
    633   if (hSbrElement!=NULL) {
    634     if (hSbrElement->sbrConfigData.v_k_master)
    635       FreeRam_Sbr_v_k_master(&hSbrElement->sbrConfigData.v_k_master);
    636     if (hSbrElement->sbrConfigData.freqBandTable[LO])
    637       FreeRam_Sbr_freqBandTableLO(&hSbrElement->sbrConfigData.freqBandTable[LO]);
    638     if (hSbrElement->sbrConfigData.freqBandTable[HI])
    639       FreeRam_Sbr_freqBandTableHI(&hSbrElement->sbrConfigData.freqBandTable[HI]);
    640 
    641     FreeRam_SbrElement(phSbrElement);
    642   }
    643   return ;
    644 
    645 }
    646 
    647 
    648 void sbrEncoder_Close (HANDLE_SBR_ENCODER *phSbrEncoder)
    649 {
    650   HANDLE_SBR_ENCODER hSbrEncoder = *phSbrEncoder;
    651 
    652   if (hSbrEncoder != NULL)
    653   {
    654     int el, ch;
    655 
    656     for (el=0; el<(8); el++)
    657     {
    658       if (hSbrEncoder->sbrElement[el]!=NULL) {
    659         sbrEncoder_ElementClose(&hSbrEncoder->sbrElement[el]);
    660       }
    661     }
    662 
    663     /* Close sbr Channels */
    664     for (ch=0; ch<(8); ch++)
    665     {
    666       if (hSbrEncoder->pSbrChannel[ch]) {
    667         sbrEncoder_ChannelClose(hSbrEncoder->pSbrChannel[ch]);
    668         FreeRam_SbrChannel(&hSbrEncoder->pSbrChannel[ch]);
    669       }
    670 
    671       if (hSbrEncoder->QmfAnalysis[ch].FilterStates)
    672         FreeRam_Sbr_QmfStatesAnalysis((FIXP_QAS**)&hSbrEncoder->QmfAnalysis[ch].FilterStates);
    673 
    674 
    675     }
    676 
    677     if (hSbrEncoder->hParametricStereo)
    678       PSEnc_Destroy(&hSbrEncoder->hParametricStereo);
    679     if (hSbrEncoder->qmfSynthesisPS.FilterStates)
    680       FreeRam_PsQmfStatesSynthesis((FIXP_DBL**)&hSbrEncoder->qmfSynthesisPS.FilterStates);
    681 
    682     /* Release Overlay */
    683     FreeRam_SbrDynamic_RAM((FIXP_DBL**)&hSbrEncoder->pSBRdynamic_RAM);
    684 
    685 
    686     FreeRam_SbrEncoder(phSbrEncoder);
    687   }
    688 
    689 }
    690 
    691 /*****************************************************************************
    692 
    693  functionname: updateFreqBandTable
    694  description:  updates vk_master
    695  returns:      -
    696  input:        config handle
    697  output:       error info
    698 
    699 *****************************************************************************/
    700 static INT updateFreqBandTable(
    701         HANDLE_SBR_CONFIG_DATA  sbrConfigData,
    702         HANDLE_SBR_HEADER_DATA  sbrHeaderData,
    703         const INT               downSampleFactor
    704         )
    705 {
    706   INT k0, k2;
    707 
    708   if( FDKsbrEnc_FindStartAndStopBand (
    709               sbrConfigData->sampleFreq,
    710               sbrConfigData->sampleFreq >> (downSampleFactor-1),
    711               sbrConfigData->noQmfBands,
    712               sbrHeaderData->sbr_start_frequency,
    713               sbrHeaderData->sbr_stop_frequency,
    714              &k0,
    715              &k2
    716               )
    717     )
    718     return(1);
    719 
    720 
    721   if( FDKsbrEnc_UpdateFreqScale(
    722               sbrConfigData->v_k_master,
    723              &sbrConfigData->num_Master,
    724               k0,
    725               k2,
    726               sbrHeaderData->freqScale,
    727               sbrHeaderData->alterScale
    728               )
    729     )
    730     return(1);
    731 
    732 
    733   sbrHeaderData->sbr_xover_band=0;
    734 
    735 
    736   if( FDKsbrEnc_UpdateHiRes(
    737               sbrConfigData->freqBandTable[HI],
    738               &sbrConfigData->nSfb[HI],
    739               sbrConfigData->v_k_master,
    740               sbrConfigData->num_Master,
    741               &sbrHeaderData->sbr_xover_band
    742               )
    743     )
    744     return(1);
    745 
    746 
    747   FDKsbrEnc_UpdateLoRes(
    748           sbrConfigData->freqBandTable[LO],
    749           &sbrConfigData->nSfb[LO],
    750           sbrConfigData->freqBandTable[HI],
    751           sbrConfigData->nSfb[HI]
    752           );
    753 
    754 
    755   sbrConfigData->xOverFreq = (sbrConfigData->freqBandTable[LOW_RES][0] * sbrConfigData->sampleFreq / sbrConfigData->noQmfBands+1)>>1;
    756 
    757   return (0);
    758 }
    759 
    760 
    761 /*****************************************************************************
    762 
    763  functionname: resetEnvChannel
    764  description:  resets parameters and allocates memory
    765  returns:      error status
    766  input:
    767  output:       hEnv
    768 
    769 *****************************************************************************/
    770 static INT resetEnvChannel (HANDLE_SBR_CONFIG_DATA  sbrConfigData,
    771                             HANDLE_SBR_HEADER_DATA  sbrHeaderData,
    772                             HANDLE_ENV_CHANNEL      hEnv)
    773 {
    774   /* note !!! hEnv->encEnvData.noOfnoisebands will be updated later in function FDKsbrEnc_extractSbrEnvelope !!!*/
    775   hEnv->TonCorr.sbrNoiseFloorEstimate.noiseBands =  sbrHeaderData->sbr_noise_bands;
    776 
    777 
    778   if(FDKsbrEnc_ResetTonCorrParamExtr(&hEnv->TonCorr,
    779                            sbrConfigData->xposCtrlSwitch,
    780                            sbrConfigData->freqBandTable[HI][0],
    781                            sbrConfigData->v_k_master,
    782                            sbrConfigData->num_Master,
    783                            sbrConfigData->sampleFreq,
    784                            sbrConfigData->freqBandTable,
    785                            sbrConfigData->nSfb,
    786                            sbrConfigData->noQmfBands))
    787     return(1);
    788 
    789   hEnv->sbrCodeNoiseFloor.nSfb[LO] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
    790   hEnv->sbrCodeNoiseFloor.nSfb[HI] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
    791 
    792   hEnv->sbrCodeEnvelope.nSfb[LO] = sbrConfigData->nSfb[LO];
    793   hEnv->sbrCodeEnvelope.nSfb[HI] = sbrConfigData->nSfb[HI];
    794 
    795   hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI];
    796 
    797   hEnv->sbrCodeEnvelope.upDate = 0;
    798   hEnv->sbrCodeNoiseFloor.upDate = 0;
    799 
    800   return (0);
    801 }
    802 
    803 /* ****************************** FDKsbrEnc_SbrGetXOverFreq ******************************/
    804 /**
    805  * @fn
    806  * @brief       calculates the closest possible crossover frequency
    807  * @return      the crossover frequency SBR accepts
    808  *
    809  */
    810 static INT
    811 FDKsbrEnc_SbrGetXOverFreq(HANDLE_SBR_ELEMENT  hEnv,        /*!< handle to SBR encoder instance */
    812                           INT                 xoverFreq)   /*!< from core coder suggested crossover frequency */
    813 {
    814   INT band;
    815   INT lastDiff, newDiff;
    816   INT cutoffSb;
    817 
    818   UCHAR *RESTRICT pVKMaster = hEnv->sbrConfigData.v_k_master;
    819 
    820   /* Check if there is a matching cutoff frequency in the master table */
    821   cutoffSb = (4*xoverFreq * hEnv->sbrConfigData.noQmfBands / hEnv->sbrConfigData.sampleFreq + 1)>>1;
    822   lastDiff = cutoffSb;
    823   for (band = 0; band < hEnv->sbrConfigData.num_Master; band++) {
    824 
    825     newDiff = fixp_abs((INT)pVKMaster[band] - cutoffSb);
    826 
    827     if(newDiff >= lastDiff) {
    828       band--;
    829       break;
    830     }
    831 
    832     lastDiff = newDiff;
    833   }
    834 
    835   return ((pVKMaster[band] * hEnv->sbrConfigData.sampleFreq/hEnv->sbrConfigData.noQmfBands+1)>>1);
    836 }
    837 
    838 /*****************************************************************************
    839 
    840  functionname: FDKsbrEnc_EnvEncodeFrame
    841  description: performs the sbr envelope calculation for one element
    842  returns:
    843  input:
    844  output:
    845 
    846 *****************************************************************************/
    847 INT
    848 FDKsbrEnc_EnvEncodeFrame(HANDLE_SBR_ENCODER   hEnvEncoder,
    849                          int                  iElement,
    850                          INT_PCM             *samples,                 /*!< time samples, always interleaved */
    851                          UINT                 timeInStride,            /*!< time buffer channel interleaving stride */
    852                          UINT                *sbrDataBits,             /*!< Size of SBR payload  */
    853                          UCHAR               *sbrData,                 /*!< SBR payload  */
    854                          int                  clearOutput              /*!< Do not consider any input signal */
    855                         )
    856 {
    857   HANDLE_SBR_ELEMENT hSbrElement = hEnvEncoder->sbrElement[iElement];
    858   FDK_CRCINFO  crcInfo;
    859   INT    crcReg;
    860   INT    ch;
    861   INT    band;
    862   INT    cutoffSb;
    863   INT    newXOver;
    864 
    865   if (hEnvEncoder == NULL)
    866     return -1;
    867 
    868   hSbrElement = hEnvEncoder->sbrElement[iElement];
    869 
    870   if (hSbrElement == NULL)
    871     return -1;
    872 
    873 
    874   /* header bitstream handling */
    875   HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData = &hSbrElement->sbrBitstreamData;
    876 
    877   INT psHeaderActive = 0;
    878   sbrBitstreamData->HeaderActive = 0;
    879 
    880   /* Anticipate PS header because of internal PS bitstream delay in order to be in sync with SBR header. */
    881   if ( sbrBitstreamData->CountSendHeaderData==(sbrBitstreamData->NrSendHeaderData-1) )
    882   {
    883       psHeaderActive = 1;
    884   }
    885 
    886   /* Signal SBR header to be written into bitstream */
    887   if ( sbrBitstreamData->CountSendHeaderData==0  )
    888   {
    889      sbrBitstreamData->HeaderActive = 1;
    890   }
    891 
    892   /* Increment header interval counter */
    893   if (sbrBitstreamData->NrSendHeaderData == 0) {
    894     sbrBitstreamData->CountSendHeaderData = 1;
    895   }
    896   else {
    897     if (sbrBitstreamData->CountSendHeaderData >= 0) {
    898       sbrBitstreamData->CountSendHeaderData++;
    899       sbrBitstreamData->CountSendHeaderData %= sbrBitstreamData->NrSendHeaderData;
    900     }
    901   }
    902 
    903   if (hSbrElement->CmonData.dynBwEnabled ) {
    904     INT i;
    905     for ( i = 4; i > 0; i-- )
    906       hSbrElement->dynXOverFreqDelay[i] = hSbrElement->dynXOverFreqDelay[i-1];
    907 
    908     hSbrElement->dynXOverFreqDelay[0] = hSbrElement->CmonData.dynXOverFreqEnc;
    909     if (hSbrElement->dynXOverFreqDelay[1] > hSbrElement->dynXOverFreqDelay[2])
    910       newXOver = hSbrElement->dynXOverFreqDelay[2];
    911     else
    912       newXOver = hSbrElement->dynXOverFreqDelay[1];
    913 
    914     /* has the crossover frequency changed? */
    915     if ( hSbrElement->sbrConfigData.dynXOverFreq != newXOver ) {
    916 
    917       /* get corresponding master band */
    918       cutoffSb = ((4* newXOver * hSbrElement->sbrConfigData.noQmfBands
    919                   / hSbrElement->sbrConfigData.sampleFreq)+1)>>1;
    920 
    921       for ( band = 0; band < hSbrElement->sbrConfigData.num_Master; band++ ) {
    922         if ( cutoffSb == hSbrElement->sbrConfigData.v_k_master[band] )
    923           break;
    924       }
    925       FDK_ASSERT( band < hSbrElement->sbrConfigData.num_Master );
    926 
    927       hSbrElement->sbrConfigData.dynXOverFreq = newXOver;
    928       hSbrElement->sbrHeaderData.sbr_xover_band = band;
    929       hSbrElement->sbrBitstreamData.HeaderActive=1;
    930       psHeaderActive = 1; /* ps header is one frame delayed */
    931 
    932       /*
    933         update vk_master table
    934       */
    935       if(updateFreqBandTable(&hSbrElement->sbrConfigData,
    936                              &hSbrElement->sbrHeaderData,
    937                              hEnvEncoder->downSampleFactor
    938                              ))
    939         return(1);
    940 
    941 
    942       /* reset SBR channels */
    943       INT nEnvCh = hSbrElement->sbrConfigData.nChannels;
    944       for ( ch = 0; ch < nEnvCh; ch++ ) {
    945         if(resetEnvChannel (&hSbrElement->sbrConfigData,
    946                             &hSbrElement->sbrHeaderData,
    947                             &hSbrElement->sbrChannel[ch]->hEnvChannel))
    948           return(1);
    949 
    950       }
    951     }
    952   }
    953 
    954   /*
    955     allocate space for dummy header and crc
    956   */
    957   crcReg = FDKsbrEnc_InitSbrBitstream(&hSbrElement->CmonData,
    958                                        hSbrElement->payloadDelayLine[hEnvEncoder->nBitstrDelay],
    959                                        MAX_PAYLOAD_SIZE*sizeof(UCHAR),
    960                                       &crcInfo,
    961                                        hSbrElement->sbrConfigData.sbrSyntaxFlags);
    962 
    963   /* Temporal Envelope Data */
    964   SBR_FRAME_TEMP_DATA _fData;
    965   SBR_FRAME_TEMP_DATA *fData = &_fData;
    966   SBR_ENV_TEMP_DATA eData[MAX_NUM_CHANNELS];
    967 
    968   /* Init Temporal Envelope Data */
    969   {
    970     int i;
    971 
    972     FDKmemclear(&eData[0], sizeof(SBR_ENV_TEMP_DATA));
    973     FDKmemclear(&eData[1], sizeof(SBR_ENV_TEMP_DATA));
    974     FDKmemclear(fData, sizeof(SBR_FRAME_TEMP_DATA));
    975 
    976     for(i=0; i<MAX_NUM_NOISE_VALUES; i++)
    977       fData->res[i] = FREQ_RES_HIGH;
    978   }
    979 
    980 
    981   if (!clearOutput)
    982   {
    983     /*
    984      * Transform audio data into QMF domain
    985      */
    986     for(ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++)
    987     {
    988       HANDLE_ENV_CHANNEL h_envChan = &hSbrElement->sbrChannel[ch]->hEnvChannel;
    989       HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &h_envChan->sbrExtractEnvelope;
    990 
    991       if(hSbrElement->elInfo.fParametricStereo == 0)
    992       {
    993         QMF_SCALE_FACTOR tmpScale;
    994         FIXP_DBL **pQmfReal, **pQmfImag;
    995         C_AALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2)
    996 
    997 
    998         /* Obtain pointers to QMF buffers. */
    999         pQmfReal = sbrExtrEnv->rBuffer;
   1000         pQmfImag = sbrExtrEnv->iBuffer;
   1001 
   1002         qmfAnalysisFiltering( hSbrElement->hQmfAnalysis[ch],
   1003                                pQmfReal,
   1004                                pQmfImag,
   1005                               &tmpScale,
   1006                                samples + hSbrElement->elInfo.ChannelIndex[ch],
   1007                                timeInStride,
   1008                                qmfWorkBuffer );
   1009 
   1010         h_envChan->qmfScale = tmpScale.lb_scale + 7;
   1011 
   1012 
   1013         C_AALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2)
   1014 
   1015       } /* fParametricStereo == 0 */
   1016 
   1017 
   1018       /*
   1019         Parametric Stereo processing
   1020       */
   1021       if (hSbrElement->elInfo.fParametricStereo)
   1022       {
   1023         INT error = noError;
   1024 
   1025 
   1026         /* Limit Parametric Stereo to one instance */
   1027         FDK_ASSERT(ch == 0);
   1028 
   1029 
   1030         if(error == noError){
   1031           /* parametric stereo processing:
   1032              - input:
   1033                o left and right time domain samples
   1034              - processing:
   1035                o stereo qmf analysis
   1036                o stereo hybrid analysis
   1037                o ps parameter extraction
   1038                o downmix + hybrid synthesis
   1039              - output:
   1040                o downmixed qmf data is written to sbrExtrEnv->rBuffer and sbrExtrEnv->iBuffer
   1041           */
   1042           SCHAR qmfScale;
   1043           INT_PCM* pSamples[2] = {samples + hSbrElement->elInfo.ChannelIndex[0],samples + hSbrElement->elInfo.ChannelIndex[1]};
   1044           error = FDKsbrEnc_PSEnc_ParametricStereoProcessing( hEnvEncoder->hParametricStereo,
   1045                                                               pSamples,
   1046                                                               timeInStride,
   1047                                                               hSbrElement->hQmfAnalysis,
   1048                                                               sbrExtrEnv->rBuffer,
   1049                                                               sbrExtrEnv->iBuffer,
   1050                                                               samples + hSbrElement->elInfo.ChannelIndex[ch],
   1051                                                              &hEnvEncoder->qmfSynthesisPS,
   1052                                                              &qmfScale,
   1053                                                               psHeaderActive );
   1054           if (noError != error)
   1055           {
   1056             error = handBack(error);
   1057           }
   1058           h_envChan->qmfScale = (int)qmfScale;
   1059         }
   1060 
   1061 
   1062       } /* if (hEnvEncoder->hParametricStereo) */
   1063 
   1064       /*
   1065 
   1066          Extract Envelope relevant things from QMF data
   1067 
   1068       */
   1069       FDKsbrEnc_extractSbrEnvelope1(
   1070                                 &hSbrElement->sbrConfigData,
   1071                                 &hSbrElement->sbrHeaderData,
   1072                                 &hSbrElement->sbrBitstreamData,
   1073                                  h_envChan,
   1074                                 &hSbrElement->CmonData,
   1075                                 &eData[ch],
   1076                                  fData
   1077                                  );
   1078 
   1079     } /* hEnvEncoder->sbrConfigData.nChannels */
   1080  }
   1081 
   1082   /*
   1083      Process Envelope relevant things and calculate envelope data and write payload
   1084   */
   1085   FDKsbrEnc_extractSbrEnvelope2(
   1086                                 &hSbrElement->sbrConfigData,
   1087                                 &hSbrElement->sbrHeaderData,
   1088                                 (hSbrElement->elInfo.fParametricStereo) ? hEnvEncoder->hParametricStereo : NULL,
   1089                                 &hSbrElement->sbrBitstreamData,
   1090                                 &hSbrElement->sbrChannel[0]->hEnvChannel,
   1091                                 &hSbrElement->sbrChannel[1]->hEnvChannel,
   1092                                 &hSbrElement->CmonData,
   1093                                  eData,
   1094                                  fData,
   1095                                  clearOutput
   1096                                );
   1097 
   1098   /*
   1099     format payload, calculate crc
   1100   */
   1101   FDKsbrEnc_AssembleSbrBitstream(&hSbrElement->CmonData, &crcInfo, crcReg, hSbrElement->sbrConfigData.sbrSyntaxFlags);
   1102 
   1103   /*
   1104     save new payload, set to zero length if greater than MAX_PAYLOAD_SIZE
   1105   */
   1106   hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] = FDKgetValidBits(&hSbrElement->CmonData.sbrBitbuf);
   1107 
   1108   if(hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] > (MAX_PAYLOAD_SIZE<<3))
   1109     hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay]=0;
   1110 
   1111   /* While filling the Delay lines, sbrData is NULL */
   1112   if (sbrData) {
   1113     *sbrDataBits = hSbrElement->payloadDelayLineSize[0];
   1114     FDKmemcpy(sbrData, hSbrElement->payloadDelayLine[0], (hSbrElement->payloadDelayLineSize[0]+7)>>3);
   1115 
   1116 
   1117   }
   1118 
   1119 
   1120 /*******************************/
   1121 
   1122   if (hEnvEncoder->fTimeDomainDownsampling)
   1123   {
   1124     int ch;
   1125     int nChannels = hSbrElement->sbrConfigData.nChannels;
   1126 
   1127     for (ch=0; ch < nChannels; ch++)
   1128     {
   1129       INT nOutSamples;
   1130 
   1131       FDKaacEnc_Downsample(&hSbrElement->sbrChannel[ch]->downSampler,
   1132                             samples + hSbrElement->elInfo.ChannelIndex[ch] + hEnvEncoder->bufferOffset,
   1133                             hSbrElement->sbrConfigData.frameSize,
   1134                             timeInStride,
   1135                             samples + hSbrElement->elInfo.ChannelIndex[ch],
   1136                            &nOutSamples,
   1137                             hEnvEncoder->nChannels);
   1138     }
   1139   } /* downsample */
   1140 
   1141 
   1142   return (0);
   1143 }
   1144 
   1145 /*****************************************************************************
   1146 
   1147  functionname: createEnvChannel
   1148  description:  initializes parameters and allocates memory
   1149  returns:      error status
   1150  input:
   1151  output:       hEnv
   1152 
   1153 *****************************************************************************/
   1154 
   1155 static INT
   1156 createEnvChannel (HANDLE_ENV_CHANNEL     hEnv,
   1157                   INT                    channel
   1158                  ,UCHAR*                 dynamic_RAM
   1159                  )
   1160 {
   1161   FDKmemclear(hEnv,sizeof (struct ENV_CHANNEL));
   1162 
   1163   if ( FDKsbrEnc_CreateTonCorrParamExtr(&hEnv->TonCorr,
   1164                                          channel) )
   1165   {
   1166     return(1);
   1167   }
   1168 
   1169   if ( FDKsbrEnc_CreateExtractSbrEnvelope (&hEnv->sbrExtractEnvelope,
   1170                                channel
   1171                               ,/*chan*/0
   1172                               ,dynamic_RAM
   1173                               ) )
   1174   {
   1175     return(1);
   1176   }
   1177 
   1178   return 0;
   1179 }
   1180 
   1181 /*****************************************************************************
   1182 
   1183  functionname: initEnvChannel
   1184  description:  initializes parameters
   1185  returns:      error status
   1186  input:
   1187  output:
   1188 
   1189 *****************************************************************************/
   1190 static INT
   1191 initEnvChannel (  HANDLE_SBR_CONFIG_DATA sbrConfigData,
   1192                   HANDLE_SBR_HEADER_DATA sbrHeaderData,
   1193                   HANDLE_ENV_CHANNEL     hEnv,
   1194                   sbrConfigurationPtr    params,
   1195                   ULONG                  statesInitFlag
   1196                  ,INT                    chanInEl
   1197                  ,UCHAR*                 dynamic_RAM
   1198                  )
   1199 {
   1200   int frameShift, tran_off=0;
   1201   INT e;
   1202   INT tran_fc;
   1203   INT timeSlots, timeStep, startIndex;
   1204   INT noiseBands[2] = { 3, 3 };
   1205 
   1206   e = 1 << params->e;
   1207 
   1208   FDK_ASSERT(params->e >= 0);
   1209 
   1210   hEnv->encEnvData.freq_res_fixfix = 1;
   1211   hEnv->fLevelProtect = 0;
   1212 
   1213   hEnv->encEnvData.ldGrid = (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? 1 : 0;
   1214 
   1215   hEnv->encEnvData.sbr_xpos_mode = (XPOS_MODE)params->sbr_xpos_mode;
   1216 
   1217   if (hEnv->encEnvData.sbr_xpos_mode == XPOS_SWITCHED) {
   1218     /*
   1219        no other type than XPOS_MDCT or XPOS_SPEECH allowed,
   1220        but enable switching
   1221     */
   1222     sbrConfigData->switchTransposers = TRUE;
   1223     hEnv->encEnvData.sbr_xpos_mode = XPOS_MDCT;
   1224   }
   1225   else {
   1226     sbrConfigData->switchTransposers = FALSE;
   1227   }
   1228 
   1229   hEnv->encEnvData.sbr_xpos_ctrl = params->sbr_xpos_ctrl;
   1230 
   1231 
   1232   /* extended data */
   1233   if(params->parametricCoding) {
   1234     hEnv->encEnvData.extended_data = 1;
   1235   }
   1236   else {
   1237     hEnv->encEnvData.extended_data = 0;
   1238   }
   1239 
   1240   hEnv->encEnvData.extension_size = 0;
   1241 
   1242   startIndex = QMF_FILTER_PROTOTYPE_SIZE - sbrConfigData->noQmfBands;
   1243 
   1244   switch (params->sbrFrameSize) {
   1245   case 2304:
   1246     timeSlots = 18;
   1247     break;
   1248   case 2048:
   1249   case 1024:
   1250   case 512:
   1251     timeSlots = 16;
   1252     break;
   1253   case 1920:
   1254   case 960:
   1255   case 480:
   1256     timeSlots = 15;
   1257     break;
   1258   case 1152:
   1259     timeSlots = 9;
   1260     break;
   1261   default:
   1262     return (1); /* Illegal frame size */
   1263   }
   1264 
   1265   timeStep = sbrConfigData->noQmfSlots / timeSlots;
   1266 
   1267   if ( FDKsbrEnc_InitTonCorrParamExtr(params->sbrFrameSize,
   1268                                      &hEnv->TonCorr,
   1269                                       sbrConfigData,
   1270                                       timeSlots,
   1271                                       params->sbr_xpos_ctrl,
   1272                                       params->ana_max_level,
   1273                                       sbrHeaderData->sbr_noise_bands,
   1274                                       params->noiseFloorOffset,
   1275                                       params->useSpeechConfig) )
   1276     return(1);
   1277 
   1278   hEnv->encEnvData.noOfnoisebands = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
   1279 
   1280   noiseBands[0] = hEnv->encEnvData.noOfnoisebands;
   1281   noiseBands[1] = hEnv->encEnvData.noOfnoisebands;
   1282 
   1283   hEnv->encEnvData.sbr_invf_mode = (INVF_MODE)params->sbr_invf_mode;
   1284 
   1285   if (hEnv->encEnvData.sbr_invf_mode == INVF_SWITCHED) {
   1286     hEnv->encEnvData.sbr_invf_mode = INVF_MID_LEVEL;
   1287     hEnv->TonCorr.switchInverseFilt = TRUE;
   1288   }
   1289   else {
   1290     hEnv->TonCorr.switchInverseFilt = FALSE;
   1291   }
   1292 
   1293 
   1294   tran_fc  = params->tran_fc;
   1295 
   1296   if (tran_fc == 0) {
   1297     tran_fc = fixMin (5000, FDKsbrEnc_getSbrStartFreqRAW (sbrHeaderData->sbr_start_frequency,params->codecSettings.sampleFreq));
   1298   }
   1299 
   1300   tran_fc = (tran_fc*4*sbrConfigData->noQmfBands/sbrConfigData->sampleFreq + 1)>>1;
   1301 
   1302   if (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) {
   1303     frameShift = LD_PRETRAN_OFF;
   1304     tran_off = LD_PRETRAN_OFF + FRAME_MIDDLE_SLOT_512LD*timeStep;
   1305   } else
   1306   {
   1307     frameShift = 0;
   1308     switch (timeSlots) {
   1309       /* The factor of 2 is by definition. */
   1310       case NUMBER_TIME_SLOTS_2048: tran_off = 8 + FRAME_MIDDLE_SLOT_2048 * timeStep; break;
   1311       case NUMBER_TIME_SLOTS_1920: tran_off = 7 + FRAME_MIDDLE_SLOT_1920 * timeStep; break;
   1312       default: return 1;
   1313     }
   1314   }
   1315   if ( FDKsbrEnc_InitExtractSbrEnvelope (&hEnv->sbrExtractEnvelope,
   1316                                sbrConfigData->noQmfSlots,
   1317                                sbrConfigData->noQmfBands, startIndex,
   1318                                timeSlots, timeStep, tran_off,
   1319                                statesInitFlag
   1320                               ,chanInEl
   1321                               ,dynamic_RAM
   1322                               ,sbrConfigData->sbrSyntaxFlags
   1323                                ) )
   1324     return(1);
   1325 
   1326   if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeEnvelope,
   1327                             sbrConfigData->nSfb,
   1328                             params->deltaTAcrossFrames,
   1329                             params->dF_edge_1stEnv,
   1330                             params->dF_edge_incr))
   1331     return(1);
   1332 
   1333   if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeNoiseFloor,
   1334                             noiseBands,
   1335                             params->deltaTAcrossFrames,
   1336                             0,0))
   1337     return(1);
   1338 
   1339   sbrConfigData->initAmpResFF = params->init_amp_res_FF;
   1340 
   1341   if(FDKsbrEnc_InitSbrHuffmanTables (&hEnv->encEnvData,
   1342                            &hEnv->sbrCodeEnvelope,
   1343                            &hEnv->sbrCodeNoiseFloor,
   1344                            sbrHeaderData->sbr_amp_res))
   1345    return(1);
   1346 
   1347   FDKsbrEnc_initFrameInfoGenerator (&hEnv->SbrEnvFrame,
   1348                             params->spread,
   1349                             e,
   1350                             params->stat,
   1351                             timeSlots,
   1352                             hEnv->encEnvData.freq_res_fixfix
   1353                             ,hEnv->encEnvData.ldGrid
   1354                             );
   1355 
   1356   if(FDKsbrEnc_InitSbrTransientDetector (&hEnv->sbrTransientDetector,
   1357                                           sbrConfigData->frameSize,
   1358                                           sbrConfigData->sampleFreq,
   1359                                           params,
   1360                                           tran_fc,
   1361                                           sbrConfigData->noQmfSlots,
   1362                                           sbrConfigData->noQmfBands,
   1363                                           hEnv->sbrExtractEnvelope.YBufferWriteOffset,
   1364                                           hEnv->sbrExtractEnvelope.YBufferSzShift,
   1365                                           frameShift,
   1366                                           tran_off
   1367                                           ))
   1368   return(1);
   1369 
   1370 
   1371   sbrConfigData->xposCtrlSwitch = params->sbr_xpos_ctrl;
   1372 
   1373   hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI];
   1374   hEnv->encEnvData.addHarmonicFlag = 0;
   1375 
   1376   return (0);
   1377 }
   1378 
   1379 INT sbrEncoder_Open(
   1380         HANDLE_SBR_ENCODER  *phSbrEncoder,
   1381         INT                  nElements,
   1382         INT                  nChannels,
   1383         INT                  supportPS
   1384         )
   1385 {
   1386   INT i;
   1387   INT errorStatus = 1;
   1388   HANDLE_SBR_ENCODER hSbrEncoder = NULL;
   1389 
   1390   if (phSbrEncoder==NULL
   1391      )
   1392   {
   1393     goto bail;
   1394   }
   1395 
   1396   hSbrEncoder = GetRam_SbrEncoder();
   1397   if (hSbrEncoder==NULL) {
   1398     goto bail;
   1399   }
   1400   FDKmemclear(hSbrEncoder, sizeof(SBR_ENCODER));
   1401 
   1402       hSbrEncoder->pSBRdynamic_RAM = (UCHAR*)GetRam_SbrDynamic_RAM();
   1403       hSbrEncoder->dynamicRam = hSbrEncoder->pSBRdynamic_RAM;
   1404 
   1405   for (i=0; i<nElements; i++) {
   1406     hSbrEncoder->sbrElement[i] = GetRam_SbrElement(i);
   1407     if (hSbrEncoder->sbrElement[i]==NULL) {
   1408         goto bail;
   1409     }
   1410     FDKmemclear(hSbrEncoder->sbrElement[i], sizeof(SBR_ELEMENT));
   1411     hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO] =  GetRam_Sbr_freqBandTableLO(i);
   1412     hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI] =  GetRam_Sbr_freqBandTableHI(i);
   1413     hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master        =  GetRam_Sbr_v_k_master(i);
   1414     if ( (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO]==NULL) ||
   1415          (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI]==NULL) ||
   1416          (hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master==NULL) )
   1417     {
   1418         goto bail;
   1419     }
   1420   }
   1421 
   1422   for (i=0; i<nChannels; i++) {
   1423     hSbrEncoder->pSbrChannel[i] = GetRam_SbrChannel(i);
   1424     if (hSbrEncoder->pSbrChannel[i]==NULL) {
   1425         goto bail;
   1426     }
   1427 
   1428     if ( createEnvChannel(&hSbrEncoder->pSbrChannel[i]->hEnvChannel,
   1429                            i
   1430                           ,hSbrEncoder->dynamicRam
   1431                            ) )
   1432     {
   1433         goto bail;
   1434     }
   1435 
   1436   }
   1437 
   1438   for (i=0; i<fixMax(nChannels,(supportPS)?2:0); i++) {
   1439     hSbrEncoder->QmfAnalysis[i].FilterStates = GetRam_Sbr_QmfStatesAnalysis(i);
   1440     if (hSbrEncoder->QmfAnalysis[i].FilterStates==NULL) {
   1441         goto bail;
   1442     }
   1443   }
   1444 
   1445   if (supportPS) {
   1446     if (PSEnc_Create(&hSbrEncoder->hParametricStereo))
   1447     {
   1448       goto bail;
   1449     }
   1450 
   1451     hSbrEncoder->qmfSynthesisPS.FilterStates = GetRam_PsQmfStatesSynthesis();
   1452     if (hSbrEncoder->qmfSynthesisPS.FilterStates==NULL) {
   1453       goto bail;
   1454     }
   1455   }  /* supportPS */
   1456 
   1457   *phSbrEncoder = hSbrEncoder;
   1458 
   1459   errorStatus = 0;
   1460   return errorStatus;
   1461 
   1462 bail:
   1463   /* Close SBR encoder instance */
   1464   sbrEncoder_Close(&hSbrEncoder);
   1465   return errorStatus;
   1466 }
   1467 
   1468 static
   1469 INT FDKsbrEnc_Reallocate(
   1470                     HANDLE_SBR_ENCODER   hSbrEncoder,
   1471                     SBR_ELEMENT_INFO     elInfo[(8)],
   1472                     const INT            noElements)
   1473 {
   1474   INT totalCh = 0;
   1475   INT totalQmf = 0;
   1476   INT coreEl;
   1477   INT el=-1;
   1478 
   1479   hSbrEncoder->lfeChIdx = -1; /* default value, until lfe found */
   1480 
   1481   for (coreEl=0; coreEl<noElements; coreEl++)
   1482   {
   1483     /* SBR only handles SCE and CPE's */
   1484     if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) {
   1485       el++;
   1486     } else {
   1487       if (elInfo[coreEl].elType == ID_LFE) {
   1488           hSbrEncoder->lfeChIdx = elInfo[coreEl].ChannelIndex[0];
   1489       }
   1490       continue;
   1491     }
   1492 
   1493     SBR_ELEMENT_INFO    *pelInfo = &elInfo[coreEl];
   1494     HANDLE_SBR_ELEMENT  hSbrElement = hSbrEncoder->sbrElement[el];
   1495 
   1496     int ch;
   1497     for ( ch = 0; ch < pelInfo->nChannelsInEl; ch++ ) {
   1498       hSbrElement->sbrChannel[ch] = hSbrEncoder->pSbrChannel[totalCh];
   1499       totalCh++;
   1500     }
   1501     /* analysis QMF */
   1502     for ( ch = 0; ch < ((pelInfo->fParametricStereo)?2:pelInfo->nChannelsInEl); ch++ ) {
   1503       hSbrElement->elInfo.ChannelIndex[ch] = pelInfo->ChannelIndex[ch];
   1504       hSbrElement->hQmfAnalysis[ch] = &hSbrEncoder->QmfAnalysis[totalQmf++];
   1505     }
   1506 
   1507     /* Copy Element info */
   1508     hSbrElement->elInfo.elType            = pelInfo->elType;
   1509     hSbrElement->elInfo.instanceTag       = pelInfo->instanceTag;
   1510     hSbrElement->elInfo.nChannelsInEl     = pelInfo->nChannelsInEl;
   1511     hSbrElement->elInfo.fParametricStereo = pelInfo->fParametricStereo;
   1512   } /* coreEl */
   1513 
   1514   return 0;
   1515 }
   1516 
   1517 
   1518 
   1519 /*****************************************************************************
   1520 
   1521  functionname: FDKsbrEnc_EnvInit
   1522  description:  initializes parameters
   1523  returns:      error status
   1524  input:
   1525  output:       hEnv
   1526 
   1527 *****************************************************************************/
   1528 static
   1529 INT FDKsbrEnc_EnvInit (
   1530                        HANDLE_SBR_ELEMENT   hSbrElement,
   1531                        sbrConfigurationPtr params,
   1532                        INT      *coreBandWith,
   1533                        AUDIO_OBJECT_TYPE aot,
   1534                        int       nBitstrDelay,
   1535                        int       nElement,
   1536                        const int headerPeriod,
   1537                        ULONG     statesInitFlag,
   1538                        int       fTimeDomainDownsampling
   1539                       ,UCHAR    *dynamic_RAM
   1540                       )
   1541 {
   1542   UCHAR    *bitstreamBuffer;
   1543   int ch, i;
   1544 
   1545   if ((params->codecSettings.nChannels < 1) || (params->codecSettings.nChannels > MAX_NUM_CHANNELS)){
   1546     return(1);
   1547   }
   1548 
   1549   /* initialize the encoder handle  and structs*/
   1550   bitstreamBuffer = hSbrElement->payloadDelayLine[nBitstrDelay];
   1551 
   1552   /* init and set syntax flags */
   1553   hSbrElement->sbrConfigData.sbrSyntaxFlags = 0;
   1554 
   1555   switch (aot) {
   1556   case AOT_DRM_MPEG_PS:
   1557   case AOT_DRM_SBR:
   1558     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_SCALABLE;
   1559     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_DRM_CRC;
   1560     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC;
   1561     break;
   1562   case AOT_ER_AAC_ELD:
   1563     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_LOW_DELAY;
   1564     break;
   1565   default:
   1566     break;
   1567   }
   1568   if (params->crcSbr) {
   1569     hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC;
   1570   }
   1571 
   1572   hSbrElement->sbrConfigData.noQmfBands = QMF_CHANNELS>>(2-params->downSampleFactor);
   1573   switch (hSbrElement->sbrConfigData.noQmfBands)
   1574   {
   1575     case 64: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6;
   1576              break;
   1577     case 32: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>5;
   1578              break;
   1579     default: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6;
   1580              return(2);
   1581   }
   1582 
   1583   FDKinitBitStream(&hSbrElement->CmonData.sbrBitbuf, bitstreamBuffer, MAX_PAYLOAD_SIZE*sizeof(UCHAR), 0, BS_WRITER);
   1584 
   1585   /*
   1586     now initialize sbrConfigData, sbrHeaderData and sbrBitstreamData,
   1587   */
   1588   hSbrElement->sbrConfigData.nChannels = params->codecSettings.nChannels;
   1589 
   1590   if(params->codecSettings.nChannels == 2)
   1591      hSbrElement->sbrConfigData.stereoMode = params->stereoMode;
   1592   else
   1593      hSbrElement->sbrConfigData.stereoMode = SBR_MONO;
   1594 
   1595   hSbrElement->sbrConfigData.frameSize   = params->sbrFrameSize;
   1596 
   1597   hSbrElement->sbrConfigData.sampleFreq = params->downSampleFactor * params->codecSettings.sampleFreq;
   1598 
   1599   hSbrElement->sbrBitstreamData.CountSendHeaderData = 0;
   1600   if (params->SendHeaderDataTime > 0 ) {
   1601 
   1602     if (headerPeriod==-1) {
   1603 
   1604       hSbrElement->sbrBitstreamData.NrSendHeaderData = (INT)(params->SendHeaderDataTime * hSbrElement->sbrConfigData.sampleFreq
   1605                                                / (1000 * hSbrElement->sbrConfigData.frameSize));
   1606       hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMax(hSbrElement->sbrBitstreamData.NrSendHeaderData,1);
   1607     }
   1608     else {
   1609       /* assure header period at least once per second */
   1610       hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMin(fixMax(headerPeriod,1),(hSbrElement->sbrConfigData.sampleFreq/hSbrElement->sbrConfigData.frameSize));
   1611     }
   1612   }
   1613   else {
   1614    hSbrElement->sbrBitstreamData.NrSendHeaderData = 0;
   1615   }
   1616 
   1617   hSbrElement->sbrHeaderData.sbr_data_extra = params->sbr_data_extra;
   1618   hSbrElement->sbrBitstreamData.HeaderActive = 0;
   1619   hSbrElement->sbrHeaderData.sbr_start_frequency = params->startFreq;
   1620   hSbrElement->sbrHeaderData.sbr_stop_frequency  = params->stopFreq;
   1621   hSbrElement->sbrHeaderData.sbr_xover_band = 0;
   1622   hSbrElement->sbrHeaderData.sbr_lc_stereo_mode = 0;
   1623 
   1624   /* data_extra */
   1625   if (params->sbr_xpos_ctrl!= SBR_XPOS_CTRL_DEFAULT)
   1626      hSbrElement->sbrHeaderData.sbr_data_extra = 1;
   1627 
   1628   hSbrElement->sbrHeaderData.sbr_amp_res = (AMP_RES)params->amp_res;
   1629 
   1630   /* header_extra_1 */
   1631   hSbrElement->sbrHeaderData.freqScale  = params->freqScale;
   1632   hSbrElement->sbrHeaderData.alterScale = params->alterScale;
   1633   hSbrElement->sbrHeaderData.sbr_noise_bands = params->sbr_noise_bands;
   1634   hSbrElement->sbrHeaderData.header_extra_1 = 0;
   1635 
   1636   if ((params->freqScale != SBR_FREQ_SCALE_DEFAULT) ||
   1637       (params->alterScale != SBR_ALTER_SCALE_DEFAULT) ||
   1638       (params->sbr_noise_bands != SBR_NOISE_BANDS_DEFAULT))
   1639   {
   1640    hSbrElement->sbrHeaderData.header_extra_1 = 1;
   1641   }
   1642 
   1643   /* header_extra_2 */
   1644   hSbrElement->sbrHeaderData.sbr_limiter_bands = params->sbr_limiter_bands;
   1645   hSbrElement->sbrHeaderData.sbr_limiter_gains = params->sbr_limiter_gains;
   1646 
   1647   if ((hSbrElement->sbrConfigData.sampleFreq > 48000) &&
   1648       (hSbrElement->sbrHeaderData.sbr_start_frequency >= 9))
   1649   {
   1650     hSbrElement->sbrHeaderData.sbr_limiter_gains = SBR_LIMITER_GAINS_INFINITE;
   1651   }
   1652 
   1653   hSbrElement->sbrHeaderData.sbr_interpol_freq = params->sbr_interpol_freq;
   1654   hSbrElement->sbrHeaderData.sbr_smoothing_length = params->sbr_smoothing_length;
   1655   hSbrElement->sbrHeaderData.header_extra_2 = 0;
   1656 
   1657   if ((params->sbr_limiter_bands != SBR_LIMITER_BANDS_DEFAULT) ||
   1658       (params->sbr_limiter_gains != SBR_LIMITER_GAINS_DEFAULT) ||
   1659       (params->sbr_interpol_freq != SBR_INTERPOL_FREQ_DEFAULT) ||
   1660       (params->sbr_smoothing_length != SBR_SMOOTHING_LENGTH_DEFAULT))
   1661   {
   1662      hSbrElement->sbrHeaderData.header_extra_2 = 1;
   1663   }
   1664 
   1665    /* other switches */
   1666   hSbrElement->sbrConfigData.useWaveCoding             = params->useWaveCoding;
   1667   hSbrElement->sbrConfigData.useParametricCoding       = params->parametricCoding;
   1668 
   1669   /* init freq band table */
   1670   if(updateFreqBandTable(&hSbrElement->sbrConfigData,
   1671                          &hSbrElement->sbrHeaderData,
   1672                          params->downSampleFactor
   1673                          ))
   1674   {
   1675     return(1);
   1676   }
   1677 
   1678   /* now create envelope ext and QMF for each available channel */
   1679   for ( ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++ ) {
   1680 
   1681      if ( initEnvChannel(&hSbrElement->sbrConfigData,
   1682                          &hSbrElement->sbrHeaderData,
   1683                          &hSbrElement->sbrChannel[ch]->hEnvChannel,
   1684                           params,
   1685                           statesInitFlag
   1686                         ,ch
   1687                         ,dynamic_RAM
   1688                          ) )
   1689      {
   1690        return(1);
   1691      }
   1692 
   1693 
   1694   } /* nChannels */
   1695 
   1696   /* reset and intialize analysis qmf */
   1697   for ( ch = 0; ch < ((hSbrElement->elInfo.fParametricStereo)?2:hSbrElement->sbrConfigData.nChannels); ch++ )
   1698   {
   1699     int err;
   1700     UINT qmfFlags = (hSbrElement->sbrConfigData.sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? QMF_FLAG_CLDFB : 0;
   1701     if (statesInitFlag)
   1702       qmfFlags &= ~QMF_FLAG_KEEP_STATES;
   1703     else
   1704       qmfFlags |=  QMF_FLAG_KEEP_STATES;
   1705 
   1706     err = qmfInitAnalysisFilterBank( hSbrElement->hQmfAnalysis[ch],
   1707                                      (FIXP_QAS*)hSbrElement->hQmfAnalysis[ch]->FilterStates,
   1708                                      hSbrElement->sbrConfigData.noQmfSlots,
   1709                                      hSbrElement->sbrConfigData.noQmfBands,
   1710                                      hSbrElement->sbrConfigData.noQmfBands,
   1711                                      hSbrElement->sbrConfigData.noQmfBands,
   1712                                      qmfFlags );
   1713     if (0!=err) {
   1714       return err;
   1715     }
   1716   }
   1717 
   1718   /*  */
   1719   hSbrElement->CmonData.xOverFreq = hSbrElement->sbrConfigData.xOverFreq;
   1720   hSbrElement->CmonData.dynBwEnabled = (params->dynBwSupported && params->dynBwEnabled);
   1721   hSbrElement->CmonData.dynXOverFreqEnc = FDKsbrEnc_SbrGetXOverFreq( hSbrElement, hSbrElement->CmonData.xOverFreq);
   1722   for ( i = 0; i < 5; i++ )
   1723       hSbrElement->dynXOverFreqDelay[i] = hSbrElement->CmonData.dynXOverFreqEnc;
   1724   hSbrElement->CmonData.sbrNumChannels  = hSbrElement->sbrConfigData.nChannels;
   1725   hSbrElement->sbrConfigData.dynXOverFreq = hSbrElement->CmonData.xOverFreq;
   1726 
   1727   /* Update Bandwith to be passed to the core encoder */
   1728   *coreBandWith = hSbrElement->CmonData.xOverFreq;
   1729 
   1730   return(0);
   1731  }
   1732 
   1733 INT sbrEncoder_GetInBufferSize(int noChannels)
   1734 {
   1735   INT temp;
   1736 
   1737   temp = (2048);
   1738   temp += 1024 + MAX_SAMPLE_DELAY;
   1739   temp *= noChannels;
   1740   temp *= sizeof(INT_PCM);
   1741   return temp;
   1742 }
   1743 
   1744 /*
   1745  * Encode Dummy SBR payload frames to fill the delay lines.
   1746  */
   1747 static
   1748 INT FDKsbrEnc_DelayCompensation (
   1749                                   HANDLE_SBR_ENCODER hEnvEnc,
   1750                                   INT_PCM *timeBuffer
   1751                                  )
   1752 {
   1753     int n, el;
   1754 
   1755     for (n=hEnvEnc->nBitstrDelay; n>0; n--)
   1756     {
   1757       for (el=0; el<hEnvEnc->noElements; el++)
   1758       {
   1759         if (FDKsbrEnc_EnvEncodeFrame(
   1760                                      hEnvEnc,
   1761                                      el,
   1762                                      timeBuffer + hEnvEnc->downsampledOffset,
   1763                                      hEnvEnc->sbrElement[el]->sbrConfigData.nChannels,
   1764                                      NULL,
   1765                                      NULL,
   1766                                      1
   1767                                     ))
   1768           return -1;
   1769       }
   1770       sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer);
   1771     }
   1772 	  return 0;
   1773 }
   1774 
   1775 UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, UINT coreSampleRate, AUDIO_OBJECT_TYPE aot)
   1776 {
   1777   UINT newBitRate;
   1778   INT index;
   1779 
   1780   FDK_ASSERT(numChannels > 0 && numChannels <= 2);
   1781   if (aot == AOT_PS) {
   1782     if (numChannels == 2) {
   1783       index = getPsTuningTableIndex(bitRate, &newBitRate);
   1784       if (index == INVALID_TABLE_IDX) {
   1785         bitRate = newBitRate;
   1786       }
   1787       /* Set numChannels to 1 because for PS we need a SBR SCE (mono) element. */
   1788       numChannels = 1;
   1789     } else {
   1790       return 0;
   1791     }
   1792   }
   1793   index = getSbrTuningTableIndex(bitRate, numChannels, coreSampleRate, aot, &newBitRate);
   1794   if (index != INVALID_TABLE_IDX) {
   1795     newBitRate = bitRate;
   1796   }
   1797 
   1798   return newBitRate;
   1799 }
   1800 
   1801 UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot)
   1802 {
   1803   UINT isPossible=(AOT_PS==aot)?0:1;
   1804   return isPossible;
   1805 }
   1806 
   1807 INT sbrEncoder_Init(
   1808         HANDLE_SBR_ENCODER   hSbrEncoder,
   1809         SBR_ELEMENT_INFO     elInfo[(8)],
   1810         int                  noElements,
   1811         INT_PCM             *inputBuffer,
   1812         INT                 *coreBandwidth,
   1813         INT                 *inputBufferOffset,
   1814         INT                 *numChannels,
   1815         INT                 *coreSampleRate,
   1816         UINT                *downSampleFactor,
   1817         INT                 *frameLength,
   1818         AUDIO_OBJECT_TYPE    aot,
   1819         int                 *delay,
   1820         int                  transformFactor,
   1821         const int            headerPeriod,
   1822         ULONG                statesInitFlag
   1823         )
   1824 {
   1825     HANDLE_ERROR_INFO errorInfo = noError;
   1826     sbrConfiguration sbrConfig[(8)];
   1827     INT error = 0;
   1828     INT lowestBandwidth;
   1829     /* Save input parameters */
   1830     INT inputSampleRate = *coreSampleRate;
   1831     int coreFrameLength = *frameLength;
   1832     int inputBandWidth = *coreBandwidth;
   1833     int inputChannels = *numChannels;
   1834 
   1835     int downsampledOffset = 0;
   1836     int sbrOffset = 0;
   1837     int downsamplerDelay = 0;
   1838     int timeDomainDownsample = 0;
   1839     int nBitstrDelay = 0;
   1840     int highestSbrStartFreq, highestSbrStopFreq;
   1841     int lowDelay = 0;
   1842     int usePs = 0;
   1843 
   1844     /* check whether SBR setting is available for the current encoder configuration (bitrate, samplerate) */
   1845     if (!sbrEncoder_IsSingleRatePossible(aot)) {
   1846       *downSampleFactor = 2;
   1847     }
   1848 
   1849 
   1850 
   1851     if ( (aot==AOT_PS) || (aot==AOT_MP2_PS) || (aot==AOT_DABPLUS_PS) || (aot==AOT_DRM_MPEG_PS) ) {
   1852         usePs = 1;
   1853     }
   1854     if ( (aot==AOT_ER_AAC_ELD) ) {
   1855         lowDelay = 1;
   1856     }
   1857     else if ( (aot==AOT_ER_AAC_LD) ) {
   1858         error = 1;
   1859         goto bail;
   1860     }
   1861 
   1862     /* Parametric Stereo */
   1863     if ( usePs ) {
   1864       if ( *numChannels == 2 && noElements == 1) {
   1865         /* Override Element type in case of Parametric stereo */
   1866         elInfo[0].elType = ID_SCE;
   1867         elInfo[0].fParametricStereo = 1;
   1868         elInfo[0].nChannelsInEl = 1;
   1869         /* core encoder gets downmixed mono signal */
   1870         *numChannels  = 1;
   1871       } else {
   1872         error = 1;
   1873         goto bail;
   1874       }
   1875     } /* usePs */
   1876 
   1877     /* set the core's sample rate */
   1878     switch (*downSampleFactor) {
   1879     case 1:
   1880       *coreSampleRate = inputSampleRate;
   1881       break;
   1882     case 2:
   1883       *coreSampleRate = inputSampleRate>>1;
   1884       break;
   1885     default:
   1886       *coreSampleRate = inputSampleRate>>1;
   1887       return 0; /* return error */
   1888     }
   1889 
   1890     /* check whether SBR setting is available for the current encoder configuration (bitrate, coreSampleRate) */
   1891     {
   1892       int delayDiff = 0;
   1893       int el, coreEl;
   1894 
   1895       /* Check if every element config is feasible */
   1896       for (coreEl=0; coreEl<noElements; coreEl++)
   1897       {
   1898         /* SBR only handles SCE and CPE's */
   1899         if (elInfo[coreEl].elType != ID_SCE && elInfo[coreEl].elType != ID_CPE) {
   1900           continue;
   1901         }
   1902         /* check if desired configuration is available */
   1903         if ( !FDKsbrEnc_IsSbrSettingAvail (elInfo[coreEl].bitRate, 0, elInfo[coreEl].nChannelsInEl, inputSampleRate, *coreSampleRate, aot) )
   1904         {
   1905             error = 1;
   1906             goto bail;
   1907         }
   1908       }
   1909 
   1910       /* Determine Delay balancing and new encoder delay */
   1911       if (lowDelay) {
   1912         {
   1913         delayDiff = (*delay * *downSampleFactor) + DELAY_ELD2SBR(coreFrameLength,*downSampleFactor);
   1914         *delay = DELAY_ELDSBR(coreFrameLength,*downSampleFactor);
   1915         }
   1916       }
   1917       else if (usePs) {
   1918         delayDiff = (*delay * *downSampleFactor) + DELAY_AAC2PS(coreFrameLength,*downSampleFactor);
   1919         *delay = DELAY_PS(coreFrameLength,*downSampleFactor);
   1920       }
   1921       else {
   1922         delayDiff = DELAY_AAC2SBR(coreFrameLength,*downSampleFactor);
   1923         delayDiff += (*delay * *downSampleFactor);
   1924         *delay = DELAY_SBR(coreFrameLength,*downSampleFactor);
   1925       }
   1926 
   1927       if (!usePs) {
   1928           timeDomainDownsample = *downSampleFactor-1;  /* activate time domain downsampler when downSampleFactor is != 1 */
   1929       }
   1930 
   1931 
   1932       /* Take care about downsampled data bound to the SBR path */
   1933       if (!timeDomainDownsample && delayDiff > 0) {
   1934         /*
   1935          * We must tweak the balancing into a situation where the downsampled path
   1936          * is the one to be delayed, because delaying the QMF domain input, also delays
   1937          * the downsampled audio, counteracting to the purpose of delay balancing.
   1938          */
   1939         while ( delayDiff > 0 )
   1940         {
   1941           /* Encoder delay increases */
   1942           {
   1943             *delay += coreFrameLength * *downSampleFactor;
   1944             /* Add one frame delay to SBR path */
   1945             delayDiff -= coreFrameLength * *downSampleFactor;
   1946           }
   1947           nBitstrDelay += 1;
   1948         }
   1949       } else
   1950       {
   1951         *delay += fixp_abs(delayDiff);
   1952       }
   1953 
   1954       if (delayDiff < 0) {
   1955         /* Delay AAC data */
   1956         delayDiff = -delayDiff;
   1957         /* Multiply downsampled offset by AAC core channels. Divide by 2 because of half samplerate of downsampled data. */
   1958         FDK_ASSERT(*downSampleFactor>0 && *downSampleFactor<=2);
   1959         downsampledOffset = (delayDiff*(*numChannels))>>(*downSampleFactor-1);
   1960         sbrOffset = 0;
   1961       } else {
   1962         /* Delay SBR input */
   1963         if ( delayDiff > (int)coreFrameLength * (int)*downSampleFactor )
   1964         {
   1965           /* Do bitstream frame-wise delay balancing if we have more than SBR framelength samples delay difference */
   1966           delayDiff -= coreFrameLength * *downSampleFactor;
   1967           nBitstrDelay = 1;
   1968         }
   1969         /* Multiply input offset by input channels */
   1970         sbrOffset = delayDiff*(*numChannels);
   1971         downsampledOffset = 0;
   1972       }
   1973       hSbrEncoder->nBitstrDelay            = nBitstrDelay;
   1974       hSbrEncoder->nChannels               = *numChannels;
   1975       hSbrEncoder->frameSize               = coreFrameLength * *downSampleFactor;
   1976       hSbrEncoder->fTimeDomainDownsampling = timeDomainDownsample;
   1977       hSbrEncoder->downSampleFactor        = *downSampleFactor;
   1978       hSbrEncoder->estimateBitrate         = 0;
   1979       hSbrEncoder->inputDataDelay          = 0;
   1980 
   1981 
   1982       /* Open SBR elements */
   1983       el = -1;
   1984       highestSbrStartFreq = highestSbrStopFreq = 0;
   1985       lowestBandwidth = 99999;
   1986 
   1987       /* Loop through each core encoder element and get a matching SBR element config */
   1988       for (coreEl=0; coreEl<noElements; coreEl++)
   1989       {
   1990         /* SBR only handles SCE and CPE's */
   1991         if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) {
   1992           el++;
   1993         } else {
   1994           continue;
   1995         }
   1996 
   1997         /* Set parametric Stereo Flag. */
   1998         if (usePs) {
   1999           elInfo[coreEl].fParametricStereo = 1;
   2000         } else {
   2001           elInfo[coreEl].fParametricStereo = 0;
   2002         }
   2003 
   2004         /*
   2005          * Init sbrConfig structure
   2006          */
   2007         if ( ! FDKsbrEnc_InitializeSbrDefaults ( &sbrConfig[el],
   2008                                                  *downSampleFactor,
   2009                                                   coreFrameLength
   2010                                                   ) )
   2011         {
   2012           error = 1;
   2013           goto bail;
   2014         }
   2015 
   2016         /*
   2017          * Modify sbrConfig structure according to Element parameters
   2018          */
   2019         if ( ! FDKsbrEnc_AdjustSbrSettings (&sbrConfig[el],
   2020                                              elInfo[coreEl].bitRate,
   2021                                              elInfo[coreEl].nChannelsInEl,
   2022                                             *coreSampleRate,
   2023                                              inputSampleRate,
   2024                                              transformFactor,
   2025                                              24000,
   2026                                              0,
   2027                                              0,     /* useSpeechConfig */
   2028                                              0,     /* lcsMode */
   2029                                              usePs, /* bParametricStereo */
   2030                                              aot) )
   2031         {
   2032           error = 1;
   2033           goto bail;
   2034         }
   2035 
   2036         /* Find common frequency border for all SBR elements */
   2037         highestSbrStartFreq = fixMax(highestSbrStartFreq, sbrConfig[el].startFreq);
   2038         highestSbrStopFreq = fixMax(highestSbrStopFreq, sbrConfig[el].stopFreq);
   2039 
   2040       } /* first element loop */
   2041 
   2042       /* Set element count (can be less than core encoder element count) */
   2043       hSbrEncoder->noElements = el+1;
   2044 
   2045       FDKsbrEnc_Reallocate(hSbrEncoder,
   2046                            elInfo,
   2047                            noElements);
   2048 
   2049       for (el=0; el<hSbrEncoder->noElements; el++) {
   2050 
   2051         int bandwidth = *coreBandwidth;
   2052 
   2053         /* Use lowest common bandwidth */
   2054         sbrConfig[el].startFreq = highestSbrStartFreq;
   2055         sbrConfig[el].stopFreq = highestSbrStopFreq;
   2056 
   2057         /* initialize SBR element, and get core bandwidth */
   2058         error = FDKsbrEnc_EnvInit(hSbrEncoder->sbrElement[el],
   2059                                   &sbrConfig[el],
   2060                                   &bandwidth,
   2061                                    aot,
   2062                                    nBitstrDelay,
   2063                                    el,
   2064                                    headerPeriod,
   2065                                    statesInitFlag,
   2066                                    hSbrEncoder->fTimeDomainDownsampling
   2067                                   ,hSbrEncoder->dynamicRam
   2068                                   );
   2069 
   2070         if (error != 0) {
   2071           error = 2;
   2072           goto bail;
   2073         }
   2074 
   2075         /* Get lowest core encoder bandwidth to be returned later. */
   2076         lowestBandwidth = fixMin(lowestBandwidth, bandwidth);
   2077 
   2078       } /* second element loop */
   2079 
   2080       /* Initialize a downsampler for each channel in each SBR element */
   2081       if (hSbrEncoder->fTimeDomainDownsampling)
   2082       {
   2083         for (el=0; el<hSbrEncoder->noElements; el++)
   2084         {
   2085           HANDLE_SBR_ELEMENT hSbrEl = hSbrEncoder->sbrElement[el];
   2086           INT Wc, ch;
   2087 
   2088           /* Calculated required normalized cutoff frequency (Wc = 1.0 -> lowestBandwidth = inputSampleRate/2) */
   2089           Wc = (2*lowestBandwidth)*1000 / inputSampleRate;
   2090 
   2091           for (ch=0; ch<hSbrEl->elInfo.nChannelsInEl; ch++)
   2092           {
   2093             FDKaacEnc_InitDownsampler (&hSbrEl->sbrChannel[ch]->downSampler, Wc, *downSampleFactor);
   2094             FDK_ASSERT (hSbrEl->sbrChannel[ch]->downSampler.delay <=MAX_DS_FILTER_DELAY);
   2095           }
   2096 
   2097           downsamplerDelay = hSbrEl->sbrChannel[0]->downSampler.delay;
   2098         } /* third element loop */
   2099 
   2100         /* lfe */
   2101         FDKaacEnc_InitDownsampler (&hSbrEncoder->lfeDownSampler, 0, *downSampleFactor);
   2102 
   2103         /* Add the resampler additional delay to get the final delay and buffer offset values. */
   2104         if (sbrOffset > 0 || downsampledOffset <= ((downsamplerDelay * (*numChannels))>>(*downSampleFactor-1))) {
   2105           sbrOffset += (downsamplerDelay - downsampledOffset) * (*numChannels) ;
   2106           *delay += downsamplerDelay - downsampledOffset;
   2107           downsampledOffset = 0;
   2108         } else {
   2109           downsampledOffset -= (downsamplerDelay * (*numChannels))>>(*downSampleFactor-1);
   2110           sbrOffset = 0;
   2111         }
   2112 
   2113         hSbrEncoder->inputDataDelay = downsamplerDelay;
   2114       }
   2115 
   2116       /* Assign core encoder Bandwidth */
   2117       *coreBandwidth = lowestBandwidth;
   2118 
   2119       /* Estimate sbr bitrate, 2.5 kBit/s per sbr channel */
   2120       hSbrEncoder->estimateBitrate += 2500 * (*numChannels);
   2121 
   2122       /* initialize parametric stereo */
   2123       if (usePs)
   2124       {
   2125         PSENC_CONFIG psEncConfig;
   2126         FDK_ASSERT(hSbrEncoder->noElements == 1);
   2127         INT psTuningTableIdx = getPsTuningTableIndex(elInfo[0].bitRate, NULL);
   2128 
   2129         psEncConfig.frameSize           = coreFrameLength; //sbrConfig.sbrFrameSize;
   2130         psEncConfig.qmfFilterMode       = 0;
   2131         psEncConfig.sbrPsDelay          = 0;
   2132 
   2133         /* tuning parameters */
   2134         if (psTuningTableIdx  != INVALID_TABLE_IDX) {
   2135           psEncConfig.nStereoBands           = psTuningTable[psTuningTableIdx].nStereoBands;
   2136           psEncConfig.maxEnvelopes           = psTuningTable[psTuningTableIdx].nEnvelopes;
   2137           psEncConfig.iidQuantErrorThreshold = (FIXP_DBL)psTuningTable[psTuningTableIdx].iidQuantErrorThreshold;
   2138 
   2139           /* calculation is not quite linear, increased number of envelopes causes more bits */
   2140           /* assume avg. 50 bits per frame for 10 stereo bands / 1 envelope configuration */
   2141           hSbrEncoder->estimateBitrate += ( (((*coreSampleRate) * 5 * psEncConfig.nStereoBands * psEncConfig.maxEnvelopes) / hSbrEncoder->frameSize));
   2142 
   2143         } else {
   2144           error = ERROR(CDI, "Invalid ps tuning table index.");
   2145           goto bail;
   2146         }
   2147 
   2148         qmfInitSynthesisFilterBank(&hSbrEncoder->qmfSynthesisPS,
   2149                                     (FIXP_DBL*)hSbrEncoder->qmfSynthesisPS.FilterStates,
   2150                                     hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots,
   2151                                     hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1,
   2152                                     hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1,
   2153                                     hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1,
   2154                                     (statesInitFlag) ? 0 : QMF_FLAG_KEEP_STATES);
   2155 
   2156         if(errorInfo == noError){
   2157           /* update delay */
   2158           psEncConfig.sbrPsDelay = FDKsbrEnc_GetEnvEstDelay(&hSbrEncoder->sbrElement[0]->sbrChannel[0]->hEnvChannel.sbrExtractEnvelope);
   2159 
   2160           if(noError != (errorInfo = PSEnc_Init( hSbrEncoder->hParametricStereo,
   2161                                                 &psEncConfig,
   2162                                                  hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots,
   2163                                                  hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands
   2164                                                 ,hSbrEncoder->dynamicRam
   2165                                                  )))
   2166           {
   2167             errorInfo = handBack(errorInfo);
   2168           }
   2169         }
   2170 
   2171         /* QMF analysis + Hybrid analysis + Hybrid synthesis + QMF synthesis + downsampled input buffer delay */
   2172         hSbrEncoder->inputDataDelay = (64*10/2) + (6*64) +  (0) + (64*10/2-64+1) + ((*downSampleFactor)*downsampledOffset);
   2173       }
   2174 
   2175       hSbrEncoder->downsampledOffset = downsampledOffset;
   2176       {
   2177         hSbrEncoder->downmixSize = coreFrameLength*(*numChannels);
   2178       }
   2179 
   2180       hSbrEncoder->bufferOffset = sbrOffset;
   2181       /* Delay Compensation: fill bitstream delay buffer with zero input signal */
   2182       if ( hSbrEncoder->nBitstrDelay > 0 )
   2183       {
   2184         error = FDKsbrEnc_DelayCompensation (hSbrEncoder, inputBuffer);
   2185         if (error != 0)
   2186           goto bail;
   2187       }
   2188 
   2189       /* Set Output frame length */
   2190       *frameLength = coreFrameLength * *downSampleFactor;
   2191       /* Input buffer offset */
   2192       *inputBufferOffset = fixMax(sbrOffset, downsampledOffset);
   2193 
   2194 
   2195     }
   2196 
   2197     return error;
   2198 
   2199 bail:
   2200     /* Restore input settings */
   2201     *coreSampleRate = inputSampleRate;
   2202     *frameLength = coreFrameLength;
   2203     *numChannels = inputChannels;
   2204     *coreBandwidth = inputBandWidth;
   2205 
   2206     return error;
   2207  }
   2208 
   2209 
   2210 INT
   2211 sbrEncoder_EncodeFrame(  HANDLE_SBR_ENCODER   hSbrEncoder,
   2212                          INT_PCM             *samples,
   2213                          UINT                 timeInStride,
   2214                          UINT                 sbrDataBits[(8)],
   2215                          UCHAR                sbrData[(8)][MAX_PAYLOAD_SIZE]
   2216                         )
   2217 {
   2218   INT error;
   2219   int el;
   2220 
   2221   for (el=0; el<hSbrEncoder->noElements; el++)
   2222   {
   2223     if (hSbrEncoder->sbrElement[el] != NULL)
   2224     {
   2225       error = FDKsbrEnc_EnvEncodeFrame(
   2226                                         hSbrEncoder,
   2227                                         el,
   2228                                         samples + hSbrEncoder->downsampledOffset,
   2229                                         timeInStride,
   2230                                        &sbrDataBits[el],
   2231                                         sbrData[el],
   2232                                         0
   2233                                        );
   2234       if (error)
   2235         return error;
   2236     }
   2237   }
   2238 
   2239   if ( ( hSbrEncoder->lfeChIdx!=-1) && (hSbrEncoder->downSampleFactor > 1) )
   2240   {   /* lfe downsampler */
   2241       INT nOutSamples;
   2242 
   2243       FDKaacEnc_Downsample(&hSbrEncoder->lfeDownSampler,
   2244                             samples + hSbrEncoder->downsampledOffset + hSbrEncoder->bufferOffset + hSbrEncoder->lfeChIdx,
   2245                             hSbrEncoder->frameSize,
   2246                             timeInStride,
   2247                             samples + hSbrEncoder->downsampledOffset + hSbrEncoder->lfeChIdx,
   2248                            &nOutSamples,
   2249                             hSbrEncoder->nChannels);
   2250 
   2251 
   2252   }
   2253 
   2254   return 0;
   2255 }
   2256 
   2257 
   2258 INT sbrEncoder_UpdateBuffers(
   2259                             HANDLE_SBR_ENCODER hSbrEncoder,
   2260                             INT_PCM *timeBuffer
   2261                             )
   2262  {
   2263     if ( hSbrEncoder->downsampledOffset > 0 ) {
   2264       /* Move delayed downsampled data */
   2265       FDKmemcpy ( timeBuffer,
   2266                   timeBuffer + hSbrEncoder->downmixSize,
   2267                   sizeof(INT_PCM) * (hSbrEncoder->downsampledOffset) );
   2268     } else {
   2269       /* Move delayed input data */
   2270       FDKmemcpy ( timeBuffer,
   2271         timeBuffer + hSbrEncoder->nChannels * hSbrEncoder->frameSize,
   2272                   sizeof(INT_PCM) * hSbrEncoder->bufferOffset );
   2273     }
   2274     if ( hSbrEncoder->nBitstrDelay > 0  )
   2275     {
   2276       int el;
   2277 
   2278       for (el=0; el<hSbrEncoder->noElements; el++)
   2279       {
   2280         FDKmemmove ( hSbrEncoder->sbrElement[el]->payloadDelayLine[0],
   2281                      hSbrEncoder->sbrElement[el]->payloadDelayLine[1],
   2282                      sizeof(UCHAR) * (hSbrEncoder->nBitstrDelay*MAX_PAYLOAD_SIZE) );
   2283 
   2284         FDKmemmove( &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[0],
   2285                     &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[1],
   2286                     sizeof(UINT) * (hSbrEncoder->nBitstrDelay) );
   2287       }
   2288     }
   2289     return 0;
   2290  }
   2291 
   2292 
   2293 INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder)
   2294 {
   2295   INT estimateBitrate = 0;
   2296 
   2297   if(hSbrEncoder) {
   2298     estimateBitrate += hSbrEncoder->estimateBitrate;
   2299   }
   2300 
   2301   return estimateBitrate;
   2302 }
   2303 
   2304 INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder)
   2305 {
   2306   INT delay = -1;
   2307 
   2308   if(hSbrEncoder) {
   2309     delay = hSbrEncoder->inputDataDelay;
   2310   }
   2311   return delay;
   2312 }
   2313 
   2314 
   2315 INT sbrEncoder_GetLibInfo( LIB_INFO *info )
   2316 {
   2317   int i;
   2318 
   2319   if (info == NULL) {
   2320     return -1;
   2321   }
   2322   /* search for next free tab */
   2323   for (i = 0; i < FDK_MODULE_LAST; i++) {
   2324     if (info[i].module_id == FDK_NONE) break;
   2325   }
   2326   if (i == FDK_MODULE_LAST) {
   2327     return -1;
   2328   }
   2329   info += i;
   2330 
   2331   info->module_id = FDK_SBRENC;
   2332   info->version = LIB_VERSION(SBRENCODER_LIB_VL0, SBRENCODER_LIB_VL1, SBRENCODER_LIB_VL2);
   2333   LIB_VERSION_STRING(info);
   2334   info->build_date = __DATE__;
   2335   info->build_time = __TIME__;
   2336   info->title = "SBR Encoder";
   2337 
   2338   /* Set flags */
   2339   info->flags = 0
   2340     | CAPF_SBR_HQ
   2341     | CAPF_SBR_PS_MPEG
   2342     ;
   2343   /* End of flags */
   2344 
   2345   return 0;
   2346 }
   2347