12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* -----------------------------------------------------------------------------------------------------------
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi� Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/******************************** MPEG Audio Encoder **************************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Initial author:       M. Werner
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   contents/description: Quantizing & coding
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "qc_main.h"
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "quantize.h"
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "interface.h"
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "adj_thr.h"
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sf_estim.h"
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "bit_cnt.h"
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "dyn_bits.h"
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "channel_map.h"
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacEnc_ram.h"
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "genericStds.h"
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct {
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  QCDATA_BR_MODE bitrateMode;
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  LONG vbrQualFactor;
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} TAB_VBR_QUAL_FACTOR;
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const TAB_VBR_QUAL_FACTOR tableVbrQualFactor[] = {
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {QCDATA_BR_MODE_VBR_1, FL2FXCONST_DBL(0.160f)}, /* 32 kbps mono   AAC-LC + SBR + PS */
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {QCDATA_BR_MODE_VBR_2, FL2FXCONST_DBL(0.148f)}, /* 64 kbps stereo AAC-LC + SBR      */
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {QCDATA_BR_MODE_VBR_3, FL2FXCONST_DBL(0.135f)}, /* 80 - 96 kbps stereo AAC-LC       */
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {QCDATA_BR_MODE_VBR_4, FL2FXCONST_DBL(0.111f)}, /* 128 kbps stereo AAC-LC           */
114ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi  {QCDATA_BR_MODE_VBR_5, FL2FXCONST_DBL(0.070f)}  /* 192 kbps stereo AAC-LC           */
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT isConstantBitrateMode(
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const QCDATA_BR_MODE bitrateMode
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ( ((bitrateMode==QCDATA_BR_MODE_CBR) || (bitrateMode==QCDATA_BR_MODE_SFR) || (bitrateMode==QCDATA_BR_MODE_FF)) ? 1 : 0 );
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef enum{
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FRAME_LEN_BYTES_MODULO =  1,
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FRAME_LEN_BYTES_INT    =  2
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}FRAME_LEN_RESULT_MODE;
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* forward declarations */
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT FDKaacEnc_calcMaxValueInSfb(INT   sfbCnt,
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             INT   maxSfbPerGroup,
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             INT   sfbPerGroup,
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             INT  *RESTRICT sfbOffset,
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             SHORT *RESTRICT quantSpectrum,
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             UINT *RESTRICT maxValue);
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_crashRecovery(INT               nChannels,
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          PSY_OUT_ELEMENT*  psyOutElement,
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          QC_OUT*           qcOut,
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          QC_OUT_ELEMENT   *qcElement,
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          INT               bitsToSave,
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          AUDIO_OBJECT_TYPE aot,
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          UINT              syntaxFlags,
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          SCHAR             epConfig);
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_reduceBitConsumption(int*             iterations,
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       const int        maxIterations,
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       int              gainAdjustment,
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       int*             chConstraintsFulfilled,
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       int*             calculateQuant,
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       int              nChannels,
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       PSY_OUT_ELEMENT* psyOutElement,
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       QC_OUT*          qcOut,
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       QC_OUT_ELEMENT*  qcOutElement,
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       ELEMENT_BITS*    elBits,
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       AUDIO_OBJECT_TYPE  aot,
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       UINT             syntaxFlags,
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       SCHAR            epConfig);
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid  FDKaacEnc_QCClose (QC_STATE  **phQCstate, QC_OUT **phQC);
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname: FDKaacEnc_calcFrameLen
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description:
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    returns:
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    input:
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    output:
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT FDKaacEnc_calcFrameLen(INT bitRate,
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        INT sampleRate,
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        INT granuleLength,
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        FRAME_LEN_RESULT_MODE mode)
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   INT result;
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   result = ((granuleLength)>>3)*(bitRate);
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   switch(mode) {
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     case FRAME_LEN_BYTES_MODULO:
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         result %= sampleRate;
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     break;
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     case FRAME_LEN_BYTES_INT:
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         result /= sampleRate;
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     break;
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   return(result);
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************************************************************
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    functionname:FDKaacEnc_framePadding
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    description: Calculates if padding is needed for actual frame
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    returns:
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    input:
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    output:
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*****************************************************************************/
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT FDKaacEnc_framePadding(INT bitRate,
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        INT sampleRate,
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        INT granuleLength,
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        INT *paddingRest)
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT paddingOn;
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT difference;
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  paddingOn = 0;
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  difference = FDKaacEnc_calcFrameLen( bitRate,
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             sampleRate,
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             granuleLength,
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             FRAME_LEN_BYTES_MODULO );
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *paddingRest-=difference;
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (*paddingRest <= 0 ) {
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    paddingOn = 1;
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *paddingRest += sampleRate;
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return( paddingOn );
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_QCOutNew
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_QCOutNew(QC_OUT    **phQC,
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     const INT   nElements,
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     const INT   nChannels,
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     const INT   nSubFrames
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    ,UCHAR      *dynamic_RAM
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    )
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_ENCODER_ERROR ErrorStatus;
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int n, i;
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int elInc = 0, chInc = 0;
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (n=0; n<nSubFrames; n++) {
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    phQC[n] = GetRam_aacEnc_QCout(n);
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (phQC[n] == NULL) {
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ErrorStatus = AAC_ENC_NO_MEMORY;
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto QCOutNew_bail;
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<nChannels; i++) {
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      phQC[n]->pQcOutChannels[i] = GetRam_aacEnc_QCchannel(chInc, dynamic_RAM);
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( phQC[n]->pQcOutChannels[i] == NULL
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         )
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         ErrorStatus = AAC_ENC_NO_MEMORY;
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         goto QCOutNew_bail;
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      chInc++;
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* nChannels */
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<nElements; i++) {
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      phQC[n]->qcElement[i]      = GetRam_aacEnc_QCelement(elInc);
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (phQC[n]->qcElement[i] == NULL)
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ErrorStatus = AAC_ENC_NO_MEMORY;
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto QCOutNew_bail;
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      elInc++;
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* nElements */
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* nSubFrames */
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectQCOutNew_bail:
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ErrorStatus;
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_QCOutInit
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_QCOutInit(QC_OUT          *phQC[(1)],
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      const INT        nSubFrames,
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      const CHANNEL_MAPPING *cm)
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT n,i,ch;
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (n=0; n<nSubFrames; n++) {
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT chInc = 0;
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<cm->nElements; i++) {
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch=0; ch<cm->elInfo[i].nChannelsInEl; ch++) {
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        phQC[n]->qcElement[i]->qcOutChannel[ch] = phQC[n]->pQcOutChannels[chInc];
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        chInc++;
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* chInEl */
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* nElements */
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* nSubFrames */
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_QCNew
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_QCNew(QC_STATE  **phQC,
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  INT         nElements
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 ,UCHAR*      dynamic_RAM
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           )
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_ENCODER_ERROR ErrorStatus;
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i;
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  QC_STATE* hQC = GetRam_aacEnc_QCstate();
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *phQC = hQC;
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hQC == NULL) {
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ErrorStatus = AAC_ENC_NO_MEMORY;
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto QCNew_bail;
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKaacEnc_AdjThrNew(&hQC->hAdjThr, nElements)) {
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ErrorStatus = AAC_ENC_NO_MEMORY;
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto QCNew_bail;
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKaacEnc_BCNew(&(hQC->hBitCounter), dynamic_RAM)) {
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ErrorStatus = AAC_ENC_NO_MEMORY;
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto QCNew_bail;
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<nElements; i++) {
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hQC->elementBits[i] = GetRam_aacEnc_ElementBits(i);
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hQC->elementBits[i] == NULL) {
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ErrorStatus = AAC_ENC_NO_MEMORY;
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto QCNew_bail;
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectQCNew_bail:
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_QCClose(phQC, NULL);
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ErrorStatus;
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_QCInit
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_QCInit(QC_STATE *hQC,
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   struct QC_INIT *init)
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
369ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi  int i;
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->maxBitsPerFrame = init->maxBits;
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->minBitsPerFrame = init->minBits;
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->nElements       = init->channelMapping->nElements;
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->bitResTotMax    = init->bitRes;
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->bitResTot       = init->bitRes;
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->maxBitFac       = init->maxBitFac;
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->bitrateMode     = init->bitrateMode;
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->invQuant        = init->invQuant;
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->maxIterations   = init->maxIterations;
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( isConstantBitrateMode(hQC->bitrateMode) ) {
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT bitresPerChannel = (hQC->bitResTotMax / init->channelMapping->nChannelsEff);
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */
38346ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi    hQC->bitDistributionMode = (bitresPerChannel>BITRES_MIN_LD) ? 0 : (bitresPerChannel>0) ? 1 : 2;
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
3867ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi    hQC->bitDistributionMode = 0; /* full bitreservoir */
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->padding.paddingRest = init->padding.paddingRest;
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hQC->globHdrBits = init->staticBits; /* Bit overhead due to transport */
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_InitElementBits(hQC,
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            init->channelMapping,
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            init->bitrate,
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            (init->averageBits/init->nSubFrames) - hQC->globHdrBits,
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hQC->maxBitsPerFrame/init->channelMapping->nChannelsEff);
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
400ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi  hQC->vbrQualFactor = FL2FXCONST_DBL(0.f);
401ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi  for (i=0; i<(int)(sizeof(tableVbrQualFactor)/sizeof(TAB_VBR_QUAL_FACTOR)); i++) {
402ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi    if (hQC->bitrateMode==tableVbrQualFactor[i].bitrateMode) {
403ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi      hQC->vbrQualFactor = (FIXP_DBL)tableVbrQualFactor[i].vbrQualFactor;
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
405ef30836651bf059c3120c03dd11e08b6aafdae13Jean-Michel Trivi    }
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
40846ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi  if (init->channelMapping->nChannelsEff == 1 &&
40946ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi     (init->bitrate / init->channelMapping->nChannelsEff) < 32000 &&
41046ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi     init->advancedBitsToPe != 0
41146ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi     )
41246ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi  {
41346ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi    hQC->dZoneQuantEnable = 1;
41446ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi  } else {
41546ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi    hQC->dZoneQuantEnable = 0;
41646ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi  }
41746ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi
4187ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi  FDKaacEnc_AdjThrInit(
4197ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        hQC->hAdjThr,
4207ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        init->meanPe,
4217ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        hQC->elementBits,                 /* or channelBitrates, was: channelBitrate */
4227ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        hQC->invQuant,
4237ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        init->channelMapping->nElements,
4247ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        init->channelMapping->nChannelsEff,
4257ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        init->sampleRate,                 /* output sample rate */
4267ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        init->advancedBitsToPe,           /* if set, calc bits2PE factor depending on samplerate */
42746ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi        hQC->vbrQualFactor,
42846ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi        hQC->dZoneQuantEnable
4297ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi        );
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_QCMainPrepare
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_QCMainPrepare(ELEMENT_INFO              *elInfo,
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          ATS_ELEMENT* RESTRICT      adjThrStateElement,
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          PSY_OUT_ELEMENT* RESTRICT  psyOutElement,
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          QC_OUT_ELEMENT* RESTRICT   qcOutElement,
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          AUDIO_OBJECT_TYPE          aot,
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          UINT                       syntaxFlags,
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          SCHAR                      epConfig
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         )
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK;
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT  nChannels = elInfo->nChannelsInEl;
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  PSY_OUT_CHANNEL** RESTRICT psyOutChannel = psyOutElement->psyOutChannel;    /* may be modified in-place */
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_CalcFormFactor(qcOutElement->qcOutChannel, psyOutChannel, nChannels);
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* prepare and calculate PE without reduction */
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKaacEnc_peCalculation(&qcOutElement->peData, psyOutChannel, qcOutElement->qcOutChannel, &psyOutElement->toolsInfo, adjThrStateElement, nChannels);
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_ChannelElementWrite( NULL, elInfo, NULL,
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               psyOutElement,
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               psyOutElement->psyOutChannel,
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               syntaxFlags,
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               aot,
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               epConfig,
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              &qcOutElement->staticBitsUsed,
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               0 );
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ErrorStatus;
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_AdjustBitrate
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:  adjusts framelength via padding on a frame to frame basis,
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       to achieve a bitrate that demands a non byte aligned
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       framelength
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:       errorcode
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_AdjustBitrate(QC_STATE        *RESTRICT hQC,
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          CHANNEL_MAPPING *RESTRICT cm,
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          INT             *avgTotalBits,
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          INT              bitRate,       /* total bitrate */
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          INT              sampleRate,    /* output sampling rate */
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          INT              granuleLength) /* frame length */
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT paddingOn;
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT frameLen;
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Do we need an extra padding byte? */
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  paddingOn = FDKaacEnc_framePadding(bitRate,
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           sampleRate,
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           granuleLength,
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          &hQC->padding.paddingRest);
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  frameLen = paddingOn + FDKaacEnc_calcFrameLen(bitRate,
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      sampleRate,
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      granuleLength,
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      FRAME_LEN_BYTES_INT);
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *avgTotalBits = frameLen<<3;
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_ENCODER_ERROR FDKaacEnc_distributeElementDynBits(QC_STATE*         hQC,
510fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                                  QC_OUT_ELEMENT*   qcElement[(8)],
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                  CHANNEL_MAPPING*  cm,
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                  INT               codeBits)
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i, firstEl = cm->nElements-1;
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT totalBits = 0;
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=(cm->nElements-1); i>=0; i--) {
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((cm->elInfo[i].elType == ID_SCE) || (cm->elInfo[i].elType == ID_CPE) ||
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        (cm->elInfo[i].elType == ID_LFE))
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcElement[i]->grantedDynBits =  (INT)fMult(hQC->elementBits[i]->relativeBitsEl, (FIXP_DBL)codeBits);
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      totalBits += qcElement[i]->grantedDynBits;
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      firstEl = i;
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcElement[firstEl]->grantedDynBits += codeBits - totalBits;
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief  Verify whether minBitsPerFrame criterion can be satisfied.
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * This function evaluates the bit consumption only if minBitsPerFrame parameter is not 0.
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * In hyperframing mode the difference between grantedDynBits and usedDynBits of all sub frames
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * results the number of fillbits to be written.
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * This bits can be distrubitued in superframe to reach minBitsPerFrame bit consumption in single AU's.
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * The return value denotes if enough desired fill bits are available to achieve minBitsPerFrame in all frames.
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * This check can only be used within superframes.
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param qcOut            Pointer to coding data struct.
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param minBitsPerFrame  Minimal number of bits to be consumed in each frame.
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param nSubFrames       Number of frames in superframe
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \return
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *          - 1: all fine
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *          - 0: criterion not fulfilled
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int checkMinFrameBitsDemand(
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        QC_OUT**                  qcOut,
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 minBitsPerFrame,
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                 nSubFrames
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int result = 1; /* all fine*/
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return result;
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_getMinimalStaticBitdemand
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:  calculate minmal size of static bits by reduction ,
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       to zero spectrum and deactivating tns and MS
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:       number of static bits
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int FDKaacEnc_getMinimalStaticBitdemand(CHANNEL_MAPPING*     cm,
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               PSY_OUT**            psyOut)
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AUDIO_OBJECT_TYPE aot = AOT_AAC_LC;
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT  syntaxFlags = 0;
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR epConfig = -1;
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i, bitcount = 0;
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<cm->nElements; i++) {
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ELEMENT_INFO elInfo = cm->elInfo[i];
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (elInfo.elType == ID_SCE)
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        || (elInfo.elType == ID_CPE)
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        || (elInfo.elType == ID_LFE) )
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT minElBits = 0;
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKaacEnc_ChannelElementWrite( NULL, &elInfo, NULL,
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       psyOut[0]->psyOutElement[i],
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       psyOut[0]->psyOutElement[i]->psyOutChannel,
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       syntaxFlags,
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       aot,
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       epConfig,
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      &minElBits,
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       1 );
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitcount += minElBits;
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return bitcount;
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_ENCODER_ERROR FDKaacEnc_prepareBitDistribution(QC_STATE*            hQC,
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                PSY_OUT**            psyOut,
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                QC_OUT**             qcOut,
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                CHANNEL_MAPPING*     cm,
609fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                                QC_OUT_ELEMENT*      qcElement[(1)][(8)],
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                INT                  avgTotalBits,
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                INT                 *totalAvailableBits,
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                INT                 *avgTotalDynBits)
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int i;
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* get maximal allowed dynamic bits */
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcOut[0]->grantedDynBits =  (fixMin(hQC->maxBitsPerFrame, avgTotalBits) - hQC->globHdrBits)&~7;
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcOut[0]->grantedDynBits -= (qcOut[0]->globalExtBits + qcOut[0]->staticBits + qcOut[0]->elementExtBits);
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcOut[0]->maxDynBits = ((hQC->maxBitsPerFrame)&~7) - (qcOut[0]->globalExtBits + qcOut[0]->staticBits + qcOut[0]->elementExtBits);
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* assure that enough bits are available */
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ((qcOut[0]->grantedDynBits+hQC->bitResTot) < 0) {
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* crash recovery allows to reduce static bits to a minimum */
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (qcOut[0]->grantedDynBits+hQC->bitResTot) < (FDKaacEnc_getMinimalStaticBitdemand(cm, psyOut)-qcOut[0]->staticBits) )
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return AAC_ENC_BITRES_TOO_LOW;
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* distribute dynamic bits to each element */
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKaacEnc_distributeElementDynBits(hQC,
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               qcElement[0],
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               cm,
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                               qcOut[0]->grantedDynBits);
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *avgTotalDynBits = 0; /*frameDynBits;*/
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *totalAvailableBits = avgTotalBits;
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* sum up corrected granted PE */
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcOut[0]->totalGrantedPeCorr = 0;
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<cm->nElements; i++)
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ELEMENT_INFO elInfo = cm->elInfo[i];
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int nChannels = elInfo.nChannelsInEl;
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            (elInfo.elType == ID_LFE))
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* for ( all sub frames ) ... */
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                FDKaacEnc_DistributeBits(hQC->hAdjThr,
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         hQC->hAdjThr->adjThrStateElem[i],
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         psyOut[0]->psyOutElement[i]->psyOutChannel,
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        &qcElement[0][i]->peData,
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        &qcElement[0][i]->grantedPe,
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        &qcElement[0][i]->grantedPeCorr,
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         nChannels,
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         psyOut[0]->psyOutElement[i]->commonWindow,
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         qcElement[0][i]->grantedDynBits,
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         hQC->elementBits[i]->bitResLevelEl,
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         hQC->elementBits[i]->maxBitResBitsEl,
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         hQC->maxBitFac,
6607ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi                                         hQC->bitDistributionMode);
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                *totalAvailableBits += hQC->elementBits[i]->bitResLevelEl;
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* get total corrected granted PE */
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        qcOut[0]->totalGrantedPeCorr += qcElement[0][i]->grantedPeCorr;
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }  /* -end- element loop */
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *totalAvailableBits = FDKmin(hQC->maxBitsPerFrame, (*totalAvailableBits));
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_OK;
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_ENCODER_ERROR FDKaacEnc_updateUsedDynBits(INT*               sumDynBitsConsumed,
676fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                            QC_OUT_ELEMENT*    qcElement[(8)],
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            CHANNEL_MAPPING*   cm)
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i;
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *sumDynBitsConsumed = 0;
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<cm->nElements; i++)
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ELEMENT_INFO elInfo = cm->elInfo[i];
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          (elInfo.elType == ID_LFE))
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* sum up bits consumed */
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          *sumDynBitsConsumed  += qcElement[i]->dynBitsUsed;
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }  /* -end- element loop */
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT FDKaacEnc_getTotalConsumedDynBits(QC_OUT** qcOut,
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   INT nSubFrames)
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT c, totalBits=0;
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* sum up bit consumption for all sub frames */
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (c=0; c<nSubFrames; c++)
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* bit consumption not valid if dynamic bits
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           not available in one sub frame */
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (qcOut[c]->usedDynBits==-1) return -1;
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        totalBits += qcOut[c]->usedDynBits;
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return totalBits;
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT FDKaacEnc_getTotalConsumedBits(QC_OUT**          qcOut,
719fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                QC_OUT_ELEMENT*   qcElement[(1)][(8)],
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                CHANNEL_MAPPING*  cm,
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT               globHdrBits,
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT               nSubFrames)
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int c, i;
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int totalUsedBits = 0;
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (c = 0 ; c < nSubFrames ; c++ )
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int dataBits = 0;
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i=0; i<cm->nElements; i++)
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ((cm->elInfo[i].elType == ID_SCE) || (cm->elInfo[i].elType == ID_CPE) ||
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                (cm->elInfo[i].elType == ID_LFE))
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   dataBits += qcElement[c][i]->dynBitsUsed + qcElement[c][i]->staticBitsUsed + qcElement[c][i]->extBitsUsed;
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        dataBits += qcOut[c]->globalExtBits;
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        totalUsedBits += (8 - (dataBits) % 8) % 8;
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        totalUsedBits += dataBits + globHdrBits;  /* header bits for every frame */
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return totalUsedBits;
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_ENCODER_ERROR FDKaacEnc_BitResRedistribution(
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        QC_STATE *const              hQC,
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const CHANNEL_MAPPING *const cm,
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                    avgTotalBits
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* check bitreservoir fill level */
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hQC->bitResTot < 0) {
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_BITRES_TOO_LOW;
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (hQC->bitResTot > hQC->bitResTotMax) {
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_ENC_BITRES_TOO_HIGH;
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT i, firstEl = cm->nElements-1;
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT totalBits = 0, totalBits_max = 0;
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int totalBitreservoir    = FDKmin(hQC->bitResTot, (hQC->maxBitsPerFrame-avgTotalBits));
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int totalBitreservoirMax = FDKmin(hQC->bitResTotMax, (hQC->maxBitsPerFrame-avgTotalBits));
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int sc_bitResTot = CountLeadingBits(totalBitreservoir);
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int sc_bitResTotMax = CountLeadingBits(totalBitreservoirMax);
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i=(cm->nElements-1); i>=0; i--) {
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ((cm->elInfo[i].elType == ID_SCE) || (cm->elInfo[i].elType == ID_CPE) ||
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            (cm->elInfo[i].elType == ID_LFE))
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hQC->elementBits[i]->bitResLevelEl = (INT)fMult(hQC->elementBits[i]->relativeBitsEl, (FIXP_DBL)(totalBitreservoir<<sc_bitResTot))>>sc_bitResTot;
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          totalBits += hQC->elementBits[i]->bitResLevelEl;
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          hQC->elementBits[i]->maxBitResBitsEl = (INT)fMult(hQC->elementBits[i]->relativeBitsEl, (FIXP_DBL)(totalBitreservoirMax<<sc_bitResTotMax))>>sc_bitResTotMax;
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          totalBits_max += hQC->elementBits[i]->maxBitResBitsEl;
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          firstEl = i;
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hQC->elementBits[firstEl]->bitResLevelEl   += totalBitreservoir - totalBits;
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hQC->elementBits[firstEl]->maxBitResBitsEl += totalBitreservoirMax - totalBits_max;
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_OK;
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_QCMain(QC_STATE* RESTRICT         hQC,
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   PSY_OUT**                  psyOut,
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   QC_OUT**                   qcOut,
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   INT                        avgTotalBits,
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   CHANNEL_MAPPING*           cm
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  ,AUDIO_OBJECT_TYPE          aot,
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   UINT                       syntaxFlags,
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   SCHAR                      epConfig
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  )
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i, c;
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK;
802381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi  INT avgTotalDynBits = 0; /* maximal allowed dynamic bits for all frames */
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT totalAvailableBits = 0;
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT nSubFrames = 1;
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*-------------------------------------------- */
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* redistribute total bitreservoir to elements */
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ErrorStatus = FDKaacEnc_BitResRedistribution(hQC, cm, avgTotalBits);
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ErrorStatus != AAC_ENC_OK) {
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return ErrorStatus;
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*-------------------------------------------- */
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* fastenc needs one time threshold simulation,
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     in case of multiple frames, one more guess has to be calculated */
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*-------------------------------------------- */
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* helper pointer */
819fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi      QC_OUT_ELEMENT*  qcElement[(1)][(8)];
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* work on a copy of qcChannel and qcElement */
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i=0; i<cm->nElements; i++)
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ELEMENT_INFO elInfo = cm->elInfo[i];
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              (elInfo.elType == ID_LFE))
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* for ( all sub frames ) ... */
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              for (c = 0 ; c < nSubFrames ; c++ )
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  {
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      qcElement[c][i] = qcOut[c]->qcElement[i];
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  }
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*-------------------------------------------- */
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*-------------------------------------------- */
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( isConstantBitrateMode(hQC->bitrateMode) )
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* calc granted dynamic bits for sub frame and
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             distribute it to each element */
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ErrorStatus = FDKaacEnc_prepareBitDistribution(
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 hQC,
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 psyOut,
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 qcOut,
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 cm,
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 qcElement,
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 avgTotalBits,
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &totalAvailableBits,
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                &avgTotalDynBits);
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (ErrorStatus != AAC_ENC_OK) {
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return ErrorStatus;
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOut[0]->grantedDynBits = ((hQC->maxBitsPerFrame - (hQC->globHdrBits))&~7)
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   - (qcOut[0]->globalExtBits + qcOut[0]->staticBits + qcOut[0]->elementExtBits);
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOut[0]->maxDynBits     = qcOut[0]->grantedDynBits;
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          totalAvailableBits = hQC->maxBitsPerFrame;
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          avgTotalDynBits = 0;
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef PNS_PRECOUNT_ENABLE
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Calculate estimated pns bits and substract them from grantedDynBits to get a more accurate number of available bits. */
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (syntaxFlags & (AC_LD|AC_ELD))
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int estimatedPnsBits = 0, ch;
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (ch=0; ch<cm->nChannels; ch++) {
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOut[0]->pQcOutChannels[ch]->sectionData.noiseNrgBits = noisePreCount(psyOut[0]->pPsyOutChannels[ch]->noiseNrg, psyOut[0]->pPsyOutChannels[ch]->maxSfbPerGroup);
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          estimatedPnsBits += qcOut[0]->pQcOutChannels[ch]->sectionData.noiseNrgBits;
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        qcOut[0]->grantedDynBits -= estimatedPnsBits;
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* for ( all sub frames ) ... */
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (c = 0 ; c < nSubFrames ; c++ )
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* for CBR and VBR mode */
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKaacEnc_AdjustThresholds(hQC->hAdjThr->adjThrStateElem,
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     qcElement[c],
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     qcOut[c],
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     psyOut[c]->psyOutElement,
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     isConstantBitrateMode(hQC->bitrateMode),
89146ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi                                     hQC->hAdjThr->maxIter2ndGuess,
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     cm);
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* -end- sub frame counter */
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*-------------------------------------------- */
897fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi      INT iterations[(1)][(8)];
898fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi      INT chConstraintsFulfilled[(1)][(8)][(2)];
899fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi      INT calculateQuant[(1)][(8)][(2)];
900fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi      INT constraintsFulfilled[(1)][(8)];
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*-------------------------------------------- */
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* for ( all sub frames ) ... */
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (c = 0 ; c < nSubFrames ; c++ )
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (i=0; i<cm->nElements; i++)
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              ELEMENT_INFO elInfo = cm->elInfo[i];
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              INT ch, nChannels = elInfo.nChannelsInEl;
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  (elInfo.elType == ID_LFE))
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      /* Turn thresholds into scalefactors, optimize bit consumption and verify conformance */
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      FDKaacEnc_EstimateScaleFactors(psyOut[c]->psyOutElement[i]->psyOutChannel,
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            qcElement[c][i]->qcOutChannel,
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            hQC->invQuant,
91946ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi                                            hQC->dZoneQuantEnable,
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                            cm->elInfo[i].nChannelsInEl);
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      /*-------------------------------------------- */
9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      constraintsFulfilled[c][i] = 1;
9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      iterations[c][i] = 0 ;
9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      for (ch = 0; ch < nChannels; ch++)
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      {
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          chConstraintsFulfilled[c][i][ch] = 1;
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          calculateQuant[c][i][ch] = 1;
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      }
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      /*-------------------------------------------- */
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }  /* -end- element loop */
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOut[c]->usedDynBits = -1;
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } /* -end- sub frame counter */
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT quantizationDone = 0;
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT sumDynBitsConsumedTotal  = 0;
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT decreaseBitConsumption = -1; /* no direction yet! */
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*-------------------------------------------- */
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* -start- Quantization loop ...               */
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*-------------------------------------------- */
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      do /* until max allowed bits per frame and maxDynBits!=-1*/
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          quantizationDone = 0;
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              c = 0;              /* get frame to process */
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              for (i=0; i<cm->nElements; i++)
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  ELEMENT_INFO elInfo = cm->elInfo[i];
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  INT ch, nChannels = elInfo.nChannelsInEl;
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      (elInfo.elType == ID_LFE))
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  {
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      do /* until spectral values < MAX_QUANT */
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      {
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /*-------------------------------------------- */
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          if (!constraintsFulfilled[c][i])
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          {
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              FDKaacEnc_reduceBitConsumption(&iterations[c][i],
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    hQC->maxIterations,
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    (decreaseBitConsumption) ? 1 : -1,
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    chConstraintsFulfilled[c][i],
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    calculateQuant[c][i],
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    nChannels,
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    psyOut[c]->psyOutElement[i],
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    qcOut[c],
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    qcElement[c][i],
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    hQC->elementBits[i],
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    aot,
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    syntaxFlags,
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    epConfig);
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          }
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /*-------------------------------------------- */
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /*-------------------------------------------- */
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          constraintsFulfilled[c][i] = 1 ;
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /*-------------------------------------------- */
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /* quantize spectrum (per each channel) */
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          for (ch = 0; ch < nChannels; ch++)
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          {
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              /*-------------------------------------------- */
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              chConstraintsFulfilled[c][i][ch] = 1;
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              /*-------------------------------------------- */
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              if (calculateQuant[c][i][ch])
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              {
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  QC_OUT_CHANNEL* qcOutCh = qcElement[c][i]->qcOutChannel[ch];
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  PSY_OUT_CHANNEL* psyOutCh = psyOut[c]->psyOutElement[i]->psyOutChannel[ch];
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  calculateQuant[c][i][ch] = 0; /* calculate quantization only if necessary */
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  /*-------------------------------------------- */
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  FDKaacEnc_QuantizeSpectrum(psyOutCh->sfbCnt,
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                             psyOutCh->maxSfbPerGroup,
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                             psyOutCh->sfbPerGroup,
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                             psyOutCh->sfbOffsets,
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                             qcOutCh->mdctSpectrum,
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                             qcOutCh->globalGain,
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                             qcOutCh->scf,
101446ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi                                                             qcOutCh->quantSpec,
101546ba3676b854acbc69a4c7845f578d4c2886377bJean-Michel Trivi                                                             hQC->dZoneQuantEnable);
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  /*-------------------------------------------- */
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  if (FDKaacEnc_calcMaxValueInSfb(psyOutCh->sfbCnt,
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                        psyOutCh->maxSfbPerGroup,
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                        psyOutCh->sfbPerGroup,
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                        psyOutCh->sfbOffsets,
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                        qcOutCh->quantSpec,
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                        qcOutCh->maxValueInSfb) > MAX_QUANT)
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  {
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    chConstraintsFulfilled[c][i][ch] = 0;
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    constraintsFulfilled[c][i] = 0 ;
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    /* if quanizted value out of range; increase global gain! */
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    decreaseBitConsumption = 1;
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  }
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  /*-------------------------------------------- */
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              } /* if calculateQuant[c][i][ch] */
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          } /* channel loop */
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /*-------------------------------------------- */
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /* quantize spectrum (per each channel) */
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /*-------------------------------------------- */
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      } while (!constraintsFulfilled[c][i]) ; /* does not regard bit consumption */
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      /*-------------------------------------------- */
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      /*-------------------------------------------- */
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      qcElement[c][i]->dynBitsUsed = 0 ; /* reset dynamic bits */
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      /* quantization valid in current channel! */
10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      for (ch = 0; ch < nChannels; ch++)
10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      {
10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          QC_OUT_CHANNEL* qcOutCh = qcElement[c][i]->qcOutChannel[ch];
10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          PSY_OUT_CHANNEL *psyOutCh = psyOut[c]->psyOutElement[i]->psyOutChannel[ch];
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /* count dynamic bits */
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          INT chDynBits = FDKaacEnc_dynBitCount(hQC->hBitCounter,
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                qcOutCh->quantSpec,
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                qcOutCh->maxValueInSfb,
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                qcOutCh->scf,
10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                psyOutCh->lastWindowSequence,
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                psyOutCh->sfbCnt,
10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                psyOutCh->maxSfbPerGroup,
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                psyOutCh->sfbPerGroup,
10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                psyOutCh->sfbOffsets,
10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                &qcOutCh->sectionData,
10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                psyOutCh->noiseNrg,
10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                psyOutCh->isBook,
10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                psyOutCh->isScale,
10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                syntaxFlags) ;
10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          /* sum up dynamic channel bits */
10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          qcElement[c][i]->dynBitsUsed += chDynBits;
10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      }
10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      /* save dynBitsUsed for correction of bits2pe relation */
10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      if(hQC->hAdjThr->adjThrStateElem[i]->dynBitsLast==-1) {
10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          hQC->hAdjThr->adjThrStateElem[i]->dynBitsLast = qcElement[c][i]->dynBitsUsed;
10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      }
10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }  /* -end- element loop */
10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* update dynBits of current subFrame */
10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              FDKaacEnc_updateUsedDynBits(&qcOut[c]->usedDynBits,
10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 qcElement[c],
10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 cm);
10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* get total consumed bits, dyn bits in all sub frames have to be valid */
10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              sumDynBitsConsumedTotal = FDKaacEnc_getTotalConsumedDynBits(qcOut, nSubFrames);
10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (sumDynBitsConsumedTotal==-1)
10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  quantizationDone = 0; /* bit consumption not valid in all sub frames */
10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              else
10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                int sumBitsConsumedTotal = FDKaacEnc_getTotalConsumedBits(qcOut, qcElement, cm, hQC->globHdrBits, nSubFrames);
10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                /* in all frames are valid dynamic bits */
1100381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi                if ( ((sumBitsConsumedTotal < totalAvailableBits) || qcOut[c]->usedDynBits==0) && (decreaseBitConsumption==1) && checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)
11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      /*()*/  )
11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                {
11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    quantizationDone = 1; /* exit bit adjustment */
11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                if (sumBitsConsumedTotal > totalAvailableBits && (decreaseBitConsumption==0) )
11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//                      /*()*/  )
11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                {
11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    quantizationDone = 0; /* reset! */
11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    break;
11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                }
11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /*-------------------------------------------- */
11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              int emergencyIterations = 1;
11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              int dynBitsOvershoot    = 0;
11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              for (c = 0 ; c < nSubFrames ; c++ )
11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  for (i=0; i<cm->nElements; i++)
11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  {
11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      ELEMENT_INFO elInfo = cm->elInfo[i];
11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          (elInfo.elType == ID_LFE))
11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      {
11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        /* iteration limitation */
11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        emergencyIterations &= ((iterations[c][i] < hQC->maxIterations) ? 0 : 1);
11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      }
11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  }
11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* detection if used dyn bits exceeds the maximal allowed criterion */
11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  dynBitsOvershoot |= ((qcOut[c]->usedDynBits > qcOut[c]->maxDynBits) ? 1 : 0);
11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (quantizationDone==0 || dynBitsOvershoot)
11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              {
11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  int sumBitsConsumedTotal = FDKaacEnc_getTotalConsumedBits(qcOut, qcElement, cm, hQC->globHdrBits, nSubFrames);
11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if ( (sumDynBitsConsumedTotal >= avgTotalDynBits) || (sumDynBitsConsumedTotal==0) ) {
11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      quantizationDone = 1;
11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  }
11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if (emergencyIterations && (sumBitsConsumedTotal < totalAvailableBits)) {
11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      quantizationDone = 1;
11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  }
11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if ((sumBitsConsumedTotal > totalAvailableBits) || !checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)) {
11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      quantizationDone = 0;
11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  }
11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if ((sumBitsConsumedTotal < totalAvailableBits) && checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)) {
11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      decreaseBitConsumption = 0;
11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  }
11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  else {
11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      decreaseBitConsumption = 1;
11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  }
11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  if (dynBitsOvershoot) {
11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     quantizationDone = 0;
11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     decreaseBitConsumption = 1;
11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  }
11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  /* reset constraints fullfilled flags */
11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  FDKmemclear(constraintsFulfilled, sizeof(constraintsFulfilled));
11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  FDKmemclear(chConstraintsFulfilled, sizeof(chConstraintsFulfilled));
11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }/* quantizationDone */
11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } while (!quantizationDone) ;
11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*-------------------------------------------- */
11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* ... -end- Quantization loop                 */
11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*-------------------------------------------- */
11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*-------------------------------------------- */
11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*-------------------------------------------- */
11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_ENCODER_ERROR FDKaacEnc_reduceBitConsumption(int*             iterations,
11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              const int        maxIterations,
11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              int              gainAdjustment,
11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              int*             chConstraintsFulfilled,
11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              int*             calculateQuant,
11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              int              nChannels,
11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              PSY_OUT_ELEMENT* psyOutElement,
11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              QC_OUT*          qcOut,
11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              QC_OUT_ELEMENT*  qcOutElement,
11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              ELEMENT_BITS*    elBits,
11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              AUDIO_OBJECT_TYPE aot,
11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              UINT             syntaxFlags,
11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              SCHAR            epConfig)
11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int ch;
11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /** SOLVING PROBLEM **/
11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ((*iterations)++ >= maxIterations)
12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (qcOutElement->dynBitsUsed==0) {
12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* crash recovery */
12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT bitsToSave = 0;
12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (bitsToSave = fixMax((qcOutElement->dynBitsUsed + 8) - (elBits->bitResLevelEl + qcOutElement->grantedDynBits),
12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                (qcOutElement->dynBitsUsed + qcOutElement->staticBitsUsed + 8) - (elBits->maxBitsEl))) > 0 )
12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKaacEnc_crashRecovery(nChannels,
12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      psyOutElement,
12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      qcOut,
12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      qcOutElement,
12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      bitsToSave,
12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      aot,
12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      syntaxFlags,
12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      epConfig) ;
12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch = 0; ch < nChannels; ch++)
12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutElement->qcOutChannel[ch]->globalGain += 1;
12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch = 0; ch < nChannels; ch++)
12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      calculateQuant[ch] = 1;
12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else /* iterations >= maxIterations */
12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* increase gain (+ next iteration) */
12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch = 0; ch < nChannels; ch++)
12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if(!chConstraintsFulfilled[ch])
12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          qcOutElement->qcOutChannel[ch]->globalGain += gainAdjustment ;
12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          calculateQuant[ch] = 1; /* global gain has changed, recalculate quantization in next iteration! */
12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_updateFillBits(CHANNEL_MAPPING*          cm,
12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                           QC_STATE*                 qcKernel,
1249fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi                                           ELEMENT_BITS* RESTRICT    elBits[(8)],
12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                           QC_OUT**                  qcOut)
12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (qcKernel->bitrateMode) {
12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_SFR:
12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_FF:
12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       break;
12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_1:
12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_2:
12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_3:
12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_4:
12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_5:
12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcOut[0]->totFillBits = (qcOut[0]->grantedDynBits - qcOut[0]->usedDynBits)&7; /* precalculate alignment bits */
1265e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      qcOut[0]->totalBits = qcOut[0]->staticBits + qcOut[0]->usedDynBits + qcOut[0]->totFillBits + qcOut[0]->elementExtBits + qcOut[0]->globalExtBits;
1266e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      qcOut[0]->totFillBits += ( fixMax(0, qcKernel->minBitsPerFrame - qcOut[0]->totalBits) + 7) & ~7;
12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_CBR:
12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_INVALID:
12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT bitResSpace = qcKernel->bitResTotMax - qcKernel->bitResTot ;
12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* processing fill-bits */
12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT deltaBitRes = qcOut[0]->grantedDynBits - qcOut[0]->usedDynBits ;
12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcOut[0]->totFillBits = fixMax((deltaBitRes&7), (deltaBitRes - (fixMax(0,bitResSpace-7)&~7)));
1276e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      qcOut[0]->totalBits = qcOut[0]->staticBits + qcOut[0]->usedDynBits + qcOut[0]->totFillBits + qcOut[0]->elementExtBits + qcOut[0]->globalExtBits;
1277e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi      qcOut[0]->totFillBits += ( fixMax(0, qcKernel->minBitsPerFrame - qcOut[0]->totalBits) + 7) & ~7;
12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* switch (qcKernel->bitrateMode) */
12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_calcMaxValueInSfb
12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:
12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:
12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT FDKaacEnc_calcMaxValueInSfb(INT   sfbCnt,
12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             INT   maxSfbPerGroup,
12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             INT   sfbPerGroup,
12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             INT  *RESTRICT sfbOffset,
12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             SHORT *RESTRICT quantSpectrum,
13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             UINT *RESTRICT maxValue)
13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT sfbOffs,sfb;
13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT maxValueAll = 0;
13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup)
13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfb = 0; sfb < maxSfbPerGroup; sfb++)
13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT line;
13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT maxThisSfb = 0;
13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++)
13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT tmp = fixp_abs(quantSpectrum[line]);
13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        maxThisSfb = fixMax(tmp, maxThisSfb);
13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      maxValue[sfbOffs+sfb] = maxThisSfb;
13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      maxValueAll = fixMax(maxThisSfb, maxValueAll);
13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return maxValueAll;
13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_updateBitres
13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:
13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:
13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid FDKaacEnc_updateBitres(CHANNEL_MAPPING *cm,
13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            QC_STATE* qcKernel,
13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            QC_OUT** qcOut)
13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (qcKernel->bitrateMode) {
13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_FF:
13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_1:
13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_2:
13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_3:
13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_4:
13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_VBR_5:
13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* variable bitrate */
13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcKernel->bitResTot = FDKmin(qcKernel->maxBitsPerFrame, qcKernel->bitResTotMax);
13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_CBR:
13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_SFR:
13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case QCDATA_BR_MODE_INVALID:
13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int c = 0;
13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* constant bitrate */
13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        qcKernel->bitResTot += qcOut[c]->grantedDynBits - (qcOut[c]->usedDynBits + qcOut[c]->totFillBits + qcOut[c]->alignBits);
13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_FinalizeBitConsumption
13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:
13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:
13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_ENCODER_ERROR FDKaacEnc_FinalizeBitConsumption(CHANNEL_MAPPING *cm,
13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   QC_STATE *qcKernel,
13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   QC_OUT *qcOut,
13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   QC_OUT_ELEMENT** qcElement,
13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   HANDLE_TRANSPORTENC hTpEnc,
13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   AUDIO_OBJECT_TYPE   aot,
13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   UINT                syntaxFlags,
13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   SCHAR               epConfig)
13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  QC_OUT_EXTENSION fillExtPayload;
13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT totFillBits, alignBits;
13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1377381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi  /* Get total consumed bits in AU */
1378381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi  qcOut->totalBits = qcOut->staticBits + qcOut->usedDynBits  + qcOut->totFillBits +
1379381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi                     qcOut->elementExtBits + qcOut->globalExtBits;
13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1381381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi  if (qcKernel->bitrateMode==QCDATA_BR_MODE_CBR) {
13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Now we can get the exact transport bit amount, and hopefully it is equal to the estimated value */
1384381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi    INT exactTpBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (exactTpBits != qcKernel->globHdrBits) {
13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT diffFillBits = 0;
13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1389381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      /* How many bits can be taken by bitreservoir */
1390381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      const INT bitresSpace = qcKernel->bitResTotMax - (qcKernel->bitResTot + (qcOut->grantedDynBits - (qcOut->usedDynBits + qcOut->totFillBits) ) );
1391381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi
13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Number of bits which can be moved to bitreservoir. */
1393381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      const INT bitsToBitres = qcKernel->globHdrBits - exactTpBits;
1394381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      FDK_ASSERT(bitsToBitres>=0); /* is always positive */
13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1396381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      /* If bitreservoir can not take all bits, move ramaining bits to fillbits */
1397381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      diffFillBits = FDKmax(0, bitsToBitres - bitresSpace);
1398381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi
1399381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      /* Assure previous alignment */
1400381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      diffFillBits = (diffFillBits+7)&~7;
14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1402381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      /* Move as many bits as possible to bitreservoir */
1403381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      qcKernel->bitResTot    += (bitsToBitres-diffFillBits);
14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1405381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      /* Write remaing bits as fill bits */
14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcOut->totFillBits     += diffFillBits;
14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcOut->totalBits       += diffFillBits;
14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcOut->grantedDynBits  += diffFillBits;
14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1410381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      /* Get new header bits */
14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
1412381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi
1413381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      if (qcKernel->globHdrBits != exactTpBits) {
1414381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi        /* In previous step, fill bits and corresponding total bits were changed when bitreservoir was completely filled.
1415381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi           Now we can take the too much taken bits caused by header overhead from bitreservoir.
1416381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi         */
1417381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi        qcKernel->bitResTot -= (qcKernel->globHdrBits - exactTpBits);
1418381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi      }
14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1420381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi
1421381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi  } /* MODE_CBR */
1422381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi
1423381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi  /* Update exact number of consumed header bits. */
1424381d69840ad3af2259f0b7ef49236f9ee9c76b76Jean-Michel Trivi  qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Save total fill bits and distribut to alignment and fill bits */
14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  totFillBits = qcOut->totFillBits;
14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* fake a fill extension payload */
14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(&fillExtPayload, sizeof(QC_OUT_EXTENSION));
14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  fillExtPayload.type = EXT_FILL_DATA;
14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  fillExtPayload.nPayloadBits = totFillBits;
14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ask bitstream encoder how many of that bits can be written in a fill extension data entity */
14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcOut->totFillBits = FDKaacEnc_writeExtensionData( NULL,
14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                    &fillExtPayload,
14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                     0, 0,
14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                     syntaxFlags,
14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                     aot,
14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                     epConfig );
14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* now distribute extra fillbits and alignbits */
14442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  alignBits = 7 - (qcOut->staticBits + qcOut->usedDynBits + qcOut->elementExtBits
14452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   + qcOut->totFillBits + qcOut->globalExtBits -1)%8;
14462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Maybe we could remove this */
14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if( ((alignBits + qcOut->totFillBits - totFillBits)==8) && (qcOut->totFillBits>8) )
14492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        qcOut->totFillBits -= 8;
14502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcOut->totalBits = qcOut->staticBits + qcOut->usedDynBits + qcOut->totFillBits +
14522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     alignBits + qcOut->elementExtBits + qcOut->globalExtBits;
14532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (qcOut->totalBits>qcKernel->maxBitsPerFrame) || (qcOut->totalBits<qcKernel->minBitsPerFrame) ) {
14552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_ENC_QUANT_ERROR;
14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcOut->alignBits = alignBits;
14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_ENC_OK;
14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*********************************************************************************
14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         functionname: FDKaacEnc_crashRecovery
14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         description:  fulfills constraints by means of brute force...
14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                       => bits are saved by cancelling out spectral lines!!
14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          (beginning at the highest frequencies)
14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         return:       errorcode
14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project**********************************************************************************/
14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void FDKaacEnc_crashRecovery(INT               nChannels,
14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          PSY_OUT_ELEMENT*  psyOutElement,
14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          QC_OUT*           qcOut,
14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          QC_OUT_ELEMENT   *qcElement,
14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          INT               bitsToSave,
14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          AUDIO_OBJECT_TYPE aot,
14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          UINT              syntaxFlags,
14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          SCHAR             epConfig)
14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT ch ;
14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT savedBits = 0 ;
14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT sfb, sfbGrp ;
14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT bitsPerScf[(2)][MAX_GROUPED_SFB] ;
14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT sectionToScf[(2)][MAX_GROUPED_SFB] ;
14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT *sfbOffset ;
14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT sect, statBitsNew ;
14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  QC_OUT_CHANNEL **qcChannel = qcElement->qcOutChannel;
14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  PSY_OUT_CHANNEL **psyChannel = psyOutElement->psyOutChannel;
14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* create a table which converts frq-bins to bit-demand...    [bitsPerScf] */
14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ...and another one which holds the corresponding sections [sectionToScf] */
14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (ch = 0; ch < nChannels; ch++)
14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sfbOffset = psyChannel[ch]->sfbOffsets ;
14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sect = 0; sect < qcChannel[ch]->sectionData.noOfSections; sect++)
15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT sfb ;
15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT codeBook = qcChannel[ch]->sectionData.huffsection[sect].codeBook ;
15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (sfb = qcChannel[ch]->sectionData.huffsection[sect].sfbStart;
15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           sfb < qcChannel[ch]->sectionData.huffsection[sect].sfbStart +
15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 qcChannel[ch]->sectionData.huffsection[sect].sfbCnt;
15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           sfb++)
15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitsPerScf[ch][sfb] = 0;
15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (codeBook != CODE_BOOK_PNS_NO) /*&&
15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             (sfb < (qcChannel[ch]->sectionData.noOfGroups*qcChannel[ch]->sectionData.maxSfbPerGroup))*/ )
15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT sfbStartLine = sfbOffset[sfb] ;
15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            INT noOfLines    = sfbOffset[sfb+1] - sfbStartLine ;
15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            bitsPerScf[ch][sfb] = FDKaacEnc_countValues(&(qcChannel[ch]->quantSpec[sfbStartLine]), noOfLines, codeBook) ;
15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sectionToScf[ch][sfb] = sect ;
15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* LOWER [maxSfb] IN BOTH CHANNELS!! */
15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Attention: in case of stereo: maxSfbL == maxSfbR, GroupingL == GroupingR ; */
15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (sfb = qcChannel[0]->sectionData.maxSfbPerGroup-1; sfb >= 0; sfb--)
15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (sfbGrp = 0; sfbGrp < psyChannel[0]->sfbCnt; sfbGrp += psyChannel[0]->sfbPerGroup)
15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch = 0; ch < nChannels; ch++)
15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int sect = sectionToScf[ch][sfbGrp+sfb];
15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        qcChannel[ch]->sectionData.huffsection[sect].sfbCnt-- ;
15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        savedBits += bitsPerScf[ch][sfbGrp+sfb] ;
15362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (qcChannel[ch]->sectionData.huffsection[sect].sfbCnt == 0) {
15382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          savedBits += (psyChannel[ch]->lastWindowSequence!=SHORT_WINDOW) ? FDKaacEnc_sideInfoTabLong[0]
15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                                      : FDKaacEnc_sideInfoTabShort[0];
15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* ...have enough bits been saved? */
15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (savedBits >= bitsToSave)
15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break ;
15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } /* sfb loop */
15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* if not enough bits saved,
15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     clean whole spectrum and remove side info overhead */
15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sfb == -1) {
15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sfb = 0 ;
15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (ch = 0; ch < nChannels; ch++)
15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    qcChannel[ch]->sectionData.maxSfbPerGroup = sfb ;
15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    psyChannel[ch]->maxSfbPerGroup = sfb ;
15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* when no spectrum is coded save tools info in bitstream */
15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if(sfb==0) {
15622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemclear(&psyChannel[ch]->tnsInfo, sizeof(TNS_INFO));
15632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemclear(&psyOutElement->toolsInfo, sizeof(TOOLSINFO));
15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* dynamic bits will be updated in iteration loop */
15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  { /* if stop sfb has changed save bits in side info, e.g. MS or TNS coding */
15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ELEMENT_INFO elInfo;
15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(&elInfo, sizeof(ELEMENT_INFO));
15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    elInfo.nChannelsInEl = nChannels;
15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    elInfo.elType = (nChannels == 2) ? ID_CPE : ID_SCE;
15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKaacEnc_ChannelElementWrite( NULL, &elInfo, NULL,
15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   psyOutElement,
15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   psyChannel,
15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   syntaxFlags,
15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   aot,
15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   epConfig,
15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  &statBitsNew,
15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   0 );
15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  savedBits = qcElement->staticBitsUsed - statBitsNew;
15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* update static and dynamic bits */
15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcElement->staticBitsUsed -= savedBits;
15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcElement->grantedDynBits += savedBits;
15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcOut->staticBits     -= savedBits;
15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcOut->grantedDynBits += savedBits;
15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  qcOut->maxDynBits     += savedBits;
15942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
15972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid  FDKaacEnc_QCClose (QC_STATE  **phQCstate, QC_OUT **phQC)
16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
16022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int n, i;
16032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (phQC!=NULL) {
16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (n=0;n<(1);n++) {
16072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (phQC[n] != NULL) {
16082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        QC_OUT    *hQC      = phQC[n];
1609fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi        for (i=0; i<(8); i++) {
16102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1612fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi        for (i=0; i<(8); i++) {
16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (hQC->qcElement[i])
16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FreeRam_aacEnc_QCelement(&hQC->qcElement[i]);
16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FreeRam_aacEnc_QCout(&phQC[n]);
16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
16192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (phQCstate!=NULL) {
16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (*phQCstate != NULL) {
16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      QC_STATE  *hQCstate = *phQCstate;
16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (hQCstate->hAdjThr != NULL)
16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKaacEnc_AdjThrClose(&hQCstate->hAdjThr);
16282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (hQCstate->hBitCounter != NULL)
16302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKaacEnc_BCClose(&hQCstate->hBitCounter);
16312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1632fa3eba16446cc8f2f5e2dfc20d86a49dbd37299eJean-Michel Trivi      for (i=0; i<(8); i++) {
16332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hQCstate->elementBits[i]!=NULL) {
16342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FreeRam_aacEnc_ElementBits(&hQCstate->elementBits[i]);
16352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
16362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
16372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FreeRam_aacEnc_QCstate(phQCstate);
16382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
16392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
16412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1642