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/***************************  Fast MPEG AAC Audio Encoder  **********************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Initial author:       M. Schug / A. Groeschel
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   contents/description: fast aac coder functions
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacenc.h"
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "bitenc.h"
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "interface.h"
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "psy_configuration.h"
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "psy_main.h"
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "qc_main.h"
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "bandwidth.h"
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "channel_map.h"
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tns_func.h"
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacEnc_ram.h"
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "genericStds.h"
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define MIN_BUFSIZE_PER_EFF_CHAN 6144
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate,
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                      INT framelength,
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                      INT ancillaryRate,
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                      INT *ancillaryBitsPerFrame,
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                      INT sampleRate);
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT FDKaacEnc_LimitBitrate(
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_TRANSPORTENC hTpEnc,
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT coreSamplingRate,
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT frameLength,
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT nChannels,
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT nChannelsEff,
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT bitRate,
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT averageBits,
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT *pAverageBitsPerFrame,
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT bitrateMode,
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT nSubFrames
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT transportBits, prevBitRate, averageBitsPerFrame, shift = 0, iter=0;
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  while ( (frameLength & ~((1<<(shift+1))-1)) == frameLength
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    && (coreSamplingRate & ~((1<<(shift+1))-1)) == coreSamplingRate )
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    shift ++;
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  do {
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    prevBitRate = bitRate;
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     averageBitsPerFrame = (bitRate*(frameLength>>shift)) / (coreSamplingRate>>shift) / nSubFrames;
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pAverageBitsPerFrame != NULL) {
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *pAverageBitsPerFrame = averageBitsPerFrame;
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hTpEnc != NULL) {
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transportBits = transportEnc_GetStaticBits(hTpEnc, averageBitsPerFrame);
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Assume some worst case */
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transportBits = 208;
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
152381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi    bitRate = FDKmax(bitRate, ((((40 * nChannels) + transportBits) * (coreSamplingRate)) / frameLength) );
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_ASSERT(bitRate >= 0);
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitRate = FDKmin(bitRate, ((nChannelsEff * MIN_BUFSIZE_PER_EFF_CHAN)*(coreSamplingRate>>shift)) / (frameLength>>shift)) ;
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_ASSERT(bitRate >= 0);
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } while (prevBitRate != bitRate && iter++ < 3) ;
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return bitRate;
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AACENC_BITRATE_MODE bitrateMode;
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int chanBitrate[2]; /* mono/stereo settings */
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} CONFIG_TAB_ENTRY_VBR;
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const CONFIG_TAB_ENTRY_VBR configTabVBR[] = {
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {AACENC_BR_MODE_CBR,   {     0,     0}} ,
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {AACENC_BR_MODE_VBR_1, { 32000, 20000}} ,
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {AACENC_BR_MODE_VBR_2, { 40000, 32000}} ,
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {AACENC_BR_MODE_VBR_3, { 56000, 48000}} ,
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {AACENC_BR_MODE_VBR_4, { 72000, 64000}} ,
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {AACENC_BR_MODE_VBR_5, {112000, 96000}}
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*-----------------------------------------------------------------------------
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     functionname: FDKaacEnc_GetVBRBitrate
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:  Get VBR bitrate from vbr quality
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     input params: int vbrQuality (VBR0, VBR1, VBR2)
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   channelMode
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     returns:      vbr bitrate
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ------------------------------------------------------------------------------*/
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT FDKaacEnc_GetVBRBitrate(INT bitrateMode, CHANNEL_MODE channelMode)
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT bitrate = 0;
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT monoStereoMode = 0; /* default mono */
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKaacEnc_GetMonoStereoMode(channelMode)==EL_MODE_STEREO) {
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      monoStereoMode = 1;
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch((AACENC_BITRATE_MODE)bitrateMode){
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_1:
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_2:
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_3:
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_4:
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_5:
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitrate = configTabVBR[bitrateMode].chanBitrate[monoStereoMode];
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_INVALID:
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_CBR:
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_SFR:
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_FF:
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitrate = 0;
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* convert channel bitrate to overall bitrate*/
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bitrate *= FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff;
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return bitrate;
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief  Convert encoder bitreservoir value for transport library.
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param bitrateMode           Bitratemode used in current encoder instance. Se ::AACENC_BITRATE_MODE
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param bitresTotal           Encoder bitreservoir level in bits.
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return  Corrected bitreservoir level used in transport library.
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT FDKaacEnc_EncBitresToTpBitres(
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_BITRATE_MODE bitrateMode,
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 bitresTotal
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT transporBitreservoir = 0;
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (bitrateMode) {
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BR_MODE_CBR:
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transporBitreservoir = bitresTotal; /* encoder bitreservoir level */
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BR_MODE_VBR_1:
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BR_MODE_VBR_2:
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BR_MODE_VBR_3:
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BR_MODE_VBR_4:
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BR_MODE_VBR_5:
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transporBitreservoir = FDK_INT_MAX; /* signal variable bitrate */
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BR_MODE_FF:
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BR_MODE_SFR:
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transporBitreservoir = 0;           /* super framing and fixed framing */
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;                              /* without bitreservoir signaling */
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AACENC_BR_MODE_INVALID:
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transporBitreservoir = 0;           /* invalid configuration*/
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDK_ASSERT(0);
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return transporBitreservoir;
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*-----------------------------------------------------------------------------
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     functionname: FDKaacEnc_AacInitDefaultConfig
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:  gives reasonable default configuration
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     returns:      ---
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ------------------------------------------------------------------------------*/
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config)
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* make thepre initialization of the structs flexible */
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(config, sizeof(AACENC_CONFIG));
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* default ancillary */
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->anc_Rate = 0;         /* no ancillary data */
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->ancDataBitRate = 0;   /* no additional consumed bitrate */
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* default configurations */
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->bitRate         = -1;                   /* bitrate must be set*/
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->averageBits     = -1;                   /* instead of bitrate/s we can configure bits/superframe */
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->bitrateMode     = 0;
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->bandWidth       = 0;                    /* get bandwidth from table */
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->useTns          = TNS_ENABLE_MASK;      /* tns enabled completly */
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->usePns          = 1;                    /* depending on channelBitrate this might be set to 0 later */
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->useIS           = 1;                    /* Intensity Stereo Configuration */
283381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi    config->framelength     = -1;                   /* Framesize not configured */
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->syntaxFlags     = 0;                    /* default syntax with no specialities */
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->epConfig        = -1;                   /* no ER syntax -> no additional error protection */
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->nSubFrames      = 1;                    /* default, no sub frames */
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->channelOrder    = CH_ORDER_MPEG;        /* Use MPEG channel ordering. */
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->channelMode     = MODE_UNKNOWN;
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->minBitsPerFrame = -1;                   /* minum number of bits in each AU */
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->maxBitsPerFrame = -1;                   /* minum number of bits in each AU */
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    config->bitreservoir    = -1;                   /* default, uninitialized value */
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* init tabs in fixpoint_math */
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    InitLdInt();
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    InitInvSqrtTab();
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_Open
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  allocate and initialize a new encoder instance
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    returns:      error code
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ---------------------------------------------------------------------------*/
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_Open(HANDLE_AAC_ENC  *phAacEnc,
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 const INT        nElements,
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 const INT        nChannels,
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 const INT        nSubFrames)
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_ENCODER_ERROR ErrorStatus;
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_ENC           *hAacEnc = NULL;
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR             *dynamicRAM = NULL;
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (phAacEnc==NULL) {
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_INVALID_HANDLE;
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* allocate encoder structure */
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hAacEnc = GetRam_aacEnc_AacEncoder();
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hAacEnc == NULL) {
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ErrorStatus = AAC_ENC_NO_MEMORY;
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(hAacEnc, sizeof(AAC_ENC));
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hAacEnc->dynamic_RAM = GetAACdynamic_RAM();
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  dynamicRAM = (UCHAR*)hAacEnc->dynamic_RAM;
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* allocate the Psy aud Psy Out structure */
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   ErrorStatus = FDKaacEnc_PsyNew(&hAacEnc->psyKernel,
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  nElements,
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  nChannels
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 ,dynamicRAM
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 );
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if (ErrorStatus != AAC_ENC_OK)
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     goto bail;
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   ErrorStatus = FDKaacEnc_PsyOutNew(hAacEnc->psyOut,
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     nElements,
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     nChannels,
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     nSubFrames
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    ,dynamicRAM
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    );
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if (ErrorStatus != AAC_ENC_OK)
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     goto bail;
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* allocate the Q&C Out structure */
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_QCOutNew(hAacEnc->qcOut,
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   nElements,
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   nChannels,
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   nSubFrames
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  ,dynamicRAM
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   );
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ErrorStatus != AAC_ENC_OK)
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* allocate the Q&C kernel */
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_QCNew(&hAacEnc->qcKernel,
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 nElements
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                ,dynamicRAM
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                );
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ErrorStatus != AAC_ENC_OK)
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hAacEnc->maxChannels = nChannels;
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hAacEnc->maxElements = nElements;
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hAacEnc->maxFrames   = nSubFrames;
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *phAacEnc = hAacEnc;
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ErrorStatus;
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC      hAacEnc,
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       AACENC_CONFIG      *config,     /* pre-initialized config struct */
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       HANDLE_TRANSPORTENC hTpEnc,
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       ULONG               initFlags)
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_ENCODER_ERROR ErrorStatus;
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT psyBitrate, tnsMask; //INT profile = 1;
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CHANNEL_MAPPING   *cm = NULL;
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT qmbfac, qbw;
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL mbfac, bw_ratio;
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  QC_INIT qcInit;
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT averageBitsPerFrame = 0;
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (config==NULL)
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_INVALID_HANDLE;
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /******************* sanity checks *******************/
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* check config structure */
396fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi  if (config->nChannels  < 1 || config->nChannels > (8)) {
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_UNSUPPORTED_CHANNELCONFIG;
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* check sample rate */
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (config->sampleRate)
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 8000:
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 11025:
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 12000:
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 16000:
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 22050:
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 24000:
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 32000:
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 44100:
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 48000:
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 64000:
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 88200:
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 96000:
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_UNSUPPORTED_SAMPLINGRATE;
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* bitrate has to be set */
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (config->bitRate==-1) {
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_UNSUPPORTED_BITRATE;
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* check bit rate */
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKaacEnc_LimitBitrate(
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hTpEnc,
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->sampleRate,
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->framelength,
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->nChannels,
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKaacEnc_GetChannelModeConfiguration(config->channelMode)->nChannelsEff,
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->bitRate,
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->averageBits,
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         &averageBitsPerFrame,
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->bitrateMode,
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          config->nSubFrames
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ) != config->bitRate )
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_UNSUPPORTED_BITRATE;
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (config->syntaxFlags & AC_ER_VCB11) {
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_UNSUPPORTED_ER_FORMAT;
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (config->syntaxFlags & AC_ER_HCR) {
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_UNSUPPORTED_ER_FORMAT;
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* check frame length */
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (config->framelength)
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 1024:
454381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      if ( config->audioObjectType == AOT_ER_AAC_LD
455381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi        || config->audioObjectType == AOT_ER_AAC_ELD )
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AAC_ENC_INVALID_FRAME_LENGTH;
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 512:
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 480:
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( config->audioObjectType != AOT_ER_AAC_LD
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        && config->audioObjectType != AOT_ER_AAC_ELD )
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AAC_ENC_INVALID_FRAME_LENGTH;
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_INVALID_FRAME_LENGTH;
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (config->anc_Rate != 0) {
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     ErrorStatus = FDKaacEnc_InitCheckAncillary(config->bitRate,
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                config->framelength,
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                config->anc_Rate,
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               &hAacEnc->ancillaryBitsPerFrame,
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                config->sampleRate);
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (ErrorStatus != AAC_ENC_OK)
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       goto bail;
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* update estimated consumed bitrate */
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     config->ancDataBitRate += ( (hAacEnc->ancillaryBitsPerFrame * config->sampleRate) / config->framelength );
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* maximal allowed DSE bytes in frame */
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* fixpoint calculation*/
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT q_res, encBitrate, sc;
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL tmp = fDivNorm(config->framelength, config->sampleRate, &q_res);
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  encBitrate = (config->bitRate/*-config->ancDataBitRate*/)- (INT)(config->nChannels*8000);
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sc = CountLeadingBits(encBitrate);
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  config->maxAncBytesPerAU = FDKmin( (256), FDKmax(0,(INT)(fMultDiv2(tmp, (FIXP_DBL)(encBitrate<<sc))>>(-q_res+sc-1+3))) );
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* bind config to hAacEnc->config */
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hAacEnc->config = config;
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* set hAacEnc->bitrateMode */
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hAacEnc->bitrateMode = (AACENC_BITRATE_MODE)config->bitrateMode;
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hAacEnc->encoderMode = config->channelMode;
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_InitChannelMapping(hAacEnc->encoderMode, config->channelOrder, &hAacEnc->channelMapping);
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ErrorStatus != AAC_ENC_OK)
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  cm = &hAacEnc->channelMapping;
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_DetermineBandWidth(&hAacEnc->config->bandWidth,
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             config->bandWidth,
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             config->bitRate - config->ancDataBitRate,
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             hAacEnc->bitrateMode,
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             config->sampleRate,
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             config->framelength,
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             cm,
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             hAacEnc->encoderMode);
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ErrorStatus != AAC_ENC_OK)
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hAacEnc->bandwidth90dB = (INT)hAacEnc->config->bandWidth;
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  tnsMask = config->useTns ? TNS_ENABLE_MASK : 0x0;
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  psyBitrate = config->bitRate - config->ancDataBitRate;
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_psyInit(hAacEnc->psyKernel,
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  hAacEnc->psyOut,
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  hAacEnc->maxFrames,
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  hAacEnc->maxChannels,
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  config->audioObjectType,
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  cm);
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ErrorStatus != AAC_ENC_OK)
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_psyMainInit(hAacEnc->psyKernel,
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      config->audioObjectType,
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      cm,
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      config->sampleRate,
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      config->framelength,
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      psyBitrate,
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      tnsMask,
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      hAacEnc->bandwidth90dB,
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      config->usePns,
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      config->useIS,
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      config->syntaxFlags,
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      initFlags);
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ErrorStatus != AAC_ENC_OK)
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_QCOutInit(hAacEnc->qcOut, hAacEnc->maxFrames, cm);
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ErrorStatus != AAC_ENC_OK)
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcInit.channelMapping      = &hAacEnc->channelMapping;
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcInit.sceCpe              = 0;
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
561577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi  if ((config->bitrateMode>=1) && (config->bitrateMode<=5)) {
562577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi      qcInit.averageBits     = (averageBitsPerFrame+7)&~7;
563577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi      qcInit.bitRes          = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff;
564577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi      qcInit.maxBits         = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff;
565577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi      qcInit.minBits         = 0;
566577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi  }
567577fcbb570d023be4cea9564292dd2bd95f40c3bJean-Michel Trivi  else
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int maxBitres;
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcInit.averageBits     = (averageBitsPerFrame+7)&~7;
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      maxBitres              = (MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff) - qcInit.averageBits;
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcInit.bitRes          = (config->bitreservoir!=-1) ? FDKmin(config->bitreservoir, maxBitres) : maxBitres;
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcInit.maxBits         = fixMin(MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes);
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcInit.maxBits         = (config->maxBitsPerFrame!=-1) ? fixMin(qcInit.maxBits, config->maxBitsPerFrame) : qcInit.maxBits;
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcInit.minBits         = fixMax(0, ((averageBitsPerFrame-1)&~7)-qcInit.bitRes-transportEnc_GetStaticBits(hTpEnc, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes));
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcInit.minBits         = (config->minBitsPerFrame!=-1) ? fixMax(qcInit.minBits, config->minBitsPerFrame) : qcInit.minBits;
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5817ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  qcInit.sampleRate          = config->sampleRate;
5827ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  qcInit.advancedBitsToPe    = isLowDelay(config->audioObjectType) ? 1 : 0 ;
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcInit.nSubFrames          = config->nSubFrames;
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcInit.padding.paddingRest = config->sampleRate;
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Calc meanPe */
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bw_ratio = fDivNorm((FIXP_DBL)hAacEnc->bandwidth90dB, (FIXP_DBL)(config->sampleRate>>1), &qbw);
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qbw = DFRACT_BITS-1-qbw;
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config->sampleRate/2.0f); */
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcInit.meanPe = fMult(bw_ratio, (FIXP_DBL)((10*config->framelength)<<16)) >> (qbw-15);
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Calc maxBitFac */
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  mbfac = fDivNorm((MIN_BUFSIZE_PER_EFF_CHAN-744)*cm->nChannelsEff, qcInit.averageBits/qcInit.nSubFrames, &qmbfac);
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qmbfac = DFRACT_BITS-1-qmbfac;
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcInit.maxBitFac = (qmbfac > 24) ? (mbfac >> (qmbfac - 24)):(mbfac << (24 - qmbfac));
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch(config->bitrateMode){
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_CBR:
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.bitrateMode = QCDATA_BR_MODE_CBR;
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_1:
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.bitrateMode = QCDATA_BR_MODE_VBR_1;
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_2:
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.bitrateMode = QCDATA_BR_MODE_VBR_2;
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_3:
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.bitrateMode = QCDATA_BR_MODE_VBR_3;
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_4:
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.bitrateMode = QCDATA_BR_MODE_VBR_4;
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_VBR_5:
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.bitrateMode = QCDATA_BR_MODE_VBR_5;
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_SFR:
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.bitrateMode = QCDATA_BR_MODE_SFR;
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AACENC_BR_MODE_FF:
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.bitrateMode = QCDATA_BR_MODE_FF;
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ErrorStatus = AAC_ENC_UNSUPPORTED_BITRATE_MODE;
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcInit.invQuant = (config->useRequant)?2:0;
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* maxIterations should be set to the maximum number of requantization iterations that are
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   * allowed before the crash recovery functionality is activated. This setting should be adjusted
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   * to the processing power available, i.e. to the processing power headroom in one frame that is
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   * still left after normal encoding without requantization. Please note that if activated this
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   * functionality is used most likely only in cases where the encoder is operating beyond
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   * recommended settings, i.e. the audio quality is suboptimal anyway. Activating the crash
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   * recovery does not further reduce audio quality significantly in these cases. */
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (config->audioObjectType == AOT_ER_AAC_LD) || (config->audioObjectType == AOT_ER_AAC_ELD) ) {
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.maxIterations = 2;
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcInit.maxIterations = 5;
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcInit.bitrate = config->bitRate - config->ancDataBitRate;
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcInit.staticBits = transportEnc_GetStaticBits(hTpEnc, qcInit.averageBits/qcInit.nSubFrames);
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_QCInit(hAacEnc->qcKernel, &qcInit);
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ErrorStatus != AAC_ENC_OK)
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Map virtual aot's to intern aot used in bitstream writer. */
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (hAacEnc->config->audioObjectType) {
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_MP2_AAC_LC:
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_DABPLUS_AAC_LC:
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hAacEnc->aot = AOT_AAC_LC;
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_MP2_SBR:
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_DABPLUS_SBR:
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hAacEnc->aot = AOT_SBR;
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_MP2_PS:
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case AOT_DABPLUS_PS:
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hAacEnc->aot = AOT_PS;
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hAacEnc->aot = hAacEnc->config->audioObjectType;
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* common things */
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ErrorStatus;
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_EncodeFrame
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:  encodes one frame
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    returns:      error code
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ---------------------------------------------------------------------------*/
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC       hAacEnc,          /* encoder handle */
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         HANDLE_TRANSPORTENC  hTpEnc,
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         INT_PCM* RESTRICT    inputBuffer,
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         INT*                 nOutBytes,
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         AACENC_EXT_PAYLOAD   extPayload[MAX_TOTAL_EXT_PAYLOADS]
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       )
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AAC_ENCODER_ERROR ErrorStatus;
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int    el, n, c=0;
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR  extPayloadUsed[MAX_TOTAL_EXT_PAYLOADS];
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CHANNEL_MAPPING *cm      = &hAacEnc->channelMapping;
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    PSY_OUT *psyOut = hAacEnc->psyOut[c];
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    QC_OUT  *qcOut  = hAacEnc->qcOut[c];
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(extPayloadUsed, MAX_TOTAL_EXT_PAYLOADS * sizeof(UCHAR));
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOut->elementExtBits = 0; /* sum up all extended bit of each element */
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOut->staticBits     = 0; /* sum up side info bits of each element */
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOut->totalNoRedPe   = 0; /* sum up PE */
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* advance psychoacoustics */
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (el=0; el<cm->nElements; el++) {
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ELEMENT_INFO elInfo = cm->elInfo[el];
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (elInfo.elType == ID_SCE)
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          || (elInfo.elType == ID_CPE)
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          || (elInfo.elType == ID_LFE) )
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            int ch;
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* update pointer!*/
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for(ch=0;ch<elInfo.nChannelsInEl;ch++) {
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                PSY_OUT_CHANNEL *psyOutChan = psyOut->psyOutElement[el]->psyOutChannel[ch];
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                QC_OUT_CHANNEL  *qcOutChan = qcOut->qcElement[el]->qcOutChannel[ch];
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChan->mdctSpectrum       = qcOutChan->mdctSpectrum;
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChan->sfbSpreadEnergy  = qcOutChan->sfbSpreadEnergy;
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChan->sfbEnergy          = qcOutChan->sfbEnergy;
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChan->sfbEnergyLdData    = qcOutChan->sfbEnergyLdData;
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChan->sfbMinSnrLdData    = qcOutChan->sfbMinSnrLdData;
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                psyOutChan->sfbThresholdLdData = qcOutChan->sfbThresholdLdData;
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDKaacEnc_psyMain(elInfo.nChannelsInEl,
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              hAacEnc->psyKernel->psyElement[el],
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              hAacEnc->psyKernel->psyDynamic,
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              hAacEnc->psyKernel->psyConf,
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              psyOut->psyOutElement[el],
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              inputBuffer,
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              cm->elInfo[el].ChannelIndex,
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              cm->nChannels
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    );
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* FormFactor, Pe and staticBitDemand calculation */
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ErrorStatus = FDKaacEnc_QCMainPrepare(&elInfo,
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   hAacEnc->qcKernel->hAdjThr->adjThrStateElem[el],
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   psyOut->psyOutElement[el],
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   qcOut->qcElement[el],
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   hAacEnc->aot,
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   hAacEnc->config->syntaxFlags,
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   hAacEnc->config->epConfig);
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (ErrorStatus != AAC_ENC_OK)
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              return ErrorStatus;
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /*-------------------------------------------- */
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            qcOut->qcElement[el]->extBitsUsed = 0;
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            qcOut->qcElement[el]->nExtensions = 0;
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* reset extension payload */
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDKmemclear(&qcOut->qcElement[el]->extension, (1)*sizeof(QC_OUT_EXTENSION));
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) {
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if ( !extPayloadUsed[n]
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  && (extPayload[n].associatedChElement == el)
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  && (extPayload[n].dataSize > 0)
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  && (extPayload[n].pData != NULL) )
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                {
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    int idx = qcOut->qcElement[el]->nExtensions++;
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    qcOut->qcElement[el]->extension[idx].type         = extPayload[n].dataType;   /* Perform a sanity check on the type? */
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    qcOut->qcElement[el]->extension[idx].nPayloadBits = extPayload[n].dataSize;
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    qcOut->qcElement[el]->extension[idx].pPayload = extPayload[n].pData;
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    qcOut->qcElement[el]->extBitsUsed +=
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          FDKaacEnc_writeExtensionData( NULL,
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                       &qcOut->qcElement[el]->extension[idx],
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                        0, 0,
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                        hAacEnc->config->syntaxFlags,
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                        hAacEnc->aot,
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                        hAacEnc->config->epConfig );
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    extPayloadUsed[n] = 1;
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* sum up extension and static bits for all channel elements */
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            qcOut->elementExtBits += qcOut->qcElement[el]->extBitsUsed;
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            qcOut->staticBits   += qcOut->qcElement[el]->staticBitsUsed;
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* sum up pe */
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            qcOut->totalNoRedPe += qcOut->qcElement[el]->peData.pe;
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOut->nExtensions   = 0;
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOut->globalExtBits = 0;
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* reset extension payload */
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(&qcOut->extension, (2+2)*sizeof(QC_OUT_EXTENSION));
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Add extension payload not assigned to an channel element
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (Ancillary data is the only supported type up to now) */
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) {
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( !extPayloadUsed[n]
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          && (extPayload[n].associatedChElement == -1)
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          && (extPayload[n].pData != NULL) )
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            UINT payloadBits = 0;
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (extPayload[n].dataType == EXT_DATA_ELEMENT) {
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (hAacEnc->ancillaryBitsPerFrame) {
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* granted frame dse bitrate */
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    payloadBits = hAacEnc->ancillaryBitsPerFrame;
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                else {
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* write anc data if bitrate constraint fulfilled */
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    if ((extPayload[n].dataSize>>3) <= hAacEnc->config->maxAncBytesPerAU) {
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        payloadBits = extPayload[n].dataSize;
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    }
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                payloadBits = fixMin( extPayload[n].dataSize, payloadBits );
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } else {
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                payloadBits = extPayload[n].dataSize;
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (payloadBits > 0)
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                int idx = qcOut->nExtensions++;
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOut->extension[idx].type         = extPayload[n].dataType;   /* Perform a sanity check on the type? */
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOut->extension[idx].nPayloadBits = payloadBits;
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOut->extension[idx].pPayload = extPayload[n].pData;
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                qcOut->globalExtBits += FDKaacEnc_writeExtensionData( NULL,
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                     &qcOut->extension[idx],
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                      0, 0,
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                      hAacEnc->config->syntaxFlags,
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                      hAacEnc->aot,
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                      hAacEnc->config->epConfig );
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (extPayload[n].dataType == EXT_DATA_ELEMENT) {
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    /* substract the processed bits */
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    extPayload[n].dataSize -= payloadBits;
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                extPayloadUsed[n] = 1;
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (!(hAacEnc->config->syntaxFlags & (AC_SCALABLE|AC_ER))) {
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcOut->globalExtBits += EL_ID_BITS;  /* add bits for ID_END */
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* build bitstream all nSubFrames */
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT totalBits    = 0;   /* Total AU bits */;
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT avgTotalBits = 0;
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*-------------------------------------------- */
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Get average total bits */
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*-------------------------------------------- */
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* frame wise bitrate adaption */
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FDKaacEnc_AdjustBitrate(hAacEnc->qcKernel,
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    cm,
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   &avgTotalBits,
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    hAacEnc->config->bitRate,
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    hAacEnc->config->sampleRate,
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    hAacEnc->config->framelength);
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* adjust super frame bitrate */
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            avgTotalBits *= hAacEnc->config->nSubFrames;
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Make first estimate of transport header overhead.
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           Take maximum possible frame size into account to prevent bitreservoir underrun. */
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hAacEnc->qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, avgTotalBits + hAacEnc->qcKernel->bitResTot);
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*-------------------------------------------- */
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*-------------------------------------------- */
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*-------------------------------------------- */
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ErrorStatus = FDKaacEnc_QCMain(hAacEnc->qcKernel,
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       hAacEnc->psyOut,
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       hAacEnc->qcOut,
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       avgTotalBits,
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       cm
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      ,hAacEnc->aot,
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       hAacEnc->config->syntaxFlags,
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       hAacEnc->config->epConfig);
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (ErrorStatus != AAC_ENC_OK)
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return ErrorStatus;
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*-------------------------------------------- */
8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*-------------------------------------------- */
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ErrorStatus = FDKaacEnc_updateFillBits(cm,
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               hAacEnc->qcKernel,
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               hAacEnc->qcKernel->elementBits,
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               hAacEnc->qcOut);
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (ErrorStatus != AAC_ENC_OK)
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return ErrorStatus;
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /*-------------------------------------------- */
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ErrorStatus = FDKaacEnc_FinalizeBitConsumption(cm,
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                           hAacEnc->qcKernel,
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                           qcOut,
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                           qcOut->qcElement,
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                           hTpEnc,
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                           hAacEnc->aot,
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                           hAacEnc->config->syntaxFlags,
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                           hAacEnc->config->epConfig);
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (ErrorStatus != AAC_ENC_OK)
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                return ErrorStatus;
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /*-------------------------------------------- */
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            totalBits += qcOut->totalBits;
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*-------------------------------------------- */
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKaacEnc_updateBitres(cm,
9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               hAacEnc->qcKernel,
9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               hAacEnc->qcOut);
9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*-------------------------------------------- */
9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* for ( all sub frames ) ... */
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* write bitstream header */
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              transportEnc_WriteAccessUnit(
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hTpEnc,
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    totalBits,
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    FDKaacEnc_EncBitresToTpBitres(hAacEnc->bitrateMode, hAacEnc->qcKernel->bitResTot),
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    cm->nChannelsEff);
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* write bitstream */
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              ErrorStatus = FDKaacEnc_WriteBitstream(
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hTpEnc,
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    cm,
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    qcOut,
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    psyOut,
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hAacEnc->qcKernel,
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hAacEnc->aot,
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hAacEnc->config->syntaxFlags,
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hAacEnc->config->epConfig);
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (ErrorStatus != AAC_ENC_OK)
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                return ErrorStatus;
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* transportEnc_EndAccessUnit() is being called inside FDKaacEnc_WriteBitstream() */
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              transportEnc_GetFrame(hTpEnc, nOutBytes);
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* -end- if (curFrame==hAacEnc->qcKernel->nSubFrames) */
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /*-------------------------------------------- */
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_OK;
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname:FDKaacEnc_Close
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description: delete encoder instance
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    returns:
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ---------------------------------------------------------------------------*/
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_Close( HANDLE_AAC_ENC*  phAacEnc)   /* encoder handle */
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (*phAacEnc == NULL) {
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return;
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AAC_ENC *hAacEnc = (AAC_ENC*)*phAacEnc;
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   if (hAacEnc->dynamic_RAM != NULL)
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       FreeAACdynamic_RAM(&hAacEnc->dynamic_RAM);
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKaacEnc_PsyClose(&hAacEnc->psyKernel,hAacEnc->psyOut);
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKaacEnc_QCClose(&hAacEnc->qcKernel, hAacEnc->qcOut);
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FreeRam_aacEnc_AacEncoder(phAacEnc);
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* The following functions are in this source file only for convenience and */
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* need not be visible outside of a possible encoder library. */
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* basic defines for ancillary data */
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define MAX_ANCRATE 19200            /* ancillary rate >= 19200 isn't valid */
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname:  FDKaacEnc_InitCheckAncillary
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:   initialize and check ancillary data struct
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return:        if success or NULL if error
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ---------------------------------------------------------------------------*/
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate,
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                      INT framelength,
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                      INT ancillaryRate,
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                      INT *ancillaryBitsPerFrame,
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                      INT sampleRate)
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT diffToByteAlign;
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* don't use negative ancillary rates */
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( ancillaryRate < -1 )
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_UNSUPPORTED_ANC_BITRATE;
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* check if ancillary rate is ok */
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (ancillaryRate != (-1)) && (ancillaryRate != 0) ) {
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* ancRate <= 15% of bitrate && ancRate < 19200 */
10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( ( ancillaryRate >= MAX_ANCRATE ) ||
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         ( (ancillaryRate * 20) > (bitRate * 3) ) ) {
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_UNSUPPORTED_ANC_BITRATE;
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else if (ancillaryRate == -1) {
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* if no special ancRate is requested but a ancillary file is
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       stated, then generate a ancillary rate matching to the bitrate */
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (bitRate >= (MAX_ANCRATE * 10)) {
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* ancillary rate is 19199 */
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ancillaryRate = (MAX_ANCRATE - 1);
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else { /* 10% of bitrate */
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ancillaryRate = bitRate / 10;
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* make ancillaryBitsPerFrame byte align */
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *ancillaryBitsPerFrame = (ancillaryRate * framelength ) / sampleRate;
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  diffToByteAlign = *ancillaryBitsPerFrame % 8;
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *ancillaryBitsPerFrame = *ancillaryBitsPerFrame - diffToByteAlign;
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1038