12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* -----------------------------------------------------------------------------------------------------------
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi� Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
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