mad.h
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:27k
源码类别:

VC书籍

开发平台:

Visual C++

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