common.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:9k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2. ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
  3. ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com
  4. **  
  5. ** This program is free software; you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation; either version 2 of the License, or
  8. ** (at your option) any later version.
  9. ** 
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ** GNU General Public License for more details.
  14. ** 
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software 
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. **
  19. ** Any non-GPL usage of this software or parts of this software is strictly
  20. ** forbidden.
  21. **
  22. ** Software using this code must display the following message visibly in the
  23. ** software:
  24. ** "FAAD2 AAC/HE-AAC/HE-AACv2/DRM decoder (c) Ahead Software, www.nero.com"
  25. ** in, for example, the about-box or help/startup screen.
  26. **
  27. ** Commercial non-GPL licensing of this software is possible.
  28. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
  29. **
  30. ** $Id: common.h,v 1.2 2005/11/01 21:41:43 gabest Exp $
  31. **/
  32. #ifndef __COMMON_H__
  33. #define __COMMON_H__
  34. #ifdef __cplusplus
  35. extern "C" {
  36. #endif
  37. #ifdef HAVE_CONFIG_H
  38. #  include "../config.h"
  39. #endif
  40. #if 1
  41. #define INLINE __inline
  42. #else
  43. #define INLINE inline
  44. #endif
  45. #if 0 //defined(_WIN32) && !defined(_WIN32_WCE)
  46. #define ALIGN __declspec(align(16))
  47. #else
  48. #define ALIGN
  49. #endif
  50. #ifndef max
  51. #define max(a, b) (((a) > (b)) ? (a) : (b))
  52. #endif
  53. #ifndef min
  54. #define min(a, b) (((a) < (b)) ? (a) : (b))
  55. #endif
  56. /* COMPILE TIME DEFINITIONS */
  57. /* use double precision */
  58. /* #define USE_DOUBLE_PRECISION */
  59. /* use fixed point reals */
  60. //#define FIXED_POINT
  61. //#define BIG_IQ_TABLE
  62. /* Use if target platform has address generators with autoincrement */
  63. //#define PREFER_POINTERS
  64. #ifdef _WIN32_WCE
  65. #define FIXED_POINT
  66. #endif
  67. #define ERROR_RESILIENCE
  68. /* Allow decoding of MAIN profile AAC */
  69. #define MAIN_DEC
  70. /* Allow decoding of SSR profile AAC */
  71. //#define SSR_DEC
  72. /* Allow decoding of LTP profile AAC */
  73. #define LTP_DEC
  74. /* Allow decoding of LD profile AAC */
  75. #define LD_DEC
  76. /* Allow decoding of Digital Radio Mondiale (DRM) */
  77. //#define DRM
  78. //#define DRM_PS
  79. /* LD can't do without LTP */
  80. #ifdef LD_DEC
  81. #ifndef ERROR_RESILIENCE
  82. #define ERROR_RESILIENCE
  83. #endif
  84. #ifndef LTP_DEC
  85. #define LTP_DEC
  86. #endif
  87. #endif
  88. #define ALLOW_SMALL_FRAMELENGTH
  89. // Define LC_ONLY_DECODER if you want a pure AAC LC decoder (independant of SBR_DEC and PS_DEC)
  90. //#define LC_ONLY_DECODER
  91. #ifdef LC_ONLY_DECODER
  92.   #undef LD_DEC
  93.   #undef LTP_DEC
  94.   #undef MAIN_DEC
  95.   #undef SSR_DEC
  96.   #undef DRM
  97.   #undef ALLOW_SMALL_FRAMELENGTH
  98.   #undef ERROR_RESILIENCE
  99. #endif
  100. #define SBR_DEC
  101. //#define SBR_LOW_POWER
  102. #define PS_DEC
  103. #ifdef SBR_LOW_POWER
  104. #undef PS_DEC
  105. #endif
  106. /* FIXED POINT: No MAIN decoding */
  107. #ifdef FIXED_POINT
  108. # ifdef MAIN_DEC
  109. #  undef MAIN_DEC
  110. # endif
  111. #endif // FIXED_POINT
  112. #ifdef DRM
  113. # ifndef ALLOW_SMALL_FRAMELENGTH
  114. #  define ALLOW_SMALL_FRAMELENGTH
  115. # endif
  116. # undef LD_DEC
  117. # undef LTP_DEC
  118. # undef MAIN_DEC
  119. # undef SSR_DEC
  120. #endif
  121. #ifdef FIXED_POINT
  122. #define DIV_R(A, B) (((int64_t)A << REAL_BITS)/B)
  123. #define DIV_C(A, B) (((int64_t)A << COEF_BITS)/B)
  124. #else
  125. #define DIV_R(A, B) ((A)/(B))
  126. #define DIV_C(A, B) ((A)/(B))
  127. #endif
  128. #ifndef SBR_LOW_POWER
  129. #define qmf_t complex_t
  130. #define QMF_RE(A) RE(A)
  131. #define QMF_IM(A) IM(A)
  132. #else
  133. #define qmf_t real_t
  134. #define QMF_RE(A) (A)
  135. #define QMF_IM(A)
  136. #endif
  137. /* END COMPILE TIME DEFINITIONS */
  138. #if defined(_WIN32) && !defined(__MINGW32__)
  139. #include <stdlib.h>
  140. typedef unsigned __int64 uint64_t;
  141. typedef unsigned __int32 uint32_t;
  142. typedef unsigned __int16 uint16_t;
  143. typedef unsigned __int8 uint8_t;
  144. typedef __int64 int64_t;
  145. typedef __int32 int32_t;
  146. typedef __int16 int16_t;
  147. typedef __int8  int8_t;
  148. typedef float float32_t;
  149. #else
  150. #include <stdio.h>
  151. #if HAVE_SYS_TYPES_H
  152. # include <sys/types.h>
  153. #endif
  154. #if HAVE_SYS_STAT_H
  155. # include <sys/stat.h>
  156. #endif
  157. #if STDC_HEADERS
  158. # include <stdlib.h>
  159. # include <stddef.h>
  160. #else
  161. # if HAVE_STDLIB_H
  162. #  include <stdlib.h>
  163. # endif
  164. #endif
  165. #if HAVE_STRING_H
  166. # if !STDC_HEADERS && HAVE_MEMORY_H
  167. #  include <memory.h>
  168. # endif
  169. # include <string.h>
  170. #endif
  171. #if HAVE_STRINGS_H
  172. # include <strings.h>
  173. #endif
  174. #if HAVE_INTTYPES_H
  175. # include <inttypes.h>
  176. #else
  177. # if HAVE_STDINT_H
  178. #  include <stdint.h>
  179. # else
  180. /* we need these... */
  181. #ifndef __TCS__
  182. typedef unsigned long long uint64_t;
  183. typedef long long int64_t;
  184. #else
  185. typedef unsigned long uint64_t;
  186. typedef long int64_t;
  187. #endif
  188. typedef unsigned long uint32_t;
  189. typedef unsigned short uint16_t;
  190. typedef unsigned char uint8_t;
  191. typedef long int32_t;
  192. typedef short int16_t;
  193. typedef char int8_t;
  194. # endif
  195. #endif
  196. #if HAVE_UNISTD_H
  197. //# include <unistd.h>
  198. #endif
  199. #ifndef HAVE_FLOAT32_T
  200. typedef float float32_t;
  201. #endif
  202. #if STDC_HEADERS
  203. # include <string.h>
  204. #else
  205. # if !HAVE_STRCHR
  206. #  define strchr index
  207. #  define strrchr rindex
  208. # endif
  209. char *strchr(), *strrchr();
  210. # if !HAVE_MEMCPY
  211. #  define memcpy(d, s, n) bcopy((s), (d), (n))
  212. #  define memmove(d, s, n) bcopy((s), (d), (n))
  213. # endif
  214. #endif
  215. #endif
  216. #ifdef WORDS_BIGENDIAN
  217. #define ARCH_IS_BIG_ENDIAN
  218. #endif
  219. /* FIXED_POINT doesn't work with MAIN and SSR yet */
  220. #ifdef FIXED_POINT
  221.   #undef MAIN_DEC
  222.   #undef SSR_DEC
  223. #endif
  224. #if defined(FIXED_POINT)
  225.   #include "fixed.h"
  226. #elif defined(USE_DOUBLE_PRECISION)
  227.   typedef double real_t;
  228.   #include <math.h>
  229.   #define MUL_R(A,B) ((A)*(B))
  230.   #define MUL_C(A,B) ((A)*(B))
  231.   #define MUL_F(A,B) ((A)*(B))
  232.   /* Complex multiplication */
  233.   static INLINE void ComplexMult(real_t *y1, real_t *y2,
  234.       real_t x1, real_t x2, real_t c1, real_t c2)
  235.   {
  236.       *y1 = MUL_F(x1, c1) + MUL_F(x2, c2);
  237.       *y2 = MUL_F(x2, c1) - MUL_F(x1, c2);
  238.   }
  239.   #define REAL_CONST(A) ((real_t)(A))
  240.   #define COEF_CONST(A) ((real_t)(A))
  241.   #define Q2_CONST(A) ((real_t)(A))
  242.   #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */
  243. #else /* Normal floating point operation */
  244.   typedef float real_t;
  245.   #define MUL_R(A,B) ((A)*(B))
  246.   #define MUL_C(A,B) ((A)*(B))
  247.   #define MUL_F(A,B) ((A)*(B))
  248.   #define REAL_CONST(A) ((real_t)(A))
  249.   #define COEF_CONST(A) ((real_t)(A))
  250.   #define Q2_CONST(A) ((real_t)(A))
  251.   #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */
  252.   /* Complex multiplication */
  253.   static INLINE void ComplexMult(real_t *y1, real_t *y2,
  254.       real_t x1, real_t x2, real_t c1, real_t c2)
  255.   {
  256.       *y1 = MUL_F(x1, c1) + MUL_F(x2, c2);
  257.       *y2 = MUL_F(x2, c1) - MUL_F(x1, c2);
  258.   }
  259.   #if defined(_WIN32) && !defined(__MINGW32__)
  260.     #define HAS_LRINTF
  261.     static INLINE int lrintf(float f)
  262.     {
  263.         int i;
  264.         __asm
  265.         {
  266.             fld   f
  267.             fistp i
  268.         }
  269.         return i;
  270.     }
  271.   #elif (defined(__i386__) && defined(__GNUC__))
  272.     #define HAS_LRINTF
  273.     // from http://www.stereopsis.com/FPU.html
  274.     static INLINE int lrintf(float f)
  275.     {
  276.         int i;
  277.         __asm__ __volatile__ (
  278.             "flds %1        nt"
  279.             "fistpl %0      nt"
  280.             : "=m" (i)
  281.             : "m" (f));
  282.         return i;
  283.     }
  284.   #endif
  285.   #ifdef __ICL /* only Intel C compiler has fmath ??? */
  286.     #include <mathf.h>
  287.     #define sin sinf
  288.     #define cos cosf
  289.     #define log logf
  290.     #define floor floorf
  291.     #define ceil ceilf
  292.     #define sqrt sqrtf
  293.   #else
  294. #ifdef HAVE_LRINTF
  295. #  define HAS_LRINTF
  296. #  define _ISOC9X_SOURCE 1
  297. #  define _ISOC99_SOURCE 1
  298. #  define __USE_ISOC9X   1
  299. #  define __USE_ISOC99   1
  300. #endif
  301.     #include <math.h>
  302. #ifdef HAVE_SINF
  303. #  define sin sinf
  304. #error
  305. #endif
  306. #ifdef HAVE_COSF
  307. #  define cos cosf
  308. #endif
  309. #ifdef HAVE_LOGF
  310. #  define log logf
  311. #endif
  312. #ifdef HAVE_EXPF
  313. #  define exp expf
  314. #endif
  315. #ifdef HAVE_FLOORF
  316. #  define floor floorf
  317. #endif
  318. #ifdef HAVE_CEILF
  319. #  define ceil ceilf
  320. #endif
  321. #ifdef HAVE_SQRTF
  322. #  define sqrt sqrtf
  323. #endif
  324.   #endif
  325. #endif
  326. #ifndef HAS_LRINTF
  327. /* standard cast */
  328. #define lrintf(f) ((int32_t)(f))
  329. #endif
  330. typedef real_t complex_t[2];
  331. #define RE(A) A[0]
  332. #define IM(A) A[1]
  333. /* common functions */
  334. uint8_t cpu_has_sse(void);
  335. uint32_t random_int(void);
  336. uint32_t ones32(uint32_t x);
  337. uint32_t floor_log2(uint32_t x);
  338. uint32_t wl_min_lzc(uint32_t x);
  339. #ifdef FIXED_POINT
  340. #define LOG2_MIN_INF REAL_CONST(-10000)
  341. int32_t log2_int(uint32_t val);
  342. int32_t log2_fix(uint32_t val);
  343. int32_t pow2_int(real_t val);
  344. real_t pow2_fix(real_t val);
  345. #endif
  346. uint8_t get_sr_index(const uint32_t samplerate);
  347. uint8_t max_pred_sfb(const uint8_t sr_index);
  348. uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type,
  349.                     const uint8_t is_short);
  350. uint32_t get_sample_rate(const uint8_t sr_index);
  351. int8_t can_decode_ot(const uint8_t object_type);
  352. void *faad_malloc(size_t size);
  353. void faad_free(void *b);
  354. //#define PROFILE
  355. #ifdef PROFILE
  356. static int64_t faad_get_ts()
  357. {
  358.     __asm
  359.     {
  360.         rdtsc
  361.     }
  362. }
  363. #endif
  364. #ifndef M_PI
  365. #define M_PI 3.14159265358979323846
  366. #endif
  367. #ifndef M_PI_2 /* PI/2 */
  368. #define M_PI_2 1.57079632679489661923
  369. #endif
  370. #ifdef __cplusplus
  371. }
  372. #endif
  373. #endif