1 /* ----------------------------------------------------------------------------- 2 Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4 © Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten 5 Forschung e.V. All rights reserved. 6 7 1. INTRODUCTION 8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 10 scheme for digital audio. This FDK AAC Codec software is intended to be used on 11 a wide variety of Android devices. 12 13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 14 general perceptual audio codecs. AAC-ELD is considered the best-performing 15 full-bandwidth communications codec by independent studies and is widely 16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG 17 specifications. 18 19 Patent licenses for necessary patent claims for the FDK AAC Codec (including 20 those of Fraunhofer) may be obtained through Via Licensing 21 (www.vialicensing.com) or through the respective patent owners individually for 22 the purpose of encoding or decoding bit streams in products that are compliant 23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of 24 Android devices already license these patent claims through Via Licensing or 25 directly from the patent owners, and therefore FDK AAC Codec software may 26 already be covered under those patent licenses when it is used for those 27 licensed purposes only. 28 29 Commercially-licensed AAC software libraries, including floating-point versions 30 with enhanced sound quality, are also available from Fraunhofer. Users are 31 encouraged to check the Fraunhofer website for additional applications 32 information and documentation. 33 34 2. COPYRIGHT LICENSE 35 36 Redistribution and use in source and binary forms, with or without modification, 37 are permitted without payment of copyright license fees provided that you 38 satisfy the following conditions: 39 40 You must retain the complete text of this software license in redistributions of 41 the FDK AAC Codec or your modifications thereto in source code form. 42 43 You must retain the complete text of this software license in the documentation 44 and/or other materials provided with redistributions of the FDK AAC Codec or 45 your modifications thereto in binary form. You must make available free of 46 charge copies of the complete source code of the FDK AAC Codec and your 47 modifications thereto to recipients of copies in binary form. 48 49 The name of Fraunhofer may not be used to endorse or promote products derived 50 from this library without prior written permission. 51 52 You may not charge copyright license fees for anyone to use, copy or distribute 53 the FDK AAC Codec software or your modifications thereto. 54 55 Your modified versions of the FDK AAC Codec must carry prominent notices stating 56 that you changed the software and the date of any change. For modified versions 57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 59 AAC Codec Library for Android." 60 61 3. NO PATENT LICENSE 62 63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 65 Fraunhofer provides no warranty of patent non-infringement with respect to this 66 software. 67 68 You may use this FDK AAC Codec software or modifications thereto only for 69 purposes that are authorized by appropriate patent licenses. 70 71 4. DISCLAIMER 72 73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 75 including but not limited to the implied warranties of merchantability and 76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 78 or consequential damages, including but not limited to procurement of substitute 79 goods or services; loss of use, data, or profits, or business interruption, 80 however caused and on any theory of liability, whether in contract, strict 81 liability, or tort (including negligence), arising in any way out of the use of 82 this software, even if advised of the possibility of such damage. 83 84 5. CONTACT INFORMATION 85 86 Fraunhofer Institute for Integrated Circuits IIS 87 Attention: Audio and Multimedia Departments - FDK AAC LL 88 Am Wolfsmantel 33 89 91058 Erlangen, Germany 90 91 www.iis.fraunhofer.de/amm 92 amm-info@iis.fraunhofer.de 93 ----------------------------------------------------------------------------- */ 94 95 /*********************** MPEG surround decoder library ************************* 96 97 Author(s): 98 99 Description: SAC Decoder Library Interface 100 101 *******************************************************************************/ 102 103 #ifndef SAC_DEC_INTERFACE_H 104 #define SAC_DEC_INTERFACE_H 105 106 #include "common_fix.h" 107 #include "FDK_audio.h" 108 109 #ifdef __cplusplus 110 extern "C" { 111 #endif 112 113 #include "sac_dec_errorcodes.h" 114 #include "sac_dec_ssc_struct.h" 115 116 /** 117 * \brief Baseline MPEG-Surround profile Level 1-5. 118 */ 119 typedef enum { 120 DECODER_LEVEL_0 = 0, /*!< Level 0: dummy level; 212 only */ 121 DECODER_LEVEL_6 = 6 /*!< Level 6: no support */ 122 } CFG_LEVEL; 123 124 /* 125 * \brief Number of output channels restriction. 126 */ 127 typedef enum { 128 OUTPUT_CHANNELS_DEFAULT, /*!< Default configuration depending on Decoder Level 129 */ 130 OUTPUT_CHANNELS_2_0, /*!< Limitation to stereo output */ 131 OUTPUT_CHANNELS_5_1 /*!< Limitation to 5.1 output */ 132 } CFG_RESTRICTION; 133 134 /* 135 * \brief Supported decoder mode. 136 */ 137 typedef enum { 138 EXT_HQ_ONLY = 0, /*!< High Quality processing only */ 139 EXT_LP_ONLY = 1, /*!< Low Power procesing only */ 140 EXT_HQ_AND_LP = 2 /*!< Support both HQ and LP processing */ 141 } CFG_EXTENT; 142 143 /* 144 * \brief Supported binaural mode. 145 */ 146 typedef enum { 147 BINAURAL_NONE = -1 /*!< No binaural procesing supported */ 148 } CFG_BINAURAL; 149 150 /** 151 * \brief Decoder configuration structure. 152 * 153 * These structure contains all parameters necessary for decoder open function. 154 * The configuration specifies the functional range of the decoder instance. 155 */ 156 typedef struct { 157 CFG_LEVEL decoderLevel; 158 CFG_EXTENT decoderMode; 159 CFG_RESTRICTION maxNumOutputChannels; 160 CFG_BINAURAL binauralMode; 161 162 } SPATIAL_DEC_CONFIG; 163 164 typedef enum { 165 INPUTMODE_QMF = 1000, 166 INPUTMODE_QMF_SBR = 1001, 167 INPUTMODE_TIME = 1002 168 } SPATIALDEC_INPUT_MODE; 169 170 /** 171 * \brief MPEG Surround upmix type mode. 172 **/ 173 typedef enum { 174 UPMIX_TYPE_BYPASS = 175 -1, /*!< Bypass the downmix channels from the core decoder. */ 176 UPMIX_TYPE_NORMAL = 0 /*!< Multi channel output. */ 177 178 } SPATIAL_DEC_UPMIX_TYPE; 179 180 /** 181 * \brief Dynamic decoder parameters. 182 */ 183 typedef struct { 184 /* Basics */ 185 UCHAR outputMode; 186 UCHAR blindEnable; 187 UCHAR bypassMode; 188 189 /* Error concealment */ 190 UCHAR concealMethod; 191 UINT concealNumKeepFrames; 192 UINT concealFadeOutSlopeLength; 193 UINT concealFadeInSlopeLength; 194 UINT concealNumReleaseFrames; 195 196 } SPATIALDEC_PARAM; 197 198 /** 199 * \brief Flags which control the initialization 200 **/ 201 typedef enum { 202 MPEGS_INIT_NONE = 0x00000000, /*!< Indicates no initialization */ 203 204 MPEGS_INIT_CONFIG = 0x00000010, /*!< Indicates a configuration change due to 205 SSC value changes */ 206 207 MPEGS_INIT_STATES_ANA_QMF_FILTER = 208 0x00000100, /*!< Controls the initialization of the analysis qmf filter 209 states */ 210 MPEGS_INIT_STATES_SYN_QMF_FILTER = 211 0x00000200, /*!< Controls the initialization of the synthesis qmf filter 212 states */ 213 MPEGS_INIT_STATES_ANA_HYB_FILTER = 0x00000400, /*!< Controls the 214 initialization of the 215 analysis hybrid filter 216 states */ 217 MPEGS_INIT_STATES_DECORRELATOR = 218 0x00000800, /*!< Controls the initialization of the decorrelator states */ 219 MPEGS_INIT_STATES_M1M2 = 0x00002000, /*!< Controls the initialization of the 220 history in m1 and m2 parameter 221 calculation */ 222 MPEGS_INIT_STATES_GES = 0x00004000, /*!< Controls the initialization of the 223 history in the ges calculation */ 224 MPEGS_INIT_STATES_REVERB = 225 0x00008000, /*!< Controls the initialization of the reverb states */ 226 MPEGS_INIT_STATES_PARAM = 227 0x00020000, /*!< Controls the initialization of the history of all other 228 parameter */ 229 MPEGS_INIT_STATES_ERROR_CONCEALMENT = 230 0x00080000, /*!< Controls the initialization of the error concealment 231 module state */ 232 MPEGS_INIT_PARAMS_ERROR_CONCEALMENT = 0x00200000 /*!< Controls the 233 initialization of the 234 whole error concealment 235 parameter set */ 236 237 } MPEGS_INIT_CTRL_FLAGS; 238 239 #define MASK_MPEGS_INIT_ALL_STATES (0x000FFF00) 240 #define MASK_MPEGS_INIT_ALL_PARAMS (0x00F00000) 241 242 typedef struct spatialDec_struct spatialDec, *HANDLE_SPATIAL_DEC; 243 244 typedef struct SPATIAL_BS_FRAME_struct SPATIAL_BS_FRAME; 245 246 typedef struct { 247 UINT sizePersistent; /* persistent memory */ 248 UINT sizeFastPersistent; /* fast persistent memory */ 249 250 } MEM_REQUIREMENTS; 251 252 #define PCM_MPS LONG 253 #define PCM_MPSF FIXP_DBL 254 255 #define FIXP_DBL2PCM_MPS(x) ((LONG)(x)) 256 257 /* exposed functions (library interface) */ 258 259 int FDK_SpatialDecCompareSpatialSpecificConfigHeader( 260 SPATIAL_SPECIFIC_CONFIG *pSsc1, SPATIAL_SPECIFIC_CONFIG *pSsc2); 261 262 int FDK_SpatialDecInitDefaultSpatialSpecificConfig( 263 SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, 264 AUDIO_OBJECT_TYPE coreCodec, int coreChannels, int samplingFreq, 265 int nTimeSlots, int decoderLevel, int isBlind); 266 267 spatialDec *FDK_SpatialDecOpen(const SPATIAL_DEC_CONFIG *config, 268 int stereoConfigIndex); 269 270 /** 271 * \brief Initialize state variables of the MPS parser 272 */ 273 void SpatialDecInitParserContext(spatialDec *self); 274 275 /** 276 * \brief Initialize state of MPS decoder. This may happen after the first parse 277 * operation. 278 */ 279 SACDEC_ERROR FDK_SpatialDecInit(spatialDec *self, SPATIAL_BS_FRAME *frame, 280 SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, 281 int nQmfBands, 282 SPATIAL_DEC_UPMIX_TYPE const upmixType, 283 SPATIALDEC_PARAM *pUserParams, 284 UINT initFlags /* MPEGS_INIT_CTRL_FLAGS */ 285 ); 286 287 /** 288 * \brief Apply decoded MPEG Surround parameters to time domain or QMF down mix 289 * data. 290 * \param self spatial decoder handle. 291 * \param inData Pointer to time domain input down mix data if any. 292 * \param qmfInDataReal Pointer array of QMF domain down mix input data (real 293 * part). 294 * \param qmfInDataImag Pointer array of QMF domain down mix input data 295 * (imaginary part). 296 * \param pcmOutBuf Pointer to a time domain buffer were the upmixed output data 297 * will be stored into. 298 * \param nSamples Amount of audio samples per channel of down mix input data 299 * (frame length). 300 * \param pControlFlags pointer to control flags field; input/output. 301 * \param numInputChannels amount of down mix input channels. Might not match 302 * the current tree config, useful for internal sanity checks and bypass mode. 303 * \param channelMapping array containing the desired output channel ordering to 304 * transform MPEG PCE style ordering to any other channel ordering. First 305 * dimension is the total channel count. 306 */ 307 SACDEC_ERROR SpatialDecApplyFrame( 308 spatialDec *self, SPATIAL_BS_FRAME *frame, SPATIALDEC_INPUT_MODE inputMode, 309 PCM_MPS *inData, /* Time domain input */ 310 FIXP_DBL **qmfInDataReal, /* interleaved l/r */ 311 FIXP_DBL **qmfInDataImag, /* interleaved l/r */ 312 PCM_MPS *pcmOutBuf, /* MAX_OUTPUT_CHANNELS*MAX_TIME_SLOTS*NUM_QMF_BANDS] */ 313 UINT nSamples, UINT *pControlFlags, int numInputChannels, 314 const FDK_channelMapDescr *const mapDescr); 315 316 /** 317 * \brief Fill given arrays with audio channel types and indices. 318 * \param self spatial decoder handle. 319 * \param channelType array where corresponding channel types fr each output 320 * channels are stored into. 321 * \param channelIndices array where corresponding channel type indices fr each 322 * output channels are stored into. 323 */ 324 void SpatialDecChannelProperties(spatialDec *self, 325 AUDIO_CHANNEL_TYPE channelType[], 326 UCHAR channelIndices[], 327 const FDK_channelMapDescr *const mapDescr); 328 329 void FDK_SpatialDecClose(spatialDec *self); 330 331 #ifdef __cplusplus 332 } 333 #endif 334 335 #endif /* SAC_DEC_INTERFACE_H */ 336