1 /* ----------------------------------------------------------------------------- 2 Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4 © Copyright 1995 - 2018 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 /**************************** SBR decoder library ****************************** 96 97 Author(s): 98 99 Description: 100 101 *******************************************************************************/ 102 103 /*! 104 \file 105 \brief Sbr decoder 106 */ 107 #ifndef PSDEC_H 108 #define PSDEC_H 109 110 #include "sbrdecoder.h" 111 #include "FDK_hybrid.h" 112 113 #include "FDK_decorrelate.h" 114 115 /* This PS decoder implements the baseline version. So it always uses the */ 116 /* hybrid filter structure for 20 stereo bands and does not implemet IPD/OPD */ 117 /* synthesis. The baseline version has to support the complete PS bitstream */ 118 /* syntax. But IPD/OPD data is ignored and set to 0. If 34 stereo band config */ 119 /* is used in the bitstream for IIS/ICC the decoded parameters are mapped to */ 120 /* 20 stereo bands. */ 121 122 #include "FDK_bitstream.h" 123 124 #define SCAL_HEADROOM (2) 125 126 #define PS_EXTENSION_SIZE_BITS (4) 127 #define PS_EXTENSION_ESC_COUNT_BITS (8) 128 129 #define NO_QMF_CHANNELS (64) 130 #define MAX_NUM_COL (32) 131 132 #define NO_QMF_BANDS_HYBRID20 (3) 133 #define NO_SUB_QMF_CHANNELS (12) 134 #define HYBRID_FILTER_DELAY (6) 135 136 #define MAX_NO_PS_ENV (4 + 1) /* +1 needed for VAR_BORDER */ 137 138 #define NO_HI_RES_BINS (34) 139 #define NO_MID_RES_BINS (20) 140 #define NO_LOW_RES_BINS (10) 141 142 #define NO_HI_RES_IID_BINS (NO_HI_RES_BINS) 143 #define NO_HI_RES_ICC_BINS (NO_HI_RES_BINS) 144 145 #define NO_MID_RES_IID_BINS (NO_MID_RES_BINS) 146 #define NO_MID_RES_ICC_BINS (NO_MID_RES_BINS) 147 148 #define NO_LOW_RES_IID_BINS (NO_LOW_RES_BINS) 149 #define NO_LOW_RES_ICC_BINS (NO_LOW_RES_BINS) 150 151 #define SUBQMF_GROUPS (10) 152 #define QMF_GROUPS (12) 153 154 //#define SUBQMF_GROUPS_HI_RES ( 32 ) 155 //#define QMF_GROUPS_HI_RES ( 18 ) 156 157 #define NO_IID_GROUPS (SUBQMF_GROUPS + QMF_GROUPS) 158 //#define NO_IID_GROUPS_HI_RES ( SUBQMF_GROUPS_HI_RES + 159 // QMF_GROUPS_HI_RES ) 160 161 #define NO_IID_STEPS (7) /* 1 .. + 7 */ 162 #define NO_IID_STEPS_FINE (15) /* 1 .. +15 */ 163 #define NO_ICC_STEPS (8) /* 0 .. + 7 */ 164 165 #define NO_IID_LEVELS (2 * NO_IID_STEPS + 1) /* - 7 .. + 7 */ 166 #define NO_IID_LEVELS_FINE (2 * NO_IID_STEPS_FINE + 1) /* -15 .. +15 */ 167 #define NO_ICC_LEVELS (NO_ICC_STEPS) /* 0 .. + 7 */ 168 169 #define FIXP_SQRT05 ((FIXP_DBL)0x5a827980) /* 1/SQRT2 */ 170 171 struct PS_DEC_COEFFICIENTS { 172 FIXP_DBL H11r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ 173 FIXP_DBL H12r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ 174 FIXP_DBL H21r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ 175 FIXP_DBL H22r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ 176 177 FIXP_DBL 178 DeltaH11r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ 179 FIXP_DBL 180 DeltaH12r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ 181 FIXP_DBL 182 DeltaH21r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ 183 FIXP_DBL 184 DeltaH22r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ 185 186 SCHAR 187 aaIidIndexMapped[MAX_NO_PS_ENV] 188 [NO_HI_RES_IID_BINS]; /*!< The mapped IID index for all 189 envelopes and all IID bins */ 190 SCHAR 191 aaIccIndexMapped[MAX_NO_PS_ENV] 192 [NO_HI_RES_ICC_BINS]; /*!< The mapped ICC index for all 193 envelopes and all ICC bins */ 194 }; 195 196 typedef enum { ppt_none = 0, ppt_mpeg = 1, ppt_drm = 2 } PS_PAYLOAD_TYPE; 197 198 typedef struct { 199 UCHAR bPsHeaderValid; /*!< set if new header is available from bitstream */ 200 201 UCHAR bEnableIid; /*!< One bit denoting the presence of IID parameters */ 202 UCHAR bEnableIcc; /*!< One bit denoting the presence of ICC parameters */ 203 UCHAR bEnableExt; /*!< The PS extension layer is enabled using the enable_ext 204 bit. If it is set to %1 the IPD and OPD parameters are 205 sent. If it is disabled, i.e. %0, the extension layer is 206 skipped. */ 207 208 UCHAR 209 modeIid; /*!< The configuration of IID parameters (number of bands and 210 quantisation grid, iid_quant) is determined by iid_mode. */ 211 UCHAR modeIcc; /*!< The configuration of Inter-channel Coherence parameters 212 (number of bands and quantisation grid) is determined by 213 icc_mode. */ 214 215 UCHAR freqResIid; /*!< 0=low, 1=mid or 2=high frequency resolution for iid */ 216 UCHAR freqResIcc; /*!< 0=low, 1=mid or 2=high frequency resolution for icc */ 217 218 UCHAR bFineIidQ; /*!< Use fine Iid quantisation. */ 219 220 UCHAR bFrameClass; /*!< The frame_class bit determines whether the parameter 221 positions of the current frame are uniformly spaced 222 accross the frame or they are defined using the 223 positions described by border_position. 224 */ 225 226 UCHAR noEnv; /*!< The number of envelopes per frame */ 227 UCHAR aEnvStartStop[MAX_NO_PS_ENV + 1]; /*!< In case of variable parameter 228 spacing the parameter positions are 229 determined by border_position */ 230 231 SCHAR abIidDtFlag[MAX_NO_PS_ENV]; /*!< Deltacoding time/freq flag for IID, 0 232 => freq */ 233 SCHAR abIccDtFlag[MAX_NO_PS_ENV]; /*!< Deltacoding time/freq flag for ICC, 0 234 => freq */ 235 236 SCHAR 237 aaIidIndex[MAX_NO_PS_ENV] 238 [NO_HI_RES_IID_BINS]; /*!< The IID index for all envelopes and 239 all IID bins */ 240 SCHAR 241 aaIccIndex[MAX_NO_PS_ENV] 242 [NO_HI_RES_ICC_BINS]; /*!< The ICC index for all envelopes and 243 all ICC bins */ 244 245 } MPEG_PS_BS_DATA; 246 247 struct PS_DEC { 248 SCHAR noSubSamples; 249 SCHAR noChannels; 250 251 SCHAR procFrameBased; /*!< Helper to detected switching from frame based to 252 slot based processing 253 */ 254 255 PS_PAYLOAD_TYPE 256 bPsDataAvail[(1) + 1]; /*!< set if new data available from bitstream */ 257 UCHAR psDecodedPrv; /*!< set if PS has been processed in the last frame */ 258 259 /* helpers for frame delay line */ 260 UCHAR bsLastSlot; /*!< Index of last read slot. */ 261 UCHAR bsReadSlot; /*!< Index of current read slot for additional delay. */ 262 UCHAR processSlot; /*!< Index of current slot for processing (need for add. 263 delay). */ 264 265 union { /* Bitstream data */ 266 MPEG_PS_BS_DATA 267 mpeg; /*!< Struct containing all MPEG specific PS data from bitstream. 268 */ 269 } bsData[(1) + 1]; 270 271 shouldBeUnion { /* Static data */ 272 struct { 273 SCHAR aIidPrevFrameIndex[NO_HI_RES_IID_BINS]; /*!< The IID index for 274 previous frame */ 275 SCHAR aIccPrevFrameIndex[NO_HI_RES_ICC_BINS]; /*!< The ICC index for 276 previous frame */ 277 UCHAR 278 bPrevFrameFineIidQ; /*!< The IID quantization of the previous frame */ 279 UCHAR lastUsb; /*!< uppermost WMF delay band of last frame */ 280 281 FIXP_DBL pHybridAnaStatesLFdmx 282 [2 * 13 * NO_QMF_BANDS_HYBRID20]; /*!< Memory used in hybrid analysis 283 for filter states. */ 284 FDK_ANA_HYB_FILTER hybridAnalysis; 285 FDK_SYN_HYB_FILTER hybridSynthesis[2]; 286 287 DECORR_DEC apDecor; /*!< Decorrelator instance. */ 288 FIXP_DBL decorrBufferCplx[(2 * ((825) + (373)))]; 289 290 FIXP_DBL h11rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) 291 coefficients */ 292 FIXP_DBL h12rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) 293 coefficients */ 294 FIXP_DBL h21rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) 295 coefficients */ 296 FIXP_DBL h22rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) 297 coefficients */ 298 299 PS_DEC_COEFFICIENTS 300 *pCoef; /*!< temporal coefficients are on reusable scratch memory */ 301 302 } mpeg; 303 } 304 specificTo; 305 }; 306 307 typedef struct PS_DEC *HANDLE_PS_DEC; 308 309 int CreatePsDec(HANDLE_PS_DEC *h_PS_DEC, int aacSamplesPerFrame); 310 311 int DeletePsDec(HANDLE_PS_DEC *h_PS_DEC); 312 313 void PreparePsProcessing(HANDLE_PS_DEC h_ps_d, 314 const FIXP_DBL *const *const rIntBufferLeft, 315 const FIXP_DBL *const *const iIntBufferLeft, 316 const int scaleFactorLowBand); 317 318 void initSlotBasedRotation(HANDLE_PS_DEC h_ps_d, int env, int usb); 319 320 void ApplyPsSlot( 321 HANDLE_PS_DEC h_ps_d, /* parametric stereo decoder handle */ 322 FIXP_DBL **rIntBufferLeft, /* real values of left qmf timeslot */ 323 FIXP_DBL **iIntBufferLeft, /* imag values of left qmf timeslot */ 324 FIXP_DBL *rIntBufferRight, /* real values of right qmf timeslot */ 325 FIXP_DBL *iIntBufferRight, /* imag values of right qmf timeslot */ 326 const int scaleFactorLowBand_no_ov, const int scaleFactorLowBand, 327 const int scaleFactorHighBand, const int lsb, const int usb); 328 329 #endif /* PSDEC_H */ 330