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