1*e5436536SAndroid Build Coastguard Worker /* ----------------------------------------------------------------------------- 2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android 3*e5436536SAndroid Build Coastguard Worker 4*e5436536SAndroid Build Coastguard Worker © Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten 5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved. 6*e5436536SAndroid Build Coastguard Worker 7*e5436536SAndroid Build Coastguard Worker 1. INTRODUCTION 8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on 11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices. 12*e5436536SAndroid Build Coastguard Worker 13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing 15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely 16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG 17*e5436536SAndroid Build Coastguard Worker specifications. 18*e5436536SAndroid Build Coastguard Worker 19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including 20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing 21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for 22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant 23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of 24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or 25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may 26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those 27*e5436536SAndroid Build Coastguard Worker licensed purposes only. 28*e5436536SAndroid Build Coastguard Worker 29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions 30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are 31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications 32*e5436536SAndroid Build Coastguard Worker information and documentation. 33*e5436536SAndroid Build Coastguard Worker 34*e5436536SAndroid Build Coastguard Worker 2. COPYRIGHT LICENSE 35*e5436536SAndroid Build Coastguard Worker 36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification, 37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you 38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions: 39*e5436536SAndroid Build Coastguard Worker 40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of 41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form. 42*e5436536SAndroid Build Coastguard Worker 43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation 44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or 45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of 46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your 47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form. 48*e5436536SAndroid Build Coastguard Worker 49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived 50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission. 51*e5436536SAndroid Build Coastguard Worker 52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute 53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto. 54*e5436536SAndroid Build Coastguard Worker 55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating 56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions 57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android." 60*e5436536SAndroid Build Coastguard Worker 61*e5436536SAndroid Build Coastguard Worker 3. NO PATENT LICENSE 62*e5436536SAndroid Build Coastguard Worker 63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this 66*e5436536SAndroid Build Coastguard Worker software. 67*e5436536SAndroid Build Coastguard Worker 68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for 69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses. 70*e5436536SAndroid Build Coastguard Worker 71*e5436536SAndroid Build Coastguard Worker 4. DISCLAIMER 72*e5436536SAndroid Build Coastguard Worker 73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and 76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute 79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption, 80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict 81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of 82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage. 83*e5436536SAndroid Build Coastguard Worker 84*e5436536SAndroid Build Coastguard Worker 5. CONTACT INFORMATION 85*e5436536SAndroid Build Coastguard Worker 86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS 87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL 88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33 89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany 90*e5436536SAndroid Build Coastguard Worker 91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm 92*e5436536SAndroid Build Coastguard Worker [email protected] 93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */ 94*e5436536SAndroid Build Coastguard Worker 95*e5436536SAndroid Build Coastguard Worker /**************************** AAC decoder library ****************************** 96*e5436536SAndroid Build Coastguard Worker 97*e5436536SAndroid Build Coastguard Worker Author(s): Josef Hoepfl 98*e5436536SAndroid Build Coastguard Worker 99*e5436536SAndroid Build Coastguard Worker Description: 100*e5436536SAndroid Build Coastguard Worker 101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/ 102*e5436536SAndroid Build Coastguard Worker 103*e5436536SAndroid Build Coastguard Worker #ifndef AACDECODER_H 104*e5436536SAndroid Build Coastguard Worker #define AACDECODER_H 105*e5436536SAndroid Build Coastguard Worker 106*e5436536SAndroid Build Coastguard Worker #include "common_fix.h" 107*e5436536SAndroid Build Coastguard Worker 108*e5436536SAndroid Build Coastguard Worker #include "FDK_bitstream.h" 109*e5436536SAndroid Build Coastguard Worker 110*e5436536SAndroid Build Coastguard Worker #include "channel.h" 111*e5436536SAndroid Build Coastguard Worker 112*e5436536SAndroid Build Coastguard Worker #include "tpdec_lib.h" 113*e5436536SAndroid Build Coastguard Worker #include "FDK_audio.h" 114*e5436536SAndroid Build Coastguard Worker 115*e5436536SAndroid Build Coastguard Worker #include "block.h" 116*e5436536SAndroid Build Coastguard Worker 117*e5436536SAndroid Build Coastguard Worker #include "genericStds.h" 118*e5436536SAndroid Build Coastguard Worker 119*e5436536SAndroid Build Coastguard Worker #include "FDK_qmf_domain.h" 120*e5436536SAndroid Build Coastguard Worker 121*e5436536SAndroid Build Coastguard Worker #include "sbrdecoder.h" 122*e5436536SAndroid Build Coastguard Worker 123*e5436536SAndroid Build Coastguard Worker #include "aacdec_drc.h" 124*e5436536SAndroid Build Coastguard Worker 125*e5436536SAndroid Build Coastguard Worker #include "pcmdmx_lib.h" 126*e5436536SAndroid Build Coastguard Worker 127*e5436536SAndroid Build Coastguard Worker #include "FDK_drcDecLib.h" 128*e5436536SAndroid Build Coastguard Worker 129*e5436536SAndroid Build Coastguard Worker #include "limiter.h" 130*e5436536SAndroid Build Coastguard Worker 131*e5436536SAndroid Build Coastguard Worker #include "FDK_delay.h" 132*e5436536SAndroid Build Coastguard Worker 133*e5436536SAndroid Build Coastguard Worker #define TIME_DATA_FLUSH_SIZE (128) 134*e5436536SAndroid Build Coastguard Worker #define TIME_DATA_FLUSH_SIZE_SF (7) 135*e5436536SAndroid Build Coastguard Worker 136*e5436536SAndroid Build Coastguard Worker #define AACDEC_MAX_NUM_PREROLL_AU_USAC (3) 137*e5436536SAndroid Build Coastguard Worker #if (AACDEC_MAX_NUM_PREROLL_AU < 3) 138*e5436536SAndroid Build Coastguard Worker #undef AACDEC_MAX_NUM_PREROLL_AU 139*e5436536SAndroid Build Coastguard Worker #define AACDEC_MAX_NUM_PREROLL_AU AACDEC_MAX_NUM_PREROLL_AU_USAC 140*e5436536SAndroid Build Coastguard Worker #endif 141*e5436536SAndroid Build Coastguard Worker 142*e5436536SAndroid Build Coastguard Worker typedef struct AAC_DECODER_INSTANCE *HANDLE_AACDECODER; 143*e5436536SAndroid Build Coastguard Worker 144*e5436536SAndroid Build Coastguard Worker enum { L = 0, R = 1 }; 145*e5436536SAndroid Build Coastguard Worker 146*e5436536SAndroid Build Coastguard Worker typedef struct { 147*e5436536SAndroid Build Coastguard Worker unsigned char *buffer; 148*e5436536SAndroid Build Coastguard Worker int bufferSize; 149*e5436536SAndroid Build Coastguard Worker int offset[8]; 150*e5436536SAndroid Build Coastguard Worker int nrElements; 151*e5436536SAndroid Build Coastguard Worker } CAncData; 152*e5436536SAndroid Build Coastguard Worker 153*e5436536SAndroid Build Coastguard Worker typedef enum { NOT_DEFINED = -1, MODE_HQ = 0, MODE_LP = 1 } QMF_MODE; 154*e5436536SAndroid Build Coastguard Worker 155*e5436536SAndroid Build Coastguard Worker typedef struct { 156*e5436536SAndroid Build Coastguard Worker int bsDelay; 157*e5436536SAndroid Build Coastguard Worker } SBR_PARAMS; 158*e5436536SAndroid Build Coastguard Worker 159*e5436536SAndroid Build Coastguard Worker enum { 160*e5436536SAndroid Build Coastguard Worker AACDEC_FLUSH_OFF = 0, 161*e5436536SAndroid Build Coastguard Worker AACDEC_RSV60_CFG_CHANGE_ATSC_FLUSH_ON = 1, 162*e5436536SAndroid Build Coastguard Worker AACDEC_RSV60_DASH_IPF_ATSC_FLUSH_ON = 2, 163*e5436536SAndroid Build Coastguard Worker AACDEC_USAC_DASH_IPF_FLUSH_ON = 3 164*e5436536SAndroid Build Coastguard Worker }; 165*e5436536SAndroid Build Coastguard Worker 166*e5436536SAndroid Build Coastguard Worker enum { 167*e5436536SAndroid Build Coastguard Worker AACDEC_BUILD_UP_OFF = 0, 168*e5436536SAndroid Build Coastguard Worker AACDEC_RSV60_BUILD_UP_ON = 1, 169*e5436536SAndroid Build Coastguard Worker AACDEC_RSV60_BUILD_UP_ON_IN_BAND = 2, 170*e5436536SAndroid Build Coastguard Worker AACDEC_USAC_BUILD_UP_ON = 3, 171*e5436536SAndroid Build Coastguard Worker AACDEC_RSV60_BUILD_UP_IDLE = 4, 172*e5436536SAndroid Build Coastguard Worker AACDEC_RSV60_BUILD_UP_IDLE_IN_BAND = 5 173*e5436536SAndroid Build Coastguard Worker }; 174*e5436536SAndroid Build Coastguard Worker 175*e5436536SAndroid Build Coastguard Worker #define AACDEC_CROSSFADE_BITMASK_OFF \ 176*e5436536SAndroid Build Coastguard Worker ((UCHAR)0) /*!< No cross-fade between frames shall be applied at next \ 177*e5436536SAndroid Build Coastguard Worker config change. */ 178*e5436536SAndroid Build Coastguard Worker #define AACDEC_CROSSFADE_BITMASK_PREROLL \ 179*e5436536SAndroid Build Coastguard Worker ((UCHAR)1 << 1) /*!< applyCrossfade is signaled in AudioPreRoll */ 180*e5436536SAndroid Build Coastguard Worker 181*e5436536SAndroid Build Coastguard Worker typedef struct { 182*e5436536SAndroid Build Coastguard Worker /* Usac Extension Elements */ 183*e5436536SAndroid Build Coastguard Worker USAC_EXT_ELEMENT_TYPE usacExtElementType[(3)]; 184*e5436536SAndroid Build Coastguard Worker UINT usacExtElementDefaultLength[(3)]; 185*e5436536SAndroid Build Coastguard Worker UCHAR usacExtElementPayloadFrag[(3)]; 186*e5436536SAndroid Build Coastguard Worker } CUsacCoreExtensions; 187*e5436536SAndroid Build Coastguard Worker 188*e5436536SAndroid Build Coastguard Worker /* AAC decoder (opaque toward userland) struct declaration */ 189*e5436536SAndroid Build Coastguard Worker struct AAC_DECODER_INSTANCE { 190*e5436536SAndroid Build Coastguard Worker INT aacChannels; /*!< Amount of AAC decoder channels allocated. */ 191*e5436536SAndroid Build Coastguard Worker INT ascChannels[(1 * 192*e5436536SAndroid Build Coastguard Worker 1)]; /*!< Amount of AAC decoder channels signalled in ASC. */ 193*e5436536SAndroid Build Coastguard Worker INT blockNumber; /*!< frame counter */ 194*e5436536SAndroid Build Coastguard Worker 195*e5436536SAndroid Build Coastguard Worker INT nrOfLayers; 196*e5436536SAndroid Build Coastguard Worker 197*e5436536SAndroid Build Coastguard Worker INT outputInterleaved; /*!< PCM output format (interleaved/none interleaved). 198*e5436536SAndroid Build Coastguard Worker */ 199*e5436536SAndroid Build Coastguard Worker 200*e5436536SAndroid Build Coastguard Worker INT aacOutDataHeadroom; /*!< Headroom of the output time signal to prevent 201*e5436536SAndroid Build Coastguard Worker clipping */ 202*e5436536SAndroid Build Coastguard Worker 203*e5436536SAndroid Build Coastguard Worker HANDLE_TRANSPORTDEC hInput; /*!< Transport layer handle. */ 204*e5436536SAndroid Build Coastguard Worker 205*e5436536SAndroid Build Coastguard Worker SamplingRateInfo 206*e5436536SAndroid Build Coastguard Worker samplingRateInfo[(1 * 1)]; /*!< Sampling Rate information table */ 207*e5436536SAndroid Build Coastguard Worker 208*e5436536SAndroid Build Coastguard Worker UCHAR 209*e5436536SAndroid Build Coastguard Worker frameOK; /*!< Will be unset if a consistency check, e.g. CRC etc. fails */ 210*e5436536SAndroid Build Coastguard Worker 211*e5436536SAndroid Build Coastguard Worker UINT flags[(1 * 1)]; /*!< Flags for internal decoder use. DO NOT USE 212*e5436536SAndroid Build Coastguard Worker self::streaminfo::flags ! */ 213*e5436536SAndroid Build Coastguard Worker UINT elFlags[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 214*e5436536SAndroid Build Coastguard Worker 1)]; /*!< Flags for internal decoder use (element specific). DO 215*e5436536SAndroid Build Coastguard Worker NOT USE self::streaminfo::flags ! */ 216*e5436536SAndroid Build Coastguard Worker 217*e5436536SAndroid Build Coastguard Worker MP4_ELEMENT_ID elements[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 218*e5436536SAndroid Build Coastguard Worker 1)]; /*!< Table where the element Id's are listed */ 219*e5436536SAndroid Build Coastguard Worker UCHAR elTags[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 220*e5436536SAndroid Build Coastguard Worker 1)]; /*!< Table where the elements id Tags are listed */ 221*e5436536SAndroid Build Coastguard Worker UCHAR chMapping[((8) * 2)]; /*!< Table of MPEG canonical order to bitstream 222*e5436536SAndroid Build Coastguard Worker channel order mapping. */ 223*e5436536SAndroid Build Coastguard Worker 224*e5436536SAndroid Build Coastguard Worker AUDIO_CHANNEL_TYPE channelType[(8)]; /*!< Audio channel type of each output 225*e5436536SAndroid Build Coastguard Worker audio channel (from 0 upto 226*e5436536SAndroid Build Coastguard Worker numChannels). */ 227*e5436536SAndroid Build Coastguard Worker UCHAR channelIndices[(8)]; /*!< Audio channel index for each output audio 228*e5436536SAndroid Build Coastguard Worker channel (from 0 upto numChannels). */ 229*e5436536SAndroid Build Coastguard Worker /* See ISO/IEC 13818-7:2005(E), 8.5.3.2 Explicit channel mapping using a 230*e5436536SAndroid Build Coastguard Worker * program_config_element() */ 231*e5436536SAndroid Build Coastguard Worker 232*e5436536SAndroid Build Coastguard Worker FDK_channelMapDescr mapDescr; /*!< Describes the output channel mapping. */ 233*e5436536SAndroid Build Coastguard Worker UCHAR chMapIndex; /*!< Index to access one line of the channelOutputMapping 234*e5436536SAndroid Build Coastguard Worker table. This is required because not all 8 channel 235*e5436536SAndroid Build Coastguard Worker configurations have the same output mapping. */ 236*e5436536SAndroid Build Coastguard Worker INT sbrDataLen; /*!< Expected length of the SBR remaining in bitbuffer after 237*e5436536SAndroid Build Coastguard Worker the AAC payload has been pared. */ 238*e5436536SAndroid Build Coastguard Worker 239*e5436536SAndroid Build Coastguard Worker CProgramConfig pce; 240*e5436536SAndroid Build Coastguard Worker CStreamInfo 241*e5436536SAndroid Build Coastguard Worker streamInfo; /*!< Pointer to StreamInfo data (read from the bitstream) */ 242*e5436536SAndroid Build Coastguard Worker CAacDecoderChannelInfo 243*e5436536SAndroid Build Coastguard Worker *pAacDecoderChannelInfo[(8)]; /*!< Temporal channel memory */ 244*e5436536SAndroid Build Coastguard Worker CAacDecoderStaticChannelInfo 245*e5436536SAndroid Build Coastguard Worker *pAacDecoderStaticChannelInfo[(8)]; /*!< Persistent channel memory */ 246*e5436536SAndroid Build Coastguard Worker 247*e5436536SAndroid Build Coastguard Worker FIXP_DBL *workBufferCore1; 248*e5436536SAndroid Build Coastguard Worker FIXP_DBL *workBufferCore2; 249*e5436536SAndroid Build Coastguard Worker PCM_DEC *pTimeData2; 250*e5436536SAndroid Build Coastguard Worker INT timeData2Size; 251*e5436536SAndroid Build Coastguard Worker 252*e5436536SAndroid Build Coastguard Worker CpePersistentData *cpeStaticData[( 253*e5436536SAndroid Build Coastguard Worker 3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 254*e5436536SAndroid Build Coastguard Worker 1)]; /*!< Pointer to persistent data shared by both channels of a CPE. 255*e5436536SAndroid Build Coastguard Worker This structure is allocated once for each CPE. */ 256*e5436536SAndroid Build Coastguard Worker 257*e5436536SAndroid Build Coastguard Worker CConcealParams concealCommonData; 258*e5436536SAndroid Build Coastguard Worker CConcealmentMethod concealMethodUser; 259*e5436536SAndroid Build Coastguard Worker 260*e5436536SAndroid Build Coastguard Worker CUsacCoreExtensions usacCoreExt; /*!< Data and handles to extend USAC FD/LPD 261*e5436536SAndroid Build Coastguard Worker core decoder (SBR, MPS, ...) */ 262*e5436536SAndroid Build Coastguard Worker UINT numUsacElements[(1 * 1)]; 263*e5436536SAndroid Build Coastguard Worker UCHAR usacStereoConfigIndex[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 1)]; 264*e5436536SAndroid Build Coastguard Worker const CSUsacConfig *pUsacConfig[(1 * 1)]; 265*e5436536SAndroid Build Coastguard Worker INT nbDiv; /*!< number of frame divisions in LPD-domain */ 266*e5436536SAndroid Build Coastguard Worker 267*e5436536SAndroid Build Coastguard Worker UCHAR useLdQmfTimeAlign; 268*e5436536SAndroid Build Coastguard Worker 269*e5436536SAndroid Build Coastguard Worker INT aacChannelsPrev; /*!< The amount of AAC core channels of the last 270*e5436536SAndroid Build Coastguard Worker successful decode call. */ 271*e5436536SAndroid Build Coastguard Worker AUDIO_CHANNEL_TYPE channelTypePrev[(8)]; /*!< Array holding the channelType 272*e5436536SAndroid Build Coastguard Worker values of the last successful 273*e5436536SAndroid Build Coastguard Worker decode call. */ 274*e5436536SAndroid Build Coastguard Worker UCHAR 275*e5436536SAndroid Build Coastguard Worker channelIndicesPrev[(8)]; /*!< Array holding the channelIndices values of 276*e5436536SAndroid Build Coastguard Worker the last successful decode call. */ 277*e5436536SAndroid Build Coastguard Worker 278*e5436536SAndroid Build Coastguard Worker UCHAR 279*e5436536SAndroid Build Coastguard Worker downscaleFactor; /*!< Variable to store a supported ELD downscale factor 280*e5436536SAndroid Build Coastguard Worker of 1, 2, 3 or 4 */ 281*e5436536SAndroid Build Coastguard Worker UCHAR downscaleFactorInBS; /*!< Variable to store the (not necessarily 282*e5436536SAndroid Build Coastguard Worker supported) ELD downscale factor discovered in 283*e5436536SAndroid Build Coastguard Worker the bitstream */ 284*e5436536SAndroid Build Coastguard Worker 285*e5436536SAndroid Build Coastguard Worker HANDLE_SBRDECODER hSbrDecoder; /*!< SBR decoder handle. */ 286*e5436536SAndroid Build Coastguard Worker UCHAR sbrEnabled; /*!< flag to store if SBR has been detected */ 287*e5436536SAndroid Build Coastguard Worker UCHAR sbrEnabledPrev; /*!< flag to store if SBR has been detected from 288*e5436536SAndroid Build Coastguard Worker previous frame */ 289*e5436536SAndroid Build Coastguard Worker UCHAR psPossible; /*!< flag to store if PS is possible */ 290*e5436536SAndroid Build Coastguard Worker SBR_PARAMS sbrParams; /*!< struct to store all sbr parameters */ 291*e5436536SAndroid Build Coastguard Worker 292*e5436536SAndroid Build Coastguard Worker UCHAR *pDrmBsBuffer; /*!< Pointer to dynamic buffer which is used to reverse 293*e5436536SAndroid Build Coastguard Worker the bits of the DRM SBR payload */ 294*e5436536SAndroid Build Coastguard Worker USHORT drmBsBufferSize; /*!< Size of the dynamic buffer which is used to 295*e5436536SAndroid Build Coastguard Worker reverse the bits of the DRM SBR payload */ 296*e5436536SAndroid Build Coastguard Worker FDK_QMF_DOMAIN 297*e5436536SAndroid Build Coastguard Worker qmfDomain; /*!< Instance of module for QMF domain data handling */ 298*e5436536SAndroid Build Coastguard Worker 299*e5436536SAndroid Build Coastguard Worker QMF_MODE qmfModeCurr; /*!< The current QMF mode */ 300*e5436536SAndroid Build Coastguard Worker QMF_MODE qmfModeUser; /*!< The QMF mode requested by the library user */ 301*e5436536SAndroid Build Coastguard Worker 302*e5436536SAndroid Build Coastguard Worker HANDLE_AAC_DRC hDrcInfo; /*!< handle to DRC data structure */ 303*e5436536SAndroid Build Coastguard Worker INT metadataExpiry; /*!< Metadata expiry time in milli-seconds. */ 304*e5436536SAndroid Build Coastguard Worker 305*e5436536SAndroid Build Coastguard Worker void *pMpegSurroundDecoder; /*!< pointer to mpeg surround decoder structure */ 306*e5436536SAndroid Build Coastguard Worker UCHAR mpsEnableUser; /*!< MPS enable user flag */ 307*e5436536SAndroid Build Coastguard Worker UCHAR mpsEnableCurr; /*!< MPS enable decoder state */ 308*e5436536SAndroid Build Coastguard Worker UCHAR mpsApplicable; /*!< MPS applicable */ 309*e5436536SAndroid Build Coastguard Worker SCHAR mpsOutputMode; /*!< setting: normal = 0, binaural = 1, stereo = 2, 5.1ch 310*e5436536SAndroid Build Coastguard Worker = 3 */ 311*e5436536SAndroid Build Coastguard Worker INT mpsOutChannelsLast; /*!< The amount of channels returned by the last 312*e5436536SAndroid Build Coastguard Worker successful MPS decoder call. */ 313*e5436536SAndroid Build Coastguard Worker INT mpsFrameSizeLast; /*!< The frame length returned by the last successful 314*e5436536SAndroid Build Coastguard Worker MPS decoder call. */ 315*e5436536SAndroid Build Coastguard Worker 316*e5436536SAndroid Build Coastguard Worker CAncData ancData; /*!< structure to handle ancillary data */ 317*e5436536SAndroid Build Coastguard Worker 318*e5436536SAndroid Build Coastguard Worker HANDLE_PCM_DOWNMIX hPcmUtils; /*!< privat data for the PCM utils. */ 319*e5436536SAndroid Build Coastguard Worker 320*e5436536SAndroid Build Coastguard Worker TDLimiterPtr hLimiter; /*!< Handle of time domain limiter. */ 321*e5436536SAndroid Build Coastguard Worker UCHAR limiterEnableUser; /*!< The limiter configuration requested by the 322*e5436536SAndroid Build Coastguard Worker library user */ 323*e5436536SAndroid Build Coastguard Worker UCHAR limiterEnableCurr; /*!< The current limiter configuration. */ 324*e5436536SAndroid Build Coastguard Worker 325*e5436536SAndroid Build Coastguard Worker FIXP_DBL extGain[1]; /*!< Gain that must be applied to the output signal. */ 326*e5436536SAndroid Build Coastguard Worker UINT extGainDelay; /*!< Delay that must be accounted for extGain. */ 327*e5436536SAndroid Build Coastguard Worker 328*e5436536SAndroid Build Coastguard Worker HANDLE_DRC_DECODER hUniDrcDecoder; 329*e5436536SAndroid Build Coastguard Worker UCHAR multibandDrcPresent; 330*e5436536SAndroid Build Coastguard Worker UCHAR numTimeSlots; 331*e5436536SAndroid Build Coastguard Worker UINT loudnessInfoSetPosition[3]; 332*e5436536SAndroid Build Coastguard Worker SCHAR defaultTargetLoudness; 333*e5436536SAndroid Build Coastguard Worker 334*e5436536SAndroid Build Coastguard Worker PCM_DEC 335*e5436536SAndroid Build Coastguard Worker *pTimeDataFlush[((8) * 2)]; /*!< Pointer to the flushed time data which 336*e5436536SAndroid Build Coastguard Worker will be used for the crossfade in case of 337*e5436536SAndroid Build Coastguard Worker an USAC DASH IPF config change */ 338*e5436536SAndroid Build Coastguard Worker 339*e5436536SAndroid Build Coastguard Worker UCHAR flushStatus; /*!< Indicates flush status: on|off */ 340*e5436536SAndroid Build Coastguard Worker SCHAR flushCnt; /*!< Flush frame counter */ 341*e5436536SAndroid Build Coastguard Worker UCHAR buildUpStatus; /*!< Indicates build up status: on|off */ 342*e5436536SAndroid Build Coastguard Worker SCHAR buildUpCnt; /*!< Build up frame counter */ 343*e5436536SAndroid Build Coastguard Worker UCHAR hasAudioPreRoll; /*!< Indicates preRoll status: on|off */ 344*e5436536SAndroid Build Coastguard Worker UINT prerollAULength[AACDEC_MAX_NUM_PREROLL_AU + 1]; /*!< Relative offset of 345*e5436536SAndroid Build Coastguard Worker the prerollAU end 346*e5436536SAndroid Build Coastguard Worker position to the AU 347*e5436536SAndroid Build Coastguard Worker start position in the 348*e5436536SAndroid Build Coastguard Worker bitstream */ 349*e5436536SAndroid Build Coastguard Worker INT accessUnit; /*!< Number of the actual processed preroll accessUnit */ 350*e5436536SAndroid Build Coastguard Worker UCHAR applyCrossfade; /*!< If any bit is set, cross-fade for seamless stream 351*e5436536SAndroid Build Coastguard Worker switching is applied */ 352*e5436536SAndroid Build Coastguard Worker 353*e5436536SAndroid Build Coastguard Worker FDK_SignalDelay usacResidualDelay; /*!< Delay residual signal to compensate 354*e5436536SAndroid Build Coastguard Worker for eSBR delay of DMX signal in case of 355*e5436536SAndroid Build Coastguard Worker stereoConfigIndex==2. */ 356*e5436536SAndroid Build Coastguard Worker }; 357*e5436536SAndroid Build Coastguard Worker 358*e5436536SAndroid Build Coastguard Worker #define AAC_DEBUG_EXTHLP \ 359*e5436536SAndroid Build Coastguard Worker "\ 360*e5436536SAndroid Build Coastguard Worker --- AAC-Core ---\n\ 361*e5436536SAndroid Build Coastguard Worker 0x00010000 Header data\n\ 362*e5436536SAndroid Build Coastguard Worker 0x00020000 CRC data\n\ 363*e5436536SAndroid Build Coastguard Worker 0x00040000 Channel info\n\ 364*e5436536SAndroid Build Coastguard Worker 0x00080000 Section data\n\ 365*e5436536SAndroid Build Coastguard Worker 0x00100000 Scalefactor data\n\ 366*e5436536SAndroid Build Coastguard Worker 0x00200000 Pulse data\n\ 367*e5436536SAndroid Build Coastguard Worker 0x00400000 Tns data\n\ 368*e5436536SAndroid Build Coastguard Worker 0x00800000 Quantized spectrum\n\ 369*e5436536SAndroid Build Coastguard Worker 0x01000000 Requantized spectrum\n\ 370*e5436536SAndroid Build Coastguard Worker 0x02000000 Time output\n\ 371*e5436536SAndroid Build Coastguard Worker 0x04000000 Fatal errors\n\ 372*e5436536SAndroid Build Coastguard Worker 0x08000000 Buffer fullness\n\ 373*e5436536SAndroid Build Coastguard Worker 0x10000000 Average bitrate\n\ 374*e5436536SAndroid Build Coastguard Worker 0x20000000 Synchronization\n\ 375*e5436536SAndroid Build Coastguard Worker 0x40000000 Concealment\n\ 376*e5436536SAndroid Build Coastguard Worker 0x7FFF0000 all AAC-Core-Info\n\ 377*e5436536SAndroid Build Coastguard Worker " 378*e5436536SAndroid Build Coastguard Worker 379*e5436536SAndroid Build Coastguard Worker /** 380*e5436536SAndroid Build Coastguard Worker * \brief Synchronise QMF mode for all modules using QMF data. 381*e5436536SAndroid Build Coastguard Worker * \param self decoder handle 382*e5436536SAndroid Build Coastguard Worker */ 383*e5436536SAndroid Build Coastguard Worker void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self); 384*e5436536SAndroid Build Coastguard Worker 385*e5436536SAndroid Build Coastguard Worker /** 386*e5436536SAndroid Build Coastguard Worker * \brief Signal a bit stream interruption to the decoder 387*e5436536SAndroid Build Coastguard Worker * \param self decoder handle 388*e5436536SAndroid Build Coastguard Worker */ 389*e5436536SAndroid Build Coastguard Worker void CAacDecoder_SignalInterruption(HANDLE_AACDECODER self); 390*e5436536SAndroid Build Coastguard Worker 391*e5436536SAndroid Build Coastguard Worker /*! 392*e5436536SAndroid Build Coastguard Worker \brief Initialize ancillary buffer 393*e5436536SAndroid Build Coastguard Worker 394*e5436536SAndroid Build Coastguard Worker \ancData Pointer to ancillary data structure 395*e5436536SAndroid Build Coastguard Worker \buffer Pointer to (external) anc data buffer 396*e5436536SAndroid Build Coastguard Worker \size Size of the buffer pointed on by buffer 397*e5436536SAndroid Build Coastguard Worker 398*e5436536SAndroid Build Coastguard Worker \return Error code 399*e5436536SAndroid Build Coastguard Worker */ 400*e5436536SAndroid Build Coastguard Worker AAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData, 401*e5436536SAndroid Build Coastguard Worker unsigned char *buffer, int size); 402*e5436536SAndroid Build Coastguard Worker 403*e5436536SAndroid Build Coastguard Worker /*! 404*e5436536SAndroid Build Coastguard Worker \brief Get one ancillary data element 405*e5436536SAndroid Build Coastguard Worker 406*e5436536SAndroid Build Coastguard Worker \ancData Pointer to ancillary data structure 407*e5436536SAndroid Build Coastguard Worker \index Index of the anc data element to get 408*e5436536SAndroid Build Coastguard Worker \ptr Pointer to a buffer receiving a pointer to the requested anc data element 409*e5436536SAndroid Build Coastguard Worker \size Pointer to a buffer receiving the length of the requested anc data 410*e5436536SAndroid Build Coastguard Worker element 411*e5436536SAndroid Build Coastguard Worker 412*e5436536SAndroid Build Coastguard Worker \return Error code 413*e5436536SAndroid Build Coastguard Worker */ 414*e5436536SAndroid Build Coastguard Worker AAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index, 415*e5436536SAndroid Build Coastguard Worker unsigned char **ptr, int *size); 416*e5436536SAndroid Build Coastguard Worker 417*e5436536SAndroid Build Coastguard Worker /* initialization of aac decoder */ 418*e5436536SAndroid Build Coastguard Worker LINKSPEC_H HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat); 419*e5436536SAndroid Build Coastguard Worker 420*e5436536SAndroid Build Coastguard Worker /* Initialization of channel elements */ 421*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, 422*e5436536SAndroid Build Coastguard Worker const CSAudioSpecificConfig *asc, 423*e5436536SAndroid Build Coastguard Worker UCHAR configMode, 424*e5436536SAndroid Build Coastguard Worker UCHAR *configChanged); 425*e5436536SAndroid Build Coastguard Worker /*! 426*e5436536SAndroid Build Coastguard Worker \brief Decodes one aac frame 427*e5436536SAndroid Build Coastguard Worker 428*e5436536SAndroid Build Coastguard Worker The function decodes one aac frame. The decoding of coupling channel 429*e5436536SAndroid Build Coastguard Worker elements are not supported. The transport layer might signal, that the 430*e5436536SAndroid Build Coastguard Worker data of the current frame is invalid, e.g. as a result of a packet 431*e5436536SAndroid Build Coastguard Worker loss in streaming mode. 432*e5436536SAndroid Build Coastguard Worker The bitstream position of transportDec_GetBitstream(self->hInput) must 433*e5436536SAndroid Build Coastguard Worker be exactly the end of the access unit, including all byte alignment bits. 434*e5436536SAndroid Build Coastguard Worker For this purpose, the variable auStartAnchor is used. 435*e5436536SAndroid Build Coastguard Worker 436*e5436536SAndroid Build Coastguard Worker \return error status 437*e5436536SAndroid Build Coastguard Worker */ 438*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_DecodeFrame( 439*e5436536SAndroid Build Coastguard Worker HANDLE_AACDECODER self, const UINT flags, PCM_DEC *pTimeData, 440*e5436536SAndroid Build Coastguard Worker const INT timeDataSize, const int timeDataChannelOffset); 441*e5436536SAndroid Build Coastguard Worker 442*e5436536SAndroid Build Coastguard Worker /* Free config dependent AAC memory */ 443*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_FreeMem(HANDLE_AACDECODER self, 444*e5436536SAndroid Build Coastguard Worker const int subStreamIndex); 445*e5436536SAndroid Build Coastguard Worker 446*e5436536SAndroid Build Coastguard Worker /* Prepare crossfade for USAC DASH IPF config change */ 447*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_PrepareCrossFade( 448*e5436536SAndroid Build Coastguard Worker const PCM_DEC *pTimeData, PCM_DEC **pTimeDataFlush, const INT numChannels, 449*e5436536SAndroid Build Coastguard Worker const INT frameSize, const INT interleaved); 450*e5436536SAndroid Build Coastguard Worker 451*e5436536SAndroid Build Coastguard Worker /* Apply crossfade for USAC DASH IPF config change */ 452*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_ApplyCrossFade( 453*e5436536SAndroid Build Coastguard Worker PCM_DEC *pTimeData, PCM_DEC **pTimeDataFlush, const INT numChannels, 454*e5436536SAndroid Build Coastguard Worker const INT frameSize, const INT interleaved); 455*e5436536SAndroid Build Coastguard Worker 456*e5436536SAndroid Build Coastguard Worker /* Set flush and build up mode */ 457*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_CtrlCFGChange(HANDLE_AACDECODER self, 458*e5436536SAndroid Build Coastguard Worker UCHAR flushStatus, 459*e5436536SAndroid Build Coastguard Worker SCHAR flushCnt, 460*e5436536SAndroid Build Coastguard Worker UCHAR buildUpStatus, 461*e5436536SAndroid Build Coastguard Worker SCHAR buildUpCnt); 462*e5436536SAndroid Build Coastguard Worker 463*e5436536SAndroid Build Coastguard Worker /* Parse preRoll Extension Payload */ 464*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_PreRollExtensionPayloadParse( 465*e5436536SAndroid Build Coastguard Worker HANDLE_AACDECODER self, UINT *numPrerollAU, UINT *prerollAUOffset, 466*e5436536SAndroid Build Coastguard Worker UINT *prerollAULength); 467*e5436536SAndroid Build Coastguard Worker 468*e5436536SAndroid Build Coastguard Worker /* Destroy aac decoder */ 469*e5436536SAndroid Build Coastguard Worker LINKSPEC_H void CAacDecoder_Close(HANDLE_AACDECODER self); 470*e5436536SAndroid Build Coastguard Worker 471*e5436536SAndroid Build Coastguard Worker /* get streaminfo handle from decoder */ 472*e5436536SAndroid Build Coastguard Worker LINKSPEC_H CStreamInfo *CAacDecoder_GetStreamInfo(HANDLE_AACDECODER self); 473*e5436536SAndroid Build Coastguard Worker 474*e5436536SAndroid Build Coastguard Worker #endif /* #ifndef AACDECODER_H */ 475