12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* -----------------------------------------------------------------------------------------------------------
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi� Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************  Fraunhofer IIS FDK Tools  ***********************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
863aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi   Author(s): Andreas Ehret, Tobias Chalupka
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Description: SBR encoder top level processing.
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_encoder.h"
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_ram.h"
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_rom.h"
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbrenc_freq_sca.h"
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "env_bit.h"
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "cmondata.h"
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_misc.h"
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr.h"
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "qmf.h"
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "ps_main.h"
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SBRENCODER_LIB_VL0 3
1054f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi#define SBRENCODER_LIB_VL1 3
106fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi#define SBRENCODER_LIB_VL2 4
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * SBR Delay balancing definitions.
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      input buffer (1ch)
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      |------------ 1537   -------------|-----|---------- 2048 -------------|
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           (core2sbr delay     )          ds     (read, core and ds area)
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1223aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define SFB(dwnsmp)        (32 << (dwnsmp-1))     /* SBR Frequency bands: 64 for dual-rate, 32 for single-rate */
1233aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define STS(fl)            (((fl)==1024)?32:30)   /* SBR Time Slots: 32 for core frame length 1024, 30 for core frame length 960 */
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1253aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_QMF_ANA(dwnsmp) ((320<<((dwnsmp)-1)) - (32<<((dwnsmp)-1))) /* Full bandwidth */
1263aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_HYB_ANA         (10*64)       /* + 0.5 */              /*  */
1273aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_HYB_SYN         (6*64 - 32)                            /*  */
1283aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_QMF_POSTPROC(dwnsmp) (32*(dwnsmp))                     /* QMF postprocessing delay */
1293aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_DEC_QMF(dwnsmp) (6 * SFB(dwnsmp) )                     /* Decoder QMF overlap */
1303aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_QMF_SYN         (2)                                    /* NO_POLY/2=2.5, rounded down to 2 */
1313aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_QMF_DS          (32)                                   /* QMF synthesis for downsampled time signal */
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Delay in QMF paths */
1343aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_SBR(fl,dwnsmp)     (DELAY_QMF_ANA(dwnsmp) + (SFB(dwnsmp)*STS(fl) - 1) + DELAY_QMF_SYN)
1353aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#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)
1363aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_ELDSBR(fl,dwnsmp)  ( ( ((fl)/2)*(dwnsmp) ) - 1 + DELAY_QMF_POSTPROC(dwnsmp) )
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Delay differences for SBR and SBR+PS */
1393aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define MAX_DS_FILTER_DELAY (5)                                           /* the additional max downsampler filter delay (source fs) */
1403aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_AAC2SBR(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_QMF_SYN) - DELAY_SBR((fl),(dwnsmp)))
1413aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_ELD2SBR(fl,dwnsmp) ((DELAY_QMF_POSTPROC(dwnsmp)) - DELAY_ELDSBR(fl,dwnsmp))
1423aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#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 */
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1443aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi/* Assumption: The sample delay resulting of of DELAY_AAC2PS is always smaller than the sample delay implied by DELAY_AAC2SBR */
1453aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define MAX_SAMPLE_DELAY       (DELAY_AAC2SBR(1024,2) + MAX_DS_FILTER_DELAY) /* maximum delay: frame length of 1024 and dual-rate sbr */
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define INVALID_TABLE_IDX -1
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Selects the SBR tuning settings to use dependent on number of
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          channels, bitrate, sample rate and core coder
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return Index to the appropriate table
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DISTANCE_CEIL_VALUE 5000000
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectgetSbrTuningTableIndex(UINT bitrate,    /*! the total bitrate in bits/sec */
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       UINT numChannels,/*! the number of channels for the core coder */
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       UINT sampleRate,  /*! the sampling rate of the core coder */
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       AUDIO_OBJECT_TYPE core,
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       UINT *pBitRateClosest
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       )
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1713aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  int i, bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1, found = 0;
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE;
1733aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  int isforThisCodec=0;
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1753aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  #define isForThisCore(i) \
1763aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    ( ( sbrTuningTable[i].coreCoder == CODEC_AACLD && core == AOT_ER_AAC_ELD ) || \
1773aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      ( sbrTuningTable[i].coreCoder == CODEC_AAC   && core != AOT_ER_AAC_ELD ) )
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1793aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  for (i=0; i < sbrTuningTableSize ; i++) {
1803aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if ( isForThisCore(i) ) /* tuning table is for this core codec */
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
1823aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      if ( numChannels == sbrTuningTable [i].numChannels
1833aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        && sampleRate == sbrTuningTable [i].sampleRate )
1843aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      {
1853aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        found = 1;
1863aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        if ((bitrate >= sbrTuningTable [i].bitrateFrom) &&
1873aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            (bitrate < sbrTuningTable [i].bitrateTo)) {
1883aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              bitRateClosestLower = bitrate;
1893aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              bitRateClosestUpper = bitrate;
1903aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              //FDKprintf("entry %d\n", i);
1913aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          return i ;
1923aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        } else {
1933aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          if ( sbrTuningTable [i].bitrateFrom > bitrate ) {
1943aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            if (sbrTuningTable [i].bitrateFrom < bitRateClosestLower) {
1953aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              bitRateClosestLower = sbrTuningTable [i].bitrateFrom;
1963aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              bitRateClosestLowerIndex = i;
1973aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            }
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
1993aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          if ( sbrTuningTable [i].bitrateTo <= bitrate ) {
2003aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            if (sbrTuningTable [i].bitrateTo > bitRateClosestUpper) {
2013aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              bitRateClosestUpper = sbrTuningTable [i].bitrateTo-1;
2023aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              bitRateClosestUpperIndex = i;
2033aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            }
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (pBitRateClosest != NULL)
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
2123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    /* If there was at least one matching tuning entry found then pick the least distance bit rate */
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (found)
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE;
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (bitRateClosestLowerIndex >= 0) {
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate;
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (bitRateClosestUpperIndex >= 0) {
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo;
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( distanceUpper < distanceLower )
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pBitRateClosest = bitRateClosestUpper;
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pBitRateClosest = bitRateClosestLower;
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *pBitRateClosest = 0;
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return INVALID_TABLE_IDX;
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Selects the PS tuning settings to use dependent on bitrate
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  and core coder
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return Index to the appropriate table
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectgetPsTuningTableIndex(UINT bitrate, UINT *pBitRateClosest){
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i, paramSets = sizeof (psTuningTable) / sizeof (psTuningTable [0]);
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1;
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE;
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0 ; i < paramSets ; i++)  {
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((bitrate >= psTuningTable [i].bitrateFrom) &&
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        (bitrate < psTuningTable [i].bitrateTo)) {
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return i ;
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( psTuningTable [i].bitrateFrom > bitrate ) {
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (psTuningTable [i].bitrateFrom < bitRateClosestLower) {
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitRateClosestLower = psTuningTable [i].bitrateFrom;
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitRateClosestLowerIndex = i;
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( psTuningTable [i].bitrateTo <= bitrate ) {
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (psTuningTable [i].bitrateTo > bitRateClosestUpper) {
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitRateClosestUpper = psTuningTable [i].bitrateTo-1;
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitRateClosestUpperIndex = i;
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (pBitRateClosest != NULL)
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE;
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (bitRateClosestLowerIndex >= 0) {
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate;
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (bitRateClosestUpperIndex >= 0) {
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo;
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( distanceUpper < distanceLower )
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *pBitRateClosest = bitRateClosestUpper;
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *pBitRateClosest = bitRateClosestLower;
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return INVALID_TABLE_IDX;
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2923aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi/***************************************************************************/
2933aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi/*!
2943aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
2953aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  \brief  In case of downsampled SBR we may need to lower the stop freq
2963aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          of a tuning setting to fit into the lower half of the
2973aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          spectrum ( which is sampleRate/4 )
2983aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
2993aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  \return the adapted stop frequency index (-1 -> error)
3003aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
3013aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  \ingroup SbrEncCfg
3023aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
3033aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi****************************************************************************/
3043aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivistatic INT
3053aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel TriviFDKsbrEnc_GetDownsampledStopFreq (
3063aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        const INT sampleRateCore,
3073aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        const INT startFreq,
3083aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              INT stopFreq,
3093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        const INT downSampleFactor
3103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        )
3113aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi{
3123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  INT maxStopFreqRaw = sampleRateCore / 2;
3133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  INT startBand, stopBand;
3143aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  HANDLE_ERROR_INFO err;
3153aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
3163aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  while (stopFreq > 0 && FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > maxStopFreqRaw) {
3173aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    stopFreq--;
3183aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  }
3193aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
3203aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  if (FDKsbrEnc_getSbrStopFreqRAW( stopFreq, sampleRateCore) > maxStopFreqRaw)
3213aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    return -1;
3223aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
3233aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  err = FDKsbrEnc_FindStartAndStopBand (
3243aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                sampleRateCore<<(downSampleFactor-1),
3253aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                sampleRateCore,
3263aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                32<<(downSampleFactor-1),
3273aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                startFreq,
3283aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                stopFreq,
3293aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi               &startBand,
3303aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi               &stopBand
3313aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                );
3323aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  if (err)
3333aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    return -1;
3343aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
3353aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  return stopFreq;
3363aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi}
3373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  tells us, if for the given coreCoder, bitrate, number of channels
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          and input sampling rate an SBR setting is available. If yes, it
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          tells us also the core sampling rate we would need to run with
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return a flag indicating success: yes (1) or no (0)
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic UINT
3503aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel TriviFDKsbrEnc_IsSbrSettingAvail (
3513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        UINT bitrate,           /*! the total bitrate in bits/sec */
3523aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        UINT vbrMode,           /*! the vbr paramter, 0 means constant bitrate */
3533aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        UINT numOutputChannels, /*! the number of channels for the core coder */
3543aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        UINT sampleRateInput,   /*! the input sample rate [in Hz] */
3553aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        UINT sampleRateCore,    /*! the core's sampling rate */
3563aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        AUDIO_OBJECT_TYPE core
3573aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        )
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT idx = INVALID_TABLE_IDX;
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sampleRateInput < 16000)
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (bitrate==0) {
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* map vbr quality to bitrate */
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (vbrMode < 30)
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitrate = 24000;
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (vbrMode < 40)
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitrate = 28000;
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (vbrMode < 60)
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitrate = 32000;
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (vbrMode < 75)
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitrate = 40000;
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitrate = 48000;
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitrate *= numOutputChannels;
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  idx = getSbrTuningTableIndex(bitrate, numOutputChannels, sampleRateCore, core, NULL);
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (idx == INVALID_TABLE_IDX ? 0 : 1);
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************/
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Adjusts the SBR settings according to the chosen core coder
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          settings which are accessible via config->codecSettings
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return A flag indicating success: yes (1) or no (0)
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic UINT
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_AdjustSbrSettings (const sbrConfigurationPtr config, /*! output, modified */
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   UINT bitRate,             /*! the total bitrate in bits/sec */
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   UINT numChannels,         /*! the core coder number of channels */
3983aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                   UINT sampleRateCore,      /*! the core coder sampling rate in Hz */
3993aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                   UINT sampleRateSbr,       /*! the sbr coder sampling rate in Hz */
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   UINT transFac,            /*! the short block to long block ratio */
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   UINT standardBitrate,     /*! the standard bitrate per channel in bits/sec */
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   UINT vbrMode,             /*! the vbr paramter, 0 poor quality .. 100 high quality*/
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   UINT useSpeechConfig,     /*!< adapt tuning parameters for speech ? */
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   UINT lcsMode,             /*! the low complexity stereo mode */
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   UINT bParametricStereo,   /*!< use parametric stereo */
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   AUDIO_OBJECT_TYPE core)   /* Core audio codec object type */
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT idx = INVALID_TABLE_IDX;
4093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  /* set the core codec settings */
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  config->codecSettings.bitRate         = bitRate;
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  config->codecSettings.nChannels       = numChannels;
4123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  config->codecSettings.sampleFreq      = sampleRateCore;
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  config->codecSettings.transFac        = transFac;
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  config->codecSettings.standardBitrate = standardBitrate;
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (bitRate==0) {
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* map vbr quality to bitrate */
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (vbrMode < 30)
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitRate = 24000;
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (vbrMode < 40)
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitRate = 28000;
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (vbrMode < 60)
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitRate = 32000;
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (vbrMode < 75)
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitRate = 40000;
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitRate = 48000;
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitRate *= numChannels;
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* fix to enable mono vbrMode<40 @ 44.1 of 48kHz */
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (numChannels==1) {
4313aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      if (sampleRateSbr==44100 || sampleRateSbr==48000) {
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (vbrMode<40) bitRate = 32000;
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  idx = getSbrTuningTableIndex(bitRate,numChannels,sampleRateCore, core, NULL);
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (idx != INVALID_TABLE_IDX) {
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->startFreq       = sbrTuningTable[idx].startFreq ;
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->stopFreq        = sbrTuningTable[idx].stopFreq ;
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (useSpeechConfig) {
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      config->startFreq     = sbrTuningTable[idx].startFreqSpeech;
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      config->stopFreq      = sbrTuningTable[idx].stopFreqSpeech;
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4473aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    /* Adapt stop frequency in case of downsampled SBR - only 32 bands then */
4483aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if (1 == config->downSampleFactor) {
4493aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      INT dsStopFreq = FDKsbrEnc_GetDownsampledStopFreq(
4503aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                               sampleRateCore,
4513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                               config->startFreq,
4523aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                               config->stopFreq,
4533aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                               config->downSampleFactor
4543aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                               );
4553aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      if (dsStopFreq < 0) {
4563aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        return 0;
4573aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      }
4583aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
4593aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      config->stopFreq = dsStopFreq;
4603aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    }
4613aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_noise_bands = sbrTuningTable[idx].numNoiseBands ;
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (core == AOT_ER_AAC_ELD)
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      config->init_amp_res_FF = SBR_AMP_RES_1_5;
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->noiseFloorOffset= sbrTuningTable[idx].noiseFloorOffset;
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->ana_max_level   = sbrTuningTable[idx].noiseMaxLevel ;
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->stereoMode      = sbrTuningTable[idx].stereoMode ;
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->freqScale       = sbrTuningTable[idx].freqScale ;
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* adjust usage of parametric coding dependent on bitrate and speech config flag */
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (useSpeechConfig)
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      config->parametricCoding  = 0;
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (core == AOT_ER_AAC_ELD) {
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (bitRate < 28000)
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        config->init_amp_res_FF = SBR_AMP_RES_3_0;
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      config->SendHeaderDataTime = -1;
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (numChannels == 1) {
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (bitRate < 16000) {
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        config->parametricCoding  = 0;
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (bitRate < 20000) {
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        config->parametricCoding  = 0;
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->useSpeechConfig = useSpeechConfig;
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* PS settings */
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->bParametricStereo = bParametricStereo;
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 1 ;
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0 ;
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: FDKsbrEnc_InitializeSbrDefaults
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description:  initializes the SBR confifuration
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:      error status
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:        - core codec type,
5103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi               - factor of SBR to core frame length,
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               - core frame length
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:       initialized SBR configuration
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic UINT
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_InitializeSbrDefaults (sbrConfigurationPtr config,
5173aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                 INT                 downSampleFactor,
5183aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                 UINT                codecGranuleLen
5193aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                 )
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5213aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if ( (downSampleFactor < 1 || downSampleFactor > 2) ||
5223aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi         (codecGranuleLen*downSampleFactor > QMF_CHANNELS*QMF_MAX_TIME_SLOTS) )
5233aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi       return(0); /* error */
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->SendHeaderDataTime     = 1000;
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->useWaveCoding          = 0;
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->crcSbr                 = 0;
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->dynBwSupported         = 1;
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->tran_thr               = 13000;
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->parametricCoding       = 1;
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5323aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    config->sbrFrameSize           = codecGranuleLen * downSampleFactor;
5333aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    config->downSampleFactor       = downSampleFactor;
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* sbr default parameters */
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_data_extra         = 0;
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->amp_res                = SBR_AMP_RES_3_0 ;
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->tran_fc                = 0 ;
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->tran_det_mode          = 1 ;
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->spread                 = 1 ;
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->stat                   = 0 ;
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->e                      = 1 ;
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->deltaTAcrossFrames     = 1 ;
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->dF_edge_1stEnv         = FL2FXCONST_DBL(0.3f) ;
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->dF_edge_incr           = FL2FXCONST_DBL(0.3f) ;
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_invf_mode   = INVF_SWITCHED;
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_xpos_mode   = XPOS_LC;
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_xpos_ctrl   = SBR_XPOS_CTRL_DEFAULT;
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_xpos_level  = 0;
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->useSaPan        = 0;
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->dynBwEnabled    = 0;
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* the following parameters are overwritten by the FDKsbrEnc_AdjustSbrSettings() function since
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       they are included in the tuning table */
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->stereoMode             = SBR_SWITCH_LRC;
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->ana_max_level          = 6;
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->noiseFloorOffset       = 0;
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->startFreq              = 5; /*  5.9 respectively  6.0 kHz at fs = 44.1/48 kHz */
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->stopFreq               = 9; /* 16.2 respectively 16.8 kHz at fs = 44.1/48 kHz */
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* header_extra_1 */
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->freqScale       = SBR_FREQ_SCALE_DEFAULT;
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->alterScale      = SBR_ALTER_SCALE_DEFAULT;
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_noise_bands = SBR_NOISE_BANDS_DEFAULT;
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* header_extra_2 */
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_limiter_bands    = SBR_LIMITER_BANDS_DEFAULT;
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_limiter_gains    = SBR_LIMITER_GAINS_DEFAULT;
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_interpol_freq    = SBR_INTERPOL_FREQ_DEFAULT;
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->sbr_smoothing_length = SBR_SMOOTHING_LENGTH_DEFAULT;
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 1;
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: DeleteEnvChannel
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description:  frees memory of one SBR channel
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:      -
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:        handle of channel
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:       released handle
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectdeleteEnvChannel (HANDLE_ENV_CHANNEL hEnvCut)
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hEnvCut) {
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKsbrEnc_DeleteTonCorrParamExtr(&hEnvCut->TonCorr);
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKsbrEnc_deleteExtractSbrEnvelope (&hEnvCut->sbrExtractEnvelope);
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: sbrEncoder_ChannelClose
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description:  close the channel coding handle
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:        phSbrChannel
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrEncoder_ChannelClose(HANDLE_SBR_CHANNEL hSbrChannel)
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hSbrChannel != NULL)
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    deleteEnvChannel (&hSbrChannel->hEnvChannel);
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: sbrEncoder_ElementClose
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description:  close the channel coding handle
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:        phSbrChannel
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrEncoder_ElementClose(HANDLE_SBR_ELEMENT *phSbrElement)
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_SBR_ELEMENT hSbrElement = *phSbrElement;
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hSbrElement!=NULL) {
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrElement->sbrConfigData.v_k_master)
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FreeRam_Sbr_v_k_master(&hSbrElement->sbrConfigData.v_k_master);
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrElement->sbrConfigData.freqBandTable[LO])
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FreeRam_Sbr_freqBandTableLO(&hSbrElement->sbrConfigData.freqBandTable[LO]);
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrElement->sbrConfigData.freqBandTable[HI])
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FreeRam_Sbr_freqBandTableHI(&hSbrElement->sbrConfigData.freqBandTable[HI]);
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FreeRam_SbrElement(phSbrElement);
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ;
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid sbrEncoder_Close (HANDLE_SBR_ENCODER *phSbrEncoder)
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_SBR_ENCODER hSbrEncoder = *phSbrEncoder;
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hSbrEncoder != NULL)
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int el, ch;
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
656fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi    for (el=0; el<(8); el++)
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (hSbrEncoder->sbrElement[el]!=NULL) {
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrEncoder_ElementClose(&hSbrEncoder->sbrElement[el]);
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Close sbr Channels */
664fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi    for (ch=0; ch<(8); ch++)
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (hSbrEncoder->pSbrChannel[ch]) {
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrEncoder_ChannelClose(hSbrEncoder->pSbrChannel[ch]);
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FreeRam_SbrChannel(&hSbrEncoder->pSbrChannel[ch]);
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (hSbrEncoder->QmfAnalysis[ch].FilterStates)
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FreeRam_Sbr_QmfStatesAnalysis((FIXP_QAS**)&hSbrEncoder->QmfAnalysis[ch].FilterStates);
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrEncoder->hParametricStereo)
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PSEnc_Destroy(&hSbrEncoder->hParametricStereo);
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrEncoder->qmfSynthesisPS.FilterStates)
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FreeRam_PsQmfStatesSynthesis((FIXP_DBL**)&hSbrEncoder->qmfSynthesisPS.FilterStates);
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Release Overlay */
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FreeRam_SbrDynamic_RAM((FIXP_DBL**)&hSbrEncoder->pSBRdynamic_RAM);
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FreeRam_SbrEncoder(phSbrEncoder);
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: updateFreqBandTable
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description:  updates vk_master
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:      -
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:        config handle
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:       error info
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
7003aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivistatic INT updateFreqBandTable(
7013aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        HANDLE_SBR_CONFIG_DATA  sbrConfigData,
7023aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        HANDLE_SBR_HEADER_DATA  sbrHeaderData,
7033aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        const INT               downSampleFactor
7043aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        )
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT k0, k2;
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7083aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  if( FDKsbrEnc_FindStartAndStopBand (
7093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrConfigData->sampleFreq,
7103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrConfigData->sampleFreq >> (downSampleFactor-1),
7113aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrConfigData->noQmfBands,
7123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrHeaderData->sbr_start_frequency,
7133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrHeaderData->sbr_stop_frequency,
7143aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi             &k0,
7153aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi             &k2
7163aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              )
7173aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    )
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7213aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  if( FDKsbrEnc_UpdateFreqScale(
7223aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrConfigData->v_k_master,
7233aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi             &sbrConfigData->num_Master,
7243aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              k0,
7253aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              k2,
7263aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrHeaderData->freqScale,
7273aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrHeaderData->alterScale
7283aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              )
7293aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    )
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrHeaderData->sbr_xover_band=0;
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7363aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  if( FDKsbrEnc_UpdateHiRes(
7373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrConfigData->freqBandTable[HI],
7383aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              &sbrConfigData->nSfb[HI],
7393aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrConfigData->v_k_master,
7403aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              sbrConfigData->num_Master,
7413aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              &sbrHeaderData->sbr_xover_band
7423aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              )
7433aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    )
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7473aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  FDKsbrEnc_UpdateLoRes(
7483aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          sbrConfigData->freqBandTable[LO],
7493aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          &sbrConfigData->nSfb[LO],
7503aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          sbrConfigData->freqBandTable[HI],
7513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          sbrConfigData->nSfb[HI]
7523aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          );
7533aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7553aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  sbrConfigData->xOverFreq = (sbrConfigData->freqBandTable[LOW_RES][0] * sbrConfigData->sampleFreq / sbrConfigData->noQmfBands+1)>>1;
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (0);
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: resetEnvChannel
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description:  resets parameters and allocates memory
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:      error status
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:       hEnv
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT resetEnvChannel (HANDLE_SBR_CONFIG_DATA  sbrConfigData,
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            HANDLE_SBR_HEADER_DATA  sbrHeaderData,
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            HANDLE_ENV_CHANNEL      hEnv)
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* note !!! hEnv->encEnvData.noOfnoisebands will be updated later in function FDKsbrEnc_extractSbrEnvelope !!!*/
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->TonCorr.sbrNoiseFloorEstimate.noiseBands =  sbrHeaderData->sbr_noise_bands;
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_ResetTonCorrParamExtr(&hEnv->TonCorr,
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sbrConfigData->xposCtrlSwitch,
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sbrConfigData->freqBandTable[HI][0],
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sbrConfigData->v_k_master,
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sbrConfigData->num_Master,
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sbrConfigData->sampleFreq,
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sbrConfigData->freqBandTable,
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sbrConfigData->nSfb,
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sbrConfigData->noQmfBands))
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->sbrCodeNoiseFloor.nSfb[LO] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->sbrCodeNoiseFloor.nSfb[HI] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->sbrCodeEnvelope.nSfb[LO] = sbrConfigData->nSfb[LO];
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->sbrCodeEnvelope.nSfb[HI] = sbrConfigData->nSfb[HI];
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI];
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->sbrCodeEnvelope.upDate = 0;
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->sbrCodeNoiseFloor.upDate = 0;
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (0);
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* ****************************** FDKsbrEnc_SbrGetXOverFreq ******************************/
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * @fn
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * @brief       calculates the closest possible crossover frequency
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * @return      the crossover frequency SBR accepts
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_SbrGetXOverFreq(HANDLE_SBR_ELEMENT  hEnv,        /*!< handle to SBR encoder instance */
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          INT                 xoverFreq)   /*!< from core coder suggested crossover frequency */
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT band;
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT lastDiff, newDiff;
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT cutoffSb;
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR *RESTRICT pVKMaster = hEnv->sbrConfigData.v_k_master;
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Check if there is a matching cutoff frequency in the master table */
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cutoffSb = (4*xoverFreq * hEnv->sbrConfigData.noQmfBands / hEnv->sbrConfigData.sampleFreq + 1)>>1;
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  lastDiff = cutoffSb;
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (band = 0; band < hEnv->sbrConfigData.num_Master; band++) {
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    newDiff = fixp_abs((INT)pVKMaster[band] - cutoffSb);
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if(newDiff >= lastDiff) {
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      band--;
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    lastDiff = newDiff;
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ((pVKMaster[band] * hEnv->sbrConfigData.sampleFreq/hEnv->sbrConfigData.noQmfBands+1)>>1);
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: FDKsbrEnc_EnvEncodeFrame
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: performs the sbr envelope calculation for one element
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_EnvEncodeFrame(HANDLE_SBR_ENCODER   hEnvEncoder,
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         int                  iElement,
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         INT_PCM             *samples,                 /*!< time samples, always interleaved */
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         UINT                 timeInStride,            /*!< time buffer channel interleaving stride */
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         UINT                *sbrDataBits,             /*!< Size of SBR payload  */
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         UCHAR               *sbrData,                 /*!< SBR payload  */
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         int                  clearOutput              /*!< Do not consider any input signal */
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        )
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_SBR_ELEMENT hSbrElement = hEnvEncoder->sbrElement[iElement];
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_CRCINFO  crcInfo;
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT    crcReg;
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT    ch;
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT    band;
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT    cutoffSb;
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT    newXOver;
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hEnvEncoder == NULL)
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement = hEnvEncoder->sbrElement[iElement];
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hSbrElement == NULL)
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* header bitstream handling */
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData = &hSbrElement->sbrBitstreamData;
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT psHeaderActive = 0;
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrBitstreamData->HeaderActive = 0;
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Anticipate PS header because of internal PS bitstream delay in order to be in sync with SBR header. */
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( sbrBitstreamData->CountSendHeaderData==(sbrBitstreamData->NrSendHeaderData-1) )
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      psHeaderActive = 1;
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Signal SBR header to be written into bitstream */
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( sbrBitstreamData->CountSendHeaderData==0  )
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     sbrBitstreamData->HeaderActive = 1;
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Increment header interval counter */
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sbrBitstreamData->NrSendHeaderData == 0) {
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sbrBitstreamData->CountSendHeaderData = 1;
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (sbrBitstreamData->CountSendHeaderData >= 0) {
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrBitstreamData->CountSendHeaderData++;
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrBitstreamData->CountSendHeaderData %= sbrBitstreamData->NrSendHeaderData;
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hSbrElement->CmonData.dynBwEnabled ) {
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i;
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( i = 4; i > 0; i-- )
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrElement->dynXOverFreqDelay[i] = hSbrElement->dynXOverFreqDelay[i-1];
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->dynXOverFreqDelay[0] = hSbrElement->CmonData.dynXOverFreqEnc;
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrElement->dynXOverFreqDelay[1] > hSbrElement->dynXOverFreqDelay[2])
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      newXOver = hSbrElement->dynXOverFreqDelay[2];
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      newXOver = hSbrElement->dynXOverFreqDelay[1];
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* has the crossover frequency changed? */
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( hSbrElement->sbrConfigData.dynXOverFreq != newXOver ) {
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* get corresponding master band */
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cutoffSb = ((4* newXOver * hSbrElement->sbrConfigData.noQmfBands
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  / hSbrElement->sbrConfigData.sampleFreq)+1)>>1;
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for ( band = 0; band < hSbrElement->sbrConfigData.num_Master; band++ ) {
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( cutoffSb == hSbrElement->sbrConfigData.v_k_master[band] )
9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDK_ASSERT( band < hSbrElement->sbrConfigData.num_Master );
9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrElement->sbrConfigData.dynXOverFreq = newXOver;
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrElement->sbrHeaderData.sbr_xover_band = band;
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrElement->sbrBitstreamData.HeaderActive=1;
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      psHeaderActive = 1; /* ps header is one frame delayed */
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        update vk_master table
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      */
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if(updateFreqBandTable(&hSbrElement->sbrConfigData,
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             &hSbrElement->sbrHeaderData,
9373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                             hEnvEncoder->downSampleFactor
9383aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                             ))
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return(1);
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* reset SBR channels */
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT nEnvCh = hSbrElement->sbrConfigData.nChannels;
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for ( ch = 0; ch < nEnvCh; ch++ ) {
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if(resetEnvChannel (&hSbrElement->sbrConfigData,
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            &hSbrElement->sbrHeaderData,
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            &hSbrElement->sbrChannel[ch]->hEnvChannel))
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return(1);
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    allocate space for dummy header and crc
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  crcReg = FDKsbrEnc_InitSbrBitstream(&hSbrElement->CmonData,
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       hSbrElement->payloadDelayLine[hEnvEncoder->nBitstrDelay],
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       MAX_PAYLOAD_SIZE*sizeof(UCHAR),
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      &crcInfo,
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       hSbrElement->sbrConfigData.sbrSyntaxFlags);
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Temporal Envelope Data */
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SBR_FRAME_TEMP_DATA _fData;
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SBR_FRAME_TEMP_DATA *fData = &_fData;
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SBR_ENV_TEMP_DATA eData[MAX_NUM_CHANNELS];
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Init Temporal Envelope Data */
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int i;
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(&eData[0], sizeof(SBR_ENV_TEMP_DATA));
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(&eData[1], sizeof(SBR_ENV_TEMP_DATA));
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(fData, sizeof(SBR_FRAME_TEMP_DATA));
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(i=0; i<MAX_NUM_NOISE_VALUES; i++)
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      fData->res[i] = FREQ_RES_HIGH;
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!clearOutput)
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Transform audio data into QMF domain
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++)
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      HANDLE_ENV_CHANNEL h_envChan = &hSbrElement->sbrChannel[ch]->hEnvChannel;
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &h_envChan->sbrExtractEnvelope;
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if(hSbrElement->elInfo.fParametricStereo == 0)
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        QMF_SCALE_FACTOR tmpScale;
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FIXP_DBL **pQmfReal, **pQmfImag;
9953aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        C_AALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2)
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Obtain pointers to QMF buffers. */
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pQmfReal = sbrExtrEnv->rBuffer;
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pQmfImag = sbrExtrEnv->iBuffer;
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        qmfAnalysisFiltering( hSbrElement->hQmfAnalysis[ch],
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               pQmfReal,
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               pQmfImag,
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              &tmpScale,
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               samples + hSbrElement->elInfo.ChannelIndex[ch],
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               timeInStride,
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               qmfWorkBuffer );
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        h_envChan->qmfScale = tmpScale.lb_scale + 7;
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
10133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        C_AALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2)
10143aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* fParametricStereo == 0 */
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        Parametric Stereo processing
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      */
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (hSbrElement->elInfo.fParametricStereo)
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
10233aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        INT error = noError;
10243aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Limit Parametric Stereo to one instance */
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDK_ASSERT(ch == 0);
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if(error == noError){
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* parametric stereo processing:
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             - input:
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               o left and right time domain samples
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             - processing:
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               o stereo qmf analysis
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               o stereo hybrid analysis
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               o ps parameter extraction
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               o downmix + hybrid synthesis
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             - output:
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               o downmixed qmf data is written to sbrExtrEnv->rBuffer and sbrExtrEnv->iBuffer
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          */
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          SCHAR qmfScale;
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          INT_PCM* pSamples[2] = {samples + hSbrElement->elInfo.ChannelIndex[0],samples + hSbrElement->elInfo.ChannelIndex[1]};
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          error = FDKsbrEnc_PSEnc_ParametricStereoProcessing( hEnvEncoder->hParametricStereo,
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                              pSamples,
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                              timeInStride,
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                              hSbrElement->hQmfAnalysis,
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                              sbrExtrEnv->rBuffer,
10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                              sbrExtrEnv->iBuffer,
10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                              samples + hSbrElement->elInfo.ChannelIndex[ch],
10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                             &hEnvEncoder->qmfSynthesisPS,
10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                             &qmfScale,
10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                              psHeaderActive );
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (noError != error)
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            error = handBack(error);
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          h_envChan->qmfScale = (int)qmfScale;
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* if (hEnvEncoder->hParametricStereo) */
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*
10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         Extract Envelope relevant things from QMF data
10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      */
10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKsbrEnc_extractSbrEnvelope1(
10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->sbrConfigData,
10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->sbrHeaderData,
10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->sbrBitstreamData,
10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 h_envChan,
10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->CmonData,
10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &eData[ch],
10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 fData
10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 );
10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* hEnvEncoder->sbrConfigData.nChannels */
10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project }
10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     Process Envelope relevant things and calculate envelope data and write payload
10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKsbrEnc_extractSbrEnvelope2(
10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->sbrConfigData,
10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->sbrHeaderData,
10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                (hSbrElement->elInfo.fParametricStereo) ? hEnvEncoder->hParametricStereo : NULL,
10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->sbrBitstreamData,
10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->sbrChannel[0]->hEnvChannel,
10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->sbrChannel[1]->hEnvChannel,
10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hSbrElement->CmonData,
10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 eData,
10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 fData,
10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 clearOutput
10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               );
10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    format payload, calculate crc
11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKsbrEnc_AssembleSbrBitstream(&hSbrElement->CmonData, &crcInfo, crcReg, hSbrElement->sbrConfigData.sbrSyntaxFlags);
11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    save new payload, set to zero length if greater than MAX_PAYLOAD_SIZE
11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] = FDKgetValidBits(&hSbrElement->CmonData.sbrBitbuf);
11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] > (MAX_PAYLOAD_SIZE<<3))
11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay]=0;
11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* While filling the Delay lines, sbrData is NULL */
11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sbrData) {
11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *sbrDataBits = hSbrElement->payloadDelayLineSize[0];
11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemcpy(sbrData, hSbrElement->payloadDelayLine[0], (hSbrElement->payloadDelayLineSize[0]+7)>>3);
11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*******************************/
11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hEnvEncoder->fTimeDomainDownsampling)
11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch;
11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int nChannels = hSbrElement->sbrConfigData.nChannels;
11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch=0; ch < nChannels; ch++)
11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT nOutSamples;
11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKaacEnc_Downsample(&hSbrElement->sbrChannel[ch]->downSampler,
11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            samples + hSbrElement->elInfo.ChannelIndex[ch] + hEnvEncoder->bufferOffset,
11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hSbrElement->sbrConfigData.frameSize,
11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            timeInStride,
11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            samples + hSbrElement->elInfo.ChannelIndex[ch],
11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &nOutSamples,
11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hEnvEncoder->nChannels);
11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* downsample */
11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (0);
11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: createEnvChannel
11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description:  initializes parameters and allocates memory
11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:      error status
11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:
11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:       hEnv
11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT
11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectcreateEnvChannel (HANDLE_ENV_CHANNEL     hEnv,
11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  INT                    channel
11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 ,UCHAR*                 dynamic_RAM
11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 )
11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(hEnv,sizeof (struct ENV_CHANNEL));
11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( FDKsbrEnc_CreateTonCorrParamExtr(&hEnv->TonCorr,
11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         channel) )
11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( FDKsbrEnc_CreateExtractSbrEnvelope (&hEnv->sbrExtractEnvelope,
11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               channel
11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              ,/*chan*/0
11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              ,dynamic_RAM
11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              ) )
11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: initEnvChannel
11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description:  initializes parameters
11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:      error status
11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:
11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:
11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT
11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectinitEnvChannel (  HANDLE_SBR_CONFIG_DATA sbrConfigData,
11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  HANDLE_SBR_HEADER_DATA sbrHeaderData,
11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  HANDLE_ENV_CHANNEL     hEnv,
11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sbrConfigurationPtr    params,
11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  ULONG                  statesInitFlag
11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 ,INT                    chanInEl
11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 ,UCHAR*                 dynamic_RAM
11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 )
11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int frameShift, tran_off=0;
12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT e;
12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT tran_fc;
12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT timeSlots, timeStep, startIndex;
12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT noiseBands[2] = { 3, 3 };
12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  e = 1 << params->e;
12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_ASSERT(params->e >= 0);
12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.freq_res_fixfix = 1;
12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->fLevelProtect = 0;
12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.ldGrid = (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? 1 : 0;
12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.sbr_xpos_mode = (XPOS_MODE)params->sbr_xpos_mode;
12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hEnv->encEnvData.sbr_xpos_mode == XPOS_SWITCHED) {
12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       no other type than XPOS_MDCT or XPOS_SPEECH allowed,
12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       but enable switching
12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    */
12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sbrConfigData->switchTransposers = TRUE;
12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hEnv->encEnvData.sbr_xpos_mode = XPOS_MDCT;
12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sbrConfigData->switchTransposers = FALSE;
12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.sbr_xpos_ctrl = params->sbr_xpos_ctrl;
12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* extended data */
12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(params->parametricCoding) {
12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hEnv->encEnvData.extended_data = 1;
12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hEnv->encEnvData.extended_data = 0;
12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.extension_size = 0;
12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  startIndex = QMF_FILTER_PROTOTYPE_SIZE - sbrConfigData->noQmfBands;
12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (params->sbrFrameSize) {
12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 2304:
12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    timeSlots = 18;
12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 2048:
12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 1024:
12503aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  case 512:
12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    timeSlots = 16;
12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 1920:
12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 960:
12553aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  case 480:
12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    timeSlots = 15;
12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 1152:
12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    timeSlots = 9;
12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return (1); /* Illegal frame size */
12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  timeStep = sbrConfigData->noQmfSlots / timeSlots;
12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( FDKsbrEnc_InitTonCorrParamExtr(params->sbrFrameSize,
12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     &hEnv->TonCorr,
12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      sbrConfigData,
12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      timeSlots,
12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      params->sbr_xpos_ctrl,
12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      params->ana_max_level,
12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      sbrHeaderData->sbr_noise_bands,
12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      params->noiseFloorOffset,
12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      params->useSpeechConfig) )
12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.noOfnoisebands = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands;
12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  noiseBands[0] = hEnv->encEnvData.noOfnoisebands;
12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  noiseBands[1] = hEnv->encEnvData.noOfnoisebands;
12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.sbr_invf_mode = (INVF_MODE)params->sbr_invf_mode;
12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hEnv->encEnvData.sbr_invf_mode == INVF_SWITCHED) {
12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hEnv->encEnvData.sbr_invf_mode = INVF_MID_LEVEL;
12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hEnv->TonCorr.switchInverseFilt = TRUE;
12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hEnv->TonCorr.switchInverseFilt = FALSE;
12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  tran_fc  = params->tran_fc;
12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12963aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  if (tran_fc == 0) {
12973aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    tran_fc = fixMin (5000, FDKsbrEnc_getSbrStartFreqRAW (sbrHeaderData->sbr_start_frequency,params->codecSettings.sampleFreq));
12983aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  }
12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  tran_fc = (tran_fc*4*sbrConfigData->noQmfBands/sbrConfigData->sampleFreq + 1)>>1;
13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) {
13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    frameShift = LD_PRETRAN_OFF;
13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tran_off = LD_PRETRAN_OFF + FRAME_MIDDLE_SLOT_512LD*timeStep;
13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else
13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    frameShift = 0;
13083aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    switch (timeSlots) {
13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* The factor of 2 is by definition. */
13103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      case NUMBER_TIME_SLOTS_2048: tran_off = 8 + FRAME_MIDDLE_SLOT_2048 * timeStep; break;
13113aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      case NUMBER_TIME_SLOTS_1920: tran_off = 7 + FRAME_MIDDLE_SLOT_1920 * timeStep; break;
13123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      default: return 1;
13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( FDKsbrEnc_InitExtractSbrEnvelope (&hEnv->sbrExtractEnvelope,
13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               sbrConfigData->noQmfSlots,
13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               sbrConfigData->noQmfBands, startIndex,
13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               timeSlots, timeStep, tran_off,
13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               statesInitFlag
13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              ,chanInEl
13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              ,dynamic_RAM
13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              ,sbrConfigData->sbrSyntaxFlags
13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               ) )
13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeEnvelope,
13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            sbrConfigData->nSfb,
13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            params->deltaTAcrossFrames,
13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            params->dF_edge_1stEnv,
13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            params->dF_edge_incr))
13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeNoiseFloor,
13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            noiseBands,
13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            params->deltaTAcrossFrames,
13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            0,0))
13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrConfigData->initAmpResFF = params->init_amp_res_FF;
13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_InitSbrHuffmanTables (&hEnv->encEnvData,
13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &hEnv->sbrCodeEnvelope,
13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &hEnv->sbrCodeNoiseFloor,
13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sbrHeaderData->sbr_amp_res))
13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   return(1);
13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKsbrEnc_initFrameInfoGenerator (&hEnv->SbrEnvFrame,
13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            params->spread,
13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            e,
13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            params->stat,
13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            timeSlots,
13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hEnv->encEnvData.freq_res_fixfix
13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            ,hEnv->encEnvData.ldGrid
13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            );
13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_InitSbrTransientDetector (&hEnv->sbrTransientDetector,
13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          sbrConfigData->frameSize,
13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          sbrConfigData->sampleFreq,
13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          params,
13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          tran_fc,
13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          sbrConfigData->noQmfSlots,
13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          sbrConfigData->noQmfBands,
13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          hEnv->sbrExtractEnvelope.YBufferWriteOffset,
13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          hEnv->sbrExtractEnvelope.YBufferSzShift,
13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          frameShift,
13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          tran_off
13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          ))
13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return(1);
13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrConfigData->xposCtrlSwitch = params->sbr_xpos_ctrl;
13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI];
13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hEnv->encEnvData.addHarmonicFlag = 0;
13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (0);
13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT sbrEncoder_Open(
13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_SBR_ENCODER  *phSbrEncoder,
13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT                  nElements,
13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT                  nChannels,
13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT                  supportPS
13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i;
13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT errorStatus = 1;
13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_SBR_ENCODER hSbrEncoder = NULL;
13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (phSbrEncoder==NULL
13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     )
13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrEncoder = GetRam_SbrEncoder();
13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hSbrEncoder==NULL) {
13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(hSbrEncoder, sizeof(SBR_ENCODER));
14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrEncoder->pSBRdynamic_RAM = (UCHAR*)GetRam_SbrDynamic_RAM();
14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrEncoder->dynamicRam = hSbrEncoder->pSBRdynamic_RAM;
14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<nElements; i++) {
14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrEncoder->sbrElement[i] = GetRam_SbrElement(i);
14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrEncoder->sbrElement[i]==NULL) {
14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hSbrEncoder->sbrElement[i], sizeof(SBR_ELEMENT));
14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO] =  GetRam_Sbr_freqBandTableLO(i);
14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI] =  GetRam_Sbr_freqBandTableHI(i);
14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master        =  GetRam_Sbr_v_k_master(i);
14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO]==NULL) ||
14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI]==NULL) ||
14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         (hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master==NULL) )
14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<nChannels; i++) {
14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrEncoder->pSbrChannel[i] = GetRam_SbrChannel(i);
14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrEncoder->pSbrChannel[i]==NULL) {
14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( createEnvChannel(&hSbrEncoder->pSbrChannel[i]->hEnvChannel,
14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           i
14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          ,hSbrEncoder->dynamicRam
14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           ) )
14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<fixMax(nChannels,(supportPS)?2:0); i++) {
14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrEncoder->QmfAnalysis[i].FilterStates = GetRam_Sbr_QmfStatesAnalysis(i);
14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrEncoder->QmfAnalysis[i].FilterStates==NULL) {
14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (supportPS) {
14462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (PSEnc_Create(&hSbrEncoder->hParametricStereo))
14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
14492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrEncoder->qmfSynthesisPS.FilterStates = GetRam_PsQmfStatesSynthesis();
14522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrEncoder->qmfSynthesisPS.FilterStates==NULL) {
14532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
14542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }  /* supportPS */
14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *phSbrEncoder = hSbrEncoder;
14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  errorStatus = 0;
14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return errorStatus;
14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Close SBR encoder instance */
14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrEncoder_Close(&hSbrEncoder);
14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return errorStatus;
14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT FDKsbrEnc_Reallocate(
14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    HANDLE_SBR_ENCODER   hSbrEncoder,
1471fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                    SBR_ELEMENT_INFO     elInfo[(8)],
14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    const INT            noElements)
14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT totalCh = 0;
14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT totalQmf = 0;
14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT coreEl;
14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT el=-1;
14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrEncoder->lfeChIdx = -1; /* default value, until lfe found */
14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (coreEl=0; coreEl<noElements; coreEl++)
14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* SBR only handles SCE and CPE's */
14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) {
14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      el++;
14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (elInfo[coreEl].elType == ID_LFE) {
14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hSbrEncoder->lfeChIdx = elInfo[coreEl].ChannelIndex[0];
14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      continue;
14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SBR_ELEMENT_INFO    *pelInfo = &elInfo[coreEl];
14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_SBR_ELEMENT  hSbrElement = hSbrEncoder->sbrElement[el];
14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch;
14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( ch = 0; ch < pelInfo->nChannelsInEl; ch++ ) {
14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrElement->sbrChannel[ch] = hSbrEncoder->pSbrChannel[totalCh];
14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      totalCh++;
15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* analysis QMF */
15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( ch = 0; ch < ((pelInfo->fParametricStereo)?2:pelInfo->nChannelsInEl); ch++ ) {
15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrElement->elInfo.ChannelIndex[ch] = pelInfo->ChannelIndex[ch];
15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrElement->hQmfAnalysis[ch] = &hSbrEncoder->QmfAnalysis[totalQmf++];
15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Copy Element info */
15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->elInfo.elType            = pelInfo->elType;
15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->elInfo.instanceTag       = pelInfo->instanceTag;
15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->elInfo.nChannelsInEl     = pelInfo->nChannelsInEl;
15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->elInfo.fParametricStereo = pelInfo->fParametricStereo;
15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* coreEl */
15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project functionname: FDKsbrEnc_EnvInit
15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description:  initializes parameters
15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project returns:      error status
15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input:
15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output:       hEnv
15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT FDKsbrEnc_EnvInit (
15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       HANDLE_SBR_ELEMENT   hSbrElement,
15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       sbrConfigurationPtr params,
15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       INT      *coreBandWith,
15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       AUDIO_OBJECT_TYPE aot,
15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       int       nBitstrDelay,
15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       int       nElement,
1536a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi                       const int headerPeriod,
15373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                       ULONG     statesInitFlag,
15383aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                       int       fTimeDomainDownsampling
15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      ,UCHAR    *dynamic_RAM
15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      )
15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR    *bitstreamBuffer;
15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int ch, i;
15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ((params->codecSettings.nChannels < 1) || (params->codecSettings.nChannels > MAX_NUM_CHANNELS)){
15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* initialize the encoder handle  and structs*/
15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bitstreamBuffer = hSbrElement->payloadDelayLine[nBitstrDelay];
15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* init and set syntax flags */
15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrConfigData.sbrSyntaxFlags = 0;
15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (aot) {
15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AOT_DRM_MPEG_PS:
15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AOT_DRM_SBR:
15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_SCALABLE;
15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_DRM_CRC;
15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC;
15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
15622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AOT_ER_AAC_ELD:
15632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_LOW_DELAY;
15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (params->crcSbr) {
15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC;
15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15723aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  hSbrElement->sbrConfigData.noQmfBands = QMF_CHANNELS>>(2-params->downSampleFactor);
15733aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  switch (hSbrElement->sbrConfigData.noQmfBands)
15743aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  {
15753aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    case 64: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6;
15763aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi             break;
15773aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    case 32: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>5;
15783aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi             break;
15793aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    default: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6;
15803aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi             return(2);
15813aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  }
15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKinitBitStream(&hSbrElement->CmonData.sbrBitbuf, bitstreamBuffer, MAX_PAYLOAD_SIZE*sizeof(UCHAR), 0, BS_WRITER);
15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    now initialize sbrConfigData, sbrHeaderData and sbrBitstreamData,
15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrConfigData.nChannels = params->codecSettings.nChannels;
15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(params->codecSettings.nChannels == 2)
15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     hSbrElement->sbrConfigData.stereoMode = params->stereoMode;
15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else
15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     hSbrElement->sbrConfigData.stereoMode = SBR_MONO;
15942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrConfigData.frameSize   = params->sbrFrameSize;
15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15973aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  hSbrElement->sbrConfigData.sampleFreq = params->downSampleFactor * params->codecSettings.sampleFreq;
15982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrBitstreamData.CountSendHeaderData = 0;
16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (params->SendHeaderDataTime > 0 ) {
16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1602a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi    if (headerPeriod==-1) {
1603a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi
1604a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi      hSbrElement->sbrBitstreamData.NrSendHeaderData = (INT)(params->SendHeaderDataTime * hSbrElement->sbrConfigData.sampleFreq
16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               / (1000 * hSbrElement->sbrConfigData.frameSize));
1606a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi      hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMax(hSbrElement->sbrBitstreamData.NrSendHeaderData,1);
1607a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi    }
1608a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi    else {
1609a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi      /* assure header period at least once per second */
1610a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi      hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMin(fixMax(headerPeriod,1),(hSbrElement->sbrConfigData.sampleFreq/hSbrElement->sbrConfigData.frameSize));
1611a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi    }
16122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   hSbrElement->sbrBitstreamData.NrSendHeaderData = 0;
16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_data_extra = params->sbr_data_extra;
16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrBitstreamData.HeaderActive = 0;
16192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_start_frequency = params->startFreq;
16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_stop_frequency  = params->stopFreq;
16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_xover_band = 0;
16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_lc_stereo_mode = 0;
16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* data_extra */
16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (params->sbr_xpos_ctrl!= SBR_XPOS_CTRL_DEFAULT)
16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     hSbrElement->sbrHeaderData.sbr_data_extra = 1;
16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_amp_res = (AMP_RES)params->amp_res;
16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* header_extra_1 */
16312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.freqScale  = params->freqScale;
16322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.alterScale = params->alterScale;
16332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_noise_bands = params->sbr_noise_bands;
16342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.header_extra_1 = 0;
16352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ((params->freqScale != SBR_FREQ_SCALE_DEFAULT) ||
16372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (params->alterScale != SBR_ALTER_SCALE_DEFAULT) ||
16382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (params->sbr_noise_bands != SBR_NOISE_BANDS_DEFAULT))
16392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
16402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   hSbrElement->sbrHeaderData.header_extra_1 = 1;
16412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* header_extra_2 */
16442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_limiter_bands = params->sbr_limiter_bands;
16452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_limiter_gains = params->sbr_limiter_gains;
16462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ((hSbrElement->sbrConfigData.sampleFreq > 48000) &&
16482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (hSbrElement->sbrHeaderData.sbr_start_frequency >= 9))
16492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
16502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrElement->sbrHeaderData.sbr_limiter_gains = SBR_LIMITER_GAINS_INFINITE;
16512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_interpol_freq = params->sbr_interpol_freq;
16542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.sbr_smoothing_length = params->sbr_smoothing_length;
16552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrHeaderData.header_extra_2 = 0;
16562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ((params->sbr_limiter_bands != SBR_LIMITER_BANDS_DEFAULT) ||
16582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (params->sbr_limiter_gains != SBR_LIMITER_GAINS_DEFAULT) ||
16592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (params->sbr_interpol_freq != SBR_INTERPOL_FREQ_DEFAULT) ||
16602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (params->sbr_smoothing_length != SBR_SMOOTHING_LENGTH_DEFAULT))
16612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
16622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     hSbrElement->sbrHeaderData.header_extra_2 = 1;
16632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* other switches */
16662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrConfigData.useWaveCoding             = params->useWaveCoding;
16672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrConfigData.useParametricCoding       = params->parametricCoding;
16682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* init freq band table */
16702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(updateFreqBandTable(&hSbrElement->sbrConfigData,
16712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         &hSbrElement->sbrHeaderData,
16723aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                         params->downSampleFactor
16733aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                         ))
16742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
16752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
16762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* now create envelope ext and QMF for each available channel */
16792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++ ) {
16802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if ( initEnvChannel(&hSbrElement->sbrConfigData,
16822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         &hSbrElement->sbrHeaderData,
16832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         &hSbrElement->sbrChannel[ch]->hEnvChannel,
16842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          params,
16852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          statesInitFlag
16862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        ,ch
16872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        ,dynamic_RAM
16882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         ) )
16892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     {
16902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       return(1);
16912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
16922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* nChannels */
16952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* reset and intialize analysis qmf */
16972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( ch = 0; ch < ((hSbrElement->elInfo.fParametricStereo)?2:hSbrElement->sbrConfigData.nChannels); ch++ )
16982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
16992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int err;
17002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT qmfFlags = (hSbrElement->sbrConfigData.sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? QMF_FLAG_CLDFB : 0;
17012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (statesInitFlag)
17022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qmfFlags &= ~QMF_FLAG_KEEP_STATES;
17032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
17042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qmfFlags |=  QMF_FLAG_KEEP_STATES;
17052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    err = qmfInitAnalysisFilterBank( hSbrElement->hQmfAnalysis[ch],
17072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     (FIXP_QAS*)hSbrElement->hQmfAnalysis[ch]->FilterStates,
17082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hSbrElement->sbrConfigData.noQmfSlots,
17092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hSbrElement->sbrConfigData.noQmfBands,
17102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hSbrElement->sbrConfigData.noQmfBands,
17112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hSbrElement->sbrConfigData.noQmfBands,
17122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     qmfFlags );
17133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if (0!=err) {
17143aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      return err;
17153aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    }
17162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
17172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*  */
17192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->CmonData.xOverFreq = hSbrElement->sbrConfigData.xOverFreq;
17202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->CmonData.dynBwEnabled = (params->dynBwSupported && params->dynBwEnabled);
17212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->CmonData.dynXOverFreqEnc = FDKsbrEnc_SbrGetXOverFreq( hSbrElement, hSbrElement->CmonData.xOverFreq);
17222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( i = 0; i < 5; i++ )
17232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrElement->dynXOverFreqDelay[i] = hSbrElement->CmonData.dynXOverFreqEnc;
17242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->CmonData.sbrNumChannels  = hSbrElement->sbrConfigData.nChannels;
17252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hSbrElement->sbrConfigData.dynXOverFreq = hSbrElement->CmonData.xOverFreq;
17262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Update Bandwith to be passed to the core encoder */
17282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *coreBandWith = hSbrElement->CmonData.xOverFreq;
17292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return(0);
17312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project }
17322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17332228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT sbrEncoder_GetInBufferSize(int noChannels)
17342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
17352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT temp;
17362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  temp = (2048);
17382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  temp += 1024 + MAX_SAMPLE_DELAY;
17392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  temp *= noChannels;
17402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  temp *= sizeof(INT_PCM);
17412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return temp;
17422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
17432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
17452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Encode Dummy SBR payload frames to fill the delay lines.
17462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
17472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
17482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT FDKsbrEnc_DelayCompensation (
17492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  HANDLE_SBR_ENCODER hEnvEnc,
17502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  INT_PCM *timeBuffer
17512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 )
17522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
17532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int n, el;
17542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (n=hEnvEnc->nBitstrDelay; n>0; n--)
17562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
17572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (el=0; el<hEnvEnc->noElements; el++)
17582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
17592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (FDKsbrEnc_EnvEncodeFrame(
17602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hEnvEnc,
17612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     el,
17622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     timeBuffer + hEnvEnc->downsampledOffset,
17632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hEnvEnc->sbrElement[el]->sbrConfigData.nChannels,
17642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     NULL,
17652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     NULL,
17662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     1
17672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    ))
17682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return -1;
17692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
17703aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer);
17712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
17722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project	  return 0;
17732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
17742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, UINT coreSampleRate, AUDIO_OBJECT_TYPE aot)
17762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
17772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT newBitRate;
17782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT index;
17792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_ASSERT(numChannels > 0 && numChannels <= 2);
17812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (aot == AOT_PS) {
17822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (numChannels == 2) {
17832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      index = getPsTuningTableIndex(bitRate, &newBitRate);
17842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (index == INVALID_TABLE_IDX) {
17852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitRate = newBitRate;
17862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
17872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Set numChannels to 1 because for PS we need a SBR SCE (mono) element. */
17882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numChannels = 1;
17892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
17902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return 0;
17912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
17922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
17932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  index = getSbrTuningTableIndex(bitRate, numChannels, coreSampleRate, aot, &newBitRate);
17942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (index != INVALID_TABLE_IDX) {
17952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    newBitRate = bitRate;
17962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
17972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return newBitRate;
17992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
18002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18013aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel TriviUINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot)
18023aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi{
18033aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  UINT isPossible=(AOT_PS==aot)?0:1;
18043aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  return isPossible;
18053aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi}
18062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18072228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT sbrEncoder_Init(
18083aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        HANDLE_SBR_ENCODER   hSbrEncoder,
1809fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi        SBR_ELEMENT_INFO     elInfo[(8)],
18103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        int                  noElements,
18113aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        INT_PCM             *inputBuffer,
18123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        INT                 *coreBandwidth,
18133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        INT                 *inputBufferOffset,
18143aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        INT                 *numChannels,
18153aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        INT                 *coreSampleRate,
18163aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        UINT                *downSampleFactor,
18173aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        INT                 *frameLength,
18183aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        AUDIO_OBJECT_TYPE    aot,
18193aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        int                 *delay,
18203aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        int                  transformFactor,
18213aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        const int            headerPeriod,
18223aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        ULONG                statesInitFlag
18233aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        )
18242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
18252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_ERROR_INFO errorInfo = noError;
1826fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi    sbrConfiguration sbrConfig[(8)];
18272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT error = 0;
18282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT lowestBandwidth;
18292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Save input parameters */
18303aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    INT inputSampleRate = *coreSampleRate;
18312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int coreFrameLength = *frameLength;
18322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int inputBandWidth = *coreBandwidth;
18332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int inputChannels = *numChannels;
18342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int downsampledOffset = 0;
18362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int sbrOffset = 0;
18372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int downsamplerDelay = 0;
18383aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    int timeDomainDownsample = 0;
18392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int nBitstrDelay = 0;
18403aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    int highestSbrStartFreq, highestSbrStopFreq;
18412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int lowDelay = 0;
18422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int usePs = 0;
18432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* check whether SBR setting is available for the current encoder configuration (bitrate, samplerate) */
18453aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if (!sbrEncoder_IsSingleRatePossible(aot)) {
18463aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      *downSampleFactor = 2;
18473aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    }
18483aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
18493aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
18503aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
18513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if ( (aot==AOT_PS) || (aot==AOT_MP2_PS) || (aot==AOT_DABPLUS_PS) || (aot==AOT_DRM_MPEG_PS) ) {
18522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        usePs = 1;
18532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
18543aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if ( (aot==AOT_ER_AAC_ELD) ) {
18552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        lowDelay = 1;
18562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
18573aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    else if ( (aot==AOT_ER_AAC_LD) ) {
18582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error = 1;
18592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
18602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
18612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Parametric Stereo */
18632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( usePs ) {
18642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( *numChannels == 2 && noElements == 1) {
18652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Override Element type in case of Parametric stereo */
18662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        elInfo[0].elType = ID_SCE;
18672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        elInfo[0].fParametricStereo = 1;
18682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        elInfo[0].nChannelsInEl = 1;
18692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* core encoder gets downmixed mono signal */
18702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *numChannels  = 1;
18712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
18723aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        error = 1;
18733aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        goto bail;
18742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
18752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* usePs */
18762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18773aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    /* set the core's sample rate */
18783aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    switch (*downSampleFactor) {
18793aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    case 1:
18803aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      *coreSampleRate = inputSampleRate;
18813aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      break;
18823aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    case 2:
18833aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      *coreSampleRate = inputSampleRate>>1;
18843aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      break;
18853aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    default:
18863aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      *coreSampleRate = inputSampleRate>>1;
18873aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      return 0; /* return error */
18883aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    }
18893aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
18903aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    /* check whether SBR setting is available for the current encoder configuration (bitrate, coreSampleRate) */
18912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
18922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int delayDiff = 0;
18932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int el, coreEl;
18942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Check if every element config is feasible */
18962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (coreEl=0; coreEl<noElements; coreEl++)
18972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
18982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* SBR only handles SCE and CPE's */
18992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (elInfo[coreEl].elType != ID_SCE && elInfo[coreEl].elType != ID_CPE) {
19002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          continue;
19012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* check if desired configuration is available */
19033aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        if ( !FDKsbrEnc_IsSbrSettingAvail (elInfo[coreEl].bitRate, 0, elInfo[coreEl].nChannelsInEl, inputSampleRate, *coreSampleRate, aot) )
19042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
19052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            error = 1;
19062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
19072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
19092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Determine Delay balancing and new encoder delay */
19112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (lowDelay) {
19123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        {
19133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        delayDiff = (*delay * *downSampleFactor) + DELAY_ELD2SBR(coreFrameLength,*downSampleFactor);
19143aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        *delay = DELAY_ELDSBR(coreFrameLength,*downSampleFactor);
19153aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        }
19162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
19172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else if (usePs) {
19183aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        delayDiff = (*delay * *downSampleFactor) + DELAY_AAC2PS(coreFrameLength,*downSampleFactor);
19193aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        *delay = DELAY_PS(coreFrameLength,*downSampleFactor);
19202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
19212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
19223aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        delayDiff = DELAY_AAC2SBR(coreFrameLength,*downSampleFactor);
19233aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        delayDiff += (*delay * *downSampleFactor);
19243aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        *delay = DELAY_SBR(coreFrameLength,*downSampleFactor);
19253aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      }
19263aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
19273aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      if (!usePs) {
19283aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          timeDomainDownsample = *downSampleFactor-1;  /* activate time domain downsampler when downSampleFactor is != 1 */
19292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
19302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19313aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
19322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Take care about downsampled data bound to the SBR path */
19333aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      if (!timeDomainDownsample && delayDiff > 0) {
19342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*
19352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         * We must tweak the balancing into a situation where the downsampled path
19362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         * is the one to be delayed, because delaying the QMF domain input, also delays
19372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         * the downsampled audio, counteracting to the purpose of delay balancing.
19382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         */
19392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        while ( delayDiff > 0 )
19402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
19412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Encoder delay increases */
19423aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          {
19433aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            *delay += coreFrameLength * *downSampleFactor;
19443aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            /* Add one frame delay to SBR path */
19453aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            delayDiff -= coreFrameLength * *downSampleFactor;
19463aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          }
19472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          nBitstrDelay += 1;
19482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19493aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      } else
19503aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      {
19512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *delay += fixp_abs(delayDiff);
19522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
19532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (delayDiff < 0) {
19552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Delay AAC data */
19562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        delayDiff = -delayDiff;
19572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Multiply downsampled offset by AAC core channels. Divide by 2 because of half samplerate of downsampled data. */
19583aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        FDK_ASSERT(*downSampleFactor>0 && *downSampleFactor<=2);
19593aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        downsampledOffset = (delayDiff*(*numChannels))>>(*downSampleFactor-1);
19602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrOffset = 0;
19612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
19622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Delay SBR input */
19633aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        if ( delayDiff > (int)coreFrameLength * (int)*downSampleFactor )
19642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
19652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Do bitstream frame-wise delay balancing if we have more than SBR framelength samples delay difference */
19663aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          delayDiff -= coreFrameLength * *downSampleFactor;
19672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          nBitstrDelay = 1;
19682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Multiply input offset by input channels */
19702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrOffset = delayDiff*(*numChannels);
19712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        downsampledOffset = 0;
19722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
19733aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      hSbrEncoder->nBitstrDelay            = nBitstrDelay;
19743aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      hSbrEncoder->nChannels               = *numChannels;
19753aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      hSbrEncoder->frameSize               = coreFrameLength * *downSampleFactor;
19763aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      hSbrEncoder->fTimeDomainDownsampling = timeDomainDownsample;
19773aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      hSbrEncoder->downSampleFactor        = *downSampleFactor;
19783aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      hSbrEncoder->estimateBitrate         = 0;
19793aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      hSbrEncoder->inputDataDelay          = 0;
19802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Open SBR elements */
19832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      el = -1;
19843aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      highestSbrStartFreq = highestSbrStopFreq = 0;
19852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      lowestBandwidth = 99999;
19862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Loop through each core encoder element and get a matching SBR element config */
19882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (coreEl=0; coreEl<noElements; coreEl++)
19892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
19902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* SBR only handles SCE and CPE's */
19912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) {
19922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          el++;
19932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } else {
19942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          continue;
19952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Set parametric Stereo Flag. */
19982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (usePs) {
19992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          elInfo[coreEl].fParametricStereo = 1;
20002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } else {
20012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          elInfo[coreEl].fParametricStereo = 0;
20022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
20032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*
20052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         * Init sbrConfig structure
20062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         */
20073aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        if ( ! FDKsbrEnc_InitializeSbrDefaults ( &sbrConfig[el],
20083aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                                 *downSampleFactor,
20093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                                  coreFrameLength
20103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                                  ) )
20113aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        {
20123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          error = 1;
20133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          goto bail;
20143aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        }
20153aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
20162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*
20172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         * Modify sbrConfig structure according to Element parameters
20182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         */
20193aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        if ( ! FDKsbrEnc_AdjustSbrSettings (&sbrConfig[el],
20203aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             elInfo[coreEl].bitRate,
20213aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             elInfo[coreEl].nChannelsInEl,
20223aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                            *coreSampleRate,
20233aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             inputSampleRate,
20243aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             transformFactor,
20253aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             24000,
20263aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             0,
20273aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             0,     /* useSpeechConfig */
20283aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             0,     /* lcsMode */
20293aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             usePs, /* bParametricStereo */
20303aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                             aot) )
20313aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        {
20323aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          error = 1;
20333aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          goto bail;
20343aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        }
20352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Find common frequency border for all SBR elements */
20373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        highestSbrStartFreq = fixMax(highestSbrStartFreq, sbrConfig[el].startFreq);
20383aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        highestSbrStopFreq = fixMax(highestSbrStopFreq, sbrConfig[el].stopFreq);
20392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* first element loop */
20412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Set element count (can be less than core encoder element count) */
20432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrEncoder->noElements = el+1;
20442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKsbrEnc_Reallocate(hSbrEncoder,
20462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           elInfo,
20472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           noElements);
20482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (el=0; el<hSbrEncoder->noElements; el++) {
20502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int bandwidth = *coreBandwidth;
20522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Use lowest common bandwidth */
20543aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        sbrConfig[el].startFreq = highestSbrStartFreq;
20553aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        sbrConfig[el].stopFreq = highestSbrStopFreq;
20562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* initialize SBR element, and get core bandwidth */
20582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error = FDKsbrEnc_EnvInit(hSbrEncoder->sbrElement[el],
20592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  &sbrConfig[el],
20602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  &bandwidth,
20613aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                   aot,
20622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   nBitstrDelay,
20632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   el,
2064a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi                                   headerPeriod,
20653aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                   statesInitFlag,
20663aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                   hSbrEncoder->fTimeDomainDownsampling
20672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  ,hSbrEncoder->dynamicRam
20682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  );
20692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (error != 0) {
20713aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          error = 2;
20722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          goto bail;
20732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
20742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Get lowest core encoder bandwidth to be returned later. */
20762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        lowestBandwidth = fixMin(lowestBandwidth, bandwidth);
20772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* second element loop */
20792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Initialize a downsampler for each channel in each SBR element */
20812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (hSbrEncoder->fTimeDomainDownsampling)
20822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
20832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (el=0; el<hSbrEncoder->noElements; el++)
20842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
20852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          HANDLE_SBR_ELEMENT hSbrEl = hSbrEncoder->sbrElement[el];
20862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          INT Wc, ch;
20872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Calculated required normalized cutoff frequency (Wc = 1.0 -> lowestBandwidth = inputSampleRate/2) */
20892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          Wc = (2*lowestBandwidth)*1000 / inputSampleRate;
20902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (ch=0; ch<hSbrEl->elInfo.nChannelsInEl; ch++)
20922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
20933aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            FDKaacEnc_InitDownsampler (&hSbrEl->sbrChannel[ch]->downSampler, Wc, *downSampleFactor);
20943aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            FDK_ASSERT (hSbrEl->sbrChannel[ch]->downSampler.delay <=MAX_DS_FILTER_DELAY);
20952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
20962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          downsamplerDelay = hSbrEl->sbrChannel[0]->downSampler.delay;
20982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } /* third element loop */
20992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* lfe */
21013aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        FDKaacEnc_InitDownsampler (&hSbrEncoder->lfeDownSampler, 0, *downSampleFactor);
21022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Add the resampler additional delay to get the final delay and buffer offset values. */
21043aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        if (sbrOffset > 0 || downsampledOffset <= ((downsamplerDelay * (*numChannels))>>(*downSampleFactor-1))) {
21052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sbrOffset += (downsamplerDelay - downsampledOffset) * (*numChannels) ;
21062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          *delay += downsamplerDelay - downsampledOffset;
21072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          downsampledOffset = 0;
21082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } else {
21093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          downsampledOffset -= (downsamplerDelay * (*numChannels))>>(*downSampleFactor-1);
21102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sbrOffset = 0;
21112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
21122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hSbrEncoder->inputDataDelay = downsamplerDelay;
21142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
21152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Assign core encoder Bandwidth */
21172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *coreBandwidth = lowestBandwidth;
21182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Estimate sbr bitrate, 2.5 kBit/s per sbr channel */
21202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrEncoder->estimateBitrate += 2500 * (*numChannels);
21212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* initialize parametric stereo */
21232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (usePs)
21242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
21252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        PSENC_CONFIG psEncConfig;
21262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDK_ASSERT(hSbrEncoder->noElements == 1);
21272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT psTuningTableIdx = getPsTuningTableIndex(elInfo[0].bitRate, NULL);
21282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21293aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        psEncConfig.frameSize           = coreFrameLength; //sbrConfig.sbrFrameSize;
21302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        psEncConfig.qmfFilterMode       = 0;
21312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        psEncConfig.sbrPsDelay          = 0;
21322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* tuning parameters */
21342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (psTuningTableIdx  != INVALID_TABLE_IDX) {
21352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          psEncConfig.nStereoBands           = psTuningTable[psTuningTableIdx].nStereoBands;
21362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          psEncConfig.maxEnvelopes           = psTuningTable[psTuningTableIdx].nEnvelopes;
21372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          psEncConfig.iidQuantErrorThreshold = (FIXP_DBL)psTuningTable[psTuningTableIdx].iidQuantErrorThreshold;
21382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* calculation is not quite linear, increased number of envelopes causes more bits */
21402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* assume avg. 50 bits per frame for 10 stereo bands / 1 envelope configuration */
21413aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          hSbrEncoder->estimateBitrate += ( (((*coreSampleRate) * 5 * psEncConfig.nStereoBands * psEncConfig.maxEnvelopes) / hSbrEncoder->frameSize));
21422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } else {
21442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          error = ERROR(CDI, "Invalid ps tuning table index.");
21452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          goto bail;
21462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
21472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        qmfInitSynthesisFilterBank(&hSbrEncoder->qmfSynthesisPS,
21492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    (FIXP_DBL*)hSbrEncoder->qmfSynthesisPS.FilterStates,
21502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots,
21512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1,
21522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1,
21532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1,
21542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    (statesInitFlag) ? 0 : QMF_FLAG_KEEP_STATES);
21552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if(errorInfo == noError){
21572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* update delay */
21582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          psEncConfig.sbrPsDelay = FDKsbrEnc_GetEnvEstDelay(&hSbrEncoder->sbrElement[0]->sbrChannel[0]->hEnvChannel.sbrExtractEnvelope);
21592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if(noError != (errorInfo = PSEnc_Init( hSbrEncoder->hParametricStereo,
21612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                &psEncConfig,
21622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots,
21632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands
21642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                ,hSbrEncoder->dynamicRam
21652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                 )))
21662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
21672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            errorInfo = handBack(errorInfo);
21682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
21692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
21703aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
21713aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        /* QMF analysis + Hybrid analysis + Hybrid synthesis + QMF synthesis + downsampled input buffer delay */
21723aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        hSbrEncoder->inputDataDelay = (64*10/2) + (6*64) +  (0) + (64*10/2-64+1) + ((*downSampleFactor)*downsampledOffset);
21732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
21742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrEncoder->downsampledOffset = downsampledOffset;
21763aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      {
21773aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        hSbrEncoder->downmixSize = coreFrameLength*(*numChannels);
21783aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      }
21793aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
21802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrEncoder->bufferOffset = sbrOffset;
21812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Delay Compensation: fill bitstream delay buffer with zero input signal */
21822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( hSbrEncoder->nBitstrDelay > 0 )
21832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
21842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error = FDKsbrEnc_DelayCompensation (hSbrEncoder, inputBuffer);
21852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (error != 0)
21862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          goto bail;
21872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
21882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Set Output frame length */
21903aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      *frameLength = coreFrameLength * *downSampleFactor;
21912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Input buffer offset */
21922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *inputBufferOffset = fixMax(sbrOffset, downsampledOffset);
21932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return error;
21982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
22002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Restore input settings */
22013aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    *coreSampleRate = inputSampleRate;
22022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *frameLength = coreFrameLength;
22032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *numChannels = inputChannels;
22042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *coreBandwidth = inputBandWidth;
22052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return error;
22072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project }
22082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22102228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT
22112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsbrEncoder_EncodeFrame(  HANDLE_SBR_ENCODER   hSbrEncoder,
22122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         INT_PCM             *samples,
22132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         UINT                 timeInStride,
2214fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                         UINT                 sbrDataBits[(8)],
2215fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                         UCHAR                sbrData[(8)][MAX_PAYLOAD_SIZE]
22162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        )
22172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
22182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT error;
22192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int el;
22202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (el=0; el<hSbrEncoder->noElements; el++)
22222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
22232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hSbrEncoder->sbrElement[el] != NULL)
22242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
22252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      error = FDKsbrEnc_EnvEncodeFrame(
22262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        hSbrEncoder,
22272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        el,
22282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        samples + hSbrEncoder->downsampledOffset,
22292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        timeInStride,
22302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       &sbrDataBits[el],
22312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        sbrData[el],
22322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        0
22332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       );
22342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (error)
22352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return error;
22362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
22372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
22382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22393aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  if ( ( hSbrEncoder->lfeChIdx!=-1) && (hSbrEncoder->downSampleFactor > 1) )
22403aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  {   /* lfe downsampler */
22412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT nOutSamples;
22422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKaacEnc_Downsample(&hSbrEncoder->lfeDownSampler,
22442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            samples + hSbrEncoder->downsampledOffset + hSbrEncoder->bufferOffset + hSbrEncoder->lfeChIdx,
22452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hSbrEncoder->frameSize,
22462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            timeInStride,
22472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            samples + hSbrEncoder->downsampledOffset + hSbrEncoder->lfeChIdx,
22482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &nOutSamples,
22492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hSbrEncoder->nChannels);
22503aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
22513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
22523aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi  }
22532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
22552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
22562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22582228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT sbrEncoder_UpdateBuffers(
22592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            HANDLE_SBR_ENCODER hSbrEncoder,
22602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            INT_PCM *timeBuffer
22612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            )
22622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project {
22632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( hSbrEncoder->downsampledOffset > 0 ) {
22642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Move delayed downsampled data */
22652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemcpy ( timeBuffer,
22662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  timeBuffer + hSbrEncoder->downmixSize,
22672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sizeof(INT_PCM) * (hSbrEncoder->downsampledOffset) );
22682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
22692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Move delayed input data */
22702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemcpy ( timeBuffer,
22712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        timeBuffer + hSbrEncoder->nChannels * hSbrEncoder->frameSize,
22722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  sizeof(INT_PCM) * hSbrEncoder->bufferOffset );
22732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
22742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( hSbrEncoder->nBitstrDelay > 0  )
22752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
22762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int el;
22772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (el=0; el<hSbrEncoder->noElements; el++)
22792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
22802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemmove ( hSbrEncoder->sbrElement[el]->payloadDelayLine[0],
22812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     hSbrEncoder->sbrElement[el]->payloadDelayLine[1],
22822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     sizeof(UCHAR) * (hSbrEncoder->nBitstrDelay*MAX_PAYLOAD_SIZE) );
22832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemmove( &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[0],
22852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[1],
22862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sizeof(UINT) * (hSbrEncoder->nBitstrDelay) );
22872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
22882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
22892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
22902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project }
22912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22932228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder)
22942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
22952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT estimateBitrate = 0;
22962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(hSbrEncoder) {
22982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    estimateBitrate += hSbrEncoder->estimateBitrate;
22992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
23002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return estimateBitrate;
23022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
23032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23042228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder)
23052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
23062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT delay = -1;
23072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(hSbrEncoder) {
23092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    delay = hSbrEncoder->inputDataDelay;
23102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
23112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return delay;
23122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
23132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23152228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT sbrEncoder_GetLibInfo( LIB_INFO *info )
23162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
23172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i;
23182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (info == NULL) {
23202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
23212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
23222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* search for next free tab */
23232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0; i < FDK_MODULE_LAST; i++) {
23242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (info[i].module_id == FDK_NONE) break;
23252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
23262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (i == FDK_MODULE_LAST) {
23272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
23282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
23292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info += i;
23302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->module_id = FDK_SBRENC;
23322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->version = LIB_VERSION(SBRENCODER_LIB_VL0, SBRENCODER_LIB_VL1, SBRENCODER_LIB_VL2);
23332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  LIB_VERSION_STRING(info);
23342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->build_date = __DATE__;
23352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->build_time = __TIME__;
23362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->title = "SBR Encoder";
23372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Set flags */
23392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->flags = 0
23402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_SBR_HQ
23412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_SBR_PS_MPEG
23422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ;
23432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* End of flags */
23442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
23452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
23462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2347