aacdecoder.cpp revision 603f48ab99ce76f552f4f6f85d06b8c5b94c698e
12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* -----------------------------------------------------------------------------------------------------------
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi� Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************  MPEG-4 AAC Decoder  **************************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Author(s):   Josef Hoepfl
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
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \page default General Overview of the AAC Decoder Implementation
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The main entry point to decode a AAC frame is CAacDecoder_DecodeFrame(). It handles the different
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transport multiplexes and bitstream formats supported by this implementation. It extracts the
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_raw_data_blocks from these bitstreams to further process then in the actual decoding stages.
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Note: Click on a function of file in the above image to see details about the function. Also note, that
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  this is just an overview of the most important functions and not a complete call graph.
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h2>1 Bitstream deformatter</h2>
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The basic bit stream parser function CChannelElement_Read() is called. It uses other subcalls in order
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  to parse and unpack the bitstreams. Note, that this includes huffmann decoding of the coded spectral data.
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  This operation can be computational significant specifically at higher bitrates. Optimization is likely in
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CBlock_ReadSpectralData().
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The bitstream deformatter also includes many bitfield operations. Profiling on the target will determine
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  required optimizations.
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h2>2 Actual decoding to retain the time domain output</h2>
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The basic bitstream deformatter function CChannelElement_Decode() for CPE elements and SCE elements are called.
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Except for the stereo processing (2.1) which is only used for CPE elements, the function calls for CPE or SCE
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  are similar, except that CPE always processes to independent channels while SCE only processes one channel.
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Often there is the distinction between long blocks and short blocks. However, computational expensive functions
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  that ususally require optimization are being shared by these two groups,
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h3>2.1 Stereo processing for CPE elements</h3>
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CChannelPairElement_Decode() first calles the joint stereo  tools in stereo.cpp when required.
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h3>2.2 Scaling of spectral data</h3>
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CBlock_ScaleSpectralData().
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h3>2.3 Apply additional coding tools</h3>
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ApplyTools() calles the PNS tools in case of MPEG-4 bitstreams, and TNS filtering CTns_Apply() for MPEG-2 and MPEG-4 bitstreams.
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The function TnsFilterIIR() which is called by CTns_Apply() (2.3.1) might require some optimization.
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  <h2>3 Frequency-To-Time conversion</h3>
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The filterbank is called using CBlock_FrequencyToTime() using the MDCT module from the FDK Tools
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdecoder.h"
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aac_rom.h"
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aac_ram.h"
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "channel.h"
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_audio.h"
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_tools_rom.h"
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #include "aacdec_pns.h"
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #include "sbrdecoder.h"
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #include "aacdec_hcr.h"
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  #include "rvlc.h"
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpdec_lib.h"
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "conceal.h"
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define CAN_DO_PS(aot) \
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ((aot) == AOT_AAC_LC \
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project|| (aot) == AOT_SBR \
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project|| (aot) == AOT_PS \
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project|| (aot) == AOT_ER_BSAC \
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project|| (aot) == AOT_DRM_AAC)
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define IS_USAC(aot) \
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ((aot) == AOT_USAC \
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project|| (aot) == AOT_RSVD50)
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define IS_LOWDELAY(aot) \
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ((aot) == AOT_ER_AAC_LD \
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project|| (aot) == AOT_ER_AAC_ELD)
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self)
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Assign user requested mode */
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->qmfModeCurr = self->qmfModeUser;
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( self->qmfModeCurr == NOT_DEFINED )
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (IS_LOWDELAY(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT))
1862ddc922da87bb675b8ab8c305566436e806df0d9Jean-Michel Trivi      || ( (self->streamInfo.aacNumChannels == 1)
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        && ( (CAN_DO_PS(self->streamInfo.aot) && !(self->flags & AC_MPS_PRESENT))
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          || (  IS_USAC(self->streamInfo.aot) &&  (self->flags & AC_MPS_PRESENT)) ) ) )
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->qmfModeCurr = MODE_HQ;
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->qmfModeCurr = MODE_LP;
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Set SBR to current QMF mode. Error does not matter. */
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sbrDecoder_SetParam(self->hSbrDecoder, SBR_QMF_MODE, (self->qmfModeCurr == MODE_LP));
1992ddc922da87bb675b8ab8c305566436e806df0d9Jean-Michel Trivi  self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->streamInfo.aacNumChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ;
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_ASSERT( ! ( (self->flags & AC_MPS_PRESENT) && self->psPossible ) );
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid CAacDecoder_SignalInterruption(HANDLE_AACDECODER self)
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Reset ancillary data struct. Call before parsing a new frame.
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \ancData Pointer to ancillary data structure
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  Error code
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_DECODER_ERROR CAacDecoder_AncDataReset(CAncData *ancData)
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i;
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<8; i++)
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ancData->offset[i] = 0;
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  ancData->nrElements = 0;
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_DEC_OK;
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Initialize ancillary buffer
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \ancData Pointer to ancillary data structure
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \buffer Pointer to (external) anc data buffer
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \size Size of the buffer pointed on by buffer in bytes
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  Error code
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData, unsigned char *buffer, int size)
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (size >= 0) {
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ancData->buffer = buffer;
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ancData->bufferSize = size;
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CAacDecoder_AncDataReset(ancData);
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_OK;
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_DEC_ANC_DATA_ERROR;
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Get one ancillary data element
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \ancData Pointer to ancillary data structure
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \index Index of the anc data element to get
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \ptr Pointer to a buffer receiving a pointer to the requested anc data element
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \size Pointer to a buffer receiving the length of the requested anc data element in bytes
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  Error code
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index, unsigned char **ptr, int *size)
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR error = AAC_DEC_OK;
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *ptr  = NULL;
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *size = 0;
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (index >= 0 && index < 8 && index < ancData->nrElements)
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *ptr  = &ancData->buffer[ancData->offset[index]];
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *size = ancData->offset[index+1] - ancData->offset[index];
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return error;
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Parse ancillary data
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \ancData Pointer to ancillary data structure
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \hBs Handle to FDK bitstream
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \ancBytes Length of ancillary data to read from the bitstream
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  Error code
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_DECODER_ERROR CAacDecoder_AncDataParse (
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             CAncData *ancData,
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             HANDLE_FDK_BITSTREAM hBs,
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             const int ancBytes )
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR error = AAC_DEC_OK;
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int readBytes = 0;
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ancData->buffer != NULL)
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (ancBytes > 0) {
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* write ancillary data to external buffer */
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int offset = ancData->offset[ancData->nrElements];
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ((offset + ancBytes) > ancData->bufferSize)
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error = AAC_DEC_TOO_SMALL_ANC_BUFFER;
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else if (ancData->nrElements >= 8-1)
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error = AAC_DEC_TOO_MANY_ANC_ELEMENTS;
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int i;
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i = 0; i < ancBytes; i++) {
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ancData->buffer[i+offset] = FDKreadBits(hBs, 8);
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          readBytes++;
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ancData->nrElements++;
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ancData->offset[ancData->nrElements] = ancBytes + ancData->offset[ancData->nrElements-1];
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  readBytes = ancBytes - readBytes;
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (readBytes > 0) {
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* skip data */
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKpushFor(hBs, readBytes<<3);
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return error;
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Read Stream Data Element
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \bs Bitstream Handle
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  Error code
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_DECODER_ERROR CDataStreamElement_Read (
34147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi                                                  HANDLE_AACDECODER    self,
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                  HANDLE_FDK_BITSTREAM bs,
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                  UCHAR    *elementInstanceTag,
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                  UINT      alignmentAnchor )
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
34647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  HANDLE_TRANSPORTDEC  pTp;
34747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  CAncData *ancData;
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR error = AAC_DEC_OK;
34947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  UINT dataStart, dseBits;
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int dataByteAlignFlag, count;
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
35247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  FDK_ASSERT(self != NULL);
35347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi
35447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  ancData = &self->ancData;
35547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  pTp = self->hInput;
35647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int crcReg = transportDec_CrcStartReg(pTp, 0);
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Element Instance Tag */
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *elementInstanceTag = FDKreadBits(bs,4);
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Data Byte Align Flag */
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  dataByteAlignFlag = FDKreadBits(bs,1);
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  count = FDKreadBits(bs,8);
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (count == 255) {
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    count += FDKreadBits(bs,8); /* EscCount */
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
36947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  dseBits = count*8;
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (dataByteAlignFlag) {
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKbyteAlign(bs, alignmentAnchor);
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  dataStart = FDKgetValidBits(bs);
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  error = CAacDecoder_AncDataParse(ancData, bs, count);
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transportDec_CrcEndReg(pTp, crcReg);
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Move to the beginning of the data junk */
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKpushBack(bs, dataStart-FDKgetValidBits(bs));
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Read Anc data if available */
38547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    aacDecoder_drcMarkPayload( self->hDrcInfo, bs, DVB_DRC_ANC_DATA );
38647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  }
38747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi
38847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  {
38947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    PCMDMX_ERROR dmxErr = PCMDMX_OK;
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
39147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    /* Move to the beginning of the data junk */
39247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    FDKpushBack(bs, dataStart-FDKgetValidBits(bs));
39347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi
39447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    /* Read DMX meta-data */
39547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    dmxErr = pcmDmx_Parse (
39647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi                     self->hPcmUtils,
39747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi                     bs,
39847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi                     dseBits,
39947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi                     0 /* not mpeg2 */ );
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
40147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi
40247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  /* Move to the very end of the element. */
40347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  FDKpushBiDirectional(bs, FDKgetValidBits(bs)-dataStart+dseBits);
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return error;
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef TP_PCE_ENABLE
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Read Program Config Element
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \bs Bitstream Handle
4135016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  \pTp Transport decoder handle for CRC handling
4145016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  \pce Pointer to PCE buffer
4155016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  \channelConfig Current channel configuration
4165016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  \alignAnchor Anchor for byte alignment
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4185016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  \return  PCE status (-1: fail, 0: no new PCE, 1: PCE updated, 2: PCE updated need re-config).
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
4205016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivistatic int CProgramConfigElement_Read (
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_FDK_BITSTREAM bs,
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_TRANSPORTDEC  pTp,
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CProgramConfig      *pce,
4245016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi    const UINT           channelConfig,
4255016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi    const UINT           alignAnchor )
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4275016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  int pceStatus = 0;
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int crcReg;
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* read PCE to temporal buffer first */
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
4325016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CProgramConfig_Init(tmpPce);
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CProgramConfig_Reset(tmpPce);
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  crcReg = transportDec_CrcStartReg(pTp, 0);
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CProgramConfig_Read(tmpPce, bs, alignAnchor);
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transportDec_CrcEndReg(pTp, crcReg);
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (  CProgramConfig_IsValid(tmpPce)
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    && (tmpPce->Profile == 1) )
4445016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  {
4455016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi    if ( !pce->isValid && (channelConfig > 0) ) {
4465016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      /* Create a standard channel config PCE to compare with */
4475016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      CProgramConfig_GetDefault( pce, channelConfig );
4485016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi    }
4495016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi
4505016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi    if (pce->isValid) {
4515016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      /* Compare the new and the old PCE (tags ignored) */
4525016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      switch ( CProgramConfig_Compare( pce, tmpPce ) )
4535016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      {
4545016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      case 1:  /* Channel configuration not changed. Just new metadata. */
4555016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig));    /* Store the complete PCE */
4565016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        pceStatus = 1;                                     /* New PCE but no change of config */
4575016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        break;
4585016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      case 2:  /* The number of channels are identical but not the config */
4595016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        if (channelConfig == 0) {
4605016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi          FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig));  /* Store the complete PCE */
4615016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi          pceStatus = 2;                                   /* Decoder needs re-configuration */
4625016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        }
4635016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        break;
4645016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      case -1:  /* The channel configuration is completely different */
4655016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        pceStatus = -1;  /* Not supported! */
4665016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        break;
4675016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      case 0:  /* Nothing to do because PCE matches the old one exactly. */
4685016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      default:
4695016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        /* pceStatus = 0; */
4705016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        break;
4715016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      }
4725016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi    }
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4775016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  return pceStatus;
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4795016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi#endif /* TP_PCE_ENABLE */
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Parse Extension Payload
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \self Handle of AAC decoder
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \count Pointer to bit counter.
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \previous_element ID of previous element (required by some extension payloads)
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  Error code
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_DECODER_ERROR CAacDecoder_ExtPayloadParse (HANDLE_AACDECODER self,
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               HANDLE_FDK_BITSTREAM hBs,
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               int *count,
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               MP4_ELEMENT_ID previous_element,
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               int elIndex,
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                               int fIsFillElement)
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR error = AAC_DEC_OK;
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  EXT_PAYLOAD_TYPE extension_type;
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int bytes = (*count) >> 3;
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int crcFlag = 0;
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (*count < 4) {
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_PARSE_ERROR;
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else if ((INT)FDKgetValidBits(hBs) < *count) {
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_DECODE_FRAME_ERROR;
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  extension_type = (EXT_PAYLOAD_TYPE) FDKreadBits(hBs, 4);    /* bs_extension_type */
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *count -= 4;
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (extension_type)
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case EXT_DYNAMIC_RANGE:
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT readBits = aacDecoder_drcMarkPayload( self->hDrcInfo, hBs, MPEG_DRC_EXT_DATA );
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (readBits > *count)
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      { /* Read too much. Something went wrong! */
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error = AAC_DEC_PARSE_ERROR;
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *count -= readBits;
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case EXT_SBR_DATA_CRC:
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    crcFlag = 1;
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case EXT_SBR_DATA:
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (IS_CHANNEL_ELEMENT(previous_element)) {
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      SBR_ERROR sbrError;
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      CAacDecoder_SyncQmfMode(self);
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      sbrError = sbrDecoder_InitElement(
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->hSbrDecoder,
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->streamInfo.aacSampleRate,
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->streamInfo.extSamplingRate,
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->streamInfo.aacSamplesPerFrame,
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->streamInfo.aot,
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              previous_element,
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              elIndex
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              );
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (sbrError == SBRDEC_OK) {
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        sbrError = sbrDecoder_Parse (
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                self->hSbrDecoder,
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                hBs,
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                count,
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               *count,
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                crcFlag,
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                previous_element,
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                elIndex,
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                self->flags & AC_INDEP );
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Enable SBR for implicit SBR signalling. */
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (sbrError == SBRDEC_OK) {
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->sbrEnabled = 1;
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Do not try to apply SBR because initializing the element failed. */
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->sbrEnabled = 0;
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Citation from ISO/IEC 14496-3 chapter 4.5.2.1.5.2
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      Fill elements containing an extension_payload() with an extension_type of EXT_SBR_DATA
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      or EXT_SBR_DATA_CRC shall not contain any other extension_payload of any other extension_type.
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      */
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (fIsFillElement) {
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKpushBiDirectional(hBs, *count);
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *count = 0;
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* If this is not a fill element with a known length, we are screwed an no further parsing makes sense. */
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (sbrError != SBRDEC_OK) {
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->frameOK = 0;
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      error = AAC_DEC_PARSE_ERROR;
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case EXT_FILL_DATA:
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int temp;
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      temp = FDKreadBits(hBs,4);
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bytes--;
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (temp != 0) {
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error = AAC_DEC_PARSE_ERROR;
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      while (bytes > 0) {
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        temp = FDKreadBits(hBs,8);
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        bytes--;
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (temp != 0xa5) {
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          error = AAC_DEC_PARSE_ERROR;
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *count = bytes<<3;
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case EXT_DATA_ELEMENT:
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int dataElementVersion;
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      dataElementVersion = FDKreadBits(hBs,4);
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *count -= 4;
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (dataElementVersion == 0) /* ANC_DATA */
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int temp, dataElementLength = 0;
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        do {
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          temp = FDKreadBits(hBs,8);
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          *count -= 8;
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          dataElementLength += temp;
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } while (temp == 255 );
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CAacDecoder_AncDataParse(&self->ancData, hBs, dataElementLength);
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *count -= (dataElementLength<<3);
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* align = 0 */
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error = AAC_DEC_PARSE_ERROR;
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case EXT_DATA_LENGTH:
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( !fIsFillElement          /* Makes no sens to have an additional length in a fill ...   */
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      && (self->flags & AC_ER) )  /* ... element because this extension payload type was ...    */
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {                             /* ... created to circumvent the missing length in ER-Syntax. */
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int bitCnt, len = FDKreadBits(hBs, 4);
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *count -= 4;
6345016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (len == 15) {
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int add_len = FDKreadBits(hBs, 8);
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *count -= 8;
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        len += add_len;
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (add_len == 255) {
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          len += FDKreadBits(hBs, 16);
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          *count -= 16;
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      len <<= 3;
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bitCnt = len;
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (EXT_PAYLOAD_TYPE)FDKreadBits(hBs, 4) == EXT_DATA_LENGTH ) {
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Check NOTE 2: The extension_payload() included here must
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         not have extension_type == EXT_DATA_LENGTH. */
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error = AAC_DEC_PARSE_ERROR;
6525016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      } else {
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* rewind and call myself again. */
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKpushBack(hBs, 4);
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        error =
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          CAacDecoder_ExtPayloadParse (
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self,
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  hBs,
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 &bitCnt,
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  previous_element,
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  elIndex,
6635016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi                  0 );
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *count -= len - bitCnt;
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Note: the fall through in case the if statement above is not taken is intentional. */
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case EXT_FIL:
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* align = 4 */
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKpushFor(hBs, *count);
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *count = 0;
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (error != AAC_DEC_OK)
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    && fIsFillElement )
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  { /* Skip the remaining extension bytes */
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKpushBiDirectional(hBs, *count);
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *count = 0;
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Patch error code because decoding can go on. */
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    error = AAC_DEC_OK;
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Be sure that parsing errors have been stored. */
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return error;
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*  Stream Configuration and Information.
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    This class holds configuration and information data for a stream to be decoded. It
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    provides the calling application as well as the decoder with substantial information,
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    e.g. profile, sampling rate, number of channels found in the bitstream etc.
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid CStreamInfoInit(CStreamInfo *pStreamInfo)
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->aacSampleRate = 0;
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->profile = -1;
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->aot = AOT_NONE;
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->channelConfig = -1;
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->bitRate = 0;
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->aacSamplesPerFrame = 0;
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->extAot  = AOT_NONE;
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->extSamplingRate = 0;
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->flags = 0;
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->epConfig = -1;   /* default is no ER */
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->numChannels = 0;
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->sampleRate = 0;
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pStreamInfo->frameSize = 0;
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Initialization of AacDecoderChannelInfo
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The function initializes the pointers to AacDecoderChannelInfo for each channel,
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  set the start values for window shape and window sequence of overlap&add to zero,
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  set the overlap buffer to zero and initializes the pointers to the window coefficients.
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \param bsFormat is the format of the AAC bitstream
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  AACDECODER instance
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat)    /*!< bitstream format (adif,adts,loas,...). */
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_AACDECODER self;
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self = GetAacDecoder();
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self == NULL) {
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Assign channel mapping info arrays (doing so removes dependency of settings header in API header). */
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->streamInfo.pChannelIndices = self->channelIndices;
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->streamInfo.pChannelType = self->channelType;
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* set default output mode */
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->outputInterleaved = 1;  /* interleaved */
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* initialize anc data */
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CAacDecoder_AncDataInit(&self->ancData, NULL, 0);
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* initialize stream info */
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CStreamInfoInit(&self->streamInfo);
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* initialize error concealment common data */
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CConcealment_InitCommonData(&self->concealCommonData);
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->hDrcInfo = GetDrcInfo();
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->hDrcInfo == NULL) {
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Init common DRC structure */
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aacDecoder_drcInit( self->hDrcInfo );
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Set default frame delay */
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aacDecoder_drcSetParam (
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->hDrcInfo,
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          DRC_BS_DELAY,
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          CConcealment_GetDelay(&self->concealCommonData)
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->aacCommonData.workBufferCore1 = GetWorkBufferCore1();
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->aacCommonData.workBufferCore2 = GetWorkBufferCore2();
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->aacCommonData.workBufferCore1 == NULL
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ||self->aacCommonData.workBufferCore2 == NULL )
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    goto bail;
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return self;
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CAacDecoder_Close( self );
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return NULL;
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Destroy aac decoder */
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP void CAacDecoder_Close(HANDLE_AACDECODER self)
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int ch;
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self == NULL)
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return;
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
79347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  for (ch=0; ch<(8); ch++) {
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self->pAacDecoderStaticChannelInfo[ch] != NULL) {
7955016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer != NULL) {
7965016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        FreeOverlapBuffer (&self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer);
7975016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      }
7985016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      if (self->pAacDecoderStaticChannelInfo[ch] != NULL) {
7995016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        FreeAacDecoderStaticChannelInfo (&self->pAacDecoderStaticChannelInfo[ch]);
8005016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi      }
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self->pAacDecoderChannelInfo[ch] != NULL) {
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FreeAacDecoderChannelInfo (&self->pAacDecoderChannelInfo[ch]);
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->aacChannels = 0;
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->hDrcInfo) {
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FreeDrcInfo(&self->hDrcInfo);
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8135016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  if (self->aacCommonData.workBufferCore1 != NULL) {
8145016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi    FreeWorkBufferCore1 (&self->aacCommonData.workBufferCore1);
8155016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  }
8165016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  if (self->aacCommonData.workBufferCore2 != NULL) {
8175016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi    FreeWorkBufferCore2 (&self->aacCommonData.workBufferCore2);
8185016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi  }
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FreeAacDecoder ( &self);
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Initialization of decoder instance
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The function initializes the decoder.
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return  error status: 0 for success, <>0 for unsupported configurations
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc)
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR err = AAC_DEC_OK;
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT ascChannels, ch, ascChanged = 0;
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!self)
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_INVALID_HANDLE;
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  // set profile and check for supported aot
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  // leave profile on default (=-1) for all other supported MPEG-4 aot's except aot=2 (=AAC-LC)
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (asc->m_aot) {
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AOT_AAC_LC:
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->streamInfo.profile = 1;
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AOT_SBR:
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AOT_PS:
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AOT_ER_AAC_LD:
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case AOT_ER_AAC_ELD:
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_UNSUPPORTED_AOT;
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CProgramConfig_Init(&self->pce);
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* set channels */
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (asc->m_channelConfiguration) {
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 0:
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef TP_PCE_ENABLE
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* get channels from program config (ASC) */
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) {
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ascChannels = asc->m_progrConfigElement.NumChannels;
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (ascChannels > 0) {
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int el;
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* valid number of channels -> copy program config element (PCE) from ASC */
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemcpy(&self->pce, &asc->m_progrConfigElement, sizeof(CProgramConfig));
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Built element table */
87047c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi        el = CProgramConfig_GetElementTable(&asc->m_progrConfigElement, self->elements, (8), &self->chMapIndex);
87147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi        for (; el<(8); el++) {
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->elements[el] = ID_NONE;
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
87847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi      self->chMapIndex = 0;
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (transportDec_GetFormat(self->hInput) == TT_MP4_ADTS) {
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* set default max_channels for memory allocation because in implicit channel mapping mode
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           we don't know the actual number of channels until we processed at least one raw_data_block(). */
88247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi        ascChannels = (8);
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else /* TP_PCE_ENABLE */
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif /* TP_PCE_ENABLE */
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case 1: case 2: case 3: case 4: case 5: case 6:
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ascChannels = asc->m_channelConfiguration;
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
89447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  case 11:
89547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    ascChannels = 7;
89647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    break;
89747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  case 7: case 12: case 14:
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ascChannels = 8;
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
90447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  if (ascChannels > (8)) {
90547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
90647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  }
90747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Initialize constant mappings for channel config 1-7 */
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (asc->m_channelConfiguration > 0) {
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int el;
91147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    FDKmemcpy(self->elements, elementsTab[asc->m_channelConfiguration-1], sizeof(MP4_ELEMENT_ID)*FDKmin(7,(8)));
91247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    for (el=7; el<(8); el++) {
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->elements[el] = ID_NONE;
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch=0; ch<ascChannels; ch++) {
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->chMapping[ch] = ch;
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
91847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    for (; ch<(8); ch++) {
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->chMapping[ch] = 255;
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
92147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    self->chMapIndex = asc->m_channelConfiguration;
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9236ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi #ifdef TP_PCE_ENABLE
9246ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi  else {
9256ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi    if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) {
9266ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi      /* Set matrix mixdown infos if available from PCE. */
9276ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi      pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils,
9286ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi                                       asc->m_progrConfigElement.MatrixMixdownIndexPresent,
9296ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi                                       asc->m_progrConfigElement.MatrixMixdownIndex,
9306ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi                                       asc->m_progrConfigElement.PseudoSurroundEnable );
9316ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi    }
9326ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi  }
9336ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi #endif
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->streamInfo.channelConfig = asc->m_channelConfiguration;
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->streamInfo.aot != asc->m_aot) {
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->streamInfo.aot = asc->m_aot;
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ascChanged = 1;
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->streamInfo.aacSamplesPerFrame != (INT)asc->m_samplesPerFrame) {
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->streamInfo.aacSamplesPerFrame = asc->m_samplesPerFrame;
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ascChanged = 1;
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->streamInfo.bitRate            = 0;
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Set syntax flags */
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->flags = 0;
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->streamInfo.extAot               = asc->m_extensionAudioObjectType;
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->streamInfo.extSamplingRate      = asc->m_extensionSamplingFrequency;
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->flags |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0;
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->flags |= (asc->m_psPresentFlag) ? AC_PS_PRESENT : 0;
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->sbrEnabled = 0;
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* --------- vcb11 ------------ */
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->flags |= (asc->m_vcb11Flag) ? AC_ER_VCB11 : 0;
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ---------- rvlc ------------ */
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->flags |= (asc->m_rvlcFlag) ? AC_ER_RVLC : 0;
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ----------- hcr ------------ */
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->flags |= (asc->m_hcrFlag) ? AC_ER_HCR : 0;
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (asc->m_aot == AOT_ER_AAC_ELD) {
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->flags |=  AC_ELD;
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->flags |= (asc->m_sc.m_eldSpecificConfig.m_sbrCrcFlag) ? AC_SBRCRC : 0;
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->flags |= (asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) ? AC_LD_MPS : 0;
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->flags |= (asc->m_aot == AOT_ER_AAC_LD) ? AC_LD : 0;
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->flags |= (asc->m_epConfig >= 0) ? AC_ER : 0;
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (asc->m_sbrPresentFlag) {
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->sbrEnabled = 1;
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->sbrEnabledPrev = 1;
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (asc->m_psPresentFlag) {
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->flags |= AC_PS_PRESENT;
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (asc->m_epConfig >= 0)
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    && (asc->m_channelConfiguration <= 0) ) {
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* we have to know the number of channels otherwise no decoding is possible */
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_UNSUPPORTED_ER_FORMAT;
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->streamInfo.epConfig = asc->m_epConfig;
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* self->hInput->asc.m_epConfig = asc->m_epConfig; */
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (asc->m_epConfig > 1)
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return AAC_DEC_UNSUPPORTED_ER_FORMAT;
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Check if samplerate changed. */
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->streamInfo.aacSampleRate != (INT)asc->m_samplingFrequency) {
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AAC_DECODER_ERROR error;
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ascChanged = 1;
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Update samplerate info. */
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    error = getSamplingRateInfo(&self->samplingRateInfo, asc->m_samplesPerFrame, asc->m_samplingFrequencyIndex, asc->m_samplingFrequency);
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (error != AAC_DEC_OK) {
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return error;
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->streamInfo.aacSampleRate = self->samplingRateInfo.samplingRate;
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Check if amount of channels has changed. */
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (self->ascChannels != ascChannels)
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     ascChanged = 1;
10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     /* Allocate all memory structures for each channel */
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     {
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       for (ch = 0; ch < ascChannels; ch++) {
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         CAacDecoderDynamicData *aacDecoderDynamicData = &self->aacCommonData.workBufferCore1->pAacDecoderDynamicData[ch%2];
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* initialize pointer to CAacDecoderChannelInfo */
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         if (self->pAacDecoderChannelInfo[ch] == NULL) {
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->pAacDecoderChannelInfo[ch] = GetAacDecoderChannelInfo(ch);
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           /* This is temporary until the DynamicData is split into two or more regions!
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              The memory could be reused after completed core decoding. */
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           if (self->pAacDecoderChannelInfo[ch] == NULL) {
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             goto bail;
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           }
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           /* Hook shared work memory into channel data structure */
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->pAacDecoderChannelInfo[ch]->pDynData =  aacDecoderDynamicData;
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->pAacDecoderChannelInfo[ch]->pComData = &self->aacCommonData;
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         }
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         /* Allocate persistent channel memory */
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         if (self->pAacDecoderStaticChannelInfo[ch] == NULL) {
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->pAacDecoderStaticChannelInfo[ch] = GetAacDecoderStaticChannelInfo(ch);
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           if (self->pAacDecoderStaticChannelInfo[ch] == NULL) {
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             goto bail;
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           }
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer = GetOverlapBuffer(ch); /* This area size depends on the AOT */
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer == NULL) {
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             goto bail;
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           }
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->pAacDecoderChannelInfo[ch]->pSpectralCoefficient = (SPECTRAL_PTR) &self->aacCommonData.workBufferCore2[ch*1024];
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         }
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         CPns_InitPns(&self->pAacDecoderChannelInfo[ch]->data.aac.PnsData, &self->aacCommonData.pnsInterChannelData, &self->aacCommonData.pnsCurrentSeed, self->aacCommonData.pnsRandomSeed);
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10495016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi       if (ascChannels > self->aacChannels)
10505016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi       {
10515016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi         /* Make allocated channel count persistent in decoder context. */
10525016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi         self->aacChannels = ascChannels;
10535016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi       }
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       HcrInitRom(&self->aacCommonData.overlay.aac.erHcrInfo);
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, ID_SCE);
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Make amount of signalled channels persistent in decoder context. */
10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->ascChannels = ascChannels;
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Update structures */
10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (ascChanged) {
10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10665016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi     /* Things to be done for each channel, which do not involve allocating memory.
10675016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        Doing these things only on the channels needed for the current configuration
10685016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        (ascChannels) could lead to memory access violation later (error concealment). */
10695016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi     for (ch = 0; ch < self->aacChannels; ch++) {
10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       switch (self->streamInfo.aot) {
10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         case AOT_ER_AAC_ELD:
10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         case AOT_ER_AAC_LD:
10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame;
10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           break;
10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         default:
10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame / 8;
10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           break;
10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       }
10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       mdct_init( &self->pAacDecoderStaticChannelInfo[ch]->IMdct,
10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer,
10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   OverlapBufferSize );
10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Reset DRC control data for this channel */
10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[ch]->drcData );
10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       /* Reset concealment only if ASC changed. Otherwise it will be done with any config callback.
10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          E.g. every time the LATM SMC is present. */
10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project       CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo,
10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    &self->concealCommonData,
10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     self->streamInfo.aacSamplesPerFrame );
10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Update externally visible copy of flags */
10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->streamInfo.flags = self->flags;
10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return err;
10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  aacDecoder_Close( self );
11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return AAC_DEC_OUT_OF_MEMORY;
11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_AACDECODER self,
11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT flags,
11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT_PCM *pTimeData,
11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT  timeDataSize,
11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT interleaved
11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CProgramConfig *pce;
11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_FDK_BITSTREAM bs = transportDec_GetBitstream(self->hInput, 0);
11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  MP4_ELEMENT_ID type = ID_NONE;            /* Current element type */
11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT aacChannels=0;                        /* Channel counter for channels found in the bitstream */
112147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  int chOutMapIdx;                          /* Output channel mapping index (see comment below) */
11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT auStartAnchor = (INT)FDKgetValidBits(bs);  /* AU start bit buffer position for AU byte alignment */
11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->frameOK = 1;
11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Any supported base layer valid AU will require more than 16 bits. */
11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (transportDec_GetAuBitsRemaining(self->hInput, 0) < 15) && (flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) == 0) {
11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->frameOK = 0;
11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Reset Program Config structure */
11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pce = &self->pce;
11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CProgramConfig_Reset(pce);
11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CAacDecoder_AncDataReset(&self->ancData);
11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch;
11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self->streamInfo.channelConfig == 0) {
11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Init Channel/Element mapping table */
114547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi      for (ch=0; ch<(8); ch++) {
11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->chMapping[ch] = 255;
11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (!CProgramConfig_IsValid(pce)) {
11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int el;
115047c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi        for (el=0; el<(8); el++) {
11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->elements[el] = ID_NONE;
11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Check sampling frequency  */
11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch ( self->streamInfo.aacSampleRate ) {
11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 16000:
11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 12000:
11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   case 11025:
11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   case  8000:
11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case  7350:
11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 48000:
11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 44100:
11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 32000:
11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 24000:
11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case 22050:
11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( ! (self->flags & (AC_USAC|AC_RSVD50)) ) {
11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return AAC_DEC_UNSUPPORTED_SAMPLINGRATE;
11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( flags & AACDEC_CLRHIST )
11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int ch;
11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Clear history */
11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (ch = 0; ch < self->aacChannels; ch++) {
11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Reset concealment */
11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo,
11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   &self->concealCommonData,
11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    self->streamInfo.aacSamplesPerFrame );
11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Clear concealment buffers to get rid of the complete history */
11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo.spectralCoefficient, 1024 * sizeof(FIXP_CNCL));
11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo.specScale, 8 * sizeof(SHORT));
11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Clear overlap-add buffers to avoid clicks. */
11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->IMdct.overlap.freq, OverlapBufferSize*sizeof(FIXP_DBL));
11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef TP_PCE_ENABLE
11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int pceRead = 0;                          /* Flag indicating a PCE in the current raw_data_block() */
11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT hdaacDecoded = 0;
12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  MP4_ELEMENT_ID previous_element = ID_END; /* Last element ID (required for extension payload mapping */
12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR previous_element_index = 0;         /* Canonical index of last element */
12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int element_count = 0;                    /* Element counter for elements found in the bitstream */
12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int el_cnt[ID_LAST] = { 0 };              /* element counter ( robustness ) */
12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  while ( (type != ID_END) && (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH))) && self->frameOK )
12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int el_channels;
12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (! (self->flags & (AC_USAC|AC_RSVD50|AC_ELD|AC_SCALABLE|AC_ER)))
12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      type = (MP4_ELEMENT_ID) FDKreadBits(bs,3);
12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      type = self->elements[element_count];
12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, type);
12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((INT)FDKgetValidBits(bs) < 0)
12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->frameOK = 0;
12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (type)
12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case ID_SCE:
12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case ID_CPE:
12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case ID_LFE:
12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*
12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          Consistency check
12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        */
12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (type == ID_CPE) {
12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          el_channels = 2;
12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } else {
12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          el_channels = 1;
12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( (el_cnt[type] >= (self->ascChannels>>(el_channels-1))) || (aacChannels > (self->ascChannels-el_channels)) ) {
12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->frameOK = 0;
12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( !(self->flags & (AC_USAC|AC_RSVD50)) ) {
12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          int ch;
12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (ch=0; ch < el_channels; ch+=1) {
12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            CPns_ResetData(&self->pAacDecoderChannelInfo[aacChannels+ch]->data.aac.PnsData,
12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &self->pAacDecoderChannelInfo[aacChannels+ch]->pComData->pnsInterChannelData);
12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if(self->frameOK) {
12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ErrorStatus = CChannelElement_Read( bs,
12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             &self->pAacDecoderChannelInfo[aacChannels],
12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             &self->pAacDecoderStaticChannelInfo[aacChannels],
12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->streamInfo.aot,
12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             &self->samplingRateInfo,
12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->flags,
12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->streamInfo.aacSamplesPerFrame,
12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              el_channels,
12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->streamInfo.epConfig,
12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->hInput
12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              );
12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (ErrorStatus) {
12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->frameOK = 0;
12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( self->frameOK) {
12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Lookup the element and decode it only if it belongs to the current program */
12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ( CProgramConfig_LookupElement(
12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  pce,
12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->streamInfo.channelConfig,
12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->pAacDecoderChannelInfo[aacChannels]->ElementInstanceTag,
12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  aacChannels,
12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->chMapping,
12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->channelType,
12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->channelIndices,
12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 &previous_element_index,
12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->elements,
12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  type) )
12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if ( !hdaacDecoded ) {
12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              CChannelElement_Decode(
12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     &self->pAacDecoderChannelInfo[aacChannels],
12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     &self->pAacDecoderStaticChannelInfo[aacChannels],
12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                     &self->samplingRateInfo,
12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      self->flags,
12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      el_channels
12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      );
12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            aacChannels += 1;
12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (type == ID_CPE) {
12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              aacChannels += 1;
12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          else {
12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->frameOK = 0;
13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
13015016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi          /* Create SBR element for SBR for upsampling for LFE elements,
13025016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi             and if SBR was explicitly signaled, because the first frame(s)
13035016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi             may not contain SBR payload (broken encoder, bit errors). */
13045016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi          if ( (self->flags & AC_SBR_PRESENT) || (self->sbrEnabled == 1) )
13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            SBR_ERROR sbrError;
13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sbrError = sbrDecoder_InitElement(
13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->hSbrDecoder,
13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->streamInfo.aacSampleRate,
13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->streamInfo.extSamplingRate,
13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->streamInfo.aacSamplesPerFrame,
13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->streamInfo.aot,
13145016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi                    type,
13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    previous_element_index
13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    );
13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (sbrError != SBRDEC_OK) {
13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* Do not try to apply SBR because initializing the element failed. */
13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->sbrEnabled = 0;
13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        el_cnt[type]++;
13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case ID_CCE:
13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /*
13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          Consistency check
13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        */
13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( el_cnt[type] > self->ascChannels ) {
13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          self->frameOK = 0;
13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (self->frameOK)
13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* memory for spectral lines temporal on scratch */
13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          C_ALLOC_SCRATCH_START(mdctSpec, FIXP_DBL, 1024);
13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* create dummy channel for CCE parsing on stack */
13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          CAacDecoderChannelInfo  tmpAacDecoderChannelInfo, *pTmpAacDecoderChannelInfo;
13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          FDKmemclear(mdctSpec, 1024*sizeof(FIXP_DBL));
13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          tmpAacDecoderChannelInfo.pDynData =   self->aacCommonData.workBufferCore1->pAacDecoderDynamicData;
13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          tmpAacDecoderChannelInfo.pComData =  &self->aacCommonData;
13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          tmpAacDecoderChannelInfo.pSpectralCoefficient  = (SPECTRAL_PTR)mdctSpec;
13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Assume AAC-LC */
13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          tmpAacDecoderChannelInfo.granuleLength = self->streamInfo.aacSamplesPerFrame / 8;
13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Reset PNS data. */
13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          CPns_ResetData(&tmpAacDecoderChannelInfo.data.aac.PnsData, &tmpAacDecoderChannelInfo.pComData->pnsInterChannelData);
13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pTmpAacDecoderChannelInfo = &tmpAacDecoderChannelInfo;
13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* do CCE parsing */
13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ErrorStatus = CChannelElement_Read( bs,
13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             &pTmpAacDecoderChannelInfo,
13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              NULL,
13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->streamInfo.aot,
13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             &self->samplingRateInfo,
13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->flags,
13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->streamInfo.aacSamplesPerFrame,
13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              1,
13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->streamInfo.epConfig,
13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                              self->hInput
13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             );
13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          C_ALLOC_SCRATCH_END(mdctSpec, FIXP_DBL, 1024);
13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (ErrorStatus) {
13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->frameOK = 0;
13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (self->frameOK) {
13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* Lookup the element and decode it only if it belongs to the current program */
13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (CProgramConfig_LookupElement(
13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    pce,
13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->streamInfo.channelConfig,
13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    pTmpAacDecoderChannelInfo->ElementInstanceTag,
13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    0,
13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->chMapping,
13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->channelType,
13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->channelIndices,
13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   &previous_element_index,
13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->elements,
13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    type) )
13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              /* decoding of CCE not supported */
13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else {
13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->frameOK = 0;
13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        el_cnt[type]++;
13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case ID_DSE:
14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          UCHAR element_instance_tag;
14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
140447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi          CDataStreamElement_Read( self,
140547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi                                   bs,
14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  &element_instance_tag,
14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   auStartAnchor );
14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (!CProgramConfig_LookupElement(
14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   pce,
14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   self->streamInfo.channelConfig,
14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   element_instance_tag,
14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   0,
14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   self->chMapping,
14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   self->channelType,
14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   self->channelIndices,
14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  &previous_element_index,
14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   self->elements,
14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   type) )
14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            /* most likely an error in bitstream occured */
14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            //self->frameOK = 0;
14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef TP_PCE_ENABLE
14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case ID_PCE:
14295016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi        {
14305016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi          int result = CProgramConfigElement_Read(
14315016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi                                    bs,
14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    self->hInput,
14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    pce,
14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    self->streamInfo.channelConfig,
14355016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi                                    auStartAnchor );
14365016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi          if ( result < 0 ) {
14375016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            /* Something went wrong */
14385016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            ErrorStatus = AAC_DEC_PARSE_ERROR;
14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->frameOK = 0;
14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
14415016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi          else if ( result > 1 ) {
14425016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            /* Built element table */
144347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi            int elIdx = CProgramConfig_GetElementTable(pce, self->elements, (8), &self->chMapIndex);
14445016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            /* Reset the remaining tabs */
144547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi            for ( ; elIdx<(8); elIdx++) {
14465016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi              self->elements[elIdx] = ID_NONE;
14475016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            }
14485016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            /* Make new number of channel persistant */
14495016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            self->ascChannels = pce->NumChannels;
14505016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            /* If PCE is not first element conceal this frame to avoid inconsistencies */
14515016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            if ( element_count != 0 ) {
14525016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi              self->frameOK = 0;
14535016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi            }
14545016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi          }
14555016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi          pceRead = (result>=0) ? 1 : 0;
14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif /* TP_PCE_ENABLE */
14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case ID_FIL:
14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          int bitCnt = FDKreadBits(bs,4);           /* bs_count */
14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (bitCnt == 15)
14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            int esc_count = FDKreadBits(bs,8);     /* bs_esc_count */
14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            bitCnt =  esc_count + 14;
14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* Convert to bits */
14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitCnt <<= 3;
14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          while (bitCnt > 0) {
14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 1);
14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (ErrorStatus != AAC_DEC_OK) {
14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->frameOK = 0;
14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              break;
14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case ID_EXT:
14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          INT bitCnt = 0;
14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          /* get the remaining bits of this frame */
14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          bitCnt = transportDec_GetAuBitsRemaining(self->hInput, 0);
14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ( (bitCnt > 0) && (self->flags & AC_SBR_PRESENT) && (self->flags & (AC_USAC|AC_RSVD50|AC_ELD)) )
14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            SBR_ERROR err = SBRDEC_OK;
14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            int  elIdx, numChElements = el_cnt[ID_SCE] + el_cnt[ID_CPE];
14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for (elIdx = 0; elIdx < numChElements; elIdx += 1)
14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            {
14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              err = sbrDecoder_Parse (
14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->hSbrDecoder,
14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    bs,
15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                   &bitCnt,
15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    -1,
15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->flags & AC_SBRCRC,
15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->elements[elIdx],
15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    elIdx,
15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    self->flags & AC_INDEP );
15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (err != SBRDEC_OK) {
15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (err == SBRDEC_OK) {
15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->sbrEnabled = 1;
15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            } else {
15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->frameOK = 0;
15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ( ! (self->flags & (AC_USAC|AC_RSVD50|AC_DRM)) )
15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          {
15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            while ( bitCnt > 7 ) {
15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 0);
15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (ErrorStatus != AAC_DEC_OK) {
15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                self->frameOK = 0;
15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                ErrorStatus = AAC_DEC_PARSE_ERROR;
15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                break;
15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case ID_END:
15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
15372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
15382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->frameOK = 0;
15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    previous_element = type;
15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    element_count++;
15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }   /* while ( (type != ID_END) ... ) */
15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) )
15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Byte alignment with respect to the first bit of the raw_data_block(). */
15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKbyteAlign(bs, auStartAnchor);
15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Check if all bits of the raw_data_block() have been read. */
15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( transportDec_GetAuBitsTotal(self->hInput, 0) > 0 ) {
15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      INT unreadBits = transportDec_GetAuBitsRemaining(self->hInput, 0);
15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( unreadBits != 0 ) {
15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        self->frameOK = 0;
15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Do not overwrite current error */
15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (ErrorStatus == AAC_DEC_OK && self->frameOK == 0) {
15622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ErrorStatus = AAC_DEC_PARSE_ERROR;
15632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Always put the bitbuffer at the right position after the current Access Unit. */
15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKpushBiDirectional(bs, unreadBits);
15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Check the last element. The terminator (ID_END) has to be the last one (even if ER syntax is used). */
15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( self->frameOK && type != ID_END ) {
15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Do not overwrite current error */
15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (ErrorStatus == AAC_DEC_OK) {
15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ErrorStatus = AAC_DEC_PARSE_ERROR;
15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->frameOK = 0;
15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* More AAC channels than specified by the ASC not allowed. */
15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( (aacChannels == 0 || aacChannels > self->aacChannels) && !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) ) {
15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Do not overwrite current error */
15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (ErrorStatus == AAC_DEC_OK) {
15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->frameOK = 0;
15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacChannels = 0;
15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else if ( aacChannels > self->ascChannels ) {
15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Do not overwrite current error */
15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (ErrorStatus == AAC_DEC_OK) {
15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT;
15942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->frameOK = 0;
15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacChannels = 0;
15972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( TRANSPORTDEC_OK != transportDec_CrcCheck(self->hInput) )
16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->frameOK=0;
16022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* store or restore the number of channels */
16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( self->frameOK && !(flags &(AACDEC_CONCEAL|AACDEC_FLUSH)) ) {
16062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->concealChannels = aacChannels;  /* store */
16072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    self->sbrEnabledPrev = self->sbrEnabled;
16082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
16092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (self->aacChannels > 0) {
16102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aacChannels = self->concealChannels;  /* restore */
16112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      self->sbrEnabled = self->sbrEnabledPrev;
16122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     }
16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Update number of output channels */
16162ddc922da87bb675b8ab8c305566436e806df0d9Jean-Michel Trivi  self->streamInfo.aacNumChannels = aacChannels;
16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project #ifdef TP_PCE_ENABLE
16196ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi  if (pceRead == 1 && CProgramConfig_IsValid(pce)) {
16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Set matrix mixdown infos if available from PCE. */
16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils,
16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     pce->MatrixMixdownIndexPresent,
16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     pce->MatrixMixdownIndex,
16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     pce->PseudoSurroundEnable );
16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project #endif
16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* If there is no valid data to transfrom into time domain, return. */
16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( ! IS_OUTPUT_VALID(ErrorStatus) ) {
16302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return ErrorStatus;
16312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
16322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
163347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  /* Setup the output channel mapping. The table below shows the four possibilities:
163447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *   # | chCfg | PCE | cChCfg | chOutMapIdx
163547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *  ---+-------+-----+--------+------------------
163647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *   1 |  > 0  |  no |    -   | chCfg
163747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *   2 |   0   | yes |  > 0   | cChCfg
163847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *   3 |   0   | yes |    0   | aacChannels || 0
163947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *   4 |   0   |  no |    -   | aacChannels || 0
164047c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *  ---+-------+-----+--------+------------------
164147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *  Where chCfg is the channel configuration index from ASC and cChCfg is a corresponding chCfg
164247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *  derived from a given PCE. The variable aacChannels represents the number of channel found
164347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *  during bitstream decoding. Due to the structure of the mapping table it can only be used for
164447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *  mapping if its value is smaller than 7. Otherwise we use the fallback (0) which is a simple
164547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *  pass-through. The possibility #4 should appear only with MPEG-2 (ADTS) streams. This is
164647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   *  mode is called "implicit channel mapping".
164747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi   */
164847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi  chOutMapIdx = ((self->chMapIndex==0) && (aacChannels<7)) ? aacChannels : self->chMapIndex;
164947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi
16502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
16512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    Inverse transform
16522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
16532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
16542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int stride, offset, c;
16552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1656603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi    /* Turn on/off DRC modules level normalization in digital domain depending on the limiter status. */
1657603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi    aacDecoder_drcSetParam( self->hDrcInfo, APPLY_NORMALIZATION, (self->limiterEnableCurr) ? 0 : 1 );
16582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Extract DRC control data and map it to channels (without bitstream delay) */
16592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacDecoder_drcProlog (
16602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->hDrcInfo,
16612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            bs,
16622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->pAacDecoderStaticChannelInfo,
16632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->pce.ElementInstanceTag,
16642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->chMapping,
16652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            aacChannels
16662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          );
16672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* "c" iterates in canonical MPEG channel order */
16692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (c=0; c < aacChannels; c++)
16702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
16712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      CAacDecoderChannelInfo *pAacDecoderChannelInfo;
16722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Select correct pAacDecoderChannelInfo for current channel */
16742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (self->chMapping[c] >= aacChannels) {
16752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[c];
16762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
16772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[self->chMapping[c]];
16782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
16792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Setup offset and stride for time buffer traversal. */
16812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (interleaved) {
16822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        stride = aacChannels;
168347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi        offset = self->channelOutputMapping[chOutMapIdx][c];
16842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
16852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        stride = 1;
168647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi        offset = self->channelOutputMapping[chOutMapIdx][c] * self->streamInfo.aacSamplesPerFrame;
16872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
16882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*
16912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        Conceal defective spectral data
16922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      */
16932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      CConcealment_Apply(&self->pAacDecoderStaticChannelInfo[c]->concealmentInfo,
16942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          pAacDecoderChannelInfo,
16952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          self->pAacDecoderStaticChannelInfo[c],
16962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         &self->samplingRateInfo,
16972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          self->streamInfo.aacSamplesPerFrame,
16982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          0,
16992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          (self->frameOK && !(flags&AACDEC_CONCEAL)),
17002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          self->flags
17012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        );
17022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (flags & (AACDEC_INTR|AACDEC_CLRHIST)) {
17052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Reset DRC control data for this channel */
17062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[c]->drcData );
17072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
1708603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi      /* The DRC module demands to be called with the gain field holding the gain scale. */
1709603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi      self->extGain[0] = (FIXP_DBL)TDL_GAIN_SCALING;
17102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* DRC processing */
17112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      aacDecoder_drcApply (
17122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->hDrcInfo,
17132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->hSbrDecoder,
17142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              pAacDecoderChannelInfo,
17152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             &self->pAacDecoderStaticChannelInfo[c]->drcData,
1716603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi              self->extGain,
17172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              c,
17182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->streamInfo.aacSamplesPerFrame,
17192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              self->sbrEnabled
17202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            );
17212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      switch (pAacDecoderChannelInfo->renderMode)
17232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
17242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        case AACDEC_RENDER_IMDCT:
17252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          CBlock_FrequencyToTime(
17262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->pAacDecoderStaticChannelInfo[c],
17272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  pAacDecoderChannelInfo,
17282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  pTimeData + offset,
17292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->streamInfo.aacSamplesPerFrame,
17302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  stride,
17312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  (self->frameOK && !(flags&AACDEC_CONCEAL)),
17322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->aacCommonData.workBufferCore1->mdctOutTemp
17332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  );
1734603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi          self->extGainDelay = self->streamInfo.aacSamplesPerFrame;
17352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
17362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        case AACDEC_RENDER_ELDFB:
17372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          CBlock_FrequencyToTimeLowDelay(
17382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->pAacDecoderStaticChannelInfo[c],
17392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  pAacDecoderChannelInfo,
17402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  pTimeData + offset,
17412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  self->streamInfo.aacSamplesPerFrame,
17422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  stride
17432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                  );
1744603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi          self->extGainDelay = (self->streamInfo.aacSamplesPerFrame*2 -  self->streamInfo.aacSamplesPerFrame/2 - 1)/2;
17452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
17462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        default:
17472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ErrorStatus = AAC_DEC_UNKNOWN;
17482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          break;
17492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
17502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( flags&AACDEC_FLUSH ) {
17516ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi          FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame);
17522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemclear(self->pAacDecoderStaticChannelInfo[c]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL));
17532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
17542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
17552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Extract DRC control data and map it to channels (with bitstream delay) */
17582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    aacDecoder_drcEpilog (
17592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->hDrcInfo,
17602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            bs,
17612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->pAacDecoderStaticChannelInfo,
17622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->pce.ElementInstanceTag,
17632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            self->chMapping,
17642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            aacChannels
17652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          );
17662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
17672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Reorder channel type information tables.  */
17702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
177147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    AUDIO_CHANNEL_TYPE types[(8)];
177247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi    UCHAR idx[(8)];
17732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int c;
17742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_ASSERT(sizeof(self->channelType) == sizeof(types));
17762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_ASSERT(sizeof(self->channelIndices) == sizeof(idx));
17772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemcpy(types, self->channelType, sizeof(types));
17792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemcpy(idx, self->channelIndices, sizeof(idx));
17802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (c=0; c<aacChannels; c++) {
178247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi      self->channelType[self->channelOutputMapping[chOutMapIdx][c]] = types[c];
178347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi      self->channelIndices[self->channelOutputMapping[chOutMapIdx][c]] = idx[c];
17842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
17852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
17862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  self->blockNumber++;
17882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ErrorStatus;
17902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
17912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
17932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief returns the streaminfo pointer
17942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The function hands back a pointer to the streaminfo structure
17962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
17972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return pointer to the struct
17982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
17992228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP CStreamInfo* CAacDecoder_GetStreamInfo ( HANDLE_AACDECODER self )
18002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
18012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!self) {
18022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return NULL;
18032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
18042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return &self->streamInfo;
18052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
18062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
18092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1810