aacenc_lib.cpp revision 4f0d97057c5c640b25518358886f8c47da9fc052
12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* -----------------------------------------------------------------------------------------------------------
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi� Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************** MPEG-4 HE-AAC Encoder *************************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Initial author:       M. Lohwasser
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  contents/description: FDK HE-AAC Encoder interface library functions
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacenc_lib.h"
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_audio.h"
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacenc.h"
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacEnc_ram.h"
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_core.h" /* FDK_tools versioning info */
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Encoder library info */
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_VL0 3
1004f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi#define AACENCODER_LIB_VL1 4
1014f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi#define AACENCODER_LIB_VL2 0
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_TITLE "AAC Encoder"
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_BUILD_DATE __DATE__
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACENCODER_LIB_BUILD_TIME __TIME__
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_encoder.h"
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "../src/sbr_ram.h"
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "channel_map.h"
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "psy_const.h"
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "bitenc.h"
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpenc_lib.h"
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "metadata_main.h"
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SBL(fl)            (fl/8)                 /*!< Short block length (hardcoded to 8 short blocks per long block) */
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define BSLA(fl)           (4*SBL(fl)+SBL(fl)/2)  /*!< AAC block switching look-ahead */
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DELAY_AAC(fl)      (fl+BSLA(fl))          /*!< MDCT + blockswitching */
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DELAY_AACELD(fl)   ( (fl) + ((fl)/2)  )   /*!< ELD FB delay */
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define INPUTBUFFER_SIZE (1537+100+2048)
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Flags to characterize encoder modules to be supported in present instance.
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectenum {
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_AAC  = 0x0001,
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_SBR  = 0x0002,
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_PS   = 0x0004,
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_SAC  = 0x0008,
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ENC_MODE_FLAG_META = 0x0010
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct {
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AUDIO_OBJECT_TYPE userAOT;               /*!< Audio Object Type.             */
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userSamplerate;        /*!< Sampling frequency.            */
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              nChannels;             /*!< will be set via channelMode.   */
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CHANNEL_MODE      userChannelMode;
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userBitrate;
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userBitrateMode;
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userBandwidth;
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userAfterburner;
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userFramelength;
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userAncDataRate;
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTns;               /*!< Use TNS coding. */
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userPns;               /*!< Use PNS coding. */
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userIntensity;         /*!< Use Intensity coding. */
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    TRANSPORT_TYPE    userTpType;            /*!< Transport type */
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpSignaling;       /*!< Extension AOT signaling mode. */
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpNsubFrames;      /*!< Number of sub frames in a transport frame for LOAS/LATM or ADTS (default 1). */
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpAmxv;            /*!< AudioMuxVersion to be used for LATM (default 0). */
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpProtection;
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userTpHeaderPeriod;    /*!< Parameter used to configure LATM/LOAS SMC rate. Moreover this parameters is
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                  used to configure repetition rate of PCE in raw_data_block. */
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userErTools;           /*!< Use VCB11, HCR and/or RVLC ER tool. */
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT              userPceAdditions;      /*!< Configure additional bits in PCE. */
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userMetaDataMode;      /*!< Meta data library configuration. */
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR             userSbrEnabled;
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} USER_PARAM;
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/****************************************************************************
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           Structure Definitions
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct  AACENC_CONFIG     *HANDLE_AACENC_CONFIG;
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstruct AACENCODER
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    USER_PARAM               extParam;
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CODER_CONFIG             coderConfig;
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* AAC */
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_CONFIG            aacConfig;
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AAC_ENC           hAacEnc;
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* SBR */
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_SBR_ENCODER       hEnvEnc;
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Meta Data */
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_FDK_METADATA_ENCODER  hMetadataEnc;
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                          metaDataAllowed; /* Signal whether chosen configuration allows metadata. Necessary for delay
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                     compensation. Metadata mode is a separate parameter. */
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Transport */
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_TRANSPORTENC      hTpEnc;
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Output */
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                   *outBuffer;         /* Internal bitstream buffer */
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      outBufferInBytes;   /* Size of internal bitstream buffer*/
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Input */
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT_PCM                 *inputBuffer;        /* Internal input buffer. Input source for AAC encoder */
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      inputBufferOffset;  /* Where to write new input samples. */
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      nSamplesToRead;    /* number of input samples neeeded for encoding one frame */
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      nSamplesRead;      /* number of input samples already in input buffer */
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      nZerosAppended;    /* appended zeros at end of file*/
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                      nDelay;            /* encoder delay */
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_EXT_PAYLOAD       extPayload [MAX_TOTAL_EXT_PAYLOADS];
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Extension payload */
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                    extPayloadData [(1)][(6)][MAX_PAYLOAD_SIZE];
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT                     extPayloadSize [(1)][(6)]; /* payload sizes in bits */
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ULONG                    InitFlags;         /* internal status to treggier re-initialization */
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Memory allocation info. */
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT                       nMaxAacElements;
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT                       nMaxAacChannels;
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT                       nMaxSbrElements;
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT                       nMaxSbrChannels;
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   UINT                      nMaxSubFrames;
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   UINT                      encoder_modis;
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Capabity flags */
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   UINT                      CAPF_tpEnc;
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} ;
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig)
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT sbrUsed = 0;
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hAacConfig->audioObjectType==AOT_SBR)         || (hAacConfig->audioObjectType==AOT_PS)
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || (hAacConfig->audioObjectType==AOT_MP2_SBR)     || (hAacConfig->audioObjectType==AOT_MP2_PS)
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || (hAacConfig->audioObjectType==AOT_DABPLUS_SBR) || (hAacConfig->audioObjectType==AOT_DABPLUS_PS)
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || (hAacConfig->audioObjectType==AOT_DRM_SBR)     || (hAacConfig->audioObjectType==AOT_DRM_MPEG_PS) )
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrUsed = 1;
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD && (hAacConfig->syntaxFlags & AC_SBR_PRESENT))
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrUsed = 1;
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return ( sbrUsed );
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/****************************************************************************
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               Allocate Encoder
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectH_ALLOC_MEM (_AacEncoder, AACENCODER)
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectC_ALLOC_MEM (_AacEncoder, AACENCODER, 1)
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Map Encoder specific config structures to CODER_CONFIG.
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_MapConfig(CODER_CONFIG *cc, USER_PARAM *extCfg, HANDLE_AACENC_CONFIG hAacConfig)
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AUDIO_OBJECT_TYPE transport_AOT = AOT_NULL_OBJECT;
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(cc, sizeof(CODER_CONFIG));
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags = 0;
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Map virtual aot to transport aot. */
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (hAacConfig->audioObjectType) {
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_MP2_AAC_LC:
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transport_AOT = AOT_AAC_LC;
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_MP2_SBR:
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transport_AOT = AOT_SBR;
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cc->flags |= CC_SBR;
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     break;
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_MP2_PS:
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transport_AOT = AOT_PS;
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cc->flags |= CC_SBR;
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transport_AOT = hAacConfig->audioObjectType;
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) {
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->flags |= (hAacConfig->syntaxFlags & AC_SBR_PRESENT) ? CC_SBR : 0;
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* transport type is usually AAC-LC. */
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (transport_AOT == AOT_SBR) || (transport_AOT == AOT_PS) ) {
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->aot           = AOT_AAC_LC;
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->aot           = transport_AOT;
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Configure extension aot. */
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (extCfg->userTpSignaling==0) {
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->extAOT = AOT_NULL_OBJECT;  /* implicit */
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (extCfg->userTpSignaling==1) && ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) ) {
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cc->extAOT = AOT_SBR;        /* explicit backward compatible */
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cc->extAOT = transport_AOT;  /* explicit hierarchical */
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->extSamplingRate = extCfg->userSamplerate;
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->bitRate         = hAacConfig->bitRate;
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->noChannels      = hAacConfig->nChannels;
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags          |= CC_IS_BASELAYER;
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->channelMode     = hAacConfig->channelMode;
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->nSubFrames = (hAacConfig->nSubFrames > 1 && extCfg->userTpNsubFrames == 1)
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 ? hAacConfig->nSubFrames
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 : extCfg->userTpNsubFrames;
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags          |= (extCfg->userTpProtection) ? CC_PROTECTION : 0;
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (extCfg->userTpHeaderPeriod!=0xFF) {
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->headerPeriod    = extCfg->userTpHeaderPeriod;
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else { /* auto-mode */
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (extCfg->userTpType) {
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case TT_MP4_ADTS:
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case TT_MP4_LOAS:
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case TT_MP4_LATM_MCP1:
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        cc->headerPeriod = 10;
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        cc->headerPeriod = 0;
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->samplesPerFrame = hAacConfig->framelength;
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->samplingRate    = hAacConfig->sampleRate;
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Mpeg-4 signaling for transport library. */
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch ( hAacConfig->audioObjectType ) {
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_MP2_AAC_LC:
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_MP2_SBR:
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_MP2_PS:
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cc->flags &= ~CC_MPEG_ID; /* Required for ADTS. */
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      //config->userTpSignaling=0;
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cc->extAOT = AOT_NULL_OBJECT;
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cc->flags |= CC_MPEG_ID;
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ER-tools signaling. */
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_VCB11) ? CC_VCB11 : 0;
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_HCR)   ? CC_HCR : 0;
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_RVLC)  ? CC_RVLC : 0;
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Matrix mixdown coefficient configuration. */
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (extCfg->userPceAdditions&0x1) && (hAacConfig->epConfig==-1)
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      && ((cc->channelMode==MODE_1_2_2)||(cc->channelMode==MODE_1_2_2_1)) )
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->matrixMixdownA       = ((extCfg->userPceAdditions>>1)&0x3)+1;
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->flags |= (extCfg->userPceAdditions>>3)&0x1 ? CC_PSEUDO_SURROUND : 0;
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cc->matrixMixdownA = 0;
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Examine buffer descriptor regarding choosen identifier.
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param pBufDesc              Pointer to buffer descriptor
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param identifier            Buffer identifier to look for.
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return - Buffer descriptor index.
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *         -1, if there is no entry available.
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT getBufDescIdx(
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_BufDesc         *pBufDesc,
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_BufferIdentifier identifier
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project)
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i, idx = -1;
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<pBufDesc->numBufs; i++) {
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (AACENC_BufferIdentifier)pBufDesc->bufferIdentifiers[i] == identifier ) {
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        idx = i;
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return idx;
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/****************************************************************************
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          Function Declarations
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR aacEncDefaultConfig(HANDLE_AACENC_CONFIG hAacConfig,
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      USER_PARAM *config)
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* make reasonable default settings */
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKaacEnc_AacInitDefaultConfig (hAacConfig);
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* clear confure structure and copy default settings */
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(config, sizeof(USER_PARAM));
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* copy encoder configuration settings */
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->nChannels       = hAacConfig->nChannels;
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userAOT = hAacConfig->audioObjectType = AOT_AAC_LC;
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userSamplerate  = hAacConfig->sampleRate;
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userChannelMode = hAacConfig->channelMode;
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userBitrate     = hAacConfig->bitRate;
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userBitrateMode = hAacConfig->bitrateMode;
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userBandwidth   = hAacConfig->bandWidth;
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTns         = hAacConfig->useTns;
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userPns         = hAacConfig->usePns;
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userIntensity   = hAacConfig->useIS;
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userAfterburner = hAacConfig->useRequant;
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userFramelength = (UINT)-1;
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacConfig->syntaxFlags & AC_ER_VCB11) {
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      config->userErTools  |= 0x01;
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacConfig->syntaxFlags & AC_ER_HCR) {
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      config->userErTools  |= 0x02;
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* initialize transport parameters */
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpType         = TT_UNKNOWN;
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpAmxv         = 0;
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpSignaling    = 0;    /* default, implicit signaling */
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpNsubFrames   = 1;
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpProtection   = 0;    /* not crc protected*/
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userTpHeaderPeriod = 0xFF; /* header period in auto mode */
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userPceAdditions   = 0;    /* no matrix mixdown coefficient */
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userMetaDataMode   = 0;    /* do not embed any meta data info */
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->userAncDataRate    = 0;
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_OK;
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid aacEncDistributeSbrBits(CHANNEL_MAPPING *channelMapping, SBR_ELEMENT_INFO *sbrElInfo, INT bitRate)
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT codebits = bitRate;
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int el;
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Copy Element info */
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (el=0; el<channelMapping->nElements; el++) {
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].ChannelIndex[0] = channelMapping->elInfo[el].ChannelIndex[0];
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].ChannelIndex[1] = channelMapping->elInfo[el].ChannelIndex[1];
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].elType          = channelMapping->elInfo[el].elType;
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].bitRate         = (INT)(fMultNorm(channelMapping->elInfo[el].relativeBits, (FIXP_DBL)bitRate));
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].instanceTag     = channelMapping->elInfo[el].instanceTag;
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElInfo[el].nChannelsInEl   = channelMapping->elInfo[el].nChannelsInEl;
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      codebits -= sbrElInfo[el].bitRate;
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrElInfo[0].bitRate += codebits;
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT aacEncoder_LimitBitrate(
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_TRANSPORTENC hTpEnc,
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT samplingRate,
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT frameLength,
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT nChannels,
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const CHANNEL_MODE channelMode,
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT bitRate,
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT nSubFrames,
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT sbrActive,
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AUDIO_OBJECT_TYPE aot
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT coreSamplingRate;
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CHANNEL_MAPPING cm;
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_InitChannelMapping(channelMode, CH_ORDER_MPEG, &cm);
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sbrActive) {
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Assume SBR rate ratio of 2:1 */
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    coreSamplingRate = samplingRate / 2;
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    coreSamplingRate = samplingRate;
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Consider bandwidth channel bit rate limit (see bandwidth.cpp: GetBandwidthEntry()) */
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) {
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitRate = FDKmin(360000*nChannels, bitRate);
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitRate = FDKmax(8000*nChannels, bitRate);
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS)  {
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitRate = FDKmin(576000*nChannels, bitRate);
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*bitRate = FDKmax(0*nChannels, bitRate);*/
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Limit bit rate in respect to the core coder */
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bitRate = FDKaacEnc_LimitBitrate(
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hTpEnc,
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          coreSamplingRate,
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          frameLength,
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          nChannels,
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          cm.nChannelsEff,
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitRate,
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          -1,
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          NULL,
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          -1,
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          nSubFrames
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          );
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Limit bit rate in respect to available SBR modes if active */
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sbrActive)
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SBR_ELEMENT_INFO sbrElInfo[6];
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT sbrBitRate = 0;
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int e, tooBig=-1;
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_ASSERT(cm.nElements <= (6));
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Get bit rate for each SBR element */
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacEncDistributeSbrBits(&cm, sbrElInfo, bitRate);
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (e=0; e<cm.nElements; e++)
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT sbrElementBitRateIn, sbrBitRateOut;
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (cm.elInfo[e].elType != ID_SCE && cm.elInfo[e].elType != ID_CPE) {
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        continue;
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrElementBitRateIn = sbrElInfo[e].bitRate;
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrBitRateOut = sbrEncoder_LimitBitRate(sbrElementBitRateIn , cm.elInfo[e].nChannelsInEl, coreSamplingRate, aot);
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (sbrBitRateOut == 0) {
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 0;
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (sbrElementBitRateIn < sbrBitRateOut) {
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDK_ASSERT(tooBig != 1);
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        tooBig = 0;
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (e == 0) {
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sbrBitRate = 0;
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (sbrElementBitRateIn > sbrBitRateOut) {
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDK_ASSERT(tooBig != 0);
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        tooBig = 1;
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (e == 0) {
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sbrBitRate = 5000000;
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (tooBig != -1)
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT sbrBitRateLimit = (INT)fDivNorm((FIXP_DBL)sbrBitRateOut, cm.elInfo[e].relativeBits);
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (tooBig) {
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sbrBitRate = fMin(sbrBitRate, sbrBitRateLimit-16);
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDK_ASSERT( (INT)fMultNorm(cm.elInfo[e].relativeBits, (FIXP_DBL)sbrBitRate) < sbrBitRateOut);
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } else {
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sbrBitRate = fMax(sbrBitRate, sbrBitRateLimit+16);
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDK_ASSERT( (INT)fMultNorm(cm.elInfo[e].relativeBits, (FIXP_DBL)sbrBitRate) >= sbrBitRateOut);
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (tooBig != -1) {
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitRate = sbrBitRate;
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_ASSERT(bitRate > 0);
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return bitRate;
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief Consistency check of given USER_PARAM struct and
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *   copy back configuration from public struct into internal
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *   encoder configuration struct.
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \hAacEncoder Internal encoder config which is to be updated
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param config User provided config (public struct)
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return �returns always AAC_ENC_OK
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder,
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         USER_PARAM *config)
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Get struct pointers. */
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AACENC_CONFIG    hAacConfig = &hAacEncoder->aacConfig;
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->nChannels       = config->nChannels;
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Encoder settings update. */
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->sampleRate      = config->userSamplerate;
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->useTns          = config->userTns;
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->usePns          = config->userPns;
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->useIS           = config->userIntensity;
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->bitRate         = config->userBitrate;
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->channelMode     = config->userChannelMode;
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->bitrateMode     = config->userBitrateMode;
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->bandWidth       = config->userBandwidth;
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->useRequant      = config->userAfterburner;
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->audioObjectType = config->userAOT;
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->anc_Rate        = config->userAncDataRate;
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->syntaxFlags     = 0;
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->epConfig        = -1;
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Adapt internal AOT when necessary. */
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch ( hAacConfig->audioObjectType ) {
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_MP2_AAC_LC:
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_MP2_SBR:
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_MP2_PS:
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->usePns = 0;
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (config->userTpSignaling!=0) {
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INVALID_CONFIG; /* only implicit signaling allowed */
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_AAC_LC:
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_SBR:
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_PS:
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_ADTS;
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 1024;
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (hAacConfig->framelength != 1024 && hAacConfig->framelength != 960) {
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INVALID_CONFIG;
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_ER_AAC_LC:
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->epConfig = 0;
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= AC_ER;
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0);
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0);
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS;
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 1024;
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (hAacConfig->framelength != 1024 && hAacConfig->framelength != 960) {
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INVALID_CONFIG;
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_ER_AAC_LD:
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->epConfig = 0;
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= AC_ER|AC_LD;
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0);
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0);
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0);
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS;
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512;
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) {
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INVALID_CONFIG;
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_ER_AAC_ELD:
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->epConfig = 0;
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= AC_ER|AC_ELD;
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0);
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0);
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0);
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->syntaxFlags |= ((config->userSbrEnabled)    ? AC_SBR_PRESENT : 0);
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS;
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512;
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) {
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INVALID_CONFIG;
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* We need the frame length to call aacEncoder_LimitBitrate() */
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacConfig->bitRate = aacEncoder_LimitBitrate(
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              NULL,
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              hAacConfig->sampleRate,
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              hAacConfig->framelength,
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              hAacConfig->nChannels,
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              hAacConfig->channelMode,
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              config->userBitrate,
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              hAacConfig->nSubFrames,
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              isSbrActive(hAacConfig),
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              hAacConfig->audioObjectType
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              );
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch ( hAacConfig->audioObjectType ) {
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_ER_AAC_LD:
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_ER_AAC_ELD:
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (config->userBitrateMode==8) {
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->bitrateMode = 0;
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (config->userBitrateMode==0) {
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacConfig->bitreservoir = 50*config->nChannels; /* default, reduced bitreservoir */
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacConfig->bitrateMode!=0) {
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return AACENC_INVALID_CONFIG;
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacConfig->epConfig >= 0) {
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacConfig->syntaxFlags |= AC_ER;
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) {
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           return AACENC_INVALID_CONFIG;        /* Cannel config 0 not supported. */
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         }
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( FDKaacEnc_DetermineEncoderMode(&hAacConfig->channelMode, hAacConfig->nChannels) != AAC_ENC_OK) {
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AACENC_INVALID_CONFIG;        /* nChannels doesn't match chMode, this is just a check-up */
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hAacConfig->nChannels > hAacEncoder->nMaxAacChannels)
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || ( (FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff > hAacEncoder->nMaxSbrChannels) &&
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            isSbrActive(hAacConfig) )
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         )
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AACENC_INVALID_CONFIG;      /* not enough channels allocated */
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* get bitrate in VBR configuration */
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5) ) {
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode. */
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacConfig->bitRate = FDKaacEnc_GetVBRBitrate(hAacConfig->bitrateMode, hAacConfig->channelMode);
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Set default bitrate if no external bitrate declared. */
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacConfig->bitRate==-1) {
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT bitrate = FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff * hAacConfig->sampleRate;
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        switch (hAacConfig->audioObjectType)
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case AOT_AAC_LC:
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacConfig->bitRate = bitrate + (bitrate>>1);        /* 1.5 bits per sample */
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case AOT_SBR:
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacConfig->bitRate = (bitrate + (bitrate>>2))>>1;   /* 0.625 bits per sample */
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case AOT_PS:
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacConfig->bitRate = (bitrate>>1);                  /* 0.5 bit per sample */
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            default:
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacConfig->bitRate = bitrate;
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Configure PNS */
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( ((hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5)) /* VBR without PNS. */
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        || (hAacConfig->useTns == 0) )                                  /* TNS required. */
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacConfig->usePns = 0;
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Meta data restriction. */
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (hAacConfig->audioObjectType)
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Allow metadata support */
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_AAC_LC:
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AOT_SBR:
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->metaDataAllowed = 1;
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) {
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->userMetaDataMode = 0;
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Prohibit metadata support */
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->metaDataAllowed = 0;
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT aacenc_SbrCallback(
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        void *                  self,
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_BITSTREAM    hBs,
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT sampleRateIn,
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT sampleRateOut,
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT samplesPerFrame,
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AUDIO_OBJECT_TYPE coreCodec,
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const MP4_ELEMENT_ID    elementID,
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT               elementIndex
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self;
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrEncoder_GetHeader(hAacEncoder->hEnvEnc, hBs, elementIndex, 0);
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AACENC_ERROR aacEncInit(HANDLE_AACENCODER  hAacEncoder,
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               ULONG              InitFlags,
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               USER_PARAM        *config)
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT aacBufferOffset = 0;
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_SBR_ENCODER     *hSbrEncoder = &hAacEncoder->hEnvEnc;
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AACENC_CONFIG    hAacConfig  = &hAacEncoder->aacConfig;
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->nZerosAppended = 0;          /* count appended zeros */
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT frameLength = hAacConfig->framelength;
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_CONFIG) )
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CHANNEL_MODE prevChMode = hAacConfig->channelMode;
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Verify settings and update: config -> heAacEncoder */
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (err=FDKaacEnc_AdjustEncSettings(hAacEncoder, config)) != AACENC_OK ) {
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return err;
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        frameLength = hAacConfig->framelength; /* adapt temporal framelength */
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Seamless channel reconfiguration in sbr not fully implemented */
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (prevChMode!=hAacConfig->channelMode) && isSbrActive(hAacConfig) ) {
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            InitFlags |= AACENC_INIT_STATES;
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Clear input buffer */
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags == AACENC_INIT_ALL) ) {
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(hAacEncoder->inputBuffer, sizeof(INT_PCM)*hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE);
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_CONFIG) )
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        aacBufferOffset = 0;
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) {
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nDelay = DELAY_AACELD(hAacConfig->framelength);
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } else
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nDelay = DELAY_AAC(hAacConfig->framelength); /* AAC encoder delay */
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacConfig->ancDataBitRate = 0;
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( isSbrActive(hAacConfig) &&
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES)) )
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT sbrError;
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        SBR_ELEMENT_INFO sbrElInfo[(6)];
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CHANNEL_MAPPING channelMapping;
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AUDIO_OBJECT_TYPE aot = hAacConfig->audioObjectType;
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( FDKaacEnc_InitChannelMapping(hAacConfig->channelMode,
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          hAacConfig->channelOrder,
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         &channelMapping) != AAC_ENC_OK )
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_ERROR;
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Check return value and if the SBR encoder can handle enough elements */
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (channelMapping.nElements > (6)) {
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_ERROR;
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        aacEncDistributeSbrBits(&channelMapping, sbrElInfo, hAacConfig->bitRate);
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UINT initFlag = 0;
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        initFlag += (InitFlags & AACENC_INIT_STATES) ? 1 : 0;
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Let the SBR encoder take a look at the configuration and change if required. */
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrError = sbrEncoder_Init(
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                *hSbrEncoder,
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 sbrElInfo,
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 channelMapping.nElements,
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 hAacEncoder->inputBuffer,
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hAacConfig->bandWidth,
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &aacBufferOffset,
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hAacConfig->nChannels,
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hAacConfig->sampleRate,
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &frameLength,
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hAacConfig->audioObjectType,
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &hAacEncoder->nDelay,
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) ? 1 : TRANS_FAC,
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 initFlag
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                );
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Suppress AOT reconfiguration and check error status. */
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( sbrError || (hAacConfig->audioObjectType!=aot) ) {
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_SBR_ERROR;
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacConfig->nChannels == 1) {
8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacConfig->channelMode = MODE_1;
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Never use PNS if SBR is active */
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( hAacConfig->usePns ) {
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           hAacConfig->usePns = 0;
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* estimated bitrate consumed by SBR or PS */
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacConfig->ancDataBitRate = sbrEncoder_GetEstimateBitrate(*hSbrEncoder) ;
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* sbr initialization */
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Initialize Transport - Module.
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_TRANSPORT) )
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UINT flags = 0;
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKaacEnc_MapConfig(&hAacEncoder->coderConfig, config, hAacConfig);
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* create flags for transport encoder */
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (config->userTpAmxv == 1) {
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            flags |= TP_FLAG_LATM_AMV;
9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Clear output buffer */
9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes*sizeof(UCHAR));
9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Initialize Bitstream encoder */
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( transportEnc_Init(hAacEncoder->hTpEnc, hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes, config->userTpType, &hAacEncoder->coderConfig, flags) != 0) {
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_TP_ERROR;
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* transport initialization */
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Initialize AAC - Core.
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_CONFIG) ||
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         (InitFlags & AACENC_INIT_STATES) )
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AAC_ENCODER_ERROR err;
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = FDKaacEnc_Initialize(hAacEncoder->hAacEnc,
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacConfig,
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->hTpEnc,
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   (InitFlags & AACENC_INIT_STATES) ? 1 : 0);
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (err != AAC_ENC_OK) {
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_AAC_ERROR;
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* aac initialization */
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Initialize Meta Data - Encoder.
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( hAacEncoder->hMetadataEnc && (hAacEncoder->metaDataAllowed!=0) &&
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ((InitFlags & AACENC_INIT_CONFIG) ||(InitFlags & AACENC_INIT_STATES)) )
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT inputDataDelay = DELAY_AAC(hAacConfig->framelength);
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( isSbrActive(hAacConfig) && hSbrEncoder!=NULL) {
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            inputDataDelay = 2*inputDataDelay + sbrEncoder_GetInputDataDelay(*hSbrEncoder);
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( FDK_MetadataEnc_Init(hAacEncoder->hMetadataEnc,
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 ((InitFlags&AACENC_INIT_STATES) ? 1 : 0),
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  config->userMetaDataMode,
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  inputDataDelay,
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  frameLength,
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  config->userSamplerate,
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  config->nChannels,
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  config->userChannelMode,
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  hAacConfig->channelOrder) != 0)
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return AACENC_INIT_META_ERROR;
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nDelay += FDK_MetadataEnc_GetDelay(hAacEncoder->hMetadataEnc);
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Update pointer to working buffer.
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (InitFlags & AACENC_INIT_CONFIG) )
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->inputBufferOffset = aacBufferOffset;
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nSamplesToRead = frameLength * config->nChannels;
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Make nDelay comparison compatible with config->nSamplesRead */
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nDelay *= config->nChannels;
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* parameter changed */
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AACENC_OK;
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncOpen(
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AACENCODER        *phAacEncoder,
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT                encModules,
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT                maxChannels
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AACENCODER  hAacEncoder = NULL;
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (phAacEncoder == NULL) {
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INVALID_HANDLE;
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* allocate memory */
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder = Get_AacEncoder();
10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder == NULL) {
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_MEMORY_ERROR;
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hAacEncoder, sizeof(AACENCODER));
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Specify encoder modules to be allocated. */
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (encModules==0) {
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis = ENC_MODE_FLAG_AAC;
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis |= ENC_MODE_FLAG_SBR;
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis |= ENC_MODE_FLAG_PS;
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis |= ENC_MODE_FLAG_META;
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* consider SAC and PS module */
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->encoder_modis = encModules;
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Determine max channel configuration. */
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (maxChannels==0) {
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nMaxAacChannels = (6);
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nMaxSbrChannels = (6);
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nMaxAacChannels = (maxChannels&0x00FF);
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) ) {
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nMaxSbrChannels = (maxChannels&0xFF00) ? (maxChannels>>8) : hAacEncoder->nMaxAacChannels;
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (hAacEncoder->nMaxAacChannels>(6)) || (hAacEncoder->nMaxSbrChannels>(6)) ) {
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            err = AACENC_INVALID_CONFIG;
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* maxChannels==0 */
10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Max number of elements could be tuned any more. */
10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->nMaxAacElements = fixMin((6), hAacEncoder->nMaxAacChannels);
10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->nMaxSbrElements = fixMin((6), hAacEncoder->nMaxSbrChannels);
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->nMaxSubFrames = (1);
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* In case of memory overlay, allocate memory out of libraries */
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->inputBuffer = (INT_PCM*)FDKcalloc(hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE, sizeof(INT_PCM));
10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Open SBR Encoder */
10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) {
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( sbrEncoder_Open(&hAacEncoder->hEnvEnc,
10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              hAacEncoder->nMaxSbrElements,
10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              hAacEncoder->nMaxSbrChannels,
10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             (hAacEncoder->encoder_modis&ENC_MODE_FLAG_PS) ? 1 : 0 ) )
10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = AACENC_MEMORY_ERROR;
10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          goto bail;
10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* (encoder_modis&ENC_MODE_FLAG_SBR) */
10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Open Aac Encoder */
10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( FDKaacEnc_Open(&hAacEncoder->hAacEnc,
10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hAacEncoder->nMaxAacElements,
10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hAacEncoder->nMaxAacChannels,
10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         (1)) != AAC_ENC_OK )
10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_MEMORY_ERROR;
10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    { /* Get bitstream outputbuffer size */
10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      UINT ld_M;
10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ld_M=1; (UINT)(1<<ld_M) < (hAacEncoder->nMaxSubFrames*hAacEncoder->nMaxAacChannels*6144)>>3; ld_M++) ;
10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hAacEncoder->outBufferInBytes = (1<<ld_M);  /* buffer has to be 2^n */
10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->outBuffer = GetRam_bsOutbuffer();
10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (OUTPUTBUFFER_SIZE < hAacEncoder->outBufferInBytes ) {
10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = AACENC_MEMORY_ERROR;
10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Open Meta Data Encoder */
10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_META) {
10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( FDK_MetadataEnc_Open(&hAacEncoder->hMetadataEnc) )
10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_MEMORY_ERROR;
11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* (encoder_modis&ENC_MODE_FLAG_META) */
11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Open Transport Encoder */
11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( transportEnc_Open(&hAacEncoder->hTpEnc) != 0 )
11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_MEMORY_ERROR;
11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        C_ALLOC_SCRATCH_START(pLibInfo, LIB_INFO, FDK_MODULE_LAST);
11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKinitLibInfo( pLibInfo);
11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        transportEnc_GetLibInfo( pLibInfo );
11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Get capabilty flag for transport encoder. */
11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->CAPF_tpEnc = FDKlibInfo_getCapabilities( pLibInfo, FDK_TPENC);
11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        C_ALLOC_SCRATCH_END(pLibInfo, LIB_INFO, FDK_MODULE_LAST);
11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( transportEnc_RegisterSbrCallback(hAacEncoder->hTpEnc, aacenc_SbrCallback, hAacEncoder) != 0 ) {
11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = AACENC_INIT_TP_ERROR;
11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Initialize encoder instance with default parameters. */
11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacEncDefaultConfig(&hAacEncoder->aacConfig, &hAacEncoder->extParam);
11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Initialize headerPeriod in coderConfig for aacEncoder_GetParam(). */
11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->coderConfig.headerPeriod = hAacEncoder->extParam.userTpHeaderPeriod;
11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* All encoder modules have to be initialized */
11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->InitFlags = AACENC_INIT_ALL;
11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Return encoder instance */
11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *phAacEncoder = hAacEncoder;
11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacEncClose(&hAacEncoder);
11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncClose(HANDLE_AACENCODER *phAacEncoder)
11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (phAacEncoder == NULL) {
11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INVALID_HANDLE;
11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (*phAacEncoder != NULL) {
11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AACENCODER hAacEncoder = *phAacEncoder;
11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (hAacEncoder->inputBuffer!=NULL) {
11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           FDKfree(hAacEncoder->inputBuffer);
11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           hAacEncoder->inputBuffer = NULL;
11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (hAacEncoder->outBuffer) {
11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         FreeRam_bsOutbuffer(&hAacEncoder->outBuffer);
11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->hEnvEnc) {
11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sbrEncoder_Close (&hAacEncoder->hEnvEnc);
11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->hAacEnc) {
11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDKaacEnc_Close (&hAacEncoder->hAacEnc);
11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        transportEnc_Close(&hAacEncoder->hTpEnc);
11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->hMetadataEnc) {
11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDK_MetadataEnc_Close (&hAacEncoder->hMetadataEnc);
11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        Free_AacEncoder(phAacEncoder);
11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncEncode(
11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_AACENCODER   hAacEncoder,
11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_BufDesc     *inBufDesc,
11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_BufDesc     *outBufDesc,
11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_InArgs      *inargs,
11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACENC_OutArgs           *outargs
11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i, nBsBytes = 0;
12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT  outBytes[(1)];
12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int  nExtensions = 0;
12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int  ancDataExtIdx = -1;
12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* deal with valid encoder handle */
12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder==NULL) {
12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INVALID_HANDLE;
12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Adjust user settings and trigger reinitialization.
12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder->InitFlags!=0) {
12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = aacEncInit(hAacEncoder,
12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hAacEncoder->InitFlags,
12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        &hAacEncoder->extParam);
12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (err!=AACENC_OK) {
12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* keep init flags alive! */
12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->InitFlags = AACENC_INIT_NONE;
12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (outargs!=NULL) {
12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(outargs, sizeof(AACENC_OutArgs));
12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (outBufDesc!=NULL) {
12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i=0; i<outBufDesc->numBufs; i++) {
12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (outBufDesc->bufs[i]!=NULL) {
12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKmemclear(outBufDesc->bufs[i], outBufDesc->bufSizes[i]);
12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * If only encoder handle given, independent (re)initialization can be triggered.
12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hAacEncoder!=NULL) & (inBufDesc==NULL) && (outBufDesc==NULL) && (inargs==NULL) && (outargs==NULL) ) {
12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* reset buffer wich signals number of valid bytes in output bitstream buffer */
12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(outBytes, hAacEncoder->aacConfig.nSubFrames*sizeof(INT));
12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Manage incoming audio samples.
12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (inargs->numInSamples > 0) && (getBufDescIdx(inBufDesc,IN_AUDIO_DATA) != -1) )
12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Fetch data until nSamplesToRead reached */
12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT idx = getBufDescIdx(inBufDesc,IN_AUDIO_DATA);
12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT newSamples = fixMax(0,fixMin(inargs->numInSamples, hAacEncoder->nSamplesToRead-hAacEncoder->nSamplesRead));
12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT_PCM *pIn = hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead;
12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Copy new input samples to internal buffer */
12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (inBufDesc->bufElSizes[idx]==(INT)sizeof(INT_PCM)) {
12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDKmemcpy(pIn, (INT_PCM*)inBufDesc->bufs[idx], newSamples*sizeof(INT_PCM));  /* Fast copy. */
12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else if (inBufDesc->bufElSizes[idx]>(INT)sizeof(INT_PCM)) {
12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (i=0; i<newSamples; i++) {
12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                pIn[i] = (INT_PCM)(((LONG*)inBufDesc->bufs[idx])[i]>>16);                /* Convert 32 to 16 bit. */
12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (i=0; i<newSamples; i++) {
12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                pIn[i] = ((INT_PCM)(((SHORT*)inBufDesc->bufs[idx])[i]))<<16;             /* Convert 16 to 32 bit. */
12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->nSamplesRead += newSamples;
12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Number of fetched input buffer samples. */
12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        outargs->numInSamples = newSamples;
12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* input buffer completely filled ? */
12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder->nSamplesRead < hAacEncoder->nSamplesToRead)
12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* - eof reached and flushing enabled, or
12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           - return to main and wait for further incoming audio samples */
12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (inargs->numInSamples==-1)
12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( (hAacEncoder->nZerosAppended < hAacEncoder->nDelay)
12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                )
12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              int nZeros = hAacEncoder->nSamplesToRead - hAacEncoder->nSamplesRead;
12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              FDK_ASSERT(nZeros >= 0);
12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* clear out until end-of-buffer */
12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (nZeros) {
12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                FDKmemclear(hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead, sizeof(INT_PCM)*nZeros );
12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacEncoder->nZerosAppended += nZeros;
12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacEncoder->nSamplesRead = hAacEncoder->nSamplesToRead;
12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else { /* flushing completed */
13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              err = AACENC_ENCODE_EOF; /* eof reached */
13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              goto bail;
13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else { /* inargs->numInSamples!= -1 */
13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail; /* not enough samples in input buffer and no flushing enabled */
13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* init payload */
13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hAacEncoder->extPayload, sizeof(AACENC_EXT_PAYLOAD) * MAX_TOTAL_EXT_PAYLOADS);
13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i = 0; i < MAX_TOTAL_EXT_PAYLOADS; i++) {
13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hAacEncoder->extPayload[i].associatedChElement = -1;
13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hAacEncoder->extPayloadData, sizeof(hAacEncoder->extPayloadData));
13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hAacEncoder->extPayloadSize, sizeof(hAacEncoder->extPayloadSize));
13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Calculate Meta Data info.
13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hAacEncoder->hMetadataEnc!=NULL) && (hAacEncoder->metaDataAllowed!=0) ) {
13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_MetaData *pMetaData = NULL;
13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACENC_EXT_PAYLOAD *pMetaDataExtPayload = NULL;
13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UINT nMetaDataExtensions = 0;
13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT  matrix_mixdown_idx = 0;
13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* New meta data info available ? */
13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( getBufDescIdx(inBufDesc,IN_METADATA_SETUP) != -1 ) {
13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pMetaData = (AACENC_MetaData*)inBufDesc->bufs[getBufDescIdx(inBufDesc,IN_METADATA_SETUP)];
13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDK_MetadataEnc_Process(hAacEncoder->hMetadataEnc,
13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset,
13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->nSamplesRead,
13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                pMetaData,
13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               &pMetaDataExtPayload,
13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               &nMetaDataExtensions,
13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               &matrix_mixdown_idx
13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                );
13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i=0; i<(INT)nMetaDataExtensions; i++) {  /* Get meta data extension payload. */
13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->extPayload[nExtensions++] = pMetaDataExtPayload[i];
13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (matrix_mixdown_idx!=-1) {            /* Set matrix mixdown coefficient. */
13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          UINT pceValue = (UINT)( (1<<3) | ((matrix_mixdown_idx&0x2)<<1) | 1 );
13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (hAacEncoder->extParam.userPceAdditions != pceValue) {
13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->extParam.userPceAdditions = pceValue;
13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( isSbrActive(&hAacEncoder->aacConfig) ) {
13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT nPayload = 0;
13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*
13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         * Encode SBR data.
13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         */
13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (sbrEncoder_EncodeFrame(hAacEncoder->hEnvEnc,
13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->inputBuffer,
13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->extParam.nChannels,
13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->extPayloadSize[nPayload],
13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   hAacEncoder->extPayloadData[nPayload]
13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if defined(EVAL_PACKAGE_SILENCE) || defined(EVAL_PACKAGE_SBR_SILENCE)
13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  ,hAacEncoder->hAacEnc->clearOutput
13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  ))
13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            err = AACENC_ENCODE_ERROR;
13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* Add SBR extension payload */
13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (i = 0; i < (6); i++) {
13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (hAacEncoder->extPayloadSize[nPayload][i] > 0) {
13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hAacEncoder->extPayload[nExtensions].pData    = hAacEncoder->extPayloadData[nPayload][i];
13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    {
13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      hAacEncoder->extPayload[nExtensions].dataSize = hAacEncoder->extPayloadSize[nPayload][i];
13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      hAacEncoder->extPayload[nExtensions].associatedChElement = i;
13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hAacEncoder->extPayload[nExtensions].dataType = EXT_SBR_DATA;  /* Once SBR Encoder supports SBR CRC set EXT_SBR_DATA_CRC */
13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    nExtensions++;                                                 /* or EXT_SBR_DATA according to configuration. */
13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    FDK_ASSERT(nExtensions<=MAX_TOTAL_EXT_PAYLOADS);
13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            nPayload++;
13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* sbrEnabled */
13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (inargs->numAncBytes > 0) && ( getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA)!=-1 ) ) {
13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT idx = getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA);
13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->extPayload[nExtensions].dataSize = inargs->numAncBytes * 8;
13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->extPayload[nExtensions].pData    = (UCHAR*)inBufDesc->bufs[idx];
13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->extPayload[nExtensions].dataType = EXT_DATA_ELEMENT;
13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->extPayload[nExtensions].associatedChElement = -1;
14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ancDataExtIdx = nExtensions; /* store index */
14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        nExtensions++;
14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Encode AAC - Core.
14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( FDKaacEnc_EncodeFrame( hAacEncoder->hAacEnc,
14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->hTpEnc,
14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->inputBuffer,
14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                outBytes,
14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                hAacEncoder->extPayload
14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                ) != AAC_ENC_OK )
14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_ENCODE_ERROR;
14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (ancDataExtIdx >= 0) {
14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      outargs->numAncBytes = inargs->numAncBytes - (hAacEncoder->extPayload[ancDataExtIdx].dataSize>>3);
14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* samples exhausted */
14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hAacEncoder->nSamplesRead -= hAacEncoder->nSamplesToRead;
14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Delay balancing buffer handling
14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (isSbrActive(&hAacEncoder->aacConfig)) {
14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrEncoder_UpdateBuffers(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer);
14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*
14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Make bitstream public
14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (outBufDesc->numBufs>=1) {
14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT bsIdx = getBufDescIdx(outBufDesc,OUT_BITSTREAM_DATA);
14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT auIdx = getBufDescIdx(outBufDesc,OUT_AU_SIZES);
14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i=0,nBsBytes=0; i<hAacEncoder->aacConfig.nSubFrames; i++) {
14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          nBsBytes += outBytes[i];
14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (auIdx!=-1) {
14442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           ((INT*)outBufDesc->bufs[auIdx])[i] = outBytes[i];
14452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
14462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (bsIdx!=-1) && (outBufDesc->bufSizes[bsIdx]>=nBsBytes) ) {
14492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKmemcpy(outBufDesc->bufs[bsIdx], hAacEncoder->outBuffer, sizeof(UCHAR)*nBsBytes);
14502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          outargs->numOutBytes = nBsBytes;
14512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
14532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* output buffer too small, can't write valid bitstream */
14542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = AACENC_ENCODE_ERROR;
14552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          goto bail;
14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (err == AACENC_ENCODE_ERROR) {
14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* All encoder modules have to be initialized */
14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEncoder->InitFlags = AACENC_INIT_ALL;
14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR aacEncGetConf(HANDLE_AACENCODER  hAacEncoder,
14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                UINT              *size,
14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                UCHAR             *confBuffer)
14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_BITSTREAM tmpConf;
14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT confType;
14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR buf[64];
14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int err;
14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Init bit buffer */
14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKinitBitStream(&tmpConf, buf, 64, 0, BS_WRITER);
14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* write conf in tmp buffer */
14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    err = transportEnc_GetConf(hAacEncoder->hTpEnc, &hAacEncoder->coderConfig, &tmpConf, &confType);
14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* copy data to outbuffer: length in bytes */
14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKbyteAlign(&tmpConf, 0);
14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Check buffer size */
14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (FDKgetValidBits(&tmpConf) > ((*size)<<3))
14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_UNKNOWN;
14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKfetchBuffer(&tmpConf, confBuffer, size);
14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (err != 0)
14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_UNKNOWN;
14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_OK;
14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncGetLibInfo(LIB_INFO *info)
15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i = 0;
15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (info == NULL) {
15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AACENC_INVALID_HANDLE;
15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_toolsGetLibInfo( info );
15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transportEnc_GetLibInfo( info );
15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrEncoder_GetLibInfo( info );
15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* search for next free tab */
15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0; i < FDK_MODULE_LAST; i++) {
15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (info[i].module_id == FDK_NONE) break;
15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (i == FDK_MODULE_LAST) {
15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AACENC_INIT_ERROR;
15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].module_id = FDK_AACENC;
15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].build_date = (char*)AACENCODER_LIB_BUILD_DATE;
15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].build_time = (char*)AACENCODER_LIB_BUILD_TIME;
15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].title = (char*)AACENCODER_LIB_TITLE;
15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].version = LIB_VERSION(AACENCODER_LIB_VL0, AACENCODER_LIB_VL1, AACENCODER_LIB_VL2);;
15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  LIB_VERSION_STRING(&info[i]);
15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Capability flags */
15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info[i].flags = 0
15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_AAC_1024 | CAPF_AAC_LC
15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_AAC_512
15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_AAC_480
15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    | CAPF_AAC_DRC
15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ;
15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* End of flags */
15362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AACENC_OK;
15382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncoder_SetParam(
15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_AACENCODER   hAacEncoder,
15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_PARAM        param,
15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT                value
15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    USER_PARAM *settings = &hAacEncoder->extParam;
15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* check encoder handle */
15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder == NULL) {
15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INVALID_HANDLE;
15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* apply param value */
15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (param)
15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_AOT:
15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userAOT != (AUDIO_OBJECT_TYPE)value) {
15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* check if AOT matches the allocated modules */
15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            switch ( value ) {
15622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_PS:
15632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_MP2_PS:
15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_PS))) {
15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  err = AACENC_INVALID_CONFIG;
15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  goto bail;
15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_SBR:
15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_MP2_SBR:
15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_SBR))) {
15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  err = AACENC_INVALID_CONFIG;
15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  goto bail;
15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_AAC_LC:
15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_MP2_AAC_LC:
15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_ER_AAC_LC:
15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_ER_AAC_LD:
15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case AOT_ER_AAC_ELD:
15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_AAC))) {
15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  err = AACENC_INVALID_CONFIG;
15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  goto bail;
15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              default:
15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                goto bail;
15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }/* switch value */
15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userAOT = (AUDIO_OBJECT_TYPE)value;
15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BITRATE:
15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userBitrate != value) {
15942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userBitrate = value;
15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
15982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BITRATEMODE:
15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userBitrateMode != value) {
16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            switch ( value ) {
16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case 0:
16022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              case 8:
16032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                settings->userBitrateMode = value;
16042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
16062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              default:
16072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
16082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
16092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } /* switch value */
16102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
16122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SAMPLERATE:
16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userSamplerate != value) {
16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !( (value==8000) || (value==11025) || (value==12000) || (value==16000) || (value==22050) || (value==24000) ||
16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   (value==32000) || (value==44100) || (value==48000) || (value==64000) || (value==88200) || (value==96000) ) )
16162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
16192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userSamplerate = value;
16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */
16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CHANNELMODE:
16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userChannelMode != (CHANNEL_MODE)value) {
16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            const CHANNEL_MODE_CONFIG_TAB* pConfig = FDKaacEnc_GetChannelModeConfiguration((CHANNEL_MODE)value);
16282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (pConfig==NULL) {
16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
16302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
16312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
16322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( (pConfig->nElements > hAacEncoder->nMaxAacElements)
16332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              || (pConfig->nChannelsEff > hAacEncoder->nMaxAacChannels)
16342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              || !((value>=1) && (value<=6))
16352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                )
16362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
16372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
16382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
16392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
16402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userChannelMode = (CHANNEL_MODE)value;
16422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->nChannels = pConfig->nChannels;
16432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */
16442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
16452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
16472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BANDWIDTH:
16482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userBandwidth != value) {
16492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          settings->userBandwidth = value;
16502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;
16512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
16532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CHANNELORDER:
16542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->aacConfig.channelOrder != (CHANNEL_ORDER)value) {
16552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (! ((value==0) || (value==1)) ) {
16562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
16572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
16582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
16592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->aacConfig.channelOrder = (CHANNEL_ORDER)value;
16602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */
16612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
16622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
16642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_AFTERBURNER:
16652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userAfterburner != value) {
16662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (! ((value==0) || (value==1)) ) {
16672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
16682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
16692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
16702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userAfterburner = value;
16712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;
16722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
16742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_GRANULE_LENGTH:
16752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userFramelength != value) {
16762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          switch (value) {
16772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case 1024:
16782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case 512:
16792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case 480:
16802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              settings->userFramelength = value;
16812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT;
16822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              break;
16832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            default:
16842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              err = AACENC_INVALID_CONFIG;
16852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              break;
16862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
16872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
16892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SBR_MODE:
16902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userSbrEnabled != value) {
16912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userSbrEnabled = value;
16922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
16932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
16952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_TRANSMUX:
16962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpType != (TRANSPORT_TYPE)value) {
16972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            TRANSPORT_TYPE  type  = (TRANSPORT_TYPE)value;
16992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            UINT            flags = hAacEncoder->CAPF_tpEnc;
17002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !( ((type==TT_MP4_ADIF)      &&  (flags&CAPF_ADIF))
17022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_ADTS)      &&  (flags&CAPF_ADTS))
17032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_LATM_MCP0) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS)))
17042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_LATM_MCP1) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS)))
17052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_LOAS)      &&  (flags&CAPF_LOAS))
17062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 || ((type==TT_MP4_RAW)       &&  (flags&CAPF_RAWPACKETS))
17072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                ) )
17082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
17092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
17102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
17112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
17122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpType = (TRANSPORT_TYPE)value;
17132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
17142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
17152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
17162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SIGNALING_MODE:
17172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpSignaling != value) {
17182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !((value==0) || (value==1) || (value==2)) ) {
17192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
17202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
17212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
17222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpSignaling = value;
17232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
17242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
17252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
17262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_PROTECTION:
17272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpProtection != value) {
17282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !((value==0) || (value==1)) ) {
17292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
17302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
17312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
17322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpProtection = value;
17332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
17342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
17352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
17362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_HEADER_PERIOD:
17372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpHeaderPeriod != value) {
17382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpHeaderPeriod = value;
17392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
17402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
17412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
17422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_TPSUBFRAMES:
17432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userTpNsubFrames != value) {
17442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (! ( (value>=1) && (value<=4) ) ) {
17452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
17462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
17472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
17482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userTpNsubFrames = value;
17492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
17502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
17512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
17522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_ANCILLARY_BITRATE:
17532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (settings->userAncDataRate != value) {
17542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userAncDataRate = value;
17552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
17562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
17572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CONTROL_STATE:
17582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hAacEncoder->InitFlags != value) {
17592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (value&AACENC_RESET_INBUFFER) {
17602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hAacEncoder->nSamplesRead = 0;
17612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
17622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags = value;
17632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
17642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
17652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_METADATA_MODE:
17662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ((UINT)settings->userMetaDataMode != value) {
17672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !((value>=0) && (value<=2)) ) {
17682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                err = AACENC_INVALID_CONFIG;
17692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
17702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
17712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            settings->userMetaDataMode = value;
17722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;
17732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
17742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
17752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
17762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = AACENC_UNSUPPORTED_PARAMETER;
17772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
17782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }  /* switch(param) */
17792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
17812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
17822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
17832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17842228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT aacEncoder_GetParam(
17852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_AACENCODER   hAacEncoder,
17862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_PARAM        param
17872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
17882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
17892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT value = 0;
17902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    USER_PARAM *settings = &hAacEncoder->extParam;
17912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* check encoder handle */
17932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hAacEncoder == NULL) {
17942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
17952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
17962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* apply param value */
17982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (param)
17992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
18002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_AOT:
18012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.audioObjectType;
18022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BITRATE:
18042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)((hAacEncoder->aacConfig.bitrateMode==AACENC_BR_MODE_CBR) ? hAacEncoder->aacConfig.bitRate : -1);
18052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BITRATEMODE:
18072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.bitrateMode;
18082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SAMPLERATE:
18102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)settings->userSamplerate;
18112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CHANNELMODE:
18132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.channelMode;
18142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BANDWIDTH:
18162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.bandWidth;
18172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CHANNELORDER:
18192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.channelOrder;
18202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_AFTERBURNER:
18222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.useRequant;
18232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_GRANULE_LENGTH:
18252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.framelength;
18262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       break;
18272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SBR_MODE:
18282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT) (hAacEncoder->aacConfig.syntaxFlags & AC_SBR_PRESENT) ? 1 : 0;
18292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_TRANSMUX:
18312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)settings->userTpType;
18322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_SIGNALING_MODE:
18342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)settings->userTpSignaling;
18352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_PROTECTION:
18372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)settings->userTpProtection;
18382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_HEADER_PERIOD:
18402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->coderConfig.headerPeriod;
18412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_TPSUBFRAMES:
18432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)settings->userTpNsubFrames;
18442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_ANCILLARY_BITRATE:
18462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->aacConfig.anc_Rate;
18472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_CONTROL_STATE:
18492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (UINT)hAacEncoder->InitFlags;
18502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_METADATA_MODE:
18522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value = (hAacEncoder->metaDataAllowed==0) ? 0 : (UINT)settings->userMetaDataMode;
18532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
18542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
18552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      //err = MPS_INVALID_PARAMETER;
18562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
18572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }  /* switch(param) */
18582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
18602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return value;
18612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
18622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18632228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAACENC_ERROR aacEncInfo(
18642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_AACENCODER   hAacEncoder,
18652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACENC_InfoStruct        *pInfo
18662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
18672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
18682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_ERROR err = AACENC_OK;
18692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(pInfo, sizeof(AACENC_InfoStruct));
18712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->confSize = 64; /* pre-initialize */
18722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->maxOutBufBytes    = ((hAacEncoder->nMaxAacChannels*6144)+7)>>3;
18742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->maxAncBytes       = hAacEncoder->aacConfig.maxAncBytesPerAU;
18752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->inBufFillLevel    = hAacEncoder->nSamplesRead/hAacEncoder->extParam.nChannels;
18762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->inputChannels     = hAacEncoder->extParam.nChannels;
18772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->frameLength       = hAacEncoder->nSamplesToRead/hAacEncoder->extParam.nChannels;
18782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pInfo->encoderDelay      = hAacEncoder->nDelay/hAacEncoder->extParam.nChannels;
18792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Get encoder configuration */
18812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( aacEncGetConf(hAacEncoder, &pInfo->confSize, &pInfo->confBuf[0]) != AAC_ENC_OK) {
18822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = AACENC_INIT_ERROR;
18832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
18842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
18852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
18862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
18872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
18882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1889