mad.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:27k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /*
  2.  * libmad - MPEG audio decoder library
  3.  * Copyright (C) 2000-2004 Underbit Technologies, Inc.
  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.  * If you would like to negotiate alternate licensing terms, you may do
  20.  * so by contacting: Underbit Technologies, Inc. <info@underbit.com>
  21.  */
  22. # ifdef __cplusplus
  23. extern "C" {
  24. # endif
  25. # define FPM_ARM
  26. # define OPT_SPEED
  27. # define SIZEOF_INT 4
  28. # define SIZEOF_LONG 4
  29. # define SIZEOF_LONG_LONG 8
  30. /* Id: version.h,v 1.26 2004/01/23 09:41:33 rob Exp */
  31. # ifndef LIBMAD_VERSION_H
  32. # define LIBMAD_VERSION_H
  33. # define MAD_VERSION_MAJOR 0
  34. # define MAD_VERSION_MINOR 15
  35. # define MAD_VERSION_PATCH 1
  36. # define MAD_VERSION_EXTRA " (beta)"
  37. # define MAD_VERSION_STRINGIZE(str) #str
  38. # define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num)
  39. # define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "."  
  40. MAD_VERSION_STRING(MAD_VERSION_MINOR) "."  
  41. MAD_VERSION_STRING(MAD_VERSION_PATCH)  
  42. MAD_VERSION_EXTRA
  43. # define MAD_PUBLISHYEAR "2000-2004"
  44. # define MAD_AUTHOR "Underbit Technologies, Inc."
  45. # define MAD_EMAIL "info@underbit.com"
  46. extern char const mad_version[];
  47. extern char const mad_copyright[];
  48. extern char const mad_author[];
  49. extern char const mad_build[];
  50. # endif
  51. /* Id: fixed.h,v 1.38 2004/02/17 02:02:03 rob Exp */
  52. # ifndef LIBMAD_FIXED_H
  53. # define LIBMAD_FIXED_H
  54. # if SIZEOF_INT >= 4
  55. typedef   signed int mad_fixed_t;
  56. typedef   signed int mad_fixed64hi_t;
  57. typedef unsigned int mad_fixed64lo_t;
  58. # else
  59. typedef   signed long mad_fixed_t;
  60. typedef   signed long mad_fixed64hi_t;
  61. typedef unsigned long mad_fixed64lo_t;
  62. # endif
  63. # if defined(_MSC_VER)
  64. #  define mad_fixed64_t  signed __int64
  65. # elif 1 || defined(__GNUC__)
  66. #  define mad_fixed64_t  signed long long
  67. # endif
  68. # if defined(FPM_FLOAT)
  69. typedef double mad_sample_t;
  70. # else
  71. typedef mad_fixed_t mad_sample_t;
  72. # endif
  73. /*
  74.  * Fixed-point format: 0xABBBBBBB
  75.  * A == whole part      (sign + 3 bits)
  76.  * B == fractional part (28 bits)
  77.  *
  78.  * Values are signed two's complement, so the effective range is:
  79.  * 0x80000000 to 0x7fffffff
  80.  *       -8.0 to +7.9999999962747097015380859375
  81.  *
  82.  * The smallest representable value is:
  83.  * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9)
  84.  *
  85.  * 28 bits of fractional accuracy represent about
  86.  * 8.6 digits of decimal accuracy.
  87.  *
  88.  * Fixed-point numbers can be added or subtracted as normal
  89.  * integers, but multiplication requires shifting the 64-bit result
  90.  * from 56 fractional bits back to 28 (and rounding.)
  91.  *
  92.  * Changing the definition of MAD_F_FRACBITS is only partially
  93.  * supported, and must be done with care.
  94.  */
  95. # define MAD_F_FRACBITS 28
  96. # if MAD_F_FRACBITS == 28
  97. #  define MAD_F(x) ((mad_fixed_t) (x##L))
  98. # else
  99. #  if MAD_F_FRACBITS < 28
  100. #   warning "MAD_F_FRACBITS < 28"
  101. #   define MAD_F(x) ((mad_fixed_t)  
  102.  (((x##L) +  
  103.    (1L << (28 - MAD_F_FRACBITS - 1))) >>  
  104.   (28 - MAD_F_FRACBITS)))
  105. #  elif MAD_F_FRACBITS > 28
  106. #   error "MAD_F_FRACBITS > 28 not currently supported"
  107. #   define MAD_F(x) ((mad_fixed_t)  
  108.  ((x##L) << (MAD_F_FRACBITS - 28)))
  109. #  endif
  110. # endif
  111. # define MAD_F_MIN ((mad_fixed_t) -0x80000000L)
  112. # define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL)
  113. # define MAD_F_ONE MAD_F(0x10000000)
  114. # define mad_f_tofixed(x) ((mad_fixed_t)  
  115.  ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5))
  116. # define mad_f_todouble(x) ((double)  
  117.  ((x) / (double) (1L << MAD_F_FRACBITS)))
  118. # define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS)
  119. # define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1))
  120. /* (x should be positive) */
  121. # define mad_f_fromint(x) ((x) << MAD_F_FRACBITS)
  122. # define mad_f_add(x, y) ((x) + (y))
  123. # define mad_f_sub(x, y) ((x) - (y))
  124. # if defined(FPM_FLOAT)
  125. #  error "FPM_FLOAT not yet supported"
  126. #  undef MAD_F
  127. #  define MAD_F(x) mad_f_todouble(x)
  128. #  define mad_f_mul(x, y) ((x) * (y))
  129. #  define mad_f_scale64
  130. #  undef ASO_ZEROCHECK
  131. # elif defined(FPM_64BIT)
  132. /*
  133.  * This version should be the most accurate if 64-bit types are supported by
  134.  * the compiler, although it may not be the most efficient.
  135.  */
  136. #  if defined(OPT_ACCURACY)
  137. #   define mad_f_mul(x, y)  
  138.     ((mad_fixed_t)  
  139.      ((((mad_fixed64_t) (x) * (y)) +  
  140.        (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS))
  141. #  else
  142. #   define mad_f_mul(x, y)  
  143.     ((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS))
  144. #  endif
  145. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  146. /* --- Intel --------------------------------------------------------------- */
  147. # elif defined(FPM_INTEL)
  148. #  if defined(_MSC_VER)
  149. #   pragma warning(push)
  150. #   pragma warning(disable: 4035)  /* no return value */
  151. static __forceinline
  152. mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y)
  153. {
  154.   enum {
  155.     fracbits = MAD_F_FRACBITS
  156.   };
  157.   __asm {
  158.     mov eax, x
  159.     imul y
  160.     shrd eax, edx, fracbits
  161.   }
  162.   /* implicit return of eax */
  163. }
  164. #   pragma warning(pop)
  165. #   define mad_f_mul mad_f_mul_inline
  166. #   define mad_f_scale64
  167. #  else
  168. /*
  169.  * This Intel version is fast and accurate; the disposition of the least
  170.  * significant bit depends on OPT_ACCURACY via mad_f_scale64().
  171.  */
  172. #   define MAD_F_MLX(hi, lo, x, y)  
  173.     asm ("imull %3"  
  174.  : "=a" (lo), "=d" (hi)  
  175.  : "%a" (x), "rm" (y)  
  176.  : "cc")
  177. #   if defined(OPT_ACCURACY)
  178. /*
  179.  * This gives best accuracy but is not very fast.
  180.  */
  181. #    define MAD_F_MLA(hi, lo, x, y)  
  182.     ({ mad_fixed64hi_t __hi;  
  183.        mad_fixed64lo_t __lo;  
  184.        MAD_F_MLX(__hi, __lo, (x), (y));  
  185.        asm ("addl %2,%0nt"  
  186.     "adcl %3,%1"  
  187.     : "=rm" (lo), "=rm" (hi)  
  188.     : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi)  
  189.     : "cc");  
  190.     })
  191. #   endif  /* OPT_ACCURACY */
  192. #   if defined(OPT_ACCURACY)
  193. /*
  194.  * Surprisingly, this is faster than SHRD followed by ADC.
  195.  */
  196. #    define mad_f_scale64(hi, lo)  
  197.     ({ mad_fixed64hi_t __hi_;  
  198.        mad_fixed64lo_t __lo_;  
  199.        mad_fixed_t __result;  
  200.        asm ("addl %4,%2nt"  
  201.     "adcl %5,%3"  
  202.     : "=rm" (__lo_), "=rm" (__hi_)  
  203.     : "0" (lo), "1" (hi),  
  204.       "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0)  
  205.     : "cc");  
  206.        asm ("shrdl %3,%2,%1"  
  207.     : "=rm" (__result)  
  208.     : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS)  
  209.     : "cc");  
  210.        __result;  
  211.     })
  212. #   elif defined(OPT_INTEL)
  213. /*
  214.  * Alternate Intel scaling that may or may not perform better.
  215.  */
  216. #    define mad_f_scale64(hi, lo)  
  217.     ({ mad_fixed_t __result;  
  218.        asm ("shrl %3,%1nt"  
  219.     "shll %4,%2nt"  
  220.     "orl %2,%1"  
  221.     : "=rm" (__result)  
  222.     : "0" (lo), "r" (hi),  
  223.       "I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS)  
  224.     : "cc");  
  225.        __result;  
  226.     })
  227. #   else
  228. #    define mad_f_scale64(hi, lo)  
  229.     ({ mad_fixed_t __result;  
  230.        asm ("shrdl %3,%2,%1"  
  231.     : "=rm" (__result)  
  232.     : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS)  
  233.     : "cc");  
  234.        __result;  
  235.     })
  236. #   endif  /* OPT_ACCURACY */
  237. #   define MAD_F_SCALEBITS  MAD_F_FRACBITS
  238. #  endif
  239. /* --- ARM ----------------------------------------------------------------- */
  240. # elif defined(FPM_ARM)
  241. /* 
  242.  * This ARM V4 version is as accurate as FPM_64BIT but much faster. The
  243.  * least significant bit is properly rounded at no CPU cycle cost!
  244.  */
  245. # if 1
  246. /*
  247.  * This is faster than the default implementation via MAD_F_MLX() and
  248.  * mad_f_scale64().
  249.  */
  250. #  define mad_f_mul(x, y)  
  251.     ({ mad_fixed64hi_t __hi;  
  252.        mad_fixed64lo_t __lo;  
  253.        mad_fixed_t __result;  
  254.        asm ("smull %0, %1, %3, %4nt"  
  255.     "movs %0, %0, lsr %5nt"  
  256.     "adc %2, %0, %1, lsl %6"  
  257.     : "=&r" (__lo), "=&r" (__hi), "=r" (__result)  
  258.     : "%r" (x), "r" (y),  
  259.       "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS)  
  260.     : "cc");  
  261.        __result;  
  262.     })
  263. # endif
  264. #  define MAD_F_MLX(hi, lo, x, y)  
  265.     asm ("smull %0, %1, %2, %3"  
  266.  : "=&r" (lo), "=&r" (hi)  
  267.  : "%r" (x), "r" (y))
  268. #  define MAD_F_MLA(hi, lo, x, y)  
  269.     asm ("smlal %0, %1, %2, %3"  
  270.  : "+r" (lo), "+r" (hi)  
  271.  : "%r" (x), "r" (y))
  272. #  define MAD_F_MLN(hi, lo)  
  273.     asm ("rsbs %0, %2, #0nt"  
  274.  "rsc %1, %3, #0"  
  275.  : "=r" (lo), "=r" (hi)  
  276.  : "0" (lo), "1" (hi)  
  277.  : "cc")
  278. #  define mad_f_scale64(hi, lo)  
  279.     ({ mad_fixed_t __result;  
  280.        asm ("movs %0, %1, lsr %3nt"  
  281.     "adc %0, %0, %2, lsl %4"  
  282.     : "=&r" (__result)  
  283.     : "r" (lo), "r" (hi),  
  284.       "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS)  
  285.     : "cc");  
  286.        __result;  
  287.     })
  288. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  289. /* --- MIPS ---------------------------------------------------------------- */
  290. # elif defined(FPM_MIPS)
  291. /*
  292.  * This MIPS version is fast and accurate; the disposition of the least
  293.  * significant bit depends on OPT_ACCURACY via mad_f_scale64().
  294.  */
  295. #  define MAD_F_MLX(hi, lo, x, y)  
  296.     asm ("mult %2,%3"  
  297.  : "=l" (lo), "=h" (hi)  
  298.  : "%r" (x), "r" (y))
  299. # if defined(HAVE_MADD_ASM)
  300. #  define MAD_F_MLA(hi, lo, x, y)  
  301.     asm ("madd %2,%3"  
  302.  : "+l" (lo), "+h" (hi)  
  303.  : "%r" (x), "r" (y))
  304. # elif defined(HAVE_MADD16_ASM)
  305. /*
  306.  * This loses significant accuracy due to the 16-bit integer limit in the
  307.  * multiply/accumulate instruction.
  308.  */
  309. #  define MAD_F_ML0(hi, lo, x, y)  
  310.     asm ("mult %2,%3"  
  311.  : "=l" (lo), "=h" (hi)  
  312.  : "%r" ((x) >> 12), "r" ((y) >> 16))
  313. #  define MAD_F_MLA(hi, lo, x, y)  
  314.     asm ("madd16 %2,%3"  
  315.  : "+l" (lo), "+h" (hi)  
  316.  : "%r" ((x) >> 12), "r" ((y) >> 16))
  317. #  define MAD_F_MLZ(hi, lo)  ((mad_fixed_t) (lo))
  318. # endif
  319. # if defined(OPT_SPEED)
  320. #  define mad_f_scale64(hi, lo)  
  321.     ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS)))
  322. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  323. # endif
  324. /* --- SPARC --------------------------------------------------------------- */
  325. # elif defined(FPM_SPARC)
  326. /*
  327.  * This SPARC V8 version is fast and accurate; the disposition of the least
  328.  * significant bit depends on OPT_ACCURACY via mad_f_scale64().
  329.  */
  330. #  define MAD_F_MLX(hi, lo, x, y)  
  331.     asm ("smul %2, %3, %0nt"  
  332.  "rd %%y, %1"  
  333.  : "=r" (lo), "=r" (hi)  
  334.  : "%r" (x), "rI" (y))
  335. /* --- PowerPC ------------------------------------------------------------- */
  336. # elif defined(FPM_PPC)
  337. /*
  338.  * This PowerPC version is fast and accurate; the disposition of the least
  339.  * significant bit depends on OPT_ACCURACY via mad_f_scale64().
  340.  */
  341. #  define MAD_F_MLX(hi, lo, x, y)  
  342.     do {  
  343.       asm ("mullw %0,%1,%2"  
  344.    : "=r" (lo)  
  345.    : "%r" (x), "r" (y));  
  346.       asm ("mulhw %0,%1,%2"  
  347.    : "=r" (hi)  
  348.    : "%r" (x), "r" (y));  
  349.     }  
  350.     while (0)
  351. #  if defined(OPT_ACCURACY)
  352. /*
  353.  * This gives best accuracy but is not very fast.
  354.  */
  355. #   define MAD_F_MLA(hi, lo, x, y)  
  356.     ({ mad_fixed64hi_t __hi;  
  357.        mad_fixed64lo_t __lo;  
  358.        MAD_F_MLX(__hi, __lo, (x), (y));  
  359.        asm ("addc %0,%2,%3nt"  
  360.     "adde %1,%4,%5"  
  361.     : "=r" (lo), "=r" (hi)  
  362.     : "%r" (lo), "r" (__lo),  
  363.       "%r" (hi), "r" (__hi)  
  364.     : "xer");  
  365.     })
  366. #  endif
  367. #  if defined(OPT_ACCURACY)
  368. /*
  369.  * This is slower than the truncating version below it.
  370.  */
  371. #   define mad_f_scale64(hi, lo)  
  372.     ({ mad_fixed_t __result, __round;  
  373.        asm ("rotrwi %0,%1,%2"  
  374.     : "=r" (__result)  
  375.     : "r" (lo), "i" (MAD_F_SCALEBITS));  
  376.        asm ("extrwi %0,%1,1,0"  
  377.     : "=r" (__round)  
  378.     : "r" (__result));  
  379.        asm ("insrwi %0,%1,%2,0"  
  380.     : "+r" (__result)  
  381.     : "r" (hi), "i" (MAD_F_SCALEBITS));  
  382.        asm ("add %0,%1,%2"  
  383.     : "=r" (__result)  
  384.     : "%r" (__result), "r" (__round));  
  385.        __result;  
  386.     })
  387. #  else
  388. #   define mad_f_scale64(hi, lo)  
  389.     ({ mad_fixed_t __result;  
  390.        asm ("rotrwi %0,%1,%2"  
  391.     : "=r" (__result)  
  392.     : "r" (lo), "i" (MAD_F_SCALEBITS));  
  393.        asm ("insrwi %0,%1,%2,0"  
  394.     : "+r" (__result)  
  395.     : "r" (hi), "i" (MAD_F_SCALEBITS));  
  396.        __result;  
  397.     })
  398. #  endif
  399. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  400. /* --- Default ------------------------------------------------------------- */
  401. # elif defined(FPM_DEFAULT)
  402. /*
  403.  * This version is the most portable but it loses significant accuracy.
  404.  * Furthermore, accuracy is biased against the second argument, so care
  405.  * should be taken when ordering operands.
  406.  *
  407.  * The scale factors are constant as this is not used with SSO.
  408.  *
  409.  * Pre-rounding is required to stay within the limits of compliance.
  410.  */
  411. #  if defined(OPT_SPEED)
  412. #   define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16))
  413. #  else
  414. #   define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) *  
  415.  (((y) + (1L << 15)) >> 16))
  416. #  endif
  417. /* ------------------------------------------------------------------------- */
  418. # else
  419. #  error "no FPM selected"
  420. # endif
  421. /* default implementations */
  422. # if !defined(mad_f_mul)
  423. #  define mad_f_mul(x, y)  
  424.     ({ register mad_fixed64hi_t __hi;  
  425.        register mad_fixed64lo_t __lo;  
  426.        MAD_F_MLX(__hi, __lo, (x), (y));  
  427.        mad_f_scale64(__hi, __lo);  
  428.     })
  429. # endif
  430. # if !defined(MAD_F_MLA)
  431. #  define MAD_F_ML0(hi, lo, x, y) ((lo)  = mad_f_mul((x), (y)))
  432. #  define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y)))
  433. #  define MAD_F_MLN(hi, lo) ((lo)  = -(lo))
  434. #  define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo))
  435. # endif
  436. # if !defined(MAD_F_ML0)
  437. #  define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y))
  438. # endif
  439. # if !defined(MAD_F_MLN)
  440. #  define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi))
  441. # endif
  442. # if !defined(MAD_F_MLZ)
  443. #  define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo))
  444. # endif
  445. # if !defined(mad_f_scale64)
  446. #  if defined(OPT_ACCURACY)
  447. #   define mad_f_scale64(hi, lo)  
  448.     ((((mad_fixed_t)  
  449.        (((hi) << (32 - (MAD_F_SCALEBITS - 1))) |  
  450. ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1)
  451. #  else
  452. #   define mad_f_scale64(hi, lo)  
  453.     ((mad_fixed_t)  
  454.      (((hi) << (32 - MAD_F_SCALEBITS)) |  
  455.       ((lo) >> MAD_F_SCALEBITS)))
  456. #  endif
  457. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  458. # endif
  459. /* C routines */
  460. mad_fixed_t mad_f_abs(mad_fixed_t);
  461. mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t);
  462. # endif
  463. /* Id: bit.h,v 1.12 2004/01/23 09:41:32 rob Exp */
  464. # ifndef LIBMAD_BIT_H
  465. # define LIBMAD_BIT_H
  466. struct mad_bitptr {
  467.   unsigned char const *byte;
  468.   unsigned short cache;
  469.   unsigned short left;
  470. };
  471. void mad_bit_init(struct mad_bitptr *, unsigned char const *);
  472. # define mad_bit_finish(bitptr) /* nothing */
  473. unsigned int mad_bit_length(struct mad_bitptr const *,
  474.     struct mad_bitptr const *);
  475. # define mad_bit_bitsleft(bitptr)  ((bitptr)->left)
  476. unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *);
  477. void mad_bit_skip(struct mad_bitptr *, unsigned int);
  478. unsigned long mad_bit_read(struct mad_bitptr *, unsigned int);
  479. void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long);
  480. unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short);
  481. # endif
  482. /* Id: timer.h,v 1.16 2004/01/23 09:41:33 rob Exp */
  483. # ifndef LIBMAD_TIMER_H
  484. # define LIBMAD_TIMER_H
  485. typedef struct {
  486.   signed long seconds; /* whole seconds */
  487.   unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */
  488. } mad_timer_t;
  489. extern mad_timer_t const mad_timer_zero;
  490. # define MAD_TIMER_RESOLUTION 352800000UL
  491. enum mad_units {
  492.   MAD_UNITS_HOURS  =    -2,
  493.   MAD_UNITS_MINUTES  =    -1,
  494.   MAD_UNITS_SECONDS  =     0,
  495.   /* metric units */
  496.   MAD_UNITS_DECISECONDS  =    10,
  497.   MAD_UNITS_CENTISECONDS =   100,
  498.   MAD_UNITS_MILLISECONDS =  1000,
  499.   /* audio sample units */
  500.   MAD_UNITS_8000_HZ  =  8000,
  501.   MAD_UNITS_11025_HZ  = 11025,
  502.   MAD_UNITS_12000_HZ  = 12000,
  503.   MAD_UNITS_16000_HZ  = 16000,
  504.   MAD_UNITS_22050_HZ  = 22050,
  505.   MAD_UNITS_24000_HZ  = 24000,
  506.   MAD_UNITS_32000_HZ  = 32000,
  507.   MAD_UNITS_44100_HZ  = 44100,
  508.   MAD_UNITS_48000_HZ  = 48000,
  509.   /* video frame/field units */
  510.   MAD_UNITS_24_FPS  =    24,
  511.   MAD_UNITS_25_FPS  =    25,
  512.   MAD_UNITS_30_FPS  =    30,
  513.   MAD_UNITS_48_FPS  =    48,
  514.   MAD_UNITS_50_FPS  =    50,
  515.   MAD_UNITS_60_FPS  =    60,
  516.   /* CD audio frames */
  517.   MAD_UNITS_75_FPS  =    75,
  518.   /* video drop-frame units */
  519.   MAD_UNITS_23_976_FPS  =   -24,
  520.   MAD_UNITS_24_975_FPS  =   -25,
  521.   MAD_UNITS_29_97_FPS  =   -30,
  522.   MAD_UNITS_47_952_FPS  =   -48,
  523.   MAD_UNITS_49_95_FPS  =   -50,
  524.   MAD_UNITS_59_94_FPS  =   -60
  525. };
  526. # define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero))
  527. int mad_timer_compare(mad_timer_t, mad_timer_t);
  528. # define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero)
  529. void mad_timer_negate(mad_timer_t *);
  530. mad_timer_t mad_timer_abs(mad_timer_t);
  531. void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long);
  532. void mad_timer_add(mad_timer_t *, mad_timer_t);
  533. void mad_timer_multiply(mad_timer_t *, signed long);
  534. signed long mad_timer_count(mad_timer_t, enum mad_units);
  535. unsigned long mad_timer_fraction(mad_timer_t, unsigned long);
  536. void mad_timer_string(mad_timer_t, char *, char const *,
  537.       enum mad_units, enum mad_units, unsigned long);
  538. # endif
  539. /* Id: stream.h,v 1.20 2004/02/05 09:02:39 rob Exp */
  540. # ifndef LIBMAD_STREAM_H
  541. # define LIBMAD_STREAM_H
  542. # define MAD_BUFFER_GUARD 8
  543. # define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD)
  544. enum mad_error {
  545.   MAD_ERROR_NONE    = 0x0000, /* no error */
  546.   MAD_ERROR_BUFLEN    = 0x0001, /* input buffer too small (or EOF) */
  547.   MAD_ERROR_BUFPTR    = 0x0002, /* invalid (null) buffer pointer */
  548.   MAD_ERROR_NOMEM    = 0x0031, /* not enough memory */
  549.   MAD_ERROR_LOSTSYNC    = 0x0101, /* lost synchronization */
  550.   MAD_ERROR_BADLAYER    = 0x0102, /* reserved header layer value */
  551.   MAD_ERROR_BADBITRATE    = 0x0103, /* forbidden bitrate value */
  552.   MAD_ERROR_BADSAMPLERATE  = 0x0104, /* reserved sample frequency value */
  553.   MAD_ERROR_BADEMPHASIS    = 0x0105, /* reserved emphasis value */
  554.   MAD_ERROR_BADCRC    = 0x0201, /* CRC check failed */
  555.   MAD_ERROR_BADBITALLOC    = 0x0211, /* forbidden bit allocation value */
  556.   MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */
  557.   MAD_ERROR_BADMODE        = 0x0222, /* bad bitrate/mode combination */
  558.   MAD_ERROR_BADFRAMELEN    = 0x0231, /* bad frame length */
  559.   MAD_ERROR_BADBIGVALUES   = 0x0232, /* bad big_values count */
  560.   MAD_ERROR_BADBLOCKTYPE   = 0x0233, /* reserved block_type */
  561.   MAD_ERROR_BADSCFSI    = 0x0234, /* bad scalefactor selection info */
  562.   MAD_ERROR_BADDATAPTR    = 0x0235, /* bad main_data_begin pointer */
  563.   MAD_ERROR_BADPART3LEN    = 0x0236, /* bad audio data length */
  564.   MAD_ERROR_BADHUFFTABLE   = 0x0237, /* bad Huffman table select */
  565.   MAD_ERROR_BADHUFFDATA    = 0x0238, /* Huffman data overrun */
  566.   MAD_ERROR_BADSTEREO    = 0x0239 /* incompatible block_type for JS */
  567. };
  568. # define MAD_RECOVERABLE(error) ((error) & 0xff00)
  569. struct mad_stream {
  570.   unsigned char const *buffer; /* input bitstream buffer */
  571.   unsigned char const *bufend; /* end of buffer */
  572.   unsigned long skiplen; /* bytes to skip before next frame */
  573.   int sync; /* stream sync found */
  574.   unsigned long freerate; /* free bitrate (fixed) */
  575.   unsigned char const *this_frame; /* start of current frame */
  576.   unsigned char const *next_frame; /* start of next frame */
  577.   struct mad_bitptr ptr; /* current processing bit pointer */
  578.   struct mad_bitptr anc_ptr; /* ancillary bits pointer */
  579.   unsigned int anc_bitlen; /* number of ancillary bits */
  580.   unsigned char (*main_data)[MAD_BUFFER_MDLEN];
  581. /* Layer III main_data() */
  582.   unsigned int md_len; /* bytes in main_data */
  583.   int options; /* decoding options (see below) */
  584.   enum mad_error error; /* error code (see above) */
  585. };
  586. enum {
  587.   MAD_OPTION_IGNORECRC      = 0x0001, /* ignore CRC errors */
  588.   MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */
  589. # if 0  /* not yet implemented */
  590.   MAD_OPTION_LEFTCHANNEL    = 0x0010, /* decode left channel only */
  591.   MAD_OPTION_RIGHTCHANNEL   = 0x0020, /* decode right channel only */
  592.   MAD_OPTION_SINGLECHANNEL  = 0x0030 /* combine channels */
  593. # endif
  594. };
  595. void mad_stream_init(struct mad_stream *);
  596. void mad_stream_finish(struct mad_stream *);
  597. # define mad_stream_options(stream, opts)  
  598.     ((void) ((stream)->options = (opts)))
  599. void mad_stream_buffer(struct mad_stream *,
  600.        unsigned char const *, unsigned long);
  601. void mad_stream_skip(struct mad_stream *, unsigned long);
  602. int mad_stream_sync(struct mad_stream *);
  603. char const *mad_stream_errorstr(struct mad_stream const *);
  604. # endif
  605. /* Id: frame.h,v 1.20 2004/01/23 09:41:32 rob Exp */
  606. # ifndef LIBMAD_FRAME_H
  607. # define LIBMAD_FRAME_H
  608. enum mad_layer {
  609.   MAD_LAYER_I   = 1, /* Layer I */
  610.   MAD_LAYER_II  = 2, /* Layer II */
  611.   MAD_LAYER_III = 3 /* Layer III */
  612. };
  613. enum mad_mode {
  614.   MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */
  615.   MAD_MODE_DUAL_CHANNEL   = 1, /* dual channel */
  616.   MAD_MODE_JOINT_STEREO   = 2, /* joint (MS/intensity) stereo */
  617.   MAD_MODE_STEREO   = 3 /* normal LR stereo */
  618. };
  619. enum mad_emphasis {
  620.   MAD_EMPHASIS_NONE   = 0, /* no emphasis */
  621.   MAD_EMPHASIS_50_15_US   = 1, /* 50/15 microseconds emphasis */
  622.   MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */
  623.   MAD_EMPHASIS_RESERVED   = 2 /* unknown emphasis */
  624. };
  625. struct mad_header {
  626.   enum mad_layer layer; /* audio layer (1, 2, or 3) */
  627.   enum mad_mode mode; /* channel mode (see above) */
  628.   int mode_extension; /* additional mode info */
  629.   enum mad_emphasis emphasis; /* de-emphasis to use (see above) */
  630.   unsigned long bitrate; /* stream bitrate (bps) */
  631.   unsigned int samplerate; /* sampling frequency (Hz) */
  632.   unsigned short crc_check; /* frame CRC accumulator */
  633.   unsigned short crc_target; /* final target CRC checksum */
  634.   int flags; /* flags (see below) */
  635.   int private_bits; /* private bits (see below) */
  636.   mad_timer_t duration; /* audio playing time of frame */
  637. };
  638. struct mad_frame {
  639.   struct mad_header header; /* MPEG audio header */
  640.   int options; /* decoding options (from stream) */
  641.   mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */
  642.   mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */
  643. };
  644. # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1)
  645. # define MAD_NSBSAMPLES(header)  
  646.   ((header)->layer == MAD_LAYER_I ? 12 :  
  647.    (((header)->layer == MAD_LAYER_III &&  
  648.      ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36))
  649. enum {
  650.   MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */
  651.   MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */
  652.   MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */
  653.   MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */
  654.   MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */
  655.   MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */
  656.   MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */
  657.   MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */
  658.   MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */
  659.   MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */
  660.   MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */
  661.   MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */
  662. };
  663. enum {
  664.   MAD_PRIVATE_HEADER = 0x0100, /* header private bit */
  665.   MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */
  666. };
  667. void mad_header_init(struct mad_header *);
  668. # define mad_header_finish(header)  /* nothing */
  669. int mad_header_decode(struct mad_header *, struct mad_stream *);
  670. void mad_frame_init(struct mad_frame *);
  671. void mad_frame_finish(struct mad_frame *);
  672. int mad_frame_decode(struct mad_frame *, struct mad_stream *);
  673. void mad_frame_mute(struct mad_frame *);
  674. # endif
  675. /* Id: synth.h,v 1.15 2004/01/23 09:41:33 rob Exp */
  676. # ifndef LIBMAD_SYNTH_H
  677. # define LIBMAD_SYNTH_H
  678. struct mad_pcm {
  679.   unsigned int samplerate; /* sampling frequency (Hz) */
  680.   unsigned short channels; /* number of channels */
  681.   unsigned short length; /* number of samples per channel */
  682.   mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */
  683. };
  684. struct mad_synth {
  685.   mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */
  686.    /* [ch][eo][peo][s][v] */
  687.   unsigned int phase; /* current processing phase */
  688.   struct mad_pcm pcm; /* PCM output */
  689. };
  690. /* single channel PCM selector */
  691. enum {
  692.   MAD_PCM_CHANNEL_SINGLE = 0
  693. };
  694. /* dual channel PCM selector */
  695. enum {
  696.   MAD_PCM_CHANNEL_DUAL_1 = 0,
  697.   MAD_PCM_CHANNEL_DUAL_2 = 1
  698. };
  699. /* stereo PCM selector */
  700. enum {
  701.   MAD_PCM_CHANNEL_STEREO_LEFT  = 0,
  702.   MAD_PCM_CHANNEL_STEREO_RIGHT = 1
  703. };
  704. void mad_synth_init(struct mad_synth *);
  705. # define mad_synth_finish(synth)  /* nothing */
  706. void mad_synth_mute(struct mad_synth *);
  707. void mad_synth_frame(struct mad_synth *, struct mad_frame const *);
  708. # endif
  709. /* Id: decoder.h,v 1.17 2004/01/23 09:41:32 rob Exp */
  710. # ifndef LIBMAD_DECODER_H
  711. # define LIBMAD_DECODER_H
  712. enum mad_decoder_mode {
  713.   MAD_DECODER_MODE_SYNC  = 0,
  714.   MAD_DECODER_MODE_ASYNC
  715. };
  716. enum mad_flow {
  717.   MAD_FLOW_CONTINUE = 0x0000, /* continue normally */
  718.   MAD_FLOW_STOP     = 0x0010, /* stop decoding normally */
  719.   MAD_FLOW_BREAK    = 0x0011, /* stop decoding and signal an error */
  720.   MAD_FLOW_IGNORE   = 0x0020 /* ignore the current frame */
  721. };
  722. struct mad_decoder {
  723.   enum mad_decoder_mode mode;
  724.   int options;
  725.   struct {
  726.     long pid;
  727.     int in;
  728.     int out;
  729.   } async;
  730.   struct {
  731.     struct mad_stream stream;
  732.     struct mad_frame frame;
  733.     struct mad_synth synth;
  734.   } *sync;
  735.   void *cb_data;
  736.   enum mad_flow (*input_func)(void *, struct mad_stream *);
  737.   enum mad_flow (*header_func)(void *, struct mad_header const *);
  738.   enum mad_flow (*filter_func)(void *,
  739.        struct mad_stream const *, struct mad_frame *);
  740.   enum mad_flow (*output_func)(void *,
  741.        struct mad_header const *, struct mad_pcm *);
  742.   enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *);
  743.   enum mad_flow (*message_func)(void *, void *, unsigned int *);
  744. };
  745. void mad_decoder_init(struct mad_decoder *, void *,
  746.       enum mad_flow (*)(void *, struct mad_stream *),
  747.       enum mad_flow (*)(void *, struct mad_header const *),
  748.       enum mad_flow (*)(void *,
  749. struct mad_stream const *,
  750. struct mad_frame *),
  751.       enum mad_flow (*)(void *,
  752. struct mad_header const *,
  753. struct mad_pcm *),
  754.       enum mad_flow (*)(void *,
  755. struct mad_stream *,
  756. struct mad_frame *),
  757.       enum mad_flow (*)(void *, void *, unsigned int *));
  758. int mad_decoder_finish(struct mad_decoder *);
  759. # define mad_decoder_options(decoder, opts)  
  760.     ((void) ((decoder)->options = (opts)))
  761. int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode);
  762. int mad_decoder_message(struct mad_decoder *, void *, unsigned int *);
  763. # endif
  764. # ifdef __cplusplus
  765. }
  766. # endif