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 /************************* System integration library **************************
96
97 Author(s):
98
99 Description: - Generic memory, stdio, string, etc. function wrappers or
100 builtins.
101 - OS dependant function wrappers.
102
103 *******************************************************************************/
104
105 #ifndef _CRT_SECURE_NO_WARNINGS
106 #define _CRT_SECURE_NO_WARNINGS
107 #endif
108
109 #define __GENERICSTDS_CPP__
110
111 #include "genericStds.h"
112
113 /* library info */
114 #define SYS_LIB_VL0 2
115 #define SYS_LIB_VL1 0
116 #define SYS_LIB_VL2 0
117 #define SYS_LIB_TITLE "System Integration Library"
118 #ifdef __ANDROID__
119 #define SYS_LIB_BUILD_DATE ""
120 #define SYS_LIB_BUILD_TIME ""
121 #else
122 #define SYS_LIB_BUILD_DATE __DATE__
123 #define SYS_LIB_BUILD_TIME __TIME__
124 #endif
125
126 #include <stdlib.h>
127 #include <stdio.h>
128 #include <string.h>
129 #include <stdarg.h>
130
131 /***************************************************************
132 * memory allocation monitoring variables
133 ***************************************************************/
134
135 /* Include OS/System specific implementations. */
136
137 #include <string.h>
138 #include <stdlib.h>
139 #include <stdio.h>
140
FDKprintf(const char * szFmt,...)141 void FDKprintf(const char *szFmt, ...) {
142 va_list ap;
143 va_start(ap, szFmt);
144 vprintf(szFmt, ap);
145 va_end(ap);
146 }
147
FDKprintfErr(const char * szFmt,...)148 void FDKprintfErr(const char *szFmt, ...) {
149 va_list ap;
150 va_start(ap, szFmt);
151 vfprintf(stderr, szFmt, ap);
152 va_end(ap);
153 }
154
FDKgetchar(void)155 int FDKgetchar(void) { return getchar(); }
156
FDKfprintf(FDKFILE * stream,const char * format,...)157 INT FDKfprintf(FDKFILE *stream, const char *format, ...) {
158 INT chars = 0;
159 va_list ap;
160 va_start(ap, format);
161 chars += vfprintf((FILE *)stream, format, ap);
162 va_end(ap);
163 return chars;
164 }
165
FDKsprintf(char * str,const char * format,...)166 INT FDKsprintf(char *str, const char *format, ...) {
167 INT chars = 0;
168 va_list ap;
169 va_start(ap, format);
170 chars += vsprintf(str, format, ap);
171 va_end(ap);
172 return chars;
173 }
174
175 /************************************************************************************************/
176
177 /************************************************************************************************/
178
FDKstrchr(char * s,INT c)179 char *FDKstrchr(char *s, INT c) { return strchr(s, c); }
FDKstrstr(const char * haystack,const char * needle)180 const char *FDKstrstr(const char *haystack, const char *needle) {
181 return strstr(haystack, needle);
182 }
FDKstrcpy(char * dest,const char * src)183 char *FDKstrcpy(char *dest, const char *src) { return strcpy(dest, src); }
FDKstrncpy(char * dest,const char * src,UINT n)184 char *FDKstrncpy(char *dest, const char *src, UINT n) {
185 return strncpy(dest, src, n);
186 }
187
188 /*************************************************************************
189 * DYNAMIC MEMORY management (heap)
190 *************************************************************************/
191
FDKcalloc(const UINT n,const UINT size)192 void *FDKcalloc(const UINT n, const UINT size) {
193 void *ptr;
194
195 ptr = calloc(n, size);
196
197 return ptr;
198 }
199
FDKmalloc(const UINT size)200 void *FDKmalloc(const UINT size) {
201 void *ptr;
202
203 ptr = malloc(size);
204
205 return ptr;
206 }
207
FDKfree(void * ptr)208 void FDKfree(void *ptr) { free((INT *)ptr); }
209
FDKaalloc(const UINT size,const UINT alignment)210 void *FDKaalloc(const UINT size, const UINT alignment) {
211 void *addr, *result = NULL;
212 addr = FDKcalloc(1, size + alignment +
213 (UINT)sizeof(void *)); /* Malloc and clear memory. */
214
215 if (addr != NULL) {
216 result = ALIGN_PTR((unsigned char *)addr +
217 sizeof(void *)); /* Get aligned memory base address. */
218 *(((void **)result) - 1) = addr; /* Save malloc'ed memory pointer. */
219 C_ALLOC_ALIGNED_REGISTER(result, size);
220 }
221
222 return result; /* Return aligned address. */
223 }
224
FDKafree(void * ptr)225 void FDKafree(void *ptr) {
226 void *addr;
227 addr = *(((void **)ptr) - 1); /* Get pointer to malloc'ed memory. */
228
229 C_ALLOC_ALIGNED_UNREGISTER(ptr);
230
231 FDKfree(addr); /* Free malloc'ed memory area. */
232 }
233
234 /*--------------------------------------------------------------------------*
235 * DATA MEMORY L1/L2 (fallback)
236 *--------------------------------------------------------------------------*/
237
238 /*--------------------------------------------------------------------------*
239 * FDKcalloc_L
240 *--------------------------------------------------------------------------*/
FDKcalloc_L(const UINT dim,const UINT size,MEMORY_SECTION s)241 void *FDKcalloc_L(const UINT dim, const UINT size, MEMORY_SECTION s) {
242 return FDKcalloc(dim, size);
243 }
244
FDKfree_L(void * p)245 void FDKfree_L(void *p) { FDKfree(p); }
246
FDKaalloc_L(const UINT size,const UINT alignment,MEMORY_SECTION s)247 void *FDKaalloc_L(const UINT size, const UINT alignment, MEMORY_SECTION s) {
248 void *addr, *result = NULL;
249 addr = FDKcalloc_L(1, size + alignment + (UINT)sizeof(void *),
250 s); /* Malloc and clear memory. */
251
252 if (addr != NULL) {
253 result = ALIGN_PTR((unsigned char *)addr +
254 sizeof(void *)); /* Get aligned memory base address. */
255 *(((void **)result) - 1) = addr; /* Save malloc'ed memory pointer. */
256 C_ALLOC_ALIGNED_REGISTER(result, size);
257 }
258
259 return result; /* Return aligned address. */
260 }
261
FDKafree_L(void * ptr)262 void FDKafree_L(void *ptr) {
263 void *addr;
264
265 addr = *(((void **)ptr) - 1); /* Get pointer to malloc'ed memory. */
266
267 C_ALLOC_ALIGNED_UNREGISTER(ptr);
268
269 FDKfree_L(addr); /* Free malloc'ed memory area. */
270 }
271
272 /*---------------------------------------------------------------------------------------
273 * FUNCTION: FDKmemcpy
274 * DESCRIPTION: - copies memory from "src" to "dst" with length "size" bytes
275 * - compiled with FDK_DEBUG will give you warnings
276 *---------------------------------------------------------------------------------------*/
FDKmemcpy(void * dst,const void * src,const UINT size)277 void FDKmemcpy(void *dst, const void *src, const UINT size) {
278 /* -- check for overlapping memory areas -- */
279 FDK_ASSERT(((const unsigned char *)dst - (const unsigned char *)src) >=
280 (ptrdiff_t)size ||
281 ((const unsigned char *)src - (const unsigned char *)dst) >=
282 (ptrdiff_t)size);
283
284 /* do the copy */
285 memcpy(dst, src, size);
286 }
287
FDKmemmove(void * dst,const void * src,const UINT size)288 void FDKmemmove(void *dst, const void *src, const UINT size) {
289 memmove(dst, src, size);
290 }
291
FDKmemset(void * memPtr,const INT value,const UINT size)292 void FDKmemset(void *memPtr, const INT value, const UINT size) {
293 memset(memPtr, value, size);
294 }
295
FDKmemclear(void * memPtr,const UINT size)296 void FDKmemclear(void *memPtr, const UINT size) { FDKmemset(memPtr, 0, size); }
297
FDKstrlen(const char * s)298 UINT FDKstrlen(const char *s) { return (UINT)strlen(s); }
299
300 /* Compare function wrappers */
FDKmemcmp(const void * s1,const void * s2,const UINT size)301 INT FDKmemcmp(const void *s1, const void *s2, const UINT size) {
302 return memcmp(s1, s2, size);
303 }
FDKstrcmp(const char * s1,const char * s2)304 INT FDKstrcmp(const char *s1, const char *s2) { return strcmp(s1, s2); }
FDKstrncmp(const char * s1,const char * s2,const UINT size)305 INT FDKstrncmp(const char *s1, const char *s2, const UINT size) {
306 return strncmp(s1, s2, size);
307 }
308
IS_LITTLE_ENDIAN(void)309 int IS_LITTLE_ENDIAN(void) {
310 int __dummy = 1;
311 return (*((UCHAR *)(&(__dummy))));
312 }
313
TO_LITTLE_ENDIAN(UINT val)314 UINT TO_LITTLE_ENDIAN(UINT val) {
315 return IS_LITTLE_ENDIAN()
316 ? val
317 : (((val & 0xff) << 24) | ((val & 0xff00) << 8) |
318 ((val & 0xff0000) >> 8) | ((val & 0xff000000) >> 24));
319 }
320
321 /* ==================== FILE I/O ====================== */
322
FDKfopen(const char * filename,const char * mode)323 FDKFILE *FDKfopen(const char *filename, const char *mode) {
324 return fopen(filename, mode);
325 }
FDKfclose(FDKFILE * fp)326 INT FDKfclose(FDKFILE *fp) { return fclose((FILE *)fp); }
FDKfseek(FDKFILE * fp,LONG OFFSET,int WHENCE)327 INT FDKfseek(FDKFILE *fp, LONG OFFSET, int WHENCE) {
328 return fseek((FILE *)fp, OFFSET, WHENCE);
329 }
FDKftell(FDKFILE * fp)330 INT FDKftell(FDKFILE *fp) { return ftell((FILE *)fp); }
FDKfflush(FDKFILE * fp)331 INT FDKfflush(FDKFILE *fp) { return fflush((FILE *)fp); }
332 const INT FDKSEEK_SET = SEEK_SET;
333 const INT FDKSEEK_CUR = SEEK_CUR;
334 const INT FDKSEEK_END = SEEK_END;
335
FDKfwrite(const void * ptrf,INT size,UINT nmemb,FDKFILE * fp)336 UINT FDKfwrite(const void *ptrf, INT size, UINT nmemb, FDKFILE *fp) {
337 return (UINT)fwrite(ptrf, size, nmemb, (FILE *)fp);
338 }
FDKfread(void * dst,INT size,UINT nmemb,FDKFILE * fp)339 UINT FDKfread(void *dst, INT size, UINT nmemb, FDKFILE *fp) {
340 return (UINT)fread(dst, size, nmemb, (FILE *)fp);
341 }
FDKfgets(void * dst,INT size,FDKFILE * fp)342 char *FDKfgets(void *dst, INT size, FDKFILE *fp) {
343 return fgets((char *)dst, size, (FILE *)fp);
344 }
FDKrewind(FDKFILE * fp)345 void FDKrewind(FDKFILE *fp) { FDKfseek((FILE *)fp, 0, FDKSEEK_SET); }
346
FDKfwrite_EL(const void * ptrf,INT size,UINT nmemb,FDKFILE * fp)347 UINT FDKfwrite_EL(const void *ptrf, INT size, UINT nmemb, FDKFILE *fp) {
348 if (IS_LITTLE_ENDIAN()) {
349 FDKfwrite(ptrf, size, nmemb, fp);
350 } else {
351 UINT n;
352 INT s;
353
354 const UCHAR *ptr = (const UCHAR *)ptrf;
355
356 for (n = 0; n < nmemb; n++) {
357 for (s = size - 1; s >= 0; s--) {
358 FDKfwrite(ptr + s, 1, 1, fp);
359 }
360 ptr = ptr + size;
361 }
362 }
363 return nmemb;
364 }
365
FDKfread_EL(void * dst,INT size,UINT nmemb,FDKFILE * fp)366 UINT FDKfread_EL(void *dst, INT size, UINT nmemb, FDKFILE *fp) {
367 UINT n, s0, s1, err;
368 UCHAR tmp, *ptr;
369 UCHAR tmp24[3];
370
371 /* Enforce alignment of 24 bit data. */
372 if (size == 3) {
373 ptr = (UCHAR *)dst;
374 for (n = 0; n < nmemb; n++) {
375 if ((err = FDKfread(tmp24, 1, 3, fp)) != 3) {
376 return err;
377 }
378 *ptr++ = tmp24[0];
379 *ptr++ = tmp24[1];
380 *ptr++ = tmp24[2];
381 /* Sign extension */
382 if (tmp24[2] & 0x80) {
383 *ptr++ = 0xff;
384 } else {
385 *ptr++ = 0;
386 }
387 }
388 err = nmemb;
389 size = sizeof(LONG);
390 } else {
391 if ((err = FDKfread(dst, size, nmemb, fp)) != nmemb) {
392 return err;
393 }
394 }
395 if (!IS_LITTLE_ENDIAN() && size > 1) {
396 ptr = (UCHAR *)dst;
397 for (n = 0; n < nmemb; n++) {
398 for (s0 = 0, s1 = size - 1; s0 < s1; s0++, s1--) {
399 tmp = ptr[s0];
400 ptr[s0] = ptr[s1];
401 ptr[s1] = tmp;
402 }
403 ptr += size;
404 }
405 }
406 return err;
407 }
408
FDKfeof(FDKFILE * fp)409 INT FDKfeof(FDKFILE *fp) { return feof((FILE *)fp); }
410
411 /* Global initialization/cleanup */
412
FDKprintDisclaimer(void)413 void FDKprintDisclaimer(void) {
414 FDKprintf(
415 "This program is protected by copyright law and international treaties.\n"
416 "Any reproduction or distribution of this program, or any portion\n"
417 "of it, may result in severe civil and criminal penalties, and will be\n"
418 "prosecuted to the maximum extent possible under law.\n\n");
419 }
420