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/**************************** MPEG-4 HE-AAC Encoder ************************* 852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Initial author: M. Lohwasser 872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project contents/description: FDK HE-AAC Encoder interface library functions 882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacenc_lib.h" 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_audio.h" 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacenc.h" 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacEnc_ram.h" 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_core.h" /* FDK_tools versioning info */ 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Encoder library info */ 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_VL0 3 1004f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi#define AACENCODER_LIB_VL1 4 101fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi#define AACENCODER_LIB_VL2 12 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_TITLE "AAC Encoder" 1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_BUILD_DATE __DATE__ 1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_BUILD_TIME __TIME__ 1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_encoder.h" 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "../src/sbr_ram.h" 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "channel_map.h" 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "psy_const.h" 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "bitenc.h" 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpenc_lib.h" 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "metadata_main.h" 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SBL(fl) (fl/8) /*!< Short block length (hardcoded to 8 short blocks per long block) */ 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define BSLA(fl) (4*SBL(fl)+SBL(fl)/2) /*!< AAC block switching look-ahead */ 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DELAY_AAC(fl) (fl+BSLA(fl)) /*!< MDCT + blockswitching */ 1213aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_AACELD(fl) ((fl)/2) /*!< ELD FB delay (no framing delay included) */ 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define INPUTBUFFER_SIZE (1537+100+2048) 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 125a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi#define DEFAULT_HEADER_PERIOD_REPETITION_RATE 10 /*!< Default header repetition rate used in transport library and for SBR header. */ 126a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//////////////////////////////////////////////////////////////////////////////////// 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/** 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Flags to characterize encoder modules to be supported in present instance. 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectenum { 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ENC_MODE_FLAG_AAC = 0x0001, 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ENC_MODE_FLAG_SBR = 0x0002, 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ENC_MODE_FLAG_PS = 0x0004, 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ENC_MODE_FLAG_SAC = 0x0008, 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ENC_MODE_FLAG_META = 0x0010 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//////////////////////////////////////////////////////////////////////////////////// 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct { 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AUDIO_OBJECT_TYPE userAOT; /*!< Audio Object Type. */ 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT userSamplerate; /*!< Sampling frequency. */ 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT nChannels; /*!< will be set via channelMode. */ 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CHANNEL_MODE userChannelMode; 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT userBitrate; 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT userBitrateMode; 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT userBandwidth; 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT userAfterburner; 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT userFramelength; 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT userAncDataRate; 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userTns; /*!< Use TNS coding. */ 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userPns; /*!< Use PNS coding. */ 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userIntensity; /*!< Use Intensity coding. */ 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project TRANSPORT_TYPE userTpType; /*!< Transport type */ 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userTpSignaling; /*!< Extension AOT signaling mode. */ 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userTpNsubFrames; /*!< Number of sub frames in a transport frame for LOAS/LATM or ADTS (default 1). */ 1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userTpAmxv; /*!< AudioMuxVersion to be used for LATM (default 0). */ 1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userTpProtection; 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userTpHeaderPeriod; /*!< Parameter used to configure LATM/LOAS SMC rate. Moreover this parameters is 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project used to configure repetition rate of PCE in raw_data_block. */ 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userErTools; /*!< Use VCB11, HCR and/or RVLC ER tool. */ 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT userPceAdditions; /*!< Configure additional bits in PCE. */ 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR userMetaDataMode; /*!< Meta data library configuration. */ 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1693aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi UCHAR userSbrEnabled; /*!< Enable SBR for ELD. */ 1703aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi UINT userSbrRatio; /*!< SBR sampling rate ratio. Dual- or single-rate. */ 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} USER_PARAM; 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//////////////////////////////////////////////////////////////////////////////////// 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************** 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Structure Definitions 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct AACENC_CONFIG *HANDLE_AACENC_CONFIG; 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstruct AACENCODER 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USER_PARAM extParam; 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CODER_CONFIG coderConfig; 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* AAC */ 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_CONFIG aacConfig; 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_AAC_ENC hAacEnc; 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* SBR */ 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_ENCODER hEnvEnc; 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Meta Data */ 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_METADATA_ENCODER hMetadataEnc; 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT metaDataAllowed; /* Signal whether chosen configuration allows metadata. Necessary for delay 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project compensation. Metadata mode is a separate parameter. */ 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Transport */ 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_TRANSPORTENC hTpEnc; 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Output */ 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *outBuffer; /* Internal bitstream buffer */ 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT outBufferInBytes; /* Size of internal bitstream buffer*/ 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Input */ 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT_PCM *inputBuffer; /* Internal input buffer. Input source for AAC encoder */ 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT inputBufferOffset; /* Where to write new input samples. */ 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSamplesToRead; /* number of input samples neeeded for encoding one frame */ 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSamplesRead; /* number of input samples already in input buffer */ 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nZerosAppended; /* appended zeros at end of file*/ 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nDelay; /* encoder delay */ 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_EXT_PAYLOAD extPayload [MAX_TOTAL_EXT_PAYLOADS]; 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Extension payload */ 218fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi UCHAR extPayloadData [(1)][(8)][MAX_PAYLOAD_SIZE]; 219fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi UINT extPayloadSize [(1)][(8)]; /* payload sizes in bits */ 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ULONG InitFlags; /* internal status to treggier re-initialization */ 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Memory allocation info. */ 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nMaxAacElements; 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nMaxAacChannels; 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nMaxSbrElements; 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nMaxSbrChannels; 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT nMaxSubFrames; 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT encoder_modis; 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2333aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi /* Capability flags */ 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT CAPF_tpEnc; 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} ; 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2389f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivitypedef struct 2399f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi{ 2409f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi ULONG samplingRate; /*!< Encoder output sampling rate. */ 2419f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi ULONG bitrateRange; /*!< Lower bitrate range for config entry. */ 2429f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2439f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi UCHAR lowDelaySbr; /*!< 0: ELD sbr off, 2449f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 1: ELD sbr on */ 2459f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2469f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi UCHAR downsampledSbr; /*!< 0: ELD with dualrate sbr, 2479f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 1: ELD with downsampled sbr */ 2489f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2499f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi} ELD_SBR_CONFIGURATOR; 2509f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2519f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi/** 2529f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \brief This table defines ELD/SBR default configurations. 2539f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi */ 2549f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivistatic const ELD_SBR_CONFIGURATOR eldSbrAutoConfigTab[] = 2559f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi{ 2569f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 48000, 0, 1, 0 }, 2579f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 48000, 64001, 0, 0 }, 2589f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2599f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 44100, 0, 1, 0 }, 2609f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 44100, 64001, 0, 0 }, 2619f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2629f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 32000, 0, 1, 0 }, 2639f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 32000, 28000, 1, 1 }, 2649f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 32000, 56000, 0, 0 }, 2659f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2669f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 24000, 0, 1, 1 }, 2679f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 24000, 40000, 0, 0 }, 2689f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2699f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 16000, 0, 1, 1 }, 2709f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 16000, 28000, 0, 0 } 2719f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2729f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi}; 2739f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 2749f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi/* 2759f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \brief Configure SBR for ELD configuration. 2769f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * 2779f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * This function finds default SBR configuration for ELD based on sampling rate and channel bitrate. 2789f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * Outputparameters are SBR on/off, and SBR ratio. 2799f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * 2809f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param samplingRate Audio signal sampling rate. 2819f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param channelMode Channel configuration to be used. 2829f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param totalBitrate Overall bitrate. 2839f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param eldSbr Pointer to eldSbr parameter, filled on return. 2849f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param eldSbrRatio Pointer to eldSbrRatio parameter, filled on return. 2859f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * 2869f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \return - AACENC_OK, all fine. 2879f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * - AACENC_INVALID_CONFIG, on failure. 2889f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi */ 2899f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivistatic AACENC_ERROR eldSbrConfigurator( 2909f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi const ULONG samplingRate, 2919f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi const CHANNEL_MODE channelMode, 2929f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi const ULONG totalBitrate, 2939f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi UINT * const eldSbr, 2949f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi UINT * const eldSbrRatio 2959f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi ) 2969f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi{ 2979f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi AACENC_ERROR err = AACENC_OK; 2989f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi int i, cfgIdx = -1; 2999f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi const ULONG channelBitrate = totalBitrate / FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff; 3009f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 3019f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi for (i=0; i<(sizeof(eldSbrAutoConfigTab)/sizeof(ELD_SBR_CONFIGURATOR)); i++) { 3029f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi if ( (samplingRate <= eldSbrAutoConfigTab[i].samplingRate) 3039f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi && (channelBitrate >= eldSbrAutoConfigTab[i].bitrateRange) ) 3049f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 3059f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi cfgIdx = i; 3069f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi } 3079f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi } 3089f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 3099f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi if (cfgIdx != -1) { 3109f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi *eldSbr = (eldSbrAutoConfigTab[cfgIdx].lowDelaySbr==0) ? 0 : 1; 3119f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi *eldSbrRatio = (eldSbrAutoConfigTab[cfgIdx].downsampledSbr==0) ? 2 : 1; 3129f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi } 3139f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi else { 3149f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi err = AACENC_INVALID_CONFIG; /* no default configuration for eld-sbr available. */ 3159f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi } 3169f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 3179f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi return err; 3189f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi} 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig) 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT sbrUsed = 0; 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (hAacConfig->audioObjectType==AOT_SBR) || (hAacConfig->audioObjectType==AOT_PS) 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || (hAacConfig->audioObjectType==AOT_MP2_SBR) || (hAacConfig->audioObjectType==AOT_MP2_PS) 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || (hAacConfig->audioObjectType==AOT_DABPLUS_SBR) || (hAacConfig->audioObjectType==AOT_DABPLUS_PS) 3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || (hAacConfig->audioObjectType==AOT_DRM_SBR) || (hAacConfig->audioObjectType==AOT_DRM_MPEG_PS) ) 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrUsed = 1; 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD && (hAacConfig->syntaxFlags & AC_SBR_PRESENT)) 3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrUsed = 1; 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return ( sbrUsed ); 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3393aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivistatic inline INT isPsActive(const AUDIO_OBJECT_TYPE audioObjectType) 3403aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi{ 3413aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi INT psUsed = 0; 3423aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi 3433aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if ( (audioObjectType==AOT_PS) 3443aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi || (audioObjectType==AOT_MP2_PS) 3453aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi || (audioObjectType==AOT_DABPLUS_PS) 3463aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi || (audioObjectType==AOT_DRM_MPEG_PS) ) 3473aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi { 3483aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi psUsed = 1; 3493aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 3503aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi 3513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi return ( psUsed ); 3523aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi} 353dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 354dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivistatic SBR_PS_SIGNALING getSbrSignalingMode( 355dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi const AUDIO_OBJECT_TYPE audioObjectType, 356dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi const TRANSPORT_TYPE transportType, 357dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi const UCHAR transportSignaling, 358dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi const UINT sbrRatio 359dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi ) 360dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 361dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi{ 362dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi SBR_PS_SIGNALING sbrSignaling; 363dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 364dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if (transportType==TT_UNKNOWN || sbrRatio==0) { 365dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi sbrSignaling = SIG_UNKNOWN; /* Needed parameters have not been set */ 366dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi return sbrSignaling; 367dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } else { 368dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi sbrSignaling = SIG_IMPLICIT; /* default: implicit signaling */ 369dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 370dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 371dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if ((audioObjectType==AOT_AAC_LC) || (audioObjectType==AOT_SBR) || (audioObjectType==AOT_PS) || 372dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi (audioObjectType==AOT_MP2_AAC_LC) || (audioObjectType==AOT_MP2_SBR) || (audioObjectType==AOT_MP2_PS) ) { 373dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi switch (transportType) { 374dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi case TT_MP4_ADIF: 375dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi case TT_MP4_ADTS: 376dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi sbrSignaling = SIG_IMPLICIT; /* For MPEG-2 transport types, only implicit signaling is possible */ 377dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi break; 378dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 379dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi case TT_MP4_RAW: 380dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi case TT_MP4_LATM_MCP1: 381dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi case TT_MP4_LATM_MCP0: 382dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi case TT_MP4_LOAS: 383dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi default: 384dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if ( transportSignaling==0xFF ) { 385dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi /* Defaults */ 386dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if ( sbrRatio==1 ) { 387dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi sbrSignaling = SIG_EXPLICIT_HIERARCHICAL; /* For downsampled SBR, explicit signaling is mandatory */ 388dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } else { 389dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi sbrSignaling = SIG_IMPLICIT; /* For dual-rate SBR, implicit signaling is default */ 390dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 391dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } else { 392dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi /* User set parameters */ 393dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi /* Attention: Backward compatible explicit signaling does only work with AMV1 for LATM/LOAS */ 394dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi sbrSignaling = (SBR_PS_SIGNALING)transportSignaling; 395dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 396dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi break; 397dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 398dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 399dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 400dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi return sbrSignaling; 401dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi} 402dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************** 4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Allocate Encoder 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectH_ALLOC_MEM (_AacEncoder, AACENCODER) 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectC_ALLOC_MEM (_AacEncoder, AACENCODER, 1) 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Map Encoder specific config structures to CODER_CONFIG. 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 416dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivistatic void FDKaacEnc_MapConfig( 417dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi CODER_CONFIG *const cc, 418dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi const USER_PARAM *const extCfg, 419dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi const SBR_PS_SIGNALING sbrSignaling, 420dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi const HANDLE_AACENC_CONFIG hAacConfig 421dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi ) 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AUDIO_OBJECT_TYPE transport_AOT = AOT_NULL_OBJECT; 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(cc, sizeof(CODER_CONFIG)); 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags = 0; 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Map virtual aot to transport aot. */ 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (hAacConfig->audioObjectType) { 4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_AAC_LC: 4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transport_AOT = AOT_AAC_LC; 4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_SBR: 4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transport_AOT = AOT_SBR; 4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= CC_SBR; 4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_PS: 4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transport_AOT = AOT_PS; 4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= CC_SBR; 4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transport_AOT = hAacConfig->audioObjectType; 4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) { 4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= (hAacConfig->syntaxFlags & AC_SBR_PRESENT) ? CC_SBR : 0; 4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* transport type is usually AAC-LC. */ 4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (transport_AOT == AOT_SBR) || (transport_AOT == AOT_PS) ) { 4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->aot = AOT_AAC_LC; 4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->aot = transport_AOT; 4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Configure extension aot. */ 458dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if (sbrSignaling==SIG_IMPLICIT) { 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->extAOT = AOT_NULL_OBJECT; /* implicit */ 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 462dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if ( (sbrSignaling==SIG_EXPLICIT_BW_COMPATIBLE) && ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) ) { 4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->extAOT = AOT_SBR; /* explicit backward compatible */ 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->extAOT = transport_AOT; /* explicit hierarchical */ 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 469dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 470dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) { 471dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi cc->sbrPresent=1; 472dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if (transport_AOT==AOT_PS) { 473dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi cc->psPresent=1; 474dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 475dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 476dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi cc->sbrSignaling = sbrSignaling; 477dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->extSamplingRate = extCfg->userSamplerate; 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->bitRate = hAacConfig->bitRate; 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->noChannels = hAacConfig->nChannels; 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= CC_IS_BASELAYER; 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->channelMode = hAacConfig->channelMode; 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->nSubFrames = (hAacConfig->nSubFrames > 1 && extCfg->userTpNsubFrames == 1) 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ? hAacConfig->nSubFrames 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project : extCfg->userTpNsubFrames; 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= (extCfg->userTpProtection) ? CC_PROTECTION : 0; 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (extCfg->userTpHeaderPeriod!=0xFF) { 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->headerPeriod = extCfg->userTpHeaderPeriod; 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { /* auto-mode */ 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (extCfg->userTpType) { 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case TT_MP4_ADTS: 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case TT_MP4_LOAS: 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case TT_MP4_LATM_MCP1: 498a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi cc->headerPeriod = DEFAULT_HEADER_PERIOD_REPETITION_RATE; 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->headerPeriod = 0; 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->samplesPerFrame = hAacConfig->framelength; 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->samplingRate = hAacConfig->sampleRate; 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Mpeg-4 signaling for transport library. */ 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch ( hAacConfig->audioObjectType ) { 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_AAC_LC: 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_SBR: 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_PS: 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags &= ~CC_MPEG_ID; /* Required for ADTS. */ 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->extAOT = AOT_NULL_OBJECT; 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= CC_MPEG_ID; 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* ER-tools signaling. */ 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= (hAacConfig->syntaxFlags & AC_ER_VCB11) ? CC_VCB11 : 0; 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= (hAacConfig->syntaxFlags & AC_ER_HCR) ? CC_HCR : 0; 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= (hAacConfig->syntaxFlags & AC_ER_RVLC) ? CC_RVLC : 0; 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Matrix mixdown coefficient configuration. */ 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (extCfg->userPceAdditions&0x1) && (hAacConfig->epConfig==-1) 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && ((cc->channelMode==MODE_1_2_2)||(cc->channelMode==MODE_1_2_2_1)) ) 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->matrixMixdownA = ((extCfg->userPceAdditions>>1)&0x3)+1; 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->flags |= (extCfg->userPceAdditions>>3)&0x1 ? CC_PSEUDO_SURROUND : 0; 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cc->matrixMixdownA = 0; 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Examine buffer descriptor regarding choosen identifier. 5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * 5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param pBufDesc Pointer to buffer descriptor 5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param identifier Buffer identifier to look for. 5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return - Buffer descriptor index. 5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * -1, if there is no entry available. 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT getBufDescIdx( 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AACENC_BufDesc *pBufDesc, 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AACENC_BufferIdentifier identifier 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project) 5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i, idx = -1; 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<pBufDesc->numBufs; i++) { 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (AACENC_BufferIdentifier)pBufDesc->bufferIdentifiers[i] == identifier ) { 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project idx = i; 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return idx; 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************** 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Function Declarations 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/ 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR aacEncDefaultConfig(HANDLE_AACENC_CONFIG hAacConfig, 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USER_PARAM *config) 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* make reasonable default settings */ 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKaacEnc_AacInitDefaultConfig (hAacConfig); 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 573dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi /* clear configuration structure and copy default settings */ 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(config, sizeof(USER_PARAM)); 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* copy encoder configuration settings */ 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->nChannels = hAacConfig->nChannels; 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userAOT = hAacConfig->audioObjectType = AOT_AAC_LC; 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userSamplerate = hAacConfig->sampleRate; 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userChannelMode = hAacConfig->channelMode; 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userBitrate = hAacConfig->bitRate; 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userBitrateMode = hAacConfig->bitrateMode; 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userBandwidth = hAacConfig->bandWidth; 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userTns = hAacConfig->useTns; 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userPns = hAacConfig->usePns; 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userIntensity = hAacConfig->useIS; 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userAfterburner = hAacConfig->useRequant; 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userFramelength = (UINT)-1; 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacConfig->syntaxFlags & AC_ER_VCB11) { 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userErTools |= 0x01; 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacConfig->syntaxFlags & AC_ER_HCR) { 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userErTools |= 0x02; 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* initialize transport parameters */ 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userTpType = TT_UNKNOWN; 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userTpAmxv = 0; 600dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi config->userTpSignaling = 0xFF; /* choose signaling automatically */ 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userTpNsubFrames = 1; 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userTpProtection = 0; /* not crc protected*/ 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userTpHeaderPeriod = 0xFF; /* header period in auto mode */ 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userPceAdditions = 0; /* no matrix mixdown coefficient */ 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userMetaDataMode = 0; /* do not embed any meta data info */ 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userAncDataRate = 0; 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi /* SBR rate is set to 0 here, which means it should be set automatically 6103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi in FDKaacEnc_AdjustEncSettings() if the user did not set a rate 6113aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi expilicitely. */ 6123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi config->userSbrRatio = 0; 6133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi 6143aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi /* SBR enable set to -1 means to inquire ELD audio configurator for reasonable configuration. */ 6153aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi config->userSbrEnabled = -1; 6163aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_ENC_OK; 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid aacEncDistributeSbrBits(CHANNEL_MAPPING *channelMapping, SBR_ELEMENT_INFO *sbrElInfo, INT bitRate) 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT codebits = bitRate; 6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int el; 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Copy Element info */ 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (el=0; el<channelMapping->nElements; el++) { 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrElInfo[el].ChannelIndex[0] = channelMapping->elInfo[el].ChannelIndex[0]; 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrElInfo[el].ChannelIndex[1] = channelMapping->elInfo[el].ChannelIndex[1]; 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrElInfo[el].elType = channelMapping->elInfo[el].elType; 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrElInfo[el].bitRate = (INT)(fMultNorm(channelMapping->elInfo[el].relativeBits, (FIXP_DBL)bitRate)); 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrElInfo[el].instanceTag = channelMapping->elInfo[el].instanceTag; 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrElInfo[el].nChannelsInEl = channelMapping->elInfo[el].nChannelsInEl; 6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codebits -= sbrElInfo[el].bitRate; 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrElInfo[0].bitRate += codebits; 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT aacEncoder_LimitBitrate( 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const HANDLE_TRANSPORTENC hTpEnc, 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT samplingRate, 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT frameLength, 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT nChannels, 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const CHANNEL_MODE channelMode, 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitRate, 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT nSubFrames, 6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT sbrActive, 6513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi const INT sbrDownSampleRate, 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AUDIO_OBJECT_TYPE aot 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT coreSamplingRate; 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CHANNEL_MAPPING cm; 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKaacEnc_InitChannelMapping(channelMode, CH_ORDER_MPEG, &cm); 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sbrActive) { 6613aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi coreSamplingRate = samplingRate >> (sbrEncoder_IsSingleRatePossible(aot) ? (sbrDownSampleRate-1):1); 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project coreSamplingRate = samplingRate; 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Consider bandwidth channel bit rate limit (see bandwidth.cpp: GetBandwidthEntry()) */ 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) { 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitRate = FDKmin(360000*nChannels, bitRate); 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitRate = FDKmax(8000*nChannels, bitRate); 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) { 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitRate = FDKmin(576000*nChannels, bitRate); 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*bitRate = FDKmax(0*nChannels, bitRate);*/ 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 676577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Limit bit rate in respect to the core coder */ 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitRate = FDKaacEnc_LimitBitrate( 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hTpEnc, 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project coreSamplingRate, 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frameLength, 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nChannels, 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cm.nChannelsEff, 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitRate, 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -1, 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project NULL, 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -1, 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSubFrames 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Limit bit rate in respect to available SBR modes if active */ 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sbrActive) 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 6953c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi int numIterations = 0; 6963c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi INT initialBitrate, adjustedBitrate; 6973c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi initialBitrate = adjustedBitrate = bitRate; 6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6993c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi /* Find total bitrate which provides valid configuration for each SBR element. */ 7003c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi do { 7013c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi int e; 702fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi SBR_ELEMENT_INFO sbrElInfo[(8)]; 703fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi FDK_ASSERT(cm.nElements <= (8)); 7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7053c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi initialBitrate = adjustedBitrate; 7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7073c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi /* Get bit rate for each SBR element */ 7083c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi aacEncDistributeSbrBits(&cm, sbrElInfo, initialBitrate); 7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7103c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi for (e=0; e<cm.nElements; e++) 7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 7123c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi INT sbrElementBitRateIn, sbrBitRateOut; 7133c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 7143c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi if (cm.elInfo[e].elType != ID_SCE && cm.elInfo[e].elType != ID_CPE) { 7153c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi continue; 7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7173c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi sbrElementBitRateIn = sbrElInfo[e].bitRate; 7183c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi sbrBitRateOut = sbrEncoder_LimitBitRate(sbrElementBitRateIn , cm.elInfo[e].nChannelsInEl, coreSamplingRate, aot); 7193c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi if (sbrBitRateOut == 0) { 7203c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi return 0; 7213c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi } 7223c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 7233c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi /* If bitrates don't match, distribution and limiting needs to be determined again. 7243c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi Abort element loop and restart with adapted bitrate. */ 7253c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi if (sbrElementBitRateIn != sbrBitRateOut) { 7263c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 7273c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi if (sbrElementBitRateIn < sbrBitRateOut) { 7283c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi adjustedBitrate = fMax(initialBitrate, (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut+8), cm.elInfo[e].relativeBits)); 7293c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi break; 7303c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi } 7313c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 7323c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi if (sbrElementBitRateIn > sbrBitRateOut) { 7333c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi adjustedBitrate = fMin(initialBitrate, (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut-8), cm.elInfo[e].relativeBits)); 7343c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi break; 7353c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi } 7363c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 7373c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi } /* sbrElementBitRateIn != sbrBitRateOut */ 7383c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 7393c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi } /* elements */ 7403c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 7413c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi numIterations++; /* restrict iteration to worst case of num elements */ 7423c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 7433c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi } while ( (initialBitrate!=adjustedBitrate) && (numIterations<=cm.nElements) ); 7443c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 7453c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi /* Unequal bitrates mean that no reasonable bitrate configuration found. */ 7463c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi bitRate = (initialBitrate==adjustedBitrate) ? adjustedBitrate : 0; 7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(bitRate > 0); 7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return bitRate; 7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* 7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief Consistency check of given USER_PARAM struct and 7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * copy back configuration from public struct into internal 7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * encoder configuration struct. 7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * 7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \hAacEncoder Internal encoder config which is to be updated 7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param config User provided config (public struct) 7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return �returns always AAC_ENC_OK 7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, 7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USER_PARAM *config) 7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_ERROR err = AACENC_OK; 7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Get struct pointers. */ 7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_AACENC_CONFIG hAacConfig = &hAacEncoder->aacConfig; 7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->nChannels = config->nChannels; 7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Encoder settings update. */ 7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->sampleRate = config->userSamplerate; 7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->useTns = config->userTns; 7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->usePns = config->userPns; 7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->useIS = config->userIntensity; 7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->bitRate = config->userBitrate; 7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->channelMode = config->userChannelMode; 7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->bitrateMode = config->userBitrateMode; 7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->bandWidth = config->userBandwidth; 7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->useRequant = config->userAfterburner; 7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->audioObjectType = config->userAOT; 7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->anc_Rate = config->userAncDataRate; 7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->syntaxFlags = 0; 7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->epConfig = -1; 7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Adapt internal AOT when necessary. */ 7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch ( hAacConfig->audioObjectType ) { 7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_AAC_LC: 7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_SBR: 7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_PS: 7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->usePns = 0; 7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_AAC_LC: 7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_SBR: 7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_PS: 7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_ADTS; 8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 1024; 801577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi if (hAacConfig->framelength != 1024) { 8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INVALID_CONFIG; 8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_LD: 8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->epConfig = 0; 8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->syntaxFlags |= AC_ER|AC_LD; 8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0); 8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0); 8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0); 8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS; 8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512; 8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) { 8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INVALID_CONFIG; 8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_ELD: 8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->epConfig = 0; 8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->syntaxFlags |= AC_ER|AC_ELD; 8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0); 8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0); 8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0); 823dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi hAacConfig->syntaxFlags |= ((config->userSbrEnabled==1) ? AC_SBR_PRESENT : 0); 8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS; 8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512; 8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) { 8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INVALID_CONFIG; 8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch ( hAacConfig->audioObjectType ) { 8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_LD: 8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_ELD: 8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (config->userBitrateMode==8) { 8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->bitrateMode = 0; 8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (config->userBitrateMode==0) { 8417ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi hAacConfig->bitreservoir = 100*config->nChannels; /* default, reduced bitreservoir */ 8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacConfig->bitrateMode!=0) { 8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INVALID_CONFIG; 8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->bitRate = config->userBitrate; 8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get bitrate in VBR configuration */ 8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5) ) { 8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode. */ 8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->bitRate = FDKaacEnc_GetVBRBitrate(hAacConfig->bitrateMode, hAacConfig->channelMode); 8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Set default bitrate if no external bitrate declared. */ 8623aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if ( (hAacConfig->bitrateMode==0) && (config->userBitrate==(UINT)-1) ) { 8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitrate = FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff * hAacConfig->sampleRate; 8643aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi 8653aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if ( isPsActive(hAacConfig->audioObjectType) ) { 8663aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->bitRate = (bitrate>>1); /* 0.5 bit per sample */ 8673aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 8683aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi else if ( isSbrActive(hAacConfig) ) 8693aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi { 8703aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if ( (config->userSbrRatio==2) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType!=AOT_ER_AAC_ELD)) ) { 8713aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->bitRate = (bitrate + (bitrate>>2))>>1; /* 0.625 bits per sample */ 8723aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 8733aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if ( (config->userSbrRatio==1) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType==AOT_ER_AAC_ELD)) ) { 8743aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->bitRate = (bitrate + (bitrate>>3)); /* 1.125 bits per sample */ 8753aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 8763aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } else 8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->bitRate = bitrate + (bitrate>>1); /* 1.5 bits per sample */ 8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8823aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi /* Initialize SBR parameters */ 8839f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi if ( (hAacConfig->audioObjectType==AOT_ER_AAC_ELD) 8849f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi && (config->userSbrEnabled == (UCHAR)-1) && (config->userSbrRatio==0) ) 8859f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 8869f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi UINT eldSbr = 0; 8879f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi UINT eldSbrRatio = 0; 8889f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 8899f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi if ( AACENC_OK!=(err=eldSbrConfigurator( 8909f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi hAacConfig->sampleRate, 8919f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi hAacConfig->channelMode, 8929f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi hAacConfig->bitRate, 8939f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi &eldSbr, 8949f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi &eldSbrRatio)) ) 8959f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi { 8969f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi return err; 8979f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi } 8989f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi 8999f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi hAacConfig->syntaxFlags |= ((eldSbr) ? AC_SBR_PRESENT : 0); 9009f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi hAacConfig->sbrRatio = eldSbrRatio; 9019f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi } 9029f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi else 9033aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if ( (config->userSbrRatio==0) && (isSbrActive(hAacConfig)) ) { 9043aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi /* Automatic SBR ratio configuration 9053aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi * - downsampled SBR for ELD 9063aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi * - otherwise always dualrate SBR 9073aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi */ 9083aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->sbrRatio = (hAacConfig->audioObjectType==AOT_ER_AAC_ELD) ? 1 : 2; 9093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 9103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi else { 9113aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi /* SBR ratio has been set by the user, so use it. */ 9123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->sbrRatio = config->userSbrRatio; 9133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 914dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 915dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi { 916dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi UCHAR tpSignaling=getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio); 917dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 918dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) && 919dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi (config->userTpType==TT_MP4_LATM_MCP1 || config->userTpType==TT_MP4_LATM_MCP0 || config->userTpType==TT_MP4_LOAS) && 920dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi (tpSignaling==1) && (config->userTpAmxv==0) ) { 921dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi /* For backward compatible explicit signaling, AMV1 has to be active */ 922dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi return AACENC_INVALID_CONFIG; 923dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 924dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 925dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) && 926dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi (tpSignaling==0) && (hAacConfig->sbrRatio==1)) { 927dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi /* Downsampled SBR has to be signaled explicitely (for transmission of SBR sampling fequency) */ 928dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi return AACENC_INVALID_CONFIG; 929dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 930dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi } 931dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 932dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 933dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi 9343aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi /* We need the frame length to call aacEncoder_LimitBitrate() */ 9353aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->bitRate = aacEncoder_LimitBitrate( 9363aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi NULL, 9373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->sampleRate, 9383aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->framelength, 9393aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->nChannels, 9403aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->channelMode, 9413aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->bitRate, 9423aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->nSubFrames, 9433aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi isSbrActive(hAacConfig), 9443aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->sbrRatio, 9453aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->audioObjectType 9463aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi ); 9473aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi 9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Configure PNS */ 9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( ((hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5)) /* VBR without PNS. */ 9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || (hAacConfig->useTns == 0) ) /* TNS required. */ 9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->usePns = 0; 9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9553aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if (hAacConfig->epConfig >= 0) { 9563aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->syntaxFlags |= AC_ER; 9573aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) { 9583aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi return AACENC_INVALID_CONFIG; /* Cannel config 0 not supported. */ 9593aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 9603aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 9613aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi 9623aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if ( FDKaacEnc_DetermineEncoderMode(&hAacConfig->channelMode, hAacConfig->nChannels) != AAC_ENC_OK) { 9633aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi return AACENC_INVALID_CONFIG; /* nChannels doesn't match chMode, this is just a check-up */ 9643aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 9653aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi 9663aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if ( (hAacConfig->nChannels > hAacEncoder->nMaxAacChannels) 9673aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi || ( (FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff > hAacEncoder->nMaxSbrChannels) && 9683aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi isSbrActive(hAacConfig) ) 9693aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi ) 9703aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi { 9713aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi return AACENC_INVALID_CONFIG; /* not enough channels allocated */ 9723aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 9733aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi 9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Meta data restriction. */ 9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (hAacConfig->audioObjectType) 9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Allow metadata support */ 9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_AAC_LC: 9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_SBR: 98016c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi case AOT_PS: 9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->metaDataAllowed = 1; 9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) { 9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userMetaDataMode = 0; 9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Prohibit metadata support */ 9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->metaDataAllowed = 0; 9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return err; 9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT aacenc_SbrCallback( 9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project void * self, 9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT sampleRateIn, 9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT sampleRateOut, 10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT samplesPerFrame, 10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AUDIO_OBJECT_TYPE coreCodec, 10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const MP4_ELEMENT_ID elementID, 10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT elementIndex 10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self; 10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrEncoder_GetHeader(hAacEncoder->hEnvEnc, hBs, elementIndex, 0); 10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, 10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ULONG InitFlags, 10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USER_PARAM *config) 10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_ERROR err = AACENC_OK; 10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT aacBufferOffset = 0; 10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_ENCODER *hSbrEncoder = &hAacEncoder->hEnvEnc; 10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_AACENC_CONFIG hAacConfig = &hAacEncoder->aacConfig; 10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nZerosAppended = 0; /* count appended zeros */ 10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT frameLength = hAacConfig->framelength; 10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (InitFlags & AACENC_INIT_CONFIG) ) 10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CHANNEL_MODE prevChMode = hAacConfig->channelMode; 10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Verify settings and update: config -> heAacEncoder */ 10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (err=FDKaacEnc_AdjustEncSettings(hAacEncoder, config)) != AACENC_OK ) { 10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return err; 10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frameLength = hAacConfig->framelength; /* adapt temporal framelength */ 10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Seamless channel reconfiguration in sbr not fully implemented */ 10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (prevChMode!=hAacConfig->channelMode) && isSbrActive(hAacConfig) ) { 10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project InitFlags |= AACENC_INIT_STATES; 10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Clear input buffer */ 10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (InitFlags == AACENC_INIT_ALL) ) { 10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hAacEncoder->inputBuffer, sizeof(INT_PCM)*hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE); 10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (InitFlags & AACENC_INIT_CONFIG) ) 10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacBufferOffset = 0; 10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) { 10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nDelay = DELAY_AACELD(hAacConfig->framelength); 10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else 10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nDelay = DELAY_AAC(hAacConfig->framelength); /* AAC encoder delay */ 10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->ancDataBitRate = 0; 10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( isSbrActive(hAacConfig) && 10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES)) ) 10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT sbrError; 1064fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi SBR_ELEMENT_INFO sbrElInfo[(8)]; 10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CHANNEL_MAPPING channelMapping; 10663c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi 10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( FDKaacEnc_InitChannelMapping(hAacConfig->channelMode, 10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->channelOrder, 10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &channelMapping) != AAC_ENC_OK ) 10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INIT_ERROR; 10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check return value and if the SBR encoder can handle enough elements */ 1075fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi if (channelMapping.nElements > (8)) { 10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INIT_ERROR; 10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacEncDistributeSbrBits(&channelMapping, sbrElInfo, hAacConfig->bitRate); 10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT initFlag = 0; 10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project initFlag += (InitFlags & AACENC_INIT_STATES) ? 1 : 0; 10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Let the SBR encoder take a look at the configuration and change if required. */ 10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrError = sbrEncoder_Init( 10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *hSbrEncoder, 10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrElInfo, 10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project channelMapping.nElements, 10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->inputBuffer, 10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hAacConfig->bandWidth, 10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &aacBufferOffset, 10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hAacConfig->nChannels, 10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hAacConfig->sampleRate, 10943aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi &hAacConfig->sbrRatio, 10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &frameLength, 10963aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacConfig->audioObjectType, 10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hAacEncoder->nDelay, 10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) ? 1 : TRANS_FAC, 1099a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi (config->userTpHeaderPeriod!=0xFF) ? config->userTpHeaderPeriod : DEFAULT_HEADER_PERIOD_REPETITION_RATE, 11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project initFlag 11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Suppress AOT reconfiguration and check error status. */ 11043aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if (sbrError) { 11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INIT_SBR_ERROR; 11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacConfig->nChannels == 1) { 11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->channelMode = MODE_1; 11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Never use PNS if SBR is active */ 11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( hAacConfig->usePns ) { 11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->usePns = 0; 11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* estimated bitrate consumed by SBR or PS */ 11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->ancDataBitRate = sbrEncoder_GetEstimateBitrate(*hSbrEncoder) ; 11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* sbr initialization */ 11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Initialize Transport - Module. 11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (InitFlags & AACENC_INIT_TRANSPORT) ) 11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT flags = 0; 11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1130dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi FDKaacEnc_MapConfig( 1131dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi &hAacEncoder->coderConfig, 1132dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi config, 1133dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio), 1134dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi hAacConfig); 11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* create flags for transport encoder */ 11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (config->userTpAmxv == 1) { 11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flags |= TP_FLAG_LATM_AMV; 11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Clear output buffer */ 11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes*sizeof(UCHAR)); 11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Initialize Bitstream encoder */ 11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( transportEnc_Init(hAacEncoder->hTpEnc, hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes, config->userTpType, &hAacEncoder->coderConfig, flags) != 0) { 11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INIT_TP_ERROR; 11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* transport initialization */ 11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Initialize AAC - Core. 11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (InitFlags & AACENC_INIT_CONFIG) || 11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (InitFlags & AACENC_INIT_STATES) ) 11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AAC_ENCODER_ERROR err; 11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = FDKaacEnc_Initialize(hAacEncoder->hAacEnc, 11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig, 11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->hTpEnc, 11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (InitFlags & AACENC_INIT_STATES) ? 1 : 0); 11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (err != AAC_ENC_OK) { 11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INIT_AAC_ERROR; 11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* aac initialization */ 11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Initialize Meta Data - Encoder. 11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( hAacEncoder->hMetadataEnc && (hAacEncoder->metaDataAllowed!=0) && 11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ((InitFlags & AACENC_INIT_CONFIG) ||(InitFlags & AACENC_INIT_STATES)) ) 11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT inputDataDelay = DELAY_AAC(hAacConfig->framelength); 11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( isSbrActive(hAacConfig) && hSbrEncoder!=NULL) { 11773aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi inputDataDelay = hAacConfig->sbrRatio*inputDataDelay + sbrEncoder_GetInputDataDelay(*hSbrEncoder); 11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( FDK_MetadataEnc_Init(hAacEncoder->hMetadataEnc, 11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ((InitFlags&AACENC_INIT_STATES) ? 1 : 0), 11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userMetaDataMode, 11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project inputDataDelay, 11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frameLength, 11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userSamplerate, 11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->nChannels, 11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project config->userChannelMode, 11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacConfig->channelOrder) != 0) 11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INIT_META_ERROR; 11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nDelay += FDK_MetadataEnc_GetDelay(hAacEncoder->hMetadataEnc); 11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Update pointer to working buffer. 11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (InitFlags & AACENC_INIT_CONFIG) ) 12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->inputBufferOffset = aacBufferOffset; 12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nSamplesToRead = frameLength * config->nChannels; 12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Make nDelay comparison compatible with config->nSamplesRead */ 12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nDelay *= config->nChannels; 12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* parameter changed */ 12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_OK; 12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncOpen( 12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_AACENCODER *phAacEncoder, 12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT encModules, 12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT maxChannels 12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_ERROR err = AACENC_OK; 12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_AACENCODER hAacEncoder = NULL; 12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (phAacEncoder == NULL) { 12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_HANDLE; 12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* allocate memory */ 12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder = Get_AacEncoder(); 12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder == NULL) { 12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_MEMORY_ERROR; 12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hAacEncoder, sizeof(AACENCODER)); 12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Specify encoder modules to be allocated. */ 12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (encModules==0) { 12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->encoder_modis = ENC_MODE_FLAG_AAC; 12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->encoder_modis |= ENC_MODE_FLAG_SBR; 12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->encoder_modis |= ENC_MODE_FLAG_PS; 12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->encoder_modis |= ENC_MODE_FLAG_META; 12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* consider SAC and PS module */ 12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->encoder_modis = encModules; 12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Determine max channel configuration. */ 12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (maxChannels==0) { 1252fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi hAacEncoder->nMaxAacChannels = (8); 1253fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi hAacEncoder->nMaxSbrChannels = (8); 12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nMaxAacChannels = (maxChannels&0x00FF); 12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) ) { 12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nMaxSbrChannels = (maxChannels&0xFF00) ? (maxChannels>>8) : hAacEncoder->nMaxAacChannels; 12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1261fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi if ( (hAacEncoder->nMaxAacChannels>(8)) || (hAacEncoder->nMaxSbrChannels>(8)) ) { 12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* maxChannels==0 */ 12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Max number of elements could be tuned any more. */ 1268fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi hAacEncoder->nMaxAacElements = fixMin((8), hAacEncoder->nMaxAacChannels); 1269fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi hAacEncoder->nMaxSbrElements = fixMin((8), hAacEncoder->nMaxSbrChannels); 12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nMaxSubFrames = (1); 12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* In case of memory overlay, allocate memory out of libraries */ 12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->inputBuffer = (INT_PCM*)FDKcalloc(hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE, sizeof(INT_PCM)); 12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Open SBR Encoder */ 12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) { 12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( sbrEncoder_Open(&hAacEncoder->hEnvEnc, 12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nMaxSbrElements, 12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nMaxSbrChannels, 12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (hAacEncoder->encoder_modis&ENC_MODE_FLAG_PS) ? 1 : 0 ) ) 12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_MEMORY_ERROR; 12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* (encoder_modis&ENC_MODE_FLAG_SBR) */ 12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Open Aac Encoder */ 12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( FDKaacEnc_Open(&hAacEncoder->hAacEnc, 12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nMaxAacElements, 12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nMaxAacChannels, 12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (1)) != AAC_ENC_OK ) 12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_MEMORY_ERROR; 12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { /* Get bitstream outputbuffer size */ 13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT ld_M; 13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (ld_M=1; (UINT)(1<<ld_M) < (hAacEncoder->nMaxSubFrames*hAacEncoder->nMaxAacChannels*6144)>>3; ld_M++) ; 13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->outBufferInBytes = (1<<ld_M); /* buffer has to be 2^n */ 13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->outBuffer = GetRam_bsOutbuffer(); 13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (OUTPUTBUFFER_SIZE < hAacEncoder->outBufferInBytes ) { 13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_MEMORY_ERROR; 13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Open Meta Data Encoder */ 13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_META) { 13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( FDK_MetadataEnc_Open(&hAacEncoder->hMetadataEnc) ) 13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_MEMORY_ERROR; 13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* (encoder_modis&ENC_MODE_FLAG_META) */ 13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Open Transport Encoder */ 13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( transportEnc_Open(&hAacEncoder->hTpEnc) != 0 ) 13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_MEMORY_ERROR; 13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 13273c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi C_ALLOC_SCRATCH_START(pLibInfo, LIB_INFO, FDK_MODULE_LAST); 13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKinitLibInfo( pLibInfo); 13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transportEnc_GetLibInfo( pLibInfo ); 13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Get capabilty flag for transport encoder. */ 13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->CAPF_tpEnc = FDKlibInfo_getCapabilities( pLibInfo, FDK_TPENC); 13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(pLibInfo, LIB_INFO, FDK_MODULE_LAST); 13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( transportEnc_RegisterSbrCallback(hAacEncoder->hTpEnc, aacenc_SbrCallback, hAacEncoder) != 0 ) { 13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INIT_TP_ERROR; 13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Initialize encoder instance with default parameters. */ 13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacEncDefaultConfig(&hAacEncoder->aacConfig, &hAacEncoder->extParam); 13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Initialize headerPeriod in coderConfig for aacEncoder_GetParam(). */ 13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->coderConfig.headerPeriod = hAacEncoder->extParam.userTpHeaderPeriod; 13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* All encoder modules have to be initialized */ 13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags = AACENC_INIT_ALL; 13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Return encoder instance */ 13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *phAacEncoder = hAacEncoder; 13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return err; 13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacEncClose(&hAacEncoder); 13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return err; 13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncClose(HANDLE_AACENCODER *phAacEncoder) 13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_ERROR err = AACENC_OK; 13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (phAacEncoder == NULL) { 13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_HANDLE; 13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (*phAacEncoder != NULL) { 13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_AACENCODER hAacEncoder = *phAacEncoder; 13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->inputBuffer!=NULL) { 13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKfree(hAacEncoder->inputBuffer); 13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->inputBuffer = NULL; 13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->outBuffer) { 13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeRam_bsOutbuffer(&hAacEncoder->outBuffer); 13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->hEnvEnc) { 13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrEncoder_Close (&hAacEncoder->hEnvEnc); 13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->hAacEnc) { 13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKaacEnc_Close (&hAacEncoder->hAacEnc); 13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transportEnc_Close(&hAacEncoder->hTpEnc); 13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->hMetadataEnc) { 13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_MetadataEnc_Close (&hAacEncoder->hMetadataEnc); 13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Free_AacEncoder(phAacEncoder); 14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return err; 14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncEncode( 14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const HANDLE_AACENCODER hAacEncoder, 14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AACENC_BufDesc *inBufDesc, 14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AACENC_BufDesc *outBufDesc, 14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AACENC_InArgs *inargs, 14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_OutArgs *outargs 14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_ERROR err = AACENC_OK; 14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i, nBsBytes = 0; 14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT outBytes[(1)]; 14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int nExtensions = 0; 14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int ancDataExtIdx = -1; 14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* deal with valid encoder handle */ 14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder==NULL) { 14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_HANDLE; 14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Adjust user settings and trigger reinitialization. 14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->InitFlags!=0) { 14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = aacEncInit(hAacEncoder, 14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags, 14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &hAacEncoder->extParam); 14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (err!=AACENC_OK) { 14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* keep init flags alive! */ 14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags = AACENC_INIT_NONE; 14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (outargs!=NULL) { 14442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(outargs, sizeof(AACENC_OutArgs)); 14452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (outBufDesc!=NULL) { 14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<outBufDesc->numBufs; i++) { 14492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (outBufDesc->bufs[i]!=NULL) { 14502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(outBufDesc->bufs[i], outBufDesc->bufSizes[i]); 14512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * If only encoder handle given, independent (re)initialization can be triggered. 14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (hAacEncoder!=NULL) & (inBufDesc==NULL) && (outBufDesc==NULL) && (inargs==NULL) && (outargs==NULL) ) { 14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* reset buffer wich signals number of valid bytes in output bitstream buffer */ 14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(outBytes, hAacEncoder->aacConfig.nSubFrames*sizeof(INT)); 14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Manage incoming audio samples. 14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (inargs->numInSamples > 0) && (getBufDescIdx(inBufDesc,IN_AUDIO_DATA) != -1) ) 14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Fetch data until nSamplesToRead reached */ 14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT idx = getBufDescIdx(inBufDesc,IN_AUDIO_DATA); 14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT newSamples = fixMax(0,fixMin(inargs->numInSamples, hAacEncoder->nSamplesToRead-hAacEncoder->nSamplesRead)); 14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT_PCM *pIn = hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead; 14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Copy new input samples to internal buffer */ 14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (inBufDesc->bufElSizes[idx]==(INT)sizeof(INT_PCM)) { 14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(pIn, (INT_PCM*)inBufDesc->bufs[idx], newSamples*sizeof(INT_PCM)); /* Fast copy. */ 14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else if (inBufDesc->bufElSizes[idx]>(INT)sizeof(INT_PCM)) { 14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<newSamples; i++) { 14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pIn[i] = (INT_PCM)(((LONG*)inBufDesc->bufs[idx])[i]>>16); /* Convert 32 to 16 bit. */ 14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<newSamples; i++) { 14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pIn[i] = ((INT_PCM)(((SHORT*)inBufDesc->bufs[idx])[i]))<<16; /* Convert 16 to 32 bit. */ 14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nSamplesRead += newSamples; 14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Number of fetched input buffer samples. */ 14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project outargs->numInSamples = newSamples; 14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* input buffer completely filled ? */ 14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->nSamplesRead < hAacEncoder->nSamplesToRead) 14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* - eof reached and flushing enabled, or 14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project - return to main and wait for further incoming audio samples */ 15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (inargs->numInSamples==-1) 15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (hAacEncoder->nZerosAppended < hAacEncoder->nDelay) 15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int nZeros = hAacEncoder->nSamplesToRead - hAacEncoder->nSamplesRead; 15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(nZeros >= 0); 15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* clear out until end-of-buffer */ 15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nZeros) { 15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead, sizeof(INT_PCM)*nZeros ); 15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nZerosAppended += nZeros; 15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nSamplesRead = hAacEncoder->nSamplesToRead; 15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { /* flushing completed */ 15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_ENCODE_EOF; /* eof reached */ 15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { /* inargs->numInSamples!= -1 */ 15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; /* not enough samples in input buffer and no flushing enabled */ 15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* init payload */ 15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hAacEncoder->extPayload, sizeof(AACENC_EXT_PAYLOAD) * MAX_TOTAL_EXT_PAYLOADS); 15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < MAX_TOTAL_EXT_PAYLOADS; i++) { 15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[i].associatedChElement = -1; 15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hAacEncoder->extPayloadData, sizeof(hAacEncoder->extPayloadData)); 15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(hAacEncoder->extPayloadSize, sizeof(hAacEncoder->extPayloadSize)); 15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 15362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Calculate Meta Data info. 15372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 15382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (hAacEncoder->hMetadataEnc!=NULL) && (hAacEncoder->metaDataAllowed!=0) ) { 15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AACENC_MetaData *pMetaData = NULL; 15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_EXT_PAYLOAD *pMetaDataExtPayload = NULL; 15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT nMetaDataExtensions = 0; 15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT matrix_mixdown_idx = 0; 15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* New meta data info available ? */ 15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( getBufDescIdx(inBufDesc,IN_METADATA_SETUP) != -1 ) { 15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pMetaData = (AACENC_MetaData*)inBufDesc->bufs[getBufDescIdx(inBufDesc,IN_METADATA_SETUP)]; 15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_MetadataEnc_Process(hAacEncoder->hMetadataEnc, 15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset, 15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nSamplesRead, 15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pMetaData, 15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pMetaDataExtPayload, 15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &nMetaDataExtensions, 15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &matrix_mixdown_idx 15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<(INT)nMetaDataExtensions; i++) { /* Get meta data extension payload. */ 15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[nExtensions++] = pMetaDataExtPayload[i]; 15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 156216c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi 156316c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi if ( (matrix_mixdown_idx!=-1) 156416c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi && ((hAacEncoder->extParam.userChannelMode==MODE_1_2_2)||(hAacEncoder->extParam.userChannelMode==MODE_1_2_2_1)) ) 156516c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi { 156616c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi /* Set matrix mixdown coefficient. */ 156716c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi UINT pceValue = (UINT)( (1<<3) | ((matrix_mixdown_idx&0x3)<<1) | 1 ); 15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->extParam.userPceAdditions != pceValue) { 15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extParam.userPceAdditions = pceValue; 15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( isSbrActive(&hAacEncoder->aacConfig) ) { 15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nPayload = 0; 15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Encode SBR data. 15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sbrEncoder_EncodeFrame(hAacEncoder->hEnvEnc, 15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->inputBuffer, 15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extParam.nChannels, 15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayloadSize[nPayload], 15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayloadData[nPayload] 15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if defined(EVAL_PACKAGE_SILENCE) || defined(EVAL_PACKAGE_SBR_SILENCE) 15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ,hAacEncoder->hAacEnc->clearOutput 15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project )) 15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_ENCODE_ERROR; 15942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 15972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Add SBR extension payload */ 1598fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi for (i = 0; i < (8); i++) { 15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->extPayloadSize[nPayload][i] > 0) { 16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[nExtensions].pData = hAacEncoder->extPayloadData[nPayload][i]; 16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 16022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[nExtensions].dataSize = hAacEncoder->extPayloadSize[nPayload][i]; 16032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[nExtensions].associatedChElement = i; 16042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[nExtensions].dataType = EXT_SBR_DATA; /* Once SBR Encoder supports SBR CRC set EXT_SBR_DATA_CRC */ 16062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nExtensions++; /* or EXT_SBR_DATA according to configuration. */ 16072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(nExtensions<=MAX_TOTAL_EXT_PAYLOADS); 16082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nPayload++; 16112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* sbrEnabled */ 16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (inargs->numAncBytes > 0) && ( getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA)!=-1 ) ) { 16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT idx = getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA); 16162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[nExtensions].dataSize = inargs->numAncBytes * 8; 16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[nExtensions].pData = (UCHAR*)inBufDesc->bufs[idx]; 16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[nExtensions].dataType = EXT_DATA_ELEMENT; 16192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload[nExtensions].associatedChElement = -1; 16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ancDataExtIdx = nExtensions; /* store index */ 16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nExtensions++; 16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Encode AAC - Core. 16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( FDKaacEnc_EncodeFrame( hAacEncoder->hAacEnc, 16282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->hTpEnc, 16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->inputBuffer, 16302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project outBytes, 16312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->extPayload 16322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) != AAC_ENC_OK ) 16332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 16342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_ENCODE_ERROR; 16352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 16362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ancDataExtIdx >= 0) { 16392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project outargs->numAncBytes = inargs->numAncBytes - (hAacEncoder->extPayload[ancDataExtIdx].dataSize>>3); 16402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* samples exhausted */ 16432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nSamplesRead -= hAacEncoder->nSamplesToRead; 16442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 16462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Delay balancing buffer handling 16472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 16482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (isSbrActive(&hAacEncoder->aacConfig)) { 16492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrEncoder_UpdateBuffers(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer); 16502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 16532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Make bitstream public 16542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 16552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (outBufDesc->numBufs>=1) { 16562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bsIdx = getBufDescIdx(outBufDesc,OUT_BITSTREAM_DATA); 16582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT auIdx = getBufDescIdx(outBufDesc,OUT_AU_SIZES); 16592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0,nBsBytes=0; i<hAacEncoder->aacConfig.nSubFrames; i++) { 16612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nBsBytes += outBytes[i]; 16622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (auIdx!=-1) { 16642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ((INT*)outBufDesc->bufs[auIdx])[i] = outBytes[i]; 16652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (bsIdx!=-1) && (outBufDesc->bufSizes[bsIdx]>=nBsBytes) ) { 16692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(outBufDesc->bufs[bsIdx], hAacEncoder->outBuffer, sizeof(UCHAR)*nBsBytes); 16702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project outargs->numOutBytes = nBsBytes; 16712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 16732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* output buffer too small, can't write valid bitstream */ 16742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_ENCODE_ERROR; 16752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 16762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 16802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (err == AACENC_ENCODE_ERROR) { 16812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* All encoder modules have to be initialized */ 16822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags = AACENC_INIT_ALL; 16832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return err; 16862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 16872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 16892228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR aacEncGetConf(HANDLE_AACENCODER hAacEncoder, 16902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *size, 16912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *confBuffer) 16922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 16932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_BITSTREAM tmpConf; 16942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT confType; 16952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR buf[64]; 16962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int err; 16972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Init bit buffer */ 16992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKinitBitStream(&tmpConf, buf, 64, 0, BS_WRITER); 17002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* write conf in tmp buffer */ 17022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = transportEnc_GetConf(hAacEncoder->hTpEnc, &hAacEncoder->coderConfig, &tmpConf, &confType); 17032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* copy data to outbuffer: length in bytes */ 17052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKbyteAlign(&tmpConf, 0); 17062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check buffer size */ 17082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (FDKgetValidBits(&tmpConf) > ((*size)<<3)) 17092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_ENC_UNKNOWN; 17102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKfetchBuffer(&tmpConf, confBuffer, size); 17122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (err != 0) 17142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_ENC_UNKNOWN; 17152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 17162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_ENC_OK; 17172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 17182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17202228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncGetLibInfo(LIB_INFO *info) 17212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 17222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i = 0; 17232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (info == NULL) { 17252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INVALID_HANDLE; 17262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_toolsGetLibInfo( info ); 17292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transportEnc_GetLibInfo( info ); 17302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrEncoder_GetLibInfo( info ); 17322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* search for next free tab */ 17342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < FDK_MODULE_LAST; i++) { 17352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (info[i].module_id == FDK_NONE) break; 17362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (i == FDK_MODULE_LAST) { 17382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_INIT_ERROR; 17392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project info[i].module_id = FDK_AACENC; 17422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project info[i].build_date = (char*)AACENCODER_LIB_BUILD_DATE; 17432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project info[i].build_time = (char*)AACENCODER_LIB_BUILD_TIME; 17442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project info[i].title = (char*)AACENCODER_LIB_TITLE; 17452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project info[i].version = LIB_VERSION(AACENCODER_LIB_VL0, AACENCODER_LIB_VL1, AACENCODER_LIB_VL2);; 17462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project LIB_VERSION_STRING(&info[i]); 17472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Capability flags */ 17492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project info[i].flags = 0 17502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project | CAPF_AAC_1024 | CAPF_AAC_LC 17512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project | CAPF_AAC_512 17522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project | CAPF_AAC_480 17532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project | CAPF_AAC_DRC 17542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ; 17552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* End of flags */ 17562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AACENC_OK; 17582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 17592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17602228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncoder_SetParam( 17612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const HANDLE_AACENCODER hAacEncoder, 17622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AACENC_PARAM param, 17632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT value 17642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 17652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 17662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_ERROR err = AACENC_OK; 17672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USER_PARAM *settings = &hAacEncoder->extParam; 17682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* check encoder handle */ 17702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder == NULL) { 17712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_HANDLE; 17722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 17732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* apply param value */ 17762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (param) 17772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 17782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_AOT: 17792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userAOT != (AUDIO_OBJECT_TYPE)value) { 17802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* check if AOT matches the allocated modules */ 17812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch ( value ) { 17822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_PS: 17832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_PS: 17842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_PS))) { 17852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 17862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 17872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_SBR: 17892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_SBR: 17902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_SBR))) { 17912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 17922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 17932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_AAC_LC: 17952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_MP2_AAC_LC: 17962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_LD: 17972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_ELD: 17982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_AAC))) { 17992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 18002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 18012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 18042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 18052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 18062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project }/* switch value */ 18072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userAOT = (AUDIO_OBJECT_TYPE)value; 18082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 18092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_BITRATE: 18122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userBitrate != value) { 18132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userBitrate = value; 18142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; 18152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_BITRATEMODE: 18182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userBitrateMode != value) { 18192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch ( value ) { 18202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 0: 18212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 8: 18222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userBitrateMode = value; 18232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; 18242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 18262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 18272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* switch value */ 18292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_SAMPLERATE: 18322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userSamplerate != value) { 18332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !( (value==8000) || (value==11025) || (value==12000) || (value==16000) || (value==22050) || (value==24000) || 18342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (value==32000) || (value==44100) || (value==48000) || (value==64000) || (value==88200) || (value==96000) ) ) 18352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 18362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 18372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userSamplerate = value; 18402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */ 18412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 18422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_CHANNELMODE: 18452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userChannelMode != (CHANNEL_MODE)value) { 18462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const CHANNEL_MODE_CONFIG_TAB* pConfig = FDKaacEnc_GetChannelModeConfiguration((CHANNEL_MODE)value); 18472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pConfig==NULL) { 18482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 18492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (pConfig->nElements > hAacEncoder->nMaxAacElements) 18522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || (pConfig->nChannelsEff > hAacEncoder->nMaxAacChannels) 1853fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi || !(((value>=1) && (value<=7))||((value>=33) && (value<=34))) 18542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 18552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 18562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 18572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userChannelMode = (CHANNEL_MODE)value; 18612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->nChannels = pConfig->nChannels; 18622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */ 18632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; 18642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_BANDWIDTH: 18672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userBandwidth != value) { 18682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userBandwidth = value; 18692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG; 18702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_CHANNELORDER: 18732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->aacConfig.channelOrder != (CHANNEL_ORDER)value) { 18742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (! ((value==0) || (value==1)) ) { 18752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 18762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->aacConfig.channelOrder = (CHANNEL_ORDER)value; 18792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */ 18802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 18812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_AFTERBURNER: 18842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userAfterburner != value) { 18852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (! ((value==0) || (value==1)) ) { 18862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 18872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userAfterburner = value; 18902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG; 18912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 18932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_GRANULE_LENGTH: 18942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userFramelength != value) { 18952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (value) { 18962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1024: 18972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 512: 18982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 480: 18992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userFramelength = value; 19002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; 19012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 19032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 19042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19083aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi case AACENC_SBR_RATIO: 19093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if (settings->userSbrRatio != value) { 19103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi if (! ((value==0) || (value==1) || (value==2)) ) { 19113aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi err = AACENC_INVALID_CONFIG; 19123aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi break; 19133aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 19143aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi settings->userSbrRatio = value; 19153aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 19163aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi } 19173aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi break; 19182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_SBR_MODE: 19192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userSbrEnabled != value) { 19202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userSbrEnabled = value; 19212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; 19222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_TRANSMUX: 19252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userTpType != (TRANSPORT_TYPE)value) { 19262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 19272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project TRANSPORT_TYPE type = (TRANSPORT_TYPE)value; 19282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT flags = hAacEncoder->CAPF_tpEnc; 19292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 19302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !( ((type==TT_MP4_ADIF) && (flags&CAPF_ADIF)) 19312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || ((type==TT_MP4_ADTS) && (flags&CAPF_ADTS)) 19322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || ((type==TT_MP4_LATM_MCP0) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS))) 19332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || ((type==TT_MP4_LATM_MCP1) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS))) 19342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || ((type==TT_MP4_LOAS) && (flags&CAPF_LOAS)) 19352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || ((type==TT_MP4_RAW) && (flags&CAPF_RAWPACKETS)) 19362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) ) 19372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 19382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 19392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userTpType = (TRANSPORT_TYPE)value; 19422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 19432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_SIGNALING_MODE: 19462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userTpSignaling != value) { 19472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !((value==0) || (value==1) || (value==2)) ) { 19482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 19492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userTpSignaling = value; 19522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 19532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_PROTECTION: 19562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userTpProtection != value) { 19572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !((value==0) || (value==1)) ) { 19582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 19592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userTpProtection = value; 19622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 19632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_HEADER_PERIOD: 19662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userTpHeaderPeriod != value) { 19672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userTpHeaderPeriod = value; 19682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 19692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_TPSUBFRAMES: 19722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userTpNsubFrames != value) { 19732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (! ( (value>=1) && (value<=4) ) ) { 19742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 19752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userTpNsubFrames = value; 19782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; 19792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_ANCILLARY_BITRATE: 19822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (settings->userAncDataRate != value) { 19832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userAncDataRate = value; 19842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_CONTROL_STATE: 19872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder->InitFlags != value) { 19882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (value&AACENC_RESET_INBUFFER) { 19892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->nSamplesRead = 0; 19902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags = value; 19922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 19932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_METADATA_MODE: 19952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((UINT)settings->userMetaDataMode != value) { 19962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !((value>=0) && (value<=2)) ) { 19972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INVALID_CONFIG; 19982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 19992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 20002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project settings->userMetaDataMode = value; 20012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAacEncoder->InitFlags |= AACENC_INIT_CONFIG; 20022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 20032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 20052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_UNSUPPORTED_PARAMETER; 20062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* switch(param) */ 20082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 20092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 20102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return err; 20112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 20122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 20132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT aacEncoder_GetParam( 20142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const HANDLE_AACENCODER hAacEncoder, 20152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const AACENC_PARAM param 20162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 20172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 20182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT value = 0; 20192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USER_PARAM *settings = &hAacEncoder->extParam; 20202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 20212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* check encoder handle */ 20222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAacEncoder == NULL) { 20232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 20242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 20252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 20262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* apply param value */ 20272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (param) 20282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 20292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_AOT: 20302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->aacConfig.audioObjectType; 20312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_BITRATE: 20332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)((hAacEncoder->aacConfig.bitrateMode==AACENC_BR_MODE_CBR) ? hAacEncoder->aacConfig.bitRate : -1); 20342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_BITRATEMODE: 20362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->aacConfig.bitrateMode; 20372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_SAMPLERATE: 20393aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi value = (UINT)hAacEncoder->coderConfig.extSamplingRate; 20402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_CHANNELMODE: 20422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->aacConfig.channelMode; 20432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_BANDWIDTH: 20452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->aacConfig.bandWidth; 20462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_CHANNELORDER: 20482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->aacConfig.channelOrder; 20492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_AFTERBURNER: 20512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->aacConfig.useRequant; 20522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_GRANULE_LENGTH: 20542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->aacConfig.framelength; 20552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20563aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi case AACENC_SBR_RATIO: 20573aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi value = isSbrActive(&hAacEncoder->aacConfig) ? hAacEncoder->aacConfig.sbrRatio : 0; 20583aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi break; 20592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_SBR_MODE: 20602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT) (hAacEncoder->aacConfig.syntaxFlags & AC_SBR_PRESENT) ? 1 : 0; 20612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_TRANSMUX: 20632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)settings->userTpType; 20642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_SIGNALING_MODE: 2066dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi value = (UINT)getSbrSignalingMode(hAacEncoder->aacConfig.audioObjectType, settings->userTpType, settings->userTpSignaling, hAacEncoder->aacConfig.sbrRatio); 20672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_PROTECTION: 20692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)settings->userTpProtection; 20702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_HEADER_PERIOD: 20722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->coderConfig.headerPeriod; 20732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_TPSUBFRAMES: 20752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)settings->userTpNsubFrames; 20762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_ANCILLARY_BITRATE: 20782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->aacConfig.anc_Rate; 20792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_CONTROL_STATE: 20812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (UINT)hAacEncoder->InitFlags; 20822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACENC_METADATA_MODE: 20842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value = (hAacEncoder->metaDataAllowed==0) ? 0 : (UINT)settings->userMetaDataMode; 20852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 20872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //err = MPS_INVALID_PARAMETER; 20882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 20892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* switch(param) */ 20902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 20912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 20922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return value; 20932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 20942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 20952228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncInfo( 20962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const HANDLE_AACENCODER hAacEncoder, 20972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_InfoStruct *pInfo 20982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 20992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 21002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AACENC_ERROR err = AACENC_OK; 21012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 21022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(pInfo, sizeof(AACENC_InfoStruct)); 21032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInfo->confSize = 64; /* pre-initialize */ 21042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 21052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInfo->maxOutBufBytes = ((hAacEncoder->nMaxAacChannels*6144)+7)>>3; 21062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInfo->maxAncBytes = hAacEncoder->aacConfig.maxAncBytesPerAU; 21072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInfo->inBufFillLevel = hAacEncoder->nSamplesRead/hAacEncoder->extParam.nChannels; 21082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInfo->inputChannels = hAacEncoder->extParam.nChannels; 21092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInfo->frameLength = hAacEncoder->nSamplesToRead/hAacEncoder->extParam.nChannels; 21102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInfo->encoderDelay = hAacEncoder->nDelay/hAacEncoder->extParam.nChannels; 21112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 21122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Get encoder configuration */ 21132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( aacEncGetConf(hAacEncoder, &pInfo->confSize, &pInfo->confBuf[0]) != AAC_ENC_OK) { 21142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = AACENC_INIT_ERROR; 21152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 21162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 21172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 21182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return err; 21192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 21202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2121