37# define SIZEOF_LONG_LONG 8
42# ifndef LIBMAD_VERSION_H
43# define LIBMAD_VERSION_H
45# define MAD_VERSION_MAJOR 0
46# define MAD_VERSION_MINOR 15
47# define MAD_VERSION_PATCH 1
48# define MAD_VERSION_EXTRA " (beta)"
50# define MAD_VERSION_STRINGIZE(str) #str
51# define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num)
53# define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \
54 MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \
55 MAD_VERSION_STRING(MAD_VERSION_PATCH) \
58# define MAD_PUBLISHYEAR "2000-2004"
59# define MAD_AUTHOR "Underbit Technologies, Inc."
60# define MAD_EMAIL "info@underbit.com"
62extern char const mad_version[];
63extern char const mad_copyright[];
64extern char const mad_author[];
65extern char const mad_build[];
71# ifndef LIBMAD_FIXED_H
72# define LIBMAD_FIXED_H
75typedef signed int mad_fixed_t;
77typedef signed int mad_fixed64hi_t;
78typedef unsigned int mad_fixed64lo_t;
80typedef signed long mad_fixed_t;
82typedef signed long mad_fixed64hi_t;
83typedef unsigned long mad_fixed64lo_t;
87# define mad_fixed64_t signed __int64
88# elif 1 || defined(__GNUC__)
89# define mad_fixed64_t signed long long
92# if defined(FPM_FLOAT)
93typedef double mad_sample_t;
95typedef mad_fixed_t mad_sample_t;
121# define MAD_F_FRACBITS 28
123# if MAD_F_FRACBITS == 28
124# define MAD_F(x) ((mad_fixed_t) (x##L))
126# if MAD_F_FRACBITS < 28
127# warning "MAD_F_FRACBITS < 28"
128# define MAD_F(x) ((mad_fixed_t) \
130 (1L << (28 - MAD_F_FRACBITS - 1))) >> \
131 (28 - MAD_F_FRACBITS)))
132# elif MAD_F_FRACBITS > 28
133# error "MAD_F_FRACBITS > 28 not currently supported"
134# define MAD_F(x) ((mad_fixed_t) \
135 ((x##L) << (MAD_F_FRACBITS - 28)))
139# define MAD_F_MIN ((mad_fixed_t) -0x80000000L)
140# define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL)
142# define MAD_F_ONE MAD_F(0x10000000)
144# define mad_f_tofixed(x) ((mad_fixed_t) \
145 ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5))
146# define mad_f_todouble(x) ((double) \
147 ((x) / (double) (1L << MAD_F_FRACBITS)))
149# define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS)
150# define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1))
153# define mad_f_fromint(x) ((x) << MAD_F_FRACBITS)
155# define mad_f_add(x, y) ((x) + (y))
156# define mad_f_sub(x, y) ((x) - (y))
158# if defined(FPM_FLOAT)
159# error "FPM_FLOAT not yet supported"
162# define MAD_F(x) mad_f_todouble(x)
164# define mad_f_mul(x, y) ((x) * (y))
165# define mad_f_scale64
169# elif defined(FPM_64BIT)
175# if defined(OPT_ACCURACY)
176# define mad_f_mul(x, y) \
178 ((((mad_fixed64_t) (x) * (y)) + \
179 (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS))
181# define mad_f_mul(x, y) \
182 ((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS))
185# define MAD_F_SCALEBITS MAD_F_FRACBITS
189# elif defined(FPM_INTEL)
191# if defined(_MSC_VER)
192# pragma warning(push)
193# pragma warning(disable: 4035)
195mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y)
198 fracbits = MAD_F_FRACBITS
204 shrd eax, edx, fracbits
211# define mad_f_mul mad_f_mul_inline
212# define mad_f_scale64
218# define MAD_F_MLX(hi, lo, x, y) \
220 : "=a" (lo), "=d" (hi) \
221 : "%a" (x), "rm" (y) \
224# if defined(OPT_ACCURACY)
228# define MAD_F_MLA(hi, lo, x, y) \
229 ({ mad_fixed64hi_t __hi; \
230 mad_fixed64lo_t __lo; \
231 MAD_F_MLX(__hi, __lo, (x), (y)); \
232 asm ("addl %2,%0\n\t" \
234 : "=rm" (lo), "=rm" (hi) \
235 : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \
240# if defined(OPT_ACCURACY)
244# define mad_f_scale64(hi, lo) \
245 ({ mad_fixed64hi_t __hi_; \
246 mad_fixed64lo_t __lo_; \
247 mad_fixed_t __result; \
248 asm ("addl %4,%2\n\t" \
250 : "=rm" (__lo_), "=rm" (__hi_) \
251 : "0" (lo), "1" (hi), \
252 "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \
254 asm ("shrdl %3,%2,%1" \
256 : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \
260# elif defined(OPT_INTEL)
264# define mad_f_scale64(hi, lo) \
265 ({ mad_fixed_t __result; \
266 asm ("shrl %3,%1\n\t" \
270 : "0" (lo), "r" (hi), \
271 "I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \
276# define mad_f_scale64(hi, lo) \
277 ({ mad_fixed_t __result; \
278 asm ("shrdl %3,%2,%1" \
280 : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \
286# define MAD_F_SCALEBITS MAD_F_FRACBITS
291# elif defined(FPM_ARM)
302# define mad_f_mul(x, y) \
303 ({ mad_fixed64hi_t __hi; \
304 mad_fixed64lo_t __lo; \
305 mad_fixed_t __result; \
306 asm ("smull %0, %1, %3, %4\n\t" \
307 "movs %0, %0, lsr %5\n\t" \
308 "adc %2, %0, %1, lsl %6" \
309 : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \
310 : "%r" (x), "r" (y), \
311 "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \
317# define MAD_F_MLX(hi, lo, x, y) \
318 asm ("smull %0, %1, %2, %3" \
319 : "=&r" (lo), "=&r" (hi) \
322# define MAD_F_MLA(hi, lo, x, y) \
323 asm ("smlal %0, %1, %2, %3" \
324 : "+r" (lo), "+r" (hi) \
327# define MAD_F_MLN(hi, lo) \
328 asm ("rsbs %0, %2, #0\n\t" \
330 : "=r" (lo), "=r" (hi) \
331 : "0" (lo), "1" (hi) \
334# define mad_f_scale64(hi, lo) \
335 ({ mad_fixed_t __result; \
336 asm ("movs %0, %1, lsr %3\n\t" \
337 "adc %0, %0, %2, lsl %4" \
339 : "r" (lo), "r" (hi), \
340 "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \
345# define MAD_F_SCALEBITS MAD_F_FRACBITS
349# elif defined(FPM_MIPS)
355# define MAD_F_MLX(hi, lo, x, y) \
357 : "=l" (lo), "=h" (hi) \
360# if defined(HAVE_MADD_ASM)
361# define MAD_F_MLA(hi, lo, x, y) \
363 : "+l" (lo), "+h" (hi) \
365# elif defined(HAVE_MADD16_ASM)
370# define MAD_F_ML0(hi, lo, x, y) \
372 : "=l" (lo), "=h" (hi) \
373 : "%r" ((x) >> 12), "r" ((y) >> 16))
374# define MAD_F_MLA(hi, lo, x, y) \
375 asm ("madd16 %2,%3" \
376 : "+l" (lo), "+h" (hi) \
377 : "%r" ((x) >> 12), "r" ((y) >> 16))
378# define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo))
381# if defined(OPT_SPEED)
382# define mad_f_scale64(hi, lo) \
383 ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS)))
384# define MAD_F_SCALEBITS MAD_F_FRACBITS
389# elif defined(FPM_SPARC)
395# define MAD_F_MLX(hi, lo, x, y) \
396 asm ("smul %2, %3, %0\n\t" \
398 : "=r" (lo), "=r" (hi) \
399 : "%r" (x), "rI" (y))
403# elif defined(FPM_PPC)
409# define MAD_F_MLX(hi, lo, x, y) \
411 asm ("mullw %0,%1,%2" \
413 : "%r" (x), "r" (y)); \
414 asm ("mulhw %0,%1,%2" \
416 : "%r" (x), "r" (y)); \
420# if defined(OPT_ACCURACY)
424# define MAD_F_MLA(hi, lo, x, y) \
425 ({ mad_fixed64hi_t __hi; \
426 mad_fixed64lo_t __lo; \
427 MAD_F_MLX(__hi, __lo, (x), (y)); \
428 asm ("addc %0,%2,%3\n\t" \
430 : "=r" (lo), "=r" (hi) \
431 : "%r" (lo), "r" (__lo), \
432 "%r" (hi), "r" (__hi) \
437# if defined(OPT_ACCURACY)
441# define mad_f_scale64(hi, lo) \
442 ({ mad_fixed_t __result, __round; \
443 asm ("rotrwi %0,%1,%2" \
445 : "r" (lo), "i" (MAD_F_SCALEBITS)); \
446 asm ("extrwi %0,%1,1,0" \
449 asm ("insrwi %0,%1,%2,0" \
451 : "r" (hi), "i" (MAD_F_SCALEBITS)); \
452 asm ("add %0,%1,%2" \
454 : "%r" (__result), "r" (__round)); \
458# define mad_f_scale64(hi, lo) \
459 ({ mad_fixed_t __result; \
460 asm ("rotrwi %0,%1,%2" \
462 : "r" (lo), "i" (MAD_F_SCALEBITS)); \
463 asm ("insrwi %0,%1,%2,0" \
465 : "r" (hi), "i" (MAD_F_SCALEBITS)); \
470# define MAD_F_SCALEBITS MAD_F_FRACBITS
474# elif defined(FPM_DEFAULT)
485# if defined(OPT_SPEED)
486# define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16))
488# define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) * \
489 (((y) + (1L << 15)) >> 16))
495# error "no FPM selected"
500# if !defined(mad_f_mul)
501# define mad_f_mul(x, y) \
502 ({ register mad_fixed64hi_t __hi; \
503 register mad_fixed64lo_t __lo; \
504 MAD_F_MLX(__hi, __lo, (x), (y)); \
505 mad_f_scale64(__hi, __lo); \
509# if !defined(MAD_F_MLA)
510# define MAD_F_ML0(hi, lo, x, y) ((lo) = mad_f_mul((x), (y)))
511# define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y)))
512# define MAD_F_MLN(hi, lo) ((lo) = -(lo))
513# define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo))
516# if !defined(MAD_F_ML0)
517# define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y))
520# if !defined(MAD_F_MLN)
521# define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi))
524# if !defined(MAD_F_MLZ)
525# define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo))
528# if !defined(mad_f_scale64)
529# if defined(OPT_ACCURACY)
530# define mad_f_scale64(hi, lo) \
532 (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \
533 ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1)
535# define mad_f_scale64(hi, lo) \
537 (((hi) << (32 - MAD_F_SCALEBITS)) | \
538 ((lo) >> MAD_F_SCALEBITS)))
540# define MAD_F_SCALEBITS MAD_F_FRACBITS
545mad_fixed_t mad_f_abs(mad_fixed_t);
546mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t);
556 unsigned char const *byte;
557 unsigned short cache;
561void mad_bit_init(
struct mad_bitptr *,
unsigned char const *);
563# define mad_bit_finish(bitptr)
565unsigned int mad_bit_length(
struct mad_bitptr const *,
568# define mad_bit_bitsleft(bitptr) ((bitptr)->left)
569unsigned char const *mad_bit_nextbyte(
struct mad_bitptr const *);
571void mad_bit_skip(
struct mad_bitptr *,
unsigned int);
572unsigned long mad_bit_read(
struct mad_bitptr *,
unsigned int);
573void mad_bit_write(
struct mad_bitptr *,
unsigned int,
unsigned long);
575unsigned short mad_bit_crc(
struct mad_bitptr,
unsigned int,
unsigned short);
581# ifndef LIBMAD_TIMER_H
582# define LIBMAD_TIMER_H
586 unsigned long fraction;
591# define MAD_TIMER_RESOLUTION 352800000UL
594 MAD_UNITS_HOURS = -2,
595 MAD_UNITS_MINUTES = -1,
596 MAD_UNITS_SECONDS = 0,
600 MAD_UNITS_DECISECONDS = 10,
601 MAD_UNITS_CENTISECONDS = 100,
602 MAD_UNITS_MILLISECONDS = 1000,
606 MAD_UNITS_8000_HZ = 8000,
607 MAD_UNITS_11025_HZ = 11025,
608 MAD_UNITS_12000_HZ = 12000,
610 MAD_UNITS_16000_HZ = 16000,
611 MAD_UNITS_22050_HZ = 22050,
612 MAD_UNITS_24000_HZ = 24000,
614 MAD_UNITS_32000_HZ = 32000,
615 MAD_UNITS_44100_HZ = 44100,
616 MAD_UNITS_48000_HZ = 48000,
620 MAD_UNITS_24_FPS = 24,
621 MAD_UNITS_25_FPS = 25,
622 MAD_UNITS_30_FPS = 30,
623 MAD_UNITS_48_FPS = 48,
624 MAD_UNITS_50_FPS = 50,
625 MAD_UNITS_60_FPS = 60,
629 MAD_UNITS_75_FPS = 75,
633 MAD_UNITS_23_976_FPS = -24,
634 MAD_UNITS_24_975_FPS = -25,
635 MAD_UNITS_29_97_FPS = -30,
636 MAD_UNITS_47_952_FPS = -48,
637 MAD_UNITS_49_95_FPS = -50,
638 MAD_UNITS_59_94_FPS = -60
641# define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero))
645# define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero)
650void mad_timer_set(
mad_timer_t *,
unsigned long,
unsigned long,
unsigned long);
652void mad_timer_multiply(
mad_timer_t *,
signed long);
654signed long mad_timer_count(
mad_timer_t,
enum mad_units);
655unsigned long mad_timer_fraction(
mad_timer_t,
unsigned long);
656void mad_timer_string(
mad_timer_t,
char *,
char const *,
657 enum mad_units,
enum mad_units,
unsigned long);
663# ifndef LIBMAD_STREAM_H
664# define LIBMAD_STREAM_H
667# define MAD_BUFFER_GUARD 8
668# define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD)
671 MAD_ERROR_NONE = 0x0000,
673 MAD_ERROR_BUFLEN = 0x0001,
674 MAD_ERROR_BUFPTR = 0x0002,
676 MAD_ERROR_NOMEM = 0x0031,
678 MAD_ERROR_LOSTSYNC = 0x0101,
679 MAD_ERROR_BADLAYER = 0x0102,
680 MAD_ERROR_BADBITRATE = 0x0103,
681 MAD_ERROR_BADSAMPLERATE = 0x0104,
682 MAD_ERROR_BADEMPHASIS = 0x0105,
684 MAD_ERROR_BADCRC = 0x0201,
685 MAD_ERROR_BADBITALLOC = 0x0211,
686 MAD_ERROR_BADSCALEFACTOR = 0x0221,
687 MAD_ERROR_BADMODE = 0x0222,
688 MAD_ERROR_BADFRAMELEN = 0x0231,
689 MAD_ERROR_BADBIGVALUES = 0x0232,
690 MAD_ERROR_BADBLOCKTYPE = 0x0233,
691 MAD_ERROR_BADSCFSI = 0x0234,
692 MAD_ERROR_BADDATAPTR = 0x0235,
693 MAD_ERROR_BADPART3LEN = 0x0236,
694 MAD_ERROR_BADHUFFTABLE = 0x0237,
695 MAD_ERROR_BADHUFFDATA = 0x0238,
696 MAD_ERROR_BADSTEREO = 0x0239
699# define MAD_RECOVERABLE(error) ((error) & 0xff00)
702 unsigned char const *buffer;
703 unsigned char const *bufend;
704 unsigned long skiplen;
707 unsigned long freerate;
709 unsigned char const *this_frame;
710 unsigned char const *next_frame;
714 unsigned int anc_bitlen;
716 unsigned char (*main_data)[MAD_BUFFER_MDLEN];
721 enum mad_error error;
725 MAD_OPTION_IGNORECRC = 0x0001,
726 MAD_OPTION_HALFSAMPLERATE = 0x0002
728 MAD_OPTION_LEFTCHANNEL = 0x0010,
729 MAD_OPTION_RIGHTCHANNEL = 0x0020,
730 MAD_OPTION_SINGLECHANNEL = 0x0030
737# define mad_stream_options(stream, opts) \
738 ((void) ((stream)->options = (opts)))
741 unsigned char const *,
unsigned long);
742void mad_stream_skip(
struct mad_stream *,
unsigned long);
746char const *mad_stream_errorstr(
struct mad_stream const *);
752# ifndef LIBMAD_FRAME_H
753# define LIBMAD_FRAME_H
763 MAD_MODE_SINGLE_CHANNEL = 0,
764 MAD_MODE_DUAL_CHANNEL = 1,
765 MAD_MODE_JOINT_STEREO = 2,
770 MAD_EMPHASIS_NONE = 0,
771 MAD_EMPHASIS_50_15_US = 1,
772 MAD_EMPHASIS_CCITT_J_17 = 3,
773 MAD_EMPHASIS_RESERVED = 2
777 enum mad_layer layer;
780 enum mad_emphasis emphasis;
782 unsigned long bitrate;
783 unsigned int samplerate;
785 unsigned short crc_check;
786 unsigned short crc_target;
799 mad_fixed_t sbsample[2][36][32];
800 mad_fixed_t (*overlap)[2][32][18];
803# define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1)
804# define MAD_NSBSAMPLES(header) \
805 ((header)->layer == MAD_LAYER_I ? 12 : \
806 (((header)->layer == MAD_LAYER_III && \
807 ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36))
810 MAD_FLAG_NPRIVATE_III = 0x0007,
811 MAD_FLAG_INCOMPLETE = 0x0008,
813 MAD_FLAG_PROTECTION = 0x0010,
814 MAD_FLAG_COPYRIGHT = 0x0020,
815 MAD_FLAG_ORIGINAL = 0x0040,
816 MAD_FLAG_PADDING = 0x0080,
818 MAD_FLAG_I_STEREO = 0x0100,
819 MAD_FLAG_MS_STEREO = 0x0200,
820 MAD_FLAG_FREEFORMAT = 0x0400,
822 MAD_FLAG_LSF_EXT = 0x1000,
823 MAD_FLAG_MC_EXT = 0x2000,
824 MAD_FLAG_MPEG_2_5_EXT = 0x4000
828 MAD_PRIVATE_HEADER = 0x0100,
829 MAD_PRIVATE_III = 0x001f
834# define mad_header_finish(header)
839void mad_frame_finish(
struct mad_frame *);
849# ifndef LIBMAD_SYNTH_H
850# define LIBMAD_SYNTH_H
854 unsigned int samplerate;
855 unsigned short channels;
856 unsigned short length;
857 mad_fixed_t samples[2][1152];
861 mad_fixed_t filter[2][2][2][16][8];
871 MAD_PCM_CHANNEL_SINGLE = 0
876 MAD_PCM_CHANNEL_DUAL_1 = 0,
877 MAD_PCM_CHANNEL_DUAL_2 = 1
882 MAD_PCM_CHANNEL_STEREO_LEFT = 0,
883 MAD_PCM_CHANNEL_STEREO_RIGHT = 1
888# define mad_synth_finish(synth)
898# ifndef LIBMAD_DECODER_H
899# define LIBMAD_DECODER_H
902enum mad_decoder_mode {
903 MAD_DECODER_MODE_SYNC = 0,
904 MAD_DECODER_MODE_ASYNC
908 MAD_FLOW_CONTINUE = 0x0000,
909 MAD_FLOW_STOP = 0x0010,
910 MAD_FLOW_BREAK = 0x0011,
911 MAD_FLOW_IGNORE = 0x0020
915 enum mad_decoder_mode mode;
933 enum mad_flow (*input_func)(
void *,
struct mad_stream *);
934 enum mad_flow (*header_func)(
void *,
struct mad_header const *);
935 enum mad_flow (*filter_func)(
void *,
937 enum mad_flow (*output_func)(
void *,
940 enum mad_flow (*message_func)(
void *,
void *,
unsigned int *);
944 enum mad_flow (*)(
void *,
struct mad_stream *),
945 enum mad_flow (*)(
void *,
struct mad_header const *),
946 enum mad_flow (*)(
void *,
949 enum mad_flow (*)(
void *,
952 enum mad_flow (*)(
void *,
955 enum mad_flow (*)(
void *,
void *,
unsigned int *));
958# define mad_decoder_options(decoder, opts) \
959 ((void) ((decoder)->options = (opts)))
961int mad_decoder_run(
struct mad_decoder *,
enum mad_decoder_mode);
962int mad_decoder_message(
struct mad_decoder *,
void *,
unsigned int *);