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
5ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi� Copyright  1995 - 2015 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
10146ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi#define AACENCODER_LIB_VL2 22
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_TITLE "AAC Encoder"
1036e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen#ifdef __ANDROID__
1046e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen#define AACENCODER_LIB_BUILD_DATE ""
1056e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen#define AACENCODER_LIB_BUILD_TIME ""
1066e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen#else
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_BUILD_DATE __DATE__
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_BUILD_TIME __TIME__
1096e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen#endif
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_encoder.h"
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "../src/sbr_ram.h"
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "channel_map.h"
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "psy_const.h"
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "bitenc.h"
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpenc_lib.h"
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "metadata_main.h"
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SBL(fl)            (fl/8)                 /*!< Short block length (hardcoded to 8 short blocks per long block) */
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define BSLA(fl)           (4*SBL(fl)+SBL(fl)/2)  /*!< AAC block switching look-ahead */
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DELAY_AAC(fl)      (fl+BSLA(fl))          /*!< MDCT + blockswitching */
1263aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi#define DELAY_AACELD(fl)   ((fl)/2)               /*!< ELD FB delay (no framing delay included) */
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define INPUTBUFFER_SIZE (1537+100+2048)
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
130a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi#define DEFAULT_HEADER_PERIOD_REPETITION_RATE  10 /*!< Default header repetition rate used in transport library and for SBR header. */
131a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Flags to characterize encoder modules to be supported in present instance.
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectenum {
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_AAC  = 0x0001,
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_SBR  = 0x0002,
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_PS   = 0x0004,
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_SAC  = 0x0008,
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_META = 0x0010
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct {
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AUDIO_OBJECT_TYPE userAOT;               /*!< Audio Object Type.             */
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userSamplerate;        /*!< Sampling frequency.            */
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              nChannels;             /*!< will be set via channelMode.   */
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CHANNEL_MODE      userChannelMode;
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userBitrate;
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userBitrateMode;
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userBandwidth;
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userAfterburner;
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userFramelength;
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userAncDataRate;
156e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    UINT              userPeakBitrate;
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTns;               /*!< Use TNS coding. */
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userPns;               /*!< Use PNS coding. */
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userIntensity;         /*!< Use Intensity coding. */
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    TRANSPORT_TYPE    userTpType;            /*!< Transport type */
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpSignaling;       /*!< Extension AOT signaling mode. */
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpNsubFrames;      /*!< Number of sub frames in a transport frame for LOAS/LATM or ADTS (default 1). */
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpAmxv;            /*!< AudioMuxVersion to be used for LATM (default 0). */
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpProtection;
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpHeaderPeriod;    /*!< Parameter used to configure LATM/LOAS SMC rate. Moreover this parameters is
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                  used to configure repetition rate of PCE in raw_data_block. */
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userErTools;           /*!< Use VCB11, HCR and/or RVLC ER tool. */
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userPceAdditions;      /*!< Configure additional bits in PCE. */
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userMetaDataMode;      /*!< Meta data library configuration. */
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1753aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    UCHAR             userSbrEnabled;        /*!< Enable SBR for ELD. */
1763aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    UINT              userSbrRatio;          /*!< SBR sampling rate ratio. Dual- or single-rate. */
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} USER_PARAM;
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/****************************************************************************
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           Structure Definitions
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct  AACENC_CONFIG     *HANDLE_AACENC_CONFIG;
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstruct AACENCODER
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    USER_PARAM               extParam;
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CODER_CONFIG             coderConfig;
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* AAC */
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_CONFIG            aacConfig;
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AAC_ENC           hAacEnc;
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* SBR */
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_SBR_ENCODER       hEnvEnc;
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Meta Data */
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_FDK_METADATA_ENCODER  hMetadataEnc;
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                          metaDataAllowed; /* Signal whether chosen configuration allows metadata. Necessary for delay
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                     compensation. Metadata mode is a separate parameter. */
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Transport */
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_TRANSPORTENC      hTpEnc;
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Output */
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                   *outBuffer;         /* Internal bitstream buffer */
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      outBufferInBytes;   /* Size of internal bitstream buffer*/
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Input */
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT_PCM                 *inputBuffer;        /* Internal input buffer. Input source for AAC encoder */
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      inputBufferOffset;  /* Where to write new input samples. */
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      nSamplesToRead;    /* number of input samples neeeded for encoding one frame */
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      nSamplesRead;      /* number of input samples already in input buffer */
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      nZerosAppended;    /* appended zeros at end of file*/
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      nDelay;            /* encoder delay */
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_EXT_PAYLOAD       extPayload [MAX_TOTAL_EXT_PAYLOADS];
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Extension payload */
224fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi    UCHAR                    extPayloadData [(1)][(8)][MAX_PAYLOAD_SIZE];
225fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi    UINT                     extPayloadSize [(1)][(8)]; /* payload sizes in bits */
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ULONG                    InitFlags;         /* internal status to treggier re-initialization */
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Memory allocation info. */
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT                       nMaxAacElements;
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT                       nMaxAacChannels;
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT                       nMaxSbrElements;
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT                       nMaxSbrChannels;
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   UINT                      nMaxSubFrames;
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   UINT                      encoder_modis;
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2393aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi   /* Capability flags */
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   UINT                      CAPF_tpEnc;
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} ;
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2449f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivitypedef struct
2459f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi{
2469f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    ULONG               samplingRate;   /*!< Encoder output sampling rate. */
2479f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    ULONG               bitrateRange;   /*!< Lower bitrate range for config entry. */
2489f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2499f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    UCHAR               lowDelaySbr;    /*!< 0: ELD sbr off,
2509f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi                                             1: ELD sbr on */
2519f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2529f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    UCHAR               downsampledSbr; /*!< 0: ELD with dualrate sbr,
2539f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi                                             1: ELD with downsampled sbr */
2549f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2559f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi} ELD_SBR_CONFIGURATOR;
2569f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2579f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi/**
2589f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \brief  This table defines ELD/SBR default configurations.
2599f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi */
2609f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivistatic const ELD_SBR_CONFIGURATOR eldSbrAutoConfigTab[] =
2619f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi{
2629f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 48000,     0, 1, 0 },
2639f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 48000, 64001, 0, 0 },
2649f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2659f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 44100,     0, 1, 0 },
2669f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 44100, 64001, 0, 0 },
2679f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2689f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 32000,     0, 1, 0 },
2699f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 32000, 28000, 1, 1 },
2709f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 32000, 56000, 0, 0 },
2719f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2729f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 24000,     0, 1, 1 },
2739f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 24000, 40000, 0, 0 },
2749f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2759f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 16000,     0, 1, 1 },
2769f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi  { 16000, 28000, 0, 0 }
2779f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2789f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi};
2799f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
2809f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi/*
2819f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \brief  Configure SBR for ELD configuration.
2829f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi *
2839f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * This function finds default SBR configuration for ELD based on sampling rate and channel bitrate.
2849f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * Outputparameters are SBR on/off, and SBR ratio.
2859f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi *
2869f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param samplingRate          Audio signal sampling rate.
2879f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param channelMode           Channel configuration to be used.
2889f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param totalBitrate          Overall bitrate.
2899f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param eldSbr                Pointer to eldSbr parameter, filled on return.
2909f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \param eldSbrRatio           Pointer to eldSbrRatio parameter, filled on return.
2919f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi *
2929f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi * \return - AACENC_OK, all fine.
2939f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi *         - AACENC_INVALID_CONFIG, on failure.
2949f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi */
2959f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivistatic AACENC_ERROR eldSbrConfigurator(
2969f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi        const ULONG                      samplingRate,
2979f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi        const CHANNEL_MODE               channelMode,
2989f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi        const ULONG                      totalBitrate,
2999f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi        UINT * const                     eldSbr,
3009f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi        UINT * const                     eldSbrRatio
3019f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi        )
3029f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi{
3039f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    AACENC_ERROR err = AACENC_OK;
3049f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    int i, cfgIdx = -1;
3059f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    const ULONG channelBitrate = totalBitrate / FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff;
3069f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
307ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi    for (i=0; i<(int)(sizeof(eldSbrAutoConfigTab)/sizeof(ELD_SBR_CONFIGURATOR)); i++) {
3089f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      if ( (samplingRate <= eldSbrAutoConfigTab[i].samplingRate)
3099f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi        && (channelBitrate >= eldSbrAutoConfigTab[i].bitrateRange) )
3109f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      {
3119f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi        cfgIdx = i;
3129f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      }
3139f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    }
3149f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
3159f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    if (cfgIdx != -1) {
3169f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      *eldSbr      = (eldSbrAutoConfigTab[cfgIdx].lowDelaySbr==0) ? 0 : 1;
3179f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      *eldSbrRatio = (eldSbrAutoConfigTab[cfgIdx].downsampledSbr==0) ? 2 : 1;
3189f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    }
3199f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    else {
3209f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      err = AACENC_INVALID_CONFIG; /* no default configuration for eld-sbr available. */
3219f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    }
3229f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
3239f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    return err;
3249f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi}
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig)
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT sbrUsed = 0;
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
330e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    if ( (hAacConfig->audioObjectType==AOT_SBR) || (hAacConfig->audioObjectType==AOT_PS) )
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrUsed = 1;
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD && (hAacConfig->syntaxFlags & AC_SBR_PRESENT))
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrUsed = 1;
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return ( sbrUsed );
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3423aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivistatic inline INT isPsActive(const AUDIO_OBJECT_TYPE audioObjectType)
3433aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi{
3443aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    INT psUsed = 0;
3453aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
346e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    if ( (audioObjectType==AOT_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
371e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi  if ( (audioObjectType==AOT_AAC_LC) || (audioObjectType==AOT_SBR) || (audioObjectType==AOT_PS) ) {
372dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    switch (transportType) {
373dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      case TT_MP4_ADIF:
374dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      case TT_MP4_ADTS:
375dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        sbrSignaling = SIG_IMPLICIT; /* For MPEG-2 transport types, only implicit signaling is possible */
376dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        break;
377dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
378dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      case TT_MP4_RAW:
379dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      case TT_MP4_LATM_MCP1:
380dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      case TT_MP4_LATM_MCP0:
381dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      case TT_MP4_LOAS:
382dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      default:
383dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        if ( transportSignaling==0xFF ) {
384dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi          /* Defaults */
385dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi          if ( sbrRatio==1 ) {
386dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi            sbrSignaling = SIG_EXPLICIT_HIERARCHICAL; /* For downsampled SBR, explicit signaling is mandatory */
387dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi          } else {
388dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi            sbrSignaling = SIG_IMPLICIT; /* For dual-rate SBR, implicit signaling is default */
389dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi          }
390dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        } else {
391dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi          /* User set parameters */
392dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi          /* Attention: Backward compatible explicit signaling does only work with AMV1 for LATM/LOAS */
393dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi          sbrSignaling = (SBR_PS_SIGNALING)transportSignaling;
394dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        }
395dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        break;
396dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    }
397dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi  }
398dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
399dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi  return sbrSignaling;
400dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi}
401dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/****************************************************************************
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               Allocate Encoder
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectH_ALLOC_MEM (_AacEncoder, AACENCODER)
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectC_ALLOC_MEM (_AacEncoder, AACENCODER, 1)
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
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 * Map Encoder specific config structures to CODER_CONFIG.
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
415dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivistatic void FDKaacEnc_MapConfig(
416dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        CODER_CONFIG *const              cc,
417dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        const USER_PARAM *const          extCfg,
418dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        const SBR_PS_SIGNALING           sbrSignaling,
419dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        const HANDLE_AACENC_CONFIG       hAacConfig
420dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        )
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AUDIO_OBJECT_TYPE transport_AOT = AOT_NULL_OBJECT;
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(cc, sizeof(CODER_CONFIG));
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags = 0;
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
427e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi  transport_AOT = hAacConfig->audioObjectType;
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) {
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->flags |= (hAacConfig->syntaxFlags & AC_SBR_PRESENT) ? CC_SBR : 0;
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* transport type is usually AAC-LC. */
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (transport_AOT == AOT_SBR) || (transport_AOT == AOT_PS) ) {
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->aot           = AOT_AAC_LC;
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->aot           = transport_AOT;
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Configure extension aot. */
442dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi  if (sbrSignaling==SIG_IMPLICIT) {
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->extAOT = AOT_NULL_OBJECT;  /* implicit */
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
446dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    if ( (sbrSignaling==SIG_EXPLICIT_BW_COMPATIBLE) && ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) ) {
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cc->extAOT = AOT_SBR;        /* explicit backward compatible */
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cc->extAOT = transport_AOT;  /* explicit hierarchical */
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
453dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
454dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi  if ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) {
455dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    cc->sbrPresent=1;
456dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    if (transport_AOT==AOT_PS) {
457dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      cc->psPresent=1;
458dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    }
459dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi  }
460dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi  cc->sbrSignaling    = sbrSignaling;
461dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->extSamplingRate = extCfg->userSamplerate;
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->bitRate         = hAacConfig->bitRate;
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->noChannels      = hAacConfig->nChannels;
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags          |= CC_IS_BASELAYER;
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->channelMode     = hAacConfig->channelMode;
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->nSubFrames = (hAacConfig->nSubFrames > 1 && extCfg->userTpNsubFrames == 1)
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 ? hAacConfig->nSubFrames
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 : extCfg->userTpNsubFrames;
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags          |= (extCfg->userTpProtection) ? CC_PROTECTION : 0;
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (extCfg->userTpHeaderPeriod!=0xFF) {
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->headerPeriod    = extCfg->userTpHeaderPeriod;
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else { /* auto-mode */
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (extCfg->userTpType) {
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case TT_MP4_ADTS:
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case TT_MP4_LOAS:
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case TT_MP4_LATM_MCP1:
482a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi        cc->headerPeriod = DEFAULT_HEADER_PERIOD_REPETITION_RATE;
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        cc->headerPeriod = 0;
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->samplesPerFrame = hAacConfig->framelength;
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->samplingRate    = hAacConfig->sampleRate;
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Mpeg-4 signaling for transport library. */
493e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi  cc->flags |= CC_MPEG_ID;
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ER-tools signaling. */
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_VCB11) ? CC_VCB11 : 0;
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_HCR)   ? CC_HCR : 0;
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_RVLC)  ? CC_RVLC : 0;
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Matrix mixdown coefficient configuration. */
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (extCfg->userPceAdditions&0x1) && (hAacConfig->epConfig==-1)
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      && ((cc->channelMode==MODE_1_2_2)||(cc->channelMode==MODE_1_2_2_1)) )
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->matrixMixdownA       = ((extCfg->userPceAdditions>>1)&0x3)+1;
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->flags |= (extCfg->userPceAdditions>>3)&0x1 ? CC_PSEUDO_SURROUND : 0;
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->matrixMixdownA = 0;
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Examine buffer descriptor regarding choosen identifier.
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param pBufDesc              Pointer to buffer descriptor
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param identifier            Buffer identifier to look for.
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return - Buffer descriptor index.
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *         -1, if there is no entry available.
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT getBufDescIdx(
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_BufDesc         *pBufDesc,
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_BufferIdentifier identifier
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project)
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i, idx = -1;
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<pBufDesc->numBufs; i++) {
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (AACENC_BufferIdentifier)pBufDesc->bufferIdentifiers[i] == identifier ) {
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        idx = i;
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return idx;
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/****************************************************************************
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          Function Declarations
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR aacEncDefaultConfig(HANDLE_AACENC_CONFIG hAacConfig,
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      USER_PARAM *config)
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* make reasonable default settings */
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKaacEnc_AacInitDefaultConfig (hAacConfig);
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
548dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    /* clear configuration structure and copy default settings */
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(config, sizeof(USER_PARAM));
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* copy encoder configuration settings */
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->nChannels       = hAacConfig->nChannels;
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userAOT = hAacConfig->audioObjectType = AOT_AAC_LC;
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userSamplerate  = hAacConfig->sampleRate;
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userChannelMode = hAacConfig->channelMode;
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userBitrate     = hAacConfig->bitRate;
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userBitrateMode = hAacConfig->bitrateMode;
558e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    config->userPeakBitrate = (UINT)-1;
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userBandwidth   = hAacConfig->bandWidth;
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTns         = hAacConfig->useTns;
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userPns         = hAacConfig->usePns;
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userIntensity   = hAacConfig->useIS;
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userAfterburner = hAacConfig->useRequant;
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userFramelength = (UINT)-1;
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacConfig->syntaxFlags & AC_ER_VCB11) {
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      config->userErTools  |= 0x01;
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacConfig->syntaxFlags & AC_ER_HCR) {
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      config->userErTools  |= 0x02;
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* initialize transport parameters */
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpType         = TT_UNKNOWN;
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpAmxv         = 0;
576dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    config->userTpSignaling    = 0xFF;    /* choose signaling automatically */
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpNsubFrames   = 1;
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpProtection   = 0;    /* not crc protected*/
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpHeaderPeriod = 0xFF; /* header period in auto mode */
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userPceAdditions   = 0;    /* no matrix mixdown coefficient */
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userMetaDataMode   = 0;    /* do not embed any meta data info */
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userAncDataRate    = 0;
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5853aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    /* SBR rate is set to 0 here, which means it should be set automatically
5863aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi       in FDKaacEnc_AdjustEncSettings() if the user did not set a rate
5873aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi       expilicitely. */
5883aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    config->userSbrRatio = 0;
5893aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
5903aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    /* SBR enable set to -1 means to inquire ELD audio configurator for reasonable configuration. */
5913aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    config->userSbrEnabled     = -1;
5923aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_OK;
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid aacEncDistributeSbrBits(CHANNEL_MAPPING *channelMapping, SBR_ELEMENT_INFO *sbrElInfo, INT bitRate)
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT codebits = bitRate;
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int el;
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Copy Element info */
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (el=0; el<channelMapping->nElements; el++) {
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].ChannelIndex[0] = channelMapping->elInfo[el].ChannelIndex[0];
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].ChannelIndex[1] = channelMapping->elInfo[el].ChannelIndex[1];
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].elType          = channelMapping->elInfo[el].elType;
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].bitRate         = (INT)(fMultNorm(channelMapping->elInfo[el].relativeBits, (FIXP_DBL)bitRate));
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].instanceTag     = channelMapping->elInfo[el].instanceTag;
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].nChannelsInEl   = channelMapping->elInfo[el].nChannelsInEl;
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      codebits -= sbrElInfo[el].bitRate;
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrElInfo[0].bitRate += codebits;
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT aacEncoder_LimitBitrate(
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_TRANSPORTENC hTpEnc,
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT samplingRate,
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT frameLength,
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT nChannels,
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const CHANNEL_MODE channelMode,
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT bitRate,
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT nSubFrames,
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT sbrActive,
6273aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        const INT sbrDownSampleRate,
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AUDIO_OBJECT_TYPE aot
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT coreSamplingRate;
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CHANNEL_MAPPING cm;
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_InitChannelMapping(channelMode, CH_ORDER_MPEG, &cm);
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sbrActive) {
6373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    coreSamplingRate = samplingRate >>  (sbrEncoder_IsSingleRatePossible(aot) ? (sbrDownSampleRate-1):1);
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    coreSamplingRate = samplingRate;
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Consider bandwidth channel bit rate limit (see bandwidth.cpp: GetBandwidthEntry()) */
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) {
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitRate = FDKmin(360000*nChannels, bitRate);
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitRate = FDKmax(8000*nChannels, bitRate);
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS)  {
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitRate = FDKmin(576000*nChannels, bitRate);
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*bitRate = FDKmax(0*nChannels, bitRate);*/
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
652577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Limit bit rate in respect to the core coder */
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bitRate = FDKaacEnc_LimitBitrate(
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hTpEnc,
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          coreSamplingRate,
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          frameLength,
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          nChannels,
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          cm.nChannelsEff,
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitRate,
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          -1,
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          NULL,
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          -1,
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          nSubFrames
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          );
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Limit bit rate in respect to available SBR modes if active */
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sbrActive)
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6713c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi    int numIterations = 0;
6723c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi    INT initialBitrate, adjustedBitrate;
6733c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi    initialBitrate = adjustedBitrate = bitRate;
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6753c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi    /* Find total bitrate which provides valid configuration for each SBR element. */
6763c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi    do {
6773c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi      int e;
678fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi      SBR_ELEMENT_INFO sbrElInfo[(8)];
679fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi      FDK_ASSERT(cm.nElements <= (8));
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6813c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi      initialBitrate = adjustedBitrate;
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6833c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi      /* Get bit rate for each SBR element */
6843c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi      aacEncDistributeSbrBits(&cm, sbrElInfo, initialBitrate);
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6863c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi      for (e=0; e<cm.nElements; e++)
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
6883c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        INT sbrElementBitRateIn, sbrBitRateOut;
6893c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
6903c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        if (cm.elInfo[e].elType != ID_SCE && cm.elInfo[e].elType != ID_CPE) {
6913c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi          continue;
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6933c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        sbrElementBitRateIn = sbrElInfo[e].bitRate;
6943c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        sbrBitRateOut = sbrEncoder_LimitBitRate(sbrElementBitRateIn , cm.elInfo[e].nChannelsInEl, coreSamplingRate, aot);
6953c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        if (sbrBitRateOut == 0) {
6963c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi          return 0;
6973c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        }
6983c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
6993c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        /* If bitrates don't match, distribution and limiting needs to be determined again.
7003c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi           Abort element loop and restart with adapted bitrate. */
7013c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        if (sbrElementBitRateIn != sbrBitRateOut) {
7023c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
7033c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi          if (sbrElementBitRateIn < sbrBitRateOut) {
7043c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi            adjustedBitrate = fMax(initialBitrate, (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut+8), cm.elInfo[e].relativeBits));
7053c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi            break;
7063c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi          }
7073c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
7083c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi          if (sbrElementBitRateIn > sbrBitRateOut) {
7093c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi            adjustedBitrate = fMin(initialBitrate, (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut-8), cm.elInfo[e].relativeBits));
7103c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi            break;
7113c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi          }
7123c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
7133c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        } /* sbrElementBitRateIn != sbrBitRateOut */
7143c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
7153c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi      } /* elements */
7163c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
7173c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi      numIterations++; /* restrict iteration to worst case of num elements */
7183c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
7193c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi    } while ( (initialBitrate!=adjustedBitrate) && (numIterations<=cm.nElements) );
7203c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
7213c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi    /* Unequal bitrates mean that no reasonable bitrate configuration found. */
7223c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi    bitRate = (initialBitrate==adjustedBitrate) ? adjustedBitrate : 0;
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_ASSERT(bitRate > 0);
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return bitRate;
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief Consistency check of given USER_PARAM struct and
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *   copy back configuration from public struct into internal
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *   encoder configuration struct.
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \hAacEncoder Internal encoder config which is to be updated
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param config User provided config (public struct)
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return �returns always AAC_ENC_OK
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder,
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         USER_PARAM *config)
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Get struct pointers. */
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AACENC_CONFIG    hAacConfig = &hAacEncoder->aacConfig;
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->nChannels       = config->nChannels;
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Encoder settings update. */
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->sampleRate      = config->userSamplerate;
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->useTns          = config->userTns;
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->usePns          = config->userPns;
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->useIS           = config->userIntensity;
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->bitRate         = config->userBitrate;
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->channelMode     = config->userChannelMode;
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->bitrateMode     = config->userBitrateMode;
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->bandWidth       = config->userBandwidth;
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->useRequant      = config->userAfterburner;
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->audioObjectType = config->userAOT;
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->anc_Rate        = config->userAncDataRate;
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->syntaxFlags     = 0;
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->epConfig        = -1;
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
766e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    if (config->userTpType==TT_MP4_LATM_MCP1 || config->userTpType==TT_MP4_LATM_MCP0 || config->userTpType==TT_MP4_LOAS) {
767e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      hAacConfig->audioMuxVersion = config->userTpAmxv;
768e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    }
769e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    else {
770e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      hAacConfig->audioMuxVersion = -1;
771e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    }
772e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Adapt internal AOT when necessary. */
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch ( hAacConfig->audioObjectType ) {
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_AAC_LC:
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_SBR:
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_PS:
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_ADTS;
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 1024;
780577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi          if (hAacConfig->framelength != 1024) {
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INVALID_CONFIG;
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_ER_AAC_LD:
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->epConfig = 0;
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= AC_ER|AC_LD;
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0);
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0);
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0);
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS;
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512;
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) {
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INVALID_CONFIG;
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_ER_AAC_ELD:
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->epConfig = 0;
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= AC_ER|AC_ELD;
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0);
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0);
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0);
802dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi          hAacConfig->syntaxFlags |= ((config->userSbrEnabled==1)  ? AC_SBR_PRESENT : 0);
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS;
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512;
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) {
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INVALID_CONFIG;
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch ( hAacConfig->audioObjectType ) {
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_ER_AAC_LD:
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_ER_AAC_ELD:
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (config->userBitrateMode==0) {
81746ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi          /* bitreservoir  = (maxBitRes-minBitRes)/(maxBitRate-minBitrate)*(bitRate-minBitrate)+minBitRes; */
81846ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi          if ( isLowDelay(hAacConfig->audioObjectType) ) {
81946ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi            INT bitreservoir;
82046ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi            INT brPerChannel = hAacConfig->bitRate/hAacConfig->nChannels;
82146ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi            brPerChannel     = fMin(BITRATE_MAX_LD, fMax(BITRATE_MIN_LD, brPerChannel));
82246ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi            FIXP_DBL slope   = fDivNorm((brPerChannel-BITRATE_MIN_LD), BITRATE_MAX_LD-BITRATE_MIN_LD); /* calc slope for interpolation */
82346ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi            bitreservoir     = fMultI(slope, (INT)(BITRES_MAX_LD-BITRES_MIN_LD)) + BITRES_MIN_LD; /* interpolate */
82446ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi            hAacConfig->bitreservoir = bitreservoir & ~7; /* align to bytes */
82546ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi          }
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacConfig->bitrateMode!=0) {
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return AACENC_INVALID_CONFIG;
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8353aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    hAacConfig->bitRate = config->userBitrate;
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* get bitrate in VBR configuration */
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5) ) {
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode. */
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacConfig->bitRate = FDKaacEnc_GetVBRBitrate(hAacConfig->bitrateMode, hAacConfig->channelMode);
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Set default bitrate if no external bitrate declared. */
8463aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if ( (hAacConfig->bitrateMode==0) && (config->userBitrate==(UINT)-1) ) {
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT bitrate = FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff * hAacConfig->sampleRate;
8483aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
8493aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        if ( isPsActive(hAacConfig->audioObjectType) ) {
8503aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          hAacConfig->bitRate = (bitrate>>1);                  /* 0.5 bit per sample */
8513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        }
8523aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        else if ( isSbrActive(hAacConfig) )
8533aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        {
8543aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          if ( (config->userSbrRatio==2) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType!=AOT_ER_AAC_ELD)) ) {
8553aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            hAacConfig->bitRate = (bitrate + (bitrate>>2))>>1; /* 0.625 bits per sample */
8563aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          }
8573aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          if ( (config->userSbrRatio==1) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType==AOT_ER_AAC_ELD)) ) {
8583aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            hAacConfig->bitRate = (bitrate + (bitrate>>3));    /* 1.125 bits per sample */
8593aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          }
8603aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        } else
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacConfig->bitRate = bitrate + (bitrate>>1);        /* 1.5 bits per sample */
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
866e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    if ((hAacConfig->bitrateMode >= 0) && (hAacConfig->bitrateMode <= 5)) {
867e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      if ((INT)config->userPeakBitrate != -1) {
868e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        hAacConfig->maxBitsPerFrame = (FDKaacEnc_CalcBitsPerFrame(fMax(hAacConfig->bitRate, (INT)config->userPeakBitrate), hAacConfig->framelength, hAacConfig->sampleRate) + 7)&~7;
869e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      }
870e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      else {
871e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        hAacConfig->maxBitsPerFrame = -1;
872e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      }
873e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      if (hAacConfig->audioMuxVersion==2) {
874e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        hAacConfig->minBitsPerFrame = fMin(32*8, FDKaacEnc_CalcBitsPerFrame(hAacConfig->bitRate, hAacConfig->framelength, hAacConfig->sampleRate))&~7;
875e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      }
876e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    }
877e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi
8783aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    /* Initialize SBR parameters */
8799f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    if ( (hAacConfig->audioObjectType==AOT_ER_AAC_ELD)
8809f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      && (config->userSbrEnabled == (UCHAR)-1) && (config->userSbrRatio==0) )
8819f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    {
8829f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      UINT eldSbr = 0;
8839f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      UINT eldSbrRatio = 0;
8849f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
8859f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      if ( AACENC_OK!=(err=eldSbrConfigurator(
8869f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi            hAacConfig->sampleRate,
8879f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi            hAacConfig->channelMode,
8889f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi            hAacConfig->bitRate,
8899f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi           &eldSbr,
8909f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi           &eldSbrRatio)) )
8919f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      {
8929f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi        return err;
8939f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      }
8949f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi
8959f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      hAacConfig->syntaxFlags |= ((eldSbr) ? AC_SBR_PRESENT : 0);
8969f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi      hAacConfig->sbrRatio = eldSbrRatio;
8979f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    }
8989f455bea1c38f7275a65ab79be2d41a34428fb8bJean-Michel Trivi    else
8993aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if ( (config->userSbrRatio==0) && (isSbrActive(hAacConfig)) ) {
9003aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      /* Automatic SBR ratio configuration
9013aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi       * - downsampled SBR for ELD
9023aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi       * - otherwise always dualrate SBR
9033aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi       */
9043aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        hAacConfig->sbrRatio = (hAacConfig->audioObjectType==AOT_ER_AAC_ELD) ? 1 : 2;
9053aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    }
9063aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    else {
9073aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      /* SBR ratio has been set by the user, so use it. */
908ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi      hAacConfig->sbrRatio = isSbrActive(hAacConfig) ? config->userSbrRatio : 0;
9093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    }
910dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
911dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    {
912dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      UCHAR tpSignaling=getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio);
913dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
914dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) &&
915dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi           (config->userTpType==TT_MP4_LATM_MCP1 || config->userTpType==TT_MP4_LATM_MCP0 || config->userTpType==TT_MP4_LOAS) &&
916dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi           (tpSignaling==1) && (config->userTpAmxv==0) ) {
917dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi             /* For backward compatible explicit signaling, AMV1 has to be active */
918dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi             return AACENC_INVALID_CONFIG;
919dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      }
920dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
921dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) &&
922dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi           (tpSignaling==0) && (hAacConfig->sbrRatio==1)) {
923dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi             /* Downsampled SBR has to be signaled explicitely (for transmission of SBR sampling fequency) */
924dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi             return AACENC_INVALID_CONFIG;
925dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi      }
926dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi    }
927dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
928dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
929dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi
9303aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    /* We need the frame length to call aacEncoder_LimitBitrate() */
9313aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    hAacConfig->bitRate = aacEncoder_LimitBitrate(
9323aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              NULL,
9333aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              hAacConfig->sampleRate,
9343aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              hAacConfig->framelength,
9353aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              hAacConfig->nChannels,
9363aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              hAacConfig->channelMode,
9373aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              hAacConfig->bitRate,
9383aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              hAacConfig->nSubFrames,
9393aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              isSbrActive(hAacConfig),
9403aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              hAacConfig->sbrRatio,
9413aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              hAacConfig->audioObjectType
9423aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              );
9433aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Configure PNS */
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( ((hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5)) /* VBR without PNS. */
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        || (hAacConfig->useTns == 0) )                                  /* TNS required. */
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacConfig->usePns = 0;
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9513aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if (hAacConfig->epConfig >= 0) {
9523aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        hAacConfig->syntaxFlags |= AC_ER;
9533aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi         if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) {
9543aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi           return AACENC_INVALID_CONFIG;        /* Cannel config 0 not supported. */
9553aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi         }
9563aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    }
9573aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
9583aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if ( FDKaacEnc_DetermineEncoderMode(&hAacConfig->channelMode, hAacConfig->nChannels) != AAC_ENC_OK) {
9593aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        return AACENC_INVALID_CONFIG;        /* nChannels doesn't match chMode, this is just a check-up */
9603aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    }
9613aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
9623aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    if ( (hAacConfig->nChannels > hAacEncoder->nMaxAacChannels)
9633aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi      || ( (FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff > hAacEncoder->nMaxSbrChannels) &&
9643aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            isSbrActive(hAacConfig) )
9653aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi         )
9663aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    {
9673aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        return AACENC_INVALID_CONFIG;      /* not enough channels allocated */
9683aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    }
9693aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Meta data restriction. */
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (hAacConfig->audioObjectType)
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Allow metadata support */
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_AAC_LC:
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_SBR:
97616c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi      case AOT_PS:
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->metaDataAllowed = 1;
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) {
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->userMetaDataMode = 0;
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Prohibit metadata support */
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->metaDataAllowed = 0;
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT aacenc_SbrCallback(
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        void *                  self,
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_BITSTREAM    hBs,
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT sampleRateIn,
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT sampleRateOut,
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT samplesPerFrame,
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AUDIO_OBJECT_TYPE coreCodec,
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const MP4_ELEMENT_ID    elementID,
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT               elementIndex
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self;
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrEncoder_GetHeader(hAacEncoder->hEnvEnc, hBs, elementIndex, 0);
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AACENC_ERROR aacEncInit(HANDLE_AACENCODER  hAacEncoder,
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               ULONG              InitFlags,
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               USER_PARAM        *config)
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT aacBufferOffset = 0;
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_SBR_ENCODER     *hSbrEncoder = &hAacEncoder->hEnvEnc;
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AACENC_CONFIG    hAacConfig  = &hAacEncoder->aacConfig;
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->nZerosAppended = 0;          /* count appended zeros */
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT frameLength = hAacConfig->framelength;
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_CONFIG) )
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CHANNEL_MODE prevChMode = hAacConfig->channelMode;
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Verify settings and update: config -> heAacEncoder */
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (err=FDKaacEnc_AdjustEncSettings(hAacEncoder, config)) != AACENC_OK ) {
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return err;
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        frameLength = hAacConfig->framelength; /* adapt temporal framelength */
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Seamless channel reconfiguration in sbr not fully implemented */
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (prevChMode!=hAacConfig->channelMode) && isSbrActive(hAacConfig) ) {
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            InitFlags |= AACENC_INIT_STATES;
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Clear input buffer */
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags == AACENC_INIT_ALL) ) {
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(hAacEncoder->inputBuffer, sizeof(INT_PCM)*hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE);
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_CONFIG) )
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        aacBufferOffset = 0;
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) {
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nDelay = DELAY_AACELD(hAacConfig->framelength);
10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } else
10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nDelay = DELAY_AAC(hAacConfig->framelength); /* AAC encoder delay */
10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacConfig->ancDataBitRate = 0;
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( isSbrActive(hAacConfig) &&
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES)) )
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT sbrError;
1060fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi        SBR_ELEMENT_INFO sbrElInfo[(8)];
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CHANNEL_MAPPING channelMapping;
10623c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( FDKaacEnc_InitChannelMapping(hAacConfig->channelMode,
10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          hAacConfig->channelOrder,
10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         &channelMapping) != AAC_ENC_OK )
10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_ERROR;
10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Check return value and if the SBR encoder can handle enough elements */
1071fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi        if (channelMapping.nElements > (8)) {
10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_ERROR;
10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        aacEncDistributeSbrBits(&channelMapping, sbrElInfo, hAacConfig->bitRate);
10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UINT initFlag = 0;
10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        initFlag += (InitFlags & AACENC_INIT_STATES) ? 1 : 0;
10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Let the SBR encoder take a look at the configuration and change if required. */
10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrError = sbrEncoder_Init(
10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                *hSbrEncoder,
10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 sbrElInfo,
10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 channelMapping.nElements,
10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 hAacEncoder->inputBuffer,
10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hAacConfig->bandWidth,
10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &aacBufferOffset,
10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hAacConfig->nChannels,
10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hAacConfig->sampleRate,
10903aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                &hAacConfig->sbrRatio,
10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &frameLength,
10923aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi                                 hAacConfig->audioObjectType,
10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hAacEncoder->nDelay,
10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) ? 1 : TRANS_FAC,
1095a84864deb7c36b88f104f3116552d52d1ce64045Jean-Michel Trivi                                 (config->userTpHeaderPeriod!=0xFF) ? config->userTpHeaderPeriod : DEFAULT_HEADER_PERIOD_REPETITION_RATE,
10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 initFlag
10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                );
10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Suppress AOT reconfiguration and check error status. */
11003aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        if (sbrError) {
11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_SBR_ERROR;
11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacConfig->nChannels == 1) {
11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacConfig->channelMode = MODE_1;
11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Never use PNS if SBR is active */
11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( hAacConfig->usePns ) {
11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           hAacConfig->usePns = 0;
11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* estimated bitrate consumed by SBR or PS */
11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacConfig->ancDataBitRate = sbrEncoder_GetEstimateBitrate(*hSbrEncoder) ;
11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* sbr initialization */
11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Initialize Transport - Module.
11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_TRANSPORT) )
11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UINT flags = 0;
11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1126dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        FDKaacEnc_MapConfig(
1127dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi                &hAacEncoder->coderConfig,
1128dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi                config,
1129dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi                getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio),
1130dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi                hAacConfig);
11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* create flags for transport encoder */
1133e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        if (config->userTpAmxv != 0) {
11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            flags |= TP_FLAG_LATM_AMV;
11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Clear output buffer */
11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes*sizeof(UCHAR));
11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Initialize Bitstream encoder */
11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( transportEnc_Init(hAacEncoder->hTpEnc, hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes, config->userTpType, &hAacEncoder->coderConfig, flags) != 0) {
11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_TP_ERROR;
11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* transport initialization */
11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Initialize AAC - Core.
11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_CONFIG) ||
11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         (InitFlags & AACENC_INIT_STATES) )
11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AAC_ENCODER_ERROR err;
11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = FDKaacEnc_Initialize(hAacEncoder->hAacEnc,
11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacConfig,
11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->hTpEnc,
11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   (InitFlags & AACENC_INIT_STATES) ? 1 : 0);
11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (err != AAC_ENC_OK) {
11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_AAC_ERROR;
11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* aac initialization */
11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Initialize Meta Data - Encoder.
11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( hAacEncoder->hMetadataEnc && (hAacEncoder->metaDataAllowed!=0) &&
11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ((InitFlags & AACENC_INIT_CONFIG) ||(InitFlags & AACENC_INIT_STATES)) )
11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT inputDataDelay = DELAY_AAC(hAacConfig->framelength);
11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( isSbrActive(hAacConfig) && hSbrEncoder!=NULL) {
11733aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi          inputDataDelay = hAacConfig->sbrRatio*inputDataDelay + sbrEncoder_GetInputDataDelay(*hSbrEncoder);
11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( FDK_MetadataEnc_Init(hAacEncoder->hMetadataEnc,
11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 ((InitFlags&AACENC_INIT_STATES) ? 1 : 0),
11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  config->userMetaDataMode,
11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  inputDataDelay,
11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  frameLength,
11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  config->userSamplerate,
11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  config->nChannels,
11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  config->userChannelMode,
11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  hAacConfig->channelOrder) != 0)
11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_META_ERROR;
11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nDelay += FDK_MetadataEnc_GetDelay(hAacEncoder->hMetadataEnc);
11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Update pointer to working buffer.
11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_CONFIG) )
11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->inputBufferOffset = aacBufferOffset;
11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nSamplesToRead = frameLength * config->nChannels;
12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Make nDelay comparison compatible with config->nSamplesRead */
12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nDelay *= config->nChannels;
12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* parameter changed */
12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AACENC_OK;
12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncOpen(
12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AACENCODER        *phAacEncoder,
12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT                encModules,
12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT                maxChannels
12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AACENCODER  hAacEncoder = NULL;
12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (phAacEncoder == NULL) {
12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INVALID_HANDLE;
12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* allocate memory */
12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder = Get_AacEncoder();
12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder == NULL) {
12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_MEMORY_ERROR;
12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hAacEncoder, sizeof(AACENCODER));
12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Specify encoder modules to be allocated. */
12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (encModules==0) {
12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis = ENC_MODE_FLAG_AAC;
12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis |= ENC_MODE_FLAG_SBR;
12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis |= ENC_MODE_FLAG_PS;
12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis |= ENC_MODE_FLAG_META;
12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* consider SAC and PS module */
12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis = encModules;
12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Determine max channel configuration. */
12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (maxChannels==0) {
1248fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi        hAacEncoder->nMaxAacChannels = (8);
1249fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi        hAacEncoder->nMaxSbrChannels = (8);
12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nMaxAacChannels = (maxChannels&0x00FF);
12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) ) {
12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nMaxSbrChannels = (maxChannels&0xFF00) ? (maxChannels>>8) : hAacEncoder->nMaxAacChannels;
12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1257fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi        if ( (hAacEncoder->nMaxAacChannels>(8)) || (hAacEncoder->nMaxSbrChannels>(8)) ) {
12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            err = AACENC_INVALID_CONFIG;
12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* maxChannels==0 */
12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Max number of elements could be tuned any more. */
1264fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi    hAacEncoder->nMaxAacElements = fixMin((8), hAacEncoder->nMaxAacChannels);
1265fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi    hAacEncoder->nMaxSbrElements = fixMin((8), hAacEncoder->nMaxSbrChannels);
12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->nMaxSubFrames = (1);
12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* In case of memory overlay, allocate memory out of libraries */
12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->inputBuffer = (INT_PCM*)FDKcalloc(hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE, sizeof(INT_PCM));
12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Open SBR Encoder */
12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) {
12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( sbrEncoder_Open(&hAacEncoder->hEnvEnc,
12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              hAacEncoder->nMaxSbrElements,
12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              hAacEncoder->nMaxSbrChannels,
12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             (hAacEncoder->encoder_modis&ENC_MODE_FLAG_PS) ? 1 : 0 ) )
12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = AACENC_MEMORY_ERROR;
12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          goto bail;
12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* (encoder_modis&ENC_MODE_FLAG_SBR) */
12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Open Aac Encoder */
12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( FDKaacEnc_Open(&hAacEncoder->hAacEnc,
12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hAacEncoder->nMaxAacElements,
12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hAacEncoder->nMaxAacChannels,
12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         (1)) != AAC_ENC_OK )
12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_MEMORY_ERROR;
12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    { /* Get bitstream outputbuffer size */
12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      UINT ld_M;
12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ld_M=1; (UINT)(1<<ld_M) < (hAacEncoder->nMaxSubFrames*hAacEncoder->nMaxAacChannels*6144)>>3; ld_M++) ;
12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hAacEncoder->outBufferInBytes = (1<<ld_M);  /* buffer has to be 2^n */
13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->outBuffer = GetRam_bsOutbuffer();
13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (OUTPUTBUFFER_SIZE < hAacEncoder->outBufferInBytes ) {
13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = AACENC_MEMORY_ERROR;
13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Open Meta Data Encoder */
13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_META) {
13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( FDK_MetadataEnc_Open(&hAacEncoder->hMetadataEnc) )
13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_MEMORY_ERROR;
13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* (encoder_modis&ENC_MODE_FLAG_META) */
13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Open Transport Encoder */
13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( transportEnc_Open(&hAacEncoder->hTpEnc) != 0 )
13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_MEMORY_ERROR;
13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
13233c59acf1280ed5cbbf45a53743ea0ff635568769Jean-Michel Trivi        C_ALLOC_SCRATCH_START(pLibInfo, LIB_INFO, FDK_MODULE_LAST);
13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKinitLibInfo( pLibInfo);
13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        transportEnc_GetLibInfo( pLibInfo );
13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Get capabilty flag for transport encoder. */
13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->CAPF_tpEnc = FDKlibInfo_getCapabilities( pLibInfo, FDK_TPENC);
13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        C_ALLOC_SCRATCH_END(pLibInfo, LIB_INFO, FDK_MODULE_LAST);
13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( transportEnc_RegisterSbrCallback(hAacEncoder->hTpEnc, aacenc_SbrCallback, hAacEncoder) != 0 ) {
13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = AACENC_INIT_TP_ERROR;
13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Initialize encoder instance with default parameters. */
13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacEncDefaultConfig(&hAacEncoder->aacConfig, &hAacEncoder->extParam);
13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Initialize headerPeriod in coderConfig for aacEncoder_GetParam(). */
13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->coderConfig.headerPeriod = hAacEncoder->extParam.userTpHeaderPeriod;
13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* All encoder modules have to be initialized */
13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->InitFlags = AACENC_INIT_ALL;
13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Return encoder instance */
13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *phAacEncoder = hAacEncoder;
13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacEncClose(&hAacEncoder);
13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncClose(HANDLE_AACENCODER *phAacEncoder)
13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (phAacEncoder == NULL) {
13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INVALID_HANDLE;
13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (*phAacEncoder != NULL) {
13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AACENCODER hAacEncoder = *phAacEncoder;
13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (hAacEncoder->inputBuffer!=NULL) {
13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           FDKfree(hAacEncoder->inputBuffer);
13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           hAacEncoder->inputBuffer = NULL;
13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (hAacEncoder->outBuffer) {
13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FreeRam_bsOutbuffer(&hAacEncoder->outBuffer);
13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->hEnvEnc) {
13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sbrEncoder_Close (&hAacEncoder->hEnvEnc);
13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->hAacEnc) {
13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDKaacEnc_Close (&hAacEncoder->hAacEnc);
13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        transportEnc_Close(&hAacEncoder->hTpEnc);
13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->hMetadataEnc) {
13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDK_MetadataEnc_Close (&hAacEncoder->hMetadataEnc);
13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        Free_AacEncoder(phAacEncoder);
13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncEncode(
14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_AACENCODER   hAacEncoder,
14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_BufDesc     *inBufDesc,
14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_BufDesc     *outBufDesc,
14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_InArgs      *inargs,
14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACENC_OutArgs           *outargs
14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i, nBsBytes = 0;
14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT  outBytes[(1)];
14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int  nExtensions = 0;
14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int  ancDataExtIdx = -1;
14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* deal with valid encoder handle */
14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder==NULL) {
14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INVALID_HANDLE;
14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Adjust user settings and trigger reinitialization.
14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder->InitFlags!=0) {
14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = aacEncInit(hAacEncoder,
14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hAacEncoder->InitFlags,
14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        &hAacEncoder->extParam);
14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (err!=AACENC_OK) {
14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* keep init flags alive! */
14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->InitFlags = AACENC_INIT_NONE;
14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (outargs!=NULL) {
14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(outargs, sizeof(AACENC_OutArgs));
14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (outBufDesc!=NULL) {
14442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i=0; i<outBufDesc->numBufs; i++) {
14452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (outBufDesc->bufs[i]!=NULL) {
14462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKmemclear(outBufDesc->bufs[i], outBufDesc->bufSizes[i]);
14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
14492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
14522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * If only encoder handle given, independent (re)initialization can be triggered.
14532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
14542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hAacEncoder!=NULL) & (inBufDesc==NULL) && (outBufDesc==NULL) && (inargs==NULL) && (outargs==NULL) ) {
14552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* reset buffer wich signals number of valid bytes in output bitstream buffer */
14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(outBytes, hAacEncoder->aacConfig.nSubFrames*sizeof(INT));
14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Manage incoming audio samples.
14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (inargs->numInSamples > 0) && (getBufDescIdx(inBufDesc,IN_AUDIO_DATA) != -1) )
14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Fetch data until nSamplesToRead reached */
14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT idx = getBufDescIdx(inBufDesc,IN_AUDIO_DATA);
14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT newSamples = fixMax(0,fixMin(inargs->numInSamples, hAacEncoder->nSamplesToRead-hAacEncoder->nSamplesRead));
14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT_PCM *pIn = hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead;
14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Copy new input samples to internal buffer */
14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (inBufDesc->bufElSizes[idx]==(INT)sizeof(INT_PCM)) {
14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDKmemcpy(pIn, (INT_PCM*)inBufDesc->bufs[idx], newSamples*sizeof(INT_PCM));  /* Fast copy. */
14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else if (inBufDesc->bufElSizes[idx]>(INT)sizeof(INT_PCM)) {
14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (i=0; i<newSamples; i++) {
14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                pIn[i] = (INT_PCM)(((LONG*)inBufDesc->bufs[idx])[i]>>16);                /* Convert 32 to 16 bit. */
14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (i=0; i<newSamples; i++) {
14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                pIn[i] = ((INT_PCM)(((SHORT*)inBufDesc->bufs[idx])[i]))<<16;             /* Convert 16 to 32 bit. */
14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nSamplesRead += newSamples;
14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Number of fetched input buffer samples. */
14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        outargs->numInSamples = newSamples;
14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* input buffer completely filled ? */
14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder->nSamplesRead < hAacEncoder->nSamplesToRead)
14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* - eof reached and flushing enabled, or
14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           - return to main and wait for further incoming audio samples */
14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (inargs->numInSamples==-1)
14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( (hAacEncoder->nZerosAppended < hAacEncoder->nDelay)
14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                )
15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              int nZeros = hAacEncoder->nSamplesToRead - hAacEncoder->nSamplesRead;
15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              FDK_ASSERT(nZeros >= 0);
15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* clear out until end-of-buffer */
15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (nZeros) {
15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                FDKmemclear(hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead, sizeof(INT_PCM)*nZeros );
15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacEncoder->nZerosAppended += nZeros;
15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacEncoder->nSamplesRead = hAacEncoder->nSamplesToRead;
15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else { /* flushing completed */
15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              err = AACENC_ENCODE_EOF; /* eof reached */
15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              goto bail;
15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else { /* inargs->numInSamples!= -1 */
15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail; /* not enough samples in input buffer and no flushing enabled */
15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* init payload */
15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hAacEncoder->extPayload, sizeof(AACENC_EXT_PAYLOAD) * MAX_TOTAL_EXT_PAYLOADS);
15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i = 0; i < MAX_TOTAL_EXT_PAYLOADS; i++) {
15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hAacEncoder->extPayload[i].associatedChElement = -1;
15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hAacEncoder->extPayloadData, sizeof(hAacEncoder->extPayloadData));
15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hAacEncoder->extPayloadSize, sizeof(hAacEncoder->extPayloadSize));
15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Calculate Meta Data info.
15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hAacEncoder->hMetadataEnc!=NULL) && (hAacEncoder->metaDataAllowed!=0) ) {
15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_MetaData *pMetaData = NULL;
15372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACENC_EXT_PAYLOAD *pMetaDataExtPayload = NULL;
15382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UINT nMetaDataExtensions = 0;
15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT  matrix_mixdown_idx = 0;
15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* New meta data info available ? */
15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( getBufDescIdx(inBufDesc,IN_METADATA_SETUP) != -1 ) {
15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pMetaData = (AACENC_MetaData*)inBufDesc->bufs[getBufDescIdx(inBufDesc,IN_METADATA_SETUP)];
15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDK_MetadataEnc_Process(hAacEncoder->hMetadataEnc,
15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset,
15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->nSamplesRead,
15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                pMetaData,
15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               &pMetaDataExtPayload,
15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               &nMetaDataExtensions,
15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               &matrix_mixdown_idx
15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                );
15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i=0; i<(INT)nMetaDataExtensions; i++) {  /* Get meta data extension payload. */
15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->extPayload[nExtensions++] = pMetaDataExtPayload[i];
15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
155816c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi
155916c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi        if ( (matrix_mixdown_idx!=-1)
156016c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi          && ((hAacEncoder->extParam.userChannelMode==MODE_1_2_2)||(hAacEncoder->extParam.userChannelMode==MODE_1_2_2_1)) )
156116c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi        {
156216c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi          /* Set matrix mixdown coefficient. */
1563e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi          UINT pceValue = (UINT)( (0<<3) | ((matrix_mixdown_idx&0x3)<<1) | 1 );
15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (hAacEncoder->extParam.userPceAdditions != pceValue) {
15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->extParam.userPceAdditions = pceValue;
15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( isSbrActive(&hAacEncoder->aacConfig) ) {
15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT nPayload = 0;
15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*
15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         * Encode SBR data.
15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         */
15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (sbrEncoder_EncodeFrame(hAacEncoder->hEnvEnc,
15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->inputBuffer,
15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->extParam.nChannels,
15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->extPayloadSize[nPayload],
15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->extPayloadData[nPayload]
15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if defined(EVAL_PACKAGE_SILENCE) || defined(EVAL_PACKAGE_SBR_SILENCE)
15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  ,hAacEncoder->hAacEnc->clearOutput
15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  ))
15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            err = AACENC_ENCODE_ERROR;
15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* Add SBR extension payload */
1594fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi            for (i = 0; i < (8); i++) {
15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (hAacEncoder->extPayloadSize[nPayload][i] > 0) {
15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hAacEncoder->extPayload[nExtensions].pData    = hAacEncoder->extPayloadData[nPayload][i];
15972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    {
15982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      hAacEncoder->extPayload[nExtensions].dataSize = hAacEncoder->extPayloadSize[nPayload][i];
15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      hAacEncoder->extPayload[nExtensions].associatedChElement = i;
16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hAacEncoder->extPayload[nExtensions].dataType = EXT_SBR_DATA;  /* Once SBR Encoder supports SBR CRC set EXT_SBR_DATA_CRC */
16022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    nExtensions++;                                                 /* or EXT_SBR_DATA according to configuration. */
16032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    FDK_ASSERT(nExtensions<=MAX_TOTAL_EXT_PAYLOADS);
16042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
16062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nPayload++;
16072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* sbrEnabled */
16092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (inargs->numAncBytes > 0) && ( getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA)!=-1 ) ) {
16112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT idx = getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA);
16122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->extPayload[nExtensions].dataSize = inargs->numAncBytes * 8;
16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->extPayload[nExtensions].pData    = (UCHAR*)inBufDesc->bufs[idx];
16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->extPayload[nExtensions].dataType = EXT_DATA_ELEMENT;
16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->extPayload[nExtensions].associatedChElement = -1;
16162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ancDataExtIdx = nExtensions; /* store index */
16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        nExtensions++;
16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Encode AAC - Core.
16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( FDKaacEnc_EncodeFrame( hAacEncoder->hAacEnc,
16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->hTpEnc,
16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->inputBuffer,
16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                outBytes,
16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->extPayload
16282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                ) != AAC_ENC_OK )
16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
16302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_ENCODE_ERROR;
16312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
16322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (ancDataExtIdx >= 0) {
16352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      outargs->numAncBytes = inargs->numAncBytes - (hAacEncoder->extPayload[ancDataExtIdx].dataSize>>3);
16362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* samples exhausted */
16392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->nSamplesRead -= hAacEncoder->nSamplesToRead;
16402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
16422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Delay balancing buffer handling
16432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
16442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (isSbrActive(&hAacEncoder->aacConfig)) {
16452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrEncoder_UpdateBuffers(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer);
16462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
16492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Make bitstream public
16502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
16512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (outBufDesc->numBufs>=1) {
16522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT bsIdx = getBufDescIdx(outBufDesc,OUT_BITSTREAM_DATA);
16542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT auIdx = getBufDescIdx(outBufDesc,OUT_AU_SIZES);
16552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i=0,nBsBytes=0; i<hAacEncoder->aacConfig.nSubFrames; i++) {
16572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          nBsBytes += outBytes[i];
16582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (auIdx!=-1) {
16602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           ((INT*)outBufDesc->bufs[auIdx])[i] = outBytes[i];
16612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
16622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (bsIdx!=-1) && (outBufDesc->bufSizes[bsIdx]>=nBsBytes) ) {
16652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKmemcpy(outBufDesc->bufs[bsIdx], hAacEncoder->outBuffer, sizeof(UCHAR)*nBsBytes);
16662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          outargs->numOutBytes = nBsBytes;
16672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
16692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* output buffer too small, can't write valid bitstream */
16702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = AACENC_ENCODE_ERROR;
16712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          goto bail;
16722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
16762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (err == AACENC_ENCODE_ERROR) {
16772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* All encoder modules have to be initialized */
16782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->InitFlags = AACENC_INIT_ALL;
16792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
16822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
16832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
16852228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR aacEncGetConf(HANDLE_AACENCODER  hAacEncoder,
16862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                UINT              *size,
16872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                UCHAR             *confBuffer)
16882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
16892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_BITSTREAM tmpConf;
16902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT confType;
16912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR buf[64];
16922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int err;
16932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Init bit buffer */
16952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKinitBitStream(&tmpConf, buf, 64, 0, BS_WRITER);
16962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* write conf in tmp buffer */
16982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    err = transportEnc_GetConf(hAacEncoder->hTpEnc, &hAacEncoder->coderConfig, &tmpConf, &confType);
16992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* copy data to outbuffer: length in bytes */
17012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKbyteAlign(&tmpConf, 0);
17022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Check buffer size */
17042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (FDKgetValidBits(&tmpConf) > ((*size)<<3))
17052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_UNKNOWN;
17062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKfetchBuffer(&tmpConf, confBuffer, size);
17082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (err != 0)
17102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_UNKNOWN;
17112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
17122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_OK;
17132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
17142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17162228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncGetLibInfo(LIB_INFO *info)
17172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
17182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i = 0;
17192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (info == NULL) {
17212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AACENC_INVALID_HANDLE;
17222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
17232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_toolsGetLibInfo( info );
17252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transportEnc_GetLibInfo( info );
17262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrEncoder_GetLibInfo( info );
17282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* search for next free tab */
17302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0; i < FDK_MODULE_LAST; i++) {
17312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (info[i].module_id == FDK_NONE) break;
17322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
17332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (i == FDK_MODULE_LAST) {
17342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AACENC_INIT_ERROR;
17352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
17362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].module_id = FDK_AACENC;
17382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].build_date = (char*)AACENCODER_LIB_BUILD_DATE;
17392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].build_time = (char*)AACENCODER_LIB_BUILD_TIME;
17402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].title = (char*)AACENCODER_LIB_TITLE;
17412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].version = LIB_VERSION(AACENCODER_LIB_VL0, AACENCODER_LIB_VL1, AACENCODER_LIB_VL2);;
17422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  LIB_VERSION_STRING(&info[i]);
17432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Capability flags */
17452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].flags = 0
17462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_AAC_1024 | CAPF_AAC_LC
17472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_AAC_512
17482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_AAC_480
17492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_AAC_DRC
17502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ;
17512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* End of flags */
17522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AACENC_OK;
17542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
17552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncoder_SetParam(
17572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_AACENCODER   hAacEncoder,
17582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_PARAM        param,
17592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT                value
17602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
17612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
17622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
17632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    USER_PARAM *settings = &hAacEncoder->extParam;
17642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* check encoder handle */
17662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder == NULL) {
17672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INVALID_HANDLE;
17682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
17692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
17702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* apply param value */
17722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (param)
17732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
17742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_AOT:
17752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userAOT != (AUDIO_OBJECT_TYPE)value) {
17762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* check if AOT matches the allocated modules */
17772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            switch ( value ) {
17782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_PS:
17792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_PS))) {
17802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  err = AACENC_INVALID_CONFIG;
17812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  goto bail;
17822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
17832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_SBR:
17842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_SBR))) {
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_AAC_LC:
17892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_ER_AAC_LD:
17902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_ER_AAC_ELD:
17912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_AAC))) {
17922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  err = AACENC_INVALID_CONFIG;
17932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  goto bail;
17942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
17952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
17962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              default:
17972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
17982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                goto bail;
17992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }/* switch value */
18002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userAOT = (AUDIO_OBJECT_TYPE)value;
18012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
18022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
18032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BITRATE:
18052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userBitrate != value) {
18062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userBitrate = value;
18072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
18082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
18092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BITRATEMODE:
18112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userBitrateMode != value) {
18122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            switch ( value ) {
18132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case 0:
1814e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi              case 1: case 2: case 3: case 4: case 5:
18152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case 8:
18162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                settings->userBitrateMode = value;
18172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
18182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
18192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              default:
18202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
18212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
18222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* switch value */
18232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
18242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SAMPLERATE:
18262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userSamplerate != value) {
18272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !( (value==8000) || (value==11025) || (value==12000) || (value==16000) || (value==22050) || (value==24000) ||
18282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   (value==32000) || (value==44100) || (value==48000) || (value==64000) || (value==88200) || (value==96000) ) )
18292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
18302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
18312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
18322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
18332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userSamplerate = value;
18342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */
18352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
18362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
18372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CHANNELMODE:
18392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userChannelMode != (CHANNEL_MODE)value) {
18402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            const CHANNEL_MODE_CONFIG_TAB* pConfig = FDKaacEnc_GetChannelModeConfiguration((CHANNEL_MODE)value);
18412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (pConfig==NULL) {
18422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
18432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
18442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
18452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( (pConfig->nElements > hAacEncoder->nMaxAacElements)
18462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              || (pConfig->nChannelsEff > hAacEncoder->nMaxAacChannels)
1847fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi              || !(((value>=1) && (value<=7))||((value>=33) && (value<=34)))
18482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                )
18492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
18502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
18512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
18522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
18532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userChannelMode = (CHANNEL_MODE)value;
18552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->nChannels = pConfig->nChannels;
18562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */
18572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
18582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
18592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BANDWIDTH:
18612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userBandwidth != value) {
18622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          settings->userBandwidth = value;
18632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;
18642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
18652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CHANNELORDER:
18672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->aacConfig.channelOrder != (CHANNEL_ORDER)value) {
18682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (! ((value==0) || (value==1)) ) {
18692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
18702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
18712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
18722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->aacConfig.channelOrder = (CHANNEL_ORDER)value;
18732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */
18742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
18752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
18762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_AFTERBURNER:
18782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userAfterburner != value) {
18792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (! ((value==0) || (value==1)) ) {
18802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
18812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
18822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
18832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userAfterburner = value;
18842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;
18852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
18862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_GRANULE_LENGTH:
18882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userFramelength != value) {
18892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          switch (value) {
18902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case 1024:
18912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case 512:
18922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case 480:
18932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              settings->userFramelength = value;
18942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
18952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              break;
18962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            default:
18972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              err = AACENC_INVALID_CONFIG;
18982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              break;
18992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
19002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
19023aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    case AACENC_SBR_RATIO:
19033aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        if (settings->userSbrRatio != value) {
19043aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            if (! ((value==0) || (value==1) || (value==2)) ) {
19053aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              err = AACENC_INVALID_CONFIG;
19063aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi              break;
19073aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            }
19083aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            settings->userSbrRatio = value;
19093aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
19103aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        }
19113aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        break;
19122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SBR_MODE:
19132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userSbrEnabled != value) {
19142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userSbrEnabled = value;
19152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
19162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
19182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_TRANSMUX:
19192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpType != (TRANSPORT_TYPE)value) {
19202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            TRANSPORT_TYPE  type  = (TRANSPORT_TYPE)value;
19222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            UINT            flags = hAacEncoder->CAPF_tpEnc;
19232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
19242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !( ((type==TT_MP4_ADIF)      &&  (flags&CAPF_ADIF))
19252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_ADTS)      &&  (flags&CAPF_ADTS))
19262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_LATM_MCP0) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS)))
19272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_LATM_MCP1) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS)))
19282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_LOAS)      &&  (flags&CAPF_LOAS))
19292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_RAW)       &&  (flags&CAPF_RAWPACKETS))
19302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                ) )
19312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
19322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
19332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
19342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
19352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpType = (TRANSPORT_TYPE)value;
19362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
19372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
19392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SIGNALING_MODE:
19402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpSignaling != value) {
19412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !((value==0) || (value==1) || (value==2)) ) {
19422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
19432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
19442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
19452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpSignaling = value;
19462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
19472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
19492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_PROTECTION:
19502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpProtection != value) {
19512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !((value==0) || (value==1)) ) {
19522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
19532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
19542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
19552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpProtection = value;
19562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
19572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
19592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_HEADER_PERIOD:
19602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpHeaderPeriod != value) {
19612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpHeaderPeriod = value;
19622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
19632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
1965e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    case AACENC_AUDIOMUXVER:
1966e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        if (settings->userTpAmxv != value) {
1967e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi            if ( !((value==0) || (value==1) || (value==2)) ) {
1968e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi                err = AACENC_INVALID_CONFIG;
1969e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi                break;
1970e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi            }
1971e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi            settings->userTpAmxv = value;
1972e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
1973e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        }
1974e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        break;
19752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_TPSUBFRAMES:
19762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpNsubFrames != value) {
19772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (! ( (value>=1) && (value<=4) ) ) {
19782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
19792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
19802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
19812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpNsubFrames = value;
19822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
19832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
19852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_ANCILLARY_BITRATE:
19862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userAncDataRate != value) {
19872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userAncDataRate = value;
19882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
19902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CONTROL_STATE:
19912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->InitFlags != value) {
19922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (value&AACENC_RESET_INBUFFER) {
19932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacEncoder->nSamplesRead = 0;
19942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
19952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags = value;
19962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
19972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
19982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_METADATA_MODE:
19992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ((UINT)settings->userMetaDataMode != value) {
2000ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi            if ( !(((INT)value>=0) && ((INT)value<=2)) ) {
20012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
20022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
20032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
20042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userMetaDataMode = value;
20052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;
20062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
20072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
2008e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    case AACENC_PEAK_BITRATE:
2009e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        if (settings->userPeakBitrate != value) {
2010e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi            settings->userPeakBitrate = value;
2011e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
2012e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        }
2013e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        break;
20142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
20152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = AACENC_UNSUPPORTED_PARAMETER;
20162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
20172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }  /* switch(param) */
20182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
20202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
20212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
20222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20232228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT aacEncoder_GetParam(
20242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_AACENCODER   hAacEncoder,
20252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_PARAM        param
20262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
20272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
20282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT value = 0;
20292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    USER_PARAM *settings = &hAacEncoder->extParam;
20302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* check encoder handle */
20322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder == NULL) {
20332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
20342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
20352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
20362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* apply param value */
20372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (param)
20382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
20392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_AOT:
20402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.audioObjectType;
20412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BITRATE:
20432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)((hAacEncoder->aacConfig.bitrateMode==AACENC_BR_MODE_CBR) ? hAacEncoder->aacConfig.bitRate : -1);
20442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BITRATEMODE:
20462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.bitrateMode;
20472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SAMPLERATE:
20493aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        value = (UINT)hAacEncoder->coderConfig.extSamplingRate;
20502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CHANNELMODE:
20522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.channelMode;
20532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BANDWIDTH:
20552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.bandWidth;
20562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CHANNELORDER:
20582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.channelOrder;
20592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_AFTERBURNER:
20612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.useRequant;
20622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_GRANULE_LENGTH:
20642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.framelength;
20652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       break;
20663aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi    case AACENC_SBR_RATIO:
20673aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        value = isSbrActive(&hAacEncoder->aacConfig) ? hAacEncoder->aacConfig.sbrRatio : 0;
20683aec97e388e29a1d03f0197b27b893bc6aaf8ac3Jean-Michel Trivi        break;
20692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SBR_MODE:
20702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT) (hAacEncoder->aacConfig.syntaxFlags & AC_SBR_PRESENT) ? 1 : 0;
20712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_TRANSMUX:
20732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)settings->userTpType;
20742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SIGNALING_MODE:
2076dbf96806482b2c48de4ba1da9a03e2bb7516b8c2Jean-Michel Trivi        value = (UINT)getSbrSignalingMode(hAacEncoder->aacConfig.audioObjectType, settings->userTpType, settings->userTpSignaling, hAacEncoder->aacConfig.sbrRatio);
20772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_PROTECTION:
20792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)settings->userTpProtection;
20802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_HEADER_PERIOD:
20822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->coderConfig.headerPeriod;
20832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
2084e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    case AACENC_AUDIOMUXVER:
2085e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        value = (UINT)hAacEncoder->aacConfig.audioMuxVersion;
2086e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        break;
20872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_TPSUBFRAMES:
20882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)settings->userTpNsubFrames;
20892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_ANCILLARY_BITRATE:
20912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.anc_Rate;
20922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CONTROL_STATE:
20942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->InitFlags;
20952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
20962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_METADATA_MODE:
20972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (hAacEncoder->metaDataAllowed==0) ? 0 : (UINT)settings->userMetaDataMode;
20982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
2099e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi    case AACENC_PEAK_BITRATE:
2100e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        value = (UINT)-1; /* peak bitrate parameter is meaningless */
2101e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        if ( ((INT)hAacEncoder->extParam.userPeakBitrate!=-1) ) {
2102e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi          value = (UINT)(fMax((INT)hAacEncoder->extParam.userPeakBitrate, hAacEncoder->aacConfig.bitRate)); /* peak bitrate parameter is in use */
2103e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        }
2104e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi        break;
21052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
21062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      //err = MPS_INVALID_PARAMETER;
21072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
21082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }  /* switch(param) */
21092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
21112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return value;
21122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
21132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21142228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncInfo(
21152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_AACENCODER   hAacEncoder,
21162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACENC_InfoStruct        *pInfo
21172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
21182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
21192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
21202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(pInfo, sizeof(AACENC_InfoStruct));
21222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->confSize = 64; /* pre-initialize */
21232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->maxOutBufBytes    = ((hAacEncoder->nMaxAacChannels*6144)+7)>>3;
21252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->maxAncBytes       = hAacEncoder->aacConfig.maxAncBytesPerAU;
21262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->inBufFillLevel    = hAacEncoder->nSamplesRead/hAacEncoder->extParam.nChannels;
21272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->inputChannels     = hAacEncoder->extParam.nChannels;
21282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->frameLength       = hAacEncoder->nSamplesToRead/hAacEncoder->extParam.nChannels;
21292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->encoderDelay      = hAacEncoder->nDelay/hAacEncoder->extParam.nChannels;
21302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
21312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Get encoder configuration */
21322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( aacEncGetConf(hAacEncoder, &pInfo->confSize, &pInfo->confBuf[0]) != AAC_ENC_OK) {
21332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INIT_ERROR;
21342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
21352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
21362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
21372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
21382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
21392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2140