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/*! 852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \file 862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief rvlc concealment 872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \author Josef Hoepfl 882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "rvlcconceal.h" 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "block.h" 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "rvlc.h" 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project function: calcRefValFwd 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: The function determines the scalefactor which is closed to the scalefactorband 1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_min. The same is done for intensity data and noise energies. 1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: - reference value scf 1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project - reference value internsity data 1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project - reference value noise energy 1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: - 1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid calcRefValFwd (CErRvlcInfo *pRvlc, 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoderChannelInfo *pAacDecoderChannelInfo, 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *refIsFwd, 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *refNrgFwd, 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *refScfFwd) 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int band,bnds,group,startBand; 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int idIs,idNrg,idScf; 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int conceal_min,conceal_group_min; 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int MaximumScaleFactorBands; 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 16; 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 64; 1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands; 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands; 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calculate first reference value for approach in forward direction */ 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project idIs = idNrg = idScf = 1; 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* set reference values */ 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refIsFwd = - SF_OFFSET; 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refNrgFwd = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - 90 - 256; 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refScfFwd = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET; 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = conceal_min-1; 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=conceal_group_min; group >= 0; group--) { 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=startBand; band >= 0; band--) { 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ZERO_HCB: 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB: 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB2: 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (idIs) { 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refIsFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project idIs=0; /* reference value has been set */ 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case NOISE_HCB: 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (idNrg) { 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refNrgFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project idNrg=0; /* reference value has been set */ 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break ; 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (idScf) { 1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project idScf=0; /* reference value has been set */ 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = pRvlc->maxSfbTransmitted-1; 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project function: calcRefValBwd 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: The function determines the scalefactor which is closed to the scalefactorband 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_max. The same is done for intensity data and noise energies. 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: - reference value scf 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project - reference value internsity data 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project - reference value noise energy 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: - 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid calcRefValBwd (CErRvlcInfo *pRvlc, 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoderChannelInfo *pAacDecoderChannelInfo, 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *refIsBwd, 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *refNrgBwd, 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *refScfBwd) 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int band,bnds,group,startBand; 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int idIs,idNrg,idScf; 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int conceal_max,conceal_group_max; 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int MaximumScaleFactorBands; 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 16; 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 64; 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands; 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands; 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calculate first reference value for approach in backward direction */ 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project idIs = idNrg = idScf = 1; 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* set reference values */ 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refIsBwd = pRvlc->dpcm_is_last_position - SF_OFFSET; 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refNrgBwd = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - 90 - 256 + pRvlc->dpcm_noise_nrg; 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refScfBwd = pRvlc->rev_global_gain - SF_OFFSET; 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand=conceal_max+1; 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if needed, re-set reference values */ 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=conceal_group_max; group < pRvlc->numWindowGroups; group++) { 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=startBand; band < pRvlc->maxSfbTransmitted; band++) { 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { 2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ZERO_HCB: 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB: 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB2: 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (idIs) { 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refIsBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project idIs=0; /* reference value has been set */ 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case NOISE_HCB: 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (idNrg) { 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refNrgBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project idNrg=0; /* reference value has been set */ 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break ; 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (idScf) { 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *refScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project idScf=0; /* reference value has been set */ 2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand=0; 2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project function: BidirectionalEstimation_UseLowerScfOfCurrentFrame 2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This approach by means of bidirectional estimation is generally performed when 2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project a single bit error has been detected, the bit error can be isolated between 2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 'conceal_min' and 'conceal_max' and the 'sf_concealment' flag is not set. The 2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sets of scalefactors decoded in forward and backward direction are compared 2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project with each other. The smaller scalefactor will be considered as the correct one 2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project respectively. The reconstruction of the scalefactors with this approach archieve 2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project good results in audio quality. The strategy must be applied to scalefactors, 2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project intensity data and noise energy seperately. 2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: Concealed scalefactor, noise energy and intensity data between conceal_min and 2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_max 2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: - 2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid BidirectionalEstimation_UseLowerScfOfCurrentFrame (CAacDecoderChannelInfo *pAacDecoderChannelInfo) 2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; 2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int band,bnds,startBand,endBand,group; 2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int conceal_min,conceal_max; 2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int conceal_group_min,conceal_group_max; 2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int MaximumScaleFactorBands; 2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) { 2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 16; 2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 64; 2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* If an error was detected just in forward or backward direction, set the corresponding border for concealment to a 2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project appropriate scalefactor band. The border is set to first or last sfb respectively, because the error will possibly 2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project not follow directly after the corrupt bit but just after decoding some more (wrong) scalefactors. */ 2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pRvlc->conceal_min == CONCEAL_MIN_INIT) 2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRvlc->conceal_min = 0; 2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pRvlc->conceal_max == CONCEAL_MAX_INIT) 2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRvlc->conceal_max = (pRvlc->numWindowGroups-1)*16+pRvlc->maxSfbTransmitted-1; 2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands; 2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands; 2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands; 2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands; 2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pRvlc->conceal_min == pRvlc->conceal_max) { 2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int refIsFwd,refNrgFwd,refScfFwd; 2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int refIsBwd,refNrgBwd,refScfBwd; 2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = pRvlc->conceal_min; 3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calcRefValFwd(pRvlc,pAacDecoderChannelInfo,&refIsFwd,&refNrgFwd,&refScfFwd); 3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calcRefValBwd(pRvlc,pAacDecoderChannelInfo,&refIsBwd,&refNrgBwd,&refScfBwd); 3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { 3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ZERO_HCB: 3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB: 3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB2: 3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (refIsFwd < refIsBwd) 3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refIsFwd; 3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refIsBwd; 3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case NOISE_HCB: 3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (refNrgFwd < refNrgBwd) 3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refNrgFwd; 3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refNrgBwd; 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (refScfFwd < refScfBwd) 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refScfFwd; 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refScfBwd; 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[pRvlc->conceal_max] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[pRvlc->conceal_max]; 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[pRvlc->conceal_min] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[pRvlc->conceal_min]; 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* consider the smaller of the forward and backward decoded value as the correct one */ 3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = conceal_min; 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (conceal_group_min == conceal_group_max) 3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = conceal_max; 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = pRvlc->maxSfbTransmitted-1; 3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=conceal_group_min; group <= conceal_group_max; group++) { 3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=startBand; band <= endBand; band++) { 3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds] < pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]) 3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = 0; 3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((group+1) == conceal_group_max) 3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = conceal_max; 3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* now copy all data to the output buffer which needs not to be concealed */ 3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (conceal_group_min == 0) 3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = conceal_min; 3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = pRvlc->maxSfbTransmitted; 3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=0; group <= conceal_group_min; group++) { 3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=0; band < endBand; band++) { 3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((group+1) == conceal_group_min) 3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = conceal_min; 3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = conceal_max+1; 3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=conceal_group_max; group < pRvlc->numWindowGroups; group++) { 3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=startBand; band < pRvlc->maxSfbTransmitted; band++) { 3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = 0; 3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project function: BidirectionalEstimation_UseScfOfPrevFrameAsReference 3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This approach by means of bidirectional estimation is generally performed when 3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project a single bit error has been detected, the bit error can be isolated between 3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 'conceal_min' and 'conceal_max', the 'sf_concealment' flag is set and the 3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project previous frame has the same block type as the current frame. The scalefactor 3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project decoded in forward and backward direction and the scalefactor of the previous 3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frame are compared with each other. The smaller scalefactor will be considered 3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project as the correct one. At this the codebook of the previous and current frame must 3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project be of the same set (scf, nrg, is) in each scalefactorband. Otherwise the 3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scalefactor of the previous frame is not considered in the minimum calculation. 3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The reconstruction of the scalefactors with this approach archieve good results 3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project in audio quality. The strategy must be applied to scalefactors, intensity data 3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project and noise energy seperately. 3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: Concealed scalefactor, noise energy and intensity data between conceal_min and 3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_max 3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: - 3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid BidirectionalEstimation_UseScfOfPrevFrameAsReference ( 4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoderChannelInfo *pAacDecoderChannelInfo, 4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo 4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int band,bnds,startBand,endBand,group; 4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int conceal_min,conceal_max; 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int conceal_group_min,conceal_group_max; 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int MaximumScaleFactorBands; 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int commonMin; 4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) { 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 16; 4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 64; 4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* If an error was detected just in forward or backward direction, set the corresponding border for concealment to a 4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project appropriate scalefactor band. The border is set to first or last sfb respectively, because the error will possibly 4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project not follow directly after the corrupt bit but just after decoding some more (wrong) scalefactors. */ 4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pRvlc->conceal_min == CONCEAL_MIN_INIT) 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRvlc->conceal_min = 0; 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pRvlc->conceal_max == CONCEAL_MAX_INIT) 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRvlc->conceal_max = (pRvlc->numWindowGroups-1)*16+pRvlc->maxSfbTransmitted-1; 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands; 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands; 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands; 4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands; 4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[pRvlc->conceal_max] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[pRvlc->conceal_max]; 4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[pRvlc->conceal_min] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[pRvlc->conceal_min]; 4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* consider the smaller of the forward and backward decoded value as the correct one */ 4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = conceal_min; 4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (conceal_group_min == conceal_group_max) 4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = conceal_max; 4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = pRvlc->maxSfbTransmitted-1; 4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=conceal_group_min; group <= conceal_group_max; group++) { 4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=startBand; band <= endBand; band++) { 4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { 4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ZERO_HCB: 4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0; 4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB: 4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB2: 4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==INTENSITY_HCB) || (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==INTENSITY_HCB2) ) { 4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); 4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); 4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); 4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case NOISE_HCB: 4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==NOISE_HCB) ) { 4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); 4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=ZERO_HCB) 4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=NOISE_HCB) 4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=INTENSITY_HCB) 4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=INTENSITY_HCB2) ) 4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); 4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = 0; 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((group+1) == conceal_group_max) 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = conceal_max; 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* now copy all data to the output buffer which needs not to be concealed */ 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (conceal_group_min == 0) 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = conceal_min; 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = pRvlc->maxSfbTransmitted; 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=0; group <= conceal_group_min; group++) { 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=0; band < endBand; band++) { 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((group+1) == conceal_group_min) 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project endBand = conceal_min; 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = conceal_max+1; 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=conceal_group_max; group < pRvlc->numWindowGroups; group++) { 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=startBand; band < pRvlc->maxSfbTransmitted; band++) { 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startBand = 0; 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project function: StatisticalEstimation 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This approach by means of statistical estimation is generally performed when 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project both the start value and the end value are different and no further errors have 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project been detected. Considering the forward and backward decoded scalefactors, the 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project set with the lower scalefactors in sum will be considered as the correct one. 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The scalefactors are differentially encoded. Normally it would reach to compare 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project one pair of the forward and backward decoded scalefactors to specify the lower 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project set. But having detected no further errors does not necessarily mean the absence 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project of errors. Therefore all scalefactors decoded in forward and backward direction 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project are summed up seperately. The set with the lower sum will be used. The strategy 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project must be applied to scalefactors, intensity data and noise energy seperately. 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: Concealed scalefactor, noise energy and intensity data 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: - 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid StatisticalEstimation (CAacDecoderChannelInfo *pAacDecoderChannelInfo) 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int band,bnds,group; 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int sumIsFwd,sumIsBwd; /* sum of intensity data forward/backward */ 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int sumNrgFwd,sumNrgBwd; /* sum of noise energy data forward/backward */ 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int sumScfFwd,sumScfBwd; /* sum of scalefactor data forward/backward */ 5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int useIsFwd,useNrgFwd,useScfFwd; /* the flags signals the elements which are used for the final result */ 5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int MaximumScaleFactorBands; 5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) 5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 16; 5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 64; 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumIsFwd = sumIsBwd = sumNrgFwd = sumNrgBwd = sumScfFwd = sumScfBwd = 0; 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project useIsFwd = useNrgFwd = useScfFwd = 0; 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calculate sum of each group (scf,nrg,is) of forward and backward direction */ 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=0; group<pRvlc->numWindowGroups; group++) { 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=0; band < pRvlc->maxSfbTransmitted; band++) { 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ZERO_HCB: 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB: 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB2: 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumIsFwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumIsBwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case NOISE_HCB: 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumNrgFwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumNrgBwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break ; 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumScfFwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sumScfBwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* find for each group (scf,nrg,is) the correct direction */ 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( sumIsFwd < sumIsBwd ) 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project useIsFwd = 1; 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( sumNrgFwd < sumNrgBwd ) 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project useNrgFwd = 1; 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( sumScfFwd < sumScfBwd ) 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project useScfFwd = 1; 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* conceal each group (scf,nrg,is) */ 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=0; group<pRvlc->numWindowGroups; group++) { 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=0; band < pRvlc->maxSfbTransmitted; band++) { 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ZERO_HCB: 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB: 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB2: 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (useIsFwd) 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case NOISE_HCB: 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (useNrgFwd) 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break ; 6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (useScfFwd) 6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; 6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; 6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: Approach by means of predictive interpolation 6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project This approach by means of predictive estimation is generally performed when 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the error cannot be isolated between 'conceal_min' and 'conceal_max', the 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 'sf_concealment' flag is set and the previous frame has the same block type 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project as the current frame. Check for each scalefactorband if the same type of data 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (scalefactor, internsity data, noise energies) is transmitted. If so use the 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scalefactor (intensity data, noise energy) in the current frame. Otherwise set 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the scalefactor (intensity data, noise energy) for this scalefactorband to zero. 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: Concealed scalefactor, noise energy and intensity data 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: - 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid PredictiveInterpolation ( 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoderChannelInfo *pAacDecoderChannelInfo, 6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int band,bnds,group; 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int MaximumScaleFactorBands; 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int commonMin; 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 16; 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MaximumScaleFactorBands = 64; 6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (group=0; group<pRvlc->numWindowGroups; group++) { 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (band=0; band < pRvlc->maxSfbTransmitted; band++) { 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bnds = 16*group+band; 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ZERO_HCB: 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0; 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB: 6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case INTENSITY_HCB2: 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==INTENSITY_HCB) || (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==INTENSITY_HCB2) ) { 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = -110; 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case NOISE_HCB: 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==NOISE_HCB) ) { 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = -110; 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=ZERO_HCB) 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=NOISE_HCB) 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=INTENSITY_HCB) 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=INTENSITY_HCB2) ) { 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0; 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 698