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