12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* -----------------------------------------------------------------------------------------------------------
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
52228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project� Copyright  1995 - 2012 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************  MPEG-4 AAC Decoder  **************************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Author(s):   Manuel Jander
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Description:
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdecoder_lib.h"
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aac_ram.h"
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdecoder.h"
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpdec_lib.h"
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_core.h" /* FDK_tools version info */
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project #include "sbrdecoder.h"
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "conceal.h"
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project #include "aacdec_drc.h"
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Decoder library info */
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACDECODER_LIB_VL0 2
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACDECODER_LIB_VL1 4
1136ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi#define AACDECODER_LIB_VL2 7
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACDECODER_LIB_TITLE "AAC Decoder Lib"
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACDECODER_LIB_BUILD_DATE __DATE__
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define AACDECODER_LIB_BUILD_TIME __TIME__
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_DECODER_ERROR
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsetConcealMethod ( const HANDLE_AACDECODER  self,
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   const INT                method );
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_GetFreeBytes ( const HANDLE_AACDECODER  self, UINT *pFreeBytes){
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* reset free bytes */
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *pFreeBytes = 0;
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* check handle */
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(!self)
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_INVALID_HANDLE;
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* return nr of free bytes */
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_FDK_BITSTREAM hBs = transportDec_GetBitstream(self->hInput, 0);
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *pFreeBytes = FDKgetFreeBits(hBs) >> 3;
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* success */
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_DEC_OK;
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Config Decoder using a CSAudioSpecificConfig struct.
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Config(HANDLE_AACDECODER self, const CSAudioSpecificConfig *pAscStruct)
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR err;
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Initialize AAC core decoder, and update self->streaminfo */
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  err = CAacDecoder_Init(self, pAscStruct);
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return err;
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_ConfigRaw (
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AACDECODER self,
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR *conf[],
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT length[] )
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR err = AAC_DEC_OK;
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  TRANSPORTDEC_ERROR   errTp;
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT layer, nrOfLayers = self->nrOfLayers;
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(layer = 0; layer < nrOfLayers; layer++){
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if(length[layer] > 0){
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      errTp = transportDec_OutOfBandConfig(self->hInput, conf[layer], length[layer], layer);
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (errTp != TRANSPORTDEC_OK) {
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        switch (errTp) {
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        case TRANSPORTDEC_NEED_TO_RESTART:
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = AAC_DEC_NEED_TO_RESTART;
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        case TRANSPORTDEC_UNSUPPORTED_FORMAT:
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = AAC_DEC_UNSUPPORTED_FORMAT;
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        default:
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = AAC_DEC_UNKNOWN;
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* if baselayer is OK we continue decoding */
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if(layer  >= 1){
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->nrOfLayers = layer;
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return err;
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT aacDecoder_ConfigCallback(void *handle, const CSAudioSpecificConfig *pAscStruct)
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_AACDECODER self = (HANDLE_AACDECODER)handle;
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR err = AAC_DEC_OK;
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  TRANSPORTDEC_ERROR errTp;
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = aacDecoder_Config(self, pAscStruct);
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (err == AAC_DEC_OK) {
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( self->flags & (AC_USAC|AC_RSVD50|AC_LD|AC_ELD)
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      && CConcealment_GetDelay(&self->concealCommonData) > 0 )
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Revert to error concealment method Noise Substitution.
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         Because interpolation is not implemented for USAC/RSVD50 or
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         the additional delay is unwanted for low delay codecs. */
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      setConcealMethod(self, 1);
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef DEBUG
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKprintf("  Concealment method was reverted to 1 !\n");
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    errTp = TRANSPORTDEC_OK;
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (IS_INIT_ERROR(err)) {
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      errTp = TRANSPORTDEC_UNSUPPORTED_FORMAT;
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* Fatal errors */
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (err == AAC_DEC_NEED_TO_RESTART) {
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      errTp = TRANSPORTDEC_NEED_TO_RESTART;
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      errTp = TRANSPORTDEC_UNKOWN_ERROR;
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return errTp;
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectaacDecoder_AncDataInit ( HANDLE_AACDECODER self,
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         UCHAR *buffer,
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         int size )
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CAncData *ancData = &self->ancData;
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return CAacDecoder_AncDataInit(ancData, buffer, size);
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectaacDecoder_AncDataGet ( HANDLE_AACDECODER self,
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        int     index,
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        UCHAR **ptr,
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        int    *size )
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CAncData *ancData = &self->ancData;
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return CAacDecoder_AncDataGet(ancData, index, ptr, size);
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_DECODER_ERROR
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectsetConcealMethod ( const HANDLE_AACDECODER  self,   /*!< Handle of the decoder instance */
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   const INT                method )
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR errorStatus = AAC_DEC_OK;
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CConcealParams  *pConcealData = NULL;
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_SBRDECODER hSbrDec = NULL;
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_AAC_DRC hDrcInfo = NULL;
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_PCM_DOWNMIX hPcmDmx = NULL;
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CConcealmentMethod backupMethod;
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int backupDelay = 0;
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int bsDelay = 0;
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* check decoder handle */
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self != NULL) {
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pConcealData = &self->concealCommonData;
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hSbrDec = self->hSbrDecoder;
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hDrcInfo = self->hDrcInfo;
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hPcmDmx = self->hPcmUtils;
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Get current method/delay */
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  backupMethod = CConcealment_GetMethod(pConcealData);
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  backupDelay  = CConcealment_GetDelay(pConcealData);
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Be sure to set AAC and SBR concealment method simultaneously! */
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  errorStatus =
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CConcealment_SetParams(
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pConcealData,
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      (int)method,                         // concealMethod
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,  // concealFadeOutSlope
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,  // concealFadeInSlope
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,  // concealMuteRelease
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      AACDEC_CONCEAL_PARAM_NOT_SPECIFIED   // concealComfNoiseLevel
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    );
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (errorStatus != AAC_DEC_OK)
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    && (errorStatus != AAC_DEC_INVALID_HANDLE) ) {
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Get new delay */
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bsDelay = CConcealment_GetDelay(pConcealData);
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SBR_ERROR sbrErr = SBRDEC_OK;
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* set SBR bitstream delay */
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sbrErr = sbrDecoder_SetParam (
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hSbrDec,
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      SBR_SYSTEM_BITSTREAM_DELAY,
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bsDelay
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    );
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (sbrErr) {
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case SBRDEC_OK:
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case SBRDEC_NOT_INITIALIZED:
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (self != NULL) {
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* save the param value and set later
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           (when SBR has been initialized) */
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->sbrParams.bsDelay = bsDelay;
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      errorStatus = AAC_DEC_SET_PARAM_FAIL;
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  errorStatus =
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacDecoder_drcSetParam (
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hDrcInfo,
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      DRC_BS_DELAY,
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bsDelay
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    );
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (errorStatus != AAC_DEC_OK)
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    && (errorStatus != AAC_DEC_INVALID_HANDLE) ) {
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (errorStatus == AAC_DEC_OK) {
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    PCMDMX_ERROR err =
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pcmDmx_SetParam (
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hPcmDmx,
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        DMX_BS_DATA_DELAY,
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bsDelay
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (err) {
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case PCMDMX_INVALID_HANDLE:
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      errorStatus = AAC_DEC_INVALID_HANDLE;
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case PCMDMX_OK:
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      errorStatus = AAC_DEC_SET_PARAM_FAIL;
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (errorStatus != AAC_DEC_OK)
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    && (errorStatus != AAC_DEC_INVALID_HANDLE) )
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Revert to the initial state */
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CConcealment_SetParams (
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pConcealData,
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        (int)backupMethod,
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACDEC_CONCEAL_PARAM_NOT_SPECIFIED,
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACDEC_CONCEAL_PARAM_NOT_SPECIFIED
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Revert SBR bitstream delay */
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sbrDecoder_SetParam (
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hSbrDec,
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        SBR_SYSTEM_BITSTREAM_DELAY,
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        backupDelay
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Revert DRC bitstream delay */
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacDecoder_drcSetParam (
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hDrcInfo,
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        DRC_BS_DELAY,
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        backupDelay
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Revert PCM mixdown bitstream delay */
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pcmDmx_SetParam (
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hPcmDmx,
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        DMX_BS_DATA_DELAY,
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        backupDelay
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return errorStatus;
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectaacDecoder_SetParam ( const HANDLE_AACDECODER  self,   /*!< Handle of the decoder instance */
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      const AACDEC_PARAM       param,  /*!< Parameter to set               */
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      const INT                value)  /*!< Parameter valued               */
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR errorStatus = AAC_DEC_OK;
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CConcealParams  *pConcealData = NULL;
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_AAC_DRC hDrcInfo = NULL;
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* check decoder handle */
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self != NULL) {
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pConcealData = &self->concealCommonData;
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hDrcInfo = self->hDrcInfo;
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* configure the subsystems */
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (param)
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_PCM_OUTPUT_INTERLEAVED:
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (value < 0 || value > 1) {
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_SET_PARAM_FAIL;
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self == NULL) {
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_INVALID_HANDLE;
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->outputInterleaved = value;
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_PCM_OUTPUT_CHANNELS:
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PCMDMX_ERROR err;
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = pcmDmx_SetParam (
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->hPcmUtils,
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              NUMBER_OF_OUTPUT_CHANNELS,
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              value );
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      switch (err) {
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case PCMDMX_OK:
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case PCMDMX_INVALID_HANDLE:
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AAC_DEC_INVALID_HANDLE;
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AAC_DEC_SET_PARAM_FAIL;
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_PCM_DUAL_CHANNEL_OUTPUT_MODE:
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      PCMDMX_ERROR err;
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = pcmDmx_SetParam (
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->hPcmUtils,
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              DUAL_CHANNEL_DOWNMIX_MODE,
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              value );
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      switch (err) {
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case PCMDMX_OK:
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case PCMDMX_INVALID_HANDLE:
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AAC_DEC_INVALID_HANDLE;
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AAC_DEC_SET_PARAM_FAIL;
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_PCM_OUTPUT_CHANNEL_MAPPING:
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (value) {
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case 0:
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->channelOutputMapping = channelMappingTablePassthrough;
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case 1:
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->channelOutputMapping = channelMappingTableWAV;
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        errorStatus = AAC_DEC_SET_PARAM_FAIL;
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_QMF_LOWPOWER:
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self == NULL) {
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_INVALID_HANDLE;
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /**
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * Set QMF mode (might be overriden)
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     *  0:HQ (complex)
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     *  1:LP (partially complex)
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     */
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->qmfModeUser = (QMF_MODE)value;
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_DRC_ATTENUATION_FACTOR:
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* DRC compression factor (where 0 is no and 127 is max compression) */
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    errorStatus =
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aacDecoder_drcSetParam (
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hDrcInfo,
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        DRC_CUT_SCALE,
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_DRC_BOOST_FACTOR:
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* DRC boost factor (where 0 is no and 127 is max boost) */
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    errorStatus =
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aacDecoder_drcSetParam (
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hDrcInfo,
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        DRC_BOOST_SCALE,
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_DRC_REFERENCE_LEVEL:
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* DRC reference level quantized in 0.25dB steps using values [0..127] it is '-' for analog scaling */
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    errorStatus =
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aacDecoder_drcSetParam (
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hDrcInfo,
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        TARGET_REF_LEVEL,
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_DRC_HEAVY_COMPRESSION:
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Don't need to overwrite cut/boost values */
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    errorStatus =
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aacDecoder_drcSetParam (
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hDrcInfo,
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        APPLY_HEAVY_COMPRESSION,
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        value
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_TPDEC_CLEAR_BUFFER:
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    transportDec_SetParam(self->hInput, TPDEC_PARAM_RESET, 1);
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->streamInfo.numLostAccessUnits = 0;
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->streamInfo.numBadBytes = 0;
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->streamInfo.numTotalBytes = 0;
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* aacDecoder_SignalInterruption(self); */
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AAC_CONCEAL_METHOD:
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Changing the concealment method can introduce additional bitstream delay. And
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       that in turn affects sub libraries and modules which makes the whole thing quite
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       complex.  So the complete changing routine is packed into a helper function which
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       keeps all modules and libs in a consistent state even in the case an error occures. */
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    errorStatus = setConcealMethod ( self, value );
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_SET_PARAM_FAIL;
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }  /* switch(param) */
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (errorStatus);
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP HANDLE_AACDECODER aacDecoder_Open(TRANSPORT_TYPE transportFmt, UINT nrOfLayers)
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_INSTANCE *aacDec = NULL;
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_TRANSPORTDEC pIn;
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int err = 0;
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Allocate transport layer struct. */
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pIn = transportDec_Open(transportFmt, TP_FLAG_MPEG4);
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (pIn == NULL) {
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return NULL;
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transportDec_SetParam(pIn, TPDEC_PARAM_IGNORE_BUFFERFULLNESS, 1);
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Allocate AAC decoder core struct. */
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aacDec = CAacDecoder_Open(transportFmt);
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (aacDec == NULL) {
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    transportDec_Close(&pIn);
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aacDec->hInput = pIn;
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aacDec->nrOfLayers = nrOfLayers;
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aacDec->channelOutputMapping = channelMappingTableWAV;
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Register Config Update callback. */
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transportDec_RegisterAscCallback(pIn, aacDecoder_ConfigCallback, (void*)aacDec);
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* open SBR decoder */
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( SBRDEC_OK != sbrDecoder_Open ( &aacDec->hSbrDecoder )) {
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    err = -1;
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aacDec->qmfModeUser = NOT_DEFINED;
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transportDec_RegisterSbrCallback(aacDec->hInput, (cbSbr_t)sbrDecoder_Header, (void*)aacDec->hSbrDecoder);
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pcmDmx_Open( &aacDec->hPcmUtils );
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (aacDec->hPcmUtils == NULL) {
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    err = -1;
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Assure that all modules have same delay */
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( setConcealMethod(aacDec, CConcealment_GetMethod(&aacDec->concealCommonData)) ) {
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    err = -1;
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (err == -1) {
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacDecoder_Close(aacDec);
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacDec = NULL;
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return aacDec;
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Fill(
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AACDECODER   self,
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR              *pBuffer[],
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT          bufferSize[],
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UINT               *pBytesValid
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  TRANSPORTDEC_ERROR tpErr;
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* loop counter for layers; if not TT_MP4_RAWPACKETS used as index for only
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     available layer                                                           */
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT layer      = 0;
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT nrOfLayers = self->nrOfLayers;
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (layer = 0; layer < nrOfLayers; layer++){
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        tpErr = transportDec_FillData( self->hInput, pBuffer[layer], bufferSize[layer], &pBytesValid[layer], layer );
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (tpErr != TRANSPORTDEC_OK) {
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return AAC_DEC_UNKNOWN;  /* Must be an internal error */
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_DEC_OK;
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void aacDecoder_SignalInterruption(HANDLE_AACDECODER self)
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CAacDecoder_SignalInterruption(self);
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( self->hSbrDecoder != NULL ) {
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sbrDecoder_SetParam(self->hSbrDecoder, SBR_BS_INTERRUPTION, 0);
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void aacDecoder_UpdateBitStreamCounters(CStreamInfo *pSi, HANDLE_FDK_BITSTREAM hBs, int nBits, AAC_DECODER_ERROR ErrorStatus)
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculate bit difference (amount of bits moved forward) */
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  nBits = nBits - FDKgetValidBits(hBs);
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Note: The amount of bits consumed might become negative when parsing a
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     bit stream with several sub frames, and we find out at the last sub frame
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     that the total frame length does not match the sum of sub frame length.
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     If this happens, the transport decoder might want to rewind to the supposed
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     ending of the transport frame, and this position might be before the last
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     access unit beginning. */
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Calc bitrate. */
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (pSi->frameSize > 0) {
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pSi->bitRate = (nBits * pSi->sampleRate)/pSi->frameSize;
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* bit/byte counters */
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int nBytes;
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    nBytes = nBits>>3;
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pSi->numTotalBytes += nBytes;
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (IS_OUTPUT_VALID(ErrorStatus)) {
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pSi->numTotalAccessUnits++;
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (IS_DECODE_ERROR(ErrorStatus)) {
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pSi->numBadBytes += nBytes;
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pSi->numBadAccessUnits++;
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT aacDecoder_EstimateNumberOfLostFrames(HANDLE_AACDECODER self)
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT n;
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transportDec_GetMissingAccessUnitCount( &n, self->hInput);
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return n;
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame(
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AACDECODER  self,
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT_PCM           *pTimeData,
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT          timeDataSize,
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT         flags)
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AAC_DECODER_ERROR ErrorStatus;
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT layer;
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT nBits;
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT interleaved = self->outputInterleaved;
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_FDK_BITSTREAM hBs;
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int fTpInterruption = 0;  /* Transport originated interruption detection. */
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int fTpConceal = 0;       /* Transport originated concealment. */
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self == NULL) {
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return AAC_DEC_INVALID_HANDLE;
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (flags & AACDEC_INTR) {
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->streamInfo.numLostAccessUnits = 0;
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hBs = transportDec_GetBitstream(self->hInput, 0);
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Get current bits position for bitrate calculation. */
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    nBits = FDKgetValidBits(hBs);
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH) ) )
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      TRANSPORTDEC_ERROR err;
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for(layer = 0; layer < self->nrOfLayers; layer++)
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = transportDec_ReadAccessUnit(self->hInput, layer);
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (err != TRANSPORTDEC_OK) {
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          switch (err) {
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          case TRANSPORTDEC_NOT_ENOUGH_BITS:
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ErrorStatus = AAC_DEC_NOT_ENOUGH_BITS;
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          case TRANSPORTDEC_SYNC_ERROR:
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->streamInfo.numLostAccessUnits = aacDecoder_EstimateNumberOfLostFrames(self);
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            fTpInterruption = 1;
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            break;
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          case TRANSPORTDEC_NEED_TO_RESTART:
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ErrorStatus = AAC_DEC_NEED_TO_RESTART;
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          case TRANSPORTDEC_CRC_ERROR:
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            fTpConceal = 1;
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            break;
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          default:
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ErrorStatus = AAC_DEC_UNKNOWN;
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            goto bail;
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (self->streamInfo.numLostAccessUnits > 0) {
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->streamInfo.numLostAccessUnits--;
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Signal bit stream interruption to other modules if required. */
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( fTpInterruption || (flags & (AACDEC_INTR|AACDEC_CLRHIST)) )
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aacDecoder_SignalInterruption(self);
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( ! (flags & AACDEC_INTR) ) {
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ErrorStatus = AAC_DEC_TRANSPORT_SYNC_ERROR;
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Empty bit buffer in case of flush request. */
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (flags & AACDEC_FLUSH)
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transportDec_SetParam(self->hInput, TPDEC_PARAM_RESET, 1);
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->streamInfo.numLostAccessUnits = 0;
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->streamInfo.numBadBytes = 0;
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->streamInfo.numTotalBytes = 0;
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ErrorStatus = CAacDecoder_DecodeFrame(self,
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          flags | (fTpConceal ? AACDEC_CONCEAL : 0),
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          pTimeData,
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          timeDataSize,
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          interleaved);
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (!(flags & (AACDEC_CONCEAL|AACDEC_FLUSH))) {
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      TRANSPORTDEC_ERROR tpErr;
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      tpErr = transportDec_EndAccessUnit(self->hInput);
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (tpErr != TRANSPORTDEC_OK) {
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->frameOK = 0;
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* If the current pTimeData does not contain a valid signal, there nothing else we can do, so bail. */
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( ! IS_OUTPUT_VALID(ErrorStatus) ) {
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Export data into streaminfo structure */
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->streamInfo.sampleRate = self->streamInfo.aacSampleRate;
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->streamInfo.frameSize  = self->streamInfo.aacSamplesPerFrame;
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->streamInfo.numChannels = self->aacChannels;
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CAacDecoder_SyncQmfMode(self);
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* sbr decoder */
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (ErrorStatus || (flags & AACDEC_CONCEAL) || self->pAacDecoderStaticChannelInfo[0]->concealmentInfo.concealState > ConcealState_FadeIn)
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->frameOK = 0;  /* if an error has occured do concealment in the SBR decoder too */
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self->sbrEnabled)
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      SBR_ERROR sbrError = SBRDEC_OK;
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* set params */
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrDecoder_SetParam ( self->hSbrDecoder,
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            SBR_SYSTEM_BITSTREAM_DELAY,
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            self->sbrParams.bsDelay);
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( self->streamInfo.aot == AOT_ER_AAC_ELD ) {
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Configure QMF */
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrDecoder_SetParam ( self->hSbrDecoder,
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              SBR_LD_QMF_TIME_ALIGN,
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              (self->flags & AC_LD_MPS) ? 1 : 0 );
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* apply SBR processing */
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrError = sbrDecoder_Apply ( self->hSbrDecoder,
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    pTimeData,
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   &self->streamInfo.numChannels,
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   &self->streamInfo.sampleRate,
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    self->channelOutputMapping[self->aacChannels-1],
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    interleaved,
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    self->frameOK,
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   &self->psPossible);
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     if (sbrError == SBRDEC_OK) {
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* Update data in streaminfo structure. Assume that the SBR upsampling factor is either 1 or 2 */
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       self->flags |= AC_SBR_PRESENT;
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (self->streamInfo.aacSampleRate != self->streamInfo.sampleRate) {
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         if (self->streamInfo.frameSize == 768) {
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->streamInfo.frameSize =  (self->streamInfo.aacSamplesPerFrame * 8) / 3;
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         } else {
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->streamInfo.frameSize =  self->streamInfo.aacSamplesPerFrame << 1;
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         }
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       if (self->psPossible) {
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         self->flags |= AC_PS_PRESENT;
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         self->channelType[0] = ACT_FRONT;
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         self->channelType[1] = ACT_FRONT;
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         self->channelIndices[0] = 0;
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         self->channelIndices[1] = 1;
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       } else {
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         self->flags &= ~AC_PS_PRESENT;
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( flags & (AACDEC_INTR | AACDEC_CLRHIST) ) {
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* delete data from the past (e.g. mixdown coeficients) */
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pcmDmx_Reset( self->hPcmUtils, PCMDMX_RESET_BS_DATA );
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* do PCM post processing */
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pcmDmx_ApplyFrame (
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->hPcmUtils,
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pTimeData,
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->streamInfo.frameSize,
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           &self->streamInfo.numChannels,
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            interleaved,
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->channelType,
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->channelIndices,
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->channelOutputMapping
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      );
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Signal interruption to take effect in next frame. */
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( flags & AACDEC_FLUSH ) {
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aacDecoder_SignalInterruption(self);
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Update externally visible copy of flags */
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->streamInfo.flags = self->flags;
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Update Statistics */
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacDecoder_UpdateBitStreamCounters(&self->streamInfo, hBs, nBits, ErrorStatus);
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return ErrorStatus;
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP void aacDecoder_Close ( HANDLE_AACDECODER self )
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self == NULL)
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return;
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->hPcmUtils != NULL) {
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pcmDmx_Close( &self->hPcmUtils );
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->hSbrDecoder != NULL) {
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sbrDecoder_Close(&self->hSbrDecoder);
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->hInput != NULL) {
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    transportDec_Close(&self->hInput);
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CAacDecoder_Close(self);
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP CStreamInfo* aacDecoder_GetStreamInfo ( HANDLE_AACDECODER self )
9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return CAacDecoder_GetStreamInfo(self);
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP INT aacDecoder_GetLibInfo ( LIB_INFO *info )
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i;
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (info == NULL) {
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrDecoder_GetLibInfo( info );
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transportDec_GetLibInfo( info );
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_toolsGetLibInfo( info );
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pcmDmx_GetLibInfo( info );
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* search for next free tab */
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0; i < FDK_MODULE_LAST; i++) {
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (info[i].module_id == FDK_NONE) break;
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (i == FDK_MODULE_LAST) {
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info += i;
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->module_id = FDK_AACDEC;
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* build own library info */
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->version = LIB_VERSION(AACDECODER_LIB_VL0, AACDECODER_LIB_VL1, AACDECODER_LIB_VL2);
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  LIB_VERSION_STRING(info);
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->build_date = AACDECODER_LIB_BUILD_DATE;
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->build_time = AACDECODER_LIB_BUILD_TIME;
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->title = AACDECODER_LIB_TITLE;
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Set flags */
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->flags = 0
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_LC
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_VCB11
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_HCR
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_RVLC
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_ER_AAC_LD
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_ER_AAC_ELD
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_CONCEALMENT
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_DRC
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_MPEG4
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_1024
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_960
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_512
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      | CAPF_AAC_480
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ;
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* End of flags */
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
990