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
52228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project� Copyright  1995 - 2012 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************  MPEG-4 AAC Decoder  **************************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Author(s):   Christian Griebel
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Description: Dynamic range control (DRC) decoder tool for AAC
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdec_drc.h"
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "channelinfo.h"
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aac_rom.h"
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project #include "sbrdecoder.h"
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Dynamic Range Control
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* For parameter conversion */
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DRC_PARAMETER_BITS        ( 7 )
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DRC_MAX_QUANT_STEPS       ( 1<<DRC_PARAMETER_BITS )
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DRC_MAX_QUANT_FACTOR      ( DRC_MAX_QUANT_STEPS-1 )
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DRC_PARAM_QUANT_STEP      ( FL2FXCONST_DBL(1.0f/(float)DRC_MAX_QUANT_FACTOR) )
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DRC_PARAM_SCALE           ( 1 )
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define MAX_REFERENCE_LEVEL       ( 127 )
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project #define DVB_ANC_DATA_SYNC_BYTE   ( 0xBC )    /* DVB ancillary data sync byte. */
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Initialize DRC information
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \self Handle of DRC info
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return none
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid aacDecoder_drcInit (
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AAC_DRC self )
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CDrcParams *pParams;
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self == NULL) {
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return;
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* init control fields */
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->enable = 0;
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->numThreads = 0;
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->digitalNorm = 0;
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* init params */
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pParams = &self->params;
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pParams->bsDelayEnable = 0;
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pParams->cut   = FL2FXCONST_DBL(0.0f);
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pParams->boost = FL2FXCONST_DBL(0.0f);
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pParams->targetRefLevel = AACDEC_DRC_DEFAULT_REF_LEVEL;
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES;
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* initial program ref level = target ref level */
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->progRefLevel = pParams->targetRefLevel;
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Initialize DRC control data for one channel
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \self Handle of DRC info
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return none
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid aacDecoder_drcInitChannelData (
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CDrcChannelData *pDrcChData )
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (pDrcChData != NULL) {
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcChData->expiryCount = 0;
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcChData->numBands    = 1;
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcChData->bandTop[0]  = (1024 >> 2) - 1;
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcChData->drcValue[0] = 0;
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcChData->drcInterpolationScheme = 0;
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcChData->drcDataType = UNKNOWN_PAYLOAD;
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Set one single DRC parameter
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \self   Handle of DRC info.
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \param  Parameter to be set.
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \value  Value to be set.
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return an error code.
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_DECODER_ERROR aacDecoder_drcSetParam (
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AAC_DRC    self,
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACDEC_DRC_PARAM  param,
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT               value )
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (param)
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case DRC_CUT_SCALE:
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* set attenuation scale factor */
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (value < 0)
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || (value > DRC_MAX_QUANT_FACTOR) ) {
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_SET_PARAM_FAIL;
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self == NULL) {
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_INVALID_HANDLE;
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->params.cut = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case DRC_BOOST_SCALE:
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* set boost factor */
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (value < 0)
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || (value > DRC_MAX_QUANT_FACTOR) ) {
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_SET_PARAM_FAIL;
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self == NULL) {
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_INVALID_HANDLE;
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->params.boost = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case TARGET_REF_LEVEL:
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( value >  MAX_REFERENCE_LEVEL
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || value < -MAX_REFERENCE_LEVEL ) {
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_SET_PARAM_FAIL;
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self == NULL) {
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_INVALID_HANDLE;
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (value < 0) {
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->digitalNorm = 0;
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->digitalNorm    = 1;
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->progRefLevel   = AACDEC_DRC_DEFAULT_REF_LEVEL;
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->params.targetRefLevel = value;
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case APPLY_HEAVY_COMPRESSION:
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (value < 0 || value > 1) {
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_SET_PARAM_FAIL;
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self == NULL) {
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_INVALID_HANDLE;
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->params.applyHeavyCompression = (UCHAR)value;
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case DRC_BS_DELAY:
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (value < 0 || value > 1) {
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_SET_PARAM_FAIL;
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self == NULL) {
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_INVALID_HANDLE;
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->params.bsDelayEnable = value;
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case DRC_DATA_EXPIRY_FRAME:
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self == NULL) {
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_INVALID_HANDLE;
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->params.expiryFrame = (UINT)value;
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_SET_PARAM_FAIL;
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }  /* switch(param) */
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* switch on/off processing */
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->enable = ( (self->params.boost > (FIXP_DBL)0)
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                || (self->params.cut   > (FIXP_DBL)0)
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                || (self->params.applyHeavyCompression != 0)
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                || (self->digitalNorm == 1) );
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ErrorStatus;
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int parseExcludedChannels( UINT *excludedChnsMask,
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  HANDLE_FDK_BITSTREAM bs )
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT excludeMask = 0;
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT i, j;
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int  bitCnt = 9;
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0, j = 1; i < 7; i++, j<<=1) {
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (FDKreadBits(bs,1)) {
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      excludeMask |= j;
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* additional_excluded_chns */
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  while (FDKreadBits(bs,1)) {
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i = 0; i < 7; i++, j<<=1) {
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (FDKreadBits(bs,1)) {
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        excludeMask |= j;
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += 9;
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_ASSERT(j < (UINT)-1);
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *excludedChnsMask = excludeMask;
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (bitCnt);
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Save DRC payload bitstream position
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \self Handle of DRC info
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \bs Handle of FDK bitstream
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return The number of DRC payload bits
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint aacDecoder_drcMarkPayload (
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_AAC_DRC self,
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_FDK_BITSTREAM bs,
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACDEC_DRC_PAYLOAD_TYPE type )
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT bsStartPos;
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int  i, numBands = 1, bitCnt = 0;
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self == NULL) {
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bsStartPos = FDKgetValidBits(bs);
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (type) {
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case MPEG_DRC_EXT_DATA:
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitCnt = 4;
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (FDKreadBits(bs,1)) {          /* pce_tag_present */
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKreadBits(bs,8);              /* pce_instance_tag + drc_tag_reserved_bits */
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitCnt+=8;
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (FDKreadBits(bs,1)) {          /* excluded_chns_present */
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKreadBits(bs,7);              /* exclude mask [0..7] */
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitCnt+=8;
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        while (FDKreadBits(bs,1)) {     /* additional_excluded_chns */
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKreadBits(bs,7);            /* exclude mask [x..y] */
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitCnt+=8;
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (FDKreadBits(bs,1)) {          /* drc_bands_present */
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        numBands += FDKreadBits(bs, 4); /* drc_band_incr */
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKreadBits(bs,4);              /* reserved */
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitCnt+=8;
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i = 0; i < numBands; i++) {
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKreadBits(bs,8);            /* drc_band_top[i] */
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitCnt+=8;
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (FDKreadBits(bs,1)) {          /* prog_ref_level_present */
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKreadBits(bs,8);              /* prog_ref_level + prog_ref_level_reserved_bits */
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitCnt+=8;
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i = 0; i < numBands; i++) {
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKreadBits(bs,8);              /* dyn_rng_sgn[i] + dyn_rng_ctl[i] */
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitCnt+=8;
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (self->numPayloads < MAX_DRC_THREADS)
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        && ((INT)FDKgetValidBits(bs) >= 0) )
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->drcPayloadPosition[self->numPayloads++] = bsStartPos;
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case DVB_DRC_ANC_DATA:
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitCnt += 8;
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* check sync word */
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (FDKreadBits(bs, 8) == DVB_ANC_DATA_SYNC_BYTE)
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int dmxLevelsPresent, compressionPresent;
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int coarseGrainTcPresent, fineGrainTcPresent;
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* bs_info field */
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKreadBits(bs, 8);                          /* mpeg_audio_type, dolby_surround_mode, presentation_mode */
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitCnt+=8;
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Evaluate ancillary_data_status */
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKreadBits(bs, 3);                          /* reserved, set to 0 */
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        dmxLevelsPresent = FDKreadBits(bs, 1);       /* downmixing_levels_MPEG4_status */
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKreadBits(bs, 1);                          /* reserved, set to 0 */
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        compressionPresent   = FDKreadBits(bs, 1);   /* audio_coding_mode_and_compression status */
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        coarseGrainTcPresent = FDKreadBits(bs, 1);   /* coarse_grain_timecode_status */
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fineGrainTcPresent   = FDKreadBits(bs, 1);   /* fine_grain_timecode_status */
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bitCnt+=8;
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* MPEG4 downmixing levels */
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (dmxLevelsPresent) {
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKreadBits(bs, 8);                        /* downmixing_levels_MPEG4 */
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitCnt+=8;
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* audio coding mode and compression status */
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (compressionPresent) {
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKreadBits(bs, 16);                        /* audio_coding_mode, Compression_value */
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitCnt+=16;
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* coarse grain timecode */
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (coarseGrainTcPresent) {
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKreadBits(bs, 16);                       /* coarse_grain_timecode */
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitCnt+=16;
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* fine grain timecode */
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (fineGrainTcPresent) {
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKreadBits(bs, 16);                       /* fine_grain_timecode */
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitCnt+=16;
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( !self->dvbAncDataAvailable
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          && ((INT)FDKgetValidBits(bs) >= 0) )
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->dvbAncDataPosition  = bsStartPos;
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->dvbAncDataAvailable = 1;
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (bitCnt);
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Parse DRC parameters from bitstream
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \bs Handle of FDK bitstream (in)
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \pDrcBs Pointer to DRC payload data container (out)
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \payloadPosition Bitstream position of MPEG DRC data junk (in)
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return Number of bits read (0 in case of a parse error)
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int aacDecoder_drcParse (
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_FDK_BITSTREAM  bs,
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CDrcPayload          *pDrcBs,
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT                  payloadPosition )
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i, numBands, bitCnt = 4;
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Move to the beginning of the DRC payload field */
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition);
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* pce_tag_present */
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKreadBits(bs,1))
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcBs->pceInstanceTag = FDKreadBits(bs, 4);  /* pce_instance_tag */
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* only one program supported */
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKreadBits(bs, 4);  /* drc_tag_reserved_bits */
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += 8;
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcBs->pceInstanceTag = -1;  /* not present */
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKreadBits(bs,1)) {        /* excluded_chns_present */
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* get excluded_chn_mask */
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += parseExcludedChannels(&pDrcBs->excludedChnsMask, bs);
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcBs->excludedChnsMask = 0;
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  numBands = 1;
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKreadBits(bs,1))  /* drc_bands_present */
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* get band_incr */
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numBands += FDKreadBits(bs, 4);  /* drc_band_incr */
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcBs->channelData.drcInterpolationScheme = FDKreadBits(bs, 4);  /* drc_interpolation_scheme */
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += 8;
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* band_top */
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i = 0; i < numBands; i++)
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->channelData.bandTop[i] = FDKreadBits(bs, 8);  /* drc_band_top[i] */
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitCnt += 8;
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcBs->channelData.bandTop[0] = 255;
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pDrcBs->channelData.numBands = numBands;
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKreadBits(bs,1))                        /* prog_ref_level_present */
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcBs->progRefLevel = FDKreadBits(bs, 7);  /* prog_ref_level */
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKreadBits(bs, 1);                         /* prog_ref_level_reserved_bits */
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += 8;
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcBs->progRefLevel = -1;
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0; i < numBands; i++)
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcBs->channelData.drcValue[i]  = FDKreadBits(bs, 1) << 7;   /* dyn_rng_sgn[i] */
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pDrcBs->channelData.drcValue[i] |= FDKreadBits(bs, 7) & 0x7F; /* dyn_rng_ctl[i] */
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += 8;
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Set DRC payload type */
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pDrcBs->channelData.drcDataType = MPEG_DRC_EXT_DATA;
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (bitCnt);
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Parse heavy compression value transported in DSEs of DVB streams with MPEG-4 content.
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \bs Handle of FDK bitstream (in)
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \pDrcBs Pointer to DRC payload data container (out)
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \payloadPosition Bitstream position of DVB ancillary data junk
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return Number of bits read (0 in case of a parse error)
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define DVB_COMPRESSION_SCALE   ( 8 )       /* 48,164 dB */
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int aacDecoder_drcReadCompression (
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_FDK_BITSTREAM  bs,
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CDrcPayload          *pDrcBs,
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT                  payloadPosition )
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int  bitCnt = 0;
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int  dmxLevelsPresent, compressionPresent;
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int  coarseGrainTcPresent, fineGrainTcPresent;
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Move to the beginning of the DRC payload field */
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition);
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Sanity checks */
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( FDKgetValidBits(bs) < 24 ) {
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Check sync word */
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKreadBits(bs, 8) != DVB_ANC_DATA_SYNC_BYTE) {
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Evaluate bs_info field */
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKreadBits(bs, 2) != 3) {               /* mpeg_audio_type */
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* No MPEG-4 audio data */
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKreadBits(bs, 2);                          /* dolby_surround_mode */
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKreadBits(bs, 2);                          /* presentation_mode */
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKreadBits(bs, 2) != 0) {               /* reserved, set to 0 */
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Evaluate ancillary_data_status */
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKreadBits(bs, 3) != 0) {               /* reserved, set to 0 */
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  dmxLevelsPresent = FDKreadBits(bs, 1);       /* downmixing_levels_MPEG4_status */
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (FDKreadBits(bs, 1) != 0) {               /* reserved, set to 0 */
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  compressionPresent   = FDKreadBits(bs, 1);   /* audio_coding_mode_and_compression status */
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  coarseGrainTcPresent = FDKreadBits(bs, 1);   /* coarse_grain_timecode_status */
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  fineGrainTcPresent   = FDKreadBits(bs, 1);   /* fine_grain_timecode_status */
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bitCnt += 24;
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (dmxLevelsPresent) {
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKreadBits(bs, 8);                        /* downmixing_levels_MPEG4 */
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += 8;
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* audio_coding_mode_and_compression_status */
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (compressionPresent)
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR compressionOn, compressionValue;
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* audio_coding_mode */
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( FDKreadBits(bs, 7) != 0 ) {  /* The reserved bits shall be set to "0". */
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return 0;
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    compressionOn    = (UCHAR)FDKreadBits(bs, 1);  /* compression_on */
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    compressionValue = (UCHAR)FDKreadBits(bs, 8);  /* Compression_value */
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += 16;
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( compressionOn ) {
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* A compression value is available so store the data just like MPEG DRC data */
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->channelData.numBands    =  1;                            /* One band ... */
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->channelData.drcValue[0] =  compressionValue;             /* ... with one value ... */
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->channelData.bandTop[0]  = (1024 >> 2) - 1;  /* ... comprising the whole spectrum. */
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->pceInstanceTag          = -1;                            /* Not present */
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->progRefLevel            = -1;                            /* Not present */
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->channelData.drcDataType =  DVB_DRC_ANC_DATA;             /* Set DRC payload type to DVB. */
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* No compression value available */
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* CAUTION: It is not clearly defined by standard how to react in this situation. */
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Turn down the compression value to aprox. 0dB */
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->channelData.numBands    =  1;                            /* One band ... */
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->channelData.drcValue[0] =  0x80;                         /* ... with aprox. 0dB ... */
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->channelData.bandTop[0]  = (1024 >> 2) - 1;  /* ... comprising the whole spectrum. */
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pDrcBs->channelData.drcDataType =  DVB_DRC_ANC_DATA;             /* Set DRC payload type to DVB. */
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* If compression_on field is set to "0" the compression_value field shall be "0000 0000". */
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (compressionValue != 0) {
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 0;
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Read timecodes if available just to get the right amount of bits. */
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (coarseGrainTcPresent) {
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKreadBits(bs, 16);      /* coarse_grain_timecode */
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += 16;
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (fineGrainTcPresent) {
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKreadBits(bs, 16);      /* fine_grain_timecode */
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitCnt += 16;
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (bitCnt);
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Prepare DRC processing
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int aacDecoder_drcExtractAndMap (
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AAC_DRC  self,
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_BITSTREAM hBs,
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR  pceInstanceTag,
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR  channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int    validChannels )
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CDrcPayload  threadBs[MAX_DRC_THREADS];
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CDrcPayload *validThreadBs[MAX_DRC_THREADS];
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT backupBsPosition;
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int  i, thread, validThreads = 0;
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int  numExcludedChns[MAX_DRC_THREADS];
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->numThreads = 0;
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  backupBsPosition = FDKgetValidBits(hBs);
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0; i < self->numPayloads && self->numThreads < MAX_DRC_THREADS; i++) {
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int bitsParsed;
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Init payload data chunk. The memclear is very important because it initializes
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       the most values. Without it the module wouldn't work properly or crash. */
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload));
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    threadBs[self->numThreads].channelData.bandTop[0]  = (1024 >> 2) - 1;
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Extract payload */
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitsParsed = aacDecoder_drcParse( hBs,
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     &threadBs[self->numThreads],
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      self->drcPayloadPosition[i] );
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (bitsParsed > 0) {
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->numThreads++;
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->numPayloads = 0;
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->dvbAncDataAvailable)
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  { /* Append a DVB heavy compression payload thread if available. */
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int bitsParsed;
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Init payload data chunk. The memclear is very important because it initializes
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       the most values. Without it the module wouldn't work properly or crash. */
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload));
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    threadBs[self->numThreads].channelData.bandTop[0]  = (1024 >> 2) - 1;
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Extract payload */
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bitsParsed = aacDecoder_drcReadCompression( hBs,
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               &threadBs[self->numThreads],
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                self->dvbAncDataPosition );
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (bitsParsed > 0) {
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->numThreads++;
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->dvbAncDataAvailable = 0;
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Reset the bitbufffer */
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKpushBiDirectional(hBs, FDKgetValidBits(hBs) - backupBsPosition);
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculate number of valid bits in excl_chn_mask */
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* coupling channels not supported */
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* check for valid threads */
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (thread = 0; thread < self->numThreads; thread++) {
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CDrcPayload *pThreadBs = &threadBs[thread];
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int numExclChns = 0;
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch ((AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType) {
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        continue;
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case MPEG_DRC_EXT_DATA:
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case DVB_DRC_ANC_DATA:
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pThreadBs->pceInstanceTag >= 0) {  /* if PCE tag present */
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (pThreadBs->pceInstanceTag != pceInstanceTag) {
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        continue;  /* don't accept */
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* calculate number of excluded channels */
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pThreadBs->excludedChnsMask > 0) {
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT exclMask = pThreadBs->excludedChnsMask;
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int ch;
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (ch = 0; ch < validChannels; ch++) {
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        numExclChns += exclMask & 0x1;
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        exclMask >>= 1;
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (numExclChns < validChannels) {
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      validThreadBs[validThreads]   = pThreadBs;
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numExcludedChns[validThreads] = numExclChns;
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      validThreads++;
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (validThreads > 1) {
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch;
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* check consistency of excl_chn_mask amongst valid DRC threads */
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch = 0; ch < validChannels; ch++) {
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int present = 0;
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (thread = 0; thread < validThreads; thread++) {
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CDrcPayload *pThreadBs = validThreadBs[thread];
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* thread applies to this channel */
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (pThreadBs->channelData.drcDataType == MPEG_DRC_EXT_DATA)
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          && ( (numExcludedChns[thread] == 0)
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            || (!(pThreadBs->excludedChnsMask & (1<<ch))) ) ) {
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          present++;
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (present > 1) {
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return -1;
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* map DRC bitstream information onto DRC channel information */
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (thread = 0; thread < validThreads; thread++)
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CDrcPayload *pThreadBs = validThreadBs[thread];
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT exclMask = pThreadBs->excludedChnsMask;
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACDEC_DRC_PAYLOAD_TYPE drcPayloadType = (AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType;
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch;
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* last progRefLevel transmitted is the one that is used
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * (but it should really only be transmitted once per block!)
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pThreadBs->progRefLevel >= 0) {
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->progRefLevel = pThreadBs->progRefLevel;
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* SCE, CPE and LFE */
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch = 0; ch < validChannels; ch++) {
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int mapedChannel = channelMapping[ch];
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( ((exclMask & (1<<mapedChannel)) == 0)
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        && ( (drcPayloadType == MPEG_DRC_EXT_DATA)
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          || ((drcPayloadType == DVB_DRC_ANC_DATA) && self->params.applyHeavyCompression)
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         ) ) {
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* copy thread to channel */
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacDecoderStaticChannelInfo[ch]->drcData = pThreadBs->channelData;
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* CCEs not supported by now */
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid aacDecoder_drcApply (
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AAC_DRC          self,
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        void                   *pSbrDec,
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CAacDecoderChannelInfo *pAacDecoderChannelInfo,
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CDrcChannelData        *pDrcChData,
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int  ch,   /* needed only for SBR */
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int  aacFrameSize,
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int  bSbrPresent )
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int band, top, bin, numBands;
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int bottom = 0;
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL max_mantissa;
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT max_exponent;
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL norm_mantissa = FL2FXCONST_DBL(0.0f);
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT  norm_exponent = 0;
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL fact_mantissa[MAX_DRC_BANDS];
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT  fact_exponent[MAX_DRC_BANDS];
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CDrcParams  *pParams = &self->params;
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL    *pSpectralCoefficient  =  SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CIcsInfo    *pIcsInfo              = &pAacDecoderChannelInfo->icsInfo;
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SHORT       *pSpecScale            =  pAacDecoderChannelInfo->specScale;
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int winSeq = pIcsInfo->WindowSequence;
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Increment and check expiry counter */
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (pParams->expiryFrame > 0)
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    && (++pDrcChData->expiryCount > pParams->expiryFrame) )
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  { /* The DRC data is too old, so delete it. */
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacDecoder_drcInitChannelData( pDrcChData );
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!self->enable) {
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sbrDecoder_drcDisable( (HANDLE_SBRDECODER)pSbrDec, ch );
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return;
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  numBands = pDrcChData->numBands;
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  top = FDKmax(0, numBands-1);
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pDrcChData->bandTop[0] = fixMin(pDrcChData->bandTop[0], (aacFrameSize >> 2) - 1);
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* If program reference normalization is done in the digital domain,
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  modify factor to perform normalization.  prog_ref_level can
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  alternatively be passed to the system for modification of the level in
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  the analog domain.  Analog level modification avoids problems with
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  reduced DAC SNR (if signal is attenuated) or clipping (if signal is
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  boosted) */
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->digitalNorm == 1)
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* 0.5^((targetRefLevel - progRefLevel)/24) */
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    norm_mantissa = fLdPow(
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            FL2FXCONST_DBL(-1.0), /* log2(0.5) */
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            0,
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            (FIXP_DBL)((INT)(FL2FXCONST_DBL(1.0f/24.0)>>3) * (INT)(pParams->targetRefLevel-self->progRefLevel)),
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            3,
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           &norm_exponent );
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    norm_mantissa = FL2FXCONST_DBL(0.5f);
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    norm_exponent = 1;
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calc scale factors */
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (band = 0; band < numBands; band++)
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR drcVal = pDrcChData->drcValue[band];
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize);
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fact_mantissa[band] = FL2FXCONST_DBL(0.5f);
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fact_exponent[band] = 1;
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (  pParams->applyHeavyCompression
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      && ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == DVB_DRC_ANC_DATA) )
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT compressionFactorVal_e;
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int valX, valY;
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      valX = drcVal >> 4;
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      valY = drcVal & 0x0F;
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* calculate the unscaled heavy compression factor.
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         compressionFactor = 48.164 - 6.0206*valX - 0.4014*valY dB
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         range: -48.166 dB to 48.164 dB */
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( drcVal != 0x7F ) {
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fact_mantissa[band] =
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          fPowInt( FL2FXCONST_DBL(0.95483867181), /* -0.4014dB = 0.95483867181 */
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   0,
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   valY,
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  &compressionFactorVal_e );
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* -0.0008dB (48.164 - 6.0206*8 = -0.0008) */
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fact_mantissa[band] = fMult(FL2FXCONST_DBL(0.99990790084), fact_mantissa[band]);
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fact_exponent[band] = DVB_COMPRESSION_SCALE - valX + compressionFactorVal_e;
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == MPEG_DRC_EXT_DATA)
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* apply the scaled dynamic range control words to factor.
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * if scaling drc_cut (or drc_boost), or control word drc_mantissa is 0
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * then there is no dynamic range compression
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     *
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * if pDrcChData->drcSgn[band] is
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     *  1 then gain is < 1 :  factor = 2^(-self->cut   * pDrcChData->drcMag[band] / 24)
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     *  0 then gain is > 1 :  factor = 2^( self->boost * pDrcChData->drcMag[band] / 24)
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((drcVal&0x7F) > 0) {
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL tParamVal = (drcVal & 0x80) ? -pParams->cut : pParams->boost;
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      fact_mantissa[band] =
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        f2Pow( (FIXP_DBL)((INT)fMult(FL2FXCONST_DBL(1.0f/192.0f), tParamVal) * (drcVal&0x7F)),
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 3+DRC_PARAM_SCALE,
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                &fact_exponent[band] );
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fact_mantissa[band]  = fMult(fact_mantissa[band], norm_mantissa);
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    fact_exponent[band] += norm_exponent;
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bottom = top;
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }  /* end loop over bands */
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* normalizations */
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int res;
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    max_mantissa = FL2FXCONST_DBL(0.0f);
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    max_exponent = 0;
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (band = 0; band < numBands; band++) {
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      max_mantissa = fixMax(max_mantissa, fact_mantissa[band]);
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      max_exponent = fixMax(max_exponent, fact_exponent[band]);
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* left shift factors to gain accurancy */
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    res = CntLeadingZeros(max_mantissa) - 1;
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* above topmost DRC band gain factor is 1 */
9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (((pDrcChData->bandTop[numBands-1]+1)<<2) < aacFrameSize) res = 0;
9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (res > 0) {
9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      res = fixMin(res, max_exponent);
9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      max_exponent -= res;
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (band = 0; band < numBands; band++) {
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fact_mantissa[band] <<= res;
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fact_exponent[band]  -= res;
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* normalize magnitudes to one scale factor */
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (band = 0; band < numBands; band++) {
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (fact_exponent[band] < max_exponent) {
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fact_mantissa[band] >>= max_exponent - fact_exponent[band];
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*  apply factor to spectral lines
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   *  short blocks must take care that bands fall on
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   *  block boundaries!
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   */
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!bSbrPresent)
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    bottom = 0;
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (band = 0; band < numBands; band++)
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize);   /* ... * DRC_BAND_MULT; */
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (bin = bottom; bin < top; bin++) {
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact_mantissa[band]);
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bottom = top;
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* above topmost DRC band gain factor is 1 */
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (max_exponent > 0) {
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FIXP_DBL fact = FL2FXCONST_DBL(0.5f) >> (max_exponent - 1);
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (bin = top; bin < aacFrameSize; bin++) {
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact);
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* adjust scaling */
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pSpecScale[0] += max_exponent;
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (winSeq == EightShortSequence) {
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int win;
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (win = 1; win < 8; win++) {
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pSpecScale[win] += max_exponent;
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_SBRDECODER hSbrDecoder = (HANDLE_SBRDECODER)pSbrDec;
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* feed factors into SBR decoder for application in QMF domain. */
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sbrDecoder_drcFeedChannel (
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hSbrDecoder,
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ch,
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pDrcChData->numBands,
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            fact_mantissa,
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            max_exponent,
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pDrcChData->drcInterpolationScheme,
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            winSeq,
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pDrcChData->bandTop
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          );
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return;
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Prepare DRC processing
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint aacDecoder_drcProlog (
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AAC_DRC  self,
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_BITSTREAM hBs,
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR  pceInstanceTag,
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR  channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int    validChannels )
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int err = 0;
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self == NULL) {
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!self->params.bsDelayEnable)
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    err = aacDecoder_drcExtractAndMap (
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self,
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hBs,
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pAacDecoderStaticChannelInfo,
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pceInstanceTag,
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            channelMapping,
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            validChannels );
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return err;
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Finalize DRC processing
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint aacDecoder_drcEpilog (
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AAC_DRC  self,
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_BITSTREAM hBs,
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR  pceInstanceTag,
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR  channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int    validChannels )
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int err = 0;
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self == NULL) {
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->params.bsDelayEnable)
10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    err = aacDecoder_drcExtractAndMap (
10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self,
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hBs,
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pAacDecoderStaticChannelInfo,
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pceInstanceTag,
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            channelMapping,
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            validChannels );
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return err;
10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1064