1/* ----------------------------------------------------------------------------- 2Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten 5Forschung e.V. All rights reserved. 6 7 1. INTRODUCTION 8The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 9that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 10scheme for digital audio. This FDK AAC Codec software is intended to be used on 11a wide variety of Android devices. 12 13AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 14general perceptual audio codecs. AAC-ELD is considered the best-performing 15full-bandwidth communications codec by independent studies and is widely 16deployed. AAC has been standardized by ISO and IEC as part of the MPEG 17specifications. 18 19Patent licenses for necessary patent claims for the FDK AAC Codec (including 20those of Fraunhofer) may be obtained through Via Licensing 21(www.vialicensing.com) or through the respective patent owners individually for 22the purpose of encoding or decoding bit streams in products that are compliant 23with the ISO/IEC MPEG audio standards. Please note that most manufacturers of 24Android devices already license these patent claims through Via Licensing or 25directly from the patent owners, and therefore FDK AAC Codec software may 26already be covered under those patent licenses when it is used for those 27licensed purposes only. 28 29Commercially-licensed AAC software libraries, including floating-point versions 30with enhanced sound quality, are also available from Fraunhofer. Users are 31encouraged to check the Fraunhofer website for additional applications 32information and documentation. 33 342. COPYRIGHT LICENSE 35 36Redistribution and use in source and binary forms, with or without modification, 37are permitted without payment of copyright license fees provided that you 38satisfy the following conditions: 39 40You must retain the complete text of this software license in redistributions of 41the FDK AAC Codec or your modifications thereto in source code form. 42 43You must retain the complete text of this software license in the documentation 44and/or other materials provided with redistributions of the FDK AAC Codec or 45your modifications thereto in binary form. You must make available free of 46charge copies of the complete source code of the FDK AAC Codec and your 47modifications thereto to recipients of copies in binary form. 48 49The name of Fraunhofer may not be used to endorse or promote products derived 50from this library without prior written permission. 51 52You may not charge copyright license fees for anyone to use, copy or distribute 53the FDK AAC Codec software or your modifications thereto. 54 55Your modified versions of the FDK AAC Codec must carry prominent notices stating 56that you changed the software and the date of any change. For modified versions 57of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 58must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 59AAC Codec Library for Android." 60 613. NO PATENT LICENSE 62 63NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 64limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 65Fraunhofer provides no warranty of patent non-infringement with respect to this 66software. 67 68You may use this FDK AAC Codec software or modifications thereto only for 69purposes that are authorized by appropriate patent licenses. 70 714. DISCLAIMER 72 73This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 74holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 75including but not limited to the implied warranties of merchantability and 76fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 77CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 78or consequential damages, including but not limited to procurement of substitute 79goods or services; loss of use, data, or profits, or business interruption, 80however caused and on any theory of liability, whether in contract, strict 81liability, or tort (including negligence), arising in any way out of the use of 82this software, even if advised of the possibility of such damage. 83 845. CONTACT INFORMATION 85 86Fraunhofer Institute for Integrated Circuits IIS 87Attention: Audio and Multimedia Departments - FDK AAC LL 88Am Wolfsmantel 33 8991058 Erlangen, Germany 90 91www.iis.fraunhofer.de/amm 92amm-info@iis.fraunhofer.de 93----------------------------------------------------------------------------- */ 94 95/******************* Library for basic calculation routines ******************** 96 97 Author(s): 98 99 Description: dit_fft ARM assembler replacements. 100 101*******************************************************************************/ 102 103#ifndef __FFT_RAD2_CPP__ 104#error \ 105 "Do not compile this file separately. It is included on demand from fft_rad2.cpp" 106#endif 107 108#ifndef FUNCTION_dit_fft 109#if defined(SINETABLE_16BIT) 110 111#define FUNCTION_dit_fft 112#if defined(FUNCTION_dit_fft) 113 114void dit_fft(FIXP_DBL *x, const INT ldn, const FIXP_STP *trigdata, 115 const INT trigDataSize) { 116 const INT n = 1 << ldn; 117 INT i; 118 119 scramble(x, n); 120 /* 121 * 1+2 stage radix 4 122 */ 123 124 for (i = 0; i < n * 2; i += 8) { 125 FIXP_DBL a00, a10, a20, a30; 126 a00 = (x[i + 0] + x[i + 2]) >> 1; /* Re A + Re B */ 127 a10 = (x[i + 4] + x[i + 6]) >> 1; /* Re C + Re D */ 128 a20 = (x[i + 1] + x[i + 3]) >> 1; /* Im A + Im B */ 129 a30 = (x[i + 5] + x[i + 7]) >> 1; /* Im C + Im D */ 130 131 x[i + 0] = a00 + a10; /* Re A' = Re A + Re B + Re C + Re D */ 132 x[i + 4] = a00 - a10; /* Re C' = Re A + Re B - Re C - Re D */ 133 x[i + 1] = a20 + a30; /* Im A' = Im A + Im B + Im C + Im D */ 134 x[i + 5] = a20 - a30; /* Im C' = Im A + Im B - Im C - Im D */ 135 136 a00 = a00 - x[i + 2]; /* Re A - Re B */ 137 a10 = a10 - x[i + 6]; /* Re C - Re D */ 138 a20 = a20 - x[i + 3]; /* Im A - Im B */ 139 a30 = a30 - x[i + 7]; /* Im C - Im D */ 140 141 x[i + 2] = a00 + a30; /* Re B' = Re A - Re B + Im C - Im D */ 142 x[i + 6] = a00 - a30; /* Re D' = Re A - Re B - Im C + Im D */ 143 x[i + 3] = a20 - a10; /* Im B' = Im A - Im B - Re C + Re D */ 144 x[i + 7] = a20 + a10; /* Im D' = Im A - Im B + Re C - Re D */ 145 } 146 147 INT mh = 1 << 1; 148 INT ldm = ldn - 2; 149 INT trigstep = trigDataSize; 150 151 do { 152 const FIXP_STP *pTrigData = trigdata; 153 INT j; 154 155 mh <<= 1; 156 trigstep >>= 1; 157 158 FDK_ASSERT(trigstep > 0); 159 160 /* Do first iteration with c=1.0 and s=0.0 separately to avoid loosing to 161 much precision. Beware: The impact on the overal FFT precision is rather 162 large. */ 163 { 164 FIXP_DBL *xt1 = x; 165 int r = n; 166 167 do { 168 FIXP_DBL *xt2 = xt1 + (mh << 1); 169 /* 170 FIXP_DBL *xt1 = x+ ((r)<<1); 171 FIXP_DBL *xt2 = xt1 + (mh<<1); 172 */ 173 FIXP_DBL vr, vi, ur, ui; 174 175 // cplxMultDiv2(&vi, &vr, x[t2+1], x[t2], (FIXP_SGL)1.0, (FIXP_SGL)0.0); 176 vi = xt2[1] >> 1; 177 vr = xt2[0] >> 1; 178 179 ur = xt1[0] >> 1; 180 ui = xt1[1] >> 1; 181 182 xt1[0] = ur + vr; 183 xt1[1] = ui + vi; 184 185 xt2[0] = ur - vr; 186 xt2[1] = ui - vi; 187 188 xt1 += mh; 189 xt2 += mh; 190 191 // cplxMultDiv2(&vr, &vi, x[t2+1], x[t2], (FIXP_SGL)1.0, (FIXP_SGL)0.0); 192 vr = xt2[1] >> 1; 193 vi = xt2[0] >> 1; 194 195 ur = xt1[0] >> 1; 196 ui = xt1[1] >> 1; 197 198 xt1[0] = ur + vr; 199 xt1[1] = ui - vi; 200 201 xt2[0] = ur - vr; 202 xt2[1] = ui + vi; 203 204 xt1 = xt2 + mh; 205 } while ((r = r - (mh << 1)) != 0); 206 } 207 for (j = 4; j < mh; j += 4) { 208 FIXP_DBL *xt1 = x + (j >> 1); 209 FIXP_SPK cs; 210 int r = n; 211 212 pTrigData += trigstep; 213 cs = *pTrigData; 214 215 do { 216 FIXP_DBL *xt2 = xt1 + (mh << 1); 217 FIXP_DBL vr, vi, ur, ui; 218 219 cplxMultDiv2(&vi, &vr, xt2[1], xt2[0], cs); 220 221 ur = xt1[0] >> 1; 222 ui = xt1[1] >> 1; 223 224 xt1[0] = ur + vr; 225 xt1[1] = ui + vi; 226 227 xt2[0] = ur - vr; 228 xt2[1] = ui - vi; 229 230 xt1 += mh; 231 xt2 += mh; 232 233 cplxMultDiv2(&vr, &vi, xt2[1], xt2[0], cs); 234 235 ur = xt1[0] >> 1; 236 ui = xt1[1] >> 1; 237 238 xt1[0] = ur + vr; 239 xt1[1] = ui - vi; 240 241 xt2[0] = ur - vr; 242 xt2[1] = ui + vi; 243 244 /* Same as above but for t1,t2 with j>mh/4 and thus cs swapped */ 245 xt1 = xt1 - (j); 246 xt2 = xt1 + (mh << 1); 247 248 cplxMultDiv2(&vi, &vr, xt2[0], xt2[1], cs); 249 250 ur = xt1[0] >> 1; 251 ui = xt1[1] >> 1; 252 253 xt1[0] = ur + vr; 254 xt1[1] = ui - vi; 255 256 xt2[0] = ur - vr; 257 xt2[1] = ui + vi; 258 259 xt1 += mh; 260 xt2 += mh; 261 262 cplxMultDiv2(&vr, &vi, xt2[0], xt2[1], cs); 263 264 ur = xt1[0] >> 1; 265 ui = xt1[1] >> 1; 266 267 xt1[0] = ur - vr; 268 xt1[1] = ui - vi; 269 270 xt2[0] = ur + vr; 271 xt2[1] = ui + vi; 272 273 xt1 = xt2 + (j); 274 } while ((r = r - (mh << 1)) != 0); 275 } 276 { 277 FIXP_DBL *xt1 = x + (mh >> 1); 278 int r = n; 279 280 do { 281 FIXP_DBL *xt2 = xt1 + (mh << 1); 282 FIXP_DBL vr, vi, ur, ui; 283 284 cplxMultDiv2(&vi, &vr, xt2[1], xt2[0], STC(0x5a82799a), 285 STC(0x5a82799a)); 286 287 ur = xt1[0] >> 1; 288 ui = xt1[1] >> 1; 289 290 xt1[0] = ur + vr; 291 xt1[1] = ui + vi; 292 293 xt2[0] = ur - vr; 294 xt2[1] = ui - vi; 295 296 xt1 += mh; 297 xt2 += mh; 298 299 cplxMultDiv2(&vr, &vi, xt2[1], xt2[0], STC(0x5a82799a), 300 STC(0x5a82799a)); 301 302 ur = xt1[0] >> 1; 303 ui = xt1[1] >> 1; 304 305 xt1[0] = ur + vr; 306 xt1[1] = ui - vi; 307 308 xt2[0] = ur - vr; 309 xt2[1] = ui + vi; 310 311 xt1 = xt2 + mh; 312 } while ((r = r - (mh << 1)) != 0); 313 } 314 } while (--ldm != 0); 315} 316 317#endif /* if defined(FUNCTION_dit_fft) */ 318 319#endif /* if defined(SINETABLE_16BIT) */ 320 321#endif /* ifndef FUNCTION_dit_fft */ 322