1 /* ----------------------------------------------------------------------------- 2 Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4 Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Frderung 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 (at) iis.fraunhofer.de 93 ----------------------------------------------------------------------------- */ 94 95 /**************************** AAC decoder library ****************************** 96 97 Author(s): 98 99 Description: low delay filterbank 100 101 *******************************************************************************/ 102 103 #include "ldfiltbank.h" 104 105 #include "aac_rom.h" 106 #include "dct.h" 107 #include "FDK_tools_rom.h" 108 #include "mdct.h" 109 110 #define LDFB_HEADROOM 2 111 112 #if defined(__arm__) 113 #endif 114 115 static void multE2_DinvF_fdk(FIXP_PCM *output, FIXP_DBL *x, const FIXP_WTB *fb, 116 FIXP_DBL *z, const int N) { 117 int i; 118 119 /* scale for FIXP_DBL -> INT_PCM conversion. */ 120 const int scale = (DFRACT_BITS - SAMPLE_BITS) - LDFB_HEADROOM; 121 #if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0) 122 FIXP_DBL rnd_val_wts0 = (FIXP_DBL)0; 123 FIXP_DBL rnd_val_wts1 = (FIXP_DBL)0; 124 if (-WTS0 - 1 + scale) 125 rnd_val_wts0 = (FIXP_DBL)(1 << (-WTS0 - 1 + scale - 1)); 126 if (-WTS1 - 1 + scale) 127 rnd_val_wts1 = (FIXP_DBL)(1 << (-WTS1 - 1 + scale - 1)); 128 #endif 129 130 for (i = 0; i < N / 4; i++) { 131 FIXP_DBL z0, z2, tmp; 132 133 z2 = x[N / 2 + i]; 134 z0 = z2 + (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1)); 135 136 z[N / 2 + i] = x[N / 2 - 1 - i] + 137 (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1)); 138 139 tmp = (fMultDiv2(z[N / 2 + i], fb[N + N / 2 - 1 - i]) + 140 fMultDiv2(z[i], fb[N + N / 2 + i])); 141 142 #if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0) 143 FDK_ASSERT((-WTS1 - 1 + scale) >= 0); 144 FDK_ASSERT(tmp <= ((FIXP_DBL)0x7FFFFFFF - 145 rnd_val_wts1)); /* rounding must not cause overflow */ 146 output[(N * 3 / 4 - 1 - i)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT( 147 tmp + rnd_val_wts1, -WTS1 - 1 + scale, PCM_OUT_BITS); 148 #else 149 FDK_ASSERT((WTS1 + 1 - scale) >= 0); 150 output[(N * 3 / 4 - 1 - i)] = 151 (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp, WTS1 + 1 - scale, PCM_OUT_BITS); 152 #endif 153 154 z[i] = z0; 155 z[N + i] = z2; 156 } 157 158 for (i = N / 4; i < N / 2; i++) { 159 FIXP_DBL z0, z2, tmp0, tmp1; 160 161 z2 = x[N / 2 + i]; 162 z0 = z2 + (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1)); 163 164 z[N / 2 + i] = x[N / 2 - 1 - i] + 165 (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1)); 166 167 tmp0 = (fMultDiv2(z[N / 2 + i], fb[N / 2 - 1 - i]) + 168 fMultDiv2(z[i], fb[N / 2 + i])); 169 tmp1 = (fMultDiv2(z[N / 2 + i], fb[N + N / 2 - 1 - i]) + 170 fMultDiv2(z[i], fb[N + N / 2 + i])); 171 172 #if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0) 173 FDK_ASSERT((-WTS0 - 1 + scale) >= 0); 174 FDK_ASSERT(tmp0 <= ((FIXP_DBL)0x7FFFFFFF - 175 rnd_val_wts0)); /* rounding must not cause overflow */ 176 FDK_ASSERT(tmp1 <= ((FIXP_DBL)0x7FFFFFFF - 177 rnd_val_wts1)); /* rounding must not cause overflow */ 178 output[(i - N / 4)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT( 179 tmp0 + rnd_val_wts0, -WTS0 - 1 + scale, PCM_OUT_BITS); 180 output[(N * 3 / 4 - 1 - i)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT( 181 tmp1 + rnd_val_wts1, -WTS1 - 1 + scale, PCM_OUT_BITS); 182 #else 183 FDK_ASSERT((WTS0 + 1 - scale) >= 0); 184 output[(i - N / 4)] = 185 (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS); 186 output[(N * 3 / 4 - 1 - i)] = 187 (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp1, WTS1 + 1 - scale, PCM_OUT_BITS); 188 #endif 189 z[i] = z0; 190 z[N + i] = z2; 191 } 192 193 /* Exchange quarter parts of x to bring them in the "right" order */ 194 for (i = 0; i < N / 4; i++) { 195 FIXP_DBL tmp0 = fMultDiv2(z[i], fb[N / 2 + i]); 196 197 #if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0) 198 FDK_ASSERT((-WTS0 - 1 + scale) >= 0); 199 FDK_ASSERT(tmp0 <= ((FIXP_DBL)0x7FFFFFFF - 200 rnd_val_wts0)); /* rounding must not cause overflow */ 201 output[(N * 3 / 4 + i)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT( 202 tmp0 + rnd_val_wts0, -WTS0 - 1 + scale, PCM_OUT_BITS); 203 #else 204 FDK_ASSERT((WTS0 + 1 - scale) >= 0); 205 output[(N * 3 / 4 + i)] = 206 (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS); 207 #endif 208 } 209 } 210 211 int InvMdctTransformLowDelay_fdk(FIXP_DBL *mdctData, const int mdctData_e, 212 FIXP_PCM *output, FIXP_DBL *fs_buffer, 213 const int N) { 214 const FIXP_WTB *coef; 215 FIXP_DBL gain = (FIXP_DBL)0; 216 int scale = mdctData_e + MDCT_OUT_HEADROOM - 217 LDFB_HEADROOM; /* The LDFB_HEADROOM is compensated inside 218 multE2_DinvF_fdk() below */ 219 int i; 220 221 /* Select LD window slope */ 222 switch (N) { 223 case 256: 224 coef = LowDelaySynthesis256; 225 break; 226 case 240: 227 coef = LowDelaySynthesis240; 228 break; 229 case 160: 230 coef = LowDelaySynthesis160; 231 break; 232 case 128: 233 coef = LowDelaySynthesis128; 234 break; 235 case 120: 236 coef = LowDelaySynthesis120; 237 break; 238 case 512: 239 coef = LowDelaySynthesis512; 240 break; 241 case 480: 242 default: 243 coef = LowDelaySynthesis480; 244 break; 245 } 246 247 /* 248 Apply exponent and 1/N factor. 249 Note: "scale" is off by one because for LD_MDCT the window length is twice 250 the window length of a regular MDCT. This is corrected inside 251 multE2_DinvF_fdk(). Refer to ISO/IEC 14496-3:2009 page 277, 252 chapter 4.6.20.2 "Low Delay Window". 253 */ 254 imdct_gain(&gain, &scale, N); 255 256 dct_IV(mdctData, N, &scale); 257 258 if (N == 256 || N == 240 || N == 160) { 259 scale -= 1; 260 } else if (N == 128 || N == 120) { 261 scale -= 2; 262 } 263 264 if (gain != (FIXP_DBL)0) { 265 for (i = 0; i < N; i++) { 266 mdctData[i] = fMult(mdctData[i], gain); 267 } 268 } 269 scaleValuesSaturate(mdctData, N, scale); 270 271 /* Since all exponent and factors have been applied, current exponent is zero. 272 */ 273 multE2_DinvF_fdk(output, mdctData, coef, fs_buffer, N); 274 275 return (1); 276 } 277