1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker
4*e5436536SAndroid Build Coastguard Worker © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker
7*e5436536SAndroid Build Coastguard Worker 1. INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker
34*e5436536SAndroid Build Coastguard Worker 2. COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker
61*e5436536SAndroid Build Coastguard Worker 3. NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker
71*e5436536SAndroid Build Coastguard Worker 4. DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker
84*e5436536SAndroid Build Coastguard Worker 5. CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker
95*e5436536SAndroid Build Coastguard Worker /************************* System integration library **************************
96*e5436536SAndroid Build Coastguard Worker
97*e5436536SAndroid Build Coastguard Worker Author(s):
98*e5436536SAndroid Build Coastguard Worker
99*e5436536SAndroid Build Coastguard Worker Description: - Generic memory, stdio, string, etc. function wrappers or
100*e5436536SAndroid Build Coastguard Worker builtins.
101*e5436536SAndroid Build Coastguard Worker - OS dependant function wrappers.
102*e5436536SAndroid Build Coastguard Worker
103*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
104*e5436536SAndroid Build Coastguard Worker
105*e5436536SAndroid Build Coastguard Worker #ifndef _CRT_SECURE_NO_WARNINGS
106*e5436536SAndroid Build Coastguard Worker #define _CRT_SECURE_NO_WARNINGS
107*e5436536SAndroid Build Coastguard Worker #endif
108*e5436536SAndroid Build Coastguard Worker
109*e5436536SAndroid Build Coastguard Worker #define __GENERICSTDS_CPP__
110*e5436536SAndroid Build Coastguard Worker
111*e5436536SAndroid Build Coastguard Worker #include "genericStds.h"
112*e5436536SAndroid Build Coastguard Worker
113*e5436536SAndroid Build Coastguard Worker /* library info */
114*e5436536SAndroid Build Coastguard Worker #define SYS_LIB_VL0 2
115*e5436536SAndroid Build Coastguard Worker #define SYS_LIB_VL1 0
116*e5436536SAndroid Build Coastguard Worker #define SYS_LIB_VL2 0
117*e5436536SAndroid Build Coastguard Worker #define SYS_LIB_TITLE "System Integration Library"
118*e5436536SAndroid Build Coastguard Worker #ifdef __ANDROID__
119*e5436536SAndroid Build Coastguard Worker #define SYS_LIB_BUILD_DATE ""
120*e5436536SAndroid Build Coastguard Worker #define SYS_LIB_BUILD_TIME ""
121*e5436536SAndroid Build Coastguard Worker #else
122*e5436536SAndroid Build Coastguard Worker #define SYS_LIB_BUILD_DATE __DATE__
123*e5436536SAndroid Build Coastguard Worker #define SYS_LIB_BUILD_TIME __TIME__
124*e5436536SAndroid Build Coastguard Worker #endif
125*e5436536SAndroid Build Coastguard Worker
126*e5436536SAndroid Build Coastguard Worker #include <stdlib.h>
127*e5436536SAndroid Build Coastguard Worker #include <stdio.h>
128*e5436536SAndroid Build Coastguard Worker #include <string.h>
129*e5436536SAndroid Build Coastguard Worker #include <stdarg.h>
130*e5436536SAndroid Build Coastguard Worker
131*e5436536SAndroid Build Coastguard Worker /***************************************************************
132*e5436536SAndroid Build Coastguard Worker * memory allocation monitoring variables
133*e5436536SAndroid Build Coastguard Worker ***************************************************************/
134*e5436536SAndroid Build Coastguard Worker
135*e5436536SAndroid Build Coastguard Worker /* Include OS/System specific implementations. */
136*e5436536SAndroid Build Coastguard Worker
137*e5436536SAndroid Build Coastguard Worker #include <string.h>
138*e5436536SAndroid Build Coastguard Worker #include <stdlib.h>
139*e5436536SAndroid Build Coastguard Worker #include <stdio.h>
140*e5436536SAndroid Build Coastguard Worker
FDKprintf(const char * szFmt,...)141*e5436536SAndroid Build Coastguard Worker void FDKprintf(const char *szFmt, ...) {
142*e5436536SAndroid Build Coastguard Worker va_list ap;
143*e5436536SAndroid Build Coastguard Worker va_start(ap, szFmt);
144*e5436536SAndroid Build Coastguard Worker vprintf(szFmt, ap);
145*e5436536SAndroid Build Coastguard Worker va_end(ap);
146*e5436536SAndroid Build Coastguard Worker }
147*e5436536SAndroid Build Coastguard Worker
FDKprintfErr(const char * szFmt,...)148*e5436536SAndroid Build Coastguard Worker void FDKprintfErr(const char *szFmt, ...) {
149*e5436536SAndroid Build Coastguard Worker va_list ap;
150*e5436536SAndroid Build Coastguard Worker va_start(ap, szFmt);
151*e5436536SAndroid Build Coastguard Worker vfprintf(stderr, szFmt, ap);
152*e5436536SAndroid Build Coastguard Worker va_end(ap);
153*e5436536SAndroid Build Coastguard Worker }
154*e5436536SAndroid Build Coastguard Worker
FDKgetchar(void)155*e5436536SAndroid Build Coastguard Worker int FDKgetchar(void) { return getchar(); }
156*e5436536SAndroid Build Coastguard Worker
FDKfprintf(FDKFILE * stream,const char * format,...)157*e5436536SAndroid Build Coastguard Worker INT FDKfprintf(FDKFILE *stream, const char *format, ...) {
158*e5436536SAndroid Build Coastguard Worker INT chars = 0;
159*e5436536SAndroid Build Coastguard Worker va_list ap;
160*e5436536SAndroid Build Coastguard Worker va_start(ap, format);
161*e5436536SAndroid Build Coastguard Worker chars += vfprintf((FILE *)stream, format, ap);
162*e5436536SAndroid Build Coastguard Worker va_end(ap);
163*e5436536SAndroid Build Coastguard Worker return chars;
164*e5436536SAndroid Build Coastguard Worker }
165*e5436536SAndroid Build Coastguard Worker
FDKsprintf(char * str,const char * format,...)166*e5436536SAndroid Build Coastguard Worker INT FDKsprintf(char *str, const char *format, ...) {
167*e5436536SAndroid Build Coastguard Worker INT chars = 0;
168*e5436536SAndroid Build Coastguard Worker va_list ap;
169*e5436536SAndroid Build Coastguard Worker va_start(ap, format);
170*e5436536SAndroid Build Coastguard Worker chars += vsprintf(str, format, ap);
171*e5436536SAndroid Build Coastguard Worker va_end(ap);
172*e5436536SAndroid Build Coastguard Worker return chars;
173*e5436536SAndroid Build Coastguard Worker }
174*e5436536SAndroid Build Coastguard Worker
175*e5436536SAndroid Build Coastguard Worker /************************************************************************************************/
176*e5436536SAndroid Build Coastguard Worker
177*e5436536SAndroid Build Coastguard Worker /************************************************************************************************/
178*e5436536SAndroid Build Coastguard Worker
FDKstrchr(char * s,INT c)179*e5436536SAndroid Build Coastguard Worker char *FDKstrchr(char *s, INT c) { return strchr(s, c); }
FDKstrstr(const char * haystack,const char * needle)180*e5436536SAndroid Build Coastguard Worker const char *FDKstrstr(const char *haystack, const char *needle) {
181*e5436536SAndroid Build Coastguard Worker return strstr(haystack, needle);
182*e5436536SAndroid Build Coastguard Worker }
FDKstrcpy(char * dest,const char * src)183*e5436536SAndroid Build Coastguard Worker char *FDKstrcpy(char *dest, const char *src) { return strcpy(dest, src); }
FDKstrncpy(char * dest,const char * src,UINT n)184*e5436536SAndroid Build Coastguard Worker char *FDKstrncpy(char *dest, const char *src, UINT n) {
185*e5436536SAndroid Build Coastguard Worker return strncpy(dest, src, n);
186*e5436536SAndroid Build Coastguard Worker }
187*e5436536SAndroid Build Coastguard Worker
188*e5436536SAndroid Build Coastguard Worker /*************************************************************************
189*e5436536SAndroid Build Coastguard Worker * DYNAMIC MEMORY management (heap)
190*e5436536SAndroid Build Coastguard Worker *************************************************************************/
191*e5436536SAndroid Build Coastguard Worker
FDKcalloc(const UINT n,const UINT size)192*e5436536SAndroid Build Coastguard Worker void *FDKcalloc(const UINT n, const UINT size) {
193*e5436536SAndroid Build Coastguard Worker void *ptr;
194*e5436536SAndroid Build Coastguard Worker
195*e5436536SAndroid Build Coastguard Worker ptr = calloc(n, size);
196*e5436536SAndroid Build Coastguard Worker
197*e5436536SAndroid Build Coastguard Worker return ptr;
198*e5436536SAndroid Build Coastguard Worker }
199*e5436536SAndroid Build Coastguard Worker
FDKmalloc(const UINT size)200*e5436536SAndroid Build Coastguard Worker void *FDKmalloc(const UINT size) {
201*e5436536SAndroid Build Coastguard Worker void *ptr;
202*e5436536SAndroid Build Coastguard Worker
203*e5436536SAndroid Build Coastguard Worker ptr = malloc(size);
204*e5436536SAndroid Build Coastguard Worker
205*e5436536SAndroid Build Coastguard Worker return ptr;
206*e5436536SAndroid Build Coastguard Worker }
207*e5436536SAndroid Build Coastguard Worker
FDKfree(void * ptr)208*e5436536SAndroid Build Coastguard Worker void FDKfree(void *ptr) { free((INT *)ptr); }
209*e5436536SAndroid Build Coastguard Worker
FDKaalloc(const UINT size,const UINT alignment)210*e5436536SAndroid Build Coastguard Worker void *FDKaalloc(const UINT size, const UINT alignment) {
211*e5436536SAndroid Build Coastguard Worker void *addr, *result = NULL;
212*e5436536SAndroid Build Coastguard Worker addr = FDKcalloc(1, size + alignment +
213*e5436536SAndroid Build Coastguard Worker (UINT)sizeof(void *)); /* Malloc and clear memory. */
214*e5436536SAndroid Build Coastguard Worker
215*e5436536SAndroid Build Coastguard Worker if (addr != NULL) {
216*e5436536SAndroid Build Coastguard Worker result = ALIGN_PTR((unsigned char *)addr +
217*e5436536SAndroid Build Coastguard Worker sizeof(void *)); /* Get aligned memory base address. */
218*e5436536SAndroid Build Coastguard Worker *(((void **)result) - 1) = addr; /* Save malloc'ed memory pointer. */
219*e5436536SAndroid Build Coastguard Worker C_ALLOC_ALIGNED_REGISTER(result, size);
220*e5436536SAndroid Build Coastguard Worker }
221*e5436536SAndroid Build Coastguard Worker
222*e5436536SAndroid Build Coastguard Worker return result; /* Return aligned address. */
223*e5436536SAndroid Build Coastguard Worker }
224*e5436536SAndroid Build Coastguard Worker
FDKafree(void * ptr)225*e5436536SAndroid Build Coastguard Worker void FDKafree(void *ptr) {
226*e5436536SAndroid Build Coastguard Worker void *addr;
227*e5436536SAndroid Build Coastguard Worker addr = *(((void **)ptr) - 1); /* Get pointer to malloc'ed memory. */
228*e5436536SAndroid Build Coastguard Worker
229*e5436536SAndroid Build Coastguard Worker C_ALLOC_ALIGNED_UNREGISTER(ptr);
230*e5436536SAndroid Build Coastguard Worker
231*e5436536SAndroid Build Coastguard Worker FDKfree(addr); /* Free malloc'ed memory area. */
232*e5436536SAndroid Build Coastguard Worker }
233*e5436536SAndroid Build Coastguard Worker
234*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------*
235*e5436536SAndroid Build Coastguard Worker * DATA MEMORY L1/L2 (fallback)
236*e5436536SAndroid Build Coastguard Worker *--------------------------------------------------------------------------*/
237*e5436536SAndroid Build Coastguard Worker
238*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------*
239*e5436536SAndroid Build Coastguard Worker * FDKcalloc_L
240*e5436536SAndroid Build Coastguard Worker *--------------------------------------------------------------------------*/
FDKcalloc_L(const UINT dim,const UINT size,MEMORY_SECTION s)241*e5436536SAndroid Build Coastguard Worker void *FDKcalloc_L(const UINT dim, const UINT size, MEMORY_SECTION s) {
242*e5436536SAndroid Build Coastguard Worker return FDKcalloc(dim, size);
243*e5436536SAndroid Build Coastguard Worker }
244*e5436536SAndroid Build Coastguard Worker
FDKfree_L(void * p)245*e5436536SAndroid Build Coastguard Worker void FDKfree_L(void *p) { FDKfree(p); }
246*e5436536SAndroid Build Coastguard Worker
FDKaalloc_L(const UINT size,const UINT alignment,MEMORY_SECTION s)247*e5436536SAndroid Build Coastguard Worker void *FDKaalloc_L(const UINT size, const UINT alignment, MEMORY_SECTION s) {
248*e5436536SAndroid Build Coastguard Worker void *addr, *result = NULL;
249*e5436536SAndroid Build Coastguard Worker addr = FDKcalloc_L(1, size + alignment + (UINT)sizeof(void *),
250*e5436536SAndroid Build Coastguard Worker s); /* Malloc and clear memory. */
251*e5436536SAndroid Build Coastguard Worker
252*e5436536SAndroid Build Coastguard Worker if (addr != NULL) {
253*e5436536SAndroid Build Coastguard Worker result = ALIGN_PTR((unsigned char *)addr +
254*e5436536SAndroid Build Coastguard Worker sizeof(void *)); /* Get aligned memory base address. */
255*e5436536SAndroid Build Coastguard Worker *(((void **)result) - 1) = addr; /* Save malloc'ed memory pointer. */
256*e5436536SAndroid Build Coastguard Worker C_ALLOC_ALIGNED_REGISTER(result, size);
257*e5436536SAndroid Build Coastguard Worker }
258*e5436536SAndroid Build Coastguard Worker
259*e5436536SAndroid Build Coastguard Worker return result; /* Return aligned address. */
260*e5436536SAndroid Build Coastguard Worker }
261*e5436536SAndroid Build Coastguard Worker
FDKafree_L(void * ptr)262*e5436536SAndroid Build Coastguard Worker void FDKafree_L(void *ptr) {
263*e5436536SAndroid Build Coastguard Worker void *addr;
264*e5436536SAndroid Build Coastguard Worker
265*e5436536SAndroid Build Coastguard Worker addr = *(((void **)ptr) - 1); /* Get pointer to malloc'ed memory. */
266*e5436536SAndroid Build Coastguard Worker
267*e5436536SAndroid Build Coastguard Worker C_ALLOC_ALIGNED_UNREGISTER(ptr);
268*e5436536SAndroid Build Coastguard Worker
269*e5436536SAndroid Build Coastguard Worker FDKfree_L(addr); /* Free malloc'ed memory area. */
270*e5436536SAndroid Build Coastguard Worker }
271*e5436536SAndroid Build Coastguard Worker
272*e5436536SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------------------
273*e5436536SAndroid Build Coastguard Worker * FUNCTION: FDKmemcpy
274*e5436536SAndroid Build Coastguard Worker * DESCRIPTION: - copies memory from "src" to "dst" with length "size" bytes
275*e5436536SAndroid Build Coastguard Worker * - compiled with FDK_DEBUG will give you warnings
276*e5436536SAndroid Build Coastguard Worker *---------------------------------------------------------------------------------------*/
FDKmemcpy(void * dst,const void * src,const UINT size)277*e5436536SAndroid Build Coastguard Worker void FDKmemcpy(void *dst, const void *src, const UINT size) {
278*e5436536SAndroid Build Coastguard Worker /* -- check for overlapping memory areas -- */
279*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(((const unsigned char *)dst - (const unsigned char *)src) >=
280*e5436536SAndroid Build Coastguard Worker (ptrdiff_t)size ||
281*e5436536SAndroid Build Coastguard Worker ((const unsigned char *)src - (const unsigned char *)dst) >=
282*e5436536SAndroid Build Coastguard Worker (ptrdiff_t)size);
283*e5436536SAndroid Build Coastguard Worker
284*e5436536SAndroid Build Coastguard Worker /* do the copy */
285*e5436536SAndroid Build Coastguard Worker memcpy(dst, src, size);
286*e5436536SAndroid Build Coastguard Worker }
287*e5436536SAndroid Build Coastguard Worker
FDKmemmove(void * dst,const void * src,const UINT size)288*e5436536SAndroid Build Coastguard Worker void FDKmemmove(void *dst, const void *src, const UINT size) {
289*e5436536SAndroid Build Coastguard Worker memmove(dst, src, size);
290*e5436536SAndroid Build Coastguard Worker }
291*e5436536SAndroid Build Coastguard Worker
FDKmemset(void * memPtr,const INT value,const UINT size)292*e5436536SAndroid Build Coastguard Worker void FDKmemset(void *memPtr, const INT value, const UINT size) {
293*e5436536SAndroid Build Coastguard Worker memset(memPtr, value, size);
294*e5436536SAndroid Build Coastguard Worker }
295*e5436536SAndroid Build Coastguard Worker
FDKmemclear(void * memPtr,const UINT size)296*e5436536SAndroid Build Coastguard Worker void FDKmemclear(void *memPtr, const UINT size) { FDKmemset(memPtr, 0, size); }
297*e5436536SAndroid Build Coastguard Worker
FDKstrlen(const char * s)298*e5436536SAndroid Build Coastguard Worker UINT FDKstrlen(const char *s) { return (UINT)strlen(s); }
299*e5436536SAndroid Build Coastguard Worker
300*e5436536SAndroid Build Coastguard Worker /* Compare function wrappers */
FDKmemcmp(const void * s1,const void * s2,const UINT size)301*e5436536SAndroid Build Coastguard Worker INT FDKmemcmp(const void *s1, const void *s2, const UINT size) {
302*e5436536SAndroid Build Coastguard Worker return memcmp(s1, s2, size);
303*e5436536SAndroid Build Coastguard Worker }
FDKstrcmp(const char * s1,const char * s2)304*e5436536SAndroid Build Coastguard Worker INT FDKstrcmp(const char *s1, const char *s2) { return strcmp(s1, s2); }
FDKstrncmp(const char * s1,const char * s2,const UINT size)305*e5436536SAndroid Build Coastguard Worker INT FDKstrncmp(const char *s1, const char *s2, const UINT size) {
306*e5436536SAndroid Build Coastguard Worker return strncmp(s1, s2, size);
307*e5436536SAndroid Build Coastguard Worker }
308*e5436536SAndroid Build Coastguard Worker
IS_LITTLE_ENDIAN(void)309*e5436536SAndroid Build Coastguard Worker int IS_LITTLE_ENDIAN(void) {
310*e5436536SAndroid Build Coastguard Worker int __dummy = 1;
311*e5436536SAndroid Build Coastguard Worker return (*((UCHAR *)(&(__dummy))));
312*e5436536SAndroid Build Coastguard Worker }
313*e5436536SAndroid Build Coastguard Worker
TO_LITTLE_ENDIAN(UINT val)314*e5436536SAndroid Build Coastguard Worker UINT TO_LITTLE_ENDIAN(UINT val) {
315*e5436536SAndroid Build Coastguard Worker return IS_LITTLE_ENDIAN()
316*e5436536SAndroid Build Coastguard Worker ? val
317*e5436536SAndroid Build Coastguard Worker : (((val & 0xff) << 24) | ((val & 0xff00) << 8) |
318*e5436536SAndroid Build Coastguard Worker ((val & 0xff0000) >> 8) | ((val & 0xff000000) >> 24));
319*e5436536SAndroid Build Coastguard Worker }
320*e5436536SAndroid Build Coastguard Worker
321*e5436536SAndroid Build Coastguard Worker /* ==================== FILE I/O ====================== */
322*e5436536SAndroid Build Coastguard Worker
FDKfopen(const char * filename,const char * mode)323*e5436536SAndroid Build Coastguard Worker FDKFILE *FDKfopen(const char *filename, const char *mode) {
324*e5436536SAndroid Build Coastguard Worker return fopen(filename, mode);
325*e5436536SAndroid Build Coastguard Worker }
FDKfclose(FDKFILE * fp)326*e5436536SAndroid Build Coastguard Worker INT FDKfclose(FDKFILE *fp) { return fclose((FILE *)fp); }
FDKfseek(FDKFILE * fp,LONG OFFSET,int WHENCE)327*e5436536SAndroid Build Coastguard Worker INT FDKfseek(FDKFILE *fp, LONG OFFSET, int WHENCE) {
328*e5436536SAndroid Build Coastguard Worker return fseek((FILE *)fp, OFFSET, WHENCE);
329*e5436536SAndroid Build Coastguard Worker }
FDKftell(FDKFILE * fp)330*e5436536SAndroid Build Coastguard Worker INT FDKftell(FDKFILE *fp) { return ftell((FILE *)fp); }
FDKfflush(FDKFILE * fp)331*e5436536SAndroid Build Coastguard Worker INT FDKfflush(FDKFILE *fp) { return fflush((FILE *)fp); }
332*e5436536SAndroid Build Coastguard Worker const INT FDKSEEK_SET = SEEK_SET;
333*e5436536SAndroid Build Coastguard Worker const INT FDKSEEK_CUR = SEEK_CUR;
334*e5436536SAndroid Build Coastguard Worker const INT FDKSEEK_END = SEEK_END;
335*e5436536SAndroid Build Coastguard Worker
FDKfwrite(const void * ptrf,INT size,UINT nmemb,FDKFILE * fp)336*e5436536SAndroid Build Coastguard Worker UINT FDKfwrite(const void *ptrf, INT size, UINT nmemb, FDKFILE *fp) {
337*e5436536SAndroid Build Coastguard Worker return (UINT)fwrite(ptrf, size, nmemb, (FILE *)fp);
338*e5436536SAndroid Build Coastguard Worker }
FDKfread(void * dst,INT size,UINT nmemb,FDKFILE * fp)339*e5436536SAndroid Build Coastguard Worker UINT FDKfread(void *dst, INT size, UINT nmemb, FDKFILE *fp) {
340*e5436536SAndroid Build Coastguard Worker return (UINT)fread(dst, size, nmemb, (FILE *)fp);
341*e5436536SAndroid Build Coastguard Worker }
FDKfgets(void * dst,INT size,FDKFILE * fp)342*e5436536SAndroid Build Coastguard Worker char *FDKfgets(void *dst, INT size, FDKFILE *fp) {
343*e5436536SAndroid Build Coastguard Worker return fgets((char *)dst, size, (FILE *)fp);
344*e5436536SAndroid Build Coastguard Worker }
FDKrewind(FDKFILE * fp)345*e5436536SAndroid Build Coastguard Worker void FDKrewind(FDKFILE *fp) { FDKfseek((FILE *)fp, 0, FDKSEEK_SET); }
346*e5436536SAndroid Build Coastguard Worker
FDKfwrite_EL(const void * ptrf,INT size,UINT nmemb,FDKFILE * fp)347*e5436536SAndroid Build Coastguard Worker UINT FDKfwrite_EL(const void *ptrf, INT size, UINT nmemb, FDKFILE *fp) {
348*e5436536SAndroid Build Coastguard Worker if (IS_LITTLE_ENDIAN()) {
349*e5436536SAndroid Build Coastguard Worker FDKfwrite(ptrf, size, nmemb, fp);
350*e5436536SAndroid Build Coastguard Worker } else {
351*e5436536SAndroid Build Coastguard Worker UINT n;
352*e5436536SAndroid Build Coastguard Worker INT s;
353*e5436536SAndroid Build Coastguard Worker
354*e5436536SAndroid Build Coastguard Worker const UCHAR *ptr = (const UCHAR *)ptrf;
355*e5436536SAndroid Build Coastguard Worker
356*e5436536SAndroid Build Coastguard Worker for (n = 0; n < nmemb; n++) {
357*e5436536SAndroid Build Coastguard Worker for (s = size - 1; s >= 0; s--) {
358*e5436536SAndroid Build Coastguard Worker FDKfwrite(ptr + s, 1, 1, fp);
359*e5436536SAndroid Build Coastguard Worker }
360*e5436536SAndroid Build Coastguard Worker ptr = ptr + size;
361*e5436536SAndroid Build Coastguard Worker }
362*e5436536SAndroid Build Coastguard Worker }
363*e5436536SAndroid Build Coastguard Worker return nmemb;
364*e5436536SAndroid Build Coastguard Worker }
365*e5436536SAndroid Build Coastguard Worker
FDKfread_EL(void * dst,INT size,UINT nmemb,FDKFILE * fp)366*e5436536SAndroid Build Coastguard Worker UINT FDKfread_EL(void *dst, INT size, UINT nmemb, FDKFILE *fp) {
367*e5436536SAndroid Build Coastguard Worker UINT n, s0, s1, err;
368*e5436536SAndroid Build Coastguard Worker UCHAR tmp, *ptr;
369*e5436536SAndroid Build Coastguard Worker UCHAR tmp24[3];
370*e5436536SAndroid Build Coastguard Worker
371*e5436536SAndroid Build Coastguard Worker /* Enforce alignment of 24 bit data. */
372*e5436536SAndroid Build Coastguard Worker if (size == 3) {
373*e5436536SAndroid Build Coastguard Worker ptr = (UCHAR *)dst;
374*e5436536SAndroid Build Coastguard Worker for (n = 0; n < nmemb; n++) {
375*e5436536SAndroid Build Coastguard Worker if ((err = FDKfread(tmp24, 1, 3, fp)) != 3) {
376*e5436536SAndroid Build Coastguard Worker return err;
377*e5436536SAndroid Build Coastguard Worker }
378*e5436536SAndroid Build Coastguard Worker *ptr++ = tmp24[0];
379*e5436536SAndroid Build Coastguard Worker *ptr++ = tmp24[1];
380*e5436536SAndroid Build Coastguard Worker *ptr++ = tmp24[2];
381*e5436536SAndroid Build Coastguard Worker /* Sign extension */
382*e5436536SAndroid Build Coastguard Worker if (tmp24[2] & 0x80) {
383*e5436536SAndroid Build Coastguard Worker *ptr++ = 0xff;
384*e5436536SAndroid Build Coastguard Worker } else {
385*e5436536SAndroid Build Coastguard Worker *ptr++ = 0;
386*e5436536SAndroid Build Coastguard Worker }
387*e5436536SAndroid Build Coastguard Worker }
388*e5436536SAndroid Build Coastguard Worker err = nmemb;
389*e5436536SAndroid Build Coastguard Worker size = sizeof(LONG);
390*e5436536SAndroid Build Coastguard Worker } else {
391*e5436536SAndroid Build Coastguard Worker if ((err = FDKfread(dst, size, nmemb, fp)) != nmemb) {
392*e5436536SAndroid Build Coastguard Worker return err;
393*e5436536SAndroid Build Coastguard Worker }
394*e5436536SAndroid Build Coastguard Worker }
395*e5436536SAndroid Build Coastguard Worker if (!IS_LITTLE_ENDIAN() && size > 1) {
396*e5436536SAndroid Build Coastguard Worker ptr = (UCHAR *)dst;
397*e5436536SAndroid Build Coastguard Worker for (n = 0; n < nmemb; n++) {
398*e5436536SAndroid Build Coastguard Worker for (s0 = 0, s1 = size - 1; s0 < s1; s0++, s1--) {
399*e5436536SAndroid Build Coastguard Worker tmp = ptr[s0];
400*e5436536SAndroid Build Coastguard Worker ptr[s0] = ptr[s1];
401*e5436536SAndroid Build Coastguard Worker ptr[s1] = tmp;
402*e5436536SAndroid Build Coastguard Worker }
403*e5436536SAndroid Build Coastguard Worker ptr += size;
404*e5436536SAndroid Build Coastguard Worker }
405*e5436536SAndroid Build Coastguard Worker }
406*e5436536SAndroid Build Coastguard Worker return err;
407*e5436536SAndroid Build Coastguard Worker }
408*e5436536SAndroid Build Coastguard Worker
FDKfeof(FDKFILE * fp)409*e5436536SAndroid Build Coastguard Worker INT FDKfeof(FDKFILE *fp) { return feof((FILE *)fp); }
410*e5436536SAndroid Build Coastguard Worker
411*e5436536SAndroid Build Coastguard Worker /* Global initialization/cleanup */
412*e5436536SAndroid Build Coastguard Worker
FDKprintDisclaimer(void)413*e5436536SAndroid Build Coastguard Worker void FDKprintDisclaimer(void) {
414*e5436536SAndroid Build Coastguard Worker FDKprintf(
415*e5436536SAndroid Build Coastguard Worker "This program is protected by copyright law and international treaties.\n"
416*e5436536SAndroid Build Coastguard Worker "Any reproduction or distribution of this program, or any portion\n"
417*e5436536SAndroid Build Coastguard Worker "of it, may result in severe civil and criminal penalties, and will be\n"
418*e5436536SAndroid Build Coastguard Worker "prosecuted to the maximum extent possible under law.\n\n");
419*e5436536SAndroid Build Coastguard Worker }
420