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 - 2018 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 /**************************** SBR decoder library ****************************** 96*e5436536SAndroid Build Coastguard Worker 97*e5436536SAndroid Build Coastguard Worker Author(s): 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 /*! 104*e5436536SAndroid Build Coastguard Worker \file 105*e5436536SAndroid Build Coastguard Worker \brief Envelope extraction prototypes 106*e5436536SAndroid Build Coastguard Worker */ 107*e5436536SAndroid Build Coastguard Worker 108*e5436536SAndroid Build Coastguard Worker #ifndef ENV_EXTR_H 109*e5436536SAndroid Build Coastguard Worker #define ENV_EXTR_H 110*e5436536SAndroid Build Coastguard Worker 111*e5436536SAndroid Build Coastguard Worker #include "sbrdecoder.h" 112*e5436536SAndroid Build Coastguard Worker 113*e5436536SAndroid Build Coastguard Worker #include "FDK_bitstream.h" 114*e5436536SAndroid Build Coastguard Worker #include "lpp_tran.h" 115*e5436536SAndroid Build Coastguard Worker 116*e5436536SAndroid Build Coastguard Worker #include "psdec.h" 117*e5436536SAndroid Build Coastguard Worker #include "pvc_dec.h" 118*e5436536SAndroid Build Coastguard Worker 119*e5436536SAndroid Build Coastguard Worker #define ENV_EXP_FRACT 0 120*e5436536SAndroid Build Coastguard Worker /*!< Shift raw envelope data to support fractional numbers. 121*e5436536SAndroid Build Coastguard Worker Can be set to 8 instead of 0 to enhance accuracy during concealment. 122*e5436536SAndroid Build Coastguard Worker This is not required for conformance and #requantizeEnvelopeData() will 123*e5436536SAndroid Build Coastguard Worker become more expensive. 124*e5436536SAndroid Build Coastguard Worker */ 125*e5436536SAndroid Build Coastguard Worker 126*e5436536SAndroid Build Coastguard Worker #define EXP_BITS 6 127*e5436536SAndroid Build Coastguard Worker /*!< Size of exponent-part of a pseudo float envelope value (should be at least 128*e5436536SAndroid Build Coastguard Worker 6). The remaining bits in each word are used for the mantissa (should be at 129*e5436536SAndroid Build Coastguard Worker least 10). This format is used in the arrays iEnvelope[] and 130*e5436536SAndroid Build Coastguard Worker sbrNoiseFloorLevel[] in the FRAME_DATA struct which must fit in a certain part 131*e5436536SAndroid Build Coastguard Worker of the output buffer (See buffer management in sbr_dec.cpp). Exponents and 132*e5436536SAndroid Build Coastguard Worker mantissas could also be stored in separate arrays. Accessing the exponent or 133*e5436536SAndroid Build Coastguard Worker the mantissa would be simplified and the masks #MASK_E resp. #MASK_M would 134*e5436536SAndroid Build Coastguard Worker no longer be required. 135*e5436536SAndroid Build Coastguard Worker */ 136*e5436536SAndroid Build Coastguard Worker 137*e5436536SAndroid Build Coastguard Worker #define MASK_M \ 138*e5436536SAndroid Build Coastguard Worker (((1 << (FRACT_BITS - EXP_BITS)) - 1) \ 139*e5436536SAndroid Build Coastguard Worker << EXP_BITS) /*!< Mask for extracting the mantissa of a pseudo float \ 140*e5436536SAndroid Build Coastguard Worker envelope value */ 141*e5436536SAndroid Build Coastguard Worker #define MASK_E \ 142*e5436536SAndroid Build Coastguard Worker ((1 << EXP_BITS) - 1) /*!< Mask for extracting the exponent of a pseudo \ 143*e5436536SAndroid Build Coastguard Worker float envelope value */ 144*e5436536SAndroid Build Coastguard Worker 145*e5436536SAndroid Build Coastguard Worker #define SIGN_EXT \ 146*e5436536SAndroid Build Coastguard Worker (((SCHAR)-1) ^ \ 147*e5436536SAndroid Build Coastguard Worker MASK_E) /*!< a CHAR-constant with all bits above our sign-bit set */ 148*e5436536SAndroid Build Coastguard Worker #define ROUNDING \ 149*e5436536SAndroid Build Coastguard Worker ((FIXP_SGL)( \ 150*e5436536SAndroid Build Coastguard Worker 1 << (EXP_BITS - 1))) /*!< 0.5-offset for rounding the mantissa of a \ 151*e5436536SAndroid Build Coastguard Worker pseudo-float envelope value */ 152*e5436536SAndroid Build Coastguard Worker #define NRG_EXP_OFFSET \ 153*e5436536SAndroid Build Coastguard Worker 16 /*!< Will be added to the reference energy's exponent to prevent negative \ 154*e5436536SAndroid Build Coastguard Worker numbers */ 155*e5436536SAndroid Build Coastguard Worker #define NOISE_EXP_OFFSET \ 156*e5436536SAndroid Build Coastguard Worker 38 /*!< Will be added to the noise level exponent to prevent negative \ 157*e5436536SAndroid Build Coastguard Worker numbers */ 158*e5436536SAndroid Build Coastguard Worker 159*e5436536SAndroid Build Coastguard Worker #define ADD_HARMONICS_FLAGS_SIZE 2 /* ceil(MAX_FREQ_COEFFS/32) */ 160*e5436536SAndroid Build Coastguard Worker 161*e5436536SAndroid Build Coastguard Worker typedef enum { 162*e5436536SAndroid Build Coastguard Worker HEADER_NOT_PRESENT, 163*e5436536SAndroid Build Coastguard Worker HEADER_ERROR, 164*e5436536SAndroid Build Coastguard Worker HEADER_OK, 165*e5436536SAndroid Build Coastguard Worker HEADER_RESET 166*e5436536SAndroid Build Coastguard Worker } SBR_HEADER_STATUS; 167*e5436536SAndroid Build Coastguard Worker 168*e5436536SAndroid Build Coastguard Worker typedef enum { 169*e5436536SAndroid Build Coastguard Worker SBR_NOT_INITIALIZED = 0, 170*e5436536SAndroid Build Coastguard Worker UPSAMPLING = 1, 171*e5436536SAndroid Build Coastguard Worker SBR_HEADER = 2, 172*e5436536SAndroid Build Coastguard Worker SBR_ACTIVE = 3 173*e5436536SAndroid Build Coastguard Worker } SBR_SYNC_STATE; 174*e5436536SAndroid Build Coastguard Worker 175*e5436536SAndroid Build Coastguard Worker typedef enum { COUPLING_OFF = 0, COUPLING_LEVEL, COUPLING_BAL } COUPLING_MODE; 176*e5436536SAndroid Build Coastguard Worker 177*e5436536SAndroid Build Coastguard Worker typedef struct { 178*e5436536SAndroid Build Coastguard Worker UCHAR nSfb[2]; /*!< Number of SBR-bands for low and high freq-resolution */ 179*e5436536SAndroid Build Coastguard Worker UCHAR nNfb; /*!< Actual number of noise bands to read from the bitstream*/ 180*e5436536SAndroid Build Coastguard Worker UCHAR numMaster; /*!< Number of SBR-bands in v_k_master */ 181*e5436536SAndroid Build Coastguard Worker UCHAR lowSubband; /*!< QMF-band where SBR frequency range starts */ 182*e5436536SAndroid Build Coastguard Worker UCHAR highSubband; /*!< QMF-band where SBR frequency range ends */ 183*e5436536SAndroid Build Coastguard Worker UCHAR ov_highSubband; /*!< if headerchange applies this value holds the old 184*e5436536SAndroid Build Coastguard Worker highband value -> highband value of overlap area; 185*e5436536SAndroid Build Coastguard Worker required for overlap in usac when headerchange 186*e5436536SAndroid Build Coastguard Worker occurs between XVAR and VARX frame */ 187*e5436536SAndroid Build Coastguard Worker UCHAR limiterBandTable[MAX_NUM_LIMITERS + 1]; /*!< Limiter band table. */ 188*e5436536SAndroid Build Coastguard Worker UCHAR noLimiterBands; /*!< Number of limiter bands. */ 189*e5436536SAndroid Build Coastguard Worker UCHAR nInvfBands; /*!< Number of bands for inverse filtering */ 190*e5436536SAndroid Build Coastguard Worker UCHAR 191*e5436536SAndroid Build Coastguard Worker *freqBandTable[2]; /*!< Pointers to freqBandTableLo and freqBandTableHi */ 192*e5436536SAndroid Build Coastguard Worker UCHAR freqBandTableLo[MAX_FREQ_COEFFS / 2 + 1]; 193*e5436536SAndroid Build Coastguard Worker /*!< Mapping of SBR bands to QMF bands for low frequency resolution */ 194*e5436536SAndroid Build Coastguard Worker UCHAR freqBandTableHi[MAX_FREQ_COEFFS + 1]; 195*e5436536SAndroid Build Coastguard Worker /*!< Mapping of SBR bands to QMF bands for high frequency resolution */ 196*e5436536SAndroid Build Coastguard Worker UCHAR freqBandTableNoise[MAX_NOISE_COEFFS + 1]; 197*e5436536SAndroid Build Coastguard Worker /*!< Mapping of SBR noise bands to QMF bands */ 198*e5436536SAndroid Build Coastguard Worker UCHAR v_k_master[MAX_FREQ_COEFFS + 1]; 199*e5436536SAndroid Build Coastguard Worker /*!< Master BandTable which freqBandTable is derived from */ 200*e5436536SAndroid Build Coastguard Worker } FREQ_BAND_DATA; 201*e5436536SAndroid Build Coastguard Worker 202*e5436536SAndroid Build Coastguard Worker typedef FREQ_BAND_DATA *HANDLE_FREQ_BAND_DATA; 203*e5436536SAndroid Build Coastguard Worker 204*e5436536SAndroid Build Coastguard Worker #define SBRDEC_ELD_GRID 1 205*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SYNTAX_SCAL 2 206*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SYNTAX_USAC 4 207*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SYNTAX_RSVD50 8 208*e5436536SAndroid Build Coastguard Worker #define SBRDEC_USAC_INDEP \ 209*e5436536SAndroid Build Coastguard Worker 16 /* Flag indicating that USAC global independency flag is active. */ 210*e5436536SAndroid Build Coastguard Worker #define SBRDEC_LOW_POWER \ 211*e5436536SAndroid Build Coastguard Worker 32 /* Flag indicating that Low Power QMF mode shall be used. */ 212*e5436536SAndroid Build Coastguard Worker #define SBRDEC_PS_DECODED \ 213*e5436536SAndroid Build Coastguard Worker 64 /* Flag indicating that PS was decoded and rendered. */ 214*e5436536SAndroid Build Coastguard Worker #define SBRDEC_QUAD_RATE \ 215*e5436536SAndroid Build Coastguard Worker 128 /* Flag indicating that USAC SBR 4:1 is active. \ 216*e5436536SAndroid Build Coastguard Worker */ 217*e5436536SAndroid Build Coastguard Worker #define SBRDEC_USAC_HARMONICSBR \ 218*e5436536SAndroid Build Coastguard Worker 256 /* Flag indicating that USAC HBE tool is active. */ 219*e5436536SAndroid Build Coastguard Worker #define SBRDEC_LD_MPS_QMF \ 220*e5436536SAndroid Build Coastguard Worker 512 /* Flag indicating that the LD-MPS QMF shall be used. */ 221*e5436536SAndroid Build Coastguard Worker #define SBRDEC_USAC_ITES \ 222*e5436536SAndroid Build Coastguard Worker 1024 /* Flag indicating that USAC inter TES tool is active. */ 223*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SYNTAX_DRM \ 224*e5436536SAndroid Build Coastguard Worker 2048 /* Flag indicating that DRM30/DRM+ reverse syntax is being used. */ 225*e5436536SAndroid Build Coastguard Worker #define SBRDEC_ELD_DOWNSCALE \ 226*e5436536SAndroid Build Coastguard Worker 4096 /* Flag indicating that ELD downscaled mode decoding is used */ 227*e5436536SAndroid Build Coastguard Worker #define SBRDEC_DOWNSAMPLE \ 228*e5436536SAndroid Build Coastguard Worker 8192 /* Flag indicating that the downsampling mode is used. */ 229*e5436536SAndroid Build Coastguard Worker #define SBRDEC_FLUSH 16384 /* Flag is used to flush all elements in use. */ 230*e5436536SAndroid Build Coastguard Worker #define SBRDEC_FORCE_RESET \ 231*e5436536SAndroid Build Coastguard Worker 32768 /* Flag is used to force a reset of all elements in use. */ 232*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SKIP_QMF_ANA \ 233*e5436536SAndroid Build Coastguard Worker (1 << 21) /* Flag indicating that the input data is provided in the QMF \ 234*e5436536SAndroid Build Coastguard Worker domain. */ 235*e5436536SAndroid Build Coastguard Worker #define SBRDEC_SKIP_QMF_SYN \ 236*e5436536SAndroid Build Coastguard Worker (1 << 22) /* Flag indicating that the output data is exported in the QMF \ 237*e5436536SAndroid Build Coastguard Worker domain. */ 238*e5436536SAndroid Build Coastguard Worker 239*e5436536SAndroid Build Coastguard Worker #define SBRDEC_HDR_STAT_RESET 1 240*e5436536SAndroid Build Coastguard Worker #define SBRDEC_HDR_STAT_UPDATE 2 241*e5436536SAndroid Build Coastguard Worker 242*e5436536SAndroid Build Coastguard Worker typedef struct { 243*e5436536SAndroid Build Coastguard Worker UCHAR ampResolution; /*!< Amplitude resolution of envelope values (0: 1.5dB, 244*e5436536SAndroid Build Coastguard Worker 1: 3dB) */ 245*e5436536SAndroid Build Coastguard Worker UCHAR 246*e5436536SAndroid Build Coastguard Worker xover_band; /*!< Start index in #v_k_master[] used for dynamic crossover 247*e5436536SAndroid Build Coastguard Worker frequency */ 248*e5436536SAndroid Build Coastguard Worker UCHAR sbr_preprocessing; /*!< SBR prewhitening flag. */ 249*e5436536SAndroid Build Coastguard Worker UCHAR pvc_mode; /*!< Predictive vector coding mode */ 250*e5436536SAndroid Build Coastguard Worker } SBR_HEADER_DATA_BS_INFO; 251*e5436536SAndroid Build Coastguard Worker 252*e5436536SAndroid Build Coastguard Worker typedef struct { 253*e5436536SAndroid Build Coastguard Worker /* Changes in these variables causes a reset of the decoder */ 254*e5436536SAndroid Build Coastguard Worker UCHAR startFreq; /*!< Index for SBR start frequency */ 255*e5436536SAndroid Build Coastguard Worker UCHAR stopFreq; /*!< Index for SBR highest frequency */ 256*e5436536SAndroid Build Coastguard Worker UCHAR freqScale; /*!< 0: linear scale, 1-3 logarithmic scales */ 257*e5436536SAndroid Build Coastguard Worker UCHAR alterScale; /*!< Flag for coarser frequency resolution */ 258*e5436536SAndroid Build Coastguard Worker UCHAR noise_bands; /*!< Noise bands per octave, read from bitstream*/ 259*e5436536SAndroid Build Coastguard Worker 260*e5436536SAndroid Build Coastguard Worker /* don't require reset */ 261*e5436536SAndroid Build Coastguard Worker UCHAR limiterBands; /*!< Index for number of limiter bands per octave */ 262*e5436536SAndroid Build Coastguard Worker UCHAR limiterGains; /*!< Index to select gain limit */ 263*e5436536SAndroid Build Coastguard Worker UCHAR interpolFreq; /*!< Select gain calculation method (1: per QMF channel, 264*e5436536SAndroid Build Coastguard Worker 0: per SBR band) */ 265*e5436536SAndroid Build Coastguard Worker UCHAR smoothingLength; /*!< Smoothing of gains over time (0: on 1: off) */ 266*e5436536SAndroid Build Coastguard Worker 267*e5436536SAndroid Build Coastguard Worker } SBR_HEADER_DATA_BS; 268*e5436536SAndroid Build Coastguard Worker 269*e5436536SAndroid Build Coastguard Worker typedef struct { 270*e5436536SAndroid Build Coastguard Worker SBR_SYNC_STATE 271*e5436536SAndroid Build Coastguard Worker syncState; /*!< The current initialization status of the header */ 272*e5436536SAndroid Build Coastguard Worker 273*e5436536SAndroid Build Coastguard Worker UCHAR status; /*!< Flags field used for signaling a reset right before the 274*e5436536SAndroid Build Coastguard Worker processing starts and an update from config (e.g. ASC). */ 275*e5436536SAndroid Build Coastguard Worker UCHAR 276*e5436536SAndroid Build Coastguard Worker frameErrorFlag; /*!< Frame data valid flag. CAUTION: This variable will be 277*e5436536SAndroid Build Coastguard Worker overwritten by the flag stored in the element 278*e5436536SAndroid Build Coastguard Worker structure. This is necessary because of the frame 279*e5436536SAndroid Build Coastguard Worker delay. There it might happen that different slots use 280*e5436536SAndroid Build Coastguard Worker the same header. */ 281*e5436536SAndroid Build Coastguard Worker UCHAR numberTimeSlots; /*!< AAC: 16,15 */ 282*e5436536SAndroid Build Coastguard Worker UCHAR numberOfAnalysisBands; /*!< Number of QMF analysis bands */ 283*e5436536SAndroid Build Coastguard Worker UCHAR timeStep; /*!< Time resolution of SBR in QMF-slots */ 284*e5436536SAndroid Build Coastguard Worker UINT 285*e5436536SAndroid Build Coastguard Worker sbrProcSmplRate; /*!< SBR processing sampling frequency (!= 286*e5436536SAndroid Build Coastguard Worker OutputSamplingRate) (always: CoreSamplingRate * 287*e5436536SAndroid Build Coastguard Worker UpSamplingFactor; even in single rate mode) */ 288*e5436536SAndroid Build Coastguard Worker 289*e5436536SAndroid Build Coastguard Worker SBR_HEADER_DATA_BS bs_data; /*!< current SBR header. */ 290*e5436536SAndroid Build Coastguard Worker SBR_HEADER_DATA_BS bs_dflt; /*!< Default sbr header. */ 291*e5436536SAndroid Build Coastguard Worker SBR_HEADER_DATA_BS_INFO bs_info; /*!< SBR info. */ 292*e5436536SAndroid Build Coastguard Worker 293*e5436536SAndroid Build Coastguard Worker FREQ_BAND_DATA freqBandData; /*!< Pointer to struct #FREQ_BAND_DATA */ 294*e5436536SAndroid Build Coastguard Worker UCHAR pvcIDprev; 295*e5436536SAndroid Build Coastguard Worker } SBR_HEADER_DATA; 296*e5436536SAndroid Build Coastguard Worker 297*e5436536SAndroid Build Coastguard Worker typedef SBR_HEADER_DATA *HANDLE_SBR_HEADER_DATA; 298*e5436536SAndroid Build Coastguard Worker 299*e5436536SAndroid Build Coastguard Worker typedef struct { 300*e5436536SAndroid Build Coastguard Worker UCHAR frameClass; /*!< Select grid type */ 301*e5436536SAndroid Build Coastguard Worker UCHAR nEnvelopes; /*!< Number of envelopes */ 302*e5436536SAndroid Build Coastguard Worker UCHAR borders[MAX_ENVELOPES + 1]; /*!< Envelope borders (in SBR-timeslots, 303*e5436536SAndroid Build Coastguard Worker e.g. mp3PRO: 0..11) */ 304*e5436536SAndroid Build Coastguard Worker UCHAR freqRes[MAX_ENVELOPES]; /*!< Frequency resolution for each envelope 305*e5436536SAndroid Build Coastguard Worker (0=low, 1=high) */ 306*e5436536SAndroid Build Coastguard Worker SCHAR tranEnv; /*!< Transient envelope, -1 if none */ 307*e5436536SAndroid Build Coastguard Worker UCHAR nNoiseEnvelopes; /*!< Number of noise envelopes */ 308*e5436536SAndroid Build Coastguard Worker UCHAR 309*e5436536SAndroid Build Coastguard Worker bordersNoise[MAX_NOISE_ENVELOPES + 1]; /*!< borders of noise envelopes */ 310*e5436536SAndroid Build Coastguard Worker UCHAR pvcBorders[MAX_PVC_ENVELOPES + 1]; 311*e5436536SAndroid Build Coastguard Worker UCHAR noisePosition; 312*e5436536SAndroid Build Coastguard Worker UCHAR varLength; 313*e5436536SAndroid Build Coastguard Worker } FRAME_INFO; 314*e5436536SAndroid Build Coastguard Worker 315*e5436536SAndroid Build Coastguard Worker typedef struct { 316*e5436536SAndroid Build Coastguard Worker FIXP_SGL sfb_nrg_prev[MAX_FREQ_COEFFS]; /*!< Previous envelope (required for 317*e5436536SAndroid Build Coastguard Worker differential-coded values) */ 318*e5436536SAndroid Build Coastguard Worker FIXP_SGL 319*e5436536SAndroid Build Coastguard Worker prevNoiseLevel[MAX_NOISE_COEFFS]; /*!< Previous noise envelope (required 320*e5436536SAndroid Build Coastguard Worker for differential-coded values) */ 321*e5436536SAndroid Build Coastguard Worker COUPLING_MODE coupling; /*!< Stereo-mode of previous frame */ 322*e5436536SAndroid Build Coastguard Worker INVF_MODE sbr_invf_mode[MAX_INVF_BANDS]; /*!< Previous strength of filtering 323*e5436536SAndroid Build Coastguard Worker in transposer */ 324*e5436536SAndroid Build Coastguard Worker UCHAR ampRes; /*!< Previous amplitude resolution (0: 1.5dB, 1: 3dB) */ 325*e5436536SAndroid Build Coastguard Worker UCHAR stopPos; /*!< Position in time where last envelope ended */ 326*e5436536SAndroid Build Coastguard Worker UCHAR frameErrorFlag; /*!< Previous frame status */ 327*e5436536SAndroid Build Coastguard Worker UCHAR prevSbrPitchInBins; /*!< Previous frame pitchInBins */ 328*e5436536SAndroid Build Coastguard Worker FRAME_INFO prevFrameInfo; 329*e5436536SAndroid Build Coastguard Worker } SBR_PREV_FRAME_DATA; 330*e5436536SAndroid Build Coastguard Worker 331*e5436536SAndroid Build Coastguard Worker typedef SBR_PREV_FRAME_DATA *HANDLE_SBR_PREV_FRAME_DATA; 332*e5436536SAndroid Build Coastguard Worker 333*e5436536SAndroid Build Coastguard Worker typedef struct { 334*e5436536SAndroid Build Coastguard Worker int nScaleFactors; /*!< total number of scalefactors in frame */ 335*e5436536SAndroid Build Coastguard Worker 336*e5436536SAndroid Build Coastguard Worker FRAME_INFO frameInfo; /*!< time grid for current frame */ 337*e5436536SAndroid Build Coastguard Worker UCHAR domain_vec[MAX_ENVELOPES]; /*!< Bitfield containing direction of 338*e5436536SAndroid Build Coastguard Worker delta-coding for each envelope 339*e5436536SAndroid Build Coastguard Worker (0:frequency, 1:time) */ 340*e5436536SAndroid Build Coastguard Worker UCHAR domain_vec_noise 341*e5436536SAndroid Build Coastguard Worker [MAX_NOISE_ENVELOPES]; /*!< Same as above, but for noise envelopes */ 342*e5436536SAndroid Build Coastguard Worker 343*e5436536SAndroid Build Coastguard Worker INVF_MODE 344*e5436536SAndroid Build Coastguard Worker sbr_invf_mode[MAX_INVF_BANDS]; /*!< Strength of filtering in transposer */ 345*e5436536SAndroid Build Coastguard Worker COUPLING_MODE coupling; /*!< Stereo-mode */ 346*e5436536SAndroid Build Coastguard Worker int ampResolutionCurrentFrame; /*!< Amplitude resolution of envelope values 347*e5436536SAndroid Build Coastguard Worker (0: 1.5dB, 1: 3dB) */ 348*e5436536SAndroid Build Coastguard Worker 349*e5436536SAndroid Build Coastguard Worker ULONG addHarmonics[ADD_HARMONICS_FLAGS_SIZE]; /*!< Flags for synthetic sine 350*e5436536SAndroid Build Coastguard Worker addition (aligned to MSB) */ 351*e5436536SAndroid Build Coastguard Worker 352*e5436536SAndroid Build Coastguard Worker FIXP_SGL iEnvelope[MAX_NUM_ENVELOPE_VALUES]; /*!< Envelope data */ 353*e5436536SAndroid Build Coastguard Worker FIXP_SGL sbrNoiseFloorLevel[MAX_NUM_NOISE_VALUES]; /*!< Noise envelope data */ 354*e5436536SAndroid Build Coastguard Worker UCHAR iTESactive; /*!< One flag for each envelope to enable USAC inter-TES */ 355*e5436536SAndroid Build Coastguard Worker UCHAR 356*e5436536SAndroid Build Coastguard Worker interTempShapeMode[MAX_ENVELOPES]; /*!< USAC inter-TES: 357*e5436536SAndroid Build Coastguard Worker bs_inter_temp_shape_mode[ch][env] 358*e5436536SAndroid Build Coastguard Worker value */ 359*e5436536SAndroid Build Coastguard Worker UCHAR pvcID[PVC_NTIMESLOT]; /*!< One PVC ID value for each time slot */ 360*e5436536SAndroid Build Coastguard Worker UCHAR ns; 361*e5436536SAndroid Build Coastguard Worker UCHAR sinusoidal_position; 362*e5436536SAndroid Build Coastguard Worker 363*e5436536SAndroid Build Coastguard Worker UCHAR sbrPatchingMode; 364*e5436536SAndroid Build Coastguard Worker UCHAR sbrOversamplingFlag; 365*e5436536SAndroid Build Coastguard Worker UCHAR sbrPitchInBins; 366*e5436536SAndroid Build Coastguard Worker } SBR_FRAME_DATA; 367*e5436536SAndroid Build Coastguard Worker 368*e5436536SAndroid Build Coastguard Worker typedef SBR_FRAME_DATA *HANDLE_SBR_FRAME_DATA; 369*e5436536SAndroid Build Coastguard Worker 370*e5436536SAndroid Build Coastguard Worker /*! 371*e5436536SAndroid Build Coastguard Worker \brief Maps sampling frequencies to frequencies for which setup tables are 372*e5436536SAndroid Build Coastguard Worker available 373*e5436536SAndroid Build Coastguard Worker 374*e5436536SAndroid Build Coastguard Worker Maps arbitary sampling frequency to nearest neighbors for which setup tables 375*e5436536SAndroid Build Coastguard Worker are available (e.g. 25600 -> 24000). 376*e5436536SAndroid Build Coastguard Worker Used for startFreq calculation. 377*e5436536SAndroid Build Coastguard Worker The mapping is defined in 14496-3 (4.6.18.2.6), fs(SBR), and table 4.82 378*e5436536SAndroid Build Coastguard Worker 379*e5436536SAndroid Build Coastguard Worker \return mapped sampling frequency 380*e5436536SAndroid Build Coastguard Worker */ 381*e5436536SAndroid Build Coastguard Worker UINT sbrdec_mapToStdSampleRate(UINT fs, 382*e5436536SAndroid Build Coastguard Worker UINT isUsac); /*!< Output sampling frequency */ 383*e5436536SAndroid Build Coastguard Worker 384*e5436536SAndroid Build Coastguard Worker void initSbrPrevFrameData(HANDLE_SBR_PREV_FRAME_DATA h_prev_data, 385*e5436536SAndroid Build Coastguard Worker int timeSlots); 386*e5436536SAndroid Build Coastguard Worker 387*e5436536SAndroid Build Coastguard Worker int sbrGetChannelElement(HANDLE_SBR_HEADER_DATA hHeaderData, 388*e5436536SAndroid Build Coastguard Worker HANDLE_SBR_FRAME_DATA hFrameDataLeft, 389*e5436536SAndroid Build Coastguard Worker HANDLE_SBR_FRAME_DATA hFrameDataRight, 390*e5436536SAndroid Build Coastguard Worker HANDLE_SBR_PREV_FRAME_DATA hFrameDataLeftPrev, 391*e5436536SAndroid Build Coastguard Worker UCHAR pvc_mode_last, HANDLE_FDK_BITSTREAM hBitBuf, 392*e5436536SAndroid Build Coastguard Worker HANDLE_PS_DEC hParametricStereoDec, const UINT flags, 393*e5436536SAndroid Build Coastguard Worker const int overlap); 394*e5436536SAndroid Build Coastguard Worker 395*e5436536SAndroid Build Coastguard Worker SBR_HEADER_STATUS 396*e5436536SAndroid Build Coastguard Worker sbrGetHeaderData(HANDLE_SBR_HEADER_DATA headerData, 397*e5436536SAndroid Build Coastguard Worker HANDLE_FDK_BITSTREAM hBitBuf, const UINT flags, 398*e5436536SAndroid Build Coastguard Worker const int fIsSbrData, const UCHAR configMode); 399*e5436536SAndroid Build Coastguard Worker 400*e5436536SAndroid Build Coastguard Worker /*! 401*e5436536SAndroid Build Coastguard Worker \brief Initialize SBR header data 402*e5436536SAndroid Build Coastguard Worker 403*e5436536SAndroid Build Coastguard Worker Copy default values to the header data struct and patch some entries 404*e5436536SAndroid Build Coastguard Worker depending on the core codec. 405*e5436536SAndroid Build Coastguard Worker */ 406*e5436536SAndroid Build Coastguard Worker SBR_ERROR 407*e5436536SAndroid Build Coastguard Worker initHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn, 408*e5436536SAndroid Build Coastguard Worker const int sampleRateOut, const INT downscaleFactor, 409*e5436536SAndroid Build Coastguard Worker const int samplesPerFrame, const UINT flags, 410*e5436536SAndroid Build Coastguard Worker const int setDefaultHdr); 411*e5436536SAndroid Build Coastguard Worker #endif 412*e5436536SAndroid Build Coastguard Worker 413*e5436536SAndroid Build Coastguard Worker /* Convert headroom bits to exponent */ 414*e5436536SAndroid Build Coastguard Worker #define SCALE2EXP(s) (15 - (s)) 415*e5436536SAndroid Build Coastguard Worker #define EXP2SCALE(e) (15 - (e)) 416