diff options
Diffstat (limited to 'src/libfaad/common.h')
-rw-r--r-- | src/libfaad/common.h | 217 |
1 files changed, 177 insertions, 40 deletions
diff --git a/src/libfaad/common.h b/src/libfaad/common.h index 143641529..aa40ebe0a 100644 --- a/src/libfaad/common.h +++ b/src/libfaad/common.h @@ -1,22 +1,28 @@ /* -** FAAD - Freeware Advanced Audio Decoder -** Copyright (C) 2002 M. Bakker -** +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. -** +** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. -** +** ** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software +** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** -** $Id: common.h,v 1.8 2003/05/26 23:23:26 miguelfreitas Exp $ +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. +** +** $Id: common.h,v 1.9 2003/12/30 02:00:10 miguelfreitas Exp $ **/ #ifndef __COMMON_H__ @@ -26,12 +32,11 @@ extern "C" { #endif -#if __STDC_VERSION__+0 >= 199901L -#define INLINE inline -#elif defined(__GNUC__) #define INLINE __inline +#ifdef _WIN32 +#define ALIGN __declspec(align(16)) #else -#define INLINE +#define ALIGN #endif #ifndef max @@ -41,7 +46,6 @@ extern "C" { #define min(a, b) (((a) < (b)) ? (a) : (b)) #endif - /* COMPILE TIME DEFINITIONS */ /* use double precision */ @@ -49,6 +53,11 @@ extern "C" { /* use fixed point reals */ //#define FIXED_POINT +#ifdef _WIN32_WCE +#define FIXED_POINT +#endif + + #define ERROR_RESILIENCE @@ -60,6 +69,10 @@ extern "C" { #define LTP_DEC /* Allow decoding of LD profile AAC */ #define LD_DEC +/* Allow decoding of scalable profiles */ +//#define SCALABLE_DEC +/* Allow decoding of Digital Radio Mondiale (DRM) */ +//#define DRM /* LD can't do without LTP */ #ifdef LD_DEC @@ -71,14 +84,65 @@ extern "C" { #endif #endif +#define ALLOW_SMALL_FRAMELENGTH -/* END COMPILE TIME DEFINITIONS */ +// Define LC_ONLY_DECODER if you want a pure AAC LC decoder (independant of SBR_DEC) +//#define LC_ONLY_DECODER +#ifdef LC_ONLY_DECODER + #undef LTP_DEC + #undef MAIN_DEC + #undef SSR_DEC + #undef DRM + #undef ALLOW_SMALL_FRAMELENGTH + #undef ERROR_RESILIENCE +#endif + +#define SBR_DEC +//#define SBR_LOW_POWER + +/* FIXED POINT: No MAIN decoding, forced SBR Low Power decoder */ +#ifdef FIXED_POINT +# ifdef MAIN_DEC +# undef MAIN_DEC +# endif +# ifndef SBR_LOW_POWER +# define SBR_LOW_POWER +# endif +#endif // FIXED_POINT + +#ifdef DRM +# ifndef SCALABLE_DEC +# define SCALABLE_DEC +# endif +#endif + +#if ((defined(_WIN32) && !defined(_WIN32_WCE)) /* || ((__GNUC__ >= 3) && defined(__i386__)) */ ) #ifndef FIXED_POINT -#define POW_TABLE_SIZE 200 +/* includes <xmmintrin.h> to enable SSE intrinsics */ +#define USE_SSE +#endif +#endif + +#ifdef FIXED_POINT +#define SBR_DIV(A, B) (((int64_t)A << REAL_BITS)/B) +#else +#define SBR_DIV(A, B) ((A)/(B)) +#endif + +#ifndef SBR_LOW_POWER +#define qmf_t complex_t +#define QMF_RE(A) RE(A) +#define QMF_IM(A) IM(A) +#else +#define qmf_t real_t +#define QMF_RE(A) (A) +#define QMF_IM(A) #endif +/* END COMPILE TIME DEFINITIONS */ + #if defined(_WIN32) @@ -96,7 +160,7 @@ typedef float float32_t; #else #ifdef HAVE_CONFIG_H -# include "config.h" +# include "../config.h" #endif #include <stdio.h> @@ -129,9 +193,7 @@ typedef float float32_t; # if HAVE_STDINT_H # include <stdint.h> # else -# if !defined(__int8_t_defined) /* we need these... */ -#define __int8_t_defined typedef unsigned long long uint64_t; typedef unsigned long uint32_t; typedef unsigned short uint16_t; @@ -140,7 +202,6 @@ typedef long long int64_t; typedef long int32_t; typedef short int16_t; typedef char int8_t; -# endif # endif #endif #if HAVE_UNISTD_H @@ -180,12 +241,6 @@ char *strchr(), *strrchr(); #if defined(FIXED_POINT) - #ifdef HAS_MATHF_H - #include <mathf.h> - #else - #include <math.h> - #endif - #include "fixed.h" #elif defined(USE_DOUBLE_PRECISION) @@ -194,23 +249,74 @@ char *strchr(), *strrchr(); #include <math.h> - #define MUL(A,B) ((A)*(B)) - #define MUL_C_C(A,B) ((A)*(B)) - #define MUL_R_C(A,B) ((A)*(B)) + #define MUL_R(A,B) ((A)*(B)) + #define MUL_C(A,B) ((A)*(B)) + #define MUL_F(A,B) ((A)*(B)) + + /* Complex multiplication */ + static INLINE void ComplexMult(real_t *y1, real_t *y2, + real_t x1, real_t x2, real_t c1, real_t c2) + { + *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); + *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); + } - #define REAL_CONST(A) ((real_t)A) - #define COEF_CONST(A) ((real_t)A) + #define REAL_CONST(A) ((real_t)(A)) + #define COEF_CONST(A) ((real_t)(A)) + #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ #else /* Normal floating point operation */ typedef float real_t; - #define MUL(A,B) ((A)*(B)) - #define MUL_C_C(A,B) ((A)*(B)) - #define MUL_R_C(A,B) ((A)*(B)) - - #define REAL_CONST(A) ((real_t)A) - #define COEF_CONST(A) ((real_t)A) +#ifdef USE_SSE +# include <xmmintrin.h> +#endif + + #define MUL_R(A,B) ((A)*(B)) + #define MUL_C(A,B) ((A)*(B)) + #define MUL_F(A,B) ((A)*(B)) + + #define REAL_CONST(A) ((real_t)(A)) + #define COEF_CONST(A) ((real_t)(A)) + #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ + + /* Complex multiplication */ + static INLINE void ComplexMult(real_t *y1, real_t *y2, + real_t x1, real_t x2, real_t c1, real_t c2) + { + *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); + *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); + } + +#ifndef HAVE_LRINTF + #ifdef _WIN32 + #define HAS_LRINTF + static INLINE int lrintf(float f) + { + int i; + __asm + { + fld f + fistp i + } + return i; + } + #elif (defined(__i386__) && defined(__GNUC__)) + #define HAS_LRINTF + // from http://www.stereopsis.com/FPU.html + static INLINE int lrintf(float f) + { + int i; + __asm__ __volatile__ ( + "flds %1 \n\t" + "fistpl %0 \n\t" + : "=m" (i) + : "m" (f)); + return i; + } + #endif +#endif #ifdef __ICL /* only Intel C compiler has fmath ??? */ @@ -225,6 +331,14 @@ char *strchr(), *strrchr(); #else +#ifdef HAVE_LRINTF +# define HAS_LRINTF +# define _ISOC9X_SOURCE 1 +# define _ISOC99_SOURCE 1 +# define __USE_ISOC9X 1 +# define __USE_ISOC99 1 +#endif + #include <math.h> #ifdef HAVE_SINF @@ -254,19 +368,42 @@ char *strchr(), *strrchr(); #endif +#ifndef HAS_LRINTF +/* standard cast */ +#define lrintf(f) ((int32_t)(f)) +#endif + typedef real_t complex_t[2]; #define RE(A) A[0] #define IM(A) A[1] /* common functions */ -uint32_t int_log2(uint32_t val); - -uint8_t get_sr_index(uint32_t samplerate); -int8_t can_decode_ot(uint8_t object_type); +uint8_t cpu_has_sse(); +uint32_t random_int(void); +uint8_t get_sr_index(const uint32_t samplerate); +uint8_t max_pred_sfb(const uint8_t sr_index); +uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type, + const uint8_t is_short); +uint32_t get_sample_rate(const uint8_t sr_index); +int8_t can_decode_ot(const uint8_t object_type); + +void *faad_malloc(int32_t size); +void faad_free(void *b); + +//#define PROFILE +#ifdef PROFILE +static int64_t faad_get_ts() +{ + __asm + { + rdtsc + } +} +#endif #ifndef M_PI -#define M_PI 3.14159265358979323846f +#define M_PI 3.14159265358979323846 #endif #ifndef M_PI_2 /* PI/2 */ #define M_PI_2 1.57079632679489661923 |