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 5e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi� Copyright 1995 - 2015 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 160203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi #include "FDK_crc.h" 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self) 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Assign user requested mode */ 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->qmfModeCurr = self->qmfModeUser; 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( self->qmfModeCurr == NOT_DEFINED ) 1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (IS_LOWDELAY(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) 1722ddc922da87bb675b8ab8c305566436e806df0d9Jean-Michel Trivi || ( (self->streamInfo.aacNumChannels == 1) 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && ( (CAN_DO_PS(self->streamInfo.aot) && !(self->flags & AC_MPS_PRESENT)) 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project || ( IS_USAC(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) ) ) ) 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->qmfModeCurr = MODE_HQ; 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->qmfModeCurr = MODE_LP; 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Set SBR to current QMF mode. Error does not matter. */ 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrDecoder_SetParam(self->hSbrDecoder, SBR_QMF_MODE, (self->qmfModeCurr == MODE_LP)); 1852ddc922da87bb675b8ab8c305566436e806df0d9Jean-Michel Trivi self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->streamInfo.aacNumChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ; 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT( ! ( (self->flags & AC_MPS_PRESENT) && self->psPossible ) ); 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid CAacDecoder_SignalInterruption(HANDLE_AACDECODER self) 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Reset ancillary data struct. Call before parsing a new frame. 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ancData Pointer to ancillary data structure 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return Error code 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_DECODER_ERROR CAacDecoder_AncDataReset(CAncData *ancData) 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<8; i++) 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ancData->offset[i] = 0; 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ancData->nrElements = 0; 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_OK; 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Initialize ancillary buffer 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ancData Pointer to ancillary data structure 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \buffer Pointer to (external) anc data buffer 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \size Size of the buffer pointed on by buffer in bytes 2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return Error code 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData, unsigned char *buffer, int size) 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (size >= 0) { 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ancData->buffer = buffer; 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ancData->bufferSize = size; 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoder_AncDataReset(ancData); 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_OK; 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_ANC_DATA_ERROR; 2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Get one ancillary data element 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ancData Pointer to ancillary data structure 2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \index Index of the anc data element to get 2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ptr Pointer to a buffer receiving a pointer to the requested anc data element 2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \size Pointer to a buffer receiving the length of the requested anc data element in bytes 2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return Error code 2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index, unsigned char **ptr, int *size) 2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AAC_DECODER_ERROR error = AAC_DEC_OK; 2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *ptr = NULL; 2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *size = 0; 2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (index >= 0 && index < 8 && index < ancData->nrElements) 2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *ptr = &ancData->buffer[ancData->offset[index]]; 2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *size = ancData->offset[index+1] - ancData->offset[index]; 2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Parse ancillary data 2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ancData Pointer to ancillary data structure 2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \hBs Handle to FDK bitstream 2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ancBytes Length of ancillary data to read from the bitstream 2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return Error code 2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_DECODER_ERROR CAacDecoder_AncDataParse ( 2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAncData *ancData, 2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int ancBytes ) 2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AAC_DECODER_ERROR error = AAC_DEC_OK; 2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int readBytes = 0; 2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ancData->buffer != NULL) 2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ancBytes > 0) { 2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* write ancillary data to external buffer */ 2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int offset = ancData->offset[ancData->nrElements]; 2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((offset + ancBytes) > ancData->bufferSize) 2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = AAC_DEC_TOO_SMALL_ANC_BUFFER; 2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else if (ancData->nrElements >= 8-1) 2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = AAC_DEC_TOO_MANY_ANC_ELEMENTS; 2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i = 0; i < ancBytes; i++) { 2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ancData->buffer[i+offset] = FDKreadBits(hBs, 8); 3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readBytes++; 3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ancData->nrElements++; 3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ancData->offset[ancData->nrElements] = ancBytes + ancData->offset[ancData->nrElements-1]; 3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readBytes = ancBytes - readBytes; 3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (readBytes > 0) { 3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* skip data */ 3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKpushFor(hBs, readBytes<<3); 3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Read Stream Data Element 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \bs Bitstream Handle 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return Error code 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic AAC_DECODER_ERROR CDataStreamElement_Read ( 32747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi HANDLE_AACDECODER self, 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM bs, 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *elementInstanceTag, 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT alignmentAnchor ) 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 33247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi HANDLE_TRANSPORTDEC pTp; 33347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi CAncData *ancData; 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AAC_DECODER_ERROR error = AAC_DEC_OK; 33547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi UINT dataStart, dseBits; 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int dataByteAlignFlag, count; 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 33847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi FDK_ASSERT(self != NULL); 33947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi 34047c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi ancData = &self->ancData; 34147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi pTp = self->hInput; 34247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi 3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int crcReg = transportDec_CrcStartReg(pTp, 0); 3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Element Instance Tag */ 3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *elementInstanceTag = FDKreadBits(bs,4); 3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Data Byte Align Flag */ 3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dataByteAlignFlag = FDKreadBits(bs,1); 3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project count = FDKreadBits(bs,8); 3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (count == 255) { 3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project count += FDKreadBits(bs,8); /* EscCount */ 3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 35547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi dseBits = count*8; 3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (dataByteAlignFlag) { 3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKbyteAlign(bs, alignmentAnchor); 3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dataStart = FDKgetValidBits(bs); 3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = CAacDecoder_AncDataParse(ancData, bs, count); 3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transportDec_CrcEndReg(pTp, crcReg); 3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Move to the beginning of the data junk */ 3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKpushBack(bs, dataStart-FDKgetValidBits(bs)); 3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Read Anc data if available */ 37147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi aacDecoder_drcMarkPayload( self->hDrcInfo, bs, DVB_DRC_ANC_DATA ); 37247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi } 37347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi 37447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi { 37547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi PCMDMX_ERROR dmxErr = PCMDMX_OK; 3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 37747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi /* Move to the beginning of the data junk */ 37847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi FDKpushBack(bs, dataStart-FDKgetValidBits(bs)); 37947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi 38047c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi /* Read DMX meta-data */ 38147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi dmxErr = pcmDmx_Parse ( 38247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi self->hPcmUtils, 38347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi bs, 38447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi dseBits, 38547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi 0 /* not mpeg2 */ ); 3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 38747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi 38847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi /* Move to the very end of the element. */ 38947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi FDKpushBiDirectional(bs, FDKgetValidBits(bs)-dataStart+dseBits); 3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef TP_PCE_ENABLE 3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Read Program Config Element 3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \bs Bitstream Handle 3995016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi \pTp Transport decoder handle for CRC handling 4005016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi \pce Pointer to PCE buffer 4015016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi \channelConfig Current channel configuration 4025016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi \alignAnchor Anchor for byte alignment 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4045016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi \return PCE status (-1: fail, 0: no new PCE, 1: PCE updated, 2: PCE updated need re-config). 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 4065016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivistatic int CProgramConfigElement_Read ( 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM bs, 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_TRANSPORTDEC pTp, 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CProgramConfig *pce, 4105016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi const UINT channelConfig, 4115016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi const UINT alignAnchor ) 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 4135016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi int pceStatus = 0; 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int crcReg; 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* read PCE to temporal buffer first */ 4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1); 4185016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi 4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CProgramConfig_Init(tmpPce); 4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CProgramConfig_Reset(tmpPce); 4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project crcReg = transportDec_CrcStartReg(pTp, 0); 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CProgramConfig_Read(tmpPce, bs, alignAnchor); 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transportDec_CrcEndReg(pTp, crcReg); 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( CProgramConfig_IsValid(tmpPce) 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (tmpPce->Profile == 1) ) 4305016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi { 4315016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if ( !pce->isValid && (channelConfig > 0) ) { 4325016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* Create a standard channel config PCE to compare with */ 4335016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi CProgramConfig_GetDefault( pce, channelConfig ); 4345016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 4355016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi 4365016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if (pce->isValid) { 4375016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* Compare the new and the old PCE (tags ignored) */ 4385016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi switch ( CProgramConfig_Compare( pce, tmpPce ) ) 4395016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi { 4405016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi case 1: /* Channel configuration not changed. Just new metadata. */ 4415016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig)); /* Store the complete PCE */ 4425016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi pceStatus = 1; /* New PCE but no change of config */ 4435016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi break; 4445016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi case 2: /* The number of channels are identical but not the config */ 4455016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if (channelConfig == 0) { 4465016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig)); /* Store the complete PCE */ 4475016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi pceStatus = 2; /* Decoder needs re-configuration */ 4485016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 4495016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi break; 4505016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi case -1: /* The channel configuration is completely different */ 4515016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi pceStatus = -1; /* Not supported! */ 4525016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi break; 4535016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi case 0: /* Nothing to do because PCE matches the old one exactly. */ 4545016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi default: 4555016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* pceStatus = 0; */ 4565016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi break; 4575016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 4585016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1); 4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4635016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi return pceStatus; 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 4655016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi#endif /* TP_PCE_ENABLE */ 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Parse Extension Payload 4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \self Handle of AAC decoder 4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \count Pointer to bit counter. 4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \previous_element ID of previous element (required by some extension payloads) 4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return Error code 4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC_DECODER_ERROR CAacDecoder_ExtPayloadParse (HANDLE_AACDECODER self, 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *count, 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MP4_ELEMENT_ID previous_element, 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int elIndex, 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int fIsFillElement) 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AAC_DECODER_ERROR error = AAC_DEC_OK; 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project EXT_PAYLOAD_TYPE extension_type; 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bytes = (*count) >> 3; 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int crcFlag = 0; 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (*count < 4) { 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_PARSE_ERROR; 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else if ((INT)FDKgetValidBits(hBs) < *count) { 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_DECODE_FRAME_ERROR; 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project extension_type = (EXT_PAYLOAD_TYPE) FDKreadBits(hBs, 4); /* bs_extension_type */ 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count -= 4; 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (extension_type) 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case EXT_DYNAMIC_RANGE: 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT readBits = aacDecoder_drcMarkPayload( self->hDrcInfo, hBs, MPEG_DRC_EXT_DATA ); 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (readBits > *count) 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { /* Read too much. Something went wrong! */ 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = AAC_DEC_PARSE_ERROR; 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count -= readBits; 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case EXT_SBR_DATA_CRC: 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project crcFlag = 1; 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case EXT_SBR_DATA: 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (IS_CHANNEL_ELEMENT(previous_element)) { 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_ERROR sbrError; 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoder_SyncQmfMode(self); 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrError = sbrDecoder_InitElement( 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hSbrDecoder, 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSampleRate, 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.extSamplingRate, 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame, 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aot, 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project previous_element, 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project elIndex 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sbrError == SBRDEC_OK) { 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrError = sbrDecoder_Parse ( 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hSbrDecoder, 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hBs, 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project count, 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count, 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project crcFlag, 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project previous_element, 5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project elIndex, 5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags & AC_INDEP ); 541203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi /* Enable SBR for implicit SBR signalling but only if no severe error happend. */ 542203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi if ( (sbrError == SBRDEC_OK) 543203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi || (sbrError == SBRDEC_PARSE_ERROR) ) { 5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabled = 1; 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Do not try to apply SBR because initializing the element failed. */ 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabled = 0; 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Citation from ISO/IEC 14496-3 chapter 4.5.2.1.5.2 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Fill elements containing an extension_payload() with an extension_type of EXT_SBR_DATA 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project or EXT_SBR_DATA_CRC shall not contain any other extension_payload of any other extension_type. 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (fIsFillElement) { 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKpushBiDirectional(hBs, *count); 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count = 0; 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 558203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi /* If this is not a fill element with a known length, we are screwed and further parsing makes no sense. */ 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sbrError != SBRDEC_OK) { 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = AAC_DEC_PARSE_ERROR; 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case EXT_FILL_DATA: 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int temp; 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits(hBs,4); 5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bytes--; 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (temp != 0) { 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = AAC_DEC_PARSE_ERROR; 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while (bytes > 0) { 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits(hBs,8); 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bytes--; 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (temp != 0xa5) { 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = AAC_DEC_PARSE_ERROR; 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count = bytes<<3; 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case EXT_DATA_ELEMENT: 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int dataElementVersion; 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dataElementVersion = FDKreadBits(hBs,4); 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count -= 4; 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (dataElementVersion == 0) /* ANC_DATA */ 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int temp, dataElementLength = 0; 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project do { 6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project temp = FDKreadBits(hBs,8); 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count -= 8; 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dataElementLength += temp; 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } while (temp == 255 ); 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoder_AncDataParse(&self->ancData, hBs, dataElementLength); 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count -= (dataElementLength<<3); 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* align = 0 */ 6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = AAC_DEC_PARSE_ERROR; 6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case EXT_DATA_LENGTH: 6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !fIsFillElement /* Makes no sens to have an additional length in a fill ... */ 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (self->flags & AC_ER) ) /* ... element because this extension payload type was ... */ 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { /* ... created to circumvent the missing length in ER-Syntax. */ 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bitCnt, len = FDKreadBits(hBs, 4); 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count -= 4; 6215016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (len == 15) { 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int add_len = FDKreadBits(hBs, 8); 6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count -= 8; 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project len += add_len; 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (add_len == 255) { 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project len += FDKreadBits(hBs, 16); 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count -= 16; 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project len <<= 3; 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitCnt = len; 6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (EXT_PAYLOAD_TYPE)FDKreadBits(hBs, 4) == EXT_DATA_LENGTH ) { 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check NOTE 2: The extension_payload() included here must 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project not have extension_type == EXT_DATA_LENGTH. */ 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = AAC_DEC_PARSE_ERROR; 6395016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } else { 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* rewind and call myself again. */ 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKpushBack(hBs, 4); 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoder_ExtPayloadParse ( 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self, 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hBs, 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &bitCnt, 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project previous_element, 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project elIndex, 6505016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi 0 ); 6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count -= len - bitCnt; 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Note: the fall through in case the if statement above is not taken is intentional. */ 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case EXT_FIL: 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* align = 4 */ 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKpushFor(hBs, *count); 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count = 0; 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (error != AAC_DEC_OK) 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && fIsFillElement ) 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { /* Skip the remaining extension bytes */ 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKpushBiDirectional(hBs, *count); 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *count = 0; 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Patch error code because decoding can go on. */ 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = AAC_DEC_OK; 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Be sure that parsing errors have been stored. */ 6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Stream Configuration and Information. 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project This class holds configuration and information data for a stream to be decoded. It 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project provides the calling application as well as the decoder with substantial information, 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project e.g. profile, sampling rate, number of channels found in the bitstream etc. 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid CStreamInfoInit(CStreamInfo *pStreamInfo) 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->aacSampleRate = 0; 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->profile = -1; 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->aot = AOT_NONE; 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->channelConfig = -1; 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->bitRate = 0; 6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->aacSamplesPerFrame = 0; 6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->extAot = AOT_NONE; 6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->extSamplingRate = 0; 6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->flags = 0; 7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->epConfig = -1; /* default is no ER */ 7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->numChannels = 0; 7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->sampleRate = 0; 7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pStreamInfo->frameSize = 0; 707af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi 708af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi pStreamInfo->outputDelay = 0; 7098e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi 7108e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi /* DRC */ 7118e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi pStreamInfo->drcProgRefLev = -1; /* set program reference level to not indicated */ 7128e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi pStreamInfo->drcPresMode = -1; /* default: presentation mode not indicated */ 7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Initialization of AacDecoderChannelInfo 7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The function initializes the pointers to AacDecoderChannelInfo for each channel, 7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project set the start values for window shape and window sequence of overlap&add to zero, 7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project set the overlap buffer to zero and initializes the pointers to the window coefficients. 7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \param bsFormat is the format of the AAC bitstream 7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return AACDECODER instance 7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat) /*!< bitstream format (adif,adts,loas,...). */ 7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_AACDECODER self; 7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self = GetAacDecoder(); 7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self == NULL) { 7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Assign channel mapping info arrays (doing so removes dependency of settings header in API header). */ 7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.pChannelIndices = self->channelIndices; 7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.pChannelType = self->channelType; 7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* set default output mode */ 7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->outputInterleaved = 1; /* interleaved */ 7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* initialize anc data */ 7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoder_AncDataInit(&self->ancData, NULL, 0); 7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* initialize stream info */ 7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CStreamInfoInit(&self->streamInfo); 7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* initialize error concealment common data */ 7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CConcealment_InitCommonData(&self->concealCommonData); 7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hDrcInfo = GetDrcInfo(); 7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->hDrcInfo == NULL) { 7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Init common DRC structure */ 7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacDecoder_drcInit( self->hDrcInfo ); 7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Set default frame delay */ 7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacDecoder_drcSetParam ( 7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hDrcInfo, 7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project DRC_BS_DELAY, 7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CConcealment_GetDelay(&self->concealCommonData) 7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->aacCommonData.workBufferCore1 = GetWorkBufferCore1(); 7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->aacCommonData.workBufferCore2 = GetWorkBufferCore2(); 7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->aacCommonData.workBufferCore1 == NULL 7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ||self->aacCommonData.workBufferCore2 == NULL ) 7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return self; 7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoder_Close( self ); 7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return NULL; 7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Destroy aac decoder */ 7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP void CAacDecoder_Close(HANDLE_AACDECODER self) 7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int ch; 7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self == NULL) 7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return; 7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 78647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi for (ch=0; ch<(8); ch++) { 7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->pAacDecoderStaticChannelInfo[ch] != NULL) { 7885016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer != NULL) { 7895016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi FreeOverlapBuffer (&self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer); 7905016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 7915016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if (self->pAacDecoderStaticChannelInfo[ch] != NULL) { 7925016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi FreeAacDecoderStaticChannelInfo (&self->pAacDecoderStaticChannelInfo[ch]); 7935016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->pAacDecoderChannelInfo[ch] != NULL) { 7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeAacDecoderChannelInfo (&self->pAacDecoderChannelInfo[ch]); 7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->aacChannels = 0; 8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->hDrcInfo) { 8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeDrcInfo(&self->hDrcInfo); 8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8065016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if (self->aacCommonData.workBufferCore1 != NULL) { 8075016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi FreeWorkBufferCore1 (&self->aacCommonData.workBufferCore1); 8085016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 8095016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if (self->aacCommonData.workBufferCore2 != NULL) { 8105016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi FreeWorkBufferCore2 (&self->aacCommonData.workBufferCore2); 8115016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeAacDecoder ( &self); 8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Initialization of decoder instance 8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The function initializes the decoder. 8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return error status: 0 for success, <>0 for unsupported configurations 8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc) 8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AAC_DECODER_ERROR err = AAC_DEC_OK; 8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT ascChannels, ch, ascChanged = 0; 8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!self) 8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_INVALID_HANDLE; 8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // set profile and check for supported aot 8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // leave profile on default (=-1) for all other supported MPEG-4 aot's except aot=2 (=AAC-LC) 8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (asc->m_aot) { 8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_AAC_LC: 8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.profile = 1; 837203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi 838203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi case AOT_ER_AAC_SCAL: 839203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi if (asc->m_sc.m_gaSpecificConfig.m_layer > 0) { 840203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi /* aac_scalable_extension_element() currently not supported. */ 841203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi return AAC_DEC_UNSUPPORTED_FORMAT; 842203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi } 8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_SBR: 8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_PS: 8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_LD: 8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_ELD: 848203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi case AOT_DRM_AAC: 8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_UNSUPPORTED_AOT; 8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CProgramConfig_Init(&self->pce); 8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* set channels */ 8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (asc->m_channelConfiguration) { 8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 0: 8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef TP_PCE_ENABLE 8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get channels from program config (ASC) */ 8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) { 8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ascChannels = asc->m_progrConfigElement.NumChannels; 8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ascChannels > 0) { 8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int el; 8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* valid number of channels -> copy program config element (PCE) from ASC */ 8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(&self->pce, &asc->m_progrConfigElement, sizeof(CProgramConfig)); 8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Built element table */ 86947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi el = CProgramConfig_GetElementTable(&asc->m_progrConfigElement, self->elements, (8), &self->chMapIndex); 87047c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi for (; el<(8); el++) { 8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->elements[el] = ID_NONE; 8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 87747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi self->chMapIndex = 0; 8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (transportDec_GetFormat(self->hInput) == TT_MP4_ADTS) { 8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* set default max_channels for memory allocation because in implicit channel mapping mode 8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project we don't know the actual number of channels until we processed at least one raw_data_block(). */ 88147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi ascChannels = (8); 8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else /* TP_PCE_ENABLE */ 8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif /* TP_PCE_ENABLE */ 8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1: case 2: case 3: case 4: case 5: case 6: 8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ascChannels = asc->m_channelConfiguration; 8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 89347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi case 11: 89447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi ascChannels = 7; 89547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi break; 89647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi case 7: case 12: case 14: 8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ascChannels = 8; 8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 90347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi if (ascChannels > (8)) { 90447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; 90547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi } 90647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi 9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Initialize constant mappings for channel config 1-7 */ 9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (asc->m_channelConfiguration > 0) { 9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int el; 91047c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi FDKmemcpy(self->elements, elementsTab[asc->m_channelConfiguration-1], sizeof(MP4_ELEMENT_ID)*FDKmin(7,(8))); 91147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi for (el=7; el<(8); el++) { 9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->elements[el] = ID_NONE; 9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (ch=0; ch<ascChannels; ch++) { 9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->chMapping[ch] = ch; 9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 91747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi for (; ch<(8); ch++) { 9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->chMapping[ch] = 255; 9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 92047c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi self->chMapIndex = asc->m_channelConfiguration; 9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9226ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi #ifdef TP_PCE_ENABLE 9236ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi else { 9246ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) { 9256ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi /* Set matrix mixdown infos if available from PCE. */ 9266ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils, 9276ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi asc->m_progrConfigElement.MatrixMixdownIndexPresent, 9286ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi asc->m_progrConfigElement.MatrixMixdownIndex, 9296ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi asc->m_progrConfigElement.PseudoSurroundEnable ); 9306ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi } 9316ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi } 9326ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi #endif 9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.channelConfig = asc->m_channelConfiguration; 9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->streamInfo.aot != asc->m_aot) { 9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aot = asc->m_aot; 9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ascChanged = 1; 9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->streamInfo.aacSamplesPerFrame != (INT)asc->m_samplesPerFrame) { 9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame = asc->m_samplesPerFrame; 9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ascChanged = 1; 9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.bitRate = 0; 9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Set syntax flags */ 9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags = 0; 9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.extAot = asc->m_extensionAudioObjectType; 9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.extSamplingRate = asc->m_extensionSamplingFrequency; 9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0; 9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= (asc->m_psPresentFlag) ? AC_PS_PRESENT : 0; 9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabled = 0; 9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* --------- vcb11 ------------ */ 9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= (asc->m_vcb11Flag) ? AC_ER_VCB11 : 0; 9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* ---------- rvlc ------------ */ 9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= (asc->m_rvlcFlag) ? AC_ER_RVLC : 0; 9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* ----------- hcr ------------ */ 9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= (asc->m_hcrFlag) ? AC_ER_HCR : 0; 9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (asc->m_aot == AOT_ER_AAC_ELD) { 9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= AC_ELD; 968203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi self->flags |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0; /* Need to set the SBR flag for backward-compatibility 969203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi reasons. Even if SBR is not supported. */ 9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= (asc->m_sc.m_eldSpecificConfig.m_sbrCrcFlag) ? AC_SBRCRC : 0; 9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= (asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) ? AC_LD_MPS : 0; 9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= (asc->m_aot == AOT_ER_AAC_LD) ? AC_LD : 0; 9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= (asc->m_epConfig >= 0) ? AC_ER : 0; 975203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi if ( asc->m_aot == AOT_DRM_AAC ) { 976203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi self->flags |= AC_DRM|AC_SBRCRC|AC_SCALABLE; 977203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi } 978203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi if ( (asc->m_aot == AOT_AAC_SCAL) 979203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi || (asc->m_aot == AOT_ER_AAC_SCAL) ) { 980203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi self->flags |= AC_SCALABLE; 981203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi } 9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (asc->m_sbrPresentFlag) { 9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabled = 1; 9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabledPrev = 1; 9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (asc->m_psPresentFlag) { 9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags |= AC_PS_PRESENT; 9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (asc->m_epConfig >= 0) 9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project && (asc->m_channelConfiguration <= 0) ) { 9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* we have to know the number of channels otherwise no decoding is possible */ 9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_UNSUPPORTED_ER_FORMAT; 9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.epConfig = asc->m_epConfig; 9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* self->hInput->asc.m_epConfig = asc->m_epConfig; */ 10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (asc->m_epConfig > 1) 10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_UNSUPPORTED_ER_FORMAT; 10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check if samplerate changed. */ 10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->streamInfo.aacSampleRate != (INT)asc->m_samplingFrequency) { 10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AAC_DECODER_ERROR error; 10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ascChanged = 1; 10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Update samplerate info. */ 10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project error = getSamplingRateInfo(&self->samplingRateInfo, asc->m_samplesPerFrame, asc->m_samplingFrequencyIndex, asc->m_samplingFrequency); 10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (error != AAC_DEC_OK) { 10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return error; 10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSampleRate = self->samplingRateInfo.samplingRate; 10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check if amount of channels has changed. */ 10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->ascChannels != ascChannels) 10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ascChanged = 1; 10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Allocate all memory structures for each channel */ 10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (ch = 0; ch < ascChannels; ch++) { 10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoderDynamicData *aacDecoderDynamicData = &self->aacCommonData.workBufferCore1->pAacDecoderDynamicData[ch%2]; 10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* initialize pointer to CAacDecoderChannelInfo */ 10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->pAacDecoderChannelInfo[ch] == NULL) { 10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderChannelInfo[ch] = GetAacDecoderChannelInfo(ch); 10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* This is temporary until the DynamicData is split into two or more regions! 10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The memory could be reused after completed core decoding. */ 10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->pAacDecoderChannelInfo[ch] == NULL) { 10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Hook shared work memory into channel data structure */ 10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderChannelInfo[ch]->pDynData = aacDecoderDynamicData; 10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderChannelInfo[ch]->pComData = &self->aacCommonData; 10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Allocate persistent channel memory */ 10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->pAacDecoderStaticChannelInfo[ch] == NULL) { 10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderStaticChannelInfo[ch] = GetAacDecoderStaticChannelInfo(ch); 10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->pAacDecoderStaticChannelInfo[ch] == NULL) { 10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer = GetOverlapBuffer(ch); /* This area size depends on the AOT */ 10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer == NULL) { 10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderChannelInfo[ch]->pSpectralCoefficient = (SPECTRAL_PTR) &self->aacCommonData.workBufferCore2[ch*1024]; 10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CPns_InitPns(&self->pAacDecoderChannelInfo[ch]->data.aac.PnsData, &self->aacCommonData.pnsInterChannelData, &self->aacCommonData.pnsCurrentSeed, self->aacCommonData.pnsRandomSeed); 10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10575016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if (ascChannels > self->aacChannels) 10585016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi { 10595016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* Make allocated channel count persistent in decoder context. */ 10605016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi self->aacChannels = ascChannels; 10615016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HcrInitRom(&self->aacCommonData.overlay.aac.erHcrInfo); 10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, ID_SCE); 10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Make amount of signalled channels persistent in decoder context. */ 10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->ascChannels = ascChannels; 10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Update structures */ 10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ascChanged) { 10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10745016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* Things to be done for each channel, which do not involve allocating memory. 10755016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi Doing these things only on the channels needed for the current configuration 10765016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi (ascChannels) could lead to memory access violation later (error concealment). */ 10775016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi for (ch = 0; ch < self->aacChannels; ch++) { 10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (self->streamInfo.aot) { 10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_ELD: 10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_LD: 10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame; 10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame / 8; 10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mdct_init( &self->pAacDecoderStaticChannelInfo[ch]->IMdct, 10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer, 10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project OverlapBufferSize ); 10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Reset DRC control data for this channel */ 10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[ch]->drcData ); 10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Reset concealment only if ASC changed. Otherwise it will be done with any config callback. 10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project E.g. every time the LATM SMC is present. */ 10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo, 10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->concealCommonData, 10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame ); 11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Update externally visible copy of flags */ 11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.flags = self->flags; 11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return err; 11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacDecoder_Close( self ); 11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_OUT_OF_MEMORY; 11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( 11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_AACDECODER self, 11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT flags, 11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT_PCM *pTimeData, 11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT timeDataSize, 11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const INT interleaved 11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; 11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CProgramConfig *pce; 11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM bs = transportDec_GetBitstream(self->hInput, 0); 11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MP4_ELEMENT_ID type = ID_NONE; /* Current element type */ 11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT aacChannels=0; /* Channel counter for channels found in the bitstream */ 112947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi int chOutMapIdx; /* Output channel mapping index (see comment below) */ 11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT auStartAnchor = (INT)FDKgetValidBits(bs); /* AU start bit buffer position for AU byte alignment */ 11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 1; 11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Any supported base layer valid AU will require more than 16 bits. */ 11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (transportDec_GetAuBitsRemaining(self->hInput, 0) < 15) && (flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) == 0) { 11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Reset Program Config structure */ 11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pce = &self->pce; 11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CProgramConfig_Reset(pce); 11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoder_AncDataReset(&self->ancData); 11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int ch; 11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->streamInfo.channelConfig == 0) { 11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Init Channel/Element mapping table */ 115347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi for (ch=0; ch<(8); ch++) { 11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->chMapping[ch] = 255; 11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!CProgramConfig_IsValid(pce)) { 11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int el; 115847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi for (el=0; el<(8); el++) { 11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->elements[el] = ID_NONE; 11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check sampling frequency */ 11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch ( self->streamInfo.aacSampleRate ) { 1167203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi case 96000: 1168203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi case 88200: 1169203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi case 64000: 11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16000: 11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 12000: 11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 11025: 11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 8000: 11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 7350: 11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 48000: 11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 44100: 11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 32000: 11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 24000: 11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 22050: 11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( ! (self->flags & (AC_USAC|AC_RSVD50)) ) { 11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return AAC_DEC_UNSUPPORTED_SAMPLINGRATE; 11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( flags & AACDEC_CLRHIST ) 11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int ch; 11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Clear history */ 11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (ch = 0; ch < self->aacChannels; ch++) { 11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Reset concealment */ 11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo, 11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->concealCommonData, 11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame ); 11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Clear overlap-add buffers to avoid clicks. */ 1199af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL)); 12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef TP_PCE_ENABLE 12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int pceRead = 0; /* Flag indicating a PCE in the current raw_data_block() */ 12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT hdaacDecoded = 0; 12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project MP4_ELEMENT_ID previous_element = ID_END; /* Last element ID (required for extension payload mapping */ 12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR previous_element_index = 0; /* Canonical index of last element */ 12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int element_count = 0; /* Element counter for elements found in the bitstream */ 12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int el_cnt[ID_LAST] = { 0 }; /* element counter ( robustness ) */ 12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while ( (type != ID_END) && (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH))) && self->frameOK ) 12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int el_channels; 12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (! (self->flags & (AC_USAC|AC_RSVD50|AC_ELD|AC_SCALABLE|AC_ER))) 12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project type = (MP4_ELEMENT_ID) FDKreadBits(bs,3); 12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project type = self->elements[element_count]; 12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, type); 12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((INT)FDKgetValidBits(bs) < 0) 12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (type) 12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ID_SCE: 12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ID_CPE: 12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ID_LFE: 12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Consistency check 12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (type == ID_CPE) { 12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project el_channels = 2; 12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project el_channels = 1; 12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (el_cnt[type] >= (self->ascChannels>>(el_channels-1))) || (aacChannels > (self->ascChannels-el_channels)) ) { 12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !(self->flags & (AC_USAC|AC_RSVD50)) ) { 12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int ch; 12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (ch=0; ch < el_channels; ch+=1) { 12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CPns_ResetData(&self->pAacDecoderChannelInfo[aacChannels+ch]->data.aac.PnsData, 12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->pAacDecoderChannelInfo[aacChannels+ch]->pComData->pnsInterChannelData); 12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(self->frameOK) { 12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = CChannelElement_Read( bs, 12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->pAacDecoderChannelInfo[aacChannels], 12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->pAacDecoderStaticChannelInfo[aacChannels], 12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aot, 12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->samplingRateInfo, 12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags, 12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame, 12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project el_channels, 12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.epConfig, 12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hInput 12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus) { 12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( self->frameOK) { 12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Lookup the element and decode it only if it belongs to the current program */ 12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( CProgramConfig_LookupElement( 12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pce, 12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.channelConfig, 12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderChannelInfo[aacChannels]->ElementInstanceTag, 12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacChannels, 12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->chMapping, 12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->channelType, 12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->channelIndices, 12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &previous_element_index, 12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->elements, 12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project type) ) 12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !hdaacDecoded ) { 12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CChannelElement_Decode( 12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->pAacDecoderChannelInfo[aacChannels], 12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->pAacDecoderStaticChannelInfo[aacChannels], 12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->samplingRateInfo, 12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags, 12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project el_channels 12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacChannels += 1; 13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (type == ID_CPE) { 13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacChannels += 1; 13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13095016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* Create SBR element for SBR for upsampling for LFE elements, 13105016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi and if SBR was explicitly signaled, because the first frame(s) 13115016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi may not contain SBR payload (broken encoder, bit errors). */ 13125016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if ( (self->flags & AC_SBR_PRESENT) || (self->sbrEnabled == 1) ) 13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_ERROR sbrError; 13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sbrError = sbrDecoder_InitElement( 13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hSbrDecoder, 13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSampleRate, 13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.extSamplingRate, 13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame, 13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aot, 13225016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi type, 13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project previous_element_index 13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sbrError != SBRDEC_OK) { 13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Do not try to apply SBR because initializing the element failed. */ 13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabled = 0; 13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project el_cnt[type]++; 13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ID_CCE: 13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Consistency check 13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( el_cnt[type] > self->ascChannels ) { 13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->frameOK) 13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* memory for spectral lines temporal on scratch */ 13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(mdctSpec, FIXP_DBL, 1024); 13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* create dummy channel for CCE parsing on stack */ 13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoderChannelInfo tmpAacDecoderChannelInfo, *pTmpAacDecoderChannelInfo; 13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(mdctSpec, 1024*sizeof(FIXP_DBL)); 13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmpAacDecoderChannelInfo.pDynData = self->aacCommonData.workBufferCore1->pAacDecoderDynamicData; 13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmpAacDecoderChannelInfo.pComData = &self->aacCommonData; 13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmpAacDecoderChannelInfo.pSpectralCoefficient = (SPECTRAL_PTR)mdctSpec; 13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Assume AAC-LC */ 13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmpAacDecoderChannelInfo.granuleLength = self->streamInfo.aacSamplesPerFrame / 8; 13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Reset PNS data. */ 13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CPns_ResetData(&tmpAacDecoderChannelInfo.data.aac.PnsData, &tmpAacDecoderChannelInfo.pComData->pnsInterChannelData); 13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pTmpAacDecoderChannelInfo = &tmpAacDecoderChannelInfo; 13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* do CCE parsing */ 13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = CChannelElement_Read( bs, 13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pTmpAacDecoderChannelInfo, 13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project NULL, 13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aot, 13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->samplingRateInfo, 13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags, 13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame, 13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1, 13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.epConfig, 13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hInput 13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(mdctSpec, FIXP_DBL, 1024); 13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus) { 13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->frameOK) { 13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Lookup the element and decode it only if it belongs to the current program */ 13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (CProgramConfig_LookupElement( 13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pce, 13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.channelConfig, 13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pTmpAacDecoderChannelInfo->ElementInstanceTag, 13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0, 13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->chMapping, 13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->channelType, 13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->channelIndices, 13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &previous_element_index, 13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->elements, 13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project type) ) 13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decoding of CCE not supported */ 13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project el_cnt[type]++; 14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ID_DSE: 14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR element_instance_tag; 14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 141247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi CDataStreamElement_Read( self, 141347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi bs, 14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &element_instance_tag, 14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project auStartAnchor ); 14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!CProgramConfig_LookupElement( 14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pce, 14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.channelConfig, 14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project element_instance_tag, 14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0, 14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->chMapping, 14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->channelType, 14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->channelIndices, 14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &previous_element_index, 14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->elements, 14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project type) ) 14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* most likely an error in bitstream occured */ 14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //self->frameOK = 0; 14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef TP_PCE_ENABLE 14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ID_PCE: 14375016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi { 14385016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi int result = CProgramConfigElement_Read( 14395016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi bs, 14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hInput, 14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pce, 14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.channelConfig, 14435016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi auStartAnchor ); 14445016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if ( result < 0 ) { 14455016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* Something went wrong */ 14465016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi ErrorStatus = AAC_DEC_PARSE_ERROR; 14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14495016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi else if ( result > 1 ) { 14505016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* Built element table */ 145147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi int elIdx = CProgramConfig_GetElementTable(pce, self->elements, (8), &self->chMapIndex); 14525016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* Reset the remaining tabs */ 145347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi for ( ; elIdx<(8); elIdx++) { 14545016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi self->elements[elIdx] = ID_NONE; 14555016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 14565016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* Make new number of channel persistant */ 14575016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi self->ascChannels = pce->NumChannels; 14585016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi /* If PCE is not first element conceal this frame to avoid inconsistencies */ 14595016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi if ( element_count != 0 ) { 14605016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi self->frameOK = 0; 14615016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 14625016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi } 14635016eb7f6582fbb2d72d79be782325a12df08864Jean-Michel Trivi pceRead = (result>=0) ? 1 : 0; 14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif /* TP_PCE_ENABLE */ 14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ID_FIL: 14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bitCnt = FDKreadBits(bs,4); /* bs_count */ 14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (bitCnt == 15) 14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int esc_count = FDKreadBits(bs,8); /* bs_esc_count */ 14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitCnt = esc_count + 14; 14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Convert to bits */ 14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitCnt <<= 3; 14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while (bitCnt > 0) { 14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 1); 14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus != AAC_DEC_OK) { 14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ID_EXT: 14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitCnt = 0; 14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get the remaining bits of this frame */ 14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitCnt = transportDec_GetAuBitsRemaining(self->hInput, 0); 14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1498203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi if ( (bitCnt > 0) && (self->flags & AC_SBR_PRESENT) && (self->flags & (AC_USAC|AC_RSVD50|AC_ELD|AC_DRM)) ) 14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SBR_ERROR err = SBRDEC_OK; 15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int elIdx, numChElements = el_cnt[ID_SCE] + el_cnt[ID_CPE]; 15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (elIdx = 0; elIdx < numChElements; elIdx += 1) 15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project err = sbrDecoder_Parse ( 15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hSbrDecoder, 15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bs, 15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &bitCnt, 15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project -1, 15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags & AC_SBRCRC, 15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->elements[elIdx], 15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project elIdx, 15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags & AC_INDEP ); 15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (err != SBRDEC_OK) { 15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1519af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi switch (err) { 1520af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi case SBRDEC_PARSE_ERROR: 1521af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi /* Can not go on parsing because we do not 1522af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi know the length of the SBR extension data. */ 1523af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi FDKpushFor(bs, bitCnt); 1524af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi bitCnt = 0; 1525af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi break; 1526af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi case SBRDEC_OK: 15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabled = 1; 1528af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi break; 1529af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi default: 15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 1531af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi break; 15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1536203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi if (self->flags & AC_DRM) 1537203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi { 1538203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi if ((bitCnt = (INT)FDKgetValidBits(bs)) != 0) { 1539203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi FDKpushBiDirectional(bs, bitCnt); 1540203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi } 1541203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi } 1542203e3f28fbebec7011342017fafc2a0bda0ce530Jean-Michel Trivi 15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( ! (self->flags & (AC_USAC|AC_RSVD50|AC_DRM)) ) 15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while ( bitCnt > 7 ) { 15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 0); 15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus != AAC_DEC_OK) { 15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_PARSE_ERROR; 15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case ID_END: 15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 15622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 15632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project previous_element = type; 15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project element_count++; 15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* while ( (type != ID_END) ... ) */ 15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) ) 15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Byte alignment with respect to the first bit of the raw_data_block(). */ 15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKbyteAlign(bs, auStartAnchor); 15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check if all bits of the raw_data_block() have been read. */ 15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( transportDec_GetAuBitsTotal(self->hInput, 0) > 0 ) { 15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT unreadBits = transportDec_GetAuBitsRemaining(self->hInput, 0); 15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( unreadBits != 0 ) { 15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Do not overwrite current error */ 15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus == AAC_DEC_OK && self->frameOK == 0) { 15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_PARSE_ERROR; 15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Always put the bitbuffer at the right position after the current Access Unit. */ 15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKpushBiDirectional(bs, unreadBits); 15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 15932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Check the last element. The terminator (ID_END) has to be the last one (even if ER syntax is used). */ 15942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( self->frameOK && type != ID_END ) { 15952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Do not overwrite current error */ 15962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus == AAC_DEC_OK) { 15972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_PARSE_ERROR; 15982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 15992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 16002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* More AAC channels than specified by the ASC not allowed. */ 16042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (aacChannels == 0 || aacChannels > self->aacChannels) && !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) ) { 16052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 16062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Do not overwrite current error */ 16072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus == AAC_DEC_OK) { 16082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; 16092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 16112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacChannels = 0; 16132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else if ( aacChannels > self->ascChannels ) { 16152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Do not overwrite current error */ 16162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus == AAC_DEC_OK) { 16172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT; 16182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK = 0; 16202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacChannels = 0; 16212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( TRANSPORTDEC_OK != transportDec_CrcCheck(self->hInput) ) 16242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 16252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->frameOK=0; 16262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1628af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi /* store or restore the number of channels and the corresponding info */ 16292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( self->frameOK && !(flags &(AACDEC_CONCEAL|AACDEC_FLUSH)) ) { 1630af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi self->aacChannelsPrev = aacChannels; /* store */ 1631af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi FDKmemcpy(self->channelTypePrev, self->channelType, (8)*sizeof(AUDIO_CHANNEL_TYPE)); /* store */ 1632af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi FDKmemcpy(self->channelIndicesPrev, self->channelIndices, (8)*sizeof(UCHAR)); /* store */ 16332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabledPrev = self->sbrEnabled; 16342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 16352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->aacChannels > 0) { 1636af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi aacChannels = self->aacChannelsPrev; /* restore */ 1637af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi FDKmemcpy(self->channelType, self->channelTypePrev, (8)*sizeof(AUDIO_CHANNEL_TYPE)); /* restore */ 1638af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi FDKmemcpy(self->channelIndices, self->channelIndicesPrev, (8)*sizeof(UCHAR)); /* restore */ 16392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabled = self->sbrEnabledPrev; 16402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Update number of output channels */ 16442ddc922da87bb675b8ab8c305566436e806df0d9Jean-Michel Trivi self->streamInfo.aacNumChannels = aacChannels; 16452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project #ifdef TP_PCE_ENABLE 16476ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi if (pceRead == 1 && CProgramConfig_IsValid(pce)) { 16482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Set matrix mixdown infos if available from PCE. */ 16492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils, 16502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pce->MatrixMixdownIndexPresent, 16512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pce->MatrixMixdownIndex, 16522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pce->PseudoSurroundEnable ); 16532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project #endif 16552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* If there is no valid data to transfrom into time domain, return. */ 16572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( ! IS_OUTPUT_VALID(ErrorStatus) ) { 16582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return ErrorStatus; 16592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 16602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 166147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi /* Setup the output channel mapping. The table below shows the four possibilities: 166247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * # | chCfg | PCE | cChCfg | chOutMapIdx 166347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * ---+-------+-----+--------+------------------ 166447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * 1 | > 0 | no | - | chCfg 166547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * 2 | 0 | yes | > 0 | cChCfg 166647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * 3 | 0 | yes | 0 | aacChannels || 0 166747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * 4 | 0 | no | - | aacChannels || 0 166847c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * ---+-------+-----+--------+------------------ 166947c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * Where chCfg is the channel configuration index from ASC and cChCfg is a corresponding chCfg 167047c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * derived from a given PCE. The variable aacChannels represents the number of channel found 167147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * during bitstream decoding. Due to the structure of the mapping table it can only be used for 167247c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * mapping if its value is smaller than 7. Otherwise we use the fallback (0) which is a simple 167347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * pass-through. The possibility #4 should appear only with MPEG-2 (ADTS) streams. This is 167447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi * mode is called "implicit channel mapping". 167547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi */ 167647c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi chOutMapIdx = ((self->chMapIndex==0) && (aacChannels<7)) ? aacChannels : self->chMapIndex; 167747c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi 16782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 16792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Inverse transform 16802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 16812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 16822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int stride, offset, c; 16832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1684603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi /* Turn on/off DRC modules level normalization in digital domain depending on the limiter status. */ 1685603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi aacDecoder_drcSetParam( self->hDrcInfo, APPLY_NORMALIZATION, (self->limiterEnableCurr) ? 0 : 1 ); 16862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Extract DRC control data and map it to channels (without bitstream delay) */ 16872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacDecoder_drcProlog ( 16882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hDrcInfo, 16892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bs, 16902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderStaticChannelInfo, 16912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pce.ElementInstanceTag, 16922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->chMapping, 16932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacChannels 16942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 16952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 16962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* "c" iterates in canonical MPEG channel order */ 16972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (c=0; c < aacChannels; c++) 16982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 16992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CAacDecoderChannelInfo *pAacDecoderChannelInfo; 17002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Select correct pAacDecoderChannelInfo for current channel */ 17022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (self->chMapping[c] >= aacChannels) { 17032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[c]; 17042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 17052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[self->chMapping[c]]; 17062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Setup offset and stride for time buffer traversal. */ 17092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (interleaved) { 17102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stride = aacChannels; 171147c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi offset = self->channelOutputMapping[chOutMapIdx][c]; 17122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 17132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stride = 1; 171447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi offset = self->channelOutputMapping[chOutMapIdx][c] * self->streamInfo.aacSamplesPerFrame; 17152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1718af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi if ( flags&AACDEC_FLUSH ) { 1719af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi /* Clear pAacDecoderChannelInfo->pSpectralCoefficient because with AACDEC_FLUSH set it contains undefined data. */ 1720af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame); 1721af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi } 1722af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi 17232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 17242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Conceal defective spectral data 17252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 17262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CConcealment_Apply(&self->pAacDecoderStaticChannelInfo[c]->concealmentInfo, 17272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo, 17282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderStaticChannelInfo[c], 17292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->samplingRateInfo, 17302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame, 17312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 0, 17322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (self->frameOK && !(flags&AACDEC_CONCEAL)), 17332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->flags 17342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 17352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (flags & (AACDEC_INTR|AACDEC_CLRHIST)) { 17382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Reset DRC control data for this channel */ 17392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[c]->drcData ); 17402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1741603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi /* The DRC module demands to be called with the gain field holding the gain scale. */ 1742603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi self->extGain[0] = (FIXP_DBL)TDL_GAIN_SCALING; 17432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* DRC processing */ 17442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacDecoder_drcApply ( 17452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hDrcInfo, 17462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hSbrDecoder, 17472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo, 17482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &self->pAacDecoderStaticChannelInfo[c]->drcData, 1749603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi self->extGain, 17502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project c, 17512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame, 17522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->sbrEnabled 17532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 17542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (pAacDecoderChannelInfo->renderMode) 17562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 17572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACDEC_RENDER_IMDCT: 17582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CBlock_FrequencyToTime( 17592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderStaticChannelInfo[c], 17602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo, 17612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pTimeData + offset, 17622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame, 17632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stride, 17642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (self->frameOK && !(flags&AACDEC_CONCEAL)), 17652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->aacCommonData.workBufferCore1->mdctOutTemp 17662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 1767603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi self->extGainDelay = self->streamInfo.aacSamplesPerFrame; 17682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 17692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AACDEC_RENDER_ELDFB: 17702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CBlock_FrequencyToTimeLowDelay( 17712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderStaticChannelInfo[c], 17722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAacDecoderChannelInfo, 17732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pTimeData + offset, 17742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->streamInfo.aacSamplesPerFrame, 17752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stride 17762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 1777603f48ab99ce76f552f4f6f85d06b8c5b94c698eJean-Michel Trivi self->extGainDelay = (self->streamInfo.aacSamplesPerFrame*2 - self->streamInfo.aacSamplesPerFrame/2 - 1)/2; 17782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 17792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 17802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AAC_DEC_UNKNOWN; 17812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 17822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( flags&AACDEC_FLUSH ) { 17846ab36997af5d5acda4f21d33031f4e45c85f96b7Jean-Michel Trivi FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame); 17852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(self->pAacDecoderStaticChannelInfo[c]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL)); 17862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 17882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 17902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Extract DRC control data and map it to channels (with bitstream delay) */ 17912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacDecoder_drcEpilog ( 17922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->hDrcInfo, 17932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bs, 17942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pAacDecoderStaticChannelInfo, 17952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->pce.ElementInstanceTag, 17962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->chMapping, 17972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project aacChannels 17982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 17992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1801af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi /* Add additional concealment delay */ 1802af967fcc55656a0d3c2a05982713f1ca43c1252bJean-Michel Trivi self->streamInfo.outputDelay += CConcealment_GetDelay(&self->concealCommonData) * self->streamInfo.aacSamplesPerFrame; 18032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18048e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi /* Map DRC data to StreamInfo structure */ 18058e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi aacDecoder_drcGetInfo ( 18068e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi self->hDrcInfo, 18078e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi &self->streamInfo.drcPresMode, 18088e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi &self->streamInfo.drcProgRefLev 18098e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi ); 18108e087bf394c5ceddcdb8b1d029795aff3026eea0Jean-Michel Trivi 18112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Reorder channel type information tables. */ 18122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 181347c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi AUDIO_CHANNEL_TYPE types[(8)]; 181447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi UCHAR idx[(8)]; 18152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int c; 18162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(sizeof(self->channelType) == sizeof(types)); 18182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(sizeof(self->channelIndices) == sizeof(idx)); 18192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(types, self->channelType, sizeof(types)); 18212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(idx, self->channelIndices, sizeof(idx)); 18222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (c=0; c<aacChannels; c++) { 182447c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi self->channelType[self->channelOutputMapping[chOutMapIdx][c]] = types[c]; 182547c680c62246594107da0a8995c953dfb8040bceJean-Michel Trivi self->channelIndices[self->channelOutputMapping[chOutMapIdx][c]] = idx[c]; 18262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project self->blockNumber++; 18302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return ErrorStatus; 18322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 18332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 18352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief returns the streaminfo pointer 18362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The function hands back a pointer to the streaminfo structure 18382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return pointer to the struct 18402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 18412228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLINKSPEC_CPP CStreamInfo* CAacDecoder_GetStreamInfo ( HANDLE_AACDECODER self ) 18422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 18432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (!self) { 18442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return NULL; 18452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 18462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return &self->streamInfo; 18472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 18482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 18512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1852