parent
acd6d78900
commit
57b4a6a9e5
@ -0,0 +1,338 @@ |
|||||||
|
|
||||||
|
libmad - MPEG audio decoder library |
||||||
|
Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
|
||||||
|
$Id: CHANGES,v 1.14 2004/02/17 02:02:03 rob Exp $ |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
Version 0.15.1 (beta) |
||||||
|
|
||||||
|
* Updated to autoconf 2.59, automake 1.8.2, libtool 1.5.2. |
||||||
|
|
||||||
|
* Replaced Layer III IMDCT routine with one based on a faster algorithm, |
||||||
|
improving both speed and accuracy. |
||||||
|
|
||||||
|
* Improved portability of the Huffman table initialization. |
||||||
|
|
||||||
|
* Fixed a problem that could result in an assertion failure in layer3.c |
||||||
|
due to an invalid Layer III free format bitrate. |
||||||
|
|
||||||
|
* Improved the robustness of Layer II bitrate/mode combinations, and added |
||||||
|
a new MAD_ERROR_BADMODE error enum. The allowability of low-bitrate |
||||||
|
stereo streams is influenced by the --enable-strict-iso option to |
||||||
|
`configure'. |
||||||
|
|
||||||
|
Version 0.15.0 (beta) |
||||||
|
|
||||||
|
* Updated to autoconf 2.57, automake 1.7.5, libtool 1.4.3. |
||||||
|
|
||||||
|
* Added new mad_f_div() API routine. |
||||||
|
|
||||||
|
* Added a 64th entry to the Layer I/Layer II scalefactor table, for better |
||||||
|
compatibility with existing streams. The --enable-strict-iso option to |
||||||
|
`configure' can be used to disable use of this entry. |
||||||
|
|
||||||
|
* Modified the header decoding routine to allow the reserved emphasis |
||||||
|
value, for better compatibility with existing streams. The |
||||||
|
--enable-strict-iso option to `configure' can be used to restore the |
||||||
|
previous behavior of reporting this value as an error. |
||||||
|
|
||||||
|
* Added new MAD_EMPHASIS_RESERVED enumeration constant. |
||||||
|
|
||||||
|
* Fixed a bug in the ARM version of mad_f_scale64() discovered by Andre |
||||||
|
McCurdy. |
||||||
|
|
||||||
|
* Rewrote PowerPC assembly for minor gains. |
||||||
|
|
||||||
|
* Modified mad_timer_fraction() to avoid the possibility of division by |
||||||
|
zero when 0 is passed as the second argument. |
||||||
|
|
||||||
|
* Fixed a non-fatal problem caused by attempting to designate ancillary |
||||||
|
bits in Layer III after a decoding error. |
||||||
|
|
||||||
|
* Changed to build a shared library by default. |
||||||
|
|
||||||
|
* Changed to use native Cygwin build by default; give --host=mingw32 to |
||||||
|
`configure' to use MinGW (and avoid a dependency on the Cygwin DLL). |
||||||
|
|
||||||
|
Version 0.14.2 (beta) |
||||||
|
|
||||||
|
* Changed Cygwin builds to use MinGW; resulting Win32 executables no |
||||||
|
longer have a dependency on Cygwin DLLs. |
||||||
|
|
||||||
|
* Added a new mad_stream_errorstr() API function to libmad for retrieving |
||||||
|
a string description of the current error condition. |
||||||
|
|
||||||
|
Version 0.14.1 (beta) |
||||||
|
|
||||||
|
* Updated config.guess and config.sub to latest upstream versions. |
||||||
|
|
||||||
|
* Enabled libtool versioning rather than release numbering. |
||||||
|
|
||||||
|
* Improved the documentation in minimad.c. |
||||||
|
|
||||||
|
* Several other small fixes. |
||||||
|
|
||||||
|
Version 0.14.0 (beta) |
||||||
|
|
||||||
|
* Added a 64-bit FPM negation operation to improve performance of subband |
||||||
|
synthesis on some platforms. |
||||||
|
|
||||||
|
* Improved MSVC++ portability and added MSVC++ project files. |
||||||
|
|
||||||
|
* Added rounding to Layer III requantization for slightly better accuracy. |
||||||
|
|
||||||
|
Version 0.13.0 (beta) |
||||||
|
|
||||||
|
* Ancillary data is now properly extracted from Layer III streams. |
||||||
|
|
||||||
|
* Rewrote the Layer III joint stereo decoding routine to correct a major |
||||||
|
MPEG-2 problem and a minor MPEG-1 problem decoding intensity stereo. |
||||||
|
|
||||||
|
* Eliminated the dependency on sign-extending right shifts for Layer I and |
||||||
|
Layer II. |
||||||
|
|
||||||
|
* Renamed `private' field to `private_bits' for better C++ compatibility. |
||||||
|
|
||||||
|
* Gratuitously renamed `sfreq' field to `samplerate' and |
||||||
|
MAD_ERROR_BADSAMPLEFREQ constant to MAD_ERROR_BADSAMPLERATE. |
||||||
|
|
||||||
|
* Added `samplerate' and `channels' fields to synth.pcm struct to allow |
||||||
|
these to be different from the decoded frame, and for simpler access. |
||||||
|
|
||||||
|
* Added new mad_stream_options() and mad_decoder_options() API entries for |
||||||
|
special runtime decoding options. |
||||||
|
|
||||||
|
* Added new MAD_OPTION_IGNORECRC and MAD_OPTION_HALFSAMPLERATE options. |
||||||
|
|
||||||
|
* Added new MAD_FLAG_FREEFORMAT indicator flag. |
||||||
|
|
||||||
|
* Fixed some bugs in the async decoder. |
||||||
|
|
||||||
|
* Added a new mad_timer_multiply() API routine. |
||||||
|
|
||||||
|
* Eliminated `+' from asm constraints under Intel for better compatibility |
||||||
|
with some compilers. |
||||||
|
|
||||||
|
* Fixed a PIC-related problem in imdct_l_arm.S. |
||||||
|
|
||||||
|
* Eliminated a static variable to make libmad thread-safe. |
||||||
|
|
||||||
|
Version 0.12.5 (beta) |
||||||
|
|
||||||
|
* Modified Layer III requantization to occur during Huffman decoding for |
||||||
|
significant performance gains. |
||||||
|
|
||||||
|
* Optimized short block IMDCT by eliminating redundant calculations. |
||||||
|
|
||||||
|
* Made several other Layer III performance improvements; added |
||||||
|
ASO_INTERLEAVE1, ASO_INTERLEAVE2, and ASO_ZEROCHECK |
||||||
|
architecture-specific options for best performance on various |
||||||
|
architectures. |
||||||
|
|
||||||
|
* Optimized synthesis DCT to store result values as soon as they are |
||||||
|
calculated. |
||||||
|
|
||||||
|
Version 0.12.4 (beta) |
||||||
|
|
||||||
|
* New PowerPC fixed-point assembly courtesy of David Blythe. |
||||||
|
|
||||||
|
* Reorganized fixed-point assembly routines for easier maintenance and |
||||||
|
better performance. |
||||||
|
|
||||||
|
* Improved performance of subband synthesis through better indexing and |
||||||
|
fewer local variables. |
||||||
|
|
||||||
|
* Added alias reduction for the lower two subbands of mixed short blocks, |
||||||
|
per a report of ambiguity with ISO/IEC 11172-3 and for uniformity with |
||||||
|
most other implementations. Also improved alias reduction performance |
||||||
|
using multiply/accumulate. |
||||||
|
|
||||||
|
* Added --enable-strict-iso option to `configure' to override best |
||||||
|
accepted practices such as the alias reduction for mixed short blocks. |
||||||
|
|
||||||
|
* Improved performance of Layer III IMDCT by using longer |
||||||
|
multiply/accumulate runs where possible. |
||||||
|
|
||||||
|
Version 0.12.3 (beta) |
||||||
|
|
||||||
|
* Added MPEG 2.5 support. |
||||||
|
|
||||||
|
* Added preliminary support for parameterizing the binary point position |
||||||
|
in the fixed-point representation. |
||||||
|
|
||||||
|
* Added multiply/accumulate optimization to the Layer III IMDCT for long |
||||||
|
blocks. |
||||||
|
|
||||||
|
* Fixed a bug in the handling of Layer III mixed_block_flag. |
||||||
|
|
||||||
|
* Fixed a configure problem when multiple -O CFLAGS are present. |
||||||
|
|
||||||
|
Version 0.12.2 (beta) |
||||||
|
|
||||||
|
* Rearranged the synthesis polyphase filterbank memory vector for better |
||||||
|
locality of reference, and rewrote mad_synth_frame() to accommodate, |
||||||
|
resulting in improved performance. |
||||||
|
|
||||||
|
* Discovered a combination of compiler optimization flags that further |
||||||
|
improve performance. |
||||||
|
|
||||||
|
* Changed some array references in layer3.c to pointer derefs. |
||||||
|
|
||||||
|
Version 0.12.1 (beta) |
||||||
|
|
||||||
|
* Resolved the intensity + MS joint stereo issue (a simple bug). |
||||||
|
OPT_ISKLUGE is no longer considered to be a kluge. |
||||||
|
|
||||||
|
* Fixed another, hopefully last main_data memory bug. |
||||||
|
|
||||||
|
* Split part of struct mad_frame into struct mad_header for convenience |
||||||
|
and size. |
||||||
|
|
||||||
|
Version 0.12.0 (alpha) |
||||||
|
|
||||||
|
* Changed the build environment to use automake and libtool. A libmad |
||||||
|
shared library can now be built using the --enable-shared option to |
||||||
|
`configure'. |
||||||
|
|
||||||
|
* Added another callback to MAD's high-level decoder API after the frame |
||||||
|
header has been read but before the frame's audio data is decoded. |
||||||
|
|
||||||
|
* Streamlined header processing so that mad_frame_decode() can be called |
||||||
|
with or without having already called mad_frame_header(). |
||||||
|
|
||||||
|
* Fixed some other header reading miscellany, including CRC handling and |
||||||
|
free bitrate detection, and frame length verification with free |
||||||
|
bitrates. |
||||||
|
|
||||||
|
* Fixed a problem with Layer III free bitrates > 320 kbps. The main_data |
||||||
|
buffer size should now be large enough to handle any size frame, by |
||||||
|
virtue of the maximum possible part2_3_length. |
||||||
|
|
||||||
|
* Further developed the async API; arbitrary messages can now be passed to |
||||||
|
the subsidiary decoding process. |
||||||
|
|
||||||
|
* Streamlined timer.c and extended its interface. It now has support for |
||||||
|
video frame/field lengths, including output support for drop-frame |
||||||
|
encoding. |
||||||
|
|
||||||
|
* Replaced many constant integer preprocessor defines with enums. |
||||||
|
|
||||||
|
Version 0.11.4 (beta) |
||||||
|
|
||||||
|
* Fixed free format bitrate discovery. |
||||||
|
|
||||||
|
* Changed the timer implementation and extended its interface. |
||||||
|
|
||||||
|
* Integrated Nicolas Pitre's patch for pre-shifting at compile-time and |
||||||
|
for better multiply/accumulate code output. |
||||||
|
|
||||||
|
* Applied Simon Burge's patch to imdct_l_arm.S for a.out compatibility. |
||||||
|
|
||||||
|
* Added -mtune=strongarm for all ARM targets. |
||||||
|
|
||||||
|
Version 0.11.3 (beta) |
||||||
|
|
||||||
|
* Added new --enable-speed and --enable-accuracy options for `configure' |
||||||
|
to automatically select appropriate SSO/ASO options, et al. |
||||||
|
|
||||||
|
* Modified subband synthesis to use multiply/accumulate optimization (if |
||||||
|
available) for better speed and/or accuracy. |
||||||
|
|
||||||
|
* Incorporated Andre McCurdy's changes for further rounding optimizations |
||||||
|
in the rest of his code. |
||||||
|
|
||||||
|
Version 0.11.2 (beta) |
||||||
|
|
||||||
|
* Incorporated Nicolas Pitre's ARM assembly and parameterized scaling |
||||||
|
changes. |
||||||
|
|
||||||
|
* Incorporated Andre McCurdy's ARM assembly optimization (used only if |
||||||
|
--enable-aso is given to `configure' to enable architecture-specific |
||||||
|
optimizations.) |
||||||
|
|
||||||
|
* Reduced FPM_INTEL assembly to two instructions. |
||||||
|
|
||||||
|
* Fixed accuracy problems with certain FPM modes in synth.c. |
||||||
|
|
||||||
|
* Improved the accuracy of FPM_APPROX. |
||||||
|
|
||||||
|
* Improved the accuracy of SSO. |
||||||
|
|
||||||
|
* Improved sync discovery by checking for a sync word in the following |
||||||
|
frame. |
||||||
|
|
||||||
|
* Minor code clean-up. |
||||||
|
|
||||||
|
* Added experimental rules for generating a libmad.so shared library. |
||||||
|
|
||||||
|
Version 0.11.1 (beta) |
||||||
|
|
||||||
|
* Moved libmad code into a separate directory. |
||||||
|
|
||||||
|
* Changed SSO to be disabled by default, as output accuracy is deemed to |
||||||
|
be more important than speed in the general case. |
||||||
|
|
||||||
|
* Fixed a bug in Layer III sanity checking that could cause a crash on |
||||||
|
certain random data input. |
||||||
|
|
||||||
|
* Extended the Layer III requantization table from 8191 to 8206 as some |
||||||
|
encoders are known to use these values, even though ISO/IEC 11172-3 |
||||||
|
suggests the maximum should be 8191. |
||||||
|
|
||||||
|
Version 0.11.0 (beta) |
||||||
|
|
||||||
|
* Implemented MPEG-2 extension to Lower Sampling Frequencies. |
||||||
|
|
||||||
|
* Improved Layer III performance by avoiding IMDCT calculation when all |
||||||
|
input samples are zero. |
||||||
|
|
||||||
|
* Significantly reduced size of Layer II tables. |
||||||
|
|
||||||
|
Version 0.10.3 (beta) |
||||||
|
|
||||||
|
* Improved SSO output quality. |
||||||
|
|
||||||
|
* Made portable to cygwin. |
||||||
|
|
||||||
|
* Localized memory references in III_huffdecode() for better performance. |
||||||
|
|
||||||
|
Version 0.10.2 (beta) |
||||||
|
|
||||||
|
* Rewrote Layer III long block 36-point IMDCT routine for better |
||||||
|
performance. |
||||||
|
|
||||||
|
* Improved subband synthesis fixed-point games somewhat. |
||||||
|
|
||||||
|
Version 0.10.1 (beta) |
||||||
|
|
||||||
|
* Added a subband synthesis optimization (SSO) which involves modifying |
||||||
|
the fixed-point multiplication method during windowing. This produces |
||||||
|
subtle differences in the output but improves performance greatly. |
||||||
|
|
||||||
|
* Added I_STEREO and MS_STEREO flags to frame struct. |
||||||
|
|
||||||
|
* Eliminated privately-used CRCFAILED flag. |
||||||
|
|
||||||
|
* Fixed a bug where Layer III decoding could crash on some badly-formatted |
||||||
|
(e.g. non-MPEG) bitstreams. |
||||||
|
|
||||||
|
* Miscellaneous code clean-up. |
||||||
|
|
||||||
|
Version 0.10.0 (beta) |
||||||
|
|
||||||
|
* Added SPARC fixed-point math support. |
||||||
|
|
||||||
|
* Revamped libmad API for better high- and low-level support. |
||||||
|
|
||||||
|
* Documented more of the code. |
||||||
|
|
||||||
|
* Changed sync semantics such that new stream buffers are assumed to be |
||||||
|
sync-aligned. |
||||||
|
|
||||||
|
* Changed Layer III to dynamically allocate static memory so as not to |
||||||
|
waste it (about 6.4K) when only decoding Layer I or Layer II. |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
@ -0,0 +1,21 @@ |
|||||||
|
|
||||||
|
libmad - MPEG audio decoder library |
||||||
|
Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
|
||||||
|
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 |
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
|
||||||
|
If you would like to negotiate alternate licensing terms, you may do |
||||||
|
so by contacting: Underbit Technologies, Inc. <info@underbit.com> |
||||||
|
|
@ -0,0 +1,116 @@ |
|||||||
|
|
||||||
|
libmad - MPEG audio decoder library |
||||||
|
Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
|
||||||
|
$Id: CREDITS,v 1.5 2004/02/17 02:02:03 rob Exp $ |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
AUTHOR |
||||||
|
|
||||||
|
Except where otherwise noted, all code was authored by: |
||||||
|
|
||||||
|
Robert Leslie <rob@underbit.com> |
||||||
|
|
||||||
|
CONTRIBUTORS |
||||||
|
|
||||||
|
Significant contributions have been incorporated with thanks to: |
||||||
|
|
||||||
|
Anonymous |
||||||
|
2002/03/15: frame.c |
||||||
|
- Reported problem with use of reserved emphasis value. |
||||||
|
2003/08/31: layer12.c |
||||||
|
- Suggested support for certain disallowed bitrate/mode |
||||||
|
combinations. |
||||||
|
|
||||||
|
Niek Albers <info@daansystems.com> |
||||||
|
2003/04/21: layer3.c |
||||||
|
- Reported runtime uninitialized use of `ptr' in designating |
||||||
|
ancillary bits after a decoding error. |
||||||
|
|
||||||
|
Christian Biere <cbiere@users.sourceforge.net> |
||||||
|
2003/02/01: frame.c |
||||||
|
- Reported assertion failure in layer3.c due to an |
||||||
|
invalid/unsupported Layer III free format bitrate. |
||||||
|
|
||||||
|
David Blythe <blythe@routefree.com> |
||||||
|
2001/01/30: fixed.h |
||||||
|
- Provided initial PowerPC fixed-point assembly. |
||||||
|
|
||||||
|
Simon Burge <simonb@wasabisystems.com> |
||||||
|
2000/09/20: imdct_l_arm.S |
||||||
|
- Suggested patch for a.out compatibility. |
||||||
|
|
||||||
|
Brian Cameron <Brian.Cameron@sun.com> |
||||||
|
2003/07/02: huffman.c |
||||||
|
- Suggested changes for improved portability. |
||||||
|
|
||||||
|
Joshua Haberman <joshua@haberman.com> |
||||||
|
2001/08/10: decoder.c, huffman.c |
||||||
|
- Suggested portability fixes. |
||||||
|
|
||||||
|
Timothy King <lordzork@lordzork.com> |
||||||
|
2002/05/04: sf_table.dat, layer12.c |
||||||
|
- Reported problem with use of (missing) scalefactor index 63. |
||||||
|
|
||||||
|
Felix von Leitner <felix-mad@fefe.de> |
||||||
|
2003/01/21: fixed.h |
||||||
|
- Suggested Intel scaling alternative for possible speedup. |
||||||
|
|
||||||
|
Andre McCurdy <armccurdy@yahoo.co.uk> |
||||||
|
2000/08/10: imdct_l_arm.S |
||||||
|
- ARM optimized assembly replacement for III_imdct_l(). |
||||||
|
2000/09/15: imdct_l_arm.S |
||||||
|
- Applied Nicolas Pitre's rounding optimisation in all remaining |
||||||
|
places. |
||||||
|
2001/02/10: layer3.c |
||||||
|
- Inspiration for Huffman decoding and requantization rewrite, and |
||||||
|
other miscellany. |
||||||
|
2001/03/24: imdct_l_arm.S |
||||||
|
- Corrected PIC unsafe code. |
||||||
|
2002/02/16: fixed.h |
||||||
|
- Discovered bug in ARM version of mad_f_scale64(). |
||||||
|
|
||||||
|
Haruhiko OGASAWARA <theta@m1.interq.or.jp> |
||||||
|
2001/01/28: layer3.c |
||||||
|
- Reported discrepancy in alias reduction for mixed short blocks. |
||||||
|
|
||||||
|
Brett Paterson <brett@fmod.org> |
||||||
|
2001/10/28: global.h |
||||||
|
- Reported missing <assert.h> et al. under MS Embedded Visual C. |
||||||
|
|
||||||
|
Sean 'Shaleh' Perry <shaleh@via.net> |
||||||
|
2000/04/04: fixed.h |
||||||
|
- Suggested use of size-dependent typedefs. |
||||||
|
2001/10/22: config.guess, config.sub |
||||||
|
- Keep up to date for proper Debian packaging. |
||||||
|
|
||||||
|
Bertrand Petit <eemad@phoe.frmug.org> |
||||||
|
2001/11/05: synth.h |
||||||
|
- Suggested PCM channel enumeration constants. |
||||||
|
2001/11/05: stream.h |
||||||
|
- Suggested MAD_ERROR_NONE enumeration constant. |
||||||
|
2001/11/05: stream.c |
||||||
|
- Suggested mad_stream_errorstr() function. |
||||||
|
|
||||||
|
Nicolas Pitre <nico@cam.org> |
||||||
|
2000/09/09: fixed.h |
||||||
|
- Parameterized all scaling for correct use of all multiplication |
||||||
|
methods within mad_synth_frame(). |
||||||
|
- Rewrote the FPM_ARM version of mad_f_mul() so we have 64-bit |
||||||
|
multiplication result, rounding and scaling with 3 instructions. |
||||||
|
2000/09/09: imdct_l_arm.S |
||||||
|
- Optimized rounding + scaling operations. |
||||||
|
2000/09/17: synth.c |
||||||
|
- Changed D[] run-time shifts to compile-time. |
||||||
|
- Modified synthesis for better multiply/accumulate code output. |
||||||
|
2001/08/11: fixed.h, synth.c |
||||||
|
- Suggested 64-bit FPM negation and negative term factorization |
||||||
|
during synthesis. |
||||||
|
2001/08/11: fixed.h |
||||||
|
- Suggested unrounded behavior for FPM_DEFAULT when OPT_SPEED. |
||||||
|
2001/11/19: fixed.c |
||||||
|
- Suggested computation of any resampling ratio. |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
@ -0,0 +1,607 @@ |
|||||||
|
/* |
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: D.dat,v 1.9 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
/* |
||||||
|
* These are the coefficients for the subband synthesis window. This is a |
||||||
|
* reordered version of Table B.3 from ISO/IEC 11172-3. |
||||||
|
* |
||||||
|
* Every value is parameterized so that shift optimizations can be made at |
||||||
|
* compile-time. For example, every value can be right-shifted 12 bits to |
||||||
|
* minimize multiply instruction times without any loss of accuracy. |
||||||
|
*/ |
||||||
|
|
||||||
|
{ PRESHIFT(0x00000000) /* 0.000000000 */, /* 0 */ |
||||||
|
-PRESHIFT(0x0001d000) /* -0.000442505 */, |
||||||
|
PRESHIFT(0x000d5000) /* 0.003250122 */, |
||||||
|
-PRESHIFT(0x001cb000) /* -0.007003784 */, |
||||||
|
PRESHIFT(0x007f5000) /* 0.031082153 */, |
||||||
|
-PRESHIFT(0x01421000) /* -0.078628540 */, |
||||||
|
PRESHIFT(0x019ae000) /* 0.100311279 */, |
||||||
|
-PRESHIFT(0x09271000) /* -0.572036743 */, |
||||||
|
PRESHIFT(0x1251e000) /* 1.144989014 */, |
||||||
|
PRESHIFT(0x09271000) /* 0.572036743 */, |
||||||
|
PRESHIFT(0x019ae000) /* 0.100311279 */, |
||||||
|
PRESHIFT(0x01421000) /* 0.078628540 */, |
||||||
|
PRESHIFT(0x007f5000) /* 0.031082153 */, |
||||||
|
PRESHIFT(0x001cb000) /* 0.007003784 */, |
||||||
|
PRESHIFT(0x000d5000) /* 0.003250122 */, |
||||||
|
PRESHIFT(0x0001d000) /* 0.000442505 */, |
||||||
|
|
||||||
|
PRESHIFT(0x00000000) /* 0.000000000 */, |
||||||
|
-PRESHIFT(0x0001d000) /* -0.000442505 */, |
||||||
|
PRESHIFT(0x000d5000) /* 0.003250122 */, |
||||||
|
-PRESHIFT(0x001cb000) /* -0.007003784 */, |
||||||
|
PRESHIFT(0x007f5000) /* 0.031082153 */, |
||||||
|
-PRESHIFT(0x01421000) /* -0.078628540 */, |
||||||
|
PRESHIFT(0x019ae000) /* 0.100311279 */, |
||||||
|
-PRESHIFT(0x09271000) /* -0.572036743 */, |
||||||
|
PRESHIFT(0x1251e000) /* 1.144989014 */, |
||||||
|
PRESHIFT(0x09271000) /* 0.572036743 */, |
||||||
|
PRESHIFT(0x019ae000) /* 0.100311279 */, |
||||||
|
PRESHIFT(0x01421000) /* 0.078628540 */, |
||||||
|
PRESHIFT(0x007f5000) /* 0.031082153 */, |
||||||
|
PRESHIFT(0x001cb000) /* 0.007003784 */, |
||||||
|
PRESHIFT(0x000d5000) /* 0.003250122 */, |
||||||
|
PRESHIFT(0x0001d000) /* 0.000442505 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 1 */ |
||||||
|
-PRESHIFT(0x0001f000) /* -0.000473022 */, |
||||||
|
PRESHIFT(0x000da000) /* 0.003326416 */, |
||||||
|
-PRESHIFT(0x00207000) /* -0.007919312 */, |
||||||
|
PRESHIFT(0x007d0000) /* 0.030517578 */, |
||||||
|
-PRESHIFT(0x0158d000) /* -0.084182739 */, |
||||||
|
PRESHIFT(0x01747000) /* 0.090927124 */, |
||||||
|
-PRESHIFT(0x099a8000) /* -0.600219727 */, |
||||||
|
PRESHIFT(0x124f0000) /* 1.144287109 */, |
||||||
|
PRESHIFT(0x08b38000) /* 0.543823242 */, |
||||||
|
PRESHIFT(0x01bde000) /* 0.108856201 */, |
||||||
|
PRESHIFT(0x012b4000) /* 0.073059082 */, |
||||||
|
PRESHIFT(0x0080f000) /* 0.031478882 */, |
||||||
|
PRESHIFT(0x00191000) /* 0.006118774 */, |
||||||
|
PRESHIFT(0x000d0000) /* 0.003173828 */, |
||||||
|
PRESHIFT(0x0001a000) /* 0.000396729 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00001000) /* -0.000015259 */, |
||||||
|
-PRESHIFT(0x0001f000) /* -0.000473022 */, |
||||||
|
PRESHIFT(0x000da000) /* 0.003326416 */, |
||||||
|
-PRESHIFT(0x00207000) /* -0.007919312 */, |
||||||
|
PRESHIFT(0x007d0000) /* 0.030517578 */, |
||||||
|
-PRESHIFT(0x0158d000) /* -0.084182739 */, |
||||||
|
PRESHIFT(0x01747000) /* 0.090927124 */, |
||||||
|
-PRESHIFT(0x099a8000) /* -0.600219727 */, |
||||||
|
PRESHIFT(0x124f0000) /* 1.144287109 */, |
||||||
|
PRESHIFT(0x08b38000) /* 0.543823242 */, |
||||||
|
PRESHIFT(0x01bde000) /* 0.108856201 */, |
||||||
|
PRESHIFT(0x012b4000) /* 0.073059082 */, |
||||||
|
PRESHIFT(0x0080f000) /* 0.031478882 */, |
||||||
|
PRESHIFT(0x00191000) /* 0.006118774 */, |
||||||
|
PRESHIFT(0x000d0000) /* 0.003173828 */, |
||||||
|
PRESHIFT(0x0001a000) /* 0.000396729 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 2 */ |
||||||
|
-PRESHIFT(0x00023000) /* -0.000534058 */, |
||||||
|
PRESHIFT(0x000de000) /* 0.003387451 */, |
||||||
|
-PRESHIFT(0x00245000) /* -0.008865356 */, |
||||||
|
PRESHIFT(0x007a0000) /* 0.029785156 */, |
||||||
|
-PRESHIFT(0x016f7000) /* -0.089706421 */, |
||||||
|
PRESHIFT(0x014a8000) /* 0.080688477 */, |
||||||
|
-PRESHIFT(0x0a0d8000) /* -0.628295898 */, |
||||||
|
PRESHIFT(0x12468000) /* 1.142211914 */, |
||||||
|
PRESHIFT(0x083ff000) /* 0.515609741 */, |
||||||
|
PRESHIFT(0x01dd8000) /* 0.116577148 */, |
||||||
|
PRESHIFT(0x01149000) /* 0.067520142 */, |
||||||
|
PRESHIFT(0x00820000) /* 0.031738281 */, |
||||||
|
PRESHIFT(0x0015b000) /* 0.005294800 */, |
||||||
|
PRESHIFT(0x000ca000) /* 0.003082275 */, |
||||||
|
PRESHIFT(0x00018000) /* 0.000366211 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00001000) /* -0.000015259 */, |
||||||
|
-PRESHIFT(0x00023000) /* -0.000534058 */, |
||||||
|
PRESHIFT(0x000de000) /* 0.003387451 */, |
||||||
|
-PRESHIFT(0x00245000) /* -0.008865356 */, |
||||||
|
PRESHIFT(0x007a0000) /* 0.029785156 */, |
||||||
|
-PRESHIFT(0x016f7000) /* -0.089706421 */, |
||||||
|
PRESHIFT(0x014a8000) /* 0.080688477 */, |
||||||
|
-PRESHIFT(0x0a0d8000) /* -0.628295898 */, |
||||||
|
PRESHIFT(0x12468000) /* 1.142211914 */, |
||||||
|
PRESHIFT(0x083ff000) /* 0.515609741 */, |
||||||
|
PRESHIFT(0x01dd8000) /* 0.116577148 */, |
||||||
|
PRESHIFT(0x01149000) /* 0.067520142 */, |
||||||
|
PRESHIFT(0x00820000) /* 0.031738281 */, |
||||||
|
PRESHIFT(0x0015b000) /* 0.005294800 */, |
||||||
|
PRESHIFT(0x000ca000) /* 0.003082275 */, |
||||||
|
PRESHIFT(0x00018000) /* 0.000366211 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 3 */ |
||||||
|
-PRESHIFT(0x00026000) /* -0.000579834 */, |
||||||
|
PRESHIFT(0x000e1000) /* 0.003433228 */, |
||||||
|
-PRESHIFT(0x00285000) /* -0.009841919 */, |
||||||
|
PRESHIFT(0x00765000) /* 0.028884888 */, |
||||||
|
-PRESHIFT(0x0185d000) /* -0.095169067 */, |
||||||
|
PRESHIFT(0x011d1000) /* 0.069595337 */, |
||||||
|
-PRESHIFT(0x0a7fe000) /* -0.656219482 */, |
||||||
|
PRESHIFT(0x12386000) /* 1.138763428 */, |
||||||
|
PRESHIFT(0x07ccb000) /* 0.487472534 */, |
||||||
|
PRESHIFT(0x01f9c000) /* 0.123474121 */, |
||||||
|
PRESHIFT(0x00fdf000) /* 0.061996460 */, |
||||||
|
PRESHIFT(0x00827000) /* 0.031845093 */, |
||||||
|
PRESHIFT(0x00126000) /* 0.004486084 */, |
||||||
|
PRESHIFT(0x000c4000) /* 0.002990723 */, |
||||||
|
PRESHIFT(0x00015000) /* 0.000320435 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00001000) /* -0.000015259 */, |
||||||
|
-PRESHIFT(0x00026000) /* -0.000579834 */, |
||||||
|
PRESHIFT(0x000e1000) /* 0.003433228 */, |
||||||
|
-PRESHIFT(0x00285000) /* -0.009841919 */, |
||||||
|
PRESHIFT(0x00765000) /* 0.028884888 */, |
||||||
|
-PRESHIFT(0x0185d000) /* -0.095169067 */, |
||||||
|
PRESHIFT(0x011d1000) /* 0.069595337 */, |
||||||
|
-PRESHIFT(0x0a7fe000) /* -0.656219482 */, |
||||||
|
PRESHIFT(0x12386000) /* 1.138763428 */, |
||||||
|
PRESHIFT(0x07ccb000) /* 0.487472534 */, |
||||||
|
PRESHIFT(0x01f9c000) /* 0.123474121 */, |
||||||
|
PRESHIFT(0x00fdf000) /* 0.061996460 */, |
||||||
|
PRESHIFT(0x00827000) /* 0.031845093 */, |
||||||
|
PRESHIFT(0x00126000) /* 0.004486084 */, |
||||||
|
PRESHIFT(0x000c4000) /* 0.002990723 */, |
||||||
|
PRESHIFT(0x00015000) /* 0.000320435 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 4 */ |
||||||
|
-PRESHIFT(0x00029000) /* -0.000625610 */, |
||||||
|
PRESHIFT(0x000e3000) /* 0.003463745 */, |
||||||
|
-PRESHIFT(0x002c7000) /* -0.010848999 */, |
||||||
|
PRESHIFT(0x0071e000) /* 0.027801514 */, |
||||||
|
-PRESHIFT(0x019bd000) /* -0.100540161 */, |
||||||
|
PRESHIFT(0x00ec0000) /* 0.057617187 */, |
||||||
|
-PRESHIFT(0x0af15000) /* -0.683914185 */, |
||||||
|
PRESHIFT(0x12249000) /* 1.133926392 */, |
||||||
|
PRESHIFT(0x075a0000) /* 0.459472656 */, |
||||||
|
PRESHIFT(0x0212c000) /* 0.129577637 */, |
||||||
|
PRESHIFT(0x00e79000) /* 0.056533813 */, |
||||||
|
PRESHIFT(0x00825000) /* 0.031814575 */, |
||||||
|
PRESHIFT(0x000f4000) /* 0.003723145 */, |
||||||
|
PRESHIFT(0x000be000) /* 0.002899170 */, |
||||||
|
PRESHIFT(0x00013000) /* 0.000289917 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00001000) /* -0.000015259 */, |
||||||
|
-PRESHIFT(0x00029000) /* -0.000625610 */, |
||||||
|
PRESHIFT(0x000e3000) /* 0.003463745 */, |
||||||
|
-PRESHIFT(0x002c7000) /* -0.010848999 */, |
||||||
|
PRESHIFT(0x0071e000) /* 0.027801514 */, |
||||||
|
-PRESHIFT(0x019bd000) /* -0.100540161 */, |
||||||
|
PRESHIFT(0x00ec0000) /* 0.057617187 */, |
||||||
|
-PRESHIFT(0x0af15000) /* -0.683914185 */, |
||||||
|
PRESHIFT(0x12249000) /* 1.133926392 */, |
||||||
|
PRESHIFT(0x075a0000) /* 0.459472656 */, |
||||||
|
PRESHIFT(0x0212c000) /* 0.129577637 */, |
||||||
|
PRESHIFT(0x00e79000) /* 0.056533813 */, |
||||||
|
PRESHIFT(0x00825000) /* 0.031814575 */, |
||||||
|
PRESHIFT(0x000f4000) /* 0.003723145 */, |
||||||
|
PRESHIFT(0x000be000) /* 0.002899170 */, |
||||||
|
PRESHIFT(0x00013000) /* 0.000289917 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 5 */ |
||||||
|
-PRESHIFT(0x0002d000) /* -0.000686646 */, |
||||||
|
PRESHIFT(0x000e4000) /* 0.003479004 */, |
||||||
|
-PRESHIFT(0x0030b000) /* -0.011886597 */, |
||||||
|
PRESHIFT(0x006cb000) /* 0.026535034 */, |
||||||
|
-PRESHIFT(0x01b17000) /* -0.105819702 */, |
||||||
|
PRESHIFT(0x00b77000) /* 0.044784546 */, |
||||||
|
-PRESHIFT(0x0b619000) /* -0.711318970 */, |
||||||
|
PRESHIFT(0x120b4000) /* 1.127746582 */, |
||||||
|
PRESHIFT(0x06e81000) /* 0.431655884 */, |
||||||
|
PRESHIFT(0x02288000) /* 0.134887695 */, |
||||||
|
PRESHIFT(0x00d17000) /* 0.051132202 */, |
||||||
|
PRESHIFT(0x0081b000) /* 0.031661987 */, |
||||||
|
PRESHIFT(0x000c5000) /* 0.003005981 */, |
||||||
|
PRESHIFT(0x000b7000) /* 0.002792358 */, |
||||||
|
PRESHIFT(0x00011000) /* 0.000259399 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00001000) /* -0.000015259 */, |
||||||
|
-PRESHIFT(0x0002d000) /* -0.000686646 */, |
||||||
|
PRESHIFT(0x000e4000) /* 0.003479004 */, |
||||||
|
-PRESHIFT(0x0030b000) /* -0.011886597 */, |
||||||
|
PRESHIFT(0x006cb000) /* 0.026535034 */, |
||||||
|
-PRESHIFT(0x01b17000) /* -0.105819702 */, |
||||||
|
PRESHIFT(0x00b77000) /* 0.044784546 */, |
||||||
|
-PRESHIFT(0x0b619000) /* -0.711318970 */, |
||||||
|
PRESHIFT(0x120b4000) /* 1.127746582 */, |
||||||
|
PRESHIFT(0x06e81000) /* 0.431655884 */, |
||||||
|
PRESHIFT(0x02288000) /* 0.134887695 */, |
||||||
|
PRESHIFT(0x00d17000) /* 0.051132202 */, |
||||||
|
PRESHIFT(0x0081b000) /* 0.031661987 */, |
||||||
|
PRESHIFT(0x000c5000) /* 0.003005981 */, |
||||||
|
PRESHIFT(0x000b7000) /* 0.002792358 */, |
||||||
|
PRESHIFT(0x00011000) /* 0.000259399 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 6 */ |
||||||
|
-PRESHIFT(0x00031000) /* -0.000747681 */, |
||||||
|
PRESHIFT(0x000e4000) /* 0.003479004 */, |
||||||
|
-PRESHIFT(0x00350000) /* -0.012939453 */, |
||||||
|
PRESHIFT(0x0066c000) /* 0.025085449 */, |
||||||
|
-PRESHIFT(0x01c67000) /* -0.110946655 */, |
||||||
|
PRESHIFT(0x007f5000) /* 0.031082153 */, |
||||||
|
-PRESHIFT(0x0bd06000) /* -0.738372803 */, |
||||||
|
PRESHIFT(0x11ec7000) /* 1.120223999 */, |
||||||
|
PRESHIFT(0x06772000) /* 0.404083252 */, |
||||||
|
PRESHIFT(0x023b3000) /* 0.139450073 */, |
||||||
|
PRESHIFT(0x00bbc000) /* 0.045837402 */, |
||||||
|
PRESHIFT(0x00809000) /* 0.031387329 */, |
||||||
|
PRESHIFT(0x00099000) /* 0.002334595 */, |
||||||
|
PRESHIFT(0x000b0000) /* 0.002685547 */, |
||||||
|
PRESHIFT(0x00010000) /* 0.000244141 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00001000) /* -0.000015259 */, |
||||||
|
-PRESHIFT(0x00031000) /* -0.000747681 */, |
||||||
|
PRESHIFT(0x000e4000) /* 0.003479004 */, |
||||||
|
-PRESHIFT(0x00350000) /* -0.012939453 */, |
||||||
|
PRESHIFT(0x0066c000) /* 0.025085449 */, |
||||||
|
-PRESHIFT(0x01c67000) /* -0.110946655 */, |
||||||
|
PRESHIFT(0x007f5000) /* 0.031082153 */, |
||||||
|
-PRESHIFT(0x0bd06000) /* -0.738372803 */, |
||||||
|
PRESHIFT(0x11ec7000) /* 1.120223999 */, |
||||||
|
PRESHIFT(0x06772000) /* 0.404083252 */, |
||||||
|
PRESHIFT(0x023b3000) /* 0.139450073 */, |
||||||
|
PRESHIFT(0x00bbc000) /* 0.045837402 */, |
||||||
|
PRESHIFT(0x00809000) /* 0.031387329 */, |
||||||
|
PRESHIFT(0x00099000) /* 0.002334595 */, |
||||||
|
PRESHIFT(0x000b0000) /* 0.002685547 */, |
||||||
|
PRESHIFT(0x00010000) /* 0.000244141 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00002000) /* -0.000030518 */, /* 7 */ |
||||||
|
-PRESHIFT(0x00035000) /* -0.000808716 */, |
||||||
|
PRESHIFT(0x000e3000) /* 0.003463745 */, |
||||||
|
-PRESHIFT(0x00397000) /* -0.014022827 */, |
||||||
|
PRESHIFT(0x005ff000) /* 0.023422241 */, |
||||||
|
-PRESHIFT(0x01dad000) /* -0.115921021 */, |
||||||
|
PRESHIFT(0x0043a000) /* 0.016510010 */, |
||||||
|
-PRESHIFT(0x0c3d9000) /* -0.765029907 */, |
||||||
|
PRESHIFT(0x11c83000) /* 1.111373901 */, |
||||||
|
PRESHIFT(0x06076000) /* 0.376800537 */, |
||||||
|
PRESHIFT(0x024ad000) /* 0.143264771 */, |
||||||
|
PRESHIFT(0x00a67000) /* 0.040634155 */, |
||||||
|
PRESHIFT(0x007f0000) /* 0.031005859 */, |
||||||
|
PRESHIFT(0x0006f000) /* 0.001693726 */, |
||||||
|
PRESHIFT(0x000a9000) /* 0.002578735 */, |
||||||
|
PRESHIFT(0x0000e000) /* 0.000213623 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00002000) /* -0.000030518 */, |
||||||
|
-PRESHIFT(0x00035000) /* -0.000808716 */, |
||||||
|
PRESHIFT(0x000e3000) /* 0.003463745 */, |
||||||
|
-PRESHIFT(0x00397000) /* -0.014022827 */, |
||||||
|
PRESHIFT(0x005ff000) /* 0.023422241 */, |
||||||
|
-PRESHIFT(0x01dad000) /* -0.115921021 */, |
||||||
|
PRESHIFT(0x0043a000) /* 0.016510010 */, |
||||||
|
-PRESHIFT(0x0c3d9000) /* -0.765029907 */, |
||||||
|
PRESHIFT(0x11c83000) /* 1.111373901 */, |
||||||
|
PRESHIFT(0x06076000) /* 0.376800537 */, |
||||||
|
PRESHIFT(0x024ad000) /* 0.143264771 */, |
||||||
|
PRESHIFT(0x00a67000) /* 0.040634155 */, |
||||||
|
PRESHIFT(0x007f0000) /* 0.031005859 */, |
||||||
|
PRESHIFT(0x0006f000) /* 0.001693726 */, |
||||||
|
PRESHIFT(0x000a9000) /* 0.002578735 */, |
||||||
|
PRESHIFT(0x0000e000) /* 0.000213623 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00002000) /* -0.000030518 */, /* 8 */ |
||||||
|
-PRESHIFT(0x0003a000) /* -0.000885010 */, |
||||||
|
PRESHIFT(0x000e0000) /* 0.003417969 */, |
||||||
|
-PRESHIFT(0x003df000) /* -0.015121460 */, |
||||||
|
PRESHIFT(0x00586000) /* 0.021575928 */, |
||||||
|
-PRESHIFT(0x01ee6000) /* -0.120697021 */, |
||||||
|
PRESHIFT(0x00046000) /* 0.001068115 */, |
||||||
|
-PRESHIFT(0x0ca8d000) /* -0.791213989 */, |
||||||
|
PRESHIFT(0x119e9000) /* 1.101211548 */, |
||||||
|
PRESHIFT(0x05991000) /* 0.349868774 */, |
||||||
|
PRESHIFT(0x02578000) /* 0.146362305 */, |
||||||
|
PRESHIFT(0x0091a000) /* 0.035552979 */, |
||||||
|
PRESHIFT(0x007d1000) /* 0.030532837 */, |
||||||
|
PRESHIFT(0x00048000) /* 0.001098633 */, |
||||||
|
PRESHIFT(0x000a1000) /* 0.002456665 */, |
||||||
|
PRESHIFT(0x0000d000) /* 0.000198364 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00002000) /* -0.000030518 */, |
||||||
|
-PRESHIFT(0x0003a000) /* -0.000885010 */, |
||||||
|
PRESHIFT(0x000e0000) /* 0.003417969 */, |
||||||
|
-PRESHIFT(0x003df000) /* -0.015121460 */, |
||||||
|
PRESHIFT(0x00586000) /* 0.021575928 */, |
||||||
|
-PRESHIFT(0x01ee6000) /* -0.120697021 */, |
||||||
|
PRESHIFT(0x00046000) /* 0.001068115 */, |
||||||
|
-PRESHIFT(0x0ca8d000) /* -0.791213989 */, |
||||||
|
PRESHIFT(0x119e9000) /* 1.101211548 */, |
||||||
|
PRESHIFT(0x05991000) /* 0.349868774 */, |
||||||
|
PRESHIFT(0x02578000) /* 0.146362305 */, |
||||||
|
PRESHIFT(0x0091a000) /* 0.035552979 */, |
||||||
|
PRESHIFT(0x007d1000) /* 0.030532837 */, |
||||||
|
PRESHIFT(0x00048000) /* 0.001098633 */, |
||||||
|
PRESHIFT(0x000a1000) /* 0.002456665 */, |
||||||
|
PRESHIFT(0x0000d000) /* 0.000198364 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00002000) /* -0.000030518 */, /* 9 */ |
||||||
|
-PRESHIFT(0x0003f000) /* -0.000961304 */, |
||||||
|
PRESHIFT(0x000dd000) /* 0.003372192 */, |
||||||
|
-PRESHIFT(0x00428000) /* -0.016235352 */, |
||||||
|
PRESHIFT(0x00500000) /* 0.019531250 */, |
||||||
|
-PRESHIFT(0x02011000) /* -0.125259399 */, |
||||||
|
-PRESHIFT(0x003e6000) /* -0.015228271 */, |
||||||
|
-PRESHIFT(0x0d11e000) /* -0.816864014 */, |
||||||
|
PRESHIFT(0x116fc000) /* 1.089782715 */, |
||||||
|
PRESHIFT(0x052c5000) /* 0.323318481 */, |
||||||
|
PRESHIFT(0x02616000) /* 0.148773193 */, |
||||||
|
PRESHIFT(0x007d6000) /* 0.030609131 */, |
||||||
|
PRESHIFT(0x007aa000) /* 0.029937744 */, |
||||||
|
PRESHIFT(0x00024000) /* 0.000549316 */, |
||||||
|
PRESHIFT(0x0009a000) /* 0.002349854 */, |
||||||
|
PRESHIFT(0x0000b000) /* 0.000167847 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00002000) /* -0.000030518 */, |
||||||
|
-PRESHIFT(0x0003f000) /* -0.000961304 */, |
||||||
|
PRESHIFT(0x000dd000) /* 0.003372192 */, |
||||||
|
-PRESHIFT(0x00428000) /* -0.016235352 */, |
||||||
|
PRESHIFT(0x00500000) /* 0.019531250 */, |
||||||
|
-PRESHIFT(0x02011000) /* -0.125259399 */, |
||||||
|
-PRESHIFT(0x003e6000) /* -0.015228271 */, |
||||||
|
-PRESHIFT(0x0d11e000) /* -0.816864014 */, |
||||||
|
PRESHIFT(0x116fc000) /* 1.089782715 */, |
||||||
|
PRESHIFT(0x052c5000) /* 0.323318481 */, |
||||||
|
PRESHIFT(0x02616000) /* 0.148773193 */, |
||||||
|
PRESHIFT(0x007d6000) /* 0.030609131 */, |
||||||
|
PRESHIFT(0x007aa000) /* 0.029937744 */, |
||||||
|
PRESHIFT(0x00024000) /* 0.000549316 */, |
||||||
|
PRESHIFT(0x0009a000) /* 0.002349854 */, |
||||||
|
PRESHIFT(0x0000b000) /* 0.000167847 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00002000) /* -0.000030518 */, /* 10 */ |
||||||
|
-PRESHIFT(0x00044000) /* -0.001037598 */, |
||||||
|
PRESHIFT(0x000d7000) /* 0.003280640 */, |
||||||
|
-PRESHIFT(0x00471000) /* -0.017349243 */, |
||||||
|
PRESHIFT(0x0046b000) /* 0.017257690 */, |
||||||
|
-PRESHIFT(0x0212b000) /* -0.129562378 */, |
||||||
|
-PRESHIFT(0x0084a000) /* -0.032379150 */, |
||||||
|
-PRESHIFT(0x0d78a000) /* -0.841949463 */, |
||||||
|
PRESHIFT(0x113be000) /* 1.077117920 */, |
||||||
|
PRESHIFT(0x04c16000) /* 0.297210693 */, |
||||||
|
PRESHIFT(0x02687000) /* 0.150497437 */, |
||||||
|
PRESHIFT(0x0069c000) /* 0.025817871 */, |
||||||
|
PRESHIFT(0x0077f000) /* 0.029281616 */, |
||||||
|
PRESHIFT(0x00002000) /* 0.000030518 */, |
||||||
|
PRESHIFT(0x00093000) /* 0.002243042 */, |
||||||
|
PRESHIFT(0x0000a000) /* 0.000152588 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00002000) /* -0.000030518 */, |
||||||
|
-PRESHIFT(0x00044000) /* -0.001037598 */, |
||||||
|
PRESHIFT(0x000d7000) /* 0.003280640 */, |
||||||
|
-PRESHIFT(0x00471000) /* -0.017349243 */, |
||||||
|
PRESHIFT(0x0046b000) /* 0.017257690 */, |
||||||
|
-PRESHIFT(0x0212b000) /* -0.129562378 */, |
||||||
|
-PRESHIFT(0x0084a000) /* -0.032379150 */, |
||||||
|
-PRESHIFT(0x0d78a000) /* -0.841949463 */, |
||||||
|
PRESHIFT(0x113be000) /* 1.077117920 */, |
||||||
|
PRESHIFT(0x04c16000) /* 0.297210693 */, |
||||||
|
PRESHIFT(0x02687000) /* 0.150497437 */, |
||||||
|
PRESHIFT(0x0069c000) /* 0.025817871 */, |
||||||
|
PRESHIFT(0x0077f000) /* 0.029281616 */, |
||||||
|
PRESHIFT(0x00002000) /* 0.000030518 */, |
||||||
|
PRESHIFT(0x00093000) /* 0.002243042 */, |
||||||
|
PRESHIFT(0x0000a000) /* 0.000152588 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00003000) /* -0.000045776 */, /* 11 */ |
||||||
|
-PRESHIFT(0x00049000) /* -0.001113892 */, |
||||||
|
PRESHIFT(0x000d0000) /* 0.003173828 */, |
||||||
|
-PRESHIFT(0x004ba000) /* -0.018463135 */, |
||||||
|
PRESHIFT(0x003ca000) /* 0.014801025 */, |
||||||
|
-PRESHIFT(0x02233000) /* -0.133590698 */, |
||||||
|
-PRESHIFT(0x00ce4000) /* -0.050354004 */, |
||||||
|
-PRESHIFT(0x0ddca000) /* -0.866363525 */, |
||||||
|
PRESHIFT(0x1102f000) /* 1.063217163 */, |
||||||
|
PRESHIFT(0x04587000) /* 0.271591187 */, |
||||||
|
PRESHIFT(0x026cf000) /* 0.151596069 */, |
||||||
|
PRESHIFT(0x0056c000) /* 0.021179199 */, |
||||||
|
PRESHIFT(0x0074e000) /* 0.028533936 */, |
||||||
|
-PRESHIFT(0x0001d000) /* -0.000442505 */, |
||||||
|
PRESHIFT(0x0008b000) /* 0.002120972 */, |
||||||
|
PRESHIFT(0x00009000) /* 0.000137329 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00003000) /* -0.000045776 */, |
||||||
|
-PRESHIFT(0x00049000) /* -0.001113892 */, |
||||||
|
PRESHIFT(0x000d0000) /* 0.003173828 */, |
||||||
|
-PRESHIFT(0x004ba000) /* -0.018463135 */, |
||||||
|
PRESHIFT(0x003ca000) /* 0.014801025 */, |
||||||
|
-PRESHIFT(0x02233000) /* -0.133590698 */, |
||||||
|
-PRESHIFT(0x00ce4000) /* -0.050354004 */, |
||||||
|
-PRESHIFT(0x0ddca000) /* -0.866363525 */, |
||||||
|
PRESHIFT(0x1102f000) /* 1.063217163 */, |
||||||
|
PRESHIFT(0x04587000) /* 0.271591187 */, |
||||||
|
PRESHIFT(0x026cf000) /* 0.151596069 */, |
||||||
|
PRESHIFT(0x0056c000) /* 0.021179199 */, |
||||||
|
PRESHIFT(0x0074e000) /* 0.028533936 */, |
||||||
|
-PRESHIFT(0x0001d000) /* -0.000442505 */, |
||||||
|
PRESHIFT(0x0008b000) /* 0.002120972 */, |
||||||
|
PRESHIFT(0x00009000) /* 0.000137329 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00003000) /* -0.000045776 */, /* 12 */ |
||||||
|
-PRESHIFT(0x0004f000) /* -0.001205444 */, |
||||||
|
PRESHIFT(0x000c8000) /* 0.003051758 */, |
||||||
|
-PRESHIFT(0x00503000) /* -0.019577026 */, |
||||||
|
PRESHIFT(0x0031a000) /* 0.012115479 */, |
||||||
|
-PRESHIFT(0x02326000) /* -0.137298584 */, |
||||||
|
-PRESHIFT(0x011b5000) /* -0.069168091 */, |
||||||
|
-PRESHIFT(0x0e3dd000) /* -0.890090942 */, |
||||||
|
PRESHIFT(0x10c54000) /* 1.048156738 */, |
||||||
|
PRESHIFT(0x03f1b000) /* 0.246505737 */, |
||||||
|
PRESHIFT(0x026ee000) /* 0.152069092 */, |
||||||
|
PRESHIFT(0x00447000) /* 0.016708374 */, |
||||||
|
PRESHIFT(0x00719000) /* 0.027725220 */, |
||||||
|
-PRESHIFT(0x00039000) /* -0.000869751 */, |
||||||
|
PRESHIFT(0x00084000) /* 0.002014160 */, |
||||||
|
PRESHIFT(0x00008000) /* 0.000122070 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00003000) /* -0.000045776 */, |
||||||
|
-PRESHIFT(0x0004f000) /* -0.001205444 */, |
||||||
|
PRESHIFT(0x000c8000) /* 0.003051758 */, |
||||||
|
-PRESHIFT(0x00503000) /* -0.019577026 */, |
||||||
|
PRESHIFT(0x0031a000) /* 0.012115479 */, |
||||||
|
-PRESHIFT(0x02326000) /* -0.137298584 */, |
||||||
|
-PRESHIFT(0x011b5000) /* -0.069168091 */, |
||||||
|
-PRESHIFT(0x0e3dd000) /* -0.890090942 */, |
||||||
|
PRESHIFT(0x10c54000) /* 1.048156738 */, |
||||||
|
PRESHIFT(0x03f1b000) /* 0.246505737 */, |
||||||
|
PRESHIFT(0x026ee000) /* 0.152069092 */, |
||||||
|
PRESHIFT(0x00447000) /* 0.016708374 */, |
||||||
|
PRESHIFT(0x00719000) /* 0.027725220 */, |
||||||
|
-PRESHIFT(0x00039000) /* -0.000869751 */, |
||||||
|
PRESHIFT(0x00084000) /* 0.002014160 */, |
||||||
|
PRESHIFT(0x00008000) /* 0.000122070 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00004000) /* -0.000061035 */, /* 13 */ |
||||||
|
-PRESHIFT(0x00055000) /* -0.001296997 */, |
||||||
|
PRESHIFT(0x000bd000) /* 0.002883911 */, |
||||||
|
-PRESHIFT(0x0054c000) /* -0.020690918 */, |
||||||
|
PRESHIFT(0x0025d000) /* 0.009231567 */, |
||||||
|
-PRESHIFT(0x02403000) /* -0.140670776 */, |
||||||
|
-PRESHIFT(0x016ba000) /* -0.088775635 */, |
||||||
|
-PRESHIFT(0x0e9be000) /* -0.913055420 */, |
||||||
|
PRESHIFT(0x1082d000) /* 1.031936646 */, |
||||||
|
PRESHIFT(0x038d4000) /* 0.221984863 */, |
||||||
|
PRESHIFT(0x026e7000) /* 0.151962280 */, |
||||||
|
PRESHIFT(0x0032e000) /* 0.012420654 */, |
||||||
|
PRESHIFT(0x006df000) /* 0.026840210 */, |
||||||
|
-PRESHIFT(0x00053000) /* -0.001266479 */, |
||||||
|
PRESHIFT(0x0007d000) /* 0.001907349 */, |
||||||
|
PRESHIFT(0x00007000) /* 0.000106812 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00004000) /* -0.000061035 */, |
||||||
|
-PRESHIFT(0x00055000) /* -0.001296997 */, |
||||||
|
PRESHIFT(0x000bd000) /* 0.002883911 */, |
||||||
|
-PRESHIFT(0x0054c000) /* -0.020690918 */, |
||||||
|
PRESHIFT(0x0025d000) /* 0.009231567 */, |
||||||
|
-PRESHIFT(0x02403000) /* -0.140670776 */, |
||||||
|
-PRESHIFT(0x016ba000) /* -0.088775635 */, |
||||||
|
-PRESHIFT(0x0e9be000) /* -0.913055420 */, |
||||||
|
PRESHIFT(0x1082d000) /* 1.031936646 */, |
||||||
|
PRESHIFT(0x038d4000) /* 0.221984863 */, |
||||||
|
PRESHIFT(0x026e7000) /* 0.151962280 */, |
||||||
|
PRESHIFT(0x0032e000) /* 0.012420654 */, |
||||||
|
PRESHIFT(0x006df000) /* 0.026840210 */, |
||||||
|
-PRESHIFT(0x00053000) /* -0.001266479 */, |
||||||
|
PRESHIFT(0x0007d000) /* 0.001907349 */, |
||||||
|
PRESHIFT(0x00007000) /* 0.000106812 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00004000) /* -0.000061035 */, /* 14 */ |
||||||
|
-PRESHIFT(0x0005b000) /* -0.001388550 */, |
||||||
|
PRESHIFT(0x000b1000) /* 0.002700806 */, |
||||||
|
-PRESHIFT(0x00594000) /* -0.021789551 */, |
||||||
|
PRESHIFT(0x00192000) /* 0.006134033 */, |
||||||
|
-PRESHIFT(0x024c8000) /* -0.143676758 */, |
||||||
|
-PRESHIFT(0x01bf2000) /* -0.109161377 */, |
||||||
|
-PRESHIFT(0x0ef69000) /* -0.935195923 */, |
||||||
|
PRESHIFT(0x103be000) /* 1.014617920 */, |
||||||
|
PRESHIFT(0x032b4000) /* 0.198059082 */, |
||||||
|
PRESHIFT(0x026bc000) /* 0.151306152 */, |
||||||
|
PRESHIFT(0x00221000) /* 0.008316040 */, |
||||||
|
PRESHIFT(0x006a2000) /* 0.025909424 */, |
||||||
|
-PRESHIFT(0x0006a000) /* -0.001617432 */, |
||||||
|
PRESHIFT(0x00075000) /* 0.001785278 */, |
||||||
|
PRESHIFT(0x00007000) /* 0.000106812 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00004000) /* -0.000061035 */, |
||||||
|
-PRESHIFT(0x0005b000) /* -0.001388550 */, |
||||||
|
PRESHIFT(0x000b1000) /* 0.002700806 */, |
||||||
|
-PRESHIFT(0x00594000) /* -0.021789551 */, |
||||||
|
PRESHIFT(0x00192000) /* 0.006134033 */, |
||||||
|
-PRESHIFT(0x024c8000) /* -0.143676758 */, |
||||||
|
-PRESHIFT(0x01bf2000) /* -0.109161377 */, |
||||||
|
-PRESHIFT(0x0ef69000) /* -0.935195923 */, |
||||||
|
PRESHIFT(0x103be000) /* 1.014617920 */, |
||||||
|
PRESHIFT(0x032b4000) /* 0.198059082 */, |
||||||
|
PRESHIFT(0x026bc000) /* 0.151306152 */, |
||||||
|
PRESHIFT(0x00221000) /* 0.008316040 */, |
||||||
|
PRESHIFT(0x006a2000) /* 0.025909424 */, |
||||||
|
-PRESHIFT(0x0006a000) /* -0.001617432 */, |
||||||
|
PRESHIFT(0x00075000) /* 0.001785278 */, |
||||||
|
PRESHIFT(0x00007000) /* 0.000106812 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00005000) /* -0.000076294 */, /* 15 */ |
||||||
|
-PRESHIFT(0x00061000) /* -0.001480103 */, |
||||||
|
PRESHIFT(0x000a3000) /* 0.002487183 */, |
||||||
|
-PRESHIFT(0x005da000) /* -0.022857666 */, |
||||||
|
PRESHIFT(0x000b9000) /* 0.002822876 */, |
||||||
|
-PRESHIFT(0x02571000) /* -0.146255493 */, |
||||||
|
-PRESHIFT(0x0215c000) /* -0.130310059 */, |
||||||
|
-PRESHIFT(0x0f4dc000) /* -0.956481934 */, |
||||||
|
PRESHIFT(0x0ff0a000) /* 0.996246338 */, |
||||||
|
PRESHIFT(0x02cbf000) /* 0.174789429 */, |
||||||
|
PRESHIFT(0x0266e000) /* 0.150115967 */, |
||||||
|
PRESHIFT(0x00120000) /* 0.004394531 */, |
||||||
|
PRESHIFT(0x00662000) /* 0.024932861 */, |
||||||
|
-PRESHIFT(0x0007f000) /* -0.001937866 */, |
||||||
|
PRESHIFT(0x0006f000) /* 0.001693726 */, |
||||||
|
PRESHIFT(0x00006000) /* 0.000091553 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00005000) /* -0.000076294 */, |
||||||
|
-PRESHIFT(0x00061000) /* -0.001480103 */, |
||||||
|
PRESHIFT(0x000a3000) /* 0.002487183 */, |
||||||
|
-PRESHIFT(0x005da000) /* -0.022857666 */, |
||||||
|
PRESHIFT(0x000b9000) /* 0.002822876 */, |
||||||
|
-PRESHIFT(0x02571000) /* -0.146255493 */, |
||||||
|
-PRESHIFT(0x0215c000) /* -0.130310059 */, |
||||||
|
-PRESHIFT(0x0f4dc000) /* -0.956481934 */, |
||||||
|
PRESHIFT(0x0ff0a000) /* 0.996246338 */, |
||||||
|
PRESHIFT(0x02cbf000) /* 0.174789429 */, |
||||||
|
PRESHIFT(0x0266e000) /* 0.150115967 */, |
||||||
|
PRESHIFT(0x00120000) /* 0.004394531 */, |
||||||
|
PRESHIFT(0x00662000) /* 0.024932861 */, |
||||||
|
-PRESHIFT(0x0007f000) /* -0.001937866 */, |
||||||
|
PRESHIFT(0x0006f000) /* 0.001693726 */, |
||||||
|
PRESHIFT(0x00006000) /* 0.000091553 */ }, |
||||||
|
|
||||||
|
{ -PRESHIFT(0x00005000) /* -0.000076294 */, /* 16 */ |
||||||
|
-PRESHIFT(0x00068000) /* -0.001586914 */, |
||||||
|
PRESHIFT(0x00092000) /* 0.002227783 */, |
||||||
|
-PRESHIFT(0x0061f000) /* -0.023910522 */, |
||||||
|
-PRESHIFT(0x0002d000) /* -0.000686646 */, |
||||||
|
-PRESHIFT(0x025ff000) /* -0.148422241 */, |
||||||
|
-PRESHIFT(0x026f7000) /* -0.152206421 */, |
||||||
|
-PRESHIFT(0x0fa13000) /* -0.976852417 */, |
||||||
|
PRESHIFT(0x0fa13000) /* 0.976852417 */, |
||||||
|
PRESHIFT(0x026f7000) /* 0.152206421 */, |
||||||
|
PRESHIFT(0x025ff000) /* 0.148422241 */, |
||||||
|
PRESHIFT(0x0002d000) /* 0.000686646 */, |
||||||
|
PRESHIFT(0x0061f000) /* 0.023910522 */, |
||||||
|
-PRESHIFT(0x00092000) /* -0.002227783 */, |
||||||
|
PRESHIFT(0x00068000) /* 0.001586914 */, |
||||||
|
PRESHIFT(0x00005000) /* 0.000076294 */, |
||||||
|
|
||||||
|
-PRESHIFT(0x00005000) /* -0.000076294 */, |
||||||
|
-PRESHIFT(0x00068000) /* -0.001586914 */, |
||||||
|
PRESHIFT(0x00092000) /* 0.002227783 */, |
||||||
|
-PRESHIFT(0x0061f000) /* -0.023910522 */, |
||||||
|
-PRESHIFT(0x0002d000) /* -0.000686646 */, |
||||||
|
-PRESHIFT(0x025ff000) /* -0.148422241 */, |
||||||
|
-PRESHIFT(0x026f7000) /* -0.152206421 */, |
||||||
|
-PRESHIFT(0x0fa13000) /* -0.976852417 */, |
||||||
|
PRESHIFT(0x0fa13000) /* 0.976852417 */, |
||||||
|
PRESHIFT(0x026f7000) /* 0.152206421 */, |
||||||
|
PRESHIFT(0x025ff000) /* 0.148422241 */, |
||||||
|
PRESHIFT(0x0002d000) /* 0.000686646 */, |
||||||
|
PRESHIFT(0x0061f000) /* 0.023910522 */, |
||||||
|
-PRESHIFT(0x00092000) /* -0.002227783 */, |
||||||
|
PRESHIFT(0x00068000) /* 0.001586914 */, |
||||||
|
PRESHIFT(0x00005000) /* 0.000076294 */ } |
@ -0,0 +1,183 @@ |
|||||||
|
Basic Installation |
||||||
|
================== |
||||||
|
|
||||||
|
These are generic installation instructions. |
||||||
|
|
||||||
|
The `configure' shell script attempts to guess correct values for |
||||||
|
various system-dependent variables used during compilation. It uses |
||||||
|
those values to create a `Makefile' in each directory of the package. |
||||||
|
It may also create one or more `.h' files containing system-dependent |
||||||
|
definitions. Finally, it creates a shell script `config.status' that |
||||||
|
you can run in the future to recreate the current configuration, a file |
||||||
|
`config.cache' that saves the results of its tests to speed up |
||||||
|
reconfiguring, and a file `config.log' containing compiler output |
||||||
|
(useful mainly for debugging `configure'). |
||||||
|
|
||||||
|
If you need to do unusual things to compile the package, please try |
||||||
|
to figure out how `configure' could check whether to do them, and mail |
||||||
|
diffs or instructions to the address given in the `README' so they can |
||||||
|
be considered for the next release. If at some point `config.cache' |
||||||
|
contains results you don't want to keep, you may remove or edit it. |
||||||
|
|
||||||
|
The file `configure.in' is used to create `configure' by a program |
||||||
|
called `autoconf'. You only need `configure.in' if you want to change |
||||||
|
it or regenerate `configure' using a newer version of `autoconf'. |
||||||
|
|
||||||
|
The simplest way to compile this package is: |
||||||
|
|
||||||
|
1. `cd' to the directory containing the package's source code and type |
||||||
|
`./configure' to configure the package for your system. If you're |
||||||
|
using `csh' on an old version of System V, you might need to type |
||||||
|
`sh ./configure' instead to prevent `csh' from trying to execute |
||||||
|
`configure' itself. |
||||||
|
|
||||||
|
Running `configure' takes awhile. While running, it prints some |
||||||
|
messages telling which features it is checking for. |
||||||
|
|
||||||
|
2. Type `make' to compile the package. |
||||||
|
|
||||||
|
3. Optionally, type `make check' to run any self-tests that come with |
||||||
|
the package. |
||||||
|
|
||||||
|
4. Type `make install' to install the programs and any data files and |
||||||
|
documentation. |
||||||
|
|
||||||
|
5. You can remove the program binaries and object files from the |
||||||
|
source code directory by typing `make clean'. To also remove the |
||||||
|
files that `configure' created (so you can compile the package for |
||||||
|
a different kind of computer), type `make distclean'. There is |
||||||
|
also a `make maintainer-clean' target, but that is intended mainly |
||||||
|
for the package's developers. If you use it, you may have to get |
||||||
|
all sorts of other programs in order to regenerate files that came |
||||||
|
with the distribution. |
||||||
|
|
||||||
|
Compilers and Options |
||||||
|
===================== |
||||||
|
|
||||||
|
Some systems require unusual options for compilation or linking that |
||||||
|
the `configure' script does not know about. You can give `configure' |
||||||
|
initial values for variables by setting them in the environment. Using |
||||||
|
a Bourne-compatible shell, you can do that on the command line like |
||||||
|
this: |
||||||
|
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure |
||||||
|
|
||||||
|
Or on systems that have the `env' program, you can do it like this: |
||||||
|
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure |
||||||
|
|
||||||
|
Compiling For Multiple Architectures |
||||||
|
==================================== |
||||||
|
|
||||||
|
You can compile the package for more than one kind of computer at the |
||||||
|
same time, by placing the object files for each architecture in their |
||||||
|
own directory. To do this, you must use a version of `make' that |
||||||
|
supports the `VPATH' variable, such as GNU `make'. `cd' to the |
||||||
|
directory where you want the object files and executables to go and run |
||||||
|
the `configure' script. `configure' automatically checks for the |
||||||
|
source code in the directory that `configure' is in and in `..'. |
||||||
|
|
||||||
|
If you have to use a `make' that does not supports the `VPATH' |
||||||
|
variable, you have to compile the package for one architecture at a time |
||||||
|
in the source code directory. After you have installed the package for |
||||||
|
one architecture, use `make distclean' before reconfiguring for another |
||||||
|
architecture. |
||||||
|
|
||||||
|
Installation Names |
||||||
|
================== |
||||||
|
|
||||||
|
By default, `make install' will install the package's files in |
||||||
|
`/usr/local/bin', `/usr/local/man', etc. You can specify an |
||||||
|
installation prefix other than `/usr/local' by giving `configure' the |
||||||
|
option `--prefix=PATH'. |
||||||
|
|
||||||
|
You can specify separate installation prefixes for |
||||||
|
architecture-specific files and architecture-independent files. If you |
||||||
|
give `configure' the option `--exec-prefix=PATH', the package will use |
||||||
|
PATH as the prefix for installing programs and libraries. |
||||||
|
Documentation and other data files will still use the regular prefix. |
||||||
|
|
||||||
|
In addition, if you use an unusual directory layout you can give |
||||||
|
options like `--bindir=PATH' to specify different values for particular |
||||||
|
kinds of files. Run `configure --help' for a list of the directories |
||||||
|
you can set and what kinds of files go in them. |
||||||
|
|
||||||
|
If the package supports it, you can cause programs to be installed |
||||||
|
with an extra prefix or suffix on their names by giving `configure' the |
||||||
|
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. |
||||||
|
|
||||||
|
Optional Features |
||||||
|
================= |
||||||
|
|
||||||
|
Some packages pay attention to `--enable-FEATURE' options to |
||||||
|
`configure', where FEATURE indicates an optional part of the package. |
||||||
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE |
||||||
|
is something like `gnu-as' or `x' (for the X Window System). The |
||||||
|
`README' should mention any `--enable-' and `--with-' options that the |
||||||
|
package recognizes. |
||||||
|
|
||||||
|
For packages that use the X Window System, `configure' can usually |
||||||
|
find the X include and library files automatically, but if it doesn't, |
||||||
|
you can use the `configure' options `--x-includes=DIR' and |
||||||
|
`--x-libraries=DIR' to specify their locations. |
||||||
|
|
||||||
|
Specifying the System Type |
||||||
|
========================== |
||||||
|
|
||||||
|
There may be some features `configure' can not figure out |
||||||
|
automatically, but needs to determine by the type of host the package |
||||||
|
will run on. Usually `configure' can figure that out, but if it prints |
||||||
|
a message saying it can not guess the host type, give it the |
||||||
|
`--host=TYPE' option. TYPE can either be a short name for the system |
||||||
|
type, such as `sun4', or a canonical name with three fields: |
||||||
|
CPU-COMPANY-SYSTEM |
||||||
|
|
||||||
|
See the file `config.sub' for the possible values of each field. If |
||||||
|
`config.sub' isn't included in this package, then this package doesn't |
||||||
|
need to know the host type. |
||||||
|
|
||||||
|
If you are building compiler tools for cross-compiling, you can also |
||||||
|
use the `--target=TYPE' option to select the type of system they will |
||||||
|
produce code for and the `--build=TYPE' option to select the type of |
||||||
|
system on which you are compiling the package. |
||||||
|
|
||||||
|
Sharing Defaults |
||||||
|
================ |
||||||
|
|
||||||
|
If you want to set default values for `configure' scripts to share, |
||||||
|
you can create a site shell script called `config.site' that gives |
||||||
|
default values for variables like `CC', `cache_file', and `prefix'. |
||||||
|
`configure' looks for `PREFIX/share/config.site' if it exists, then |
||||||
|
`PREFIX/etc/config.site' if it exists. Or, you can set the |
||||||
|
`CONFIG_SITE' environment variable to the location of the site script. |
||||||
|
A warning: not all `configure' scripts look for a site script. |
||||||
|
|
||||||
|
Operation Controls |
||||||
|
================== |
||||||
|
|
||||||
|
`configure' recognizes the following options to control how it |
||||||
|
operates. |
||||||
|
|
||||||
|
`--cache-file=FILE' |
||||||
|
Use and save the results of the tests in FILE instead of |
||||||
|
`./config.cache'. Set FILE to `/dev/null' to disable caching, for |
||||||
|
debugging `configure'. |
||||||
|
|
||||||
|
`--help' |
||||||
|
Print a summary of the options to `configure', and exit. |
||||||
|
|
||||||
|
`--quiet' |
||||||
|
`--silent' |
||||||
|
`-q' |
||||||
|
Do not print messages saying which checks are being made. To |
||||||
|
suppress all normal output, redirect it to `/dev/null' (any error |
||||||
|
messages will still be shown). |
||||||
|
|
||||||
|
`--srcdir=DIR' |
||||||
|
Look for the package's source code in directory DIR. Usually |
||||||
|
`configure' can determine that directory automatically. |
||||||
|
|
||||||
|
`--version' |
||||||
|
Print the version of Autoconf used to generate the `configure' |
||||||
|
script, and exit. |
||||||
|
|
||||||
|
`configure' also accepts some other, not widely useful, options. |
||||||
|
|
@ -0,0 +1,140 @@ |
|||||||
|
##
|
||||||
|
## libmad - MPEG audio decoder library
|
||||||
|
## Copyright (C) 2000-2004 Underbit Technologies, Inc.
|
||||||
|
##
|
||||||
|
## 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
|
||||||
|
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
##
|
||||||
|
## $Id: Makefile.am,v 1.23 2004/02/17 02:02:03 rob Exp $
|
||||||
|
##
|
||||||
|
|
||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
SUBDIRS =
|
||||||
|
DIST_SUBDIRS = msvc++
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libmad.la
|
||||||
|
include_HEADERS = mad.h
|
||||||
|
|
||||||
|
EXTRA_PROGRAMS = minimad
|
||||||
|
|
||||||
|
minimad_SOURCES = minimad.c
|
||||||
|
minimad_INCLUDES =
|
||||||
|
minimad_LDADD = libmad.la
|
||||||
|
|
||||||
|
EXTRA_DIST = mad.h.sed \
|
||||||
|
CHANGES COPYRIGHT CREDITS README TODO VERSION
|
||||||
|
|
||||||
|
exported_headers = version.h fixed.h bit.h timer.h stream.h frame.h \
|
||||||
|
synth.h decoder.h
|
||||||
|
|
||||||
|
headers = $(exported_headers) \
|
||||||
|
global.h layer12.h layer3.h huffman.h
|
||||||
|
|
||||||
|
data_includes = D.dat imdct_s.dat qc_table.dat rq_table.dat \
|
||||||
|
sf_table.dat
|
||||||
|
|
||||||
|
libmad_la_SOURCES = version.c fixed.c bit.c timer.c stream.c frame.c \
|
||||||
|
synth.c decoder.c layer12.c layer3.c huffman.c \
|
||||||
|
$(headers) $(data_includes)
|
||||||
|
|
||||||
|
EXTRA_libmad_la_SOURCES = imdct_l_arm.S #synth_mmx.S
|
||||||
|
|
||||||
|
libmad_la_DEPENDENCIES = @ASO_OBJS@
|
||||||
|
libmad_la_LIBADD = @ASO_OBJS@
|
||||||
|
|
||||||
|
INCLUDES = $(FPM) $(ASO)
|
||||||
|
|
||||||
|
BUILT_SOURCES = mad.h
|
||||||
|
CLEANFILES = mad.h
|
||||||
|
|
||||||
|
## From the libtool documentation on library versioning:
|
||||||
|
##
|
||||||
|
## CURRENT
|
||||||
|
## The most recent interface number that this library implements.
|
||||||
|
##
|
||||||
|
## REVISION
|
||||||
|
## The implementation number of the CURRENT interface.
|
||||||
|
##
|
||||||
|
## AGE
|
||||||
|
## The difference between the newest and oldest interfaces that this
|
||||||
|
## library implements. In other words, the library implements all the
|
||||||
|
## interface numbers in the range from number `CURRENT - AGE' to
|
||||||
|
## `CURRENT'.
|
||||||
|
##
|
||||||
|
## If two libraries have identical CURRENT and AGE numbers, then the
|
||||||
|
## dynamic linker chooses the library with the greater REVISION number.
|
||||||
|
##
|
||||||
|
## 1. Start with version information of `0:0:0' for each libtool library.
|
||||||
|
##
|
||||||
|
## 2. Update the version information only immediately before a public
|
||||||
|
## release of your software. More frequent updates are unnecessary,
|
||||||
|
## and only guarantee that the current interface number gets larger
|
||||||
|
## faster.
|
||||||
|
##
|
||||||
|
## 3. If the library source code has changed at all since the last
|
||||||
|
## update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
|
||||||
|
##
|
||||||
|
## 4. If any interfaces have been added, removed, or changed since the
|
||||||
|
## last update, increment CURRENT, and set REVISION to 0.
|
||||||
|
##
|
||||||
|
## 5. If any interfaces have been added since the last public release,
|
||||||
|
## then increment AGE.
|
||||||
|
##
|
||||||
|
## 6. If any interfaces have been removed since the last public release,
|
||||||
|
## then set AGE to 0.
|
||||||
|
|
||||||
|
version_current = 2
|
||||||
|
version_revision = 1
|
||||||
|
version_age = 2
|
||||||
|
|
||||||
|
version_info = $(version_current):$(version_revision):$(version_age)
|
||||||
|
|
||||||
|
libmad_la_LDFLAGS = -version-info $(version_info)
|
||||||
|
|
||||||
|
mad.h: config.status config.h Makefile.am \
|
||||||
|
$(srcdir)/COPYRIGHT $(srcdir)/mad.h.sed $(exported_headers)
|
||||||
|
(sed -e '1s|.*|/*|' -e '1b' -e '$$s|.*| */|' -e '$$b' \
|
||||||
|
-e 's/^.*/ *&/' $(srcdir)/COPYRIGHT; echo; \
|
||||||
|
echo "# ifdef __cplusplus"; \
|
||||||
|
echo 'extern "C" {'; \
|
||||||
|
echo "# endif"; echo; \
|
||||||
|
if [ ".$(FPM)" != "." ]; then \
|
||||||
|
echo ".$(FPM)" | sed -e 's|^\.-D|# define |'; echo; \
|
||||||
|
fi; \
|
||||||
|
sed -ne 's/^# *define *\(HAVE_.*_ASM\).*/# define \1/p' \
|
||||||
|
config.h; echo; \
|
||||||
|
sed -ne 's/^# *define *OPT_\(SPEED\|ACCURACY\).*/# define OPT_\1/p' \
|
||||||
|
config.h; echo; \
|
||||||
|
sed -ne 's/^# *define *\(SIZEOF_.*\)/# define \1/p' \
|
||||||
|
config.h; echo; \
|
||||||
|
for header in $(exported_headers); do \
|
||||||
|
echo; \
|
||||||
|
sed -n -f $(srcdir)/mad.h.sed $(srcdir)/$$header; \
|
||||||
|
done; echo; \
|
||||||
|
echo "# ifdef __cplusplus"; \
|
||||||
|
echo '}'; \
|
||||||
|
echo "# endif") >$@
|
||||||
|
|
||||||
|
libtool: $(LIBTOOL_DEPS) |
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
.c.s: |
||||||
|
$(COMPILE) -S $<
|
||||||
|
|
||||||
|
again: |
||||||
|
$(MAKE) clean
|
||||||
|
$(MAKE)
|
||||||
|
|
||||||
|
.PHONY: again |
@ -0,0 +1,821 @@ |
|||||||
|
# Makefile.in generated by automake 1.8.2 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004 Free Software Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@ |
||||||
|
|
||||||
|
|
||||||
|
SOURCES = $(libmad_la_SOURCES) $(EXTRA_libmad_la_SOURCES) $(minimad_SOURCES)
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
top_builddir = .
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
host_triplet = @host@
|
||||||
|
EXTRA_PROGRAMS = minimad$(EXEEXT)
|
||||||
|
DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \
|
||||||
|
$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||||
|
$(srcdir)/config.h.in $(srcdir)/libmad.list.in \
|
||||||
|
$(top_srcdir)/configure COPYING INSTALL TODO config.guess \
|
||||||
|
config.sub depcomp install-sh ltmain.sh missing mkinstalldirs
|
||||||
|
subdir = .
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
|
configure.lineno configure.status.lineno
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = config.h
|
||||||
|
CONFIG_CLEAN_FILES = libmad.list
|
||||||
|
am__installdirs = $(DESTDIR)$(libdir) $(DESTDIR)$(includedir)
|
||||||
|
libLTLIBRARIES_INSTALL = $(INSTALL)
|
||||||
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
|
am__objects_1 =
|
||||||
|
am__objects_2 = $(am__objects_1)
|
||||||
|
am_libmad_la_OBJECTS = version.lo fixed.lo bit.lo timer.lo stream.lo \
|
||||||
|
frame.lo synth.lo decoder.lo layer12.lo layer3.lo huffman.lo \
|
||||||
|
$(am__objects_2) $(am__objects_1)
|
||||||
|
libmad_la_OBJECTS = $(am_libmad_la_OBJECTS)
|
||||||
|
am_minimad_OBJECTS = minimad.$(OBJEXT)
|
||||||
|
minimad_OBJECTS = $(am_minimad_OBJECTS)
|
||||||
|
minimad_DEPENDENCIES = libmad.la
|
||||||
|
DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
|
||||||
|
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||||
|
am__depfiles_maybe = depfiles
|
||||||
|
@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/bit.Plo ./$(DEPDIR)/decoder.Plo \
|
||||||
|
@AMDEP_TRUE@ ./$(DEPDIR)/fixed.Plo ./$(DEPDIR)/frame.Plo \ |
||||||
|
@AMDEP_TRUE@ ./$(DEPDIR)/huffman.Plo ./$(DEPDIR)/layer12.Plo \ |
||||||
|
@AMDEP_TRUE@ ./$(DEPDIR)/layer3.Plo ./$(DEPDIR)/minimad.Po \ |
||||||
|
@AMDEP_TRUE@ ./$(DEPDIR)/stream.Plo ./$(DEPDIR)/synth.Plo \ |
||||||
|
@AMDEP_TRUE@ ./$(DEPDIR)/timer.Plo ./$(DEPDIR)/version.Plo |
||||||
|
CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)
|
||||||
|
LTCCASCOMPILE = $(LIBTOOL) --mode=compile $(CCAS) $(AM_CCASFLAGS) \
|
||||||
|
$(CCASFLAGS)
|
||||||
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \
|
||||||
|
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||||
|
$(AM_CFLAGS) $(CFLAGS)
|
||||||
|
CCLD = $(CC)
|
||||||
|
LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
|
$(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
SOURCES = $(libmad_la_SOURCES) $(EXTRA_libmad_la_SOURCES) \
|
||||||
|
$(minimad_SOURCES)
|
||||||
|
DIST_SOURCES = $(libmad_la_SOURCES) $(EXTRA_libmad_la_SOURCES) \
|
||||||
|
$(minimad_SOURCES)
|
||||||
|
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
|
||||||
|
html-recursive info-recursive install-data-recursive \
|
||||||
|
install-exec-recursive install-info-recursive \
|
||||||
|
install-recursive installcheck-recursive installdirs-recursive \
|
||||||
|
pdf-recursive ps-recursive uninstall-info-recursive \
|
||||||
|
uninstall-recursive
|
||||||
|
includeHEADERS_INSTALL = $(INSTALL_HEADER)
|
||||||
|
HEADERS = $(include_HEADERS)
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
|
top_distdir = $(distdir)
|
||||||
|
am__remove_distdir = \
|
||||||
|
{ test ! -d $(distdir) \
|
||||||
|
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||||
|
&& rm -fr $(distdir); }; }
|
||||||
|
DIST_ARCHIVES = $(distdir).tar.gz
|
||||||
|
GZIP_ENV = --best
|
||||||
|
distuninstallcheck_listfiles = find . -type f -print
|
||||||
|
distcleancheck_listfiles = find . -type f -print
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMDEP_FALSE = @AMDEP_FALSE@
|
||||||
|
AMDEP_TRUE = @AMDEP_TRUE@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AR = @AR@
|
||||||
|
ASO = @ASO@
|
||||||
|
ASO_OBJS = @ASO_OBJS@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCAS = @CCAS@
|
||||||
|
CCASFLAGS = @CCASFLAGS@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXCPP = @CXXCPP@
|
||||||
|
CXXDEPMODE = @CXXDEPMODE@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
ECHO = @ECHO@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
F77 = @F77@
|
||||||
|
FFLAGS = @FFLAGS@
|
||||||
|
FPM = @FPM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
ac_ct_AR = @ac_ct_AR@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
ac_ct_CXX = @ac_ct_CXX@
|
||||||
|
ac_ct_F77 = @ac_ct_F77@
|
||||||
|
ac_ct_RANLIB = @ac_ct_RANLIB@
|
||||||
|
ac_ct_STRIP = @ac_ct_STRIP@
|
||||||
|
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
|
||||||
|
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
|
||||||
|
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
|
||||||
|
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
datadir = @datadir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
SUBDIRS =
|
||||||
|
DIST_SUBDIRS = msvc++
|
||||||
|
lib_LTLIBRARIES = libmad.la
|
||||||
|
include_HEADERS = mad.h
|
||||||
|
minimad_SOURCES = minimad.c
|
||||||
|
minimad_INCLUDES =
|
||||||
|
minimad_LDADD = libmad.la
|
||||||
|
EXTRA_DIST = mad.h.sed \
|
||||||
|
CHANGES COPYRIGHT CREDITS README TODO VERSION
|
||||||
|
|
||||||
|
exported_headers = version.h fixed.h bit.h timer.h stream.h frame.h \
|
||||||
|
synth.h decoder.h
|
||||||
|
|
||||||
|
headers = $(exported_headers) \
|
||||||
|
global.h layer12.h layer3.h huffman.h
|
||||||
|
|
||||||
|
data_includes = D.dat imdct_s.dat qc_table.dat rq_table.dat \
|
||||||
|
sf_table.dat
|
||||||
|
|
||||||
|
libmad_la_SOURCES = version.c fixed.c bit.c timer.c stream.c frame.c \
|
||||||
|
synth.c decoder.c layer12.c layer3.c huffman.c \
|
||||||
|
$(headers) $(data_includes)
|
||||||
|
|
||||||
|
EXTRA_libmad_la_SOURCES = imdct_l_arm.S #synth_mmx.S
|
||||||
|
libmad_la_DEPENDENCIES = @ASO_OBJS@
|
||||||
|
libmad_la_LIBADD = @ASO_OBJS@
|
||||||
|
INCLUDES = $(FPM) $(ASO)
|
||||||
|
BUILT_SOURCES = mad.h
|
||||||
|
CLEANFILES = mad.h
|
||||||
|
version_current = 2
|
||||||
|
version_revision = 1
|
||||||
|
version_age = 2
|
||||||
|
version_info = $(version_current):$(version_revision):$(version_age)
|
||||||
|
libmad_la_LDFLAGS = -version-info $(version_info)
|
||||||
|
all: $(BUILT_SOURCES) config.h |
||||||
|
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
||||||
|
|
||||||
|
.SUFFIXES: |
||||||
|
.SUFFIXES: .S .c .lo .o .obj .s |
||||||
|
am--refresh: |
||||||
|
@:
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) |
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
|
||||||
|
cd $(srcdir) && $(AUTOMAKE) --foreign \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
|
||||||
|
cd $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --foreign Makefile
|
||||||
|
.PRECIOUS: Makefile |
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status |
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
echo ' $(SHELL) ./config.status'; \
|
||||||
|
$(SHELL) ./config.status;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) |
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps) |
||||||
|
cd $(srcdir) && $(AUTOCONF)
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps) |
||||||
|
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||||
|
|
||||||
|
config.h: stamp-h1 |
||||||
|
@if test ! -f $@; then \
|
||||||
|
rm -f stamp-h1; \
|
||||||
|
$(MAKE) stamp-h1; \
|
||||||
|
else :; fi
|
||||||
|
|
||||||
|
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status |
||||||
|
@rm -f stamp-h1
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||||
|
$(srcdir)/config.h.in: $(am__configure_deps) |
||||||
|
cd $(top_srcdir) && $(AUTOHEADER)
|
||||||
|
rm -f stamp-h1
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
distclean-hdr: |
||||||
|
-rm -f config.h stamp-h1
|
||||||
|
libmad.list: $(top_builddir)/config.status $(srcdir)/libmad.list.in |
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
|
install-libLTLIBRARIES: $(lib_LTLIBRARIES) |
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
$(mkdir_p) $(DESTDIR)$(libdir)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||||
|
if test -f $$p; then \
|
||||||
|
f="`echo $$p | sed -e 's|^.*/||'`"; \
|
||||||
|
echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f"; \
|
||||||
|
$(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f; \
|
||||||
|
else :; fi; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-libLTLIBRARIES: |
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||||
|
p="`echo $$p | sed -e 's|^.*/||'`"; \
|
||||||
|
echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p"; \
|
||||||
|
$(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean-libLTLIBRARIES: |
||||||
|
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||||
|
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
|
||||||
|
test "$$dir" = "$$p" && dir=.; \
|
||||||
|
echo "rm -f \"$${dir}/so_locations\""; \
|
||||||
|
rm -f "$${dir}/so_locations"; \
|
||||||
|
done
|
||||||
|
libmad.la: $(libmad_la_OBJECTS) $(libmad_la_DEPENDENCIES) |
||||||
|
$(LINK) -rpath $(libdir) $(libmad_la_LDFLAGS) $(libmad_la_OBJECTS) $(libmad_la_LIBADD) $(LIBS)
|
||||||
|
minimad$(EXEEXT): $(minimad_OBJECTS) $(minimad_DEPENDENCIES) |
||||||
|
@rm -f minimad$(EXEEXT)
|
||||||
|
$(LINK) $(minimad_LDFLAGS) $(minimad_OBJECTS) $(minimad_LDADD) $(LIBS)
|
||||||
|
|
||||||
|
mostlyclean-compile: |
||||||
|
-rm -f *.$(OBJEXT)
|
||||||
|
|
||||||
|
distclean-compile: |
||||||
|
-rm -f *.tab.c
|
||||||
|
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bit.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decoder.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fixed.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frame.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huffman.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer12.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer3.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minimad.Po@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synth.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Plo@am__quote@ |
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ |
||||||
|
|
||||||
|
.S.o: |
||||||
|
$(CCASCOMPILE) -c $<
|
||||||
|
|
||||||
|
.S.obj: |
||||||
|
$(CCASCOMPILE) -c `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
|
.S.lo: |
||||||
|
$(LTCCASCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
.c.o: |
||||||
|
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ |
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi |
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ |
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c $< |
||||||
|
|
||||||
|
.c.obj: |
||||||
|
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ |
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi |
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ |
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` |
||||||
|
|
||||||
|
.c.lo: |
||||||
|
@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ |
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi |
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ |
||||||
|
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< |
||||||
|
|
||||||
|
mostlyclean-libtool: |
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool: |
||||||
|
-rm -rf .libs _libs
|
||||||
|
|
||||||
|
distclean-libtool: |
||||||
|
-rm -f libtool
|
||||||
|
uninstall-info-am: |
||||||
|
install-includeHEADERS: $(include_HEADERS) |
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
$(mkdir_p) $(DESTDIR)$(includedir)
|
||||||
|
@list='$(include_HEADERS)'; for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
f="`echo $$p | sed -e 's|^.*/||'`"; \
|
||||||
|
echo " $(includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(includedir)/$$f"; \
|
||||||
|
$(includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(includedir)/$$f; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-includeHEADERS: |
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(include_HEADERS)'; for p in $$list; do \
|
||||||
|
f="`echo $$p | sed -e 's|^.*/||'`"; \
|
||||||
|
echo " rm -f $(DESTDIR)$(includedir)/$$f"; \
|
||||||
|
rm -f $(DESTDIR)$(includedir)/$$f; \
|
||||||
|
done
|
||||||
|
|
||||||
|
# This directory's subdirectories are mostly independent; you can cd
|
||||||
|
# into them and run `make' without going through this Makefile.
|
||||||
|
# To change the values of `make' variables: instead of editing Makefiles,
|
||||||
|
# (1) if the variable is set in `config.status', edit `config.status'
|
||||||
|
# (which will cause the Makefiles to be regenerated when you run `make');
|
||||||
|
# (2) otherwise, pass the desired values on the `make' command line.
|
||||||
|
$(RECURSIVE_TARGETS): |
||||||
|
@set fnord $$MAKEFLAGS; amf=$$2; \
|
||||||
|
dot_seen=no; \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
if test "$$subdir" = "."; then \
|
||||||
|
dot_seen=yes; \
|
||||||
|
local_target="$$target-am"; \
|
||||||
|
else \
|
||||||
|
local_target="$$target"; \
|
||||||
|
fi; \
|
||||||
|
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||||
|
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||||
|
done; \
|
||||||
|
if test "$$dot_seen" = "no"; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||||
|
fi; test -z "$$fail"
|
||||||
|
|
||||||
|
mostlyclean-recursive clean-recursive distclean-recursive \ |
||||||
|
maintainer-clean-recursive: |
||||||
|
@set fnord $$MAKEFLAGS; amf=$$2; \
|
||||||
|
dot_seen=no; \
|
||||||
|
case "$@" in \
|
||||||
|
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||||
|
*) list='$(SUBDIRS)' ;; \
|
||||||
|
esac; \
|
||||||
|
rev=''; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = "."; then :; else \
|
||||||
|
rev="$$subdir $$rev"; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
rev="$$rev ."; \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
for subdir in $$rev; do \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
if test "$$subdir" = "."; then \
|
||||||
|
local_target="$$target-am"; \
|
||||||
|
else \
|
||||||
|
local_target="$$target"; \
|
||||||
|
fi; \
|
||||||
|
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||||
|
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||||
|
done && test -z "$$fail"
|
||||||
|
tags-recursive: |
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
|
||||||
|
done
|
||||||
|
ctags-recursive: |
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
|
||||||
|
done
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) |
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS |
||||||
|
|
||||||
|
TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
if (etags --etags-include --version) >/dev/null 2>&1; then \
|
||||||
|
include_option=--etags-include; \
|
||||||
|
else \
|
||||||
|
include_option=--include; \
|
||||||
|
fi; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = .; then :; else \
|
||||||
|
test -f $$subdir/TAGS && \
|
||||||
|
tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
test -z "$(ETAGS_ARGS)$$tags$$unique" \
|
||||||
|
|| $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
$$tags $$unique
|
||||||
|
ctags: CTAGS |
||||||
|
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|
||||||
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
|
$$tags $$unique
|
||||||
|
|
||||||
|
GTAGS: |
||||||
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
|
&& cd $(top_srcdir) \
|
||||||
|
&& gtags -i $(GTAGS_ARGS) $$here
|
||||||
|
|
||||||
|
distclean-tags: |
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
|
||||||
|
distdir: $(DISTFILES) |
||||||
|
$(am__remove_distdir)
|
||||||
|
mkdir $(distdir)
|
||||||
|
$(mkdir_p) $(distdir)/.
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
|
||||||
|
list='$(DISTFILES)'; for file in $$list; do \
|
||||||
|
case $$file in \
|
||||||
|
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
|
||||||
|
esac; \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
|
||||||
|
dir="/$$dir"; \
|
||||||
|
$(mkdir_p) "$(distdir)$$dir"; \
|
||||||
|
else \
|
||||||
|
dir=''; \
|
||||||
|
fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
fi; \
|
||||||
|
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = .; then :; else \
|
||||||
|
test -d "$(distdir)/$$subdir" \
|
||||||
|
|| mkdir "$(distdir)/$$subdir" \
|
||||||
|
|| exit 1; \
|
||||||
|
(cd $$subdir && \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
top_distdir="../$(top_distdir)" \
|
||||||
|
distdir="../$(distdir)/$$subdir" \
|
||||||
|
distdir) \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
|
||||||
|
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
|
||||||
|
|| chmod -R a+r $(distdir)
|
||||||
|
dist-gzip: distdir |
||||||
|
$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-bzip2: distdir |
||||||
|
$(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-tarZ: distdir |
||||||
|
$(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-shar: distdir |
||||||
|
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-zip: distdir |
||||||
|
-rm -f $(distdir).zip
|
||||||
|
zip -rq $(distdir).zip $(distdir)
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist dist-all: distdir |
||||||
|
$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
# This target untars the dist file and tries a VPATH configuration. Then
|
||||||
|
# it guarantees that the distribution is self-contained by making another
|
||||||
|
# tarfile.
|
||||||
|
distcheck: dist |
||||||
|
case '$(DIST_ARCHIVES)' in \
|
||||||
|
*.tar.gz*) \
|
||||||
|
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ;;\
|
||||||
|
*.tar.bz2*) \
|
||||||
|
bunzip2 -c $(distdir).tar.bz2 | $(AMTAR) xf - ;;\
|
||||||
|
*.tar.Z*) \
|
||||||
|
uncompress -c $(distdir).tar.Z | $(AMTAR) xf - ;;\
|
||||||
|
*.shar.gz*) \
|
||||||
|
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | unshar ;;\
|
||||||
|
*.zip*) \
|
||||||
|
unzip $(distdir).zip ;;\
|
||||||
|
esac
|
||||||
|
chmod -R a-w $(distdir); chmod a+w $(distdir)
|
||||||
|
mkdir $(distdir)/_build
|
||||||
|
mkdir $(distdir)/_inst
|
||||||
|
chmod a-w $(distdir)
|
||||||
|
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||||
|
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||||
|
&& cd $(distdir)/_build \
|
||||||
|
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
||||||
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||||
|
distuninstallcheck \
|
||||||
|
&& chmod -R a-w "$$dc_install_base" \
|
||||||
|
&& ({ \
|
||||||
|
(cd ../.. && $(mkdir_p) "$$dc_destdir") \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||||
|
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||||
|
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||||
|
&& rm -rf "$$dc_destdir" \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||||
|
&& rm -rf $(DIST_ARCHIVES) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
|
||||||
|
$(am__remove_distdir)
|
||||||
|
@(echo "$(distdir) archives ready for distribution: "; \
|
||||||
|
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||||
|
sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
|
||||||
|
distuninstallcheck: |
||||||
|
@cd $(distuninstallcheck_dir) \
|
||||||
|
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|
||||||
|
|| { echo "ERROR: files left after uninstall:" ; \
|
||||||
|
if test -n "$(DESTDIR)"; then \
|
||||||
|
echo " (check DESTDIR support)"; \
|
||||||
|
fi ; \
|
||||||
|
$(distuninstallcheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
distcleancheck: distclean |
||||||
|
@if test '$(srcdir)' = . ; then \
|
||||||
|
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi
|
||||||
|
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||||
|
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||||
|
$(distcleancheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
check-am: all-am |
||||||
|
check: $(BUILT_SOURCES) |
||||||
|
$(MAKE) $(AM_MAKEFLAGS) check-recursive
|
||||||
|
all-am: Makefile $(LTLIBRARIES) $(HEADERS) config.h |
||||||
|
installdirs: installdirs-recursive |
||||||
|
installdirs-am: |
||||||
|
$(mkdir_p) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir)
|
||||||
|
install: $(BUILT_SOURCES) |
||||||
|
$(MAKE) $(AM_MAKEFLAGS) install-recursive
|
||||||
|
install-exec: install-exec-recursive |
||||||
|
install-data: install-data-recursive |
||||||
|
uninstall: uninstall-recursive |
||||||
|
|
||||||
|
install-am: all-am |
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-recursive |
||||||
|
install-strip: |
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
`test -z '$(STRIP)' || \
|
||||||
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
|
mostlyclean-generic: |
||||||
|
|
||||||
|
clean-generic: |
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic: |
||||||
|
-rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic: |
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
clean: clean-recursive |
||||||
|
|
||||||
|
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
||||||
|
mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-recursive |
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
|
distclean-hdr distclean-libtool distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-recursive |
||||||
|
|
||||||
|
dvi-am: |
||||||
|
|
||||||
|
html: html-recursive |
||||||
|
|
||||||
|
info: info-recursive |
||||||
|
|
||||||
|
info-am: |
||||||
|
|
||||||
|
install-data-am: install-includeHEADERS |
||||||
|
|
||||||
|
install-exec-am: install-libLTLIBRARIES |
||||||
|
|
||||||
|
install-info: install-info-recursive |
||||||
|
|
||||||
|
install-man: |
||||||
|
|
||||||
|
installcheck-am: |
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-recursive |
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -rf $(top_srcdir)/autom4te.cache
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic |
||||||
|
|
||||||
|
mostlyclean: mostlyclean-recursive |
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||||
|
mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-recursive |
||||||
|
|
||||||
|
pdf-am: |
||||||
|
|
||||||
|
ps: ps-recursive |
||||||
|
|
||||||
|
ps-am: |
||||||
|
|
||||||
|
uninstall-am: uninstall-includeHEADERS uninstall-info-am \
|
||||||
|
uninstall-libLTLIBRARIES
|
||||||
|
|
||||||
|
uninstall-info: uninstall-info-recursive |
||||||
|
|
||||||
|
.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
|
||||||
|
check-am clean clean-generic clean-libLTLIBRARIES \
|
||||||
|
clean-libtool clean-recursive ctags ctags-recursive dist \
|
||||||
|
dist-all dist-bzip2 dist-gzip dist-shar dist-tarZ dist-zip \
|
||||||
|
distcheck distclean distclean-compile distclean-generic \
|
||||||
|
distclean-hdr distclean-libtool distclean-recursive \
|
||||||
|
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||||
|
dvi-am html html-am info info-am install install-am \
|
||||||
|
install-data install-data-am install-exec install-exec-am \
|
||||||
|
install-includeHEADERS install-info install-info-am \
|
||||||
|
install-libLTLIBRARIES install-man install-strip installcheck \
|
||||||
|
installcheck-am installdirs installdirs-am maintainer-clean \
|
||||||
|
maintainer-clean-generic maintainer-clean-recursive \
|
||||||
|
mostlyclean mostlyclean-compile mostlyclean-generic \
|
||||||
|
mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
|
||||||
|
tags tags-recursive uninstall uninstall-am \
|
||||||
|
uninstall-includeHEADERS uninstall-info-am \
|
||||||
|
uninstall-libLTLIBRARIES
|
||||||
|
|
||||||
|
|
||||||
|
mad.h: config.status config.h Makefile.am \
|
||||||
|
$(srcdir)/COPYRIGHT $(srcdir)/mad.h.sed $(exported_headers)
|
||||||
|
(sed -e '1s|.*|/*|' -e '1b' -e '$$s|.*| */|' -e '$$b' \
|
||||||
|
-e 's/^.*/ *&/' $(srcdir)/COPYRIGHT; echo; \
|
||||||
|
echo "# ifdef __cplusplus"; \
|
||||||
|
echo 'extern "C" {'; \
|
||||||
|
echo "# endif"; echo; \
|
||||||
|
if [ ".$(FPM)" != "." ]; then \
|
||||||
|
echo ".$(FPM)" | sed -e 's|^\.-D|# define |'; echo; \
|
||||||
|
fi; \
|
||||||
|
sed -ne 's/^# *define *\(HAVE_.*_ASM\).*/# define \1/p' \
|
||||||
|
config.h; echo; \
|
||||||
|
sed -ne 's/^# *define *OPT_\(SPEED\|ACCURACY\).*/# define OPT_\1/p' \
|
||||||
|
config.h; echo; \
|
||||||
|
sed -ne 's/^# *define *\(SIZEOF_.*\)/# define \1/p' \
|
||||||
|
config.h; echo; \
|
||||||
|
for header in $(exported_headers); do \
|
||||||
|
echo; \
|
||||||
|
sed -n -f $(srcdir)/mad.h.sed $(srcdir)/$$header; \
|
||||||
|
done; echo; \
|
||||||
|
echo "# ifdef __cplusplus"; \
|
||||||
|
echo '}'; \
|
||||||
|
echo "# endif") >$@
|
||||||
|
|
||||||
|
libtool: $(LIBTOOL_DEPS) |
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
.c.s: |
||||||
|
$(COMPILE) -S $<
|
||||||
|
|
||||||
|
again: |
||||||
|
$(MAKE) clean
|
||||||
|
$(MAKE)
|
||||||
|
|
||||||
|
.PHONY: again |
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT: |
@ -0,0 +1,241 @@ |
|||||||
|
|
||||||
|
libmad - MPEG audio decoder library |
||||||
|
Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
|
||||||
|
$Id: README,v 1.4 2004/01/23 09:41:32 rob Exp $ |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
INTRODUCTION |
||||||
|
|
||||||
|
MAD (libmad) is a high-quality MPEG audio decoder. It currently supports |
||||||
|
MPEG-1 and the MPEG-2 extension to Lower Sampling Frequencies, as well as |
||||||
|
the so-called MPEG 2.5 format. All three audio layers (Layer I, Layer II, |
||||||
|
and Layer III a.k.a. MP3) are fully implemented. |
||||||
|
|
||||||
|
MAD does not yet support MPEG-2 multichannel audio (although it should be |
||||||
|
backward compatible with such streams) nor does it currently support AAC. |
||||||
|
|
||||||
|
MAD has the following special features: |
||||||
|
|
||||||
|
- 24-bit PCM output |
||||||
|
- 100% fixed-point (integer) computation |
||||||
|
- completely new implementation based on the ISO/IEC standards |
||||||
|
- distributed under the terms of the GNU General Public License (GPL) |
||||||
|
|
||||||
|
Because MAD provides full 24-bit PCM output, applications using MAD are |
||||||
|
able to produce high quality audio. Even when the output device supports |
||||||
|
only 16-bit PCM, applications can use the extra resolution to increase the |
||||||
|
audible dynamic range through the use of dithering or noise shaping. |
||||||
|
|
||||||
|
Because MAD uses integer computation rather than floating point, it is |
||||||
|
well suited for architectures without a floating point unit. All |
||||||
|
calculations are performed with a 32-bit fixed-point integer |
||||||
|
representation. |
||||||
|
|
||||||
|
Because MAD is a new implementation of the ISO/IEC standards, it is |
||||||
|
unencumbered by the errors of other implementations. MAD is NOT a |
||||||
|
derivation of the ISO reference source or any other code. Considerable |
||||||
|
effort has been expended to ensure a correct implementation, even in cases |
||||||
|
where the standards are ambiguous or misleading. |
||||||
|
|
||||||
|
Because MAD is distributed under the terms of the GPL, its redistribution |
||||||
|
is not generally restricted, so long as the terms of the GPL are followed. |
||||||
|
This means MAD can be incorporated into other software as long as that |
||||||
|
software is also distributed under the GPL. (Should this be undesirable, |
||||||
|
alternate arrangements may be possible by contacting Underbit.) |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
ABOUT THE CODE |
||||||
|
|
||||||
|
The code is optimized and performs very well, although specific |
||||||
|
improvements can still be made. The output from the decoder library |
||||||
|
consists of 32-bit signed linear fixed-point values that can be easily |
||||||
|
scaled for any size PCM output, up to 24 bits per sample. |
||||||
|
|
||||||
|
The API for libmad can be found in the `mad.h' header file. Note that this |
||||||
|
file is automatically generated, and will not exist until after you have |
||||||
|
built the library. |
||||||
|
|
||||||
|
There are two APIs available, one high-level, and the other low-level. |
||||||
|
With the low-level API, each step of the decoding process must be handled |
||||||
|
explicitly, offering the greatest amount of control. With the high-level |
||||||
|
API, after callbacks are configured, a single routine will decode an |
||||||
|
entire bitstream. |
||||||
|
|
||||||
|
The high-level API may either be used synchronously or asynchronously. If |
||||||
|
used asynchronously, decoding will occur in a separate process. |
||||||
|
Communication is possible with the decoding process by passing control |
||||||
|
messages. |
||||||
|
|
||||||
|
The file `minimad.c' contains an example usage of the libmad API that |
||||||
|
shows only the bare minimum required to implement a useful decoder. It |
||||||
|
expects a regular file to be redirected to standard input, and it sends |
||||||
|
decoded 16-bit signed little-endian PCM samples to standard output. If a |
||||||
|
decoding error occurs, it is reported to standard error and decoding |
||||||
|
continues. Note that the scale() routine in this code is only provided as |
||||||
|
an example; it rounds MAD's high-resolution samples down to 16 bits, but |
||||||
|
does not perform any dithering or noise shaping. It is therefore not |
||||||
|
recommended to use this routine as-is in your own code if sound quality is |
||||||
|
important. |
||||||
|
|
||||||
|
Integer Performance |
||||||
|
|
||||||
|
To get the best possible performance, it is recommended that an assembly |
||||||
|
version of the fixed-point multiply and related routines be selected. |
||||||
|
Several such assembly routines have been written for various CPUs. |
||||||
|
|
||||||
|
If an assembly version is not available, a fast approximation version will |
||||||
|
be used. This will result in reduced accuracy of the decoder. |
||||||
|
|
||||||
|
Alternatively, if 64-bit integers are supported as a datatype by the |
||||||
|
compiler, another version can be used that is much more accurate. |
||||||
|
However, using an assembly version is generally much faster and just as |
||||||
|
accurate. |
||||||
|
|
||||||
|
More information can be gathered from the `fixed.h' header file. |
||||||
|
|
||||||
|
MAD's CPU-intensive subband synthesis routine can be further optimized at |
||||||
|
the expense of a slight loss in output accuracy due to a modified method |
||||||
|
for fixed-point multiplication with a small windowing constant. While this |
||||||
|
is helpful for performance and the output accuracy loss is generally |
||||||
|
undetectable, it is disabled by default and must be explicitly enabled. |
||||||
|
|
||||||
|
Under some architectures, other special optimizations may also be |
||||||
|
available. |
||||||
|
|
||||||
|
Audio Quality |
||||||
|
|
||||||
|
The output from MAD has been found to satisfy the ISO/IEC 11172-4 |
||||||
|
computational accuracy requirements for compliance. In most |
||||||
|
configurations, MAD is a Full Layer III ISO/IEC 11172-3 audio decoder as |
||||||
|
defined by the standard. |
||||||
|
|
||||||
|
When the approximation version of the fixed-point multiply is used, MAD is |
||||||
|
a limited accuracy ISO/IEC 11172-3 audio decoder as defined by the |
||||||
|
standard. |
||||||
|
|
||||||
|
MAD can alternatively be configured to produce output with less or more |
||||||
|
accuracy than the default, as a tradeoff with performance. |
||||||
|
|
||||||
|
MAD produces output samples with a precision greater than 24 bits. Because |
||||||
|
most output formats use fewer bits, typically 16, it is recommended that a |
||||||
|
dithering algorithm be used (rather than rounding or truncating) to obtain |
||||||
|
the highest quality audio. However, dithering may unfavorably affect an |
||||||
|
analytic examination of the output (such as compliance testing); you may |
||||||
|
therefore wish to use rounding in this case instead. |
||||||
|
|
||||||
|
Portability Issues |
||||||
|
|
||||||
|
GCC is preferred to compile the code, but other compilers may also work. |
||||||
|
The assembly code in `fixed.h' depends on the inline assembly features of |
||||||
|
your compiler. If you're not using GCC or MSVC++, you can either write |
||||||
|
your own assembly macros or use the default (low quality output) version. |
||||||
|
|
||||||
|
The union initialization of `huffman.c' may not be portable to all |
||||||
|
platforms when GCC is not used. |
||||||
|
|
||||||
|
The code should not be sensitive to word sizes or byte ordering, however |
||||||
|
it does assume A % B has the same sign as A. |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
BUILDING AND INSTALLING |
||||||
|
|
||||||
|
Windows Platforms |
||||||
|
|
||||||
|
MAD can be built under Windows using either MSVC++ or Cygwin. A MSVC++ |
||||||
|
project file can be found under the `msvc++' subdirectory. |
||||||
|
|
||||||
|
To build libmad using Cygwin, you will first need to install the Cygwin |
||||||
|
tools: |
||||||
|
|
||||||
|
http://www.cygwin.com/ |
||||||
|
|
||||||
|
You may then proceed with the following POSIX instructions within the |
||||||
|
Cygwin shell. |
||||||
|
|
||||||
|
Note that by default Cygwin will build a library that depends on the |
||||||
|
Cygwin DLL. You can use MinGW to build a library that does not depend on |
||||||
|
the Cygwin DLL. To do so, give the option --host=mingw32 to `configure'. |
||||||
|
|
||||||
|
POSIX Platforms (including Cygwin) |
||||||
|
|
||||||
|
The code is distributed with a `configure' script that will generate for |
||||||
|
you a `Makefile' and a `config.h' for your platform. See the file |
||||||
|
`INSTALL' for generic instructions. |
||||||
|
|
||||||
|
The specific options you may want to give `configure' are: |
||||||
|
|
||||||
|
--enable-speed optimize for speed over accuracy |
||||||
|
|
||||||
|
--enable-accuracy optimize for accuracy over speed |
||||||
|
|
||||||
|
--disable-debugging do not compile with debugging support, and |
||||||
|
use more optimizations |
||||||
|
|
||||||
|
--disable-shared do not build a shared library |
||||||
|
|
||||||
|
Note that you need not specify one of --enable-speed or --enable-accuracy; |
||||||
|
in its default configuration, MAD is optimized for both. You should only |
||||||
|
use one of these options if you wish to compromise speed or accuracy for |
||||||
|
the other. |
||||||
|
|
||||||
|
By default the package will build a shared library if possible for your |
||||||
|
platform. If you want only a static library, use --disable-shared. |
||||||
|
|
||||||
|
It is not normally necessary to use the following options, but you may |
||||||
|
fine-tune the configuration with them if desired: |
||||||
|
|
||||||
|
--enable-fpm=ARCH use the ARCH-specific version of the |
||||||
|
fixed-point math assembly routines |
||||||
|
(current options are: intel, arm, mips, |
||||||
|
sparc, ppc; also allowed are: 64bit, approx) |
||||||
|
|
||||||
|
--enable-sso use the subband synthesis optimization, |
||||||
|
with reduced accuracy |
||||||
|
|
||||||
|
--disable-aso do not use certain architecture-specific |
||||||
|
optimizations |
||||||
|
|
||||||
|
By default an appropriate fixed-point assembly routine will be selected |
||||||
|
for the configured host type, if it can be determined. Thus if you are |
||||||
|
cross-compiling for another architecture, you should be sure either to |
||||||
|
give `configure' a host type argument (--host) or to use an explicit |
||||||
|
--enable-fpm option. |
||||||
|
|
||||||
|
If an appropriate assembly routine cannot be determined, the default |
||||||
|
approximation version will be used. In this case, use of an alternate |
||||||
|
--enable-fpm is highly recommended. |
||||||
|
|
||||||
|
Experimenting and Developing |
||||||
|
|
||||||
|
Further options for `configure' that may be useful to developers and |
||||||
|
experimenters are: |
||||||
|
|
||||||
|
--enable-debugging enable diagnostic debugging support and |
||||||
|
debugging symbols |
||||||
|
|
||||||
|
--enable-profiling generate `gprof' profiling code |
||||||
|
|
||||||
|
--enable-experimental enable code using the EXPERIMENTAL |
||||||
|
preprocessor define |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
COPYRIGHT |
||||||
|
|
||||||
|
Please read the `COPYRIGHT' file for copyright and warranty information. |
||||||
|
Also, the file `COPYING' contains the full text of the GNU GPL. |
||||||
|
|
||||||
|
Send inquiries, comments, bug reports, suggestions, patches, etc. to: |
||||||
|
|
||||||
|
Underbit Technologies, Inc. <support@underbit.com> |
||||||
|
|
||||||
|
See also the MAD home page on the Web: |
||||||
|
|
||||||
|
http://www.underbit.com/products/mad/ |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
@ -0,0 +1,69 @@ |
|||||||
|
|
||||||
|
libmad - MPEG audio decoder library |
||||||
|
Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
|
||||||
|
$Id: TODO,v 1.3 2004/02/05 09:02:39 rob Exp $ |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
libmad: |
||||||
|
- more API layers (buffering, PCM samples, dithering, etc.) |
||||||
|
- x86 performance optimization compiler flags |
||||||
|
- function documentation, general docs |
||||||
|
- finish async API |
||||||
|
- parse system streams? |
||||||
|
- MPEG-2 MC, AAC? |
||||||
|
- logarithmic multiplication? |
||||||
|
- multiple frame decoding for better locality of reference? |
||||||
|
- frame serial numbers, Layer III frame continuity checks |
||||||
|
|
||||||
|
fixed.h: |
||||||
|
- experiment with FPM_INTEL: |
||||||
|
|
||||||
|
# if 1 |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \ |
||||||
|
asm ("shrl %3,%1\n\t" \ |
||||||
|
"shll %4,%2\n\t" \ |
||||||
|
"orl %2,%1" \ |
||||||
|
: "=rm" (__result) \ |
||||||
|
: "0" (lo), "r" (hi), \ |
||||||
|
"I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \ |
||||||
|
: "cc"); \ |
||||||
|
__result; \ |
||||||
|
}) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed64hi_t __hi_; \ |
||||||
|
mad_fixed64lo_t __lo_; \ |
||||||
|
mad_fixed_t __result; \ |
||||||
|
asm ("sall %2,%1" \ |
||||||
|
: "=r" (__hi_) \ |
||||||
|
: "0" (hi), "I" (32 - MAD_F_SCALEBITS) \ |
||||||
|
: "cc"); \ |
||||||
|
asm ("shrl %2,%1" \ |
||||||
|
: "=r" (__lo_) \ |
||||||
|
: "0" (lo), "I" (MAD_F_SCALEBITS) \ |
||||||
|
: "cc"); \ |
||||||
|
asm ("orl %1,%2" \ |
||||||
|
: "=rm" (__result) \ |
||||||
|
: "r" (__hi_), "0" (__lo_) \ |
||||||
|
: "cc"); \ |
||||||
|
__result; \ |
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
libmad Layer I: |
||||||
|
- check frame length sanity |
||||||
|
|
||||||
|
libmad Layer II: |
||||||
|
- check frame length sanity |
||||||
|
|
||||||
|
libmad Layer III: |
||||||
|
- circular buffer |
||||||
|
- optimize zero_part from Huffman decoding throughout |
||||||
|
- MPEG 2.5 8000 Hz sf bands? mixed blocks? |
||||||
|
- stereo->mono conversion optimization? |
||||||
|
- enable frame-at-a-time decoding |
||||||
|
- improve portability of huffman.c |
||||||
|
|
@ -0,0 +1,7 @@ |
|||||||
|
0.15.1b |
||||||
|
configure.ac:24 |
||||||
|
version.h:25-28 |
||||||
|
msvc++/config.h:99,105,120 |
||||||
|
msvc++/mad.h:41-44 |
||||||
|
|
||||||
|
Makefile.am:98-100 |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,237 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: bit.c,v 1.12 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef HAVE_CONFIG_H |
||||||
|
# include "config.h" |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "global.h" |
||||||
|
|
||||||
|
# ifdef HAVE_LIMITS_H |
||||||
|
# include <limits.h> |
||||||
|
# else |
||||||
|
# define CHAR_BIT 8 |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "bit.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the lookup table for computing the CRC-check word. |
||||||
|
* As described in section 2.4.3.1 and depicted in Figure A.9 |
||||||
|
* of ISO/IEC 11172-3, the generator polynomial is: |
||||||
|
* |
||||||
|
* G(X) = X^16 + X^15 + X^2 + 1 |
||||||
|
*/ |
||||||
|
static |
||||||
|
unsigned short const crc_table[256] = { |
||||||
|
0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, |
||||||
|
0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, |
||||||
|
0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, |
||||||
|
0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, |
||||||
|
0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, |
||||||
|
0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, |
||||||
|
0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, |
||||||
|
0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, |
||||||
|
|
||||||
|
0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, |
||||||
|
0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, |
||||||
|
0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, |
||||||
|
0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, |
||||||
|
0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, |
||||||
|
0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, |
||||||
|
0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, |
||||||
|
0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, |
||||||
|
|
||||||
|
0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, |
||||||
|
0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, |
||||||
|
0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, |
||||||
|
0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, |
||||||
|
0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, |
||||||
|
0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, |
||||||
|
0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, |
||||||
|
0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, |
||||||
|
|
||||||
|
0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, |
||||||
|
0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, |
||||||
|
0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, |
||||||
|
0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, |
||||||
|
0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, |
||||||
|
0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, |
||||||
|
0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, |
||||||
|
0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 |
||||||
|
}; |
||||||
|
|
||||||
|
# define CRC_POLY 0x8005 |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: bit->init() |
||||||
|
* DESCRIPTION: initialize bit pointer struct |
||||||
|
*/ |
||||||
|
void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte) |
||||||
|
{ |
||||||
|
bitptr->byte = byte; |
||||||
|
bitptr->cache = 0; |
||||||
|
bitptr->left = CHAR_BIT; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: bit->length() |
||||||
|
* DESCRIPTION: return number of bits between start and end points |
||||||
|
*/ |
||||||
|
unsigned int mad_bit_length(struct mad_bitptr const *begin, |
||||||
|
struct mad_bitptr const *end) |
||||||
|
{ |
||||||
|
return begin->left + |
||||||
|
CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: bit->nextbyte() |
||||||
|
* DESCRIPTION: return pointer to next unprocessed byte |
||||||
|
*/ |
||||||
|
unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr) |
||||||
|
{ |
||||||
|
return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: bit->skip() |
||||||
|
* DESCRIPTION: advance bit pointer |
||||||
|
*/ |
||||||
|
void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len) |
||||||
|
{ |
||||||
|
bitptr->byte += len / CHAR_BIT; |
||||||
|
bitptr->left -= len % CHAR_BIT; |
||||||
|
|
||||||
|
if (bitptr->left > CHAR_BIT) { |
||||||
|
bitptr->byte++; |
||||||
|
bitptr->left += CHAR_BIT; |
||||||
|
} |
||||||
|
|
||||||
|
if (bitptr->left < CHAR_BIT) |
||||||
|
bitptr->cache = *bitptr->byte; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: bit->read() |
||||||
|
* DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value |
||||||
|
*/ |
||||||
|
unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len) |
||||||
|
{ |
||||||
|
register unsigned long value; |
||||||
|
|
||||||
|
if (bitptr->left == CHAR_BIT) |
||||||
|
bitptr->cache = *bitptr->byte; |
||||||
|
|
||||||
|
if (len < bitptr->left) { |
||||||
|
value = (bitptr->cache & ((1 << bitptr->left) - 1)) >> |
||||||
|
(bitptr->left - len); |
||||||
|
bitptr->left -= len; |
||||||
|
|
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
/* remaining bits in current byte */ |
||||||
|
|
||||||
|
value = bitptr->cache & ((1 << bitptr->left) - 1); |
||||||
|
len -= bitptr->left; |
||||||
|
|
||||||
|
bitptr->byte++; |
||||||
|
bitptr->left = CHAR_BIT; |
||||||
|
|
||||||
|
/* more bytes */ |
||||||
|
|
||||||
|
while (len >= CHAR_BIT) { |
||||||
|
value = (value << CHAR_BIT) | *bitptr->byte++; |
||||||
|
len -= CHAR_BIT; |
||||||
|
} |
||||||
|
|
||||||
|
if (len > 0) { |
||||||
|
bitptr->cache = *bitptr->byte; |
||||||
|
|
||||||
|
value = (value << len) | (bitptr->cache >> (CHAR_BIT - len)); |
||||||
|
bitptr->left -= len; |
||||||
|
} |
||||||
|
|
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
# if 0 |
||||||
|
/*
|
||||||
|
* NAME: bit->write() |
||||||
|
* DESCRIPTION: write an arbitrary number of bits |
||||||
|
*/ |
||||||
|
void mad_bit_write(struct mad_bitptr *bitptr, unsigned int len, |
||||||
|
unsigned long value) |
||||||
|
{ |
||||||
|
unsigned char *ptr; |
||||||
|
|
||||||
|
ptr = (unsigned char *) bitptr->byte; |
||||||
|
|
||||||
|
/* ... */ |
||||||
|
} |
||||||
|
# endif |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: bit->crc() |
||||||
|
* DESCRIPTION: compute CRC-check word |
||||||
|
*/ |
||||||
|
unsigned short mad_bit_crc(struct mad_bitptr bitptr, unsigned int len, |
||||||
|
unsigned short init) |
||||||
|
{ |
||||||
|
register unsigned int crc; |
||||||
|
|
||||||
|
for (crc = init; len >= 32; len -= 32) { |
||||||
|
register unsigned long data; |
||||||
|
|
||||||
|
data = mad_bit_read(&bitptr, 32); |
||||||
|
|
||||||
|
crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff]; |
||||||
|
crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff]; |
||||||
|
crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 8)) & 0xff]; |
||||||
|
crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 0)) & 0xff]; |
||||||
|
} |
||||||
|
|
||||||
|
switch (len / 8) { |
||||||
|
case 3: crc = (crc << 8) ^ |
||||||
|
crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; |
||||||
|
case 2: crc = (crc << 8) ^ |
||||||
|
crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; |
||||||
|
case 1: crc = (crc << 8) ^ |
||||||
|
crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; |
||||||
|
|
||||||
|
len %= 8; |
||||||
|
|
||||||
|
case 0: break; |
||||||
|
} |
||||||
|
|
||||||
|
while (len--) { |
||||||
|
register unsigned int msb; |
||||||
|
|
||||||
|
msb = mad_bit_read(&bitptr, 1) ^ (crc >> 15); |
||||||
|
|
||||||
|
crc <<= 1; |
||||||
|
if (msb & 1) |
||||||
|
crc ^= CRC_POLY; |
||||||
|
} |
||||||
|
|
||||||
|
return crc & 0xffff; |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: bit.h,v 1.12 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_BIT_H |
||||||
|
# define LIBMAD_BIT_H |
||||||
|
|
||||||
|
struct mad_bitptr { |
||||||
|
unsigned char const *byte; |
||||||
|
unsigned short cache; |
||||||
|
unsigned short left; |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_bit_init(struct mad_bitptr *, unsigned char const *); |
||||||
|
|
||||||
|
# define mad_bit_finish(bitptr) /* nothing */ |
||||||
|
|
||||||
|
unsigned int mad_bit_length(struct mad_bitptr const *, |
||||||
|
struct mad_bitptr const *); |
||||||
|
|
||||||
|
# define mad_bit_bitsleft(bitptr) ((bitptr)->left) |
||||||
|
unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); |
||||||
|
|
||||||
|
void mad_bit_skip(struct mad_bitptr *, unsigned int); |
||||||
|
unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); |
||||||
|
void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); |
||||||
|
|
||||||
|
unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); |
||||||
|
|
||||||
|
# endif |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,135 @@ |
|||||||
|
/* config.h.in. Generated from configure.ac by autoheader. */ |
||||||
|
|
||||||
|
/* Define to enable diagnostic debugging support. */ |
||||||
|
#undef DEBUG |
||||||
|
|
||||||
|
/* Define to enable experimental code. */ |
||||||
|
#undef EXPERIMENTAL |
||||||
|
|
||||||
|
/* Define to 1 if you have the <assert.h> header file. */ |
||||||
|
#undef HAVE_ASSERT_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the <dlfcn.h> header file. */ |
||||||
|
#undef HAVE_DLFCN_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the <errno.h> header file. */ |
||||||
|
#undef HAVE_ERRNO_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the `fcntl' function. */ |
||||||
|
#undef HAVE_FCNTL |
||||||
|
|
||||||
|
/* Define to 1 if you have the <fcntl.h> header file. */ |
||||||
|
#undef HAVE_FCNTL_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the `fork' function. */ |
||||||
|
#undef HAVE_FORK |
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */ |
||||||
|
#undef HAVE_INTTYPES_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the <limits.h> header file. */ |
||||||
|
#undef HAVE_LIMITS_H |
||||||
|
|
||||||
|
/* Define if your MIPS CPU supports a 2-operand MADD16 instruction. */ |
||||||
|
#undef HAVE_MADD16_ASM |
||||||
|
|
||||||
|
/* Define if your MIPS CPU supports a 2-operand MADD instruction. */ |
||||||
|
#undef HAVE_MADD_ASM |
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */ |
||||||
|
#undef HAVE_MEMORY_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the `pipe' function. */ |
||||||
|
#undef HAVE_PIPE |
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */ |
||||||
|
#undef HAVE_STDINT_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */ |
||||||
|
#undef HAVE_STDLIB_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */ |
||||||
|
#undef HAVE_STRINGS_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */ |
||||||
|
#undef HAVE_STRING_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */ |
||||||
|
#undef HAVE_SYS_STAT_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */ |
||||||
|
#undef HAVE_SYS_TYPES_H |
||||||
|
|
||||||
|
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */ |
||||||
|
#undef HAVE_SYS_WAIT_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */ |
||||||
|
#undef HAVE_UNISTD_H |
||||||
|
|
||||||
|
/* Define to 1 if you have the `waitpid' function. */ |
||||||
|
#undef HAVE_WAITPID |
||||||
|
|
||||||
|
/* Define to disable debugging assertions. */ |
||||||
|
#undef NDEBUG |
||||||
|
|
||||||
|
/* Define to optimize for accuracy over speed. */ |
||||||
|
#undef OPT_ACCURACY |
||||||
|
|
||||||
|
/* Define to optimize for speed over accuracy. */ |
||||||
|
#undef OPT_SPEED |
||||||
|
|
||||||
|
/* Define to enable a fast subband synthesis approximation optimization. */ |
||||||
|
#undef OPT_SSO |
||||||
|
|
||||||
|
/* Define to influence a strict interpretation of the ISO/IEC standards, even
|
||||||
|
if this is in opposition with best accepted practices. */ |
||||||
|
#undef OPT_STRICT |
||||||
|
|
||||||
|
/* Name of package */ |
||||||
|
#undef PACKAGE |
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */ |
||||||
|
#undef PACKAGE_BUGREPORT |
||||||
|
|
||||||
|
/* Define to the full name of this package. */ |
||||||
|
#undef PACKAGE_NAME |
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */ |
||||||
|
#undef PACKAGE_STRING |
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */ |
||||||
|
#undef PACKAGE_TARNAME |
||||||
|
|
||||||
|
/* Define to the version of this package. */ |
||||||
|
#undef PACKAGE_VERSION |
||||||
|
|
||||||
|
/* The size of a `int', as computed by sizeof. */ |
||||||
|
#undef SIZEOF_INT |
||||||
|
|
||||||
|
/* The size of a `long', as computed by sizeof. */ |
||||||
|
#undef SIZEOF_LONG |
||||||
|
|
||||||
|
/* The size of a `long long', as computed by sizeof. */ |
||||||
|
#undef SIZEOF_LONG_LONG |
||||||
|
|
||||||
|
/* Define to 1 if you have the ANSI C header files. */ |
||||||
|
#undef STDC_HEADERS |
||||||
|
|
||||||
|
/* Version number of package */ |
||||||
|
#undef VERSION |
||||||
|
|
||||||
|
/* Define to 1 if your processor stores words with the most significant byte
|
||||||
|
first (like Motorola and SPARC, unlike Intel and VAX). */ |
||||||
|
#undef WORDS_BIGENDIAN |
||||||
|
|
||||||
|
/* Define to empty if `const' does not conform to ANSI C. */ |
||||||
|
#undef const |
||||||
|
|
||||||
|
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||||
|
calls it, or to nothing if 'inline' is not supported under any name. */ |
||||||
|
#ifndef __cplusplus |
||||||
|
#undef inline |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Define to `int' if <sys/types.h> does not define. */ |
||||||
|
#undef pid_t |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,433 @@ |
|||||||
|
dnl -*- m4 -*- |
||||||
|
dnl |
||||||
|
dnl libmad - MPEG audio decoder library |
||||||
|
dnl Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
dnl |
||||||
|
dnl This program is free software; you can redistribute it and/or modify |
||||||
|
dnl it under the terms of the GNU General Public License as published by |
||||||
|
dnl the Free Software Foundation; either version 2 of the License, or |
||||||
|
dnl (at your option) any later version. |
||||||
|
dnl |
||||||
|
dnl This program is distributed in the hope that it will be useful, |
||||||
|
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
dnl GNU General Public License for more details. |
||||||
|
dnl |
||||||
|
dnl You should have received a copy of the GNU General Public License |
||||||
|
dnl along with this program; if not, write to the Free Software |
||||||
|
dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
dnl |
||||||
|
AC_REVISION([$Id: configure.ac,v 1.9 2004/01/23 09:41:32 rob Exp $])dnl |
||||||
|
|
||||||
|
dnl Process this file with autoconf to produce a configure script. |
||||||
|
|
||||||
|
AC_INIT([MPEG Audio Decoder], [0.15.1b], [support@underbit.com], [libmad]) |
||||||
|
AC_PREREQ(2.53) |
||||||
|
|
||||||
|
AC_CONFIG_SRCDIR([decoder.h]) |
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE |
||||||
|
|
||||||
|
AM_CONFIG_HEADER([config.h]) |
||||||
|
|
||||||
|
dnl System type. |
||||||
|
|
||||||
|
AC_CANONICAL_HOST |
||||||
|
|
||||||
|
dnl Checks for programs. |
||||||
|
|
||||||
|
AC_PROG_CC |
||||||
|
AM_PROG_AS |
||||||
|
|
||||||
|
if test "$GCC" = yes |
||||||
|
then |
||||||
|
case "$host" in |
||||||
|
*-*-mingw*) |
||||||
|
case "$build" in |
||||||
|
*-*-cygwin*) |
||||||
|
CPPFLAGS="$CPPFLAGS -mno-cygwin" |
||||||
|
LDFLAGS="$LDFLAGS -mno-cygwin" |
||||||
|
;; |
||||||
|
esac |
||||||
|
esac |
||||||
|
|
||||||
|
dnl case "$host" in |
||||||
|
dnl *-*-cygwin* | *-*-mingw*) |
||||||
|
dnl LDFLAGS="$LDFLAGS -no-undefined -mdll" |
||||||
|
dnl ;; |
||||||
|
dnl esac |
||||||
|
fi |
||||||
|
|
||||||
|
dnl Support for libtool. |
||||||
|
|
||||||
|
dnl AC_DISABLE_SHARED |
||||||
|
dnl AC_LIBTOOL_WIN32_DLL |
||||||
|
AC_PROG_LIBTOOL |
||||||
|
|
||||||
|
AC_SUBST(LIBTOOL_DEPS) |
||||||
|
|
||||||
|
dnl Compiler options. |
||||||
|
|
||||||
|
arch="" |
||||||
|
debug="" |
||||||
|
optimize="" |
||||||
|
profile="" |
||||||
|
|
||||||
|
set -- $CFLAGS |
||||||
|
CFLAGS="" |
||||||
|
|
||||||
|
if test "$GCC" = yes |
||||||
|
then |
||||||
|
CFLAGS="-Wall" |
||||||
|
fi |
||||||
|
|
||||||
|
while test $# -gt 0 |
||||||
|
do |
||||||
|
case "$1" in |
||||||
|
-Wall) |
||||||
|
if test "$GCC" = yes |
||||||
|
then |
||||||
|
: |
||||||
|
else |
||||||
|
CFLAGS="$CFLAGS $1" |
||||||
|
fi |
||||||
|
shift |
||||||
|
;; |
||||||
|
-g) |
||||||
|
debug="-g" |
||||||
|
shift |
||||||
|
;; |
||||||
|
-mno-cygwin) |
||||||
|
shift |
||||||
|
;; |
||||||
|
-m*) |
||||||
|
arch="$arch $1" |
||||||
|
shift |
||||||
|
;; |
||||||
|
-O2) |
||||||
|
optimize="-O" |
||||||
|
shift |
||||||
|
;; |
||||||
|
-fomit-frame-pointer) |
||||||
|
shift |
||||||
|
;; |
||||||
|
-O*|-f*) |
||||||
|
optimize="$optimize $1" |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
CFLAGS="$CFLAGS $1" |
||||||
|
shift |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
if test "$GCC" = yes |
||||||
|
then |
||||||
|
if test -z "$arch" |
||||||
|
then |
||||||
|
case "$host" in |
||||||
|
i386-*) ;; |
||||||
|
i?86-*) arch="-march=i486" ;; |
||||||
|
arm*-empeg-*) arch="-march=armv4 -mtune=strongarm1100" ;; |
||||||
|
armv4*-*) arch="-march=armv4 -mtune=strongarm" ;; |
||||||
|
powerpc-*) ;; |
||||||
|
mips*-agenda-*) arch="-mcpu=vr4100" ;; |
||||||
|
mips*-luxsonor-*) arch="-mips1 -mcpu=r3000 -Wa,-m4010" ;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
|
||||||
|
case "$optimize" in |
||||||
|
-O|"-O "*) |
||||||
|
optimize="-O" |
||||||
|
optimize="$optimize -fforce-mem" |
||||||
|
optimize="$optimize -fforce-addr" |
||||||
|
: #x optimize="$optimize -finline-functions" |
||||||
|
: #- optimize="$optimize -fstrength-reduce" |
||||||
|
optimize="$optimize -fthread-jumps" |
||||||
|
optimize="$optimize -fcse-follow-jumps" |
||||||
|
optimize="$optimize -fcse-skip-blocks" |
||||||
|
: #x optimize="$optimize -frerun-cse-after-loop" |
||||||
|
: #x optimize="$optimize -frerun-loop-opt" |
||||||
|
: #x optimize="$optimize -fgcse" |
||||||
|
optimize="$optimize -fexpensive-optimizations" |
||||||
|
optimize="$optimize -fregmove" |
||||||
|
: #* optimize="$optimize -fdelayed-branch" |
||||||
|
: #x optimize="$optimize -fschedule-insns" |
||||||
|
optimize="$optimize -fschedule-insns2" |
||||||
|
: #? optimize="$optimize -ffunction-sections" |
||||||
|
: #? optimize="$optimize -fcaller-saves" |
||||||
|
: #> optimize="$optimize -funroll-loops" |
||||||
|
: #> optimize="$optimize -funroll-all-loops" |
||||||
|
: #x optimize="$optimize -fmove-all-movables" |
||||||
|
: #x optimize="$optimize -freduce-all-givs" |
||||||
|
: #? optimize="$optimize -fstrict-aliasing" |
||||||
|
: #* optimize="$optimize -fstructure-noalias" |
||||||
|
|
||||||
|
case "$host" in |
||||||
|
arm*-*) |
||||||
|
optimize="$optimize -fstrength-reduce" |
||||||
|
;; |
||||||
|
mips*-*) |
||||||
|
optimize="$optimize -fstrength-reduce" |
||||||
|
optimize="$optimize -finline-functions" |
||||||
|
;; |
||||||
|
i?86-*) |
||||||
|
optimize="$optimize -fstrength-reduce" |
||||||
|
;; |
||||||
|
powerpc-apple-*) |
||||||
|
# this triggers an internal compiler error with gcc2 |
||||||
|
: #optimize="$optimize -fstrength-reduce" |
||||||
|
|
||||||
|
# this is really only beneficial with gcc3 |
||||||
|
: #optimize="$optimize -finline-functions" |
||||||
|
;; |
||||||
|
*) |
||||||
|
# this sometimes provokes bugs in gcc 2.95.2 |
||||||
|
: #optimize="$optimize -fstrength-reduce" |
||||||
|
;; |
||||||
|
esac |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
|
||||||
|
case "$host" in |
||||||
|
mips*-agenda-*) |
||||||
|
AC_DEFINE(HAVE_MADD16_ASM, 1, |
||||||
|
[Define if your MIPS CPU supports a 2-operand MADD16 instruction.]) |
||||||
|
;; |
||||||
|
mips*-luxsonor-*) |
||||||
|
AC_DEFINE(HAVE_MADD_ASM, 1, |
||||||
|
[Define if your MIPS CPU supports a 2-operand MADD instruction.]) |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
dnl Checks for header files. |
||||||
|
|
||||||
|
AC_HEADER_STDC |
||||||
|
AC_HEADER_SYS_WAIT |
||||||
|
AC_CHECK_HEADERS(assert.h limits.h unistd.h sys/types.h fcntl.h errno.h) |
||||||
|
|
||||||
|
dnl Checks for typedefs, structures, and compiler characteristics. |
||||||
|
|
||||||
|
AC_C_CONST |
||||||
|
AC_C_INLINE |
||||||
|
AC_C_BIGENDIAN |
||||||
|
AC_TYPE_PID_T |
||||||
|
|
||||||
|
AC_CHECK_SIZEOF(int, 2) |
||||||
|
AC_CHECK_SIZEOF(long, 4) |
||||||
|
AC_CHECK_SIZEOF(long long, 8) |
||||||
|
|
||||||
|
dnl Checks for library functions. |
||||||
|
|
||||||
|
AC_CHECK_FUNCS(waitpid fcntl pipe fork) |
||||||
|
|
||||||
|
dnl Other options. |
||||||
|
|
||||||
|
AC_SUBST(FPM) |
||||||
|
AC_SUBST(ASO) |
||||||
|
AC_SUBST(ASO_OBJS) |
||||||
|
|
||||||
|
dnl handle --enable and --disable options |
||||||
|
|
||||||
|
AC_CACHE_SAVE |
||||||
|
|
||||||
|
AC_MSG_CHECKING(whether to optimize for speed or for accuracy) |
||||||
|
|
||||||
|
AC_ARG_ENABLE(speed, AC_HELP_STRING([--enable-speed], |
||||||
|
[optimize for speed over accuracy]), |
||||||
|
[ |
||||||
|
case "$enableval" in |
||||||
|
yes) |
||||||
|
optimize_for="speed" |
||||||
|
AC_DEFINE(OPT_SPEED, 1, |
||||||
|
[Define to optimize for speed over accuracy.]) |
||||||
|
;; |
||||||
|
esac |
||||||
|
]) |
||||||
|
|
||||||
|
AC_ARG_ENABLE(accuracy, AC_HELP_STRING([--enable-accuracy], |
||||||
|
[optimize for accuracy over speed]), |
||||||
|
[ |
||||||
|
case "$enableval" in |
||||||
|
yes) |
||||||
|
if test "$optimize_for" = "speed" |
||||||
|
then |
||||||
|
optimize_for="both" |
||||||
|
else |
||||||
|
optimize_for="accuracy" |
||||||
|
fi |
||||||
|
AC_DEFINE(OPT_ACCURACY, 1, |
||||||
|
[Define to optimize for accuracy over speed.]) |
||||||
|
;; |
||||||
|
esac |
||||||
|
]) |
||||||
|
|
||||||
|
AC_MSG_RESULT(${optimize_for-default}) |
||||||
|
|
||||||
|
if test "$optimize_for" = "both" |
||||||
|
then |
||||||
|
AC_MSG_ERROR(cannot optimize for both speed and accuracy) |
||||||
|
fi |
||||||
|
|
||||||
|
AC_MSG_CHECKING(for architecture-specific fixed-point math routines) |
||||||
|
AC_ARG_ENABLE(fpm, AC_HELP_STRING([--enable-fpm=ARCH], |
||||||
|
[use ARCH-specific fixed-point math routines |
||||||
|
(one of: intel, arm, mips, sparc, ppc, 64bit, default)]), |
||||||
|
[ |
||||||
|
case "$enableval" in |
||||||
|
yes) ;; |
||||||
|
no|default|approx) FPM="DEFAULT" ;; |
||||||
|
intel|i?86) FPM="INTEL" ;; |
||||||
|
arm) FPM="ARM" ;; |
||||||
|
mips) FPM="MIPS" ;; |
||||||
|
sparc) FPM="SPARC" ;; |
||||||
|
ppc|powerpc) FPM="PPC" ;; |
||||||
|
64bit) FPM="64BIT" ;; |
||||||
|
float) FPM="FLOAT" ;; |
||||||
|
*) |
||||||
|
AC_MSG_RESULT(failed) |
||||||
|
AC_MSG_ERROR([bad --enable-fpm option]) |
||||||
|
;; |
||||||
|
esac |
||||||
|
]) |
||||||
|
|
||||||
|
if test -z "$FPM" && test "$GCC" = yes |
||||||
|
then |
||||||
|
case "$host" in |
||||||
|
i?86-*) FPM="INTEL" ;; |
||||||
|
arm*-*) FPM="ARM" ;; |
||||||
|
mips*-*) FPM="MIPS" ;; |
||||||
|
sparc*-*) FPM="SPARC" ;; |
||||||
|
powerpc*-*) FPM="PPC" ;; |
||||||
|
# FIXME: need to test for 64-bit long long... |
||||||
|
esac |
||||||
|
fi |
||||||
|
|
||||||
|
AC_MSG_RESULT(${FPM=DEFAULT}) |
||||||
|
|
||||||
|
if test "$FPM" = "DEFAULT" |
||||||
|
then |
||||||
|
AC_MSG_WARN([default fixed-point math will yield limited accuracy]) |
||||||
|
fi |
||||||
|
|
||||||
|
FPM="-DFPM_$FPM" |
||||||
|
|
||||||
|
AC_ARG_ENABLE(sso, AC_HELP_STRING([--enable-sso], |
||||||
|
[use subband synthesis optimization]), |
||||||
|
[ |
||||||
|
case "$enableval" in |
||||||
|
yes) |
||||||
|
AC_DEFINE(OPT_SSO, 1, |
||||||
|
[Define to enable a fast subband synthesis approximation optimization.]) |
||||||
|
;; |
||||||
|
esac |
||||||
|
]) |
||||||
|
|
||||||
|
AC_ARG_ENABLE(aso, AC_HELP_STRING([--disable-aso], |
||||||
|
[disable architecture-specific optimizations]), |
||||||
|
[], [enable_aso=yes]) |
||||||
|
|
||||||
|
if test "$enable_aso" = yes |
||||||
|
then |
||||||
|
case "$host" in |
||||||
|
i?86-*) |
||||||
|
: #ASO="$ASO -DASO_INTERLEAVE1" |
||||||
|
ASO="$ASO -DASO_ZEROCHECK" |
||||||
|
: #not yet #ASO="$ASO -DASO_SYNTH" |
||||||
|
: #not yet #ASO_OBJS="synth_mmx.lo" |
||||||
|
;; |
||||||
|
arm*-*) |
||||||
|
ASO="$ASO -DASO_INTERLEAVE1" |
||||||
|
ASO="$ASO -DASO_IMDCT" |
||||||
|
ASO_OBJS="imdct_l_arm.lo" |
||||||
|
;; |
||||||
|
mips*-*) |
||||||
|
ASO="$ASO -DASO_INTERLEAVE2" |
||||||
|
ASO="$ASO -DASO_ZEROCHECK" |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
|
||||||
|
AC_MSG_CHECKING(for ISO/IEC interpretation) |
||||||
|
AC_ARG_ENABLE(strict-iso, AC_HELP_STRING([--enable-strict-iso], |
||||||
|
[use strict ISO/IEC interpretations]), |
||||||
|
[ |
||||||
|
case "$enableval" in |
||||||
|
yes) |
||||||
|
AC_DEFINE(OPT_STRICT, 1, |
||||||
|
[Define to influence a strict interpretation of the ISO/IEC standards, |
||||||
|
even if this is in opposition with best accepted practices.]) |
||||||
|
interpretation="strict" |
||||||
|
;; |
||||||
|
esac |
||||||
|
]) |
||||||
|
AC_MSG_RESULT(${interpretation-best accepted practices}) |
||||||
|
|
||||||
|
AC_MSG_CHECKING(whether to enable profiling) |
||||||
|
AC_ARG_ENABLE(profiling, AC_HELP_STRING([--enable-profiling], |
||||||
|
[generate profiling code]), |
||||||
|
[ |
||||||
|
case "$enableval" in |
||||||
|
yes) profile="-pg" ;; |
||||||
|
esac |
||||||
|
]) |
||||||
|
AC_MSG_RESULT(${enable_profiling-no}) |
||||||
|
|
||||||
|
AC_MSG_CHECKING(whether to enable debugging) |
||||||
|
AC_ARG_ENABLE(debugging, AC_HELP_STRING([--enable-debugging], |
||||||
|
[enable diagnostic debugging support]) |
||||||
|
AC_HELP_STRING([--disable-debugging], |
||||||
|
[do not enable debugging and use more optimization]), |
||||||
|
[ |
||||||
|
case "$enableval" in |
||||||
|
yes) |
||||||
|
AC_DEFINE(DEBUG, 1, |
||||||
|
[Define to enable diagnostic debugging support.]) |
||||||
|
optimize="" |
||||||
|
;; |
||||||
|
no) |
||||||
|
if test -n "$profile" |
||||||
|
then |
||||||
|
AC_MSG_ERROR(--enable-profiling and --disable-debugging are incompatible) |
||||||
|
fi |
||||||
|
|
||||||
|
AC_DEFINE(NDEBUG, 1, |
||||||
|
[Define to disable debugging assertions.]) |
||||||
|
debug="" |
||||||
|
if test "$GCC" = yes |
||||||
|
then |
||||||
|
optimize="$optimize -fomit-frame-pointer" |
||||||
|
fi |
||||||
|
;; |
||||||
|
esac |
||||||
|
]) |
||||||
|
AC_MSG_RESULT(${enable_debugging-default}) |
||||||
|
|
||||||
|
AC_MSG_CHECKING(whether to enable experimental code) |
||||||
|
AC_ARG_ENABLE(experimental, AC_HELP_STRING([--enable-experimental], |
||||||
|
[enable experimental code]), |
||||||
|
[ |
||||||
|
case "$enableval" in |
||||||
|
yes) |
||||||
|
AC_DEFINE(EXPERIMENTAL, 1, |
||||||
|
[Define to enable experimental code.]) |
||||||
|
;; |
||||||
|
esac |
||||||
|
]) |
||||||
|
AC_MSG_RESULT(${enable_experimental-no}) |
||||||
|
|
||||||
|
dnl Create output files. |
||||||
|
|
||||||
|
test -n "$arch" && CFLAGS="$CFLAGS $arch" |
||||||
|
test -n "$debug" && CFLAGS="$CFLAGS $debug" |
||||||
|
test -n "$optimize" && CFLAGS="$CFLAGS $optimize" |
||||||
|
test -n "$profile" && CFLAGS="$CFLAGS $profile" LDFLAGS="$LDFLAGS $profile" |
||||||
|
|
||||||
|
dnl LTLIBOBJS=`echo "$LIBOBJS" | sed -e 's/\.o/.lo/g'` |
||||||
|
dnl AC_SUBST(LTLIBOBJS) |
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile msvc++/Makefile \ |
||||||
|
libmad.list]) |
||||||
|
AC_OUTPUT |
@ -0,0 +1,582 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: decoder.c,v 1.22 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef HAVE_CONFIG_H |
||||||
|
# include "config.h" |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "global.h" |
||||||
|
|
||||||
|
# ifdef HAVE_SYS_TYPES_H |
||||||
|
# include <sys/types.h> |
||||||
|
# endif |
||||||
|
|
||||||
|
# ifdef HAVE_SYS_WAIT_H |
||||||
|
# include <sys/wait.h> |
||||||
|
# endif |
||||||
|
|
||||||
|
# ifdef HAVE_UNISTD_H |
||||||
|
# include <unistd.h> |
||||||
|
# endif |
||||||
|
|
||||||
|
# ifdef HAVE_FCNTL_H |
||||||
|
# include <fcntl.h> |
||||||
|
# endif |
||||||
|
|
||||||
|
# include <stdlib.h> |
||||||
|
|
||||||
|
# ifdef HAVE_ERRNO_H |
||||||
|
# include <errno.h> |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "stream.h" |
||||||
|
# include "frame.h" |
||||||
|
# include "synth.h" |
||||||
|
# include "decoder.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: decoder->init() |
||||||
|
* DESCRIPTION: initialize a decoder object with callback routines |
||||||
|
*/ |
||||||
|
void mad_decoder_init(struct mad_decoder *decoder, void *data, |
||||||
|
enum mad_flow (*input_func)(void *, |
||||||
|
struct mad_stream *), |
||||||
|
enum mad_flow (*header_func)(void *, |
||||||
|
struct mad_header const *), |
||||||
|
enum mad_flow (*filter_func)(void *, |
||||||
|
struct mad_stream const *, |
||||||
|
struct mad_frame *), |
||||||
|
enum mad_flow (*output_func)(void *, |
||||||
|
struct mad_header const *, |
||||||
|
struct mad_pcm *), |
||||||
|
enum mad_flow (*error_func)(void *, |
||||||
|
struct mad_stream *, |
||||||
|
struct mad_frame *), |
||||||
|
enum mad_flow (*message_func)(void *, |
||||||
|
void *, unsigned int *)) |
||||||
|
{ |
||||||
|
decoder->mode = -1; |
||||||
|
|
||||||
|
decoder->options = 0; |
||||||
|
|
||||||
|
decoder->async.pid = 0; |
||||||
|
decoder->async.in = -1; |
||||||
|
decoder->async.out = -1; |
||||||
|
|
||||||
|
decoder->sync = 0; |
||||||
|
|
||||||
|
decoder->cb_data = data; |
||||||
|
|
||||||
|
decoder->input_func = input_func; |
||||||
|
decoder->header_func = header_func; |
||||||
|
decoder->filter_func = filter_func; |
||||||
|
decoder->output_func = output_func; |
||||||
|
decoder->error_func = error_func; |
||||||
|
decoder->message_func = message_func; |
||||||
|
} |
||||||
|
|
||||||
|
int mad_decoder_finish(struct mad_decoder *decoder) |
||||||
|
{ |
||||||
|
# if defined(USE_ASYNC) |
||||||
|
if (decoder->mode == MAD_DECODER_MODE_ASYNC && decoder->async.pid) { |
||||||
|
pid_t pid; |
||||||
|
int status; |
||||||
|
|
||||||
|
close(decoder->async.in); |
||||||
|
|
||||||
|
do |
||||||
|
pid = waitpid(decoder->async.pid, &status, 0); |
||||||
|
while (pid == -1 && errno == EINTR); |
||||||
|
|
||||||
|
decoder->mode = -1; |
||||||
|
|
||||||
|
close(decoder->async.out); |
||||||
|
|
||||||
|
decoder->async.pid = 0; |
||||||
|
decoder->async.in = -1; |
||||||
|
decoder->async.out = -1; |
||||||
|
|
||||||
|
if (pid == -1) |
||||||
|
return -1; |
||||||
|
|
||||||
|
return (!WIFEXITED(status) || WEXITSTATUS(status)) ? -1 : 0; |
||||||
|
} |
||||||
|
# endif |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
# if defined(USE_ASYNC) |
||||||
|
static |
||||||
|
enum mad_flow send_io(int fd, void const *data, size_t len) |
||||||
|
{ |
||||||
|
char const *ptr = data; |
||||||
|
ssize_t count; |
||||||
|
|
||||||
|
while (len) { |
||||||
|
do |
||||||
|
count = write(fd, ptr, len); |
||||||
|
while (count == -1 && errno == EINTR); |
||||||
|
|
||||||
|
if (count == -1) |
||||||
|
return MAD_FLOW_BREAK; |
||||||
|
|
||||||
|
len -= count; |
||||||
|
ptr += count; |
||||||
|
} |
||||||
|
|
||||||
|
return MAD_FLOW_CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
static |
||||||
|
enum mad_flow receive_io(int fd, void *buffer, size_t len) |
||||||
|
{ |
||||||
|
char *ptr = buffer; |
||||||
|
ssize_t count; |
||||||
|
|
||||||
|
while (len) { |
||||||
|
do |
||||||
|
count = read(fd, ptr, len); |
||||||
|
while (count == -1 && errno == EINTR); |
||||||
|
|
||||||
|
if (count == -1) |
||||||
|
return (errno == EAGAIN) ? MAD_FLOW_IGNORE : MAD_FLOW_BREAK; |
||||||
|
else if (count == 0) |
||||||
|
return MAD_FLOW_STOP; |
||||||
|
|
||||||
|
len -= count; |
||||||
|
ptr += count; |
||||||
|
} |
||||||
|
|
||||||
|
return MAD_FLOW_CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
static |
||||||
|
enum mad_flow receive_io_blocking(int fd, void *buffer, size_t len) |
||||||
|
{ |
||||||
|
int flags, blocking; |
||||||
|
enum mad_flow result; |
||||||
|
|
||||||
|
flags = fcntl(fd, F_GETFL); |
||||||
|
if (flags == -1) |
||||||
|
return MAD_FLOW_BREAK; |
||||||
|
|
||||||
|
blocking = flags & ~O_NONBLOCK; |
||||||
|
|
||||||
|
if (blocking != flags && |
||||||
|
fcntl(fd, F_SETFL, blocking) == -1) |
||||||
|
return MAD_FLOW_BREAK; |
||||||
|
|
||||||
|
result = receive_io(fd, buffer, len); |
||||||
|
|
||||||
|
if (flags != blocking && |
||||||
|
fcntl(fd, F_SETFL, flags) == -1) |
||||||
|
return MAD_FLOW_BREAK; |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
static |
||||||
|
enum mad_flow send(int fd, void const *message, unsigned int size) |
||||||
|
{ |
||||||
|
enum mad_flow result; |
||||||
|
|
||||||
|
/* send size */ |
||||||
|
|
||||||
|
result = send_io(fd, &size, sizeof(size)); |
||||||
|
|
||||||
|
/* send message */ |
||||||
|
|
||||||
|
if (result == MAD_FLOW_CONTINUE) |
||||||
|
result = send_io(fd, message, size); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
static |
||||||
|
enum mad_flow receive(int fd, void **message, unsigned int *size) |
||||||
|
{ |
||||||
|
enum mad_flow result; |
||||||
|
unsigned int actual; |
||||||
|
|
||||||
|
if (*message == 0) |
||||||
|
*size = 0; |
||||||
|
|
||||||
|
/* receive size */ |
||||||
|
|
||||||
|
result = receive_io(fd, &actual, sizeof(actual)); |
||||||
|
|
||||||
|
/* receive message */ |
||||||
|
|
||||||
|
if (result == MAD_FLOW_CONTINUE) { |
||||||
|
if (actual > *size) |
||||||
|
actual -= *size; |
||||||
|
else { |
||||||
|
*size = actual; |
||||||
|
actual = 0; |
||||||
|
} |
||||||
|
|
||||||
|
if (*size > 0) { |
||||||
|
if (*message == 0) { |
||||||
|
*message = malloc(*size); |
||||||
|
if (*message == 0) |
||||||
|
return MAD_FLOW_BREAK; |
||||||
|
} |
||||||
|
|
||||||
|
result = receive_io_blocking(fd, *message, *size); |
||||||
|
} |
||||||
|
|
||||||
|
/* throw away remainder of message */ |
||||||
|
|
||||||
|
while (actual && result == MAD_FLOW_CONTINUE) { |
||||||
|
char sink[256]; |
||||||
|
unsigned int len; |
||||||
|
|
||||||
|
len = actual > sizeof(sink) ? sizeof(sink) : actual; |
||||||
|
|
||||||
|
result = receive_io_blocking(fd, sink, len); |
||||||
|
|
||||||
|
actual -= len; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
static |
||||||
|
enum mad_flow check_message(struct mad_decoder *decoder) |
||||||
|
{ |
||||||
|
enum mad_flow result; |
||||||
|
void *message = 0; |
||||||
|
unsigned int size; |
||||||
|
|
||||||
|
result = receive(decoder->async.in, &message, &size); |
||||||
|
|
||||||
|
if (result == MAD_FLOW_CONTINUE) { |
||||||
|
if (decoder->message_func == 0) |
||||||
|
size = 0; |
||||||
|
else { |
||||||
|
result = decoder->message_func(decoder->cb_data, message, &size); |
||||||
|
|
||||||
|
if (result == MAD_FLOW_IGNORE || |
||||||
|
result == MAD_FLOW_BREAK) |
||||||
|
size = 0; |
||||||
|
} |
||||||
|
|
||||||
|
if (send(decoder->async.out, message, size) != MAD_FLOW_CONTINUE) |
||||||
|
result = MAD_FLOW_BREAK; |
||||||
|
} |
||||||
|
|
||||||
|
if (message) |
||||||
|
free(message); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
# endif |
||||||
|
|
||||||
|
static |
||||||
|
enum mad_flow error_default(void *data, struct mad_stream *stream, |
||||||
|
struct mad_frame *frame) |
||||||
|
{ |
||||||
|
int *bad_last_frame = data; |
||||||
|
|
||||||
|
switch (stream->error) { |
||||||
|
case MAD_ERROR_BADCRC: |
||||||
|
if (*bad_last_frame) |
||||||
|
mad_frame_mute(frame); |
||||||
|
else |
||||||
|
*bad_last_frame = 1; |
||||||
|
|
||||||
|
return MAD_FLOW_IGNORE; |
||||||
|
|
||||||
|
default: |
||||||
|
return MAD_FLOW_CONTINUE; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static |
||||||
|
int run_sync(struct mad_decoder *decoder) |
||||||
|
{ |
||||||
|
enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); |
||||||
|
void *error_data; |
||||||
|
int bad_last_frame = 0; |
||||||
|
struct mad_stream *stream; |
||||||
|
struct mad_frame *frame; |
||||||
|
struct mad_synth *synth; |
||||||
|
int result = 0; |
||||||
|
|
||||||
|
if (decoder->input_func == 0) |
||||||
|
return 0; |
||||||
|
|
||||||
|
if (decoder->error_func) { |
||||||
|
error_func = decoder->error_func; |
||||||
|
error_data = decoder->cb_data; |
||||||
|
} |
||||||
|
else { |
||||||
|
error_func = error_default; |
||||||
|
error_data = &bad_last_frame; |
||||||
|
} |
||||||
|
|
||||||
|
stream = &decoder->sync->stream; |
||||||
|
frame = &decoder->sync->frame; |
||||||
|
synth = &decoder->sync->synth; |
||||||
|
|
||||||
|
mad_stream_init(stream); |
||||||
|
mad_frame_init(frame); |
||||||
|
mad_synth_init(synth); |
||||||
|
|
||||||
|
mad_stream_options(stream, decoder->options); |
||||||
|
|
||||||
|
do { |
||||||
|
switch (decoder->input_func(decoder->cb_data, stream)) { |
||||||
|
case MAD_FLOW_STOP: |
||||||
|
goto done; |
||||||
|
case MAD_FLOW_BREAK: |
||||||
|
goto fail; |
||||||
|
case MAD_FLOW_IGNORE: |
||||||
|
continue; |
||||||
|
case MAD_FLOW_CONTINUE: |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
while (1) { |
||||||
|
# if defined(USE_ASYNC) |
||||||
|
if (decoder->mode == MAD_DECODER_MODE_ASYNC) { |
||||||
|
switch (check_message(decoder)) { |
||||||
|
case MAD_FLOW_IGNORE: |
||||||
|
case MAD_FLOW_CONTINUE: |
||||||
|
break; |
||||||
|
case MAD_FLOW_BREAK: |
||||||
|
goto fail; |
||||||
|
case MAD_FLOW_STOP: |
||||||
|
goto done; |
||||||
|
} |
||||||
|
} |
||||||
|
# endif |
||||||
|
|
||||||
|
if (decoder->header_func) { |
||||||
|
if (mad_header_decode(&frame->header, stream) == -1) { |
||||||
|
if (!MAD_RECOVERABLE(stream->error)) |
||||||
|
break; |
||||||
|
|
||||||
|
switch (error_func(error_data, stream, frame)) { |
||||||
|
case MAD_FLOW_STOP: |
||||||
|
goto done; |
||||||
|
case MAD_FLOW_BREAK: |
||||||
|
goto fail; |
||||||
|
case MAD_FLOW_IGNORE: |
||||||
|
case MAD_FLOW_CONTINUE: |
||||||
|
default: |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
switch (decoder->header_func(decoder->cb_data, &frame->header)) { |
||||||
|
case MAD_FLOW_STOP: |
||||||
|
goto done; |
||||||
|
case MAD_FLOW_BREAK: |
||||||
|
goto fail; |
||||||
|
case MAD_FLOW_IGNORE: |
||||||
|
continue; |
||||||
|
case MAD_FLOW_CONTINUE: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (mad_frame_decode(frame, stream) == -1) { |
||||||
|
if (!MAD_RECOVERABLE(stream->error)) |
||||||
|
break; |
||||||
|
|
||||||
|
switch (error_func(error_data, stream, frame)) { |
||||||
|
case MAD_FLOW_STOP: |
||||||
|
goto done; |
||||||
|
case MAD_FLOW_BREAK: |
||||||
|
goto fail; |
||||||
|
case MAD_FLOW_IGNORE: |
||||||
|
break; |
||||||
|
case MAD_FLOW_CONTINUE: |
||||||
|
default: |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
bad_last_frame = 0; |
||||||
|
|
||||||
|
if (decoder->filter_func) { |
||||||
|
switch (decoder->filter_func(decoder->cb_data, stream, frame)) { |
||||||
|
case MAD_FLOW_STOP: |
||||||
|
goto done; |
||||||
|
case MAD_FLOW_BREAK: |
||||||
|
goto fail; |
||||||
|
case MAD_FLOW_IGNORE: |
||||||
|
continue; |
||||||
|
case MAD_FLOW_CONTINUE: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
mad_synth_frame(synth, frame); |
||||||
|
|
||||||
|
if (decoder->output_func) { |
||||||
|
switch (decoder->output_func(decoder->cb_data, |
||||||
|
&frame->header, &synth->pcm)) { |
||||||
|
case MAD_FLOW_STOP: |
||||||
|
goto done; |
||||||
|
case MAD_FLOW_BREAK: |
||||||
|
goto fail; |
||||||
|
case MAD_FLOW_IGNORE: |
||||||
|
case MAD_FLOW_CONTINUE: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
while (stream->error == MAD_ERROR_BUFLEN); |
||||||
|
|
||||||
|
fail: |
||||||
|
result = -1; |
||||||
|
|
||||||
|
done: |
||||||
|
mad_synth_finish(synth); |
||||||
|
mad_frame_finish(frame); |
||||||
|
mad_stream_finish(stream); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
# if defined(USE_ASYNC) |
||||||
|
static |
||||||
|
int run_async(struct mad_decoder *decoder) |
||||||
|
{ |
||||||
|
pid_t pid; |
||||||
|
int ptoc[2], ctop[2], flags; |
||||||
|
|
||||||
|
if (pipe(ptoc) == -1) |
||||||
|
return -1; |
||||||
|
|
||||||
|
if (pipe(ctop) == -1) { |
||||||
|
close(ptoc[0]); |
||||||
|
close(ptoc[1]); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
flags = fcntl(ptoc[0], F_GETFL); |
||||||
|
if (flags == -1 || |
||||||
|
fcntl(ptoc[0], F_SETFL, flags | O_NONBLOCK) == -1) { |
||||||
|
close(ctop[0]); |
||||||
|
close(ctop[1]); |
||||||
|
close(ptoc[0]); |
||||||
|
close(ptoc[1]); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
pid = fork(); |
||||||
|
if (pid == -1) { |
||||||
|
close(ctop[0]); |
||||||
|
close(ctop[1]); |
||||||
|
close(ptoc[0]); |
||||||
|
close(ptoc[1]); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
decoder->async.pid = pid; |
||||||
|
|
||||||
|
if (pid) { |
||||||
|
/* parent */ |
||||||
|
|
||||||
|
close(ptoc[0]); |
||||||
|
close(ctop[1]); |
||||||
|
|
||||||
|
decoder->async.in = ctop[0]; |
||||||
|
decoder->async.out = ptoc[1]; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* child */ |
||||||
|
|
||||||
|
close(ptoc[1]); |
||||||
|
close(ctop[0]); |
||||||
|
|
||||||
|
decoder->async.in = ptoc[0]; |
||||||
|
decoder->async.out = ctop[1]; |
||||||
|
|
||||||
|
_exit(run_sync(decoder)); |
||||||
|
|
||||||
|
/* not reached */ |
||||||
|
return -1; |
||||||
|
} |
||||||
|
# endif |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: decoder->run() |
||||||
|
* DESCRIPTION: run the decoder thread either synchronously or asynchronously |
||||||
|
*/ |
||||||
|
int mad_decoder_run(struct mad_decoder *decoder, enum mad_decoder_mode mode) |
||||||
|
{ |
||||||
|
int result; |
||||||
|
int (*run)(struct mad_decoder *) = 0; |
||||||
|
|
||||||
|
switch (decoder->mode = mode) { |
||||||
|
case MAD_DECODER_MODE_SYNC: |
||||||
|
run = run_sync; |
||||||
|
break; |
||||||
|
|
||||||
|
case MAD_DECODER_MODE_ASYNC: |
||||||
|
# if defined(USE_ASYNC) |
||||||
|
run = run_async; |
||||||
|
# endif |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
if (run == 0) |
||||||
|
return -1; |
||||||
|
|
||||||
|
decoder->sync = malloc(sizeof(*decoder->sync)); |
||||||
|
if (decoder->sync == 0) |
||||||
|
return -1; |
||||||
|
|
||||||
|
result = run(decoder); |
||||||
|
|
||||||
|
free(decoder->sync); |
||||||
|
decoder->sync = 0; |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: decoder->message() |
||||||
|
* DESCRIPTION: send a message to and receive a reply from the decoder process |
||||||
|
*/ |
||||||
|
int mad_decoder_message(struct mad_decoder *decoder, |
||||||
|
void *message, unsigned int *len) |
||||||
|
{ |
||||||
|
# if defined(USE_ASYNC) |
||||||
|
if (decoder->mode != MAD_DECODER_MODE_ASYNC || |
||||||
|
send(decoder->async.out, message, *len) != MAD_FLOW_CONTINUE || |
||||||
|
receive(decoder->async.in, &message, len) != MAD_FLOW_CONTINUE) |
||||||
|
return -1; |
||||||
|
|
||||||
|
return 0; |
||||||
|
# else |
||||||
|
return -1; |
||||||
|
# endif |
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: decoder.h,v 1.17 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_DECODER_H |
||||||
|
# define LIBMAD_DECODER_H |
||||||
|
|
||||||
|
# include "stream.h" |
||||||
|
# include "frame.h" |
||||||
|
# include "synth.h" |
||||||
|
|
||||||
|
enum mad_decoder_mode { |
||||||
|
MAD_DECODER_MODE_SYNC = 0, |
||||||
|
MAD_DECODER_MODE_ASYNC |
||||||
|
}; |
||||||
|
|
||||||
|
enum mad_flow { |
||||||
|
MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ |
||||||
|
MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ |
||||||
|
MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ |
||||||
|
MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_decoder { |
||||||
|
enum mad_decoder_mode mode; |
||||||
|
|
||||||
|
int options; |
||||||
|
|
||||||
|
struct { |
||||||
|
long pid; |
||||||
|
int in; |
||||||
|
int out; |
||||||
|
} async; |
||||||
|
|
||||||
|
struct { |
||||||
|
struct mad_stream stream; |
||||||
|
struct mad_frame frame; |
||||||
|
struct mad_synth synth; |
||||||
|
} *sync; |
||||||
|
|
||||||
|
void *cb_data; |
||||||
|
|
||||||
|
enum mad_flow (*input_func)(void *, struct mad_stream *); |
||||||
|
enum mad_flow (*header_func)(void *, struct mad_header const *); |
||||||
|
enum mad_flow (*filter_func)(void *, |
||||||
|
struct mad_stream const *, struct mad_frame *); |
||||||
|
enum mad_flow (*output_func)(void *, |
||||||
|
struct mad_header const *, struct mad_pcm *); |
||||||
|
enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); |
||||||
|
enum mad_flow (*message_func)(void *, void *, unsigned int *); |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_decoder_init(struct mad_decoder *, void *, |
||||||
|
enum mad_flow (*)(void *, struct mad_stream *), |
||||||
|
enum mad_flow (*)(void *, struct mad_header const *), |
||||||
|
enum mad_flow (*)(void *, |
||||||
|
struct mad_stream const *, |
||||||
|
struct mad_frame *), |
||||||
|
enum mad_flow (*)(void *, |
||||||
|
struct mad_header const *, |
||||||
|
struct mad_pcm *), |
||||||
|
enum mad_flow (*)(void *, |
||||||
|
struct mad_stream *, |
||||||
|
struct mad_frame *), |
||||||
|
enum mad_flow (*)(void *, void *, unsigned int *)); |
||||||
|
int mad_decoder_finish(struct mad_decoder *); |
||||||
|
|
||||||
|
# define mad_decoder_options(decoder, opts) \ |
||||||
|
((void) ((decoder)->options = (opts))) |
||||||
|
|
||||||
|
int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); |
||||||
|
int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); |
||||||
|
|
||||||
|
# endif |
@ -0,0 +1,464 @@ |
|||||||
|
#! /bin/sh |
||||||
|
|
||||||
|
# depcomp - compile a program generating dependencies as side-effects |
||||||
|
# Copyright 1999, 2000 Free Software Foundation, Inc. |
||||||
|
|
||||||
|
# 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, 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 |
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
||||||
|
# 02111-1307, USA. |
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you |
||||||
|
# distribute this file as part of a program that contains a |
||||||
|
# configuration script generated by Autoconf, you may include it under |
||||||
|
# the same distribution terms that you use for the rest of that program. |
||||||
|
|
||||||
|
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. |
||||||
|
|
||||||
|
if test -z "$depmode" || test -z "$source" || test -z "$object"; then |
||||||
|
echo "depcomp: Variables source, object and depmode must be set" 1>&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
# `libtool' can also be set to `yes' or `no'. |
||||||
|
|
||||||
|
if test -z "$depfile"; then |
||||||
|
base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` |
||||||
|
dir=`echo "$object" | sed 's,/.*$,/,'` |
||||||
|
if test "$dir" = "$object"; then |
||||||
|
dir= |
||||||
|
fi |
||||||
|
# FIXME: should be _deps on DOS. |
||||||
|
depfile="$dir.deps/$base" |
||||||
|
fi |
||||||
|
|
||||||
|
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} |
||||||
|
|
||||||
|
rm -f "$tmpdepfile" |
||||||
|
|
||||||
|
# Some modes work just like other modes, but use different flags. We |
||||||
|
# parameterize here, but still list the modes in the big case below, |
||||||
|
# to make depend.m4 easier to write. Note that we *cannot* use a case |
||||||
|
# here, because this file can only contain one case statement. |
||||||
|
if test "$depmode" = hp; then |
||||||
|
# HP compiler uses -M and no extra arg. |
||||||
|
gccflag=-M |
||||||
|
depmode=gcc |
||||||
|
fi |
||||||
|
|
||||||
|
if test "$depmode" = dashXmstdout; then |
||||||
|
# This is just like dashmstdout with a different argument. |
||||||
|
dashmflag=-xM |
||||||
|
depmode=dashmstdout |
||||||
|
fi |
||||||
|
|
||||||
|
case "$depmode" in |
||||||
|
gcc3) |
||||||
|
## gcc 3 implements dependency tracking that does exactly what |
||||||
|
## we want. Yay! Note: for some reason libtool 1.4 doesn't like |
||||||
|
## it if -MD -MP comes after the -MF stuff. Hmm. |
||||||
|
"$@" -MT "$object" -MD -MP -MF "$tmpdepfile" |
||||||
|
stat=$? |
||||||
|
if test $stat -eq 0; then : |
||||||
|
else |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
mv "$tmpdepfile" "$depfile" |
||||||
|
;; |
||||||
|
|
||||||
|
gcc) |
||||||
|
## There are various ways to get dependency output from gcc. Here's |
||||||
|
## why we pick this rather obscure method: |
||||||
|
## - Don't want to use -MD because we'd like the dependencies to end |
||||||
|
## up in a subdir. Having to rename by hand is ugly. |
||||||
|
## (We might end up doing this anyway to support other compilers.) |
||||||
|
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like |
||||||
|
## -MM, not -M (despite what the docs say). |
||||||
|
## - Using -M directly means running the compiler twice (even worse |
||||||
|
## than renaming). |
||||||
|
if test -z "$gccflag"; then |
||||||
|
gccflag=-MD, |
||||||
|
fi |
||||||
|
"$@" -Wp,"$gccflag$tmpdepfile" |
||||||
|
stat=$? |
||||||
|
if test $stat -eq 0; then : |
||||||
|
else |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
rm -f "$depfile" |
||||||
|
echo "$object : \\" > "$depfile" |
||||||
|
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz |
||||||
|
## The second -e expression handles DOS-style file names with drive letters. |
||||||
|
sed -e 's/^[^:]*: / /' \ |
||||||
|
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" |
||||||
|
## This next piece of magic avoids the `deleted header file' problem. |
||||||
|
## The problem is that when a header file which appears in a .P file |
||||||
|
## is deleted, the dependency causes make to die (because there is |
||||||
|
## typically no way to rebuild the header). We avoid this by adding |
||||||
|
## dummy dependencies for each header file. Too bad gcc doesn't do |
||||||
|
## this for us directly. |
||||||
|
tr ' ' ' |
||||||
|
' < "$tmpdepfile" | |
||||||
|
## Some versions of gcc put a space before the `:'. On the theory |
||||||
|
## that the space means something, we add a space to the output as |
||||||
|
## well. |
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation |
||||||
|
## correctly. Breaking it into two sed invocations is a workaround. |
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
hp) |
||||||
|
# This case exists only to let depend.m4 do its work. It works by |
||||||
|
# looking at the text of this script. This case will never be run, |
||||||
|
# since it is checked for above. |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
sgi) |
||||||
|
if test "$libtool" = yes; then |
||||||
|
"$@" "-Wp,-MDupdate,$tmpdepfile" |
||||||
|
else |
||||||
|
"$@" -MDupdate "$tmpdepfile" |
||||||
|
fi |
||||||
|
stat=$? |
||||||
|
if test $stat -eq 0; then : |
||||||
|
else |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
rm -f "$depfile" |
||||||
|
|
||||||
|
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files |
||||||
|
echo "$object : \\" > "$depfile" |
||||||
|
|
||||||
|
# Clip off the initial element (the dependent). Don't try to be |
||||||
|
# clever and replace this with sed code, as IRIX sed won't handle |
||||||
|
# lines with more than a fixed number of characters (4096 in |
||||||
|
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; |
||||||
|
# the IRIX cc adds comments like `#:fec' to the end of the |
||||||
|
# dependency line. |
||||||
|
tr ' ' ' |
||||||
|
' < "$tmpdepfile" \ |
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ |
||||||
|
tr ' |
||||||
|
' ' ' >> $depfile |
||||||
|
echo >> $depfile |
||||||
|
|
||||||
|
# The second pass generates a dummy entry for each header file. |
||||||
|
tr ' ' ' |
||||||
|
' < "$tmpdepfile" \ |
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ |
||||||
|
>> $depfile |
||||||
|
else |
||||||
|
# The sourcefile does not contain any dependencies, so just |
||||||
|
# store a dummy comment line, to avoid errors with the Makefile |
||||||
|
# "include basename.Plo" scheme. |
||||||
|
echo "#dummy" > "$depfile" |
||||||
|
fi |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
aix) |
||||||
|
# The C for AIX Compiler uses -M and outputs the dependencies |
||||||
|
# in a .u file. This file always lives in the current directory. |
||||||
|
# Also, the AIX compiler puts `$object:' at the start of each line; |
||||||
|
# $object doesn't have directory information. |
||||||
|
stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` |
||||||
|
tmpdepfile="$stripped.u" |
||||||
|
outname="$stripped.o" |
||||||
|
if test "$libtool" = yes; then |
||||||
|
"$@" -Wc,-M |
||||||
|
else |
||||||
|
"$@" -M |
||||||
|
fi |
||||||
|
|
||||||
|
stat=$? |
||||||
|
if test $stat -eq 0; then : |
||||||
|
else |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
|
||||||
|
if test -f "$tmpdepfile"; then |
||||||
|
# Each line is of the form `foo.o: dependent.h'. |
||||||
|
# Do two passes, one to just change these to |
||||||
|
# `$object: dependent.h' and one to simply `dependent.h:'. |
||||||
|
sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" |
||||||
|
sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" |
||||||
|
else |
||||||
|
# The sourcefile does not contain any dependencies, so just |
||||||
|
# store a dummy comment line, to avoid errors with the Makefile |
||||||
|
# "include basename.Plo" scheme. |
||||||
|
echo "#dummy" > "$depfile" |
||||||
|
fi |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
icc) |
||||||
|
# Must come before tru64. |
||||||
|
|
||||||
|
# Intel's C compiler understands `-MD -MF file'. However |
||||||
|
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c |
||||||
|
# will fill foo.d with something like |
||||||
|
# foo.o: sub/foo.c |
||||||
|
# foo.o: sub/foo.h |
||||||
|
# which is wrong. We want: |
||||||
|
# sub/foo.o: sub/foo.c |
||||||
|
# sub/foo.o: sub/foo.h |
||||||
|
# sub/foo.c: |
||||||
|
# sub/foo.h: |
||||||
|
|
||||||
|
"$@" -MD -MF "$tmpdepfile" |
||||||
|
stat=$? |
||||||
|
if test $stat -eq 0; then : |
||||||
|
else |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
rm -f "$depfile" |
||||||
|
# Each line is of the form `foo.o: dependent.h'. |
||||||
|
# Do two passes, one to just change these to |
||||||
|
# `$object: dependent.h' and one to simply `dependent.h:'. |
||||||
|
sed -e "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" |
||||||
|
sed -e "s,^[^:]*: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
tru64) |
||||||
|
# The Tru64 compiler uses -MD to generate dependencies as a side |
||||||
|
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. |
||||||
|
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put |
||||||
|
# dependencies in `foo.d' instead, so we check for that too. |
||||||
|
# Subdirectories are respected. |
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` |
||||||
|
test "x$dir" = "x$object" && dir= |
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` |
||||||
|
|
||||||
|
if test "$libtool" = yes; then |
||||||
|
tmpdepfile1="$dir.libs/$base.lo.d" |
||||||
|
tmpdepfile2="$dir.libs/$base.d" |
||||||
|
"$@" -Wc,-MD |
||||||
|
else |
||||||
|
tmpdepfile1="$dir$base.o.d" |
||||||
|
tmpdepfile2="$dir$base.d" |
||||||
|
"$@" -MD |
||||||
|
fi |
||||||
|
|
||||||
|
stat=$? |
||||||
|
if test $stat -eq 0; then : |
||||||
|
else |
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
|
||||||
|
if test -f "$tmpdepfile1"; then |
||||||
|
tmpdepfile="$tmpdepfile1" |
||||||
|
else |
||||||
|
tmpdepfile="$tmpdepfile2" |
||||||
|
fi |
||||||
|
if test -f "$tmpdepfile"; then |
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" |
||||||
|
# That's a space and a tab in the []. |
||||||
|
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" |
||||||
|
else |
||||||
|
echo "#dummy" > "$depfile" |
||||||
|
fi |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
#nosideeffect) |
||||||
|
# This comment above is used by automake to tell side-effect |
||||||
|
# dependency tracking mechanisms from slower ones. |
||||||
|
|
||||||
|
dashmstdout) |
||||||
|
# Important note: in order to support this mode, a compiler *must* |
||||||
|
# always write the proprocessed file to stdout, regardless of -o. |
||||||
|
"$@" || exit $? |
||||||
|
|
||||||
|
# Remove the call to Libtool. |
||||||
|
if test "$libtool" = yes; then |
||||||
|
while test $1 != '--mode=compile'; do |
||||||
|
shift |
||||||
|
done |
||||||
|
shift |
||||||
|
fi |
||||||
|
|
||||||
|
# Remove `-o $object'. |
||||||
|
IFS=" " |
||||||
|
for arg |
||||||
|
do |
||||||
|
case $arg in |
||||||
|
-o) |
||||||
|
shift |
||||||
|
;; |
||||||
|
$object) |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
set fnord "$@" "$arg" |
||||||
|
shift # fnord |
||||||
|
shift # $arg |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
test -z "$dashmflag" && dashmflag=-M |
||||||
|
# Require at least two characters before searching for `:' |
||||||
|
# in the target name. This is to cope with DOS-style filenames: |
||||||
|
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. |
||||||
|
"$@" $dashmflag | |
||||||
|
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" |
||||||
|
rm -f "$depfile" |
||||||
|
cat < "$tmpdepfile" > "$depfile" |
||||||
|
tr ' ' ' |
||||||
|
' < "$tmpdepfile" | \ |
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation |
||||||
|
## correctly. Breaking it into two sed invocations is a workaround. |
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
dashXmstdout) |
||||||
|
# This case only exists to satisfy depend.m4. It is never actually |
||||||
|
# run, as this mode is specially recognized in the preamble. |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
makedepend) |
||||||
|
"$@" || exit $? |
||||||
|
# Remove any Libtool call |
||||||
|
if test "$libtool" = yes; then |
||||||
|
while test $1 != '--mode=compile'; do |
||||||
|
shift |
||||||
|
done |
||||||
|
shift |
||||||
|
fi |
||||||
|
# X makedepend |
||||||
|
shift |
||||||
|
cleared=no |
||||||
|
for arg in "$@"; do |
||||||
|
case $cleared in |
||||||
|
no) |
||||||
|
set ""; shift |
||||||
|
cleared=yes ;; |
||||||
|
esac |
||||||
|
case "$arg" in |
||||||
|
-D*|-I*) |
||||||
|
set fnord "$@" "$arg"; shift ;; |
||||||
|
# Strip any option that makedepend may not understand. Remove |
||||||
|
# the object too, otherwise makedepend will parse it as a source file. |
||||||
|
-*|$object) |
||||||
|
;; |
||||||
|
*) |
||||||
|
set fnord "$@" "$arg"; shift ;; |
||||||
|
esac |
||||||
|
done |
||||||
|
obj_suffix="`echo $object | sed 's/^.*\././'`" |
||||||
|
touch "$tmpdepfile" |
||||||
|
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" |
||||||
|
rm -f "$depfile" |
||||||
|
cat < "$tmpdepfile" > "$depfile" |
||||||
|
sed '1,2d' "$tmpdepfile" | tr ' ' ' |
||||||
|
' | \ |
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation |
||||||
|
## correctly. Breaking it into two sed invocations is a workaround. |
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile".bak |
||||||
|
;; |
||||||
|
|
||||||
|
cpp) |
||||||
|
# Important note: in order to support this mode, a compiler *must* |
||||||
|
# always write the proprocessed file to stdout. |
||||||
|
"$@" || exit $? |
||||||
|
|
||||||
|
# Remove the call to Libtool. |
||||||
|
if test "$libtool" = yes; then |
||||||
|
while test $1 != '--mode=compile'; do |
||||||
|
shift |
||||||
|
done |
||||||
|
shift |
||||||
|
fi |
||||||
|
|
||||||
|
# Remove `-o $object'. |
||||||
|
IFS=" " |
||||||
|
for arg |
||||||
|
do |
||||||
|
case $arg in |
||||||
|
-o) |
||||||
|
shift |
||||||
|
;; |
||||||
|
$object) |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
set fnord "$@" "$arg" |
||||||
|
shift # fnord |
||||||
|
shift # $arg |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
"$@" -E | |
||||||
|
sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | |
||||||
|
sed '$ s: \\$::' > "$tmpdepfile" |
||||||
|
rm -f "$depfile" |
||||||
|
echo "$object : \\" > "$depfile" |
||||||
|
cat < "$tmpdepfile" >> "$depfile" |
||||||
|
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
msvisualcpp) |
||||||
|
# Important note: in order to support this mode, a compiler *must* |
||||||
|
# always write the proprocessed file to stdout, regardless of -o, |
||||||
|
# because we must use -o when running libtool. |
||||||
|
"$@" || exit $? |
||||||
|
IFS=" " |
||||||
|
for arg |
||||||
|
do |
||||||
|
case "$arg" in |
||||||
|
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") |
||||||
|
set fnord "$@" |
||||||
|
shift |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
set fnord "$@" "$arg" |
||||||
|
shift |
||||||
|
shift |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
"$@" -E | |
||||||
|
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" |
||||||
|
rm -f "$depfile" |
||||||
|
echo "$object : \\" > "$depfile" |
||||||
|
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" |
||||||
|
echo " " >> "$depfile" |
||||||
|
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
none) |
||||||
|
exec "$@" |
||||||
|
;; |
||||||
|
|
||||||
|
*) |
||||||
|
echo "Unknown depmode $depmode" 1>&2 |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
exit 0 |
@ -0,0 +1,81 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: fixed.c,v 1.13 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef HAVE_CONFIG_H |
||||||
|
# include "config.h" |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "global.h" |
||||||
|
|
||||||
|
# include "fixed.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: fixed->abs() |
||||||
|
* DESCRIPTION: return absolute value of a fixed-point number |
||||||
|
*/ |
||||||
|
mad_fixed_t mad_f_abs(mad_fixed_t x) |
||||||
|
{ |
||||||
|
return x < 0 ? -x : x; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: fixed->div() |
||||||
|
* DESCRIPTION: perform division using fixed-point math |
||||||
|
*/ |
||||||
|
mad_fixed_t mad_f_div(mad_fixed_t x, mad_fixed_t y) |
||||||
|
{ |
||||||
|
mad_fixed_t q, r; |
||||||
|
unsigned int bits; |
||||||
|
|
||||||
|
q = mad_f_abs(x / y); |
||||||
|
|
||||||
|
if (x < 0) { |
||||||
|
x = -x; |
||||||
|
y = -y; |
||||||
|
} |
||||||
|
|
||||||
|
r = x % y; |
||||||
|
|
||||||
|
if (y < 0) { |
||||||
|
x = -x; |
||||||
|
y = -y; |
||||||
|
} |
||||||
|
|
||||||
|
if (q > mad_f_intpart(MAD_F_MAX) && |
||||||
|
!(q == -mad_f_intpart(MAD_F_MIN) && r == 0 && (x < 0) != (y < 0))) |
||||||
|
return 0; |
||||||
|
|
||||||
|
for (bits = MAD_F_FRACBITS; bits && r; --bits) { |
||||||
|
q <<= 1, r <<= 1; |
||||||
|
if (r >= y) |
||||||
|
r -= y, ++q; |
||||||
|
} |
||||||
|
|
||||||
|
/* round */ |
||||||
|
if (2 * r >= y) |
||||||
|
++q; |
||||||
|
|
||||||
|
/* fix sign */ |
||||||
|
if ((x < 0) != (y < 0)) |
||||||
|
q = -q; |
||||||
|
|
||||||
|
return q << bits; |
||||||
|
} |
@ -0,0 +1,499 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: fixed.h,v 1.38 2004/02/17 02:02:03 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_FIXED_H |
||||||
|
# define LIBMAD_FIXED_H |
||||||
|
|
||||||
|
# if SIZEOF_INT >= 4 |
||||||
|
typedef signed int mad_fixed_t; |
||||||
|
|
||||||
|
typedef signed int mad_fixed64hi_t; |
||||||
|
typedef unsigned int mad_fixed64lo_t; |
||||||
|
# else |
||||||
|
typedef signed long mad_fixed_t; |
||||||
|
|
||||||
|
typedef signed long mad_fixed64hi_t; |
||||||
|
typedef unsigned long mad_fixed64lo_t; |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(_MSC_VER) |
||||||
|
# define mad_fixed64_t signed __int64 |
||||||
|
# elif 1 || defined(__GNUC__) |
||||||
|
# define mad_fixed64_t signed long long |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(FPM_FLOAT) |
||||||
|
typedef double mad_sample_t; |
||||||
|
# else |
||||||
|
typedef mad_fixed_t mad_sample_t; |
||||||
|
# endif |
||||||
|
|
||||||
|
/*
|
||||||
|
* Fixed-point format: 0xABBBBBBB |
||||||
|
* A == whole part (sign + 3 bits) |
||||||
|
* B == fractional part (28 bits) |
||||||
|
* |
||||||
|
* Values are signed two's complement, so the effective range is: |
||||||
|
* 0x80000000 to 0x7fffffff |
||||||
|
* -8.0 to +7.9999999962747097015380859375 |
||||||
|
* |
||||||
|
* The smallest representable value is: |
||||||
|
* 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) |
||||||
|
* |
||||||
|
* 28 bits of fractional accuracy represent about |
||||||
|
* 8.6 digits of decimal accuracy. |
||||||
|
* |
||||||
|
* Fixed-point numbers can be added or subtracted as normal |
||||||
|
* integers, but multiplication requires shifting the 64-bit result |
||||||
|
* from 56 fractional bits back to 28 (and rounding.) |
||||||
|
* |
||||||
|
* Changing the definition of MAD_F_FRACBITS is only partially |
||||||
|
* supported, and must be done with care. |
||||||
|
*/ |
||||||
|
|
||||||
|
# define MAD_F_FRACBITS 28 |
||||||
|
|
||||||
|
# if MAD_F_FRACBITS == 28 |
||||||
|
# define MAD_F(x) ((mad_fixed_t) (x##L)) |
||||||
|
# else |
||||||
|
# if MAD_F_FRACBITS < 28 |
||||||
|
# warning "MAD_F_FRACBITS < 28" |
||||||
|
# define MAD_F(x) ((mad_fixed_t) \ |
||||||
|
(((x##L) + \
|
||||||
|
(1L << (28 - MAD_F_FRACBITS - 1))) >> \
|
||||||
|
(28 - MAD_F_FRACBITS))) |
||||||
|
# elif MAD_F_FRACBITS > 28 |
||||||
|
# error "MAD_F_FRACBITS > 28 not currently supported" |
||||||
|
# define MAD_F(x) ((mad_fixed_t) \ |
||||||
|
((x##L) << (MAD_F_FRACBITS - 28))) |
||||||
|
# endif |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_MIN ((mad_fixed_t) -0x80000000L) |
||||||
|
# define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) |
||||||
|
|
||||||
|
# define MAD_F_ONE MAD_F(0x10000000) |
||||||
|
|
||||||
|
# define mad_f_tofixed(x) ((mad_fixed_t) \ |
||||||
|
((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) |
||||||
|
# define mad_f_todouble(x) ((double) \ |
||||||
|
((x) / (double) (1L << MAD_F_FRACBITS))) |
||||||
|
|
||||||
|
# define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) |
||||||
|
# define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) |
||||||
|
/* (x should be positive) */ |
||||||
|
|
||||||
|
# define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) |
||||||
|
|
||||||
|
# define mad_f_add(x, y) ((x) + (y)) |
||||||
|
# define mad_f_sub(x, y) ((x) - (y)) |
||||||
|
|
||||||
|
# if defined(FPM_FLOAT) |
||||||
|
# error "FPM_FLOAT not yet supported" |
||||||
|
|
||||||
|
# undef MAD_F |
||||||
|
# define MAD_F(x) mad_f_todouble(x) |
||||||
|
|
||||||
|
# define mad_f_mul(x, y) ((x) * (y)) |
||||||
|
# define mad_f_scale64 |
||||||
|
|
||||||
|
# undef ASO_ZEROCHECK |
||||||
|
|
||||||
|
# elif defined(FPM_64BIT) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This version should be the most accurate if 64-bit types are supported by |
||||||
|
* the compiler, although it may not be the most efficient. |
||||||
|
*/ |
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
((mad_fixed_t) \
|
||||||
|
((((mad_fixed64_t) (x) * (y)) + \
|
||||||
|
(1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) |
||||||
|
# else |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
|
||||||
|
/* --- Intel --------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_INTEL) |
||||||
|
|
||||||
|
# if defined(_MSC_VER) |
||||||
|
# pragma warning(push) |
||||||
|
# pragma warning(disable: 4035) /* no return value */ |
||||||
|
static __forceinline |
||||||
|
mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) |
||||||
|
{ |
||||||
|
enum { |
||||||
|
fracbits = MAD_F_FRACBITS |
||||||
|
}; |
||||||
|
|
||||||
|
__asm { |
||||||
|
mov eax, x |
||||||
|
imul y |
||||||
|
shrd eax, edx, fracbits |
||||||
|
} |
||||||
|
|
||||||
|
/* implicit return of eax */ |
||||||
|
} |
||||||
|
# pragma warning(pop) |
||||||
|
|
||||||
|
# define mad_f_mul mad_f_mul_inline |
||||||
|
# define mad_f_scale64 |
||||||
|
# else |
||||||
|
/*
|
||||||
|
* This Intel version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("imull %3" \
|
||||||
|
: "=a" (lo), "=d" (hi) \
|
||||||
|
: "%a" (x), "rm" (y) \
|
||||||
|
: "cc") |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* This gives best accuracy but is not very fast. |
||||||
|
*/ |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
({ mad_fixed64hi_t __hi; \
|
||||||
|
mad_fixed64lo_t __lo; \
|
||||||
|
MAD_F_MLX(__hi, __lo, (x), (y)); \
|
||||||
|
asm ("addl %2,%0\n\t" \
|
||||||
|
"adcl %3,%1" \
|
||||||
|
: "=rm" (lo), "=rm" (hi) \
|
||||||
|
: "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \
|
||||||
|
: "cc"); \
|
||||||
|
}) |
||||||
|
# endif /* OPT_ACCURACY */ |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* Surprisingly, this is faster than SHRD followed by ADC. |
||||||
|
*/ |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed64hi_t __hi_; \
|
||||||
|
mad_fixed64lo_t __lo_; \
|
||||||
|
mad_fixed_t __result; \
|
||||||
|
asm ("addl %4,%2\n\t" \
|
||||||
|
"adcl %5,%3" \
|
||||||
|
: "=rm" (__lo_), "=rm" (__hi_) \
|
||||||
|
: "0" (lo), "1" (hi), \
|
||||||
|
"ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \
|
||||||
|
: "cc"); \
|
||||||
|
asm ("shrdl %3,%2,%1" \
|
||||||
|
: "=rm" (__result) \
|
||||||
|
: "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# elif defined(OPT_INTEL) |
||||||
|
/*
|
||||||
|
* Alternate Intel scaling that may or may not perform better. |
||||||
|
*/ |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("shrl %3,%1\n\t" \
|
||||||
|
"shll %4,%2\n\t" \
|
||||||
|
"orl %2,%1" \
|
||||||
|
: "=rm" (__result) \
|
||||||
|
: "0" (lo), "r" (hi), \
|
||||||
|
"I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("shrdl %3,%2,%1" \
|
||||||
|
: "=rm" (__result) \
|
||||||
|
: "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# endif /* OPT_ACCURACY */ |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
# endif |
||||||
|
|
||||||
|
/* --- ARM ----------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_ARM) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This ARM V4 version is as accurate as FPM_64BIT but much faster. The |
||||||
|
* least significant bit is properly rounded at no CPU cycle cost! |
||||||
|
*/ |
||||||
|
# if 1 |
||||||
|
/*
|
||||||
|
* This is faster than the default implementation via MAD_F_MLX() and |
||||||
|
* mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
({ mad_fixed64hi_t __hi; \
|
||||||
|
mad_fixed64lo_t __lo; \
|
||||||
|
mad_fixed_t __result; \
|
||||||
|
asm ("smull %0, %1, %3, %4\n\t" \
|
||||||
|
"movs %0, %0, lsr %5\n\t" \
|
||||||
|
"adc %2, %0, %1, lsl %6" \
|
||||||
|
: "=&r" (__lo), "=&r" (__hi), "=r" (__result) \
|
||||||
|
: "%r" (x), "r" (y), \
|
||||||
|
"M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("smull %0, %1, %2, %3" \
|
||||||
|
: "=&r" (lo), "=&r" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
|
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
asm ("smlal %0, %1, %2, %3" \
|
||||||
|
: "+r" (lo), "+r" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
|
||||||
|
# define MAD_F_MLN(hi, lo) \ |
||||||
|
asm ("rsbs %0, %2, #0\n\t" \
|
||||||
|
"rsc %1, %3, #0" \
|
||||||
|
: "=r" (lo), "=r" (hi) \
|
||||||
|
: "0" (lo), "1" (hi) \
|
||||||
|
: "cc") |
||||||
|
|
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("movs %0, %1, lsr %3\n\t" \
|
||||||
|
"adc %0, %0, %2, lsl %4" \
|
||||||
|
: "=&r" (__result) \
|
||||||
|
: "r" (lo), "r" (hi), \
|
||||||
|
"M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
|
||||||
|
/* --- MIPS ---------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_MIPS) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This MIPS version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("mult %2,%3" \
|
||||||
|
: "=l" (lo), "=h" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
|
||||||
|
# if defined(HAVE_MADD_ASM) |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
asm ("madd %2,%3" \
|
||||||
|
: "+l" (lo), "+h" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
# elif defined(HAVE_MADD16_ASM) |
||||||
|
/*
|
||||||
|
* This loses significant accuracy due to the 16-bit integer limit in the |
||||||
|
* multiply/accumulate instruction. |
||||||
|
*/ |
||||||
|
# define MAD_F_ML0(hi, lo, x, y) \ |
||||||
|
asm ("mult %2,%3" \
|
||||||
|
: "=l" (lo), "=h" (hi) \
|
||||||
|
: "%r" ((x) >> 12), "r" ((y) >> 16)) |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
asm ("madd16 %2,%3" \
|
||||||
|
: "+l" (lo), "+h" (hi) \
|
||||||
|
: "%r" ((x) >> 12), "r" ((y) >> 16)) |
||||||
|
# define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_SPEED) |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) |
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
# endif |
||||||
|
|
||||||
|
/* --- SPARC --------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_SPARC) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This SPARC V8 version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("smul %2, %3, %0\n\t" \
|
||||||
|
"rd %%y, %1" \
|
||||||
|
: "=r" (lo), "=r" (hi) \
|
||||||
|
: "%r" (x), "rI" (y)) |
||||||
|
|
||||||
|
/* --- PowerPC ------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_PPC) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This PowerPC version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
do { \
|
||||||
|
asm ("mullw %0,%1,%2" \
|
||||||
|
: "=r" (lo) \
|
||||||
|
: "%r" (x), "r" (y)); \
|
||||||
|
asm ("mulhw %0,%1,%2" \
|
||||||
|
: "=r" (hi) \
|
||||||
|
: "%r" (x), "r" (y)); \
|
||||||
|
} \
|
||||||
|
while (0) |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* This gives best accuracy but is not very fast. |
||||||
|
*/ |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
({ mad_fixed64hi_t __hi; \
|
||||||
|
mad_fixed64lo_t __lo; \
|
||||||
|
MAD_F_MLX(__hi, __lo, (x), (y)); \
|
||||||
|
asm ("addc %0,%2,%3\n\t" \
|
||||||
|
"adde %1,%4,%5" \
|
||||||
|
: "=r" (lo), "=r" (hi) \
|
||||||
|
: "%r" (lo), "r" (__lo), \
|
||||||
|
"%r" (hi), "r" (__hi) \
|
||||||
|
: "xer"); \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* This is slower than the truncating version below it. |
||||||
|
*/ |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result, __round; \
|
||||||
|
asm ("rotrwi %0,%1,%2" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "r" (lo), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
asm ("extrwi %0,%1,1,0" \
|
||||||
|
: "=r" (__round) \
|
||||||
|
: "r" (__result)); \
|
||||||
|
asm ("insrwi %0,%1,%2,0" \
|
||||||
|
: "+r" (__result) \
|
||||||
|
: "r" (hi), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
asm ("add %0,%1,%2" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "%r" (__result), "r" (__round)); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("rotrwi %0,%1,%2" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "r" (lo), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
asm ("insrwi %0,%1,%2,0" \
|
||||||
|
: "+r" (__result) \
|
||||||
|
: "r" (hi), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
|
||||||
|
/* --- Default ------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_DEFAULT) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This version is the most portable but it loses significant accuracy. |
||||||
|
* Furthermore, accuracy is biased against the second argument, so care |
||||||
|
* should be taken when ordering operands. |
||||||
|
* |
||||||
|
* The scale factors are constant as this is not used with SSO. |
||||||
|
* |
||||||
|
* Pre-rounding is required to stay within the limits of compliance. |
||||||
|
*/ |
||||||
|
# if defined(OPT_SPEED) |
||||||
|
# define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16)) |
||||||
|
# else |
||||||
|
# define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) * \ |
||||||
|
(((y) + (1L << 15)) >> 16)) |
||||||
|
# endif |
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# else |
||||||
|
# error "no FPM selected" |
||||||
|
# endif |
||||||
|
|
||||||
|
/* default implementations */ |
||||||
|
|
||||||
|
# if !defined(mad_f_mul) |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
({ register mad_fixed64hi_t __hi; \
|
||||||
|
register mad_fixed64lo_t __lo; \
|
||||||
|
MAD_F_MLX(__hi, __lo, (x), (y)); \
|
||||||
|
mad_f_scale64(__hi, __lo); \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_MLA) |
||||||
|
# define MAD_F_ML0(hi, lo, x, y) ((lo) = mad_f_mul((x), (y))) |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y))) |
||||||
|
# define MAD_F_MLN(hi, lo) ((lo) = -(lo)) |
||||||
|
# define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_ML0) |
||||||
|
# define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_MLN) |
||||||
|
# define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_MLZ) |
||||||
|
# define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(mad_f_scale64) |
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
((((mad_fixed_t) \
|
||||||
|
(((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \
|
||||||
|
((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
((mad_fixed_t) \
|
||||||
|
(((hi) << (32 - MAD_F_SCALEBITS)) | \
|
||||||
|
((lo) >> MAD_F_SCALEBITS))) |
||||||
|
# endif |
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
# endif |
||||||
|
|
||||||
|
/* C routines */ |
||||||
|
|
||||||
|
mad_fixed_t mad_f_abs(mad_fixed_t); |
||||||
|
mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t); |
||||||
|
|
||||||
|
# endif |
@ -0,0 +1,503 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: frame.c,v 1.29 2004/02/04 22:59:19 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef HAVE_CONFIG_H |
||||||
|
# include "config.h" |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "global.h" |
||||||
|
|
||||||
|
# include <stdlib.h> |
||||||
|
|
||||||
|
# include "bit.h" |
||||||
|
# include "stream.h" |
||||||
|
# include "frame.h" |
||||||
|
# include "timer.h" |
||||||
|
# include "layer12.h" |
||||||
|
# include "layer3.h" |
||||||
|
|
||||||
|
static |
||||||
|
unsigned long const bitrate_table[5][15] = { |
||||||
|
/* MPEG-1 */ |
||||||
|
{ 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, /* Layer I */ |
||||||
|
256000, 288000, 320000, 352000, 384000, 416000, 448000 }, |
||||||
|
{ 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer II */ |
||||||
|
128000, 160000, 192000, 224000, 256000, 320000, 384000 }, |
||||||
|
{ 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, /* Layer III */ |
||||||
|
112000, 128000, 160000, 192000, 224000, 256000, 320000 }, |
||||||
|
|
||||||
|
/* MPEG-2 LSF */ |
||||||
|
{ 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer I */ |
||||||
|
128000, 144000, 160000, 176000, 192000, 224000, 256000 }, |
||||||
|
{ 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, /* Layers */ |
||||||
|
64000, 80000, 96000, 112000, 128000, 144000, 160000 } /* II & III */ |
||||||
|
}; |
||||||
|
|
||||||
|
static |
||||||
|
unsigned int const samplerate_table[3] = { 44100, 48000, 32000 }; |
||||||
|
|
||||||
|
static |
||||||
|
int (*const decoder_table[3])(struct mad_stream *, struct mad_frame *) = { |
||||||
|
mad_layer_I, |
||||||
|
mad_layer_II, |
||||||
|
mad_layer_III |
||||||
|
}; |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: header->init() |
||||||
|
* DESCRIPTION: initialize header struct |
||||||
|
*/ |
||||||
|
void mad_header_init(struct mad_header *header) |
||||||
|
{ |
||||||
|
header->layer = 0; |
||||||
|
header->mode = 0; |
||||||
|
header->mode_extension = 0; |
||||||
|
header->emphasis = 0; |
||||||
|
|
||||||
|
header->bitrate = 0; |
||||||
|
header->samplerate = 0; |
||||||
|
|
||||||
|
header->crc_check = 0; |
||||||
|
header->crc_target = 0; |
||||||
|
|
||||||
|
header->flags = 0; |
||||||
|
header->private_bits = 0; |
||||||
|
|
||||||
|
header->duration = mad_timer_zero; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: frame->init() |
||||||
|
* DESCRIPTION: initialize frame struct |
||||||
|
*/ |
||||||
|
void mad_frame_init(struct mad_frame *frame) |
||||||
|
{ |
||||||
|
mad_header_init(&frame->header); |
||||||
|
|
||||||
|
frame->options = 0; |
||||||
|
|
||||||
|
frame->overlap = 0; |
||||||
|
mad_frame_mute(frame); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: frame->finish() |
||||||
|
* DESCRIPTION: deallocate any dynamic memory associated with frame |
||||||
|
*/ |
||||||
|
void mad_frame_finish(struct mad_frame *frame) |
||||||
|
{ |
||||||
|
mad_header_finish(&frame->header); |
||||||
|
|
||||||
|
if (frame->overlap) { |
||||||
|
free(frame->overlap); |
||||||
|
frame->overlap = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: decode_header() |
||||||
|
* DESCRIPTION: read header data and following CRC word |
||||||
|
*/ |
||||||
|
static |
||||||
|
int decode_header(struct mad_header *header, struct mad_stream *stream) |
||||||
|
{ |
||||||
|
unsigned int index; |
||||||
|
|
||||||
|
header->flags = 0; |
||||||
|
header->private_bits = 0; |
||||||
|
|
||||||
|
/* header() */ |
||||||
|
|
||||||
|
/* syncword */ |
||||||
|
mad_bit_skip(&stream->ptr, 11); |
||||||
|
|
||||||
|
/* MPEG 2.5 indicator (really part of syncword) */ |
||||||
|
if (mad_bit_read(&stream->ptr, 1) == 0) |
||||||
|
header->flags |= MAD_FLAG_MPEG_2_5_EXT; |
||||||
|
|
||||||
|
/* ID */ |
||||||
|
if (mad_bit_read(&stream->ptr, 1) == 0) |
||||||
|
header->flags |= MAD_FLAG_LSF_EXT; |
||||||
|
else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { |
||||||
|
stream->error = MAD_ERROR_LOSTSYNC; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
/* layer */ |
||||||
|
header->layer = 4 - mad_bit_read(&stream->ptr, 2); |
||||||
|
|
||||||
|
if (header->layer == 4) { |
||||||
|
stream->error = MAD_ERROR_BADLAYER; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
/* protection_bit */ |
||||||
|
if (mad_bit_read(&stream->ptr, 1) == 0) { |
||||||
|
header->flags |= MAD_FLAG_PROTECTION; |
||||||
|
header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff); |
||||||
|
} |
||||||
|
|
||||||
|
/* bitrate_index */ |
||||||
|
index = mad_bit_read(&stream->ptr, 4); |
||||||
|
|
||||||
|
if (index == 15) { |
||||||
|
stream->error = MAD_ERROR_BADBITRATE; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
if (header->flags & MAD_FLAG_LSF_EXT) |
||||||
|
header->bitrate = bitrate_table[3 + (header->layer >> 1)][index]; |
||||||
|
else |
||||||
|
header->bitrate = bitrate_table[header->layer - 1][index]; |
||||||
|
|
||||||
|
/* sampling_frequency */ |
||||||
|
index = mad_bit_read(&stream->ptr, 2); |
||||||
|
|
||||||
|
if (index == 3) { |
||||||
|
stream->error = MAD_ERROR_BADSAMPLERATE; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
header->samplerate = samplerate_table[index]; |
||||||
|
|
||||||
|
if (header->flags & MAD_FLAG_LSF_EXT) { |
||||||
|
header->samplerate /= 2; |
||||||
|
|
||||||
|
if (header->flags & MAD_FLAG_MPEG_2_5_EXT) |
||||||
|
header->samplerate /= 2; |
||||||
|
} |
||||||
|
|
||||||
|
/* padding_bit */ |
||||||
|
if (mad_bit_read(&stream->ptr, 1)) |
||||||
|
header->flags |= MAD_FLAG_PADDING; |
||||||
|
|
||||||
|
/* private_bit */ |
||||||
|
if (mad_bit_read(&stream->ptr, 1)) |
||||||
|
header->private_bits |= MAD_PRIVATE_HEADER; |
||||||
|
|
||||||
|
/* mode */ |
||||||
|
header->mode = 3 - mad_bit_read(&stream->ptr, 2); |
||||||
|
|
||||||
|
/* mode_extension */ |
||||||
|
header->mode_extension = mad_bit_read(&stream->ptr, 2); |
||||||
|
|
||||||
|
/* copyright */ |
||||||
|
if (mad_bit_read(&stream->ptr, 1)) |
||||||
|
header->flags |= MAD_FLAG_COPYRIGHT; |
||||||
|
|
||||||
|
/* original/copy */ |
||||||
|
if (mad_bit_read(&stream->ptr, 1)) |
||||||
|
header->flags |= MAD_FLAG_ORIGINAL; |
||||||
|
|
||||||
|
/* emphasis */ |
||||||
|
header->emphasis = mad_bit_read(&stream->ptr, 2); |
||||||
|
|
||||||
|
# if defined(OPT_STRICT) |
||||||
|
/*
|
||||||
|
* ISO/IEC 11172-3 says this is a reserved emphasis value, but |
||||||
|
* streams exist which use it anyway. Since the value is not important |
||||||
|
* to the decoder proper, we allow it unless OPT_STRICT is defined. |
||||||
|
*/ |
||||||
|
if (header->emphasis == MAD_EMPHASIS_RESERVED) { |
||||||
|
stream->error = MAD_ERROR_BADEMPHASIS; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
# endif |
||||||
|
|
||||||
|
/* error_check() */ |
||||||
|
|
||||||
|
/* crc_check */ |
||||||
|
if (header->flags & MAD_FLAG_PROTECTION) |
||||||
|
header->crc_target = mad_bit_read(&stream->ptr, 16); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: free_bitrate() |
||||||
|
* DESCRIPTION: attempt to discover the bitstream's free bitrate |
||||||
|
*/ |
||||||
|
static |
||||||
|
int free_bitrate(struct mad_stream *stream, struct mad_header const *header) |
||||||
|
{ |
||||||
|
struct mad_bitptr keep_ptr; |
||||||
|
unsigned long rate = 0; |
||||||
|
unsigned int pad_slot, slots_per_frame; |
||||||
|
unsigned char const *ptr = 0; |
||||||
|
|
||||||
|
keep_ptr = stream->ptr; |
||||||
|
|
||||||
|
pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; |
||||||
|
slots_per_frame = (header->layer == MAD_LAYER_III && |
||||||
|
(header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; |
||||||
|
|
||||||
|
while (mad_stream_sync(stream) == 0) { |
||||||
|
struct mad_stream peek_stream; |
||||||
|
struct mad_header peek_header; |
||||||
|
|
||||||
|
peek_stream = *stream; |
||||||
|
peek_header = *header; |
||||||
|
|
||||||
|
if (decode_header(&peek_header, &peek_stream) == 0 && |
||||||
|
peek_header.layer == header->layer && |
||||||
|
peek_header.samplerate == header->samplerate) { |
||||||
|
unsigned int N; |
||||||
|
|
||||||
|
ptr = mad_bit_nextbyte(&stream->ptr); |
||||||
|
|
||||||
|
N = ptr - stream->this_frame; |
||||||
|
|
||||||
|
if (header->layer == MAD_LAYER_I) { |
||||||
|
rate = (unsigned long) header->samplerate * |
||||||
|
(N - 4 * pad_slot + 4) / 48 / 1000; |
||||||
|
} |
||||||
|
else { |
||||||
|
rate = (unsigned long) header->samplerate * |
||||||
|
(N - pad_slot + 1) / slots_per_frame / 1000; |
||||||
|
} |
||||||
|
|
||||||
|
if (rate >= 8) |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
mad_bit_skip(&stream->ptr, 8); |
||||||
|
} |
||||||
|
|
||||||
|
stream->ptr = keep_ptr; |
||||||
|
|
||||||
|
if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) { |
||||||
|
stream->error = MAD_ERROR_LOSTSYNC; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
stream->freerate = rate * 1000; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: header->decode() |
||||||
|
* DESCRIPTION: read the next frame header from the stream |
||||||
|
*/ |
||||||
|
int mad_header_decode(struct mad_header *header, struct mad_stream *stream) |
||||||
|
{ |
||||||
|
register unsigned char const *ptr, *end; |
||||||
|
unsigned int pad_slot, N; |
||||||
|
|
||||||
|
ptr = stream->next_frame; |
||||||
|
end = stream->bufend; |
||||||
|
|
||||||
|
if (ptr == 0) { |
||||||
|
stream->error = MAD_ERROR_BUFPTR; |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
/* stream skip */ |
||||||
|
if (stream->skiplen) { |
||||||
|
if (!stream->sync) |
||||||
|
ptr = stream->this_frame; |
||||||
|
|
||||||
|
if (end - ptr < stream->skiplen) { |
||||||
|
stream->skiplen -= end - ptr; |
||||||
|
stream->next_frame = end; |
||||||
|
|
||||||
|
stream->error = MAD_ERROR_BUFLEN; |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
ptr += stream->skiplen; |
||||||
|
stream->skiplen = 0; |
||||||
|
|
||||||
|
stream->sync = 1; |
||||||
|
} |
||||||
|
|
||||||
|
sync: |
||||||
|
/* synchronize */ |
||||||
|
if (stream->sync) { |
||||||
|
if (end - ptr < MAD_BUFFER_GUARD) { |
||||||
|
stream->next_frame = ptr; |
||||||
|
|
||||||
|
stream->error = MAD_ERROR_BUFLEN; |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
else if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { |
||||||
|
/* mark point where frame sync word was expected */ |
||||||
|
stream->this_frame = ptr; |
||||||
|
stream->next_frame = ptr + 1; |
||||||
|
|
||||||
|
stream->error = MAD_ERROR_LOSTSYNC; |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
mad_bit_init(&stream->ptr, ptr); |
||||||
|
|
||||||
|
if (mad_stream_sync(stream) == -1) { |
||||||
|
if (end - stream->next_frame >= MAD_BUFFER_GUARD) |
||||||
|
stream->next_frame = end - MAD_BUFFER_GUARD; |
||||||
|
|
||||||
|
stream->error = MAD_ERROR_BUFLEN; |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
ptr = mad_bit_nextbyte(&stream->ptr); |
||||||
|
} |
||||||
|
|
||||||
|
/* begin processing */ |
||||||
|
stream->this_frame = ptr; |
||||||
|
stream->next_frame = ptr + 1; /* possibly bogus sync word */ |
||||||
|
|
||||||
|
mad_bit_init(&stream->ptr, stream->this_frame); |
||||||
|
|
||||||
|
if (decode_header(header, stream) == -1) |
||||||
|
goto fail; |
||||||
|
|
||||||
|
/* calculate frame duration */ |
||||||
|
mad_timer_set(&header->duration, 0, |
||||||
|
32 * MAD_NSBSAMPLES(header), header->samplerate); |
||||||
|
|
||||||
|
/* calculate free bit rate */ |
||||||
|
if (header->bitrate == 0) { |
||||||
|
if ((stream->freerate == 0 || !stream->sync || |
||||||
|
(header->layer == MAD_LAYER_III && stream->freerate > 640000)) && |
||||||
|
free_bitrate(stream, header) == -1) |
||||||
|
goto fail; |
||||||
|
|
||||||
|
header->bitrate = stream->freerate; |
||||||
|
header->flags |= MAD_FLAG_FREEFORMAT; |
||||||
|
} |
||||||
|
|
||||||
|
/* calculate beginning of next frame */ |
||||||
|
pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; |
||||||
|
|
||||||
|
if (header->layer == MAD_LAYER_I) |
||||||
|
N = ((12 * header->bitrate / header->samplerate) + pad_slot) * 4; |
||||||
|
else { |
||||||
|
unsigned int slots_per_frame; |
||||||
|
|
||||||
|
slots_per_frame = (header->layer == MAD_LAYER_III && |
||||||
|
(header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; |
||||||
|
|
||||||
|
N = (slots_per_frame * header->bitrate / header->samplerate) + pad_slot; |
||||||
|
} |
||||||
|
|
||||||
|
/* verify there is enough data left in buffer to decode this frame */ |
||||||
|
if (N + MAD_BUFFER_GUARD > end - stream->this_frame) { |
||||||
|
stream->next_frame = stream->this_frame; |
||||||
|
|
||||||
|
stream->error = MAD_ERROR_BUFLEN; |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
stream->next_frame = stream->this_frame + N; |
||||||
|
|
||||||
|
if (!stream->sync) { |
||||||
|
/* check that a valid frame header follows this frame */ |
||||||
|
|
||||||
|
ptr = stream->next_frame; |
||||||
|
if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { |
||||||
|
ptr = stream->next_frame = stream->this_frame + 1; |
||||||
|
goto sync; |
||||||
|
} |
||||||
|
|
||||||
|
stream->sync = 1; |
||||||
|
} |
||||||
|
|
||||||
|
header->flags |= MAD_FLAG_INCOMPLETE; |
||||||
|
|
||||||
|
return 0; |
||||||
|
|
||||||
|
fail: |
||||||
|
stream->sync = 0; |
||||||
|
|
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: frame->decode() |
||||||
|
* DESCRIPTION: decode a single frame from a bitstream |
||||||
|
*/ |
||||||
|
int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream) |
||||||
|
{ |
||||||
|
frame->options = stream->options; |
||||||
|
|
||||||
|
/* header() */ |
||||||
|
/* error_check() */ |
||||||
|
|
||||||
|
if (!(frame->header.flags & MAD_FLAG_INCOMPLETE) && |
||||||
|
mad_header_decode(&frame->header, stream) == -1) |
||||||
|
goto fail; |
||||||
|
|
||||||
|
/* audio_data() */ |
||||||
|
|
||||||
|
frame->header.flags &= ~MAD_FLAG_INCOMPLETE; |
||||||
|
|
||||||
|
if (decoder_table[frame->header.layer - 1](stream, frame) == -1) { |
||||||
|
if (!MAD_RECOVERABLE(stream->error)) |
||||||
|
stream->next_frame = stream->this_frame; |
||||||
|
|
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
/* ancillary_data() */ |
||||||
|
|
||||||
|
if (frame->header.layer != MAD_LAYER_III) { |
||||||
|
struct mad_bitptr next_frame; |
||||||
|
|
||||||
|
mad_bit_init(&next_frame, stream->next_frame); |
||||||
|
|
||||||
|
stream->anc_ptr = stream->ptr; |
||||||
|
stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame); |
||||||
|
|
||||||
|
mad_bit_finish(&next_frame); |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
|
||||||
|
fail: |
||||||
|
stream->anc_bitlen = 0; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: frame->mute() |
||||||
|
* DESCRIPTION: zero all subband values so the frame becomes silent |
||||||
|
*/ |
||||||
|
void mad_frame_mute(struct mad_frame *frame) |
||||||
|
{ |
||||||
|
unsigned int s, sb; |
||||||
|
|
||||||
|
for (s = 0; s < 36; ++s) { |
||||||
|
for (sb = 0; sb < 32; ++sb) { |
||||||
|
frame->sbsample[0][s][sb] = |
||||||
|
frame->sbsample[1][s][sb] = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (frame->overlap) { |
||||||
|
for (s = 0; s < 18; ++s) { |
||||||
|
for (sb = 0; sb < 32; ++sb) { |
||||||
|
(*frame->overlap)[0][sb][s] = |
||||||
|
(*frame->overlap)[1][sb][s] = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,118 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: frame.h,v 1.20 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_FRAME_H |
||||||
|
# define LIBMAD_FRAME_H |
||||||
|
|
||||||
|
# include "fixed.h" |
||||||
|
# include "timer.h" |
||||||
|
# include "stream.h" |
||||||
|
|
||||||
|
enum mad_layer { |
||||||
|
MAD_LAYER_I = 1, /* Layer I */ |
||||||
|
MAD_LAYER_II = 2, /* Layer II */ |
||||||
|
MAD_LAYER_III = 3 /* Layer III */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum mad_mode { |
||||||
|
MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ |
||||||
|
MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ |
||||||
|
MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ |
||||||
|
MAD_MODE_STEREO = 3 /* normal LR stereo */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum mad_emphasis { |
||||||
|
MAD_EMPHASIS_NONE = 0, /* no emphasis */ |
||||||
|
MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ |
||||||
|
MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ |
||||||
|
MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_header { |
||||||
|
enum mad_layer layer; /* audio layer (1, 2, or 3) */ |
||||||
|
enum mad_mode mode; /* channel mode (see above) */ |
||||||
|
int mode_extension; /* additional mode info */ |
||||||
|
enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ |
||||||
|
|
||||||
|
unsigned long bitrate; /* stream bitrate (bps) */ |
||||||
|
unsigned int samplerate; /* sampling frequency (Hz) */ |
||||||
|
|
||||||
|
unsigned short crc_check; /* frame CRC accumulator */ |
||||||
|
unsigned short crc_target; /* final target CRC checksum */ |
||||||
|
|
||||||
|
int flags; /* flags (see below) */ |
||||||
|
int private_bits; /* private bits (see below) */ |
||||||
|
|
||||||
|
mad_timer_t duration; /* audio playing time of frame */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_frame { |
||||||
|
struct mad_header header; /* MPEG audio header */ |
||||||
|
|
||||||
|
int options; /* decoding options (from stream) */ |
||||||
|
|
||||||
|
mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */ |
||||||
|
mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */ |
||||||
|
}; |
||||||
|
|
||||||
|
# define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) |
||||||
|
# define MAD_NSBSAMPLES(header) \ |
||||||
|
((header)->layer == MAD_LAYER_I ? 12 : \
|
||||||
|
(((header)->layer == MAD_LAYER_III && \
|
||||||
|
((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) |
||||||
|
|
||||||
|
enum { |
||||||
|
MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ |
||||||
|
MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ |
||||||
|
|
||||||
|
MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ |
||||||
|
MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ |
||||||
|
MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ |
||||||
|
MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ |
||||||
|
|
||||||
|
MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ |
||||||
|
MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ |
||||||
|
MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ |
||||||
|
|
||||||
|
MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ |
||||||
|
MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ |
||||||
|
MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum { |
||||||
|
MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ |
||||||
|
MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_header_init(struct mad_header *); |
||||||
|
|
||||||
|
# define mad_header_finish(header) /* nothing */ |
||||||
|
|
||||||
|
int mad_header_decode(struct mad_header *, struct mad_stream *); |
||||||
|
|
||||||
|
void mad_frame_init(struct mad_frame *); |
||||||
|
void mad_frame_finish(struct mad_frame *); |
||||||
|
|
||||||
|
int mad_frame_decode(struct mad_frame *, struct mad_stream *); |
||||||
|
|
||||||
|
void mad_frame_mute(struct mad_frame *); |
||||||
|
|
||||||
|
# endif |
@ -0,0 +1,58 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: global.h,v 1.11 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_GLOBAL_H |
||||||
|
# define LIBMAD_GLOBAL_H |
||||||
|
|
||||||
|
/* conditional debugging */ |
||||||
|
|
||||||
|
# if defined(DEBUG) && defined(NDEBUG) |
||||||
|
# error "cannot define both DEBUG and NDEBUG" |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(DEBUG) |
||||||
|
# include <stdio.h> |
||||||
|
# endif |
||||||
|
|
||||||
|
/* conditional features */ |
||||||
|
|
||||||
|
# if defined(OPT_SPEED) && defined(OPT_ACCURACY) |
||||||
|
# error "cannot optimize for both speed and accuracy" |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_SPEED) && !defined(OPT_SSO) |
||||||
|
# define OPT_SSO |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(HAVE_UNISTD_H) && defined(HAVE_WAITPID) && \ |
||||||
|
defined(HAVE_FCNTL) && defined(HAVE_PIPE) && defined(HAVE_FORK) |
||||||
|
# define USE_ASYNC |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(HAVE_ASSERT_H) |
||||||
|
# if defined(NDEBUG) |
||||||
|
# define assert(x) /* nothing */ |
||||||
|
# else |
||||||
|
# define assert(x) do { if (!(x)) abort(); } while (0) |
||||||
|
# endif |
||||||
|
# endif |
||||||
|
|
||||||
|
# endif |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,66 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: huffman.h,v 1.11 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_HUFFMAN_H |
||||||
|
# define LIBMAD_HUFFMAN_H |
||||||
|
|
||||||
|
union huffquad { |
||||||
|
struct { |
||||||
|
unsigned short final : 1; |
||||||
|
unsigned short bits : 3; |
||||||
|
unsigned short offset : 12; |
||||||
|
} ptr; |
||||||
|
struct { |
||||||
|
unsigned short final : 1; |
||||||
|
unsigned short hlen : 3; |
||||||
|
unsigned short v : 1; |
||||||
|
unsigned short w : 1; |
||||||
|
unsigned short x : 1; |
||||||
|
unsigned short y : 1; |
||||||
|
} value; |
||||||
|
unsigned short final : 1; |
||||||
|
}; |
||||||
|
|
||||||
|
union huffpair { |
||||||
|
struct { |
||||||
|
unsigned short final : 1; |
||||||
|
unsigned short bits : 3; |
||||||
|
unsigned short offset : 12; |
||||||
|
} ptr; |
||||||
|
struct { |
||||||
|
unsigned short final : 1; |
||||||
|
unsigned short hlen : 3; |
||||||
|
unsigned short x : 4; |
||||||
|
unsigned short y : 4; |
||||||
|
} value; |
||||||
|
unsigned short final : 1; |
||||||
|
}; |
||||||
|
|
||||||
|
struct hufftable { |
||||||
|
union huffpair const *table; |
||||||
|
unsigned short linbits; |
||||||
|
unsigned short startbits; |
||||||
|
}; |
||||||
|
|
||||||
|
extern union huffquad const *const mad_huff_quad_table[2]; |
||||||
|
extern struct hufftable const mad_huff_pair_table[32]; |
||||||
|
|
||||||
|
# endif |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,62 @@ |
|||||||
|
/* |
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: imdct_s.dat,v 1.8 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
/* 0 */ { MAD_F(0x09bd7ca0) /* 0.608761429 */, |
||||||
|
-MAD_F(0x0ec835e8) /* -0.923879533 */, |
||||||
|
-MAD_F(0x0216a2a2) /* -0.130526192 */, |
||||||
|
MAD_F(0x0fdcf549) /* 0.991444861 */, |
||||||
|
-MAD_F(0x061f78aa) /* -0.382683432 */, |
||||||
|
-MAD_F(0x0cb19346) /* -0.793353340 */ }, |
||||||
|
|
||||||
|
/* 6 */ { -MAD_F(0x0cb19346) /* -0.793353340 */, |
||||||
|
MAD_F(0x061f78aa) /* 0.382683432 */, |
||||||
|
MAD_F(0x0fdcf549) /* 0.991444861 */, |
||||||
|
MAD_F(0x0216a2a2) /* 0.130526192 */, |
||||||
|
-MAD_F(0x0ec835e8) /* -0.923879533 */, |
||||||
|
-MAD_F(0x09bd7ca0) /* -0.608761429 */ }, |
||||||
|
|
||||||
|
/* 1 */ { MAD_F(0x061f78aa) /* 0.382683432 */, |
||||||
|
-MAD_F(0x0ec835e8) /* -0.923879533 */, |
||||||
|
MAD_F(0x0ec835e8) /* 0.923879533 */, |
||||||
|
-MAD_F(0x061f78aa) /* -0.382683432 */, |
||||||
|
-MAD_F(0x061f78aa) /* -0.382683432 */, |
||||||
|
MAD_F(0x0ec835e8) /* 0.923879533 */ }, |
||||||
|
|
||||||
|
/* 7 */ { -MAD_F(0x0ec835e8) /* -0.923879533 */, |
||||||
|
-MAD_F(0x061f78aa) /* -0.382683432 */, |
||||||
|
MAD_F(0x061f78aa) /* 0.382683432 */, |
||||||
|
MAD_F(0x0ec835e8) /* 0.923879533 */, |
||||||
|
MAD_F(0x0ec835e8) /* 0.923879533 */, |
||||||
|
MAD_F(0x061f78aa) /* 0.382683432 */ }, |
||||||
|
|
||||||
|
/* 2 */ { MAD_F(0x0216a2a2) /* 0.130526192 */, |
||||||
|
-MAD_F(0x061f78aa) /* -0.382683432 */, |
||||||
|
MAD_F(0x09bd7ca0) /* 0.608761429 */, |
||||||
|
-MAD_F(0x0cb19346) /* -0.793353340 */, |
||||||
|
MAD_F(0x0ec835e8) /* 0.923879533 */, |
||||||
|
-MAD_F(0x0fdcf549) /* -0.991444861 */ }, |
||||||
|
|
||||||
|
/* 8 */ { -MAD_F(0x0fdcf549) /* -0.991444861 */, |
||||||
|
-MAD_F(0x0ec835e8) /* -0.923879533 */, |
||||||
|
-MAD_F(0x0cb19346) /* -0.793353340 */, |
||||||
|
-MAD_F(0x09bd7ca0) /* -0.608761429 */, |
||||||
|
-MAD_F(0x061f78aa) /* -0.382683432 */, |
||||||
|
-MAD_F(0x0216a2a2) /* -0.130526192 */ } |
@ -0,0 +1,276 @@ |
|||||||
|
#!/bin/sh |
||||||
|
# |
||||||
|
# install - install a program, script, or datafile |
||||||
|
# This comes from X11R5 (mit/util/scripts/install.sh). |
||||||
|
# |
||||||
|
# Copyright 1991 by the Massachusetts Institute of Technology |
||||||
|
# |
||||||
|
# Permission to use, copy, modify, distribute, and sell this software and its |
||||||
|
# documentation for any purpose is hereby granted without fee, provided that |
||||||
|
# the above copyright notice appear in all copies and that both that |
||||||
|
# copyright notice and this permission notice appear in supporting |
||||||
|
# documentation, and that the name of M.I.T. not be used in advertising or |
||||||
|
# publicity pertaining to distribution of the software without specific, |
||||||
|
# written prior permission. M.I.T. makes no representations about the |
||||||
|
# suitability of this software for any purpose. It is provided "as is" |
||||||
|
# without express or implied warranty. |
||||||
|
# |
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent |
||||||
|
# `make' implicit rules from creating a file called install from it |
||||||
|
# when there is no Makefile. |
||||||
|
# |
||||||
|
# This script is compatible with the BSD install script, but was written |
||||||
|
# from scratch. It can only install one file at a time, a restriction |
||||||
|
# shared with many OS's install programs. |
||||||
|
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script |
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it. |
||||||
|
doit="${DOITPROG-}" |
||||||
|
|
||||||
|
|
||||||
|
# put in absolute paths if you don't have them in your path; or use env. vars. |
||||||
|
|
||||||
|
mvprog="${MVPROG-mv}" |
||||||
|
cpprog="${CPPROG-cp}" |
||||||
|
chmodprog="${CHMODPROG-chmod}" |
||||||
|
chownprog="${CHOWNPROG-chown}" |
||||||
|
chgrpprog="${CHGRPPROG-chgrp}" |
||||||
|
stripprog="${STRIPPROG-strip}" |
||||||
|
rmprog="${RMPROG-rm}" |
||||||
|
mkdirprog="${MKDIRPROG-mkdir}" |
||||||
|
|
||||||
|
transformbasename="" |
||||||
|
transform_arg="" |
||||||
|
instcmd="$mvprog" |
||||||
|
chmodcmd="$chmodprog 0755" |
||||||
|
chowncmd="" |
||||||
|
chgrpcmd="" |
||||||
|
stripcmd="" |
||||||
|
rmcmd="$rmprog -f" |
||||||
|
mvcmd="$mvprog" |
||||||
|
src="" |
||||||
|
dst="" |
||||||
|
dir_arg="" |
||||||
|
|
||||||
|
while [ x"$1" != x ]; do |
||||||
|
case $1 in |
||||||
|
-c) instcmd=$cpprog |
||||||
|
shift |
||||||
|
continue;; |
||||||
|
|
||||||
|
-d) dir_arg=true |
||||||
|
shift |
||||||
|
continue;; |
||||||
|
|
||||||
|
-m) chmodcmd="$chmodprog $2" |
||||||
|
shift |
||||||
|
shift |
||||||
|
continue;; |
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2" |
||||||
|
shift |
||||||
|
shift |
||||||
|
continue;; |
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2" |
||||||
|
shift |
||||||
|
shift |
||||||
|
continue;; |
||||||
|
|
||||||
|
-s) stripcmd=$stripprog |
||||||
|
shift |
||||||
|
continue;; |
||||||
|
|
||||||
|
-t=*) transformarg=`echo $1 | sed 's/-t=//'` |
||||||
|
shift |
||||||
|
continue;; |
||||||
|
|
||||||
|
-b=*) transformbasename=`echo $1 | sed 's/-b=//'` |
||||||
|
shift |
||||||
|
continue;; |
||||||
|
|
||||||
|
*) if [ x"$src" = x ] |
||||||
|
then |
||||||
|
src=$1 |
||||||
|
else |
||||||
|
# this colon is to work around a 386BSD /bin/sh bug |
||||||
|
: |
||||||
|
dst=$1 |
||||||
|
fi |
||||||
|
shift |
||||||
|
continue;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
if [ x"$src" = x ] |
||||||
|
then |
||||||
|
echo "$0: no input file specified" >&2 |
||||||
|
exit 1 |
||||||
|
else |
||||||
|
: |
||||||
|
fi |
||||||
|
|
||||||
|
if [ x"$dir_arg" != x ]; then |
||||||
|
dst=$src |
||||||
|
src="" |
||||||
|
|
||||||
|
if [ -d "$dst" ]; then |
||||||
|
instcmd=: |
||||||
|
chmodcmd="" |
||||||
|
else |
||||||
|
instcmd=$mkdirprog |
||||||
|
fi |
||||||
|
else |
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command |
||||||
|
# might cause directories to be created, which would be especially bad |
||||||
|
# if $src (and thus $dsttmp) contains '*'. |
||||||
|
|
||||||
|
if [ -f "$src" ] || [ -d "$src" ] |
||||||
|
then |
||||||
|
: |
||||||
|
else |
||||||
|
echo "$0: $src does not exist" >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
if [ x"$dst" = x ] |
||||||
|
then |
||||||
|
echo "$0: no destination specified" >&2 |
||||||
|
exit 1 |
||||||
|
else |
||||||
|
: |
||||||
|
fi |
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; if your system |
||||||
|
# does not like double slashes in filenames, you may need to add some logic |
||||||
|
|
||||||
|
if [ -d "$dst" ] |
||||||
|
then |
||||||
|
dst=$dst/`basename "$src"` |
||||||
|
else |
||||||
|
: |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
## this sed command emulates the dirname command |
||||||
|
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` |
||||||
|
|
||||||
|
# Make sure that the destination directory exists. |
||||||
|
# this part is taken from Noah Friedman's mkinstalldirs script |
||||||
|
|
||||||
|
# Skip lots of stat calls in the usual case. |
||||||
|
if [ ! -d "$dstdir" ]; then |
||||||
|
defaultIFS=' |
||||||
|
' |
||||||
|
IFS="${IFS-$defaultIFS}" |
||||||
|
|
||||||
|
oIFS=$IFS |
||||||
|
# Some sh's can't handle IFS=/ for some reason. |
||||||
|
IFS='%' |
||||||
|
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` |
||||||
|
IFS=$oIFS |
||||||
|
|
||||||
|
pathcomp='' |
||||||
|
|
||||||
|
while [ $# -ne 0 ] ; do |
||||||
|
pathcomp=$pathcomp$1 |
||||||
|
shift |
||||||
|
|
||||||
|
if [ ! -d "$pathcomp" ] ; |
||||||
|
then |
||||||
|
$mkdirprog "$pathcomp" |
||||||
|
else |
||||||
|
: |
||||||
|
fi |
||||||
|
|
||||||
|
pathcomp=$pathcomp/ |
||||||
|
done |
||||||
|
fi |
||||||
|
|
||||||
|
if [ x"$dir_arg" != x ] |
||||||
|
then |
||||||
|
$doit $instcmd "$dst" && |
||||||
|
|
||||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && |
||||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && |
||||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && |
||||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi |
||||||
|
else |
||||||
|
|
||||||
|
# If we're going to rename the final executable, determine the name now. |
||||||
|
|
||||||
|
if [ x"$transformarg" = x ] |
||||||
|
then |
||||||
|
dstfile=`basename "$dst"` |
||||||
|
else |
||||||
|
dstfile=`basename "$dst" $transformbasename | |
||||||
|
sed $transformarg`$transformbasename |
||||||
|
fi |
||||||
|
|
||||||
|
# don't allow the sed command to completely eliminate the filename |
||||||
|
|
||||||
|
if [ x"$dstfile" = x ] |
||||||
|
then |
||||||
|
dstfile=`basename "$dst"` |
||||||
|
else |
||||||
|
: |
||||||
|
fi |
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory. |
||||||
|
|
||||||
|
dsttmp=$dstdir/#inst.$$# |
||||||
|
rmtmp=$dstdir/#rm.$$# |
||||||
|
|
||||||
|
# Trap to clean up temp files at exit. |
||||||
|
|
||||||
|
trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 |
||||||
|
trap '(exit $?); exit' 1 2 13 15 |
||||||
|
|
||||||
|
# Move or copy the file name to the temp name |
||||||
|
|
||||||
|
$doit $instcmd "$src" "$dsttmp" && |
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits |
||||||
|
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to |
||||||
|
# ignore errors from any of these, just make sure not to ignore |
||||||
|
# errors from the above "$doit $instcmd $src $dsttmp" command. |
||||||
|
|
||||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && |
||||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && |
||||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && |
||||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && |
||||||
|
|
||||||
|
# Now remove or move aside any old file at destination location. We try this |
||||||
|
# two ways since rm can't unlink itself on some systems and the destination |
||||||
|
# file might be busy for other reasons. In this case, the final cleanup |
||||||
|
# might fail but the new file should still install successfully. |
||||||
|
|
||||||
|
{ |
||||||
|
if [ -f "$dstdir/$dstfile" ] |
||||||
|
then |
||||||
|
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || |
||||||
|
$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || |
||||||
|
{ |
||||||
|
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 |
||||||
|
(exit 1); exit |
||||||
|
} |
||||||
|
else |
||||||
|
: |
||||||
|
fi |
||||||
|
} && |
||||||
|
|
||||||
|
# Now rename the file to the real destination. |
||||||
|
|
||||||
|
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile" |
||||||
|
|
||||||
|
fi && |
||||||
|
|
||||||
|
# The final little trick to "correctly" pass the exit status to the exit trap. |
||||||
|
|
||||||
|
{ |
||||||
|
(exit 0); exit |
||||||
|
} |
@ -0,0 +1,534 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: layer12.c,v 1.17 2004/02/05 09:02:39 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef HAVE_CONFIG_H |
||||||
|
# include "config.h" |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "global.h" |
||||||
|
|
||||||
|
# ifdef HAVE_LIMITS_H |
||||||
|
# include <limits.h> |
||||||
|
# else |
||||||
|
# define CHAR_BIT 8 |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "fixed.h" |
||||||
|
# include "bit.h" |
||||||
|
# include "stream.h" |
||||||
|
# include "frame.h" |
||||||
|
# include "layer12.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* scalefactor table |
||||||
|
* used in both Layer I and Layer II decoding |
||||||
|
*/ |
||||||
|
static |
||||||
|
mad_fixed_t const sf_table[64] = { |
||||||
|
# include "sf_table.dat" |
||||||
|
}; |
||||||
|
|
||||||
|
/* --- Layer I ------------------------------------------------------------- */ |
||||||
|
|
||||||
|
/* linear scaling table */ |
||||||
|
static |
||||||
|
mad_fixed_t const linear_table[14] = { |
||||||
|
MAD_F(0x15555555), /* 2^2 / (2^2 - 1) == 1.33333333333333 */ |
||||||
|
MAD_F(0x12492492), /* 2^3 / (2^3 - 1) == 1.14285714285714 */ |
||||||
|
MAD_F(0x11111111), /* 2^4 / (2^4 - 1) == 1.06666666666667 */ |
||||||
|
MAD_F(0x10842108), /* 2^5 / (2^5 - 1) == 1.03225806451613 */ |
||||||
|
MAD_F(0x10410410), /* 2^6 / (2^6 - 1) == 1.01587301587302 */ |
||||||
|
MAD_F(0x10204081), /* 2^7 / (2^7 - 1) == 1.00787401574803 */ |
||||||
|
MAD_F(0x10101010), /* 2^8 / (2^8 - 1) == 1.00392156862745 */ |
||||||
|
MAD_F(0x10080402), /* 2^9 / (2^9 - 1) == 1.00195694716243 */ |
||||||
|
MAD_F(0x10040100), /* 2^10 / (2^10 - 1) == 1.00097751710655 */ |
||||||
|
MAD_F(0x10020040), /* 2^11 / (2^11 - 1) == 1.00048851978505 */ |
||||||
|
MAD_F(0x10010010), /* 2^12 / (2^12 - 1) == 1.00024420024420 */ |
||||||
|
MAD_F(0x10008004), /* 2^13 / (2^13 - 1) == 1.00012208521548 */ |
||||||
|
MAD_F(0x10004001), /* 2^14 / (2^14 - 1) == 1.00006103888177 */ |
||||||
|
MAD_F(0x10002000) /* 2^15 / (2^15 - 1) == 1.00003051850948 */ |
||||||
|
}; |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: I_sample() |
||||||
|
* DESCRIPTION: decode one requantized Layer I sample from a bitstream |
||||||
|
*/ |
||||||
|
static |
||||||
|
mad_fixed_t I_sample(struct mad_bitptr *ptr, unsigned int nb) |
||||||
|
{ |
||||||
|
mad_fixed_t sample; |
||||||
|
|
||||||
|
sample = mad_bit_read(ptr, nb); |
||||||
|
|
||||||
|
/* invert most significant bit, extend sign, then scale to fixed format */ |
||||||
|
|
||||||
|
sample ^= 1 << (nb - 1); |
||||||
|
sample |= -(sample & (1 << (nb - 1))); |
||||||
|
|
||||||
|
sample <<= MAD_F_FRACBITS - (nb - 1); |
||||||
|
|
||||||
|
/* requantize the sample */ |
||||||
|
|
||||||
|
/* s'' = (2^nb / (2^nb - 1)) * (s''' + 2^(-nb + 1)) */ |
||||||
|
|
||||||
|
sample += MAD_F_ONE >> (nb - 1); |
||||||
|
|
||||||
|
return mad_f_mul(sample, linear_table[nb - 2]); |
||||||
|
|
||||||
|
/* s' = factor * s'' */ |
||||||
|
/* (to be performed by caller) */ |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: layer->I() |
||||||
|
* DESCRIPTION: decode a single Layer I frame |
||||||
|
*/ |
||||||
|
int mad_layer_I(struct mad_stream *stream, struct mad_frame *frame) |
||||||
|
{ |
||||||
|
struct mad_header *header = &frame->header; |
||||||
|
unsigned int nch, bound, ch, s, sb, nb; |
||||||
|
unsigned char allocation[2][32], scalefactor[2][32]; |
||||||
|
|
||||||
|
nch = MAD_NCHANNELS(header); |
||||||
|
|
||||||
|
bound = 32; |
||||||
|
if (header->mode == MAD_MODE_JOINT_STEREO) { |
||||||
|
header->flags |= MAD_FLAG_I_STEREO; |
||||||
|
bound = 4 + header->mode_extension * 4; |
||||||
|
} |
||||||
|
|
||||||
|
/* check CRC word */ |
||||||
|
|
||||||
|
if (header->flags & MAD_FLAG_PROTECTION) { |
||||||
|
header->crc_check = |
||||||
|
mad_bit_crc(stream->ptr, 4 * (bound * nch + (32 - bound)), |
||||||
|
header->crc_check); |
||||||
|
|
||||||
|
if (header->crc_check != header->crc_target && |
||||||
|
!(frame->options & MAD_OPTION_IGNORECRC)) { |
||||||
|
stream->error = MAD_ERROR_BADCRC; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* decode bit allocations */ |
||||||
|
|
||||||
|
for (sb = 0; sb < bound; ++sb) { |
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
nb = mad_bit_read(&stream->ptr, 4); |
||||||
|
|
||||||
|
if (nb == 15) { |
||||||
|
stream->error = MAD_ERROR_BADBITALLOC; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
allocation[ch][sb] = nb ? nb + 1 : 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for (sb = bound; sb < 32; ++sb) { |
||||||
|
nb = mad_bit_read(&stream->ptr, 4); |
||||||
|
|
||||||
|
if (nb == 15) { |
||||||
|
stream->error = MAD_ERROR_BADBITALLOC; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
allocation[0][sb] = |
||||||
|
allocation[1][sb] = nb ? nb + 1 : 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* decode scalefactors */ |
||||||
|
|
||||||
|
for (sb = 0; sb < 32; ++sb) { |
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
if (allocation[ch][sb]) { |
||||||
|
scalefactor[ch][sb] = mad_bit_read(&stream->ptr, 6); |
||||||
|
|
||||||
|
# if defined(OPT_STRICT) |
||||||
|
/*
|
||||||
|
* Scalefactor index 63 does not appear in Table B.1 of |
||||||
|
* ISO/IEC 11172-3. Nonetheless, other implementations accept it, |
||||||
|
* so we only reject it if OPT_STRICT is defined. |
||||||
|
*/ |
||||||
|
if (scalefactor[ch][sb] == 63) { |
||||||
|
stream->error = MAD_ERROR_BADSCALEFACTOR; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
# endif |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* decode samples */ |
||||||
|
|
||||||
|
for (s = 0; s < 12; ++s) { |
||||||
|
for (sb = 0; sb < bound; ++sb) { |
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
nb = allocation[ch][sb]; |
||||||
|
frame->sbsample[ch][s][sb] = nb ? |
||||||
|
mad_f_mul(I_sample(&stream->ptr, nb), |
||||||
|
sf_table[scalefactor[ch][sb]]) : 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for (sb = bound; sb < 32; ++sb) { |
||||||
|
if ((nb = allocation[0][sb])) { |
||||||
|
mad_fixed_t sample; |
||||||
|
|
||||||
|
sample = I_sample(&stream->ptr, nb); |
||||||
|
|
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
frame->sbsample[ch][s][sb] = |
||||||
|
mad_f_mul(sample, sf_table[scalefactor[ch][sb]]); |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
for (ch = 0; ch < nch; ++ch) |
||||||
|
frame->sbsample[ch][s][sb] = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* --- Layer II ------------------------------------------------------------ */ |
||||||
|
|
||||||
|
/* possible quantization per subband table */ |
||||||
|
static |
||||||
|
struct { |
||||||
|
unsigned int sblimit; |
||||||
|
unsigned char const offsets[30]; |
||||||
|
} const sbquant_table[5] = { |
||||||
|
/* ISO/IEC 11172-3 Table B.2a */ |
||||||
|
{ 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, /* 0 */ |
||||||
|
3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } }, |
||||||
|
/* ISO/IEC 11172-3 Table B.2b */ |
||||||
|
{ 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, /* 1 */ |
||||||
|
3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } }, |
||||||
|
/* ISO/IEC 11172-3 Table B.2c */ |
||||||
|
{ 8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */ |
||||||
|
/* ISO/IEC 11172-3 Table B.2d */ |
||||||
|
{ 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */ |
||||||
|
/* ISO/IEC 13818-3 Table B.1 */ |
||||||
|
{ 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, /* 4 */ |
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } } |
||||||
|
}; |
||||||
|
|
||||||
|
/* bit allocation table */ |
||||||
|
static |
||||||
|
struct { |
||||||
|
unsigned short nbal; |
||||||
|
unsigned short offset; |
||||||
|
} const bitalloc_table[8] = { |
||||||
|
{ 2, 0 }, /* 0 */ |
||||||
|
{ 2, 3 }, /* 1 */ |
||||||
|
{ 3, 3 }, /* 2 */ |
||||||
|
{ 3, 1 }, /* 3 */ |
||||||
|
{ 4, 2 }, /* 4 */ |
||||||
|
{ 4, 3 }, /* 5 */ |
||||||
|
{ 4, 4 }, /* 6 */ |
||||||
|
{ 4, 5 } /* 7 */ |
||||||
|
}; |
||||||
|
|
||||||
|
/* offsets into quantization class table */ |
||||||
|
static |
||||||
|
unsigned char const offset_table[6][15] = { |
||||||
|
{ 0, 1, 16 }, /* 0 */ |
||||||
|
{ 0, 1, 2, 3, 4, 5, 16 }, /* 1 */ |
||||||
|
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }, /* 2 */ |
||||||
|
{ 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, /* 3 */ |
||||||
|
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 }, /* 4 */ |
||||||
|
{ 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 } /* 5 */ |
||||||
|
}; |
||||||
|
|
||||||
|
/* quantization class table */ |
||||||
|
static |
||||||
|
struct quantclass { |
||||||
|
unsigned short nlevels; |
||||||
|
unsigned char group; |
||||||
|
unsigned char bits; |
||||||
|
mad_fixed_t C; |
||||||
|
mad_fixed_t D; |
||||||
|
} const qc_table[17] = { |
||||||
|
# include "qc_table.dat" |
||||||
|
}; |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: II_samples() |
||||||
|
* DESCRIPTION: decode three requantized Layer II samples from a bitstream |
||||||
|
*/ |
||||||
|
static |
||||||
|
void II_samples(struct mad_bitptr *ptr, |
||||||
|
struct quantclass const *quantclass, |
||||||
|
mad_fixed_t output[3]) |
||||||
|
{ |
||||||
|
unsigned int nb, s, sample[3]; |
||||||
|
|
||||||
|
if ((nb = quantclass->group)) { |
||||||
|
unsigned int c, nlevels; |
||||||
|
|
||||||
|
/* degrouping */ |
||||||
|
c = mad_bit_read(ptr, quantclass->bits); |
||||||
|
nlevels = quantclass->nlevels; |
||||||
|
|
||||||
|
for (s = 0; s < 3; ++s) { |
||||||
|
sample[s] = c % nlevels; |
||||||
|
c /= nlevels; |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
nb = quantclass->bits; |
||||||
|
|
||||||
|
for (s = 0; s < 3; ++s) |
||||||
|
sample[s] = mad_bit_read(ptr, nb); |
||||||
|
} |
||||||
|
|
||||||
|
for (s = 0; s < 3; ++s) { |
||||||
|
mad_fixed_t requantized; |
||||||
|
|
||||||
|
/* invert most significant bit, extend sign, then scale to fixed format */ |
||||||
|
|
||||||
|
requantized = sample[s] ^ (1 << (nb - 1)); |
||||||
|
requantized |= -(requantized & (1 << (nb - 1))); |
||||||
|
|
||||||
|
requantized <<= MAD_F_FRACBITS - (nb - 1); |
||||||
|
|
||||||
|
/* requantize the sample */ |
||||||
|
|
||||||
|
/* s'' = C * (s''' + D) */ |
||||||
|
|
||||||
|
output[s] = mad_f_mul(requantized + quantclass->D, quantclass->C); |
||||||
|
|
||||||
|
/* s' = factor * s'' */ |
||||||
|
/* (to be performed by caller) */ |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: layer->II() |
||||||
|
* DESCRIPTION: decode a single Layer II frame |
||||||
|
*/ |
||||||
|
int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame) |
||||||
|
{ |
||||||
|
struct mad_header *header = &frame->header; |
||||||
|
struct mad_bitptr start; |
||||||
|
unsigned int index, sblimit, nbal, nch, bound, gr, ch, s, sb; |
||||||
|
unsigned char const *offsets; |
||||||
|
unsigned char allocation[2][32], scfsi[2][32], scalefactor[2][32][3]; |
||||||
|
mad_fixed_t samples[3]; |
||||||
|
|
||||||
|
nch = MAD_NCHANNELS(header); |
||||||
|
|
||||||
|
if (header->flags & MAD_FLAG_LSF_EXT) |
||||||
|
index = 4; |
||||||
|
else if (header->flags & MAD_FLAG_FREEFORMAT) |
||||||
|
goto freeformat; |
||||||
|
else { |
||||||
|
unsigned long bitrate_per_channel; |
||||||
|
|
||||||
|
bitrate_per_channel = header->bitrate; |
||||||
|
if (nch == 2) { |
||||||
|
bitrate_per_channel /= 2; |
||||||
|
|
||||||
|
# if defined(OPT_STRICT) |
||||||
|
/*
|
||||||
|
* ISO/IEC 11172-3 allows only single channel mode for 32, 48, 56, and |
||||||
|
* 80 kbps bitrates in Layer II, but some encoders ignore this |
||||||
|
* restriction. We enforce it if OPT_STRICT is defined. |
||||||
|
*/ |
||||||
|
if (bitrate_per_channel <= 28000 || bitrate_per_channel == 40000) { |
||||||
|
stream->error = MAD_ERROR_BADMODE; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
# endif |
||||||
|
} |
||||||
|
else { /* nch == 1 */ |
||||||
|
if (bitrate_per_channel > 192000) { |
||||||
|
/*
|
||||||
|
* ISO/IEC 11172-3 does not allow single channel mode for 224, 256, |
||||||
|
* 320, or 384 kbps bitrates in Layer II. |
||||||
|
*/ |
||||||
|
stream->error = MAD_ERROR_BADMODE; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (bitrate_per_channel <= 48000) |
||||||
|
index = (header->samplerate == 32000) ? 3 : 2; |
||||||
|
else if (bitrate_per_channel <= 80000) |
||||||
|
index = 0; |
||||||
|
else { |
||||||
|
freeformat: |
||||||
|
index = (header->samplerate == 48000) ? 0 : 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
sblimit = sbquant_table[index].sblimit; |
||||||
|
offsets = sbquant_table[index].offsets; |
||||||
|
|
||||||
|
bound = 32; |
||||||
|
if (header->mode == MAD_MODE_JOINT_STEREO) { |
||||||
|
header->flags |= MAD_FLAG_I_STEREO; |
||||||
|
bound = 4 + header->mode_extension * 4; |
||||||
|
} |
||||||
|
|
||||||
|
if (bound > sblimit) |
||||||
|
bound = sblimit; |
||||||
|
|
||||||
|
start = stream->ptr; |
||||||
|
|
||||||
|
/* decode bit allocations */ |
||||||
|
|
||||||
|
for (sb = 0; sb < bound; ++sb) { |
||||||
|
nbal = bitalloc_table[offsets[sb]].nbal; |
||||||
|
|
||||||
|
for (ch = 0; ch < nch; ++ch) |
||||||
|
allocation[ch][sb] = mad_bit_read(&stream->ptr, nbal); |
||||||
|
} |
||||||
|
|
||||||
|
for (sb = bound; sb < sblimit; ++sb) { |
||||||
|
nbal = bitalloc_table[offsets[sb]].nbal; |
||||||
|
|
||||||
|
allocation[0][sb] = |
||||||
|
allocation[1][sb] = mad_bit_read(&stream->ptr, nbal); |
||||||
|
} |
||||||
|
|
||||||
|
/* decode scalefactor selection info */ |
||||||
|
|
||||||
|
for (sb = 0; sb < sblimit; ++sb) { |
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
if (allocation[ch][sb]) |
||||||
|
scfsi[ch][sb] = mad_bit_read(&stream->ptr, 2); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* check CRC word */ |
||||||
|
|
||||||
|
if (header->flags & MAD_FLAG_PROTECTION) { |
||||||
|
header->crc_check = |
||||||
|
mad_bit_crc(start, mad_bit_length(&start, &stream->ptr), |
||||||
|
header->crc_check); |
||||||
|
|
||||||
|
if (header->crc_check != header->crc_target && |
||||||
|
!(frame->options & MAD_OPTION_IGNORECRC)) { |
||||||
|
stream->error = MAD_ERROR_BADCRC; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* decode scalefactors */ |
||||||
|
|
||||||
|
for (sb = 0; sb < sblimit; ++sb) { |
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
if (allocation[ch][sb]) { |
||||||
|
scalefactor[ch][sb][0] = mad_bit_read(&stream->ptr, 6); |
||||||
|
|
||||||
|
switch (scfsi[ch][sb]) { |
||||||
|
case 2: |
||||||
|
scalefactor[ch][sb][2] = |
||||||
|
scalefactor[ch][sb][1] = |
||||||
|
scalefactor[ch][sb][0]; |
||||||
|
break; |
||||||
|
|
||||||
|
case 0: |
||||||
|
scalefactor[ch][sb][1] = mad_bit_read(&stream->ptr, 6); |
||||||
|
/* fall through */ |
||||||
|
|
||||||
|
case 1: |
||||||
|
case 3: |
||||||
|
scalefactor[ch][sb][2] = mad_bit_read(&stream->ptr, 6); |
||||||
|
} |
||||||
|
|
||||||
|
if (scfsi[ch][sb] & 1) |
||||||
|
scalefactor[ch][sb][1] = scalefactor[ch][sb][scfsi[ch][sb] - 1]; |
||||||
|
|
||||||
|
# if defined(OPT_STRICT) |
||||||
|
/*
|
||||||
|
* Scalefactor index 63 does not appear in Table B.1 of |
||||||
|
* ISO/IEC 11172-3. Nonetheless, other implementations accept it, |
||||||
|
* so we only reject it if OPT_STRICT is defined. |
||||||
|
*/ |
||||||
|
if (scalefactor[ch][sb][0] == 63 || |
||||||
|
scalefactor[ch][sb][1] == 63 || |
||||||
|
scalefactor[ch][sb][2] == 63) { |
||||||
|
stream->error = MAD_ERROR_BADSCALEFACTOR; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
# endif |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* decode samples */ |
||||||
|
|
||||||
|
for (gr = 0; gr < 12; ++gr) { |
||||||
|
for (sb = 0; sb < bound; ++sb) { |
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
if ((index = allocation[ch][sb])) { |
||||||
|
index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; |
||||||
|
|
||||||
|
II_samples(&stream->ptr, &qc_table[index], samples); |
||||||
|
|
||||||
|
for (s = 0; s < 3; ++s) { |
||||||
|
frame->sbsample[ch][3 * gr + s][sb] = |
||||||
|
mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]); |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
for (s = 0; s < 3; ++s) |
||||||
|
frame->sbsample[ch][3 * gr + s][sb] = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for (sb = bound; sb < sblimit; ++sb) { |
||||||
|
if ((index = allocation[0][sb])) { |
||||||
|
index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; |
||||||
|
|
||||||
|
II_samples(&stream->ptr, &qc_table[index], samples); |
||||||
|
|
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
for (s = 0; s < 3; ++s) { |
||||||
|
frame->sbsample[ch][3 * gr + s][sb] = |
||||||
|
mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
for (s = 0; s < 3; ++s) |
||||||
|
frame->sbsample[ch][3 * gr + s][sb] = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
for (s = 0; s < 3; ++s) { |
||||||
|
for (sb = sblimit; sb < 32; ++sb) |
||||||
|
frame->sbsample[ch][3 * gr + s][sb] = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: layer12.h,v 1.10 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_LAYER12_H |
||||||
|
# define LIBMAD_LAYER12_H |
||||||
|
|
||||||
|
# include "stream.h" |
||||||
|
# include "frame.h" |
||||||
|
|
||||||
|
int mad_layer_I(struct mad_stream *, struct mad_frame *); |
||||||
|
int mad_layer_II(struct mad_stream *, struct mad_frame *); |
||||||
|
|
||||||
|
# endif |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,30 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: layer3.h,v 1.10 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_LAYER3_H |
||||||
|
# define LIBMAD_LAYER3_H |
||||||
|
|
||||||
|
# include "stream.h" |
||||||
|
# include "frame.h" |
||||||
|
|
||||||
|
int mad_layer_III(struct mad_stream *, struct mad_frame *); |
||||||
|
|
||||||
|
# endif |
@ -0,0 +1,21 @@ |
|||||||
|
# @configure_input@ |
||||||
|
|
||||||
|
# Directories... |
||||||
|
$prefix=@prefix@ |
||||||
|
$exec_prefix=@exec_prefix@ |
||||||
|
$srcdir=@srcdir@ |
||||||
|
|
||||||
|
# Product information |
||||||
|
%product @PACKAGE@ |
||||||
|
%copyright GPL |
||||||
|
%vendor Underbit Technologies, Inc. <info@underbit.com> |
||||||
|
%license @srcdir@/COPYING |
||||||
|
%readme @srcdir@/README |
||||||
|
%description libmad is an MPEG audio decoder library. |
||||||
|
%version @VERSION@ |
||||||
|
%packager Giuseppe "Cowo" Corbelli <cowo@lugbs.linux.it> |
||||||
|
|
||||||
|
%system all |
||||||
|
f 0755 root root @libdir@/libmad.la .libs/libmad.lai |
||||||
|
f 0644 root root @libdir@/libmad.a .libs/libmad.a |
||||||
|
f 0644 root root @includedir@/mad.h mad.h |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,964 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* If you would like to negotiate alternate licensing terms, you may do |
||||||
|
* so by contacting: Underbit Technologies, Inc. <info@underbit.com> |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
# endif |
||||||
|
|
||||||
|
# define FPM_INTEL |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# define SIZEOF_INT 4 |
||||||
|
# define SIZEOF_LONG 4 |
||||||
|
# define SIZEOF_LONG_LONG 8 |
||||||
|
|
||||||
|
|
||||||
|
/* Id: version.h,v 1.26 2004/01/23 09:41:33 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_VERSION_H |
||||||
|
# define LIBMAD_VERSION_H |
||||||
|
|
||||||
|
# define MAD_VERSION_MAJOR 0 |
||||||
|
# define MAD_VERSION_MINOR 15 |
||||||
|
# define MAD_VERSION_PATCH 1 |
||||||
|
# define MAD_VERSION_EXTRA " (beta)" |
||||||
|
|
||||||
|
# define MAD_VERSION_STRINGIZE(str) #str |
||||||
|
# define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num) |
||||||
|
|
||||||
|
# define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ |
||||||
|
MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \
|
||||||
|
MAD_VERSION_STRING(MAD_VERSION_PATCH) \
|
||||||
|
MAD_VERSION_EXTRA |
||||||
|
|
||||||
|
# define MAD_PUBLISHYEAR "2000-2004" |
||||||
|
# define MAD_AUTHOR "Underbit Technologies, Inc." |
||||||
|
# define MAD_EMAIL "info@underbit.com" |
||||||
|
|
||||||
|
extern char const mad_version[]; |
||||||
|
extern char const mad_copyright[]; |
||||||
|
extern char const mad_author[]; |
||||||
|
extern char const mad_build[]; |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: fixed.h,v 1.38 2004/02/17 02:02:03 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_FIXED_H |
||||||
|
# define LIBMAD_FIXED_H |
||||||
|
|
||||||
|
# if SIZEOF_INT >= 4 |
||||||
|
typedef signed int mad_fixed_t; |
||||||
|
|
||||||
|
typedef signed int mad_fixed64hi_t; |
||||||
|
typedef unsigned int mad_fixed64lo_t; |
||||||
|
# else |
||||||
|
typedef signed long mad_fixed_t; |
||||||
|
|
||||||
|
typedef signed long mad_fixed64hi_t; |
||||||
|
typedef unsigned long mad_fixed64lo_t; |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(_MSC_VER) |
||||||
|
# define mad_fixed64_t signed __int64 |
||||||
|
# elif 1 || defined(__GNUC__) |
||||||
|
# define mad_fixed64_t signed long long |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(FPM_FLOAT) |
||||||
|
typedef double mad_sample_t; |
||||||
|
# else |
||||||
|
typedef mad_fixed_t mad_sample_t; |
||||||
|
# endif |
||||||
|
|
||||||
|
/*
|
||||||
|
* Fixed-point format: 0xABBBBBBB |
||||||
|
* A == whole part (sign + 3 bits) |
||||||
|
* B == fractional part (28 bits) |
||||||
|
* |
||||||
|
* Values are signed two's complement, so the effective range is: |
||||||
|
* 0x80000000 to 0x7fffffff |
||||||
|
* -8.0 to +7.9999999962747097015380859375 |
||||||
|
* |
||||||
|
* The smallest representable value is: |
||||||
|
* 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) |
||||||
|
* |
||||||
|
* 28 bits of fractional accuracy represent about |
||||||
|
* 8.6 digits of decimal accuracy. |
||||||
|
* |
||||||
|
* Fixed-point numbers can be added or subtracted as normal |
||||||
|
* integers, but multiplication requires shifting the 64-bit result |
||||||
|
* from 56 fractional bits back to 28 (and rounding.) |
||||||
|
* |
||||||
|
* Changing the definition of MAD_F_FRACBITS is only partially |
||||||
|
* supported, and must be done with care. |
||||||
|
*/ |
||||||
|
|
||||||
|
# define MAD_F_FRACBITS 28 |
||||||
|
|
||||||
|
# if MAD_F_FRACBITS == 28 |
||||||
|
# define MAD_F(x) ((mad_fixed_t) (x##L)) |
||||||
|
# else |
||||||
|
# if MAD_F_FRACBITS < 28 |
||||||
|
# warning "MAD_F_FRACBITS < 28" |
||||||
|
# define MAD_F(x) ((mad_fixed_t) \ |
||||||
|
(((x##L) + \
|
||||||
|
(1L << (28 - MAD_F_FRACBITS - 1))) >> \
|
||||||
|
(28 - MAD_F_FRACBITS))) |
||||||
|
# elif MAD_F_FRACBITS > 28 |
||||||
|
# error "MAD_F_FRACBITS > 28 not currently supported" |
||||||
|
# define MAD_F(x) ((mad_fixed_t) \ |
||||||
|
((x##L) << (MAD_F_FRACBITS - 28))) |
||||||
|
# endif |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_MIN ((mad_fixed_t) -0x80000000L) |
||||||
|
# define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) |
||||||
|
|
||||||
|
# define MAD_F_ONE MAD_F(0x10000000) |
||||||
|
|
||||||
|
# define mad_f_tofixed(x) ((mad_fixed_t) \ |
||||||
|
((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) |
||||||
|
# define mad_f_todouble(x) ((double) \ |
||||||
|
((x) / (double) (1L << MAD_F_FRACBITS))) |
||||||
|
|
||||||
|
# define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) |
||||||
|
# define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) |
||||||
|
/* (x should be positive) */ |
||||||
|
|
||||||
|
# define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) |
||||||
|
|
||||||
|
# define mad_f_add(x, y) ((x) + (y)) |
||||||
|
# define mad_f_sub(x, y) ((x) - (y)) |
||||||
|
|
||||||
|
# if defined(FPM_FLOAT) |
||||||
|
# error "FPM_FLOAT not yet supported" |
||||||
|
|
||||||
|
# undef MAD_F |
||||||
|
# define MAD_F(x) mad_f_todouble(x) |
||||||
|
|
||||||
|
# define mad_f_mul(x, y) ((x) * (y)) |
||||||
|
# define mad_f_scale64 |
||||||
|
|
||||||
|
# undef ASO_ZEROCHECK |
||||||
|
|
||||||
|
# elif defined(FPM_64BIT) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This version should be the most accurate if 64-bit types are supported by |
||||||
|
* the compiler, although it may not be the most efficient. |
||||||
|
*/ |
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
((mad_fixed_t) \
|
||||||
|
((((mad_fixed64_t) (x) * (y)) + \
|
||||||
|
(1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) |
||||||
|
# else |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
|
||||||
|
/* --- Intel --------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_INTEL) |
||||||
|
|
||||||
|
# if defined(_MSC_VER) |
||||||
|
# pragma warning(push) |
||||||
|
# pragma warning(disable: 4035) /* no return value */ |
||||||
|
static __forceinline |
||||||
|
mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) |
||||||
|
{ |
||||||
|
enum { |
||||||
|
fracbits = MAD_F_FRACBITS |
||||||
|
}; |
||||||
|
|
||||||
|
__asm { |
||||||
|
mov eax, x |
||||||
|
imul y |
||||||
|
shrd eax, edx, fracbits |
||||||
|
} |
||||||
|
|
||||||
|
/* implicit return of eax */ |
||||||
|
} |
||||||
|
# pragma warning(pop) |
||||||
|
|
||||||
|
# define mad_f_mul mad_f_mul_inline |
||||||
|
# define mad_f_scale64 |
||||||
|
# else |
||||||
|
/*
|
||||||
|
* This Intel version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("imull %3" \
|
||||||
|
: "=a" (lo), "=d" (hi) \
|
||||||
|
: "%a" (x), "rm" (y) \
|
||||||
|
: "cc") |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* This gives best accuracy but is not very fast. |
||||||
|
*/ |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
({ mad_fixed64hi_t __hi; \
|
||||||
|
mad_fixed64lo_t __lo; \
|
||||||
|
MAD_F_MLX(__hi, __lo, (x), (y)); \
|
||||||
|
asm ("addl %2,%0\n\t" \
|
||||||
|
"adcl %3,%1" \
|
||||||
|
: "=rm" (lo), "=rm" (hi) \
|
||||||
|
: "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \
|
||||||
|
: "cc"); \
|
||||||
|
}) |
||||||
|
# endif /* OPT_ACCURACY */ |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* Surprisingly, this is faster than SHRD followed by ADC. |
||||||
|
*/ |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed64hi_t __hi_; \
|
||||||
|
mad_fixed64lo_t __lo_; \
|
||||||
|
mad_fixed_t __result; \
|
||||||
|
asm ("addl %4,%2\n\t" \
|
||||||
|
"adcl %5,%3" \
|
||||||
|
: "=rm" (__lo_), "=rm" (__hi_) \
|
||||||
|
: "0" (lo), "1" (hi), \
|
||||||
|
"ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \
|
||||||
|
: "cc"); \
|
||||||
|
asm ("shrdl %3,%2,%1" \
|
||||||
|
: "=rm" (__result) \
|
||||||
|
: "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# elif defined(OPT_INTEL) |
||||||
|
/*
|
||||||
|
* Alternate Intel scaling that may or may not perform better. |
||||||
|
*/ |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("shrl %3,%1\n\t" \
|
||||||
|
"shll %4,%2\n\t" \
|
||||||
|
"orl %2,%1" \
|
||||||
|
: "=rm" (__result) \
|
||||||
|
: "0" (lo), "r" (hi), \
|
||||||
|
"I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("shrdl %3,%2,%1" \
|
||||||
|
: "=rm" (__result) \
|
||||||
|
: "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# endif /* OPT_ACCURACY */ |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
# endif |
||||||
|
|
||||||
|
/* --- ARM ----------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_ARM) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This ARM V4 version is as accurate as FPM_64BIT but much faster. The |
||||||
|
* least significant bit is properly rounded at no CPU cycle cost! |
||||||
|
*/ |
||||||
|
# if 1 |
||||||
|
/*
|
||||||
|
* This is faster than the default implementation via MAD_F_MLX() and |
||||||
|
* mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
({ mad_fixed64hi_t __hi; \
|
||||||
|
mad_fixed64lo_t __lo; \
|
||||||
|
mad_fixed_t __result; \
|
||||||
|
asm ("smull %0, %1, %3, %4\n\t" \
|
||||||
|
"movs %0, %0, lsr %5\n\t" \
|
||||||
|
"adc %2, %0, %1, lsl %6" \
|
||||||
|
: "=&r" (__lo), "=&r" (__hi), "=r" (__result) \
|
||||||
|
: "%r" (x), "r" (y), \
|
||||||
|
"M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("smull %0, %1, %2, %3" \
|
||||||
|
: "=&r" (lo), "=&r" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
|
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
asm ("smlal %0, %1, %2, %3" \
|
||||||
|
: "+r" (lo), "+r" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
|
||||||
|
# define MAD_F_MLN(hi, lo) \ |
||||||
|
asm ("rsbs %0, %2, #0\n\t" \
|
||||||
|
"rsc %1, %3, #0" \
|
||||||
|
: "=r" (lo), "=r" (hi) \
|
||||||
|
: "0" (lo), "1" (hi) \
|
||||||
|
: "cc") |
||||||
|
|
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("movs %0, %1, lsr %3\n\t" \
|
||||||
|
"adc %0, %0, %2, lsl %4" \
|
||||||
|
: "=&r" (__result) \
|
||||||
|
: "r" (lo), "r" (hi), \
|
||||||
|
"M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
|
||||||
|
/* --- MIPS ---------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_MIPS) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This MIPS version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("mult %2,%3" \
|
||||||
|
: "=l" (lo), "=h" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
|
||||||
|
# if defined(HAVE_MADD_ASM) |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
asm ("madd %2,%3" \
|
||||||
|
: "+l" (lo), "+h" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
# elif defined(HAVE_MADD16_ASM) |
||||||
|
/*
|
||||||
|
* This loses significant accuracy due to the 16-bit integer limit in the |
||||||
|
* multiply/accumulate instruction. |
||||||
|
*/ |
||||||
|
# define MAD_F_ML0(hi, lo, x, y) \ |
||||||
|
asm ("mult %2,%3" \
|
||||||
|
: "=l" (lo), "=h" (hi) \
|
||||||
|
: "%r" ((x) >> 12), "r" ((y) >> 16)) |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
asm ("madd16 %2,%3" \
|
||||||
|
: "+l" (lo), "+h" (hi) \
|
||||||
|
: "%r" ((x) >> 12), "r" ((y) >> 16)) |
||||||
|
# define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_SPEED) |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) |
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
# endif |
||||||
|
|
||||||
|
/* --- SPARC --------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_SPARC) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This SPARC V8 version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("smul %2, %3, %0\n\t" \
|
||||||
|
"rd %%y, %1" \
|
||||||
|
: "=r" (lo), "=r" (hi) \
|
||||||
|
: "%r" (x), "rI" (y)) |
||||||
|
|
||||||
|
/* --- PowerPC ------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_PPC) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This PowerPC version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
do { \
|
||||||
|
asm ("mullw %0,%1,%2" \
|
||||||
|
: "=r" (lo) \
|
||||||
|
: "%r" (x), "r" (y)); \
|
||||||
|
asm ("mulhw %0,%1,%2" \
|
||||||
|
: "=r" (hi) \
|
||||||
|
: "%r" (x), "r" (y)); \
|
||||||
|
} \
|
||||||
|
while (0) |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* This gives best accuracy but is not very fast. |
||||||
|
*/ |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
({ mad_fixed64hi_t __hi; \
|
||||||
|
mad_fixed64lo_t __lo; \
|
||||||
|
MAD_F_MLX(__hi, __lo, (x), (y)); \
|
||||||
|
asm ("addc %0,%2,%3\n\t" \
|
||||||
|
"adde %1,%4,%5" \
|
||||||
|
: "=r" (lo), "=r" (hi) \
|
||||||
|
: "%r" (lo), "r" (__lo), \
|
||||||
|
"%r" (hi), "r" (__hi) \
|
||||||
|
: "xer"); \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* This is slower than the truncating version below it. |
||||||
|
*/ |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result, __round; \
|
||||||
|
asm ("rotrwi %0,%1,%2" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "r" (lo), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
asm ("extrwi %0,%1,1,0" \
|
||||||
|
: "=r" (__round) \
|
||||||
|
: "r" (__result)); \
|
||||||
|
asm ("insrwi %0,%1,%2,0" \
|
||||||
|
: "+r" (__result) \
|
||||||
|
: "r" (hi), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
asm ("add %0,%1,%2" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "%r" (__result), "r" (__round)); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("rotrwi %0,%1,%2" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "r" (lo), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
asm ("insrwi %0,%1,%2,0" \
|
||||||
|
: "+r" (__result) \
|
||||||
|
: "r" (hi), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
|
||||||
|
/* --- Default ------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_DEFAULT) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This version is the most portable but it loses significant accuracy. |
||||||
|
* Furthermore, accuracy is biased against the second argument, so care |
||||||
|
* should be taken when ordering operands. |
||||||
|
* |
||||||
|
* The scale factors are constant as this is not used with SSO. |
||||||
|
* |
||||||
|
* Pre-rounding is required to stay within the limits of compliance. |
||||||
|
*/ |
||||||
|
# if defined(OPT_SPEED) |
||||||
|
# define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16)) |
||||||
|
# else |
||||||
|
# define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) * \ |
||||||
|
(((y) + (1L << 15)) >> 16)) |
||||||
|
# endif |
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# else |
||||||
|
# error "no FPM selected" |
||||||
|
# endif |
||||||
|
|
||||||
|
/* default implementations */ |
||||||
|
|
||||||
|
# if !defined(mad_f_mul) |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
({ register mad_fixed64hi_t __hi; \
|
||||||
|
register mad_fixed64lo_t __lo; \
|
||||||
|
MAD_F_MLX(__hi, __lo, (x), (y)); \
|
||||||
|
mad_f_scale64(__hi, __lo); \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_MLA) |
||||||
|
# define MAD_F_ML0(hi, lo, x, y) ((lo) = mad_f_mul((x), (y))) |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y))) |
||||||
|
# define MAD_F_MLN(hi, lo) ((lo) = -(lo)) |
||||||
|
# define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_ML0) |
||||||
|
# define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_MLN) |
||||||
|
# define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_MLZ) |
||||||
|
# define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(mad_f_scale64) |
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
((((mad_fixed_t) \
|
||||||
|
(((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \
|
||||||
|
((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
((mad_fixed_t) \
|
||||||
|
(((hi) << (32 - MAD_F_SCALEBITS)) | \
|
||||||
|
((lo) >> MAD_F_SCALEBITS))) |
||||||
|
# endif |
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
# endif |
||||||
|
|
||||||
|
/* C routines */ |
||||||
|
|
||||||
|
mad_fixed_t mad_f_abs(mad_fixed_t); |
||||||
|
mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: bit.h,v 1.12 2004/01/23 09:41:32 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_BIT_H |
||||||
|
# define LIBMAD_BIT_H |
||||||
|
|
||||||
|
struct mad_bitptr { |
||||||
|
unsigned char const *byte; |
||||||
|
unsigned short cache; |
||||||
|
unsigned short left; |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_bit_init(struct mad_bitptr *, unsigned char const *); |
||||||
|
|
||||||
|
# define mad_bit_finish(bitptr) /* nothing */ |
||||||
|
|
||||||
|
unsigned int mad_bit_length(struct mad_bitptr const *, |
||||||
|
struct mad_bitptr const *); |
||||||
|
|
||||||
|
# define mad_bit_bitsleft(bitptr) ((bitptr)->left) |
||||||
|
unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); |
||||||
|
|
||||||
|
void mad_bit_skip(struct mad_bitptr *, unsigned int); |
||||||
|
unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); |
||||||
|
void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); |
||||||
|
|
||||||
|
unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: timer.h,v 1.16 2004/01/23 09:41:33 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_TIMER_H |
||||||
|
# define LIBMAD_TIMER_H |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
signed long seconds; /* whole seconds */ |
||||||
|
unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ |
||||||
|
} mad_timer_t; |
||||||
|
|
||||||
|
extern mad_timer_t const mad_timer_zero; |
||||||
|
|
||||||
|
# define MAD_TIMER_RESOLUTION 352800000UL |
||||||
|
|
||||||
|
enum mad_units { |
||||||
|
MAD_UNITS_HOURS = -2, |
||||||
|
MAD_UNITS_MINUTES = -1, |
||||||
|
MAD_UNITS_SECONDS = 0, |
||||||
|
|
||||||
|
/* metric units */ |
||||||
|
|
||||||
|
MAD_UNITS_DECISECONDS = 10, |
||||||
|
MAD_UNITS_CENTISECONDS = 100, |
||||||
|
MAD_UNITS_MILLISECONDS = 1000, |
||||||
|
|
||||||
|
/* audio sample units */ |
||||||
|
|
||||||
|
MAD_UNITS_8000_HZ = 8000, |
||||||
|
MAD_UNITS_11025_HZ = 11025, |
||||||
|
MAD_UNITS_12000_HZ = 12000, |
||||||
|
|
||||||
|
MAD_UNITS_16000_HZ = 16000, |
||||||
|
MAD_UNITS_22050_HZ = 22050, |
||||||
|
MAD_UNITS_24000_HZ = 24000, |
||||||
|
|
||||||
|
MAD_UNITS_32000_HZ = 32000, |
||||||
|
MAD_UNITS_44100_HZ = 44100, |
||||||
|
MAD_UNITS_48000_HZ = 48000, |
||||||
|
|
||||||
|
/* video frame/field units */ |
||||||
|
|
||||||
|
MAD_UNITS_24_FPS = 24, |
||||||
|
MAD_UNITS_25_FPS = 25, |
||||||
|
MAD_UNITS_30_FPS = 30, |
||||||
|
MAD_UNITS_48_FPS = 48, |
||||||
|
MAD_UNITS_50_FPS = 50, |
||||||
|
MAD_UNITS_60_FPS = 60, |
||||||
|
|
||||||
|
/* CD audio frames */ |
||||||
|
|
||||||
|
MAD_UNITS_75_FPS = 75, |
||||||
|
|
||||||
|
/* video drop-frame units */ |
||||||
|
|
||||||
|
MAD_UNITS_23_976_FPS = -24, |
||||||
|
MAD_UNITS_24_975_FPS = -25, |
||||||
|
MAD_UNITS_29_97_FPS = -30, |
||||||
|
MAD_UNITS_47_952_FPS = -48, |
||||||
|
MAD_UNITS_49_95_FPS = -50, |
||||||
|
MAD_UNITS_59_94_FPS = -60 |
||||||
|
}; |
||||||
|
|
||||||
|
# define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero)) |
||||||
|
|
||||||
|
int mad_timer_compare(mad_timer_t, mad_timer_t); |
||||||
|
|
||||||
|
# define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero) |
||||||
|
|
||||||
|
void mad_timer_negate(mad_timer_t *); |
||||||
|
mad_timer_t mad_timer_abs(mad_timer_t); |
||||||
|
|
||||||
|
void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); |
||||||
|
void mad_timer_add(mad_timer_t *, mad_timer_t); |
||||||
|
void mad_timer_multiply(mad_timer_t *, signed long); |
||||||
|
|
||||||
|
signed long mad_timer_count(mad_timer_t, enum mad_units); |
||||||
|
unsigned long mad_timer_fraction(mad_timer_t, unsigned long); |
||||||
|
void mad_timer_string(mad_timer_t, char *, char const *, |
||||||
|
enum mad_units, enum mad_units, unsigned long); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: stream.h,v 1.20 2004/02/05 09:02:39 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_STREAM_H |
||||||
|
# define LIBMAD_STREAM_H |
||||||
|
|
||||||
|
|
||||||
|
# define MAD_BUFFER_GUARD 8 |
||||||
|
# define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) |
||||||
|
|
||||||
|
enum mad_error { |
||||||
|
MAD_ERROR_NONE = 0x0000, /* no error */ |
||||||
|
|
||||||
|
MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ |
||||||
|
MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ |
||||||
|
|
||||||
|
MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ |
||||||
|
|
||||||
|
MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ |
||||||
|
MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ |
||||||
|
MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ |
||||||
|
MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ |
||||||
|
MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ |
||||||
|
|
||||||
|
MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ |
||||||
|
MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ |
||||||
|
MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ |
||||||
|
MAD_ERROR_BADMODE = 0x0222, /* bad bitrate/mode combination */ |
||||||
|
MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ |
||||||
|
MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ |
||||||
|
MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ |
||||||
|
MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ |
||||||
|
MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ |
||||||
|
MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ |
||||||
|
MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ |
||||||
|
MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ |
||||||
|
MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ |
||||||
|
}; |
||||||
|
|
||||||
|
# define MAD_RECOVERABLE(error) ((error) & 0xff00) |
||||||
|
|
||||||
|
struct mad_stream { |
||||||
|
unsigned char const *buffer; /* input bitstream buffer */ |
||||||
|
unsigned char const *bufend; /* end of buffer */ |
||||||
|
unsigned long skiplen; /* bytes to skip before next frame */ |
||||||
|
|
||||||
|
int sync; /* stream sync found */ |
||||||
|
unsigned long freerate; /* free bitrate (fixed) */ |
||||||
|
|
||||||
|
unsigned char const *this_frame; /* start of current frame */ |
||||||
|
unsigned char const *next_frame; /* start of next frame */ |
||||||
|
struct mad_bitptr ptr; /* current processing bit pointer */ |
||||||
|
|
||||||
|
struct mad_bitptr anc_ptr; /* ancillary bits pointer */ |
||||||
|
unsigned int anc_bitlen; /* number of ancillary bits */ |
||||||
|
|
||||||
|
unsigned char (*main_data)[MAD_BUFFER_MDLEN]; |
||||||
|
/* Layer III main_data() */ |
||||||
|
unsigned int md_len; /* bytes in main_data */ |
||||||
|
|
||||||
|
int options; /* decoding options (see below) */ |
||||||
|
enum mad_error error; /* error code (see above) */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum { |
||||||
|
MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ |
||||||
|
MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ |
||||||
|
# if 0 /* not yet implemented */ |
||||||
|
MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ |
||||||
|
MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ |
||||||
|
MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ |
||||||
|
# endif |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_stream_init(struct mad_stream *); |
||||||
|
void mad_stream_finish(struct mad_stream *); |
||||||
|
|
||||||
|
# define mad_stream_options(stream, opts) \ |
||||||
|
((void) ((stream)->options = (opts))) |
||||||
|
|
||||||
|
void mad_stream_buffer(struct mad_stream *, |
||||||
|
unsigned char const *, unsigned long); |
||||||
|
void mad_stream_skip(struct mad_stream *, unsigned long); |
||||||
|
|
||||||
|
int mad_stream_sync(struct mad_stream *); |
||||||
|
|
||||||
|
char const *mad_stream_errorstr(struct mad_stream const *); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: frame.h,v 1.20 2004/01/23 09:41:32 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_FRAME_H |
||||||
|
# define LIBMAD_FRAME_H |
||||||
|
|
||||||
|
|
||||||
|
enum mad_layer { |
||||||
|
MAD_LAYER_I = 1, /* Layer I */ |
||||||
|
MAD_LAYER_II = 2, /* Layer II */ |
||||||
|
MAD_LAYER_III = 3 /* Layer III */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum mad_mode { |
||||||
|
MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ |
||||||
|
MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ |
||||||
|
MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ |
||||||
|
MAD_MODE_STEREO = 3 /* normal LR stereo */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum mad_emphasis { |
||||||
|
MAD_EMPHASIS_NONE = 0, /* no emphasis */ |
||||||
|
MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ |
||||||
|
MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ |
||||||
|
MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_header { |
||||||
|
enum mad_layer layer; /* audio layer (1, 2, or 3) */ |
||||||
|
enum mad_mode mode; /* channel mode (see above) */ |
||||||
|
int mode_extension; /* additional mode info */ |
||||||
|
enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ |
||||||
|
|
||||||
|
unsigned long bitrate; /* stream bitrate (bps) */ |
||||||
|
unsigned int samplerate; /* sampling frequency (Hz) */ |
||||||
|
|
||||||
|
unsigned short crc_check; /* frame CRC accumulator */ |
||||||
|
unsigned short crc_target; /* final target CRC checksum */ |
||||||
|
|
||||||
|
int flags; /* flags (see below) */ |
||||||
|
int private_bits; /* private bits (see below) */ |
||||||
|
|
||||||
|
mad_timer_t duration; /* audio playing time of frame */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_frame { |
||||||
|
struct mad_header header; /* MPEG audio header */ |
||||||
|
|
||||||
|
int options; /* decoding options (from stream) */ |
||||||
|
|
||||||
|
mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */ |
||||||
|
mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */ |
||||||
|
}; |
||||||
|
|
||||||
|
# define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) |
||||||
|
# define MAD_NSBSAMPLES(header) \ |
||||||
|
((header)->layer == MAD_LAYER_I ? 12 : \
|
||||||
|
(((header)->layer == MAD_LAYER_III && \
|
||||||
|
((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) |
||||||
|
|
||||||
|
enum { |
||||||
|
MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ |
||||||
|
MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ |
||||||
|
|
||||||
|
MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ |
||||||
|
MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ |
||||||
|
MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ |
||||||
|
MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ |
||||||
|
|
||||||
|
MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ |
||||||
|
MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ |
||||||
|
MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ |
||||||
|
|
||||||
|
MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ |
||||||
|
MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ |
||||||
|
MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum { |
||||||
|
MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ |
||||||
|
MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_header_init(struct mad_header *); |
||||||
|
|
||||||
|
# define mad_header_finish(header) /* nothing */ |
||||||
|
|
||||||
|
int mad_header_decode(struct mad_header *, struct mad_stream *); |
||||||
|
|
||||||
|
void mad_frame_init(struct mad_frame *); |
||||||
|
void mad_frame_finish(struct mad_frame *); |
||||||
|
|
||||||
|
int mad_frame_decode(struct mad_frame *, struct mad_stream *); |
||||||
|
|
||||||
|
void mad_frame_mute(struct mad_frame *); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: synth.h,v 1.15 2004/01/23 09:41:33 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_SYNTH_H |
||||||
|
# define LIBMAD_SYNTH_H |
||||||
|
|
||||||
|
|
||||||
|
struct mad_pcm { |
||||||
|
unsigned int samplerate; /* sampling frequency (Hz) */ |
||||||
|
unsigned short channels; /* number of channels */ |
||||||
|
unsigned short length; /* number of samples per channel */ |
||||||
|
mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_synth { |
||||||
|
mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ |
||||||
|
/* [ch][eo][peo][s][v] */ |
||||||
|
|
||||||
|
unsigned int phase; /* current processing phase */ |
||||||
|
|
||||||
|
struct mad_pcm pcm; /* PCM output */ |
||||||
|
}; |
||||||
|
|
||||||
|
/* single channel PCM selector */ |
||||||
|
enum { |
||||||
|
MAD_PCM_CHANNEL_SINGLE = 0 |
||||||
|
}; |
||||||
|
|
||||||
|
/* dual channel PCM selector */ |
||||||
|
enum { |
||||||
|
MAD_PCM_CHANNEL_DUAL_1 = 0, |
||||||
|
MAD_PCM_CHANNEL_DUAL_2 = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
/* stereo PCM selector */ |
||||||
|
enum { |
||||||
|
MAD_PCM_CHANNEL_STEREO_LEFT = 0, |
||||||
|
MAD_PCM_CHANNEL_STEREO_RIGHT = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_synth_init(struct mad_synth *); |
||||||
|
|
||||||
|
# define mad_synth_finish(synth) /* nothing */ |
||||||
|
|
||||||
|
void mad_synth_mute(struct mad_synth *); |
||||||
|
|
||||||
|
void mad_synth_frame(struct mad_synth *, struct mad_frame const *); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: decoder.h,v 1.17 2004/01/23 09:41:32 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_DECODER_H |
||||||
|
# define LIBMAD_DECODER_H |
||||||
|
|
||||||
|
|
||||||
|
enum mad_decoder_mode { |
||||||
|
MAD_DECODER_MODE_SYNC = 0, |
||||||
|
MAD_DECODER_MODE_ASYNC |
||||||
|
}; |
||||||
|
|
||||||
|
enum mad_flow { |
||||||
|
MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ |
||||||
|
MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ |
||||||
|
MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ |
||||||
|
MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_decoder { |
||||||
|
enum mad_decoder_mode mode; |
||||||
|
|
||||||
|
int options; |
||||||
|
|
||||||
|
struct { |
||||||
|
long pid; |
||||||
|
int in; |
||||||
|
int out; |
||||||
|
} async; |
||||||
|
|
||||||
|
struct { |
||||||
|
struct mad_stream stream; |
||||||
|
struct mad_frame frame; |
||||||
|
struct mad_synth synth; |
||||||
|
} *sync; |
||||||
|
|
||||||
|
void *cb_data; |
||||||
|
|
||||||
|
enum mad_flow (*input_func)(void *, struct mad_stream *); |
||||||
|
enum mad_flow (*header_func)(void *, struct mad_header const *); |
||||||
|
enum mad_flow (*filter_func)(void *, |
||||||
|
struct mad_stream const *, struct mad_frame *); |
||||||
|
enum mad_flow (*output_func)(void *, |
||||||
|
struct mad_header const *, struct mad_pcm *); |
||||||
|
enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); |
||||||
|
enum mad_flow (*message_func)(void *, void *, unsigned int *); |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_decoder_init(struct mad_decoder *, void *, |
||||||
|
enum mad_flow (*)(void *, struct mad_stream *), |
||||||
|
enum mad_flow (*)(void *, struct mad_header const *), |
||||||
|
enum mad_flow (*)(void *, |
||||||
|
struct mad_stream const *, |
||||||
|
struct mad_frame *), |
||||||
|
enum mad_flow (*)(void *, |
||||||
|
struct mad_header const *, |
||||||
|
struct mad_pcm *), |
||||||
|
enum mad_flow (*)(void *, |
||||||
|
struct mad_stream *, |
||||||
|
struct mad_frame *), |
||||||
|
enum mad_flow (*)(void *, void *, unsigned int *)); |
||||||
|
int mad_decoder_finish(struct mad_decoder *); |
||||||
|
|
||||||
|
# define mad_decoder_options(decoder, opts) \ |
||||||
|
((void) ((decoder)->options = (opts))) |
||||||
|
|
||||||
|
int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); |
||||||
|
int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
# ifdef __cplusplus |
||||||
|
} |
||||||
|
# endif |
@ -0,0 +1,36 @@ |
|||||||
|
# |
||||||
|
# libmad - MPEG audio decoder library |
||||||
|
# Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
# |
||||||
|
# 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 |
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
# |
||||||
|
# $Id: mad.h.sed,v 1.9 2004/01/23 09:41:32 rob Exp $ |
||||||
|
# |
||||||
|
|
||||||
|
/^\/\*$/{ |
||||||
|
N |
||||||
|
s/ \* libmad - /&/ |
||||||
|
t copy |
||||||
|
b next |
||||||
|
: copy |
||||||
|
g |
||||||
|
n |
||||||
|
s|^ \* \$\(Id: .*\) \$$|/* \1 */|p |
||||||
|
/^ \*\/$/d |
||||||
|
b copy |
||||||
|
} |
||||||
|
/^# *include "/d |
||||||
|
: next |
||||||
|
p |
@ -0,0 +1,222 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: minimad.c,v 1.4 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# include <stdio.h> |
||||||
|
# include <unistd.h> |
||||||
|
# include <sys/stat.h> |
||||||
|
# include <sys/mman.h> |
||||||
|
|
||||||
|
# include "mad.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* This is perhaps the simplest example use of the MAD high-level API. |
||||||
|
* Standard input is mapped into memory via mmap(), then the high-level API |
||||||
|
* is invoked with three callbacks: input, output, and error. The output |
||||||
|
* callback converts MAD's high-resolution PCM samples to 16 bits, then |
||||||
|
* writes them to standard output in little-endian, stereo-interleaved |
||||||
|
* format. |
||||||
|
*/ |
||||||
|
|
||||||
|
static int decode(unsigned char const *, unsigned long); |
||||||
|
|
||||||
|
int main(int argc, char *argv[]) |
||||||
|
{ |
||||||
|
struct stat stat; |
||||||
|
void *fdm; |
||||||
|
|
||||||
|
if (argc != 1) |
||||||
|
return 1; |
||||||
|
|
||||||
|
if (fstat(STDIN_FILENO, &stat) == -1 || |
||||||
|
stat.st_size == 0) |
||||||
|
return 2; |
||||||
|
|
||||||
|
fdm = mmap(0, stat.st_size, PROT_READ, MAP_SHARED, STDIN_FILENO, 0); |
||||||
|
if (fdm == MAP_FAILED) |
||||||
|
return 3; |
||||||
|
|
||||||
|
decode(fdm, stat.st_size); |
||||||
|
|
||||||
|
if (munmap(fdm, stat.st_size) == -1) |
||||||
|
return 4; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a private message structure. A generic pointer to this structure |
||||||
|
* is passed to each of the callback functions. Put here any data you need |
||||||
|
* to access from within the callbacks. |
||||||
|
*/ |
||||||
|
|
||||||
|
struct buffer { |
||||||
|
unsigned char const *start; |
||||||
|
unsigned long length; |
||||||
|
}; |
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the input callback. The purpose of this callback is to (re)fill |
||||||
|
* the stream buffer which is to be decoded. In this example, an entire file |
||||||
|
* has been mapped into memory, so we just call mad_stream_buffer() with the |
||||||
|
* address and length of the mapping. When this callback is called a second |
||||||
|
* time, we are finished decoding. |
||||||
|
*/ |
||||||
|
|
||||||
|
static |
||||||
|
enum mad_flow input(void *data, |
||||||
|
struct mad_stream *stream) |
||||||
|
{ |
||||||
|
struct buffer *buffer = data; |
||||||
|
|
||||||
|
if (!buffer->length) |
||||||
|
return MAD_FLOW_STOP; |
||||||
|
|
||||||
|
mad_stream_buffer(stream, buffer->start, buffer->length); |
||||||
|
|
||||||
|
buffer->length = 0; |
||||||
|
|
||||||
|
return MAD_FLOW_CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* The following utility routine performs simple rounding, clipping, and |
||||||
|
* scaling of MAD's high-resolution samples down to 16 bits. It does not |
||||||
|
* perform any dithering or noise shaping, which would be recommended to |
||||||
|
* obtain any exceptional audio quality. It is therefore not recommended to |
||||||
|
* use this routine if high-quality output is desired. |
||||||
|
*/ |
||||||
|
|
||||||
|
static inline |
||||||
|
signed int scale(mad_fixed_t sample) |
||||||
|
{ |
||||||
|
/* round */ |
||||||
|
sample += (1L << (MAD_F_FRACBITS - 16)); |
||||||
|
|
||||||
|
/* clip */ |
||||||
|
if (sample >= MAD_F_ONE) |
||||||
|
sample = MAD_F_ONE - 1; |
||||||
|
else if (sample < -MAD_F_ONE) |
||||||
|
sample = -MAD_F_ONE; |
||||||
|
|
||||||
|
/* quantize */ |
||||||
|
return sample >> (MAD_F_FRACBITS + 1 - 16); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the output callback function. It is called after each frame of |
||||||
|
* MPEG audio data has been completely decoded. The purpose of this callback |
||||||
|
* is to output (or play) the decoded PCM audio. |
||||||
|
*/ |
||||||
|
|
||||||
|
static |
||||||
|
enum mad_flow output(void *data, |
||||||
|
struct mad_header const *header, |
||||||
|
struct mad_pcm *pcm) |
||||||
|
{ |
||||||
|
unsigned int nchannels, nsamples; |
||||||
|
mad_fixed_t const *left_ch, *right_ch; |
||||||
|
|
||||||
|
/* pcm->samplerate contains the sampling frequency */ |
||||||
|
|
||||||
|
nchannels = pcm->channels; |
||||||
|
nsamples = pcm->length; |
||||||
|
left_ch = pcm->samples[0]; |
||||||
|
right_ch = pcm->samples[1]; |
||||||
|
|
||||||
|
while (nsamples--) { |
||||||
|
signed int sample; |
||||||
|
|
||||||
|
/* output sample(s) in 16-bit signed little-endian PCM */ |
||||||
|
|
||||||
|
sample = scale(*left_ch++); |
||||||
|
putchar((sample >> 0) & 0xff); |
||||||
|
putchar((sample >> 8) & 0xff); |
||||||
|
|
||||||
|
if (nchannels == 2) { |
||||||
|
sample = scale(*right_ch++); |
||||||
|
putchar((sample >> 0) & 0xff); |
||||||
|
putchar((sample >> 8) & 0xff); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return MAD_FLOW_CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the error callback function. It is called whenever a decoding |
||||||
|
* error occurs. The error is indicated by stream->error; the list of |
||||||
|
* possible MAD_ERROR_* errors can be found in the mad.h (or stream.h) |
||||||
|
* header file. |
||||||
|
*/ |
||||||
|
|
||||||
|
static |
||||||
|
enum mad_flow error(void *data, |
||||||
|
struct mad_stream *stream, |
||||||
|
struct mad_frame *frame) |
||||||
|
{ |
||||||
|
struct buffer *buffer = data; |
||||||
|
|
||||||
|
fprintf(stderr, "decoding error 0x%04x (%s) at byte offset %u\n", |
||||||
|
stream->error, mad_stream_errorstr(stream), |
||||||
|
stream->this_frame - buffer->start); |
||||||
|
|
||||||
|
/* return MAD_FLOW_BREAK here to stop decoding (and propagate an error) */ |
||||||
|
|
||||||
|
return MAD_FLOW_CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the function called by main() above to perform all the decoding. |
||||||
|
* It instantiates a decoder object and configures it with the input, |
||||||
|
* output, and error callback functions above. A single call to |
||||||
|
* mad_decoder_run() continues until a callback function returns |
||||||
|
* MAD_FLOW_STOP (to stop decoding) or MAD_FLOW_BREAK (to stop decoding and |
||||||
|
* signal an error). |
||||||
|
*/ |
||||||
|
|
||||||
|
static |
||||||
|
int decode(unsigned char const *start, unsigned long length) |
||||||
|
{ |
||||||
|
struct buffer buffer; |
||||||
|
struct mad_decoder decoder; |
||||||
|
int result; |
||||||
|
|
||||||
|
/* initialize our private message structure */ |
||||||
|
|
||||||
|
buffer.start = start; |
||||||
|
buffer.length = length; |
||||||
|
|
||||||
|
/* configure input, output, and error functions */ |
||||||
|
|
||||||
|
mad_decoder_init(&decoder, &buffer, |
||||||
|
input, 0 /* header */, 0 /* filter */, output, |
||||||
|
error, 0 /* message */); |
||||||
|
|
||||||
|
/* start decoding */ |
||||||
|
|
||||||
|
result = mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC); |
||||||
|
|
||||||
|
/* release the decoder */ |
||||||
|
|
||||||
|
mad_decoder_finish(&decoder); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
@ -0,0 +1,336 @@ |
|||||||
|
#! /bin/sh |
||||||
|
# Common stub for a few missing GNU programs while installing. |
||||||
|
# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc. |
||||||
|
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. |
||||||
|
|
||||||
|
# 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, 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 |
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
||||||
|
# 02111-1307, USA. |
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you |
||||||
|
# distribute this file as part of a program that contains a |
||||||
|
# configuration script generated by Autoconf, you may include it under |
||||||
|
# the same distribution terms that you use for the rest of that program. |
||||||
|
|
||||||
|
if test $# -eq 0; then |
||||||
|
echo 1>&2 "Try \`$0 --help' for more information" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
run=: |
||||||
|
|
||||||
|
# In the cases where this matters, `missing' is being run in the |
||||||
|
# srcdir already. |
||||||
|
if test -f configure.ac; then |
||||||
|
configure_ac=configure.ac |
||||||
|
else |
||||||
|
configure_ac=configure.in |
||||||
|
fi |
||||||
|
|
||||||
|
case "$1" in |
||||||
|
--run) |
||||||
|
# Try to run requested program, and just exit if it succeeds. |
||||||
|
run= |
||||||
|
shift |
||||||
|
"$@" && exit 0 |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
# If it does not exist, or fails to run (possibly an outdated version), |
||||||
|
# try to emulate it. |
||||||
|
case "$1" in |
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help) |
||||||
|
echo "\ |
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]... |
||||||
|
|
||||||
|
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an |
||||||
|
error status if there is no known handling for PROGRAM. |
||||||
|
|
||||||
|
Options: |
||||||
|
-h, --help display this help and exit |
||||||
|
-v, --version output version information and exit |
||||||
|
--run try to run the given command, and emulate it if it fails |
||||||
|
|
||||||
|
Supported PROGRAM values: |
||||||
|
aclocal touch file \`aclocal.m4' |
||||||
|
autoconf touch file \`configure' |
||||||
|
autoheader touch file \`config.h.in' |
||||||
|
automake touch all \`Makefile.in' files |
||||||
|
bison create \`y.tab.[ch]', if possible, from existing .[ch] |
||||||
|
flex create \`lex.yy.c', if possible, from existing .c |
||||||
|
help2man touch the output file |
||||||
|
lex create \`lex.yy.c', if possible, from existing .c |
||||||
|
makeinfo touch the output file |
||||||
|
tar try tar, gnutar, gtar, then tar without non-portable flags |
||||||
|
yacc create \`y.tab.[ch]', if possible, from existing .[ch]" |
||||||
|
;; |
||||||
|
|
||||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version) |
||||||
|
echo "missing 0.4 - GNU automake" |
||||||
|
;; |
||||||
|
|
||||||
|
-*) |
||||||
|
echo 1>&2 "$0: Unknown \`$1' option" |
||||||
|
echo 1>&2 "Try \`$0 --help' for more information" |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
aclocal*) |
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then |
||||||
|
# We have it, but it failed. |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||||
|
you modified \`acinclude.m4' or \`${configure_ac}'. You might want |
||||||
|
to install the \`Automake' and \`Perl' packages. Grab them from |
||||||
|
any GNU archive site." |
||||||
|
touch aclocal.m4 |
||||||
|
;; |
||||||
|
|
||||||
|
autoconf) |
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then |
||||||
|
# We have it, but it failed. |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||||
|
you modified \`${configure_ac}'. You might want to install the |
||||||
|
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU |
||||||
|
archive site." |
||||||
|
touch configure |
||||||
|
;; |
||||||
|
|
||||||
|
autoheader) |
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then |
||||||
|
# We have it, but it failed. |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||||
|
you modified \`acconfig.h' or \`${configure_ac}'. You might want |
||||||
|
to install the \`Autoconf' and \`GNU m4' packages. Grab them |
||||||
|
from any GNU archive site." |
||||||
|
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` |
||||||
|
test -z "$files" && files="config.h" |
||||||
|
touch_files= |
||||||
|
for f in $files; do |
||||||
|
case "$f" in |
||||||
|
*:*) touch_files="$touch_files "`echo "$f" | |
||||||
|
sed -e 's/^[^:]*://' -e 's/:.*//'`;; |
||||||
|
*) touch_files="$touch_files $f.in";; |
||||||
|
esac |
||||||
|
done |
||||||
|
touch $touch_files |
||||||
|
;; |
||||||
|
|
||||||
|
automake*) |
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then |
||||||
|
# We have it, but it failed. |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||||
|
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. |
||||||
|
You might want to install the \`Automake' and \`Perl' packages. |
||||||
|
Grab them from any GNU archive site." |
||||||
|
find . -type f -name Makefile.am -print | |
||||||
|
sed 's/\.am$/.in/' | |
||||||
|
while read f; do touch "$f"; done |
||||||
|
;; |
||||||
|
|
||||||
|
autom4te) |
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then |
||||||
|
# We have it, but it failed. |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is needed, and you do not seem to have it handy on your |
||||||
|
system. You might have modified some files without having the |
||||||
|
proper tools for further handling them. |
||||||
|
You can get \`$1Help2man' as part of \`Autoconf' from any GNU |
||||||
|
archive site." |
||||||
|
|
||||||
|
file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` |
||||||
|
test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` |
||||||
|
if test -f "$file"; then |
||||||
|
touch $file |
||||||
|
else |
||||||
|
test -z "$file" || exec >$file |
||||||
|
echo "#! /bin/sh" |
||||||
|
echo "# Created by GNU Automake missing as a replacement of" |
||||||
|
echo "# $ $@" |
||||||
|
echo "exit 0" |
||||||
|
chmod +x $file |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
;; |
||||||
|
|
||||||
|
bison|yacc) |
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||||
|
you modified a \`.y' file. You may need the \`Bison' package |
||||||
|
in order for those modifications to take effect. You can get |
||||||
|
\`Bison' from any GNU archive site." |
||||||
|
rm -f y.tab.c y.tab.h |
||||||
|
if [ $# -ne 1 ]; then |
||||||
|
eval LASTARG="\${$#}" |
||||||
|
case "$LASTARG" in |
||||||
|
*.y) |
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` |
||||||
|
if [ -f "$SRCFILE" ]; then |
||||||
|
cp "$SRCFILE" y.tab.c |
||||||
|
fi |
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` |
||||||
|
if [ -f "$SRCFILE" ]; then |
||||||
|
cp "$SRCFILE" y.tab.h |
||||||
|
fi |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
if [ ! -f y.tab.h ]; then |
||||||
|
echo >y.tab.h |
||||||
|
fi |
||||||
|
if [ ! -f y.tab.c ]; then |
||||||
|
echo 'main() { return 0; }' >y.tab.c |
||||||
|
fi |
||||||
|
;; |
||||||
|
|
||||||
|
lex|flex) |
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||||
|
you modified a \`.l' file. You may need the \`Flex' package |
||||||
|
in order for those modifications to take effect. You can get |
||||||
|
\`Flex' from any GNU archive site." |
||||||
|
rm -f lex.yy.c |
||||||
|
if [ $# -ne 1 ]; then |
||||||
|
eval LASTARG="\${$#}" |
||||||
|
case "$LASTARG" in |
||||||
|
*.l) |
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` |
||||||
|
if [ -f "$SRCFILE" ]; then |
||||||
|
cp "$SRCFILE" lex.yy.c |
||||||
|
fi |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
if [ ! -f lex.yy.c ]; then |
||||||
|
echo 'main() { return 0; }' >lex.yy.c |
||||||
|
fi |
||||||
|
;; |
||||||
|
|
||||||
|
help2man) |
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then |
||||||
|
# We have it, but it failed. |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||||
|
you modified a dependency of a manual page. You may need the |
||||||
|
\`Help2man' package in order for those modifications to take |
||||||
|
effect. You can get \`Help2man' from any GNU archive site." |
||||||
|
|
||||||
|
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` |
||||||
|
if test -z "$file"; then |
||||||
|
file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` |
||||||
|
fi |
||||||
|
if [ -f "$file" ]; then |
||||||
|
touch $file |
||||||
|
else |
||||||
|
test -z "$file" || exec >$file |
||||||
|
echo ".ab help2man is required to generate this page" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
;; |
||||||
|
|
||||||
|
makeinfo) |
||||||
|
if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then |
||||||
|
# We have makeinfo, but it failed. |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||||
|
you modified a \`.texi' or \`.texinfo' file, or any other file |
||||||
|
indirectly affecting the aspect of the manual. The spurious |
||||||
|
call might also be the consequence of using a buggy \`make' (AIX, |
||||||
|
DU, IRIX). You might want to install the \`Texinfo' package or |
||||||
|
the \`GNU make' package. Grab either from any GNU archive site." |
||||||
|
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` |
||||||
|
if test -z "$file"; then |
||||||
|
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` |
||||||
|
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` |
||||||
|
fi |
||||||
|
touch $file |
||||||
|
;; |
||||||
|
|
||||||
|
tar) |
||||||
|
shift |
||||||
|
if test -n "$run"; then |
||||||
|
echo 1>&2 "ERROR: \`tar' requires --run" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
# We have already tried tar in the generic part. |
||||||
|
# Look for gnutar/gtar before invocation to avoid ugly error |
||||||
|
# messages. |
||||||
|
if (gnutar --version > /dev/null 2>&1); then |
||||||
|
gnutar "$@" && exit 0 |
||||||
|
fi |
||||||
|
if (gtar --version > /dev/null 2>&1); then |
||||||
|
gtar "$@" && exit 0 |
||||||
|
fi |
||||||
|
firstarg="$1" |
||||||
|
if shift; then |
||||||
|
case "$firstarg" in |
||||||
|
*o*) |
||||||
|
firstarg=`echo "$firstarg" | sed s/o//` |
||||||
|
tar "$firstarg" "$@" && exit 0 |
||||||
|
;; |
||||||
|
esac |
||||||
|
case "$firstarg" in |
||||||
|
*h*) |
||||||
|
firstarg=`echo "$firstarg" | sed s/h//` |
||||||
|
tar "$firstarg" "$@" && exit 0 |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
|
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: I can't seem to be able to run \`tar' with the given arguments. |
||||||
|
You may want to install GNU tar or Free paxutils, or check the |
||||||
|
command line arguments." |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
*) |
||||||
|
echo 1>&2 "\ |
||||||
|
WARNING: \`$1' is needed, and you do not seem to have it handy on your |
||||||
|
system. You might have modified some files without having the |
||||||
|
proper tools for further handling them. Check the \`README' file, |
||||||
|
it often tells you about the needed prerequirements for installing |
||||||
|
this package. You may also peek at any GNU archive site, in case |
||||||
|
some other package would contain this missing \`$1' program." |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
exit 0 |
@ -0,0 +1,111 @@ |
|||||||
|
#! /bin/sh |
||||||
|
# mkinstalldirs --- make directory hierarchy |
||||||
|
# Author: Noah Friedman <friedman@prep.ai.mit.edu> |
||||||
|
# Created: 1993-05-16 |
||||||
|
# Public domain |
||||||
|
|
||||||
|
errstatus=0 |
||||||
|
dirmode="" |
||||||
|
|
||||||
|
usage="\ |
||||||
|
Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." |
||||||
|
|
||||||
|
# process command line arguments |
||||||
|
while test $# -gt 0 ; do |
||||||
|
case $1 in |
||||||
|
-h | --help | --h*) # -h for help |
||||||
|
echo "$usage" 1>&2 |
||||||
|
exit 0 |
||||||
|
;; |
||||||
|
-m) # -m PERM arg |
||||||
|
shift |
||||||
|
test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } |
||||||
|
dirmode=$1 |
||||||
|
shift |
||||||
|
;; |
||||||
|
--) # stop option processing |
||||||
|
shift |
||||||
|
break |
||||||
|
;; |
||||||
|
-*) # unknown option |
||||||
|
echo "$usage" 1>&2 |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
*) # first non-opt arg |
||||||
|
break |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
for file |
||||||
|
do |
||||||
|
if test -d "$file"; then |
||||||
|
shift |
||||||
|
else |
||||||
|
break |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
|
case $# in |
||||||
|
0) exit 0 ;; |
||||||
|
esac |
||||||
|
|
||||||
|
case $dirmode in |
||||||
|
'') |
||||||
|
if mkdir -p -- . 2>/dev/null; then |
||||||
|
echo "mkdir -p -- $*" |
||||||
|
exec mkdir -p -- "$@" |
||||||
|
fi |
||||||
|
;; |
||||||
|
*) |
||||||
|
if mkdir -m "$dirmode" -p -- . 2>/dev/null; then |
||||||
|
echo "mkdir -m $dirmode -p -- $*" |
||||||
|
exec mkdir -m "$dirmode" -p -- "$@" |
||||||
|
fi |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
for file |
||||||
|
do |
||||||
|
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` |
||||||
|
shift |
||||||
|
|
||||||
|
pathcomp= |
||||||
|
for d |
||||||
|
do |
||||||
|
pathcomp="$pathcomp$d" |
||||||
|
case $pathcomp in |
||||||
|
-*) pathcomp=./$pathcomp ;; |
||||||
|
esac |
||||||
|
|
||||||
|
if test ! -d "$pathcomp"; then |
||||||
|
echo "mkdir $pathcomp" |
||||||
|
|
||||||
|
mkdir "$pathcomp" || lasterr=$? |
||||||
|
|
||||||
|
if test ! -d "$pathcomp"; then |
||||||
|
errstatus=$lasterr |
||||||
|
else |
||||||
|
if test ! -z "$dirmode"; then |
||||||
|
echo "chmod $dirmode $pathcomp" |
||||||
|
lasterr="" |
||||||
|
chmod "$dirmode" "$pathcomp" || lasterr=$? |
||||||
|
|
||||||
|
if test ! -z "$lasterr"; then |
||||||
|
errstatus=$lasterr |
||||||
|
fi |
||||||
|
fi |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
pathcomp="$pathcomp/" |
||||||
|
done |
||||||
|
done |
||||||
|
|
||||||
|
exit $errstatus |
||||||
|
|
||||||
|
# Local Variables: |
||||||
|
# mode: shell-script |
||||||
|
# sh-indentation: 2 |
||||||
|
# End: |
||||||
|
# mkinstalldirs ends here |
@ -0,0 +1,24 @@ |
|||||||
|
##
|
||||||
|
## libmad - MPEG audio decoder library
|
||||||
|
## Copyright (C) 2000-2004 Underbit Technologies, Inc.
|
||||||
|
##
|
||||||
|
## 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
|
||||||
|
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
##
|
||||||
|
## $Id: Makefile.am,v 1.3 2004/01/23 09:41:33 rob Exp $
|
||||||
|
##
|
||||||
|
|
||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
EXTRA_DIST = mad.h config.h libmad.dsp
|
@ -0,0 +1,312 @@ |
|||||||
|
# Makefile.in generated by automake 1.8.2 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004 Free Software Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@ |
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
top_builddir = ..
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
host_triplet = @host@
|
||||||
|
subdir = msvc++
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = $(top_builddir)/config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMDEP_FALSE = @AMDEP_FALSE@
|
||||||
|
AMDEP_TRUE = @AMDEP_TRUE@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AR = @AR@
|
||||||
|
ASO = @ASO@
|
||||||
|
ASO_OBJS = @ASO_OBJS@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCAS = @CCAS@
|
||||||
|
CCASFLAGS = @CCASFLAGS@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXCPP = @CXXCPP@
|
||||||
|
CXXDEPMODE = @CXXDEPMODE@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
ECHO = @ECHO@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
F77 = @F77@
|
||||||
|
FFLAGS = @FFLAGS@
|
||||||
|
FPM = @FPM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
ac_ct_AR = @ac_ct_AR@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
ac_ct_CXX = @ac_ct_CXX@
|
||||||
|
ac_ct_F77 = @ac_ct_F77@
|
||||||
|
ac_ct_RANLIB = @ac_ct_RANLIB@
|
||||||
|
ac_ct_STRIP = @ac_ct_STRIP@
|
||||||
|
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
|
||||||
|
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
|
||||||
|
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
|
||||||
|
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
datadir = @datadir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
EXTRA_DIST = mad.h config.h libmad.dsp
|
||||||
|
all: all-am |
||||||
|
|
||||||
|
.SUFFIXES: |
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) |
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign msvc++/Makefile'; \
|
||||||
|
cd $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --foreign msvc++/Makefile
|
||||||
|
.PRECIOUS: Makefile |
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status |
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) |
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps) |
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps) |
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
mostlyclean-libtool: |
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool: |
||||||
|
-rm -rf .libs _libs
|
||||||
|
|
||||||
|
distclean-libtool: |
||||||
|
-rm -f libtool
|
||||||
|
uninstall-info-am: |
||||||
|
tags: TAGS |
||||||
|
TAGS: |
||||||
|
|
||||||
|
ctags: CTAGS |
||||||
|
CTAGS: |
||||||
|
|
||||||
|
|
||||||
|
distdir: $(DISTFILES) |
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
|
||||||
|
list='$(DISTFILES)'; for file in $$list; do \
|
||||||
|
case $$file in \
|
||||||
|
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
|
||||||
|
esac; \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
|
||||||
|
dir="/$$dir"; \
|
||||||
|
$(mkdir_p) "$(distdir)$$dir"; \
|
||||||
|
else \
|
||||||
|
dir=''; \
|
||||||
|
fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
fi; \
|
||||||
|
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
check-am: all-am |
||||||
|
check: check-am |
||||||
|
all-am: Makefile |
||||||
|
installdirs: |
||||||
|
install: install-am |
||||||
|
install-exec: install-exec-am |
||||||
|
install-data: install-data-am |
||||||
|
uninstall: uninstall-am |
||||||
|
|
||||||
|
install-am: all-am |
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-am |
||||||
|
install-strip: |
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
`test -z '$(STRIP)' || \
|
||||||
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
|
mostlyclean-generic: |
||||||
|
|
||||||
|
clean-generic: |
||||||
|
|
||||||
|
distclean-generic: |
||||||
|
-rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic: |
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
clean: clean-am |
||||||
|
|
||||||
|
clean-am: clean-generic clean-libtool mostlyclean-am |
||||||
|
|
||||||
|
distclean: distclean-am |
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-generic distclean-libtool |
||||||
|
|
||||||
|
dvi: dvi-am |
||||||
|
|
||||||
|
dvi-am: |
||||||
|
|
||||||
|
html: html-am |
||||||
|
|
||||||
|
info: info-am |
||||||
|
|
||||||
|
info-am: |
||||||
|
|
||||||
|
install-data-am: |
||||||
|
|
||||||
|
install-exec-am: |
||||||
|
|
||||||
|
install-info: install-info-am |
||||||
|
|
||||||
|
install-man: |
||||||
|
|
||||||
|
installcheck-am: |
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-am |
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic |
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am |
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-generic mostlyclean-libtool |
||||||
|
|
||||||
|
pdf: pdf-am |
||||||
|
|
||||||
|
pdf-am: |
||||||
|
|
||||||
|
ps: ps-am |
||||||
|
|
||||||
|
ps-am: |
||||||
|
|
||||||
|
uninstall-am: uninstall-info-am |
||||||
|
|
||||||
|
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
|
||||||
|
distclean distclean-generic distclean-libtool distdir dvi \
|
||||||
|
dvi-am html html-am info info-am install install-am \
|
||||||
|
install-data install-data-am install-exec install-exec-am \
|
||||||
|
install-info install-info-am install-man install-strip \
|
||||||
|
installcheck installcheck-am installdirs maintainer-clean \
|
||||||
|
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
||||||
|
mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
|
||||||
|
uninstall-info-am
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT: |
@ -0,0 +1,130 @@ |
|||||||
|
/* config.h. Generated by configure. */ |
||||||
|
/* config.h.in. Generated from configure.ac by autoheader. */ |
||||||
|
|
||||||
|
/* Define to enable diagnostic debugging support. */ |
||||||
|
/* #undef DEBUG */ |
||||||
|
|
||||||
|
/* Define to enable experimental code. */ |
||||||
|
/* #undef EXPERIMENTAL */ |
||||||
|
|
||||||
|
/* Define to 1 if you have the <assert.h> header file. */ |
||||||
|
#define HAVE_ASSERT_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the <dlfcn.h> header file. */ |
||||||
|
/* #undef HAVE_DLFCN_H */ |
||||||
|
|
||||||
|
/* Define to 1 if you have the <errno.h> header file. */ |
||||||
|
#define HAVE_ERRNO_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the `fcntl' function. */ |
||||||
|
/* #undef HAVE_FCNTL */ |
||||||
|
|
||||||
|
/* Define to 1 if you have the <fcntl.h> header file. */ |
||||||
|
#define HAVE_FCNTL_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the `fork' function. */ |
||||||
|
/* #undef HAVE_FORK */ |
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */ |
||||||
|
#define HAVE_INTTYPES_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the <limits.h> header file. */ |
||||||
|
#define HAVE_LIMITS_H 1 |
||||||
|
|
||||||
|
/* Define if your MIPS CPU supports a 2-operand MADD16 instruction. */ |
||||||
|
/* #undef HAVE_MADD16_ASM */ |
||||||
|
|
||||||
|
/* Define if your MIPS CPU supports a 2-operand MADD instruction. */ |
||||||
|
/* #undef HAVE_MADD_ASM */ |
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */ |
||||||
|
#define HAVE_MEMORY_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the `pipe' function. */ |
||||||
|
/* #undef HAVE_PIPE */ |
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */ |
||||||
|
#define HAVE_STDINT_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */ |
||||||
|
#define HAVE_STDLIB_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */ |
||||||
|
#define HAVE_STRINGS_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */ |
||||||
|
#define HAVE_STRING_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */ |
||||||
|
#define HAVE_SYS_STAT_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */ |
||||||
|
#define HAVE_SYS_TYPES_H 1 |
||||||
|
|
||||||
|
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */ |
||||||
|
/* #undef HAVE_SYS_WAIT_H */ |
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */ |
||||||
|
/* #undef HAVE_UNISTD_H */ |
||||||
|
|
||||||
|
/* Define to 1 if you have the `waitpid' function. */ |
||||||
|
/* #undef HAVE_WAITPID */ |
||||||
|
|
||||||
|
/* Define to disable debugging assertions. */ |
||||||
|
/* #undef NDEBUG */ |
||||||
|
|
||||||
|
/* Define to optimize for accuracy over speed. */ |
||||||
|
/* #undef OPT_ACCURACY */ |
||||||
|
|
||||||
|
/* Define to optimize for speed over accuracy. */ |
||||||
|
/* #undef OPT_SPEED */ |
||||||
|
|
||||||
|
/* Define to enable a fast subband synthesis approximation optimization. */ |
||||||
|
/* #undef OPT_SSO */ |
||||||
|
|
||||||
|
/* Define to influence a strict interpretation of the ISO/IEC standards, even
|
||||||
|
if this is in opposition with best accepted practices. */ |
||||||
|
/* #undef OPT_STRICT */ |
||||||
|
|
||||||
|
/* Name of package */ |
||||||
|
#define PACKAGE "libmad" |
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */ |
||||||
|
#define PACKAGE_BUGREPORT "support@underbit.com" |
||||||
|
|
||||||
|
/* Define to the full name of this package. */ |
||||||
|
#define PACKAGE_NAME "MPEG Audio Decoder" |
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */ |
||||||
|
#define PACKAGE_STRING "MPEG Audio Decoder 0.15.1b" |
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */ |
||||||
|
#define PACKAGE_TARNAME "libmad" |
||||||
|
|
||||||
|
/* Define to the version of this package. */ |
||||||
|
#define PACKAGE_VERSION "0.15.1b" |
||||||
|
|
||||||
|
/* The size of a `int', as computed by sizeof. */ |
||||||
|
#define SIZEOF_INT 4 |
||||||
|
|
||||||
|
/* The size of a `long', as computed by sizeof. */ |
||||||
|
#define SIZEOF_LONG 4 |
||||||
|
|
||||||
|
/* The size of a `long long', as computed by sizeof. */ |
||||||
|
#define SIZEOF_LONG_LONG 8 |
||||||
|
|
||||||
|
/* Define to 1 if you have the ANSI C header files. */ |
||||||
|
#define STDC_HEADERS 1 |
||||||
|
|
||||||
|
/* Version number of package */ |
||||||
|
#define VERSION "0.15.1b" |
||||||
|
|
||||||
|
/* Define to empty if `const' does not conform to ANSI C. */ |
||||||
|
/* #undef const */ |
||||||
|
|
||||||
|
/* Define as `__inline' if that's what the C compiler calls it, or to nothing
|
||||||
|
if it is not supported. */ |
||||||
|
#define inline __inline |
||||||
|
|
||||||
|
/* Define to `int' if <sys/types.h> does not define. */ |
||||||
|
/* #undef pid_t */ |
@ -0,0 +1,214 @@ |
|||||||
|
# Microsoft Developer Studio Project File - Name="libmad" - Package Owner=<4> |
||||||
|
# Microsoft Developer Studio Generated Build File, Format Version 6.00 |
||||||
|
# ** DO NOT EDIT ** |
||||||
|
|
||||||
|
# TARGTYPE "Win32 (x86) Static Library" 0x0104 |
||||||
|
|
||||||
|
CFG=libmad - Win32 Debug |
||||||
|
!MESSAGE This is not a valid makefile. To build this project using NMAKE, |
||||||
|
!MESSAGE use the Export Makefile command and run |
||||||
|
!MESSAGE |
||||||
|
!MESSAGE NMAKE /f "libmad.mak". |
||||||
|
!MESSAGE |
||||||
|
!MESSAGE You can specify a configuration when running NMAKE |
||||||
|
!MESSAGE by defining the macro CFG on the command line. For example: |
||||||
|
!MESSAGE |
||||||
|
!MESSAGE NMAKE /f "libmad.mak" CFG="libmad - Win32 Debug" |
||||||
|
!MESSAGE |
||||||
|
!MESSAGE Possible choices for configuration are: |
||||||
|
!MESSAGE |
||||||
|
!MESSAGE "libmad - Win32 Release" (based on "Win32 (x86) Static Library") |
||||||
|
!MESSAGE "libmad - Win32 Debug" (based on "Win32 (x86) Static Library") |
||||||
|
!MESSAGE |
||||||
|
|
||||||
|
# Begin Project |
||||||
|
# PROP AllowPerConfigDependencies 0 |
||||||
|
# PROP Scc_ProjName "" |
||||||
|
# PROP Scc_LocalPath "" |
||||||
|
CPP=cl.exe |
||||||
|
RSC=rc.exe |
||||||
|
|
||||||
|
!IF "$(CFG)" == "libmad - Win32 Release" |
||||||
|
|
||||||
|
# PROP BASE Use_MFC 0 |
||||||
|
# PROP BASE Use_Debug_Libraries 0 |
||||||
|
# PROP BASE Output_Dir "Release" |
||||||
|
# PROP BASE Intermediate_Dir "Release" |
||||||
|
# PROP BASE Target_Dir "" |
||||||
|
# PROP Use_MFC 0 |
||||||
|
# PROP Use_Debug_Libraries 0 |
||||||
|
# PROP Output_Dir "Release" |
||||||
|
# PROP Intermediate_Dir "Release" |
||||||
|
# PROP Target_Dir "" |
||||||
|
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c |
||||||
|
# ADD CPP /nologo /GX /O2 /I "." /D "NDEBUG" /D "FPM_INTEL" /D "WIN32" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /D "ASO_ZEROCHECK" /FD /c |
||||||
|
# SUBTRACT CPP /YX |
||||||
|
# ADD BASE RSC /l 0x409 /d "NDEBUG" |
||||||
|
# ADD RSC /l 0x409 /d "NDEBUG" |
||||||
|
BSC32=bscmake.exe |
||||||
|
# ADD BASE BSC32 /nologo |
||||||
|
# ADD BSC32 /nologo |
||||||
|
LIB32=link.exe -lib |
||||||
|
# ADD BASE LIB32 /nologo |
||||||
|
# ADD LIB32 /nologo |
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "libmad - Win32 Debug" |
||||||
|
|
||||||
|
# PROP BASE Use_MFC 0 |
||||||
|
# PROP BASE Use_Debug_Libraries 1 |
||||||
|
# PROP BASE Output_Dir "Debug" |
||||||
|
# PROP BASE Intermediate_Dir "Debug" |
||||||
|
# PROP BASE Target_Dir "" |
||||||
|
# PROP Use_MFC 0 |
||||||
|
# PROP Use_Debug_Libraries 1 |
||||||
|
# PROP Output_Dir "Debug" |
||||||
|
# PROP Intermediate_Dir "Debug" |
||||||
|
# PROP Target_Dir "" |
||||||
|
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c |
||||||
|
# ADD CPP /nologo /Gm /GX /ZI /Od /I "." /D "FPM_DEFAULT" /D "_LIB" /D "HAVE_CONFIG_H" /D "ASO_ZEROCHECK" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "DEBUG" /FD /GZ /c |
||||||
|
# SUBTRACT CPP /YX |
||||||
|
# ADD BASE RSC /l 0x409 /d "_DEBUG" |
||||||
|
# ADD RSC /l 0x409 /d "_DEBUG" |
||||||
|
BSC32=bscmake.exe |
||||||
|
# ADD BASE BSC32 /nologo |
||||||
|
# ADD BSC32 /nologo |
||||||
|
LIB32=link.exe -lib |
||||||
|
# ADD BASE LIB32 /nologo |
||||||
|
# ADD LIB32 /nologo |
||||||
|
|
||||||
|
!ENDIF |
||||||
|
|
||||||
|
# Begin Target |
||||||
|
|
||||||
|
# Name "libmad - Win32 Release" |
||||||
|
# Name "libmad - Win32 Debug" |
||||||
|
# Begin Group "Source Files" |
||||||
|
|
||||||
|
# PROP Default_Filter "c" |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\bit.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\decoder.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\fixed.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\frame.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\huffman.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\layer12.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\layer3.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\stream.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\synth.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\timer.c |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\version.c |
||||||
|
# End Source File |
||||||
|
# End Group |
||||||
|
# Begin Group "Header Files" |
||||||
|
|
||||||
|
# PROP Default_Filter "h" |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\bit.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=.\config.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\decoder.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\fixed.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\frame.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\global.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\huffman.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\layer12.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\layer3.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\stream.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\synth.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\timer.h |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\version.h |
||||||
|
# End Source File |
||||||
|
# End Group |
||||||
|
# Begin Group "Data Files" |
||||||
|
|
||||||
|
# PROP Default_Filter "dat" |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\D.dat |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\imdct_s.dat |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\qc_table.dat |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\rq_table.dat |
||||||
|
# End Source File |
||||||
|
# Begin Source File |
||||||
|
|
||||||
|
SOURCE=..\sf_table.dat |
||||||
|
# End Source File |
||||||
|
# End Group |
||||||
|
# End Target |
||||||
|
# End Project |
@ -0,0 +1,948 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* If you would like to negotiate alternate licensing terms, you may do |
||||||
|
* so by contacting: Underbit Technologies, Inc. <info@underbit.com> |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
# endif |
||||||
|
|
||||||
|
# define FPM_INTEL |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# define SIZEOF_INT 4 |
||||||
|
# define SIZEOF_LONG 4 |
||||||
|
# define SIZEOF_LONG_LONG 8 |
||||||
|
|
||||||
|
|
||||||
|
/* Id: version.h,v 1.24 2003/05/27 22:40:37 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_VERSION_H |
||||||
|
# define LIBMAD_VERSION_H |
||||||
|
|
||||||
|
# define MAD_VERSION_MAJOR 0 |
||||||
|
# define MAD_VERSION_MINOR 15 |
||||||
|
# define MAD_VERSION_PATCH 1 |
||||||
|
# define MAD_VERSION_EXTRA " (beta)" |
||||||
|
|
||||||
|
# define MAD_VERSION_STRINGIZE(str) #str |
||||||
|
# define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num) |
||||||
|
|
||||||
|
# define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ |
||||||
|
MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \
|
||||||
|
MAD_VERSION_STRING(MAD_VERSION_PATCH) \
|
||||||
|
MAD_VERSION_EXTRA |
||||||
|
|
||||||
|
# define MAD_PUBLISHYEAR "2000-2003" |
||||||
|
# define MAD_AUTHOR "Underbit Technologies, Inc." |
||||||
|
# define MAD_EMAIL "info@underbit.com" |
||||||
|
|
||||||
|
extern char const mad_version[]; |
||||||
|
extern char const mad_copyright[]; |
||||||
|
extern char const mad_author[]; |
||||||
|
extern char const mad_build[]; |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: fixed.h,v 1.36 2003/05/28 04:36:00 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_FIXED_H |
||||||
|
# define LIBMAD_FIXED_H |
||||||
|
|
||||||
|
# if SIZEOF_INT >= 4 |
||||||
|
typedef signed int mad_fixed_t; |
||||||
|
|
||||||
|
typedef signed int mad_fixed64hi_t; |
||||||
|
typedef unsigned int mad_fixed64lo_t; |
||||||
|
# else |
||||||
|
typedef signed long mad_fixed_t; |
||||||
|
|
||||||
|
typedef signed long mad_fixed64hi_t; |
||||||
|
typedef unsigned long mad_fixed64lo_t; |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(_MSC_VER) |
||||||
|
# define mad_fixed64_t signed __int64 |
||||||
|
# elif 1 || defined(__GNUC__) |
||||||
|
# define mad_fixed64_t signed long long |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(FPM_FLOAT) |
||||||
|
typedef double mad_sample_t; |
||||||
|
# else |
||||||
|
typedef mad_fixed_t mad_sample_t; |
||||||
|
# endif |
||||||
|
|
||||||
|
/*
|
||||||
|
* Fixed-point format: 0xABBBBBBB |
||||||
|
* A == whole part (sign + 3 bits) |
||||||
|
* B == fractional part (28 bits) |
||||||
|
* |
||||||
|
* Values are signed two's complement, so the effective range is: |
||||||
|
* 0x80000000 to 0x7fffffff |
||||||
|
* -8.0 to +7.9999999962747097015380859375 |
||||||
|
* |
||||||
|
* The smallest representable value is: |
||||||
|
* 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) |
||||||
|
* |
||||||
|
* 28 bits of fractional accuracy represent about |
||||||
|
* 8.6 digits of decimal accuracy. |
||||||
|
* |
||||||
|
* Fixed-point numbers can be added or subtracted as normal |
||||||
|
* integers, but multiplication requires shifting the 64-bit result |
||||||
|
* from 56 fractional bits back to 28 (and rounding.) |
||||||
|
* |
||||||
|
* Changing the definition of MAD_F_FRACBITS is only partially |
||||||
|
* supported, and must be done with care. |
||||||
|
*/ |
||||||
|
|
||||||
|
# define MAD_F_FRACBITS 28 |
||||||
|
|
||||||
|
# if MAD_F_FRACBITS == 28 |
||||||
|
# define MAD_F(x) ((mad_fixed_t) (x##L)) |
||||||
|
# else |
||||||
|
# if MAD_F_FRACBITS < 28 |
||||||
|
# warning "MAD_F_FRACBITS < 28" |
||||||
|
# define MAD_F(x) ((mad_fixed_t) \ |
||||||
|
(((x##L) + \
|
||||||
|
(1L << (28 - MAD_F_FRACBITS - 1))) >> \
|
||||||
|
(28 - MAD_F_FRACBITS))) |
||||||
|
# elif MAD_F_FRACBITS > 28 |
||||||
|
# error "MAD_F_FRACBITS > 28 not currently supported" |
||||||
|
# define MAD_F(x) ((mad_fixed_t) \ |
||||||
|
((x##L) << (MAD_F_FRACBITS - 28))) |
||||||
|
# endif |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_MIN ((mad_fixed_t) -0x80000000L) |
||||||
|
# define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) |
||||||
|
|
||||||
|
# define MAD_F_ONE MAD_F(0x10000000) |
||||||
|
|
||||||
|
# define mad_f_tofixed(x) ((mad_fixed_t) \ |
||||||
|
((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) |
||||||
|
# define mad_f_todouble(x) ((double) \ |
||||||
|
((x) / (double) (1L << MAD_F_FRACBITS))) |
||||||
|
|
||||||
|
# define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) |
||||||
|
# define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) |
||||||
|
/* (x should be positive) */ |
||||||
|
|
||||||
|
# define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) |
||||||
|
|
||||||
|
# define mad_f_add(x, y) ((x) + (y)) |
||||||
|
# define mad_f_sub(x, y) ((x) - (y)) |
||||||
|
|
||||||
|
# if defined(FPM_FLOAT) |
||||||
|
# error "FPM_FLOAT not yet supported" |
||||||
|
|
||||||
|
# undef MAD_F |
||||||
|
# define MAD_F(x) mad_f_todouble(x) |
||||||
|
|
||||||
|
# define mad_f_mul(x, y) ((x) * (y)) |
||||||
|
# define mad_f_scale64 |
||||||
|
|
||||||
|
# undef ASO_ZEROCHECK |
||||||
|
|
||||||
|
# elif defined(FPM_64BIT) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This version should be the most accurate if 64-bit types are supported by |
||||||
|
* the compiler, although it may not be the most efficient. |
||||||
|
*/ |
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
((mad_fixed_t) \
|
||||||
|
((((mad_fixed64_t) (x) * (y)) + \
|
||||||
|
(1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) |
||||||
|
# else |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
|
||||||
|
/* --- Intel --------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_INTEL) |
||||||
|
|
||||||
|
# if defined(_MSC_VER) |
||||||
|
# pragma warning(push) |
||||||
|
# pragma warning(disable: 4035) /* no return value */ |
||||||
|
static __forceinline |
||||||
|
mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) |
||||||
|
{ |
||||||
|
enum { |
||||||
|
fracbits = MAD_F_FRACBITS |
||||||
|
}; |
||||||
|
|
||||||
|
__asm { |
||||||
|
mov eax, x |
||||||
|
imul y |
||||||
|
shrd eax, edx, fracbits |
||||||
|
} |
||||||
|
|
||||||
|
/* implicit return of eax */ |
||||||
|
} |
||||||
|
# pragma warning(pop) |
||||||
|
|
||||||
|
# define mad_f_mul mad_f_mul_inline |
||||||
|
# define mad_f_scale64 |
||||||
|
# else |
||||||
|
/*
|
||||||
|
* This Intel version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("imull %3" \
|
||||||
|
: "=a" (lo), "=d" (hi) \
|
||||||
|
: "%a" (x), "rm" (y) \
|
||||||
|
: "cc") |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* This gives best accuracy but is not very fast. |
||||||
|
*/ |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
({ mad_fixed64hi_t __hi; \
|
||||||
|
mad_fixed64lo_t __lo; \
|
||||||
|
MAD_F_MLX(__hi, __lo, (x), (y)); \
|
||||||
|
asm ("addl %2,%0\n\t" \
|
||||||
|
"adcl %3,%1" \
|
||||||
|
: "=rm" (lo), "=rm" (hi) \
|
||||||
|
: "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \
|
||||||
|
: "cc"); \
|
||||||
|
}) |
||||||
|
# endif /* OPT_ACCURACY */ |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* Surprisingly, this is faster than SHRD followed by ADC. |
||||||
|
*/ |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed64hi_t __hi_; \
|
||||||
|
mad_fixed64lo_t __lo_; \
|
||||||
|
mad_fixed_t __result; \
|
||||||
|
asm ("addl %4,%2\n\t" \
|
||||||
|
"adcl %5,%3" \
|
||||||
|
: "=rm" (__lo_), "=rm" (__hi_) \
|
||||||
|
: "0" (lo), "1" (hi), \
|
||||||
|
"ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \
|
||||||
|
: "cc"); \
|
||||||
|
asm ("shrdl %3,%2,%1" \
|
||||||
|
: "=rm" (__result) \
|
||||||
|
: "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("shrdl %3,%2,%1" \
|
||||||
|
: "=rm" (__result) \
|
||||||
|
: "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# endif /* OPT_ACCURACY */ |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
# endif |
||||||
|
|
||||||
|
/* --- ARM ----------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_ARM) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This ARM V4 version is as accurate as FPM_64BIT but much faster. The |
||||||
|
* least significant bit is properly rounded at no CPU cycle cost! |
||||||
|
*/ |
||||||
|
# if 1 |
||||||
|
/*
|
||||||
|
* This is faster than the default implementation via MAD_F_MLX() and |
||||||
|
* mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
({ mad_fixed64hi_t __hi; \
|
||||||
|
mad_fixed64lo_t __lo; \
|
||||||
|
mad_fixed_t __result; \
|
||||||
|
asm ("smull %0, %1, %3, %4\n\t" \
|
||||||
|
"movs %0, %0, lsr %5\n\t" \
|
||||||
|
"adc %2, %0, %1, lsl %6" \
|
||||||
|
: "=&r" (__lo), "=&r" (__hi), "=r" (__result) \
|
||||||
|
: "%r" (x), "r" (y), \
|
||||||
|
"M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("smull %0, %1, %2, %3" \
|
||||||
|
: "=&r" (lo), "=&r" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
|
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
asm ("smlal %0, %1, %2, %3" \
|
||||||
|
: "+r" (lo), "+r" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
|
||||||
|
# define MAD_F_MLN(hi, lo) \ |
||||||
|
asm ("rsbs %0, %2, #0\n\t" \
|
||||||
|
"rsc %1, %3, #0" \
|
||||||
|
: "=r" (lo), "=r" (hi) \
|
||||||
|
: "0" (lo), "1" (hi) \
|
||||||
|
: "cc") |
||||||
|
|
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("movs %0, %1, lsr %3\n\t" \
|
||||||
|
"adc %0, %0, %2, lsl %4" \
|
||||||
|
: "=&r" (__result) \
|
||||||
|
: "r" (lo), "r" (hi), \
|
||||||
|
"M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \
|
||||||
|
: "cc"); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
|
||||||
|
/* --- MIPS ---------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_MIPS) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This MIPS version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("mult %2,%3" \
|
||||||
|
: "=l" (lo), "=h" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
|
||||||
|
# if defined(HAVE_MADD_ASM) |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
asm ("madd %2,%3" \
|
||||||
|
: "+l" (lo), "+h" (hi) \
|
||||||
|
: "%r" (x), "r" (y)) |
||||||
|
# elif defined(HAVE_MADD16_ASM) |
||||||
|
/*
|
||||||
|
* This loses significant accuracy due to the 16-bit integer limit in the |
||||||
|
* multiply/accumulate instruction. |
||||||
|
*/ |
||||||
|
# define MAD_F_ML0(hi, lo, x, y) \ |
||||||
|
asm ("mult %2,%3" \
|
||||||
|
: "=l" (lo), "=h" (hi) \
|
||||||
|
: "%r" ((x) >> 12), "r" ((y) >> 16)) |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
asm ("madd16 %2,%3" \
|
||||||
|
: "+l" (lo), "+h" (hi) \
|
||||||
|
: "%r" ((x) >> 12), "r" ((y) >> 16)) |
||||||
|
# define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_SPEED) |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) |
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
# endif |
||||||
|
|
||||||
|
/* --- SPARC --------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_SPARC) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This SPARC V8 version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
asm ("smul %2, %3, %0\n\t" \
|
||||||
|
"rd %%y, %1" \
|
||||||
|
: "=r" (lo), "=r" (hi) \
|
||||||
|
: "%r" (x), "rI" (y)) |
||||||
|
|
||||||
|
/* --- PowerPC ------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_PPC) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This PowerPC version is fast and accurate; the disposition of the least |
||||||
|
* significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
||||||
|
*/ |
||||||
|
# define MAD_F_MLX(hi, lo, x, y) \ |
||||||
|
do { \
|
||||||
|
asm ("mullw %0,%1,%2" \
|
||||||
|
: "=r" (lo) \
|
||||||
|
: "%r" (x), "r" (y)); \
|
||||||
|
asm ("mulhw %0,%1,%2" \
|
||||||
|
: "=r" (hi) \
|
||||||
|
: "%r" (x), "r" (y)); \
|
||||||
|
} \
|
||||||
|
while (0) |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* This gives best accuracy but is not very fast. |
||||||
|
*/ |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) \ |
||||||
|
({ mad_fixed64hi_t __hi; \
|
||||||
|
mad_fixed64lo_t __lo; \
|
||||||
|
MAD_F_MLX(__hi, __lo, (x), (y)); \
|
||||||
|
asm ("addc %0,%2,%3\n\t" \
|
||||||
|
"adde %1,%4,%5" \
|
||||||
|
: "=r" (lo), "=r" (hi) \
|
||||||
|
: "%r" (lo), "r" (__lo), \
|
||||||
|
"%r" (hi), "r" (__hi) \
|
||||||
|
: "xer"); \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
/*
|
||||||
|
* This is slower than the truncating version below it. |
||||||
|
*/ |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result, __round; \
|
||||||
|
asm ("rotrwi %0,%1,%2" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "r" (lo), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
asm ("extrwi %0,%1,1,0" \
|
||||||
|
: "=r" (__round) \
|
||||||
|
: "r" (__result)); \
|
||||||
|
asm ("insrwi %0,%1,%2,0" \
|
||||||
|
: "+r" (__result) \
|
||||||
|
: "r" (hi), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
asm ("add %0,%1,%2" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "%r" (__result), "r" (__round)); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
({ mad_fixed_t __result; \
|
||||||
|
asm ("rotrwi %0,%1,%2" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "r" (lo), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
asm ("insrwi %0,%1,%2,0" \
|
||||||
|
: "+r" (__result) \
|
||||||
|
: "r" (hi), "i" (MAD_F_SCALEBITS)); \
|
||||||
|
__result; \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
|
||||||
|
/* --- Default ------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# elif defined(FPM_DEFAULT) |
||||||
|
|
||||||
|
/*
|
||||||
|
* This version is the most portable but it loses significant accuracy. |
||||||
|
* Furthermore, accuracy is biased against the second argument, so care |
||||||
|
* should be taken when ordering operands. |
||||||
|
* |
||||||
|
* The scale factors are constant as this is not used with SSO. |
||||||
|
* |
||||||
|
* Pre-rounding is required to stay within the limits of compliance. |
||||||
|
*/ |
||||||
|
# if defined(OPT_SPEED) |
||||||
|
# define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16)) |
||||||
|
# else |
||||||
|
# define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) * \ |
||||||
|
(((y) + (1L << 15)) >> 16)) |
||||||
|
# endif |
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */ |
||||||
|
|
||||||
|
# else |
||||||
|
# error "no FPM selected" |
||||||
|
# endif |
||||||
|
|
||||||
|
/* default implementations */ |
||||||
|
|
||||||
|
# if !defined(mad_f_mul) |
||||||
|
# define mad_f_mul(x, y) \ |
||||||
|
({ register mad_fixed64hi_t __hi; \
|
||||||
|
register mad_fixed64lo_t __lo; \
|
||||||
|
MAD_F_MLX(__hi, __lo, (x), (y)); \
|
||||||
|
mad_f_scale64(__hi, __lo); \
|
||||||
|
}) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_MLA) |
||||||
|
# define MAD_F_ML0(hi, lo, x, y) ((lo) = mad_f_mul((x), (y))) |
||||||
|
# define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y))) |
||||||
|
# define MAD_F_MLN(hi, lo) ((lo) = -(lo)) |
||||||
|
# define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_ML0) |
||||||
|
# define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_MLN) |
||||||
|
# define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(MAD_F_MLZ) |
||||||
|
# define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) |
||||||
|
# endif |
||||||
|
|
||||||
|
# if !defined(mad_f_scale64) |
||||||
|
# if defined(OPT_ACCURACY) |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
((((mad_fixed_t) \
|
||||||
|
(((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \
|
||||||
|
((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) |
||||||
|
# else |
||||||
|
# define mad_f_scale64(hi, lo) \ |
||||||
|
((mad_fixed_t) \
|
||||||
|
(((hi) << (32 - MAD_F_SCALEBITS)) | \
|
||||||
|
((lo) >> MAD_F_SCALEBITS))) |
||||||
|
# endif |
||||||
|
# define MAD_F_SCALEBITS MAD_F_FRACBITS |
||||||
|
# endif |
||||||
|
|
||||||
|
/* C routines */ |
||||||
|
|
||||||
|
mad_fixed_t mad_f_abs(mad_fixed_t); |
||||||
|
mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: bit.h,v 1.11 2003/05/27 22:40:36 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_BIT_H |
||||||
|
# define LIBMAD_BIT_H |
||||||
|
|
||||||
|
struct mad_bitptr { |
||||||
|
unsigned char const *byte; |
||||||
|
unsigned short cache; |
||||||
|
unsigned short left; |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_bit_init(struct mad_bitptr *, unsigned char const *); |
||||||
|
|
||||||
|
# define mad_bit_finish(bitptr) /* nothing */ |
||||||
|
|
||||||
|
unsigned int mad_bit_length(struct mad_bitptr const *, |
||||||
|
struct mad_bitptr const *); |
||||||
|
|
||||||
|
# define mad_bit_bitsleft(bitptr) ((bitptr)->left) |
||||||
|
unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); |
||||||
|
|
||||||
|
void mad_bit_skip(struct mad_bitptr *, unsigned int); |
||||||
|
unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); |
||||||
|
void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); |
||||||
|
|
||||||
|
unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: timer.h,v 1.15 2003/05/27 22:40:37 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_TIMER_H |
||||||
|
# define LIBMAD_TIMER_H |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
signed long seconds; /* whole seconds */ |
||||||
|
unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ |
||||||
|
} mad_timer_t; |
||||||
|
|
||||||
|
extern mad_timer_t const mad_timer_zero; |
||||||
|
|
||||||
|
# define MAD_TIMER_RESOLUTION 352800000UL |
||||||
|
|
||||||
|
enum mad_units { |
||||||
|
MAD_UNITS_HOURS = -2, |
||||||
|
MAD_UNITS_MINUTES = -1, |
||||||
|
MAD_UNITS_SECONDS = 0, |
||||||
|
|
||||||
|
/* metric units */ |
||||||
|
|
||||||
|
MAD_UNITS_DECISECONDS = 10, |
||||||
|
MAD_UNITS_CENTISECONDS = 100, |
||||||
|
MAD_UNITS_MILLISECONDS = 1000, |
||||||
|
|
||||||
|
/* audio sample units */ |
||||||
|
|
||||||
|
MAD_UNITS_8000_HZ = 8000, |
||||||
|
MAD_UNITS_11025_HZ = 11025, |
||||||
|
MAD_UNITS_12000_HZ = 12000, |
||||||
|
|
||||||
|
MAD_UNITS_16000_HZ = 16000, |
||||||
|
MAD_UNITS_22050_HZ = 22050, |
||||||
|
MAD_UNITS_24000_HZ = 24000, |
||||||
|
|
||||||
|
MAD_UNITS_32000_HZ = 32000, |
||||||
|
MAD_UNITS_44100_HZ = 44100, |
||||||
|
MAD_UNITS_48000_HZ = 48000, |
||||||
|
|
||||||
|
/* video frame/field units */ |
||||||
|
|
||||||
|
MAD_UNITS_24_FPS = 24, |
||||||
|
MAD_UNITS_25_FPS = 25, |
||||||
|
MAD_UNITS_30_FPS = 30, |
||||||
|
MAD_UNITS_48_FPS = 48, |
||||||
|
MAD_UNITS_50_FPS = 50, |
||||||
|
MAD_UNITS_60_FPS = 60, |
||||||
|
|
||||||
|
/* CD audio frames */ |
||||||
|
|
||||||
|
MAD_UNITS_75_FPS = 75, |
||||||
|
|
||||||
|
/* video drop-frame units */ |
||||||
|
|
||||||
|
MAD_UNITS_23_976_FPS = -24, |
||||||
|
MAD_UNITS_24_975_FPS = -25, |
||||||
|
MAD_UNITS_29_97_FPS = -30, |
||||||
|
MAD_UNITS_47_952_FPS = -48, |
||||||
|
MAD_UNITS_49_95_FPS = -50, |
||||||
|
MAD_UNITS_59_94_FPS = -60 |
||||||
|
}; |
||||||
|
|
||||||
|
# define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero)) |
||||||
|
|
||||||
|
int mad_timer_compare(mad_timer_t, mad_timer_t); |
||||||
|
|
||||||
|
# define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero) |
||||||
|
|
||||||
|
void mad_timer_negate(mad_timer_t *); |
||||||
|
mad_timer_t mad_timer_abs(mad_timer_t); |
||||||
|
|
||||||
|
void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); |
||||||
|
void mad_timer_add(mad_timer_t *, mad_timer_t); |
||||||
|
void mad_timer_multiply(mad_timer_t *, signed long); |
||||||
|
|
||||||
|
signed long mad_timer_count(mad_timer_t, enum mad_units); |
||||||
|
unsigned long mad_timer_fraction(mad_timer_t, unsigned long); |
||||||
|
void mad_timer_string(mad_timer_t, char *, char const *, |
||||||
|
enum mad_units, enum mad_units, unsigned long); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: stream.h,v 1.18 2003/05/27 22:40:37 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_STREAM_H |
||||||
|
# define LIBMAD_STREAM_H |
||||||
|
|
||||||
|
|
||||||
|
# define MAD_BUFFER_GUARD 8 |
||||||
|
# define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) |
||||||
|
|
||||||
|
enum mad_error { |
||||||
|
MAD_ERROR_NONE = 0x0000, /* no error */ |
||||||
|
|
||||||
|
MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ |
||||||
|
MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ |
||||||
|
|
||||||
|
MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ |
||||||
|
|
||||||
|
MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ |
||||||
|
MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ |
||||||
|
MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ |
||||||
|
MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ |
||||||
|
MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ |
||||||
|
|
||||||
|
MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ |
||||||
|
MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ |
||||||
|
MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ |
||||||
|
MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ |
||||||
|
MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ |
||||||
|
MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ |
||||||
|
MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ |
||||||
|
MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ |
||||||
|
MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ |
||||||
|
MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ |
||||||
|
MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ |
||||||
|
MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ |
||||||
|
}; |
||||||
|
|
||||||
|
# define MAD_RECOVERABLE(error) ((error) & 0xff00) |
||||||
|
|
||||||
|
struct mad_stream { |
||||||
|
unsigned char const *buffer; /* input bitstream buffer */ |
||||||
|
unsigned char const *bufend; /* end of buffer */ |
||||||
|
unsigned long skiplen; /* bytes to skip before next frame */ |
||||||
|
|
||||||
|
int sync; /* stream sync found */ |
||||||
|
unsigned long freerate; /* free bitrate (fixed) */ |
||||||
|
|
||||||
|
unsigned char const *this_frame; /* start of current frame */ |
||||||
|
unsigned char const *next_frame; /* start of next frame */ |
||||||
|
struct mad_bitptr ptr; /* current processing bit pointer */ |
||||||
|
|
||||||
|
struct mad_bitptr anc_ptr; /* ancillary bits pointer */ |
||||||
|
unsigned int anc_bitlen; /* number of ancillary bits */ |
||||||
|
|
||||||
|
unsigned char (*main_data)[MAD_BUFFER_MDLEN]; |
||||||
|
/* Layer III main_data() */ |
||||||
|
unsigned int md_len; /* bytes in main_data */ |
||||||
|
|
||||||
|
int options; /* decoding options (see below) */ |
||||||
|
enum mad_error error; /* error code (see above) */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum { |
||||||
|
MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ |
||||||
|
MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ |
||||||
|
# if 0 /* not yet implemented */ |
||||||
|
MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ |
||||||
|
MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ |
||||||
|
MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ |
||||||
|
# endif |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_stream_init(struct mad_stream *); |
||||||
|
void mad_stream_finish(struct mad_stream *); |
||||||
|
|
||||||
|
# define mad_stream_options(stream, opts) \ |
||||||
|
((void) ((stream)->options = (opts))) |
||||||
|
|
||||||
|
void mad_stream_buffer(struct mad_stream *, |
||||||
|
unsigned char const *, unsigned long); |
||||||
|
void mad_stream_skip(struct mad_stream *, unsigned long); |
||||||
|
|
||||||
|
int mad_stream_sync(struct mad_stream *); |
||||||
|
|
||||||
|
char const *mad_stream_errorstr(struct mad_stream const *); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: frame.h,v 1.19 2003/05/27 22:40:36 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_FRAME_H |
||||||
|
# define LIBMAD_FRAME_H |
||||||
|
|
||||||
|
|
||||||
|
enum mad_layer { |
||||||
|
MAD_LAYER_I = 1, /* Layer I */ |
||||||
|
MAD_LAYER_II = 2, /* Layer II */ |
||||||
|
MAD_LAYER_III = 3 /* Layer III */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum mad_mode { |
||||||
|
MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ |
||||||
|
MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ |
||||||
|
MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ |
||||||
|
MAD_MODE_STEREO = 3 /* normal LR stereo */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum mad_emphasis { |
||||||
|
MAD_EMPHASIS_NONE = 0, /* no emphasis */ |
||||||
|
MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ |
||||||
|
MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ |
||||||
|
MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_header { |
||||||
|
enum mad_layer layer; /* audio layer (1, 2, or 3) */ |
||||||
|
enum mad_mode mode; /* channel mode (see above) */ |
||||||
|
int mode_extension; /* additional mode info */ |
||||||
|
enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ |
||||||
|
|
||||||
|
unsigned long bitrate; /* stream bitrate (bps) */ |
||||||
|
unsigned int samplerate; /* sampling frequency (Hz) */ |
||||||
|
|
||||||
|
unsigned short crc_check; /* frame CRC accumulator */ |
||||||
|
unsigned short crc_target; /* final target CRC checksum */ |
||||||
|
|
||||||
|
int flags; /* flags (see below) */ |
||||||
|
int private_bits; /* private bits (see below) */ |
||||||
|
|
||||||
|
mad_timer_t duration; /* audio playing time of frame */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_frame { |
||||||
|
struct mad_header header; /* MPEG audio header */ |
||||||
|
|
||||||
|
int options; /* decoding options (from stream) */ |
||||||
|
|
||||||
|
mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */ |
||||||
|
mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */ |
||||||
|
}; |
||||||
|
|
||||||
|
# define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) |
||||||
|
# define MAD_NSBSAMPLES(header) \ |
||||||
|
((header)->layer == MAD_LAYER_I ? 12 : \
|
||||||
|
(((header)->layer == MAD_LAYER_III && \
|
||||||
|
((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) |
||||||
|
|
||||||
|
enum { |
||||||
|
MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ |
||||||
|
MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ |
||||||
|
|
||||||
|
MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ |
||||||
|
MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ |
||||||
|
MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ |
||||||
|
MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ |
||||||
|
|
||||||
|
MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ |
||||||
|
MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ |
||||||
|
MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ |
||||||
|
|
||||||
|
MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ |
||||||
|
MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ |
||||||
|
MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum { |
||||||
|
MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ |
||||||
|
MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_header_init(struct mad_header *); |
||||||
|
|
||||||
|
# define mad_header_finish(header) /* nothing */ |
||||||
|
|
||||||
|
int mad_header_decode(struct mad_header *, struct mad_stream *); |
||||||
|
|
||||||
|
void mad_frame_init(struct mad_frame *); |
||||||
|
void mad_frame_finish(struct mad_frame *); |
||||||
|
|
||||||
|
int mad_frame_decode(struct mad_frame *, struct mad_stream *); |
||||||
|
|
||||||
|
void mad_frame_mute(struct mad_frame *); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: synth.h,v 1.14 2003/05/27 22:40:37 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_SYNTH_H |
||||||
|
# define LIBMAD_SYNTH_H |
||||||
|
|
||||||
|
|
||||||
|
struct mad_pcm { |
||||||
|
unsigned int samplerate; /* sampling frequency (Hz) */ |
||||||
|
unsigned short channels; /* number of channels */ |
||||||
|
unsigned short length; /* number of samples per channel */ |
||||||
|
mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_synth { |
||||||
|
mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ |
||||||
|
/* [ch][eo][peo][s][v] */ |
||||||
|
|
||||||
|
unsigned int phase; /* current processing phase */ |
||||||
|
|
||||||
|
struct mad_pcm pcm; /* PCM output */ |
||||||
|
}; |
||||||
|
|
||||||
|
/* single channel PCM selector */ |
||||||
|
enum { |
||||||
|
MAD_PCM_CHANNEL_SINGLE = 0 |
||||||
|
}; |
||||||
|
|
||||||
|
/* dual channel PCM selector */ |
||||||
|
enum { |
||||||
|
MAD_PCM_CHANNEL_DUAL_1 = 0, |
||||||
|
MAD_PCM_CHANNEL_DUAL_2 = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
/* stereo PCM selector */ |
||||||
|
enum { |
||||||
|
MAD_PCM_CHANNEL_STEREO_LEFT = 0, |
||||||
|
MAD_PCM_CHANNEL_STEREO_RIGHT = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_synth_init(struct mad_synth *); |
||||||
|
|
||||||
|
# define mad_synth_finish(synth) /* nothing */ |
||||||
|
|
||||||
|
void mad_synth_mute(struct mad_synth *); |
||||||
|
|
||||||
|
void mad_synth_frame(struct mad_synth *, struct mad_frame const *); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
/* Id: decoder.h,v 1.16 2003/05/27 22:40:36 rob Exp */ |
||||||
|
|
||||||
|
# ifndef LIBMAD_DECODER_H |
||||||
|
# define LIBMAD_DECODER_H |
||||||
|
|
||||||
|
|
||||||
|
enum mad_decoder_mode { |
||||||
|
MAD_DECODER_MODE_SYNC = 0, |
||||||
|
MAD_DECODER_MODE_ASYNC |
||||||
|
}; |
||||||
|
|
||||||
|
enum mad_flow { |
||||||
|
MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ |
||||||
|
MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ |
||||||
|
MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ |
||||||
|
MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_decoder { |
||||||
|
enum mad_decoder_mode mode; |
||||||
|
|
||||||
|
int options; |
||||||
|
|
||||||
|
struct { |
||||||
|
long pid; |
||||||
|
int in; |
||||||
|
int out; |
||||||
|
} async; |
||||||
|
|
||||||
|
struct { |
||||||
|
struct mad_stream stream; |
||||||
|
struct mad_frame frame; |
||||||
|
struct mad_synth synth; |
||||||
|
} *sync; |
||||||
|
|
||||||
|
void *cb_data; |
||||||
|
|
||||||
|
enum mad_flow (*input_func)(void *, struct mad_stream *); |
||||||
|
enum mad_flow (*header_func)(void *, struct mad_header const *); |
||||||
|
enum mad_flow (*filter_func)(void *, |
||||||
|
struct mad_stream const *, struct mad_frame *); |
||||||
|
enum mad_flow (*output_func)(void *, |
||||||
|
struct mad_header const *, struct mad_pcm *); |
||||||
|
enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); |
||||||
|
enum mad_flow (*message_func)(void *, void *, unsigned int *); |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_decoder_init(struct mad_decoder *, void *, |
||||||
|
enum mad_flow (*)(void *, struct mad_stream *), |
||||||
|
enum mad_flow (*)(void *, struct mad_header const *), |
||||||
|
enum mad_flow (*)(void *, |
||||||
|
struct mad_stream const *, |
||||||
|
struct mad_frame *), |
||||||
|
enum mad_flow (*)(void *, |
||||||
|
struct mad_header const *, |
||||||
|
struct mad_pcm *), |
||||||
|
enum mad_flow (*)(void *, |
||||||
|
struct mad_stream *, |
||||||
|
struct mad_frame *), |
||||||
|
enum mad_flow (*)(void *, void *, unsigned int *)); |
||||||
|
int mad_decoder_finish(struct mad_decoder *); |
||||||
|
|
||||||
|
# define mad_decoder_options(decoder, opts) \ |
||||||
|
((void) ((decoder)->options = (opts))) |
||||||
|
|
||||||
|
int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); |
||||||
|
int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); |
||||||
|
|
||||||
|
# endif |
||||||
|
|
||||||
|
# ifdef __cplusplus |
||||||
|
} |
||||||
|
# endif |
@ -0,0 +1,77 @@ |
|||||||
|
/* |
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: qc_table.dat,v 1.7 2004/01/23 09:41:32 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
/* |
||||||
|
* These are the Layer II classes of quantization. |
||||||
|
* The table is derived from Table B.4 of ISO/IEC 11172-3. |
||||||
|
*/ |
||||||
|
|
||||||
|
{ 3, 2, 5, |
||||||
|
MAD_F(0x15555555) /* 1.33333333333 => 1.33333333209, e 0.00000000124 */, |
||||||
|
MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, |
||||||
|
{ 5, 3, 7, |
||||||
|
MAD_F(0x1999999a) /* 1.60000000000 => 1.60000000149, e -0.00000000149 */, |
||||||
|
MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, |
||||||
|
{ 7, 0, 3, |
||||||
|
MAD_F(0x12492492) /* 1.14285714286 => 1.14285714179, e 0.00000000107 */, |
||||||
|
MAD_F(0x04000000) /* 0.25000000000 => 0.25000000000, e 0.00000000000 */ }, |
||||||
|
{ 9, 4, 10, |
||||||
|
MAD_F(0x1c71c71c) /* 1.77777777777 => 1.77777777612, e 0.00000000165 */, |
||||||
|
MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, |
||||||
|
{ 15, 0, 4, |
||||||
|
MAD_F(0x11111111) /* 1.06666666666 => 1.06666666642, e 0.00000000024 */, |
||||||
|
MAD_F(0x02000000) /* 0.12500000000 => 0.12500000000, e 0.00000000000 */ }, |
||||||
|
{ 31, 0, 5, |
||||||
|
MAD_F(0x10842108) /* 1.03225806452 => 1.03225806355, e 0.00000000097 */, |
||||||
|
MAD_F(0x01000000) /* 0.06250000000 => 0.06250000000, e 0.00000000000 */ }, |
||||||
|
{ 63, 0, 6, |
||||||
|
MAD_F(0x10410410) /* 1.01587301587 => 1.01587301493, e 0.00000000094 */, |
||||||
|
MAD_F(0x00800000) /* 0.03125000000 => 0.03125000000, e 0.00000000000 */ }, |
||||||
|
{ 127, 0, 7, |
||||||
|
MAD_F(0x10204081) /* 1.00787401575 => 1.00787401572, e 0.00000000003 */, |
||||||
|
MAD_F(0x00400000) /* 0.01562500000 => 0.01562500000, e 0.00000000000 */ }, |
||||||
|
{ 255, 0, 8, |
||||||
|
MAD_F(0x10101010) /* 1.00392156863 => 1.00392156839, e 0.00000000024 */, |
||||||
|
MAD_F(0x00200000) /* 0.00781250000 => 0.00781250000, e 0.00000000000 */ }, |
||||||
|
{ 511, 0, 9, |
||||||
|
MAD_F(0x10080402) /* 1.00195694716 => 1.00195694715, e 0.00000000001 */, |
||||||
|
MAD_F(0x00100000) /* 0.00390625000 => 0.00390625000, e 0.00000000000 */ }, |
||||||
|
{ 1023, 0, 10, |
||||||
|
MAD_F(0x10040100) /* 1.00097751711 => 1.00097751617, e 0.00000000094 */, |
||||||
|
MAD_F(0x00080000) /* 0.00195312500 => 0.00195312500, e 0.00000000000 */ }, |
||||||
|
{ 2047, 0, 11, |
||||||
|
MAD_F(0x10020040) /* 1.00048851979 => 1.00048851967, e 0.00000000012 */, |
||||||
|
MAD_F(0x00040000) /* 0.00097656250 => 0.00097656250, e 0.00000000000 */ }, |
||||||
|
{ 4095, 0, 12, |
||||||
|
MAD_F(0x10010010) /* 1.00024420024 => 1.00024420023, e 0.00000000001 */, |
||||||
|
MAD_F(0x00020000) /* 0.00048828125 => 0.00048828125, e 0.00000000000 */ }, |
||||||
|
{ 8191, 0, 13, |
||||||
|
MAD_F(0x10008004) /* 1.00012208522 => 1.00012208521, e 0.00000000001 */, |
||||||
|
MAD_F(0x00010000) /* 0.00024414063 => 0.00024414062, e 0.00000000000 */ }, |
||||||
|
{ 16383, 0, 14, |
||||||
|
MAD_F(0x10004001) /* 1.00006103888 => 1.00006103888, e -0.00000000000 */, |
||||||
|
MAD_F(0x00008000) /* 0.00012207031 => 0.00012207031, e -0.00000000000 */ }, |
||||||
|
{ 32767, 0, 15, |
||||||
|
MAD_F(0x10002000) /* 1.00003051851 => 1.00003051758, e 0.00000000093 */, |
||||||
|
MAD_F(0x00004000) /* 0.00006103516 => 0.00006103516, e 0.00000000000 */ }, |
||||||
|
{ 65535, 0, 16, |
||||||
|
MAD_F(0x10001000) /* 1.00001525902 => 1.00001525879, e 0.00000000023 */, |
||||||
|
MAD_F(0x00002000) /* 0.00003051758 => 0.00003051758, e 0.00000000000 */ } |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,106 @@ |
|||||||
|
/* |
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: sf_table.dat,v 1.7 2004/01/23 09:41:33 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
/* |
||||||
|
* These are the scalefactor values for Layer I and Layer II. |
||||||
|
* The values are from Table B.1 of ISO/IEC 11172-3. |
||||||
|
* |
||||||
|
* There is some error introduced by the 32-bit fixed-point representation; |
||||||
|
* the amount of error is shown. For 16-bit PCM output, this shouldn't be |
||||||
|
* too much of a problem. |
||||||
|
* |
||||||
|
* Strictly speaking, Table B.1 has only 63 entries (0-62), thus a strict |
||||||
|
* interpretation of ISO/IEC 11172-3 would suggest that a scalefactor index of |
||||||
|
* 63 is invalid. However, for better compatibility with current practices, we |
||||||
|
* add a 64th entry. |
||||||
|
*/ |
||||||
|
|
||||||
|
MAD_F(0x20000000), /* 2.000000000000 => 2.000000000000, e 0.000000000000 */ |
||||||
|
MAD_F(0x1965fea5), /* 1.587401051968 => 1.587401051074, e 0.000000000894 */ |
||||||
|
MAD_F(0x1428a2fa), /* 1.259921049895 => 1.259921051562, e -0.000000001667 */ |
||||||
|
MAD_F(0x10000000), /* 1.000000000000 => 1.000000000000, e 0.000000000000 */ |
||||||
|
MAD_F(0x0cb2ff53), /* 0.793700525984 => 0.793700527400, e -0.000000001416 */ |
||||||
|
MAD_F(0x0a14517d), /* 0.629960524947 => 0.629960525781, e -0.000000000833 */ |
||||||
|
MAD_F(0x08000000), /* 0.500000000000 => 0.500000000000, e 0.000000000000 */ |
||||||
|
MAD_F(0x06597fa9), /* 0.396850262992 => 0.396850261837, e 0.000000001155 */ |
||||||
|
|
||||||
|
MAD_F(0x050a28be), /* 0.314980262474 => 0.314980261028, e 0.000000001446 */ |
||||||
|
MAD_F(0x04000000), /* 0.250000000000 => 0.250000000000, e 0.000000000000 */ |
||||||
|
MAD_F(0x032cbfd5), /* 0.198425131496 => 0.198425132781, e -0.000000001285 */ |
||||||
|
MAD_F(0x0285145f), /* 0.157490131237 => 0.157490130514, e 0.000000000723 */ |
||||||
|
MAD_F(0x02000000), /* 0.125000000000 => 0.125000000000, e 0.000000000000 */ |
||||||
|
MAD_F(0x01965fea), /* 0.099212565748 => 0.099212564528, e 0.000000001220 */ |
||||||
|
MAD_F(0x01428a30), /* 0.078745065618 => 0.078745067120, e -0.000000001501 */ |
||||||
|
MAD_F(0x01000000), /* 0.062500000000 => 0.062500000000, e 0.000000000000 */ |
||||||
|
|
||||||
|
MAD_F(0x00cb2ff5), /* 0.049606282874 => 0.049606282264, e 0.000000000610 */ |
||||||
|
MAD_F(0x00a14518), /* 0.039372532809 => 0.039372533560, e -0.000000000751 */ |
||||||
|
MAD_F(0x00800000), /* 0.031250000000 => 0.031250000000, e 0.000000000000 */ |
||||||
|
MAD_F(0x006597fb), /* 0.024803141437 => 0.024803142995, e -0.000000001558 */ |
||||||
|
MAD_F(0x0050a28c), /* 0.019686266405 => 0.019686266780, e -0.000000000375 */ |
||||||
|
MAD_F(0x00400000), /* 0.015625000000 => 0.015625000000, e 0.000000000000 */ |
||||||
|
MAD_F(0x0032cbfd), /* 0.012401570719 => 0.012401569635, e 0.000000001084 */ |
||||||
|
MAD_F(0x00285146), /* 0.009843133202 => 0.009843133390, e -0.000000000188 */ |
||||||
|
|
||||||
|
MAD_F(0x00200000), /* 0.007812500000 => 0.007812500000, e 0.000000000000 */ |
||||||
|
MAD_F(0x001965ff), /* 0.006200785359 => 0.006200786680, e -0.000000001321 */ |
||||||
|
MAD_F(0x001428a3), /* 0.004921566601 => 0.004921566695, e -0.000000000094 */ |
||||||
|
MAD_F(0x00100000), /* 0.003906250000 => 0.003906250000, e 0.000000000000 */ |
||||||
|
MAD_F(0x000cb2ff), /* 0.003100392680 => 0.003100391477, e 0.000000001202 */ |
||||||
|
MAD_F(0x000a1451), /* 0.002460783301 => 0.002460781485, e 0.000000001816 */ |
||||||
|
MAD_F(0x00080000), /* 0.001953125000 => 0.001953125000, e 0.000000000000 */ |
||||||
|
MAD_F(0x00065980), /* 0.001550196340 => 0.001550197601, e -0.000000001262 */ |
||||||
|
|
||||||
|
MAD_F(0x00050a29), /* 0.001230391650 => 0.001230392605, e -0.000000000955 */ |
||||||
|
MAD_F(0x00040000), /* 0.000976562500 => 0.000976562500, e 0.000000000000 */ |
||||||
|
MAD_F(0x00032cc0), /* 0.000775098170 => 0.000775098801, e -0.000000000631 */ |
||||||
|
MAD_F(0x00028514), /* 0.000615195825 => 0.000615194440, e 0.000000001385 */ |
||||||
|
MAD_F(0x00020000), /* 0.000488281250 => 0.000488281250, e 0.000000000000 */ |
||||||
|
MAD_F(0x00019660), /* 0.000387549085 => 0.000387549400, e -0.000000000315 */ |
||||||
|
MAD_F(0x0001428a), /* 0.000307597913 => 0.000307597220, e 0.000000000693 */ |
||||||
|
MAD_F(0x00010000), /* 0.000244140625 => 0.000244140625, e 0.000000000000 */ |
||||||
|
|
||||||
|
MAD_F(0x0000cb30), /* 0.000193774542 => 0.000193774700, e -0.000000000158 */ |
||||||
|
MAD_F(0x0000a145), /* 0.000153798956 => 0.000153798610, e 0.000000000346 */ |
||||||
|
MAD_F(0x00008000), /* 0.000122070313 => 0.000122070313, e 0.000000000000 */ |
||||||
|
MAD_F(0x00006598), /* 0.000096887271 => 0.000096887350, e -0.000000000079 */ |
||||||
|
MAD_F(0x000050a3), /* 0.000076899478 => 0.000076901168, e -0.000000001689 */ |
||||||
|
MAD_F(0x00004000), /* 0.000061035156 => 0.000061035156, e 0.000000000000 */ |
||||||
|
MAD_F(0x000032cc), /* 0.000048443636 => 0.000048443675, e -0.000000000039 */ |
||||||
|
MAD_F(0x00002851), /* 0.000038449739 => 0.000038448721, e 0.000000001018 */ |
||||||
|
|
||||||
|
MAD_F(0x00002000), /* 0.000030517578 => 0.000030517578, e 0.000000000000 */ |
||||||
|
MAD_F(0x00001966), /* 0.000024221818 => 0.000024221838, e -0.000000000020 */ |
||||||
|
MAD_F(0x00001429), /* 0.000019224870 => 0.000019226223, e -0.000000001354 */ |
||||||
|
MAD_F(0x00001000), /* 0.000015258789 => 0.000015258789, e -0.000000000000 */ |
||||||
|
MAD_F(0x00000cb3), /* 0.000012110909 => 0.000012110919, e -0.000000000010 */ |
||||||
|
MAD_F(0x00000a14), /* 0.000009612435 => 0.000009611249, e 0.000000001186 */ |
||||||
|
MAD_F(0x00000800), /* 0.000007629395 => 0.000007629395, e -0.000000000000 */ |
||||||
|
MAD_F(0x00000659), /* 0.000006055454 => 0.000006053597, e 0.000000001858 */ |
||||||
|
|
||||||
|
MAD_F(0x0000050a), /* 0.000004806217 => 0.000004805624, e 0.000000000593 */ |
||||||
|
MAD_F(0x00000400), /* 0.000003814697 => 0.000003814697, e 0.000000000000 */ |
||||||
|
MAD_F(0x0000032d), /* 0.000003027727 => 0.000003028661, e -0.000000000934 */ |
||||||
|
MAD_F(0x00000285), /* 0.000002403109 => 0.000002402812, e 0.000000000296 */ |
||||||
|
MAD_F(0x00000200), /* 0.000001907349 => 0.000001907349, e -0.000000000000 */ |
||||||
|
MAD_F(0x00000196), /* 0.000001513864 => 0.000001512468, e 0.000000001396 */ |
||||||
|
MAD_F(0x00000143), /* 0.000001201554 => 0.000001203269, e -0.000000001714 */ |
||||||
|
MAD_F(0x00000000) /* this compatibility entry is not part of Table B.1 */ |
@ -0,0 +1,161 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: stream.c,v 1.12 2004/02/05 09:02:39 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef HAVE_CONFIG_H |
||||||
|
# include "config.h" |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "global.h" |
||||||
|
|
||||||
|
# include <stdlib.h> |
||||||
|
|
||||||
|
# include "bit.h" |
||||||
|
# include "stream.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: stream->init() |
||||||
|
* DESCRIPTION: initialize stream struct |
||||||
|
*/ |
||||||
|
void mad_stream_init(struct mad_stream *stream) |
||||||
|
{ |
||||||
|
stream->buffer = 0; |
||||||
|
stream->bufend = 0; |
||||||
|
stream->skiplen = 0; |
||||||
|
|
||||||
|
stream->sync = 0; |
||||||
|
stream->freerate = 0; |
||||||
|
|
||||||
|
stream->this_frame = 0; |
||||||
|
stream->next_frame = 0; |
||||||
|
mad_bit_init(&stream->ptr, 0); |
||||||
|
|
||||||
|
mad_bit_init(&stream->anc_ptr, 0); |
||||||
|
stream->anc_bitlen = 0; |
||||||
|
|
||||||
|
stream->main_data = 0; |
||||||
|
stream->md_len = 0; |
||||||
|
|
||||||
|
stream->options = 0; |
||||||
|
stream->error = MAD_ERROR_NONE; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: stream->finish() |
||||||
|
* DESCRIPTION: deallocate any dynamic memory associated with stream |
||||||
|
*/ |
||||||
|
void mad_stream_finish(struct mad_stream *stream) |
||||||
|
{ |
||||||
|
if (stream->main_data) { |
||||||
|
free(stream->main_data); |
||||||
|
stream->main_data = 0; |
||||||
|
} |
||||||
|
|
||||||
|
mad_bit_finish(&stream->anc_ptr); |
||||||
|
mad_bit_finish(&stream->ptr); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: stream->buffer() |
||||||
|
* DESCRIPTION: set stream buffer pointers |
||||||
|
*/ |
||||||
|
void mad_stream_buffer(struct mad_stream *stream, |
||||||
|
unsigned char const *buffer, unsigned long length) |
||||||
|
{ |
||||||
|
stream->buffer = buffer; |
||||||
|
stream->bufend = buffer + length; |
||||||
|
|
||||||
|
stream->this_frame = buffer; |
||||||
|
stream->next_frame = buffer; |
||||||
|
|
||||||
|
stream->sync = 1; |
||||||
|
|
||||||
|
mad_bit_init(&stream->ptr, buffer); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: stream->skip() |
||||||
|
* DESCRIPTION: arrange to skip bytes before the next frame |
||||||
|
*/ |
||||||
|
void mad_stream_skip(struct mad_stream *stream, unsigned long length) |
||||||
|
{ |
||||||
|
stream->skiplen += length; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: stream->sync() |
||||||
|
* DESCRIPTION: locate the next stream sync word |
||||||
|
*/ |
||||||
|
int mad_stream_sync(struct mad_stream *stream) |
||||||
|
{ |
||||||
|
register unsigned char const *ptr, *end; |
||||||
|
|
||||||
|
ptr = mad_bit_nextbyte(&stream->ptr); |
||||||
|
end = stream->bufend; |
||||||
|
|
||||||
|
while (ptr < end - 1 && |
||||||
|
!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) |
||||||
|
++ptr; |
||||||
|
|
||||||
|
if (end - ptr < MAD_BUFFER_GUARD) |
||||||
|
return -1; |
||||||
|
|
||||||
|
mad_bit_init(&stream->ptr, ptr); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: stream->errorstr() |
||||||
|
* DESCRIPTION: return a string description of the current error condition |
||||||
|
*/ |
||||||
|
char const *mad_stream_errorstr(struct mad_stream const *stream) |
||||||
|
{ |
||||||
|
switch (stream->error) { |
||||||
|
case MAD_ERROR_NONE: return "no error"; |
||||||
|
|
||||||
|
case MAD_ERROR_BUFLEN: return "input buffer too small (or EOF)"; |
||||||
|
case MAD_ERROR_BUFPTR: return "invalid (null) buffer pointer"; |
||||||
|
|
||||||
|
case MAD_ERROR_NOMEM: return "not enough memory"; |
||||||
|
|
||||||
|
case MAD_ERROR_LOSTSYNC: return "lost synchronization"; |
||||||
|
case MAD_ERROR_BADLAYER: return "reserved header layer value"; |
||||||
|
case MAD_ERROR_BADBITRATE: return "forbidden bitrate value"; |
||||||
|
case MAD_ERROR_BADSAMPLERATE: return "reserved sample frequency value"; |
||||||
|
case MAD_ERROR_BADEMPHASIS: return "reserved emphasis value"; |
||||||
|
|
||||||
|
case MAD_ERROR_BADCRC: return "CRC check failed"; |
||||||
|
case MAD_ERROR_BADBITALLOC: return "forbidden bit allocation value"; |
||||||
|
case MAD_ERROR_BADSCALEFACTOR: return "bad scalefactor index"; |
||||||
|
case MAD_ERROR_BADMODE: return "bad bitrate/mode combination"; |
||||||
|
case MAD_ERROR_BADFRAMELEN: return "bad frame length"; |
||||||
|
case MAD_ERROR_BADBIGVALUES: return "bad big_values count"; |
||||||
|
case MAD_ERROR_BADBLOCKTYPE: return "reserved block_type"; |
||||||
|
case MAD_ERROR_BADSCFSI: return "bad scalefactor selection info"; |
||||||
|
case MAD_ERROR_BADDATAPTR: return "bad main_data_begin pointer"; |
||||||
|
case MAD_ERROR_BADPART3LEN: return "bad audio data length"; |
||||||
|
case MAD_ERROR_BADHUFFTABLE: return "bad Huffman table select"; |
||||||
|
case MAD_ERROR_BADHUFFDATA: return "Huffman data overrun"; |
||||||
|
case MAD_ERROR_BADSTEREO: return "incompatible block_type for JS"; |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,108 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: stream.h,v 1.20 2004/02/05 09:02:39 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_STREAM_H |
||||||
|
# define LIBMAD_STREAM_H |
||||||
|
|
||||||
|
# include "bit.h" |
||||||
|
|
||||||
|
# define MAD_BUFFER_GUARD 8 |
||||||
|
# define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) |
||||||
|
|
||||||
|
enum mad_error { |
||||||
|
MAD_ERROR_NONE = 0x0000, /* no error */ |
||||||
|
|
||||||
|
MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ |
||||||
|
MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ |
||||||
|
|
||||||
|
MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ |
||||||
|
|
||||||
|
MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ |
||||||
|
MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ |
||||||
|
MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ |
||||||
|
MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ |
||||||
|
MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ |
||||||
|
|
||||||
|
MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ |
||||||
|
MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ |
||||||
|
MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ |
||||||
|
MAD_ERROR_BADMODE = 0x0222, /* bad bitrate/mode combination */ |
||||||
|
MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ |
||||||
|
MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ |
||||||
|
MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ |
||||||
|
MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ |
||||||
|
MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ |
||||||
|
MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ |
||||||
|
MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ |
||||||
|
MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ |
||||||
|
MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ |
||||||
|
}; |
||||||
|
|
||||||
|
# define MAD_RECOVERABLE(error) ((error) & 0xff00) |
||||||
|
|
||||||
|
struct mad_stream { |
||||||
|
unsigned char const *buffer; /* input bitstream buffer */ |
||||||
|
unsigned char const *bufend; /* end of buffer */ |
||||||
|
unsigned long skiplen; /* bytes to skip before next frame */ |
||||||
|
|
||||||
|
int sync; /* stream sync found */ |
||||||
|
unsigned long freerate; /* free bitrate (fixed) */ |
||||||
|
|
||||||
|
unsigned char const *this_frame; /* start of current frame */ |
||||||
|
unsigned char const *next_frame; /* start of next frame */ |
||||||
|
struct mad_bitptr ptr; /* current processing bit pointer */ |
||||||
|
|
||||||
|
struct mad_bitptr anc_ptr; /* ancillary bits pointer */ |
||||||
|
unsigned int anc_bitlen; /* number of ancillary bits */ |
||||||
|
|
||||||
|
unsigned char (*main_data)[MAD_BUFFER_MDLEN]; |
||||||
|
/* Layer III main_data() */ |
||||||
|
unsigned int md_len; /* bytes in main_data */ |
||||||
|
|
||||||
|
int options; /* decoding options (see below) */ |
||||||
|
enum mad_error error; /* error code (see above) */ |
||||||
|
}; |
||||||
|
|
||||||
|
enum { |
||||||
|
MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ |
||||||
|
MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ |
||||||
|
# if 0 /* not yet implemented */ |
||||||
|
MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ |
||||||
|
MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ |
||||||
|
MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ |
||||||
|
# endif |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_stream_init(struct mad_stream *); |
||||||
|
void mad_stream_finish(struct mad_stream *); |
||||||
|
|
||||||
|
# define mad_stream_options(stream, opts) \ |
||||||
|
((void) ((stream)->options = (opts))) |
||||||
|
|
||||||
|
void mad_stream_buffer(struct mad_stream *, |
||||||
|
unsigned char const *, unsigned long); |
||||||
|
void mad_stream_skip(struct mad_stream *, unsigned long); |
||||||
|
|
||||||
|
int mad_stream_sync(struct mad_stream *); |
||||||
|
|
||||||
|
char const *mad_stream_errorstr(struct mad_stream const *); |
||||||
|
|
||||||
|
# endif |
@ -0,0 +1,857 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: synth.c,v 1.25 2004/01/23 09:41:33 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef HAVE_CONFIG_H |
||||||
|
# include "config.h" |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "global.h" |
||||||
|
|
||||||
|
# include "fixed.h" |
||||||
|
# include "frame.h" |
||||||
|
# include "synth.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: synth->init() |
||||||
|
* DESCRIPTION: initialize synth struct |
||||||
|
*/ |
||||||
|
void mad_synth_init(struct mad_synth *synth) |
||||||
|
{ |
||||||
|
mad_synth_mute(synth); |
||||||
|
|
||||||
|
synth->phase = 0; |
||||||
|
|
||||||
|
synth->pcm.samplerate = 0; |
||||||
|
synth->pcm.channels = 0; |
||||||
|
synth->pcm.length = 0; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: synth->mute() |
||||||
|
* DESCRIPTION: zero all polyphase filterbank values, resetting synthesis |
||||||
|
*/ |
||||||
|
void mad_synth_mute(struct mad_synth *synth) |
||||||
|
{ |
||||||
|
unsigned int ch, s, v; |
||||||
|
|
||||||
|
for (ch = 0; ch < 2; ++ch) { |
||||||
|
for (s = 0; s < 16; ++s) { |
||||||
|
for (v = 0; v < 8; ++v) { |
||||||
|
synth->filter[ch][0][0][s][v] = synth->filter[ch][0][1][s][v] = |
||||||
|
synth->filter[ch][1][0][s][v] = synth->filter[ch][1][1][s][v] = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* An optional optimization called here the Subband Synthesis Optimization |
||||||
|
* (SSO) improves the performance of subband synthesis at the expense of |
||||||
|
* accuracy. |
||||||
|
* |
||||||
|
* The idea is to simplify 32x32->64-bit multiplication to 32x32->32 such |
||||||
|
* that extra scaling and rounding are not necessary. This often allows the |
||||||
|
* compiler to use faster 32-bit multiply-accumulate instructions instead of |
||||||
|
* explicit 64-bit multiply, shift, and add instructions. |
||||||
|
* |
||||||
|
* SSO works like this: a full 32x32->64-bit multiply of two mad_fixed_t |
||||||
|
* values requires the result to be right-shifted 28 bits to be properly |
||||||
|
* scaled to the same fixed-point format. Right shifts can be applied at any |
||||||
|
* time to either operand or to the result, so the optimization involves |
||||||
|
* careful placement of these shifts to minimize the loss of accuracy. |
||||||
|
* |
||||||
|
* First, a 14-bit shift is applied with rounding at compile-time to the D[] |
||||||
|
* table of coefficients for the subband synthesis window. This only loses 2 |
||||||
|
* bits of accuracy because the lower 12 bits are always zero. A second |
||||||
|
* 12-bit shift occurs after the DCT calculation. This loses 12 bits of |
||||||
|
* accuracy. Finally, a third 2-bit shift occurs just before the sample is |
||||||
|
* saved in the PCM buffer. 14 + 12 + 2 == 28 bits. |
||||||
|
*/ |
||||||
|
|
||||||
|
/* FPM_DEFAULT without OPT_SSO will actually lose accuracy and performance */ |
||||||
|
|
||||||
|
# if defined(FPM_DEFAULT) && !defined(OPT_SSO) |
||||||
|
# define OPT_SSO |
||||||
|
# endif |
||||||
|
|
||||||
|
/* second SSO shift, with rounding */ |
||||||
|
|
||||||
|
# if defined(OPT_SSO) |
||||||
|
# define SHIFT(x) (((x) + (1L << 11)) >> 12) |
||||||
|
# else |
||||||
|
# define SHIFT(x) (x) |
||||||
|
# endif |
||||||
|
|
||||||
|
/* possible DCT speed optimization */ |
||||||
|
|
||||||
|
# if defined(OPT_SPEED) && defined(MAD_F_MLX) |
||||||
|
# define OPT_DCTO |
||||||
|
# define MUL(x, y) \ |
||||||
|
({ mad_fixed64hi_t hi; \
|
||||||
|
mad_fixed64lo_t lo; \
|
||||||
|
MAD_F_MLX(hi, lo, (x), (y)); \
|
||||||
|
hi << (32 - MAD_F_SCALEBITS - 3); \
|
||||||
|
}) |
||||||
|
# else |
||||||
|
# undef OPT_DCTO |
||||||
|
# define MUL(x, y) mad_f_mul((x), (y)) |
||||||
|
# endif |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: dct32() |
||||||
|
* DESCRIPTION: perform fast in[32]->out[32] DCT |
||||||
|
*/ |
||||||
|
static |
||||||
|
void dct32(mad_fixed_t const in[32], unsigned int slot, |
||||||
|
mad_fixed_t lo[16][8], mad_fixed_t hi[16][8]) |
||||||
|
{ |
||||||
|
mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; |
||||||
|
mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; |
||||||
|
mad_fixed_t t16, t17, t18, t19, t20, t21, t22, t23; |
||||||
|
mad_fixed_t t24, t25, t26, t27, t28, t29, t30, t31; |
||||||
|
mad_fixed_t t32, t33, t34, t35, t36, t37, t38, t39; |
||||||
|
mad_fixed_t t40, t41, t42, t43, t44, t45, t46, t47; |
||||||
|
mad_fixed_t t48, t49, t50, t51, t52, t53, t54, t55; |
||||||
|
mad_fixed_t t56, t57, t58, t59, t60, t61, t62, t63; |
||||||
|
mad_fixed_t t64, t65, t66, t67, t68, t69, t70, t71; |
||||||
|
mad_fixed_t t72, t73, t74, t75, t76, t77, t78, t79; |
||||||
|
mad_fixed_t t80, t81, t82, t83, t84, t85, t86, t87; |
||||||
|
mad_fixed_t t88, t89, t90, t91, t92, t93, t94, t95; |
||||||
|
mad_fixed_t t96, t97, t98, t99, t100, t101, t102, t103; |
||||||
|
mad_fixed_t t104, t105, t106, t107, t108, t109, t110, t111; |
||||||
|
mad_fixed_t t112, t113, t114, t115, t116, t117, t118, t119; |
||||||
|
mad_fixed_t t120, t121, t122, t123, t124, t125, t126, t127; |
||||||
|
mad_fixed_t t128, t129, t130, t131, t132, t133, t134, t135; |
||||||
|
mad_fixed_t t136, t137, t138, t139, t140, t141, t142, t143; |
||||||
|
mad_fixed_t t144, t145, t146, t147, t148, t149, t150, t151; |
||||||
|
mad_fixed_t t152, t153, t154, t155, t156, t157, t158, t159; |
||||||
|
mad_fixed_t t160, t161, t162, t163, t164, t165, t166, t167; |
||||||
|
mad_fixed_t t168, t169, t170, t171, t172, t173, t174, t175; |
||||||
|
mad_fixed_t t176; |
||||||
|
|
||||||
|
/* costab[i] = cos(PI / (2 * 32) * i) */ |
||||||
|
|
||||||
|
# if defined(OPT_DCTO) |
||||||
|
# define costab1 MAD_F(0x7fd8878e) |
||||||
|
# define costab2 MAD_F(0x7f62368f) |
||||||
|
# define costab3 MAD_F(0x7e9d55fc) |
||||||
|
# define costab4 MAD_F(0x7d8a5f40) |
||||||
|
# define costab5 MAD_F(0x7c29fbee) |
||||||
|
# define costab6 MAD_F(0x7a7d055b) |
||||||
|
# define costab7 MAD_F(0x78848414) |
||||||
|
# define costab8 MAD_F(0x7641af3d) |
||||||
|
# define costab9 MAD_F(0x73b5ebd1) |
||||||
|
# define costab10 MAD_F(0x70e2cbc6) |
||||||
|
# define costab11 MAD_F(0x6dca0d14) |
||||||
|
# define costab12 MAD_F(0x6a6d98a4) |
||||||
|
# define costab13 MAD_F(0x66cf8120) |
||||||
|
# define costab14 MAD_F(0x62f201ac) |
||||||
|
# define costab15 MAD_F(0x5ed77c8a) |
||||||
|
# define costab16 MAD_F(0x5a82799a) |
||||||
|
# define costab17 MAD_F(0x55f5a4d2) |
||||||
|
# define costab18 MAD_F(0x5133cc94) |
||||||
|
# define costab19 MAD_F(0x4c3fdff4) |
||||||
|
# define costab20 MAD_F(0x471cece7) |
||||||
|
# define costab21 MAD_F(0x41ce1e65) |
||||||
|
# define costab22 MAD_F(0x3c56ba70) |
||||||
|
# define costab23 MAD_F(0x36ba2014) |
||||||
|
# define costab24 MAD_F(0x30fbc54d) |
||||||
|
# define costab25 MAD_F(0x2b1f34eb) |
||||||
|
# define costab26 MAD_F(0x25280c5e) |
||||||
|
# define costab27 MAD_F(0x1f19f97b) |
||||||
|
# define costab28 MAD_F(0x18f8b83c) |
||||||
|
# define costab29 MAD_F(0x12c8106f) |
||||||
|
# define costab30 MAD_F(0x0c8bd35e) |
||||||
|
# define costab31 MAD_F(0x0647d97c) |
||||||
|
# else |
||||||
|
# define costab1 MAD_F(0x0ffb10f2) /* 0.998795456 */ |
||||||
|
# define costab2 MAD_F(0x0fec46d2) /* 0.995184727 */ |
||||||
|
# define costab3 MAD_F(0x0fd3aac0) /* 0.989176510 */ |
||||||
|
# define costab4 MAD_F(0x0fb14be8) /* 0.980785280 */ |
||||||
|
# define costab5 MAD_F(0x0f853f7e) /* 0.970031253 */ |
||||||
|
# define costab6 MAD_F(0x0f4fa0ab) /* 0.956940336 */ |
||||||
|
# define costab7 MAD_F(0x0f109082) /* 0.941544065 */ |
||||||
|
# define costab8 MAD_F(0x0ec835e8) /* 0.923879533 */ |
||||||
|
# define costab9 MAD_F(0x0e76bd7a) /* 0.903989293 */ |
||||||
|
# define costab10 MAD_F(0x0e1c5979) /* 0.881921264 */ |
||||||
|
# define costab11 MAD_F(0x0db941a3) /* 0.857728610 */ |
||||||
|
# define costab12 MAD_F(0x0d4db315) /* 0.831469612 */ |
||||||
|
# define costab13 MAD_F(0x0cd9f024) /* 0.803207531 */ |
||||||
|
# define costab14 MAD_F(0x0c5e4036) /* 0.773010453 */ |
||||||
|
# define costab15 MAD_F(0x0bdaef91) /* 0.740951125 */ |
||||||
|
# define costab16 MAD_F(0x0b504f33) /* 0.707106781 */ |
||||||
|
# define costab17 MAD_F(0x0abeb49a) /* 0.671558955 */ |
||||||
|
# define costab18 MAD_F(0x0a267993) /* 0.634393284 */ |
||||||
|
# define costab19 MAD_F(0x0987fbfe) /* 0.595699304 */ |
||||||
|
# define costab20 MAD_F(0x08e39d9d) /* 0.555570233 */ |
||||||
|
# define costab21 MAD_F(0x0839c3cd) /* 0.514102744 */ |
||||||
|
# define costab22 MAD_F(0x078ad74e) /* 0.471396737 */ |
||||||
|
# define costab23 MAD_F(0x06d74402) /* 0.427555093 */ |
||||||
|
# define costab24 MAD_F(0x061f78aa) /* 0.382683432 */ |
||||||
|
# define costab25 MAD_F(0x0563e69d) /* 0.336889853 */ |
||||||
|
# define costab26 MAD_F(0x04a5018c) /* 0.290284677 */ |
||||||
|
# define costab27 MAD_F(0x03e33f2f) /* 0.242980180 */ |
||||||
|
# define costab28 MAD_F(0x031f1708) /* 0.195090322 */ |
||||||
|
# define costab29 MAD_F(0x0259020e) /* 0.146730474 */ |
||||||
|
# define costab30 MAD_F(0x01917a6c) /* 0.098017140 */ |
||||||
|
# define costab31 MAD_F(0x00c8fb30) /* 0.049067674 */ |
||||||
|
# endif |
||||||
|
|
||||||
|
t0 = in[0] + in[31]; t16 = MUL(in[0] - in[31], costab1); |
||||||
|
t1 = in[15] + in[16]; t17 = MUL(in[15] - in[16], costab31); |
||||||
|
|
||||||
|
t41 = t16 + t17; |
||||||
|
t59 = MUL(t16 - t17, costab2); |
||||||
|
t33 = t0 + t1; |
||||||
|
t50 = MUL(t0 - t1, costab2); |
||||||
|
|
||||||
|
t2 = in[7] + in[24]; t18 = MUL(in[7] - in[24], costab15); |
||||||
|
t3 = in[8] + in[23]; t19 = MUL(in[8] - in[23], costab17); |
||||||
|
|
||||||
|
t42 = t18 + t19; |
||||||
|
t60 = MUL(t18 - t19, costab30); |
||||||
|
t34 = t2 + t3; |
||||||
|
t51 = MUL(t2 - t3, costab30); |
||||||
|
|
||||||
|
t4 = in[3] + in[28]; t20 = MUL(in[3] - in[28], costab7); |
||||||
|
t5 = in[12] + in[19]; t21 = MUL(in[12] - in[19], costab25); |
||||||
|
|
||||||
|
t43 = t20 + t21; |
||||||
|
t61 = MUL(t20 - t21, costab14); |
||||||
|
t35 = t4 + t5; |
||||||
|
t52 = MUL(t4 - t5, costab14); |
||||||
|
|
||||||
|
t6 = in[4] + in[27]; t22 = MUL(in[4] - in[27], costab9); |
||||||
|
t7 = in[11] + in[20]; t23 = MUL(in[11] - in[20], costab23); |
||||||
|
|
||||||
|
t44 = t22 + t23; |
||||||
|
t62 = MUL(t22 - t23, costab18); |
||||||
|
t36 = t6 + t7; |
||||||
|
t53 = MUL(t6 - t7, costab18); |
||||||
|
|
||||||
|
t8 = in[1] + in[30]; t24 = MUL(in[1] - in[30], costab3); |
||||||
|
t9 = in[14] + in[17]; t25 = MUL(in[14] - in[17], costab29); |
||||||
|
|
||||||
|
t45 = t24 + t25; |
||||||
|
t63 = MUL(t24 - t25, costab6); |
||||||
|
t37 = t8 + t9; |
||||||
|
t54 = MUL(t8 - t9, costab6); |
||||||
|
|
||||||
|
t10 = in[6] + in[25]; t26 = MUL(in[6] - in[25], costab13); |
||||||
|
t11 = in[9] + in[22]; t27 = MUL(in[9] - in[22], costab19); |
||||||
|
|
||||||
|
t46 = t26 + t27; |
||||||
|
t64 = MUL(t26 - t27, costab26); |
||||||
|
t38 = t10 + t11; |
||||||
|
t55 = MUL(t10 - t11, costab26); |
||||||
|
|
||||||
|
t12 = in[2] + in[29]; t28 = MUL(in[2] - in[29], costab5); |
||||||
|
t13 = in[13] + in[18]; t29 = MUL(in[13] - in[18], costab27); |
||||||
|
|
||||||
|
t47 = t28 + t29; |
||||||
|
t65 = MUL(t28 - t29, costab10); |
||||||
|
t39 = t12 + t13; |
||||||
|
t56 = MUL(t12 - t13, costab10); |
||||||
|
|
||||||
|
t14 = in[5] + in[26]; t30 = MUL(in[5] - in[26], costab11); |
||||||
|
t15 = in[10] + in[21]; t31 = MUL(in[10] - in[21], costab21); |
||||||
|
|
||||||
|
t48 = t30 + t31; |
||||||
|
t66 = MUL(t30 - t31, costab22); |
||||||
|
t40 = t14 + t15; |
||||||
|
t57 = MUL(t14 - t15, costab22); |
||||||
|
|
||||||
|
t69 = t33 + t34; t89 = MUL(t33 - t34, costab4); |
||||||
|
t70 = t35 + t36; t90 = MUL(t35 - t36, costab28); |
||||||
|
t71 = t37 + t38; t91 = MUL(t37 - t38, costab12); |
||||||
|
t72 = t39 + t40; t92 = MUL(t39 - t40, costab20); |
||||||
|
t73 = t41 + t42; t94 = MUL(t41 - t42, costab4); |
||||||
|
t74 = t43 + t44; t95 = MUL(t43 - t44, costab28); |
||||||
|
t75 = t45 + t46; t96 = MUL(t45 - t46, costab12); |
||||||
|
t76 = t47 + t48; t97 = MUL(t47 - t48, costab20); |
||||||
|
|
||||||
|
t78 = t50 + t51; t100 = MUL(t50 - t51, costab4); |
||||||
|
t79 = t52 + t53; t101 = MUL(t52 - t53, costab28); |
||||||
|
t80 = t54 + t55; t102 = MUL(t54 - t55, costab12); |
||||||
|
t81 = t56 + t57; t103 = MUL(t56 - t57, costab20); |
||||||
|
|
||||||
|
t83 = t59 + t60; t106 = MUL(t59 - t60, costab4); |
||||||
|
t84 = t61 + t62; t107 = MUL(t61 - t62, costab28); |
||||||
|
t85 = t63 + t64; t108 = MUL(t63 - t64, costab12); |
||||||
|
t86 = t65 + t66; t109 = MUL(t65 - t66, costab20); |
||||||
|
|
||||||
|
t113 = t69 + t70; |
||||||
|
t114 = t71 + t72; |
||||||
|
|
||||||
|
/* 0 */ hi[15][slot] = SHIFT(t113 + t114); |
||||||
|
/* 16 */ lo[ 0][slot] = SHIFT(MUL(t113 - t114, costab16)); |
||||||
|
|
||||||
|
t115 = t73 + t74; |
||||||
|
t116 = t75 + t76; |
||||||
|
|
||||||
|
t32 = t115 + t116; |
||||||
|
|
||||||
|
/* 1 */ hi[14][slot] = SHIFT(t32); |
||||||
|
|
||||||
|
t118 = t78 + t79; |
||||||
|
t119 = t80 + t81; |
||||||
|
|
||||||
|
t58 = t118 + t119; |
||||||
|
|
||||||
|
/* 2 */ hi[13][slot] = SHIFT(t58); |
||||||
|
|
||||||
|
t121 = t83 + t84; |
||||||
|
t122 = t85 + t86; |
||||||
|
|
||||||
|
t67 = t121 + t122; |
||||||
|
|
||||||
|
t49 = (t67 * 2) - t32; |
||||||
|
|
||||||
|
/* 3 */ hi[12][slot] = SHIFT(t49); |
||||||
|
|
||||||
|
t125 = t89 + t90; |
||||||
|
t126 = t91 + t92; |
||||||
|
|
||||||
|
t93 = t125 + t126; |
||||||
|
|
||||||
|
/* 4 */ hi[11][slot] = SHIFT(t93); |
||||||
|
|
||||||
|
t128 = t94 + t95; |
||||||
|
t129 = t96 + t97; |
||||||
|
|
||||||
|
t98 = t128 + t129; |
||||||
|
|
||||||
|
t68 = (t98 * 2) - t49; |
||||||
|
|
||||||
|
/* 5 */ hi[10][slot] = SHIFT(t68); |
||||||
|
|
||||||
|
t132 = t100 + t101; |
||||||
|
t133 = t102 + t103; |
||||||
|
|
||||||
|
t104 = t132 + t133; |
||||||
|
|
||||||
|
t82 = (t104 * 2) - t58; |
||||||
|
|
||||||
|
/* 6 */ hi[ 9][slot] = SHIFT(t82); |
||||||
|
|
||||||
|
t136 = t106 + t107; |
||||||
|
t137 = t108 + t109; |
||||||
|
|
||||||
|
t110 = t136 + t137; |
||||||
|
|
||||||
|
t87 = (t110 * 2) - t67; |
||||||
|
|
||||||
|
t77 = (t87 * 2) - t68; |
||||||
|
|
||||||
|
/* 7 */ hi[ 8][slot] = SHIFT(t77); |
||||||
|
|
||||||
|
t141 = MUL(t69 - t70, costab8); |
||||||
|
t142 = MUL(t71 - t72, costab24); |
||||||
|
t143 = t141 + t142; |
||||||
|
|
||||||
|
/* 8 */ hi[ 7][slot] = SHIFT(t143); |
||||||
|
/* 24 */ lo[ 8][slot] = |
||||||
|
SHIFT((MUL(t141 - t142, costab16) * 2) - t143); |
||||||
|
|
||||||
|
t144 = MUL(t73 - t74, costab8); |
||||||
|
t145 = MUL(t75 - t76, costab24); |
||||||
|
t146 = t144 + t145; |
||||||
|
|
||||||
|
t88 = (t146 * 2) - t77; |
||||||
|
|
||||||
|
/* 9 */ hi[ 6][slot] = SHIFT(t88); |
||||||
|
|
||||||
|
t148 = MUL(t78 - t79, costab8); |
||||||
|
t149 = MUL(t80 - t81, costab24); |
||||||
|
t150 = t148 + t149; |
||||||
|
|
||||||
|
t105 = (t150 * 2) - t82; |
||||||
|
|
||||||
|
/* 10 */ hi[ 5][slot] = SHIFT(t105); |
||||||
|
|
||||||
|
t152 = MUL(t83 - t84, costab8); |
||||||
|
t153 = MUL(t85 - t86, costab24); |
||||||
|
t154 = t152 + t153; |
||||||
|
|
||||||
|
t111 = (t154 * 2) - t87; |
||||||
|
|
||||||
|
t99 = (t111 * 2) - t88; |
||||||
|
|
||||||
|
/* 11 */ hi[ 4][slot] = SHIFT(t99); |
||||||
|
|
||||||
|
t157 = MUL(t89 - t90, costab8); |
||||||
|
t158 = MUL(t91 - t92, costab24); |
||||||
|
t159 = t157 + t158; |
||||||
|
|
||||||
|
t127 = (t159 * 2) - t93; |
||||||
|
|
||||||
|
/* 12 */ hi[ 3][slot] = SHIFT(t127); |
||||||
|
|
||||||
|
t160 = (MUL(t125 - t126, costab16) * 2) - t127; |
||||||
|
|
||||||
|
/* 20 */ lo[ 4][slot] = SHIFT(t160); |
||||||
|
/* 28 */ lo[12][slot] = |
||||||
|
SHIFT((((MUL(t157 - t158, costab16) * 2) - t159) * 2) - t160); |
||||||
|
|
||||||
|
t161 = MUL(t94 - t95, costab8); |
||||||
|
t162 = MUL(t96 - t97, costab24); |
||||||
|
t163 = t161 + t162; |
||||||
|
|
||||||
|
t130 = (t163 * 2) - t98; |
||||||
|
|
||||||
|
t112 = (t130 * 2) - t99; |
||||||
|
|
||||||
|
/* 13 */ hi[ 2][slot] = SHIFT(t112); |
||||||
|
|
||||||
|
t164 = (MUL(t128 - t129, costab16) * 2) - t130; |
||||||
|
|
||||||
|
t166 = MUL(t100 - t101, costab8); |
||||||
|
t167 = MUL(t102 - t103, costab24); |
||||||
|
t168 = t166 + t167; |
||||||
|
|
||||||
|
t134 = (t168 * 2) - t104; |
||||||
|
|
||||||
|
t120 = (t134 * 2) - t105; |
||||||
|
|
||||||
|
/* 14 */ hi[ 1][slot] = SHIFT(t120); |
||||||
|
|
||||||
|
t135 = (MUL(t118 - t119, costab16) * 2) - t120; |
||||||
|
|
||||||
|
/* 18 */ lo[ 2][slot] = SHIFT(t135); |
||||||
|
|
||||||
|
t169 = (MUL(t132 - t133, costab16) * 2) - t134; |
||||||
|
|
||||||
|
t151 = (t169 * 2) - t135; |
||||||
|
|
||||||
|
/* 22 */ lo[ 6][slot] = SHIFT(t151); |
||||||
|
|
||||||
|
t170 = (((MUL(t148 - t149, costab16) * 2) - t150) * 2) - t151; |
||||||
|
|
||||||
|
/* 26 */ lo[10][slot] = SHIFT(t170); |
||||||
|
/* 30 */ lo[14][slot] = |
||||||
|
SHIFT((((((MUL(t166 - t167, costab16) * 2) - |
||||||
|
t168) * 2) - t169) * 2) - t170); |
||||||
|
|
||||||
|
t171 = MUL(t106 - t107, costab8); |
||||||
|
t172 = MUL(t108 - t109, costab24); |
||||||
|
t173 = t171 + t172; |
||||||
|
|
||||||
|
t138 = (t173 * 2) - t110; |
||||||
|
|
||||||
|
t123 = (t138 * 2) - t111; |
||||||
|
|
||||||
|
t139 = (MUL(t121 - t122, costab16) * 2) - t123; |
||||||
|
|
||||||
|
t117 = (t123 * 2) - t112; |
||||||
|
|
||||||
|
/* 15 */ hi[ 0][slot] = SHIFT(t117); |
||||||
|
|
||||||
|
t124 = (MUL(t115 - t116, costab16) * 2) - t117; |
||||||
|
|
||||||
|
/* 17 */ lo[ 1][slot] = SHIFT(t124); |
||||||
|
|
||||||
|
t131 = (t139 * 2) - t124; |
||||||
|
|
||||||
|
/* 19 */ lo[ 3][slot] = SHIFT(t131); |
||||||
|
|
||||||
|
t140 = (t164 * 2) - t131; |
||||||
|
|
||||||
|
/* 21 */ lo[ 5][slot] = SHIFT(t140); |
||||||
|
|
||||||
|
t174 = (MUL(t136 - t137, costab16) * 2) - t138; |
||||||
|
|
||||||
|
t155 = (t174 * 2) - t139; |
||||||
|
|
||||||
|
t147 = (t155 * 2) - t140; |
||||||
|
|
||||||
|
/* 23 */ lo[ 7][slot] = SHIFT(t147); |
||||||
|
|
||||||
|
t156 = (((MUL(t144 - t145, costab16) * 2) - t146) * 2) - t147; |
||||||
|
|
||||||
|
/* 25 */ lo[ 9][slot] = SHIFT(t156); |
||||||
|
|
||||||
|
t175 = (((MUL(t152 - t153, costab16) * 2) - t154) * 2) - t155; |
||||||
|
|
||||||
|
t165 = (t175 * 2) - t156; |
||||||
|
|
||||||
|
/* 27 */ lo[11][slot] = SHIFT(t165); |
||||||
|
|
||||||
|
t176 = (((((MUL(t161 - t162, costab16) * 2) - |
||||||
|
t163) * 2) - t164) * 2) - t165; |
||||||
|
|
||||||
|
/* 29 */ lo[13][slot] = SHIFT(t176); |
||||||
|
/* 31 */ lo[15][slot] = |
||||||
|
SHIFT((((((((MUL(t171 - t172, costab16) * 2) - |
||||||
|
t173) * 2) - t174) * 2) - t175) * 2) - t176); |
||||||
|
|
||||||
|
/*
|
||||||
|
* Totals: |
||||||
|
* 80 multiplies |
||||||
|
* 80 additions |
||||||
|
* 119 subtractions |
||||||
|
* 49 shifts (not counting SSO) |
||||||
|
*/ |
||||||
|
} |
||||||
|
|
||||||
|
# undef MUL |
||||||
|
# undef SHIFT |
||||||
|
|
||||||
|
/* third SSO shift and/or D[] optimization preshift */ |
||||||
|
|
||||||
|
# if defined(OPT_SSO) |
||||||
|
# if MAD_F_FRACBITS != 28 |
||||||
|
# error "MAD_F_FRACBITS must be 28 to use OPT_SSO" |
||||||
|
# endif |
||||||
|
# define ML0(hi, lo, x, y) ((lo) = (x) * (y)) |
||||||
|
# define MLA(hi, lo, x, y) ((lo) += (x) * (y)) |
||||||
|
# define MLN(hi, lo) ((lo) = -(lo)) |
||||||
|
# define MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) |
||||||
|
# define SHIFT(x) ((x) >> 2) |
||||||
|
# define PRESHIFT(x) ((MAD_F(x) + (1L << 13)) >> 14) |
||||||
|
# else |
||||||
|
# define ML0(hi, lo, x, y) MAD_F_ML0((hi), (lo), (x), (y)) |
||||||
|
# define MLA(hi, lo, x, y) MAD_F_MLA((hi), (lo), (x), (y)) |
||||||
|
# define MLN(hi, lo) MAD_F_MLN((hi), (lo)) |
||||||
|
# define MLZ(hi, lo) MAD_F_MLZ((hi), (lo)) |
||||||
|
# define SHIFT(x) (x) |
||||||
|
# if defined(MAD_F_SCALEBITS) |
||||||
|
# undef MAD_F_SCALEBITS |
||||||
|
# define MAD_F_SCALEBITS (MAD_F_FRACBITS - 12) |
||||||
|
# define PRESHIFT(x) (MAD_F(x) >> 12) |
||||||
|
# else |
||||||
|
# define PRESHIFT(x) MAD_F(x) |
||||||
|
# endif |
||||||
|
# endif |
||||||
|
|
||||||
|
static |
||||||
|
mad_fixed_t const D[17][32] = { |
||||||
|
# include "D.dat" |
||||||
|
}; |
||||||
|
|
||||||
|
# if defined(ASO_SYNTH) |
||||||
|
void synth_full(struct mad_synth *, struct mad_frame const *, |
||||||
|
unsigned int, unsigned int); |
||||||
|
# else |
||||||
|
/*
|
||||||
|
* NAME: synth->full() |
||||||
|
* DESCRIPTION: perform full frequency PCM synthesis |
||||||
|
*/ |
||||||
|
static |
||||||
|
void synth_full(struct mad_synth *synth, struct mad_frame const *frame, |
||||||
|
unsigned int nch, unsigned int ns) |
||||||
|
{ |
||||||
|
unsigned int phase, ch, s, sb, pe, po; |
||||||
|
mad_fixed_t *pcm1, *pcm2, (*filter)[2][2][16][8]; |
||||||
|
mad_fixed_t const (*sbsample)[36][32]; |
||||||
|
register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8]; |
||||||
|
register mad_fixed_t const (*Dptr)[32], *ptr; |
||||||
|
register mad_fixed64hi_t hi; |
||||||
|
register mad_fixed64lo_t lo; |
||||||
|
|
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
sbsample = &frame->sbsample[ch]; |
||||||
|
filter = &synth->filter[ch]; |
||||||
|
phase = synth->phase; |
||||||
|
pcm1 = synth->pcm.samples[ch]; |
||||||
|
|
||||||
|
for (s = 0; s < ns; ++s) { |
||||||
|
dct32((*sbsample)[s], phase >> 1, |
||||||
|
(*filter)[0][phase & 1], (*filter)[1][phase & 1]); |
||||||
|
|
||||||
|
pe = phase & ~1; |
||||||
|
po = ((phase - 1) & 0xf) | 1; |
||||||
|
|
||||||
|
/* calculate 32 samples */ |
||||||
|
|
||||||
|
fe = &(*filter)[0][ phase & 1][0]; |
||||||
|
fx = &(*filter)[0][~phase & 1][0]; |
||||||
|
fo = &(*filter)[1][~phase & 1][0]; |
||||||
|
|
||||||
|
Dptr = &D[0]; |
||||||
|
|
||||||
|
ptr = *Dptr + po; |
||||||
|
ML0(hi, lo, (*fx)[0], ptr[ 0]); |
||||||
|
MLA(hi, lo, (*fx)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fx)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fx)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fx)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fx)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fx)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fx)[7], ptr[ 2]); |
||||||
|
MLN(hi, lo); |
||||||
|
|
||||||
|
ptr = *Dptr + pe; |
||||||
|
MLA(hi, lo, (*fe)[0], ptr[ 0]); |
||||||
|
MLA(hi, lo, (*fe)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fe)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fe)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fe)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fe)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fe)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fe)[7], ptr[ 2]); |
||||||
|
|
||||||
|
*pcm1++ = SHIFT(MLZ(hi, lo)); |
||||||
|
|
||||||
|
pcm2 = pcm1 + 30; |
||||||
|
|
||||||
|
for (sb = 1; sb < 16; ++sb) { |
||||||
|
++fe; |
||||||
|
++Dptr; |
||||||
|
|
||||||
|
/* D[32 - sb][i] == -D[sb][31 - i] */ |
||||||
|
|
||||||
|
ptr = *Dptr + po; |
||||||
|
ML0(hi, lo, (*fo)[0], ptr[ 0]); |
||||||
|
MLA(hi, lo, (*fo)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fo)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fo)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fo)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fo)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fo)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fo)[7], ptr[ 2]); |
||||||
|
MLN(hi, lo); |
||||||
|
|
||||||
|
ptr = *Dptr + pe; |
||||||
|
MLA(hi, lo, (*fe)[7], ptr[ 2]); |
||||||
|
MLA(hi, lo, (*fe)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fe)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fe)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fe)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fe)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fe)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fe)[0], ptr[ 0]); |
||||||
|
|
||||||
|
*pcm1++ = SHIFT(MLZ(hi, lo)); |
||||||
|
|
||||||
|
ptr = *Dptr - pe; |
||||||
|
ML0(hi, lo, (*fe)[0], ptr[31 - 16]); |
||||||
|
MLA(hi, lo, (*fe)[1], ptr[31 - 14]); |
||||||
|
MLA(hi, lo, (*fe)[2], ptr[31 - 12]); |
||||||
|
MLA(hi, lo, (*fe)[3], ptr[31 - 10]); |
||||||
|
MLA(hi, lo, (*fe)[4], ptr[31 - 8]); |
||||||
|
MLA(hi, lo, (*fe)[5], ptr[31 - 6]); |
||||||
|
MLA(hi, lo, (*fe)[6], ptr[31 - 4]); |
||||||
|
MLA(hi, lo, (*fe)[7], ptr[31 - 2]); |
||||||
|
|
||||||
|
ptr = *Dptr - po; |
||||||
|
MLA(hi, lo, (*fo)[7], ptr[31 - 2]); |
||||||
|
MLA(hi, lo, (*fo)[6], ptr[31 - 4]); |
||||||
|
MLA(hi, lo, (*fo)[5], ptr[31 - 6]); |
||||||
|
MLA(hi, lo, (*fo)[4], ptr[31 - 8]); |
||||||
|
MLA(hi, lo, (*fo)[3], ptr[31 - 10]); |
||||||
|
MLA(hi, lo, (*fo)[2], ptr[31 - 12]); |
||||||
|
MLA(hi, lo, (*fo)[1], ptr[31 - 14]); |
||||||
|
MLA(hi, lo, (*fo)[0], ptr[31 - 16]); |
||||||
|
|
||||||
|
*pcm2-- = SHIFT(MLZ(hi, lo)); |
||||||
|
|
||||||
|
++fo; |
||||||
|
} |
||||||
|
|
||||||
|
++Dptr; |
||||||
|
|
||||||
|
ptr = *Dptr + po; |
||||||
|
ML0(hi, lo, (*fo)[0], ptr[ 0]); |
||||||
|
MLA(hi, lo, (*fo)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fo)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fo)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fo)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fo)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fo)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fo)[7], ptr[ 2]); |
||||||
|
|
||||||
|
*pcm1 = SHIFT(-MLZ(hi, lo)); |
||||||
|
pcm1 += 16; |
||||||
|
|
||||||
|
phase = (phase + 1) % 16; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
# endif |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: synth->half() |
||||||
|
* DESCRIPTION: perform half frequency PCM synthesis |
||||||
|
*/ |
||||||
|
static |
||||||
|
void synth_half(struct mad_synth *synth, struct mad_frame const *frame, |
||||||
|
unsigned int nch, unsigned int ns) |
||||||
|
{ |
||||||
|
unsigned int phase, ch, s, sb, pe, po; |
||||||
|
mad_fixed_t *pcm1, *pcm2, (*filter)[2][2][16][8]; |
||||||
|
mad_fixed_t const (*sbsample)[36][32]; |
||||||
|
register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8]; |
||||||
|
register mad_fixed_t const (*Dptr)[32], *ptr; |
||||||
|
register mad_fixed64hi_t hi; |
||||||
|
register mad_fixed64lo_t lo; |
||||||
|
|
||||||
|
for (ch = 0; ch < nch; ++ch) { |
||||||
|
sbsample = &frame->sbsample[ch]; |
||||||
|
filter = &synth->filter[ch]; |
||||||
|
phase = synth->phase; |
||||||
|
pcm1 = synth->pcm.samples[ch]; |
||||||
|
|
||||||
|
for (s = 0; s < ns; ++s) { |
||||||
|
dct32((*sbsample)[s], phase >> 1, |
||||||
|
(*filter)[0][phase & 1], (*filter)[1][phase & 1]); |
||||||
|
|
||||||
|
pe = phase & ~1; |
||||||
|
po = ((phase - 1) & 0xf) | 1; |
||||||
|
|
||||||
|
/* calculate 16 samples */ |
||||||
|
|
||||||
|
fe = &(*filter)[0][ phase & 1][0]; |
||||||
|
fx = &(*filter)[0][~phase & 1][0]; |
||||||
|
fo = &(*filter)[1][~phase & 1][0]; |
||||||
|
|
||||||
|
Dptr = &D[0]; |
||||||
|
|
||||||
|
ptr = *Dptr + po; |
||||||
|
ML0(hi, lo, (*fx)[0], ptr[ 0]); |
||||||
|
MLA(hi, lo, (*fx)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fx)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fx)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fx)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fx)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fx)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fx)[7], ptr[ 2]); |
||||||
|
MLN(hi, lo); |
||||||
|
|
||||||
|
ptr = *Dptr + pe; |
||||||
|
MLA(hi, lo, (*fe)[0], ptr[ 0]); |
||||||
|
MLA(hi, lo, (*fe)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fe)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fe)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fe)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fe)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fe)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fe)[7], ptr[ 2]); |
||||||
|
|
||||||
|
*pcm1++ = SHIFT(MLZ(hi, lo)); |
||||||
|
|
||||||
|
pcm2 = pcm1 + 14; |
||||||
|
|
||||||
|
for (sb = 1; sb < 16; ++sb) { |
||||||
|
++fe; |
||||||
|
++Dptr; |
||||||
|
|
||||||
|
/* D[32 - sb][i] == -D[sb][31 - i] */ |
||||||
|
|
||||||
|
if (!(sb & 1)) { |
||||||
|
ptr = *Dptr + po; |
||||||
|
ML0(hi, lo, (*fo)[0], ptr[ 0]); |
||||||
|
MLA(hi, lo, (*fo)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fo)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fo)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fo)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fo)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fo)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fo)[7], ptr[ 2]); |
||||||
|
MLN(hi, lo); |
||||||
|
|
||||||
|
ptr = *Dptr + pe; |
||||||
|
MLA(hi, lo, (*fe)[7], ptr[ 2]); |
||||||
|
MLA(hi, lo, (*fe)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fe)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fe)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fe)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fe)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fe)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fe)[0], ptr[ 0]); |
||||||
|
|
||||||
|
*pcm1++ = SHIFT(MLZ(hi, lo)); |
||||||
|
|
||||||
|
ptr = *Dptr - po; |
||||||
|
ML0(hi, lo, (*fo)[7], ptr[31 - 2]); |
||||||
|
MLA(hi, lo, (*fo)[6], ptr[31 - 4]); |
||||||
|
MLA(hi, lo, (*fo)[5], ptr[31 - 6]); |
||||||
|
MLA(hi, lo, (*fo)[4], ptr[31 - 8]); |
||||||
|
MLA(hi, lo, (*fo)[3], ptr[31 - 10]); |
||||||
|
MLA(hi, lo, (*fo)[2], ptr[31 - 12]); |
||||||
|
MLA(hi, lo, (*fo)[1], ptr[31 - 14]); |
||||||
|
MLA(hi, lo, (*fo)[0], ptr[31 - 16]); |
||||||
|
|
||||||
|
ptr = *Dptr - pe; |
||||||
|
MLA(hi, lo, (*fe)[0], ptr[31 - 16]); |
||||||
|
MLA(hi, lo, (*fe)[1], ptr[31 - 14]); |
||||||
|
MLA(hi, lo, (*fe)[2], ptr[31 - 12]); |
||||||
|
MLA(hi, lo, (*fe)[3], ptr[31 - 10]); |
||||||
|
MLA(hi, lo, (*fe)[4], ptr[31 - 8]); |
||||||
|
MLA(hi, lo, (*fe)[5], ptr[31 - 6]); |
||||||
|
MLA(hi, lo, (*fe)[6], ptr[31 - 4]); |
||||||
|
MLA(hi, lo, (*fe)[7], ptr[31 - 2]); |
||||||
|
|
||||||
|
*pcm2-- = SHIFT(MLZ(hi, lo)); |
||||||
|
} |
||||||
|
|
||||||
|
++fo; |
||||||
|
} |
||||||
|
|
||||||
|
++Dptr; |
||||||
|
|
||||||
|
ptr = *Dptr + po; |
||||||
|
ML0(hi, lo, (*fo)[0], ptr[ 0]); |
||||||
|
MLA(hi, lo, (*fo)[1], ptr[14]); |
||||||
|
MLA(hi, lo, (*fo)[2], ptr[12]); |
||||||
|
MLA(hi, lo, (*fo)[3], ptr[10]); |
||||||
|
MLA(hi, lo, (*fo)[4], ptr[ 8]); |
||||||
|
MLA(hi, lo, (*fo)[5], ptr[ 6]); |
||||||
|
MLA(hi, lo, (*fo)[6], ptr[ 4]); |
||||||
|
MLA(hi, lo, (*fo)[7], ptr[ 2]); |
||||||
|
|
||||||
|
*pcm1 = SHIFT(-MLZ(hi, lo)); |
||||||
|
pcm1 += 8; |
||||||
|
|
||||||
|
phase = (phase + 1) % 16; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: synth->frame() |
||||||
|
* DESCRIPTION: perform PCM synthesis of frame subband samples |
||||||
|
*/ |
||||||
|
void mad_synth_frame(struct mad_synth *synth, struct mad_frame const *frame) |
||||||
|
{ |
||||||
|
unsigned int nch, ns; |
||||||
|
void (*synth_frame)(struct mad_synth *, struct mad_frame const *, |
||||||
|
unsigned int, unsigned int); |
||||||
|
|
||||||
|
nch = MAD_NCHANNELS(&frame->header); |
||||||
|
ns = MAD_NSBSAMPLES(&frame->header); |
||||||
|
|
||||||
|
synth->pcm.samplerate = frame->header.samplerate; |
||||||
|
synth->pcm.channels = nch; |
||||||
|
synth->pcm.length = 32 * ns; |
||||||
|
|
||||||
|
synth_frame = synth_full; |
||||||
|
|
||||||
|
if (frame->options & MAD_OPTION_HALFSAMPLERATE) { |
||||||
|
synth->pcm.samplerate /= 2; |
||||||
|
synth->pcm.length /= 2; |
||||||
|
|
||||||
|
synth_frame = synth_half; |
||||||
|
} |
||||||
|
|
||||||
|
synth_frame(synth, frame, nch, ns); |
||||||
|
|
||||||
|
synth->phase = (synth->phase + ns) % 16; |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: synth.h,v 1.15 2004/01/23 09:41:33 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_SYNTH_H |
||||||
|
# define LIBMAD_SYNTH_H |
||||||
|
|
||||||
|
# include "fixed.h" |
||||||
|
# include "frame.h" |
||||||
|
|
||||||
|
struct mad_pcm { |
||||||
|
unsigned int samplerate; /* sampling frequency (Hz) */ |
||||||
|
unsigned short channels; /* number of channels */ |
||||||
|
unsigned short length; /* number of samples per channel */ |
||||||
|
mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct mad_synth { |
||||||
|
mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ |
||||||
|
/* [ch][eo][peo][s][v] */ |
||||||
|
|
||||||
|
unsigned int phase; /* current processing phase */ |
||||||
|
|
||||||
|
struct mad_pcm pcm; /* PCM output */ |
||||||
|
}; |
||||||
|
|
||||||
|
/* single channel PCM selector */ |
||||||
|
enum { |
||||||
|
MAD_PCM_CHANNEL_SINGLE = 0 |
||||||
|
}; |
||||||
|
|
||||||
|
/* dual channel PCM selector */ |
||||||
|
enum { |
||||||
|
MAD_PCM_CHANNEL_DUAL_1 = 0, |
||||||
|
MAD_PCM_CHANNEL_DUAL_2 = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
/* stereo PCM selector */ |
||||||
|
enum { |
||||||
|
MAD_PCM_CHANNEL_STEREO_LEFT = 0, |
||||||
|
MAD_PCM_CHANNEL_STEREO_RIGHT = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
void mad_synth_init(struct mad_synth *); |
||||||
|
|
||||||
|
# define mad_synth_finish(synth) /* nothing */ |
||||||
|
|
||||||
|
void mad_synth_mute(struct mad_synth *); |
||||||
|
|
||||||
|
void mad_synth_frame(struct mad_synth *, struct mad_frame const *); |
||||||
|
|
||||||
|
# endif |
@ -0,0 +1,485 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: timer.c,v 1.18 2004/01/23 09:41:33 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef HAVE_CONFIG_H |
||||||
|
# include "config.h" |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "global.h" |
||||||
|
|
||||||
|
# include <stdio.h> |
||||||
|
|
||||||
|
# ifdef HAVE_ASSERT_H |
||||||
|
# include <assert.h> |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "timer.h" |
||||||
|
|
||||||
|
mad_timer_t const mad_timer_zero = { 0, 0 }; |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: timer->compare() |
||||||
|
* DESCRIPTION: indicate relative order of two timers |
||||||
|
*/ |
||||||
|
int mad_timer_compare(mad_timer_t timer1, mad_timer_t timer2) |
||||||
|
{ |
||||||
|
signed long diff; |
||||||
|
|
||||||
|
diff = timer1.seconds - timer2.seconds; |
||||||
|
if (diff < 0) |
||||||
|
return -1; |
||||||
|
else if (diff > 0) |
||||||
|
return +1; |
||||||
|
|
||||||
|
diff = timer1.fraction - timer2.fraction; |
||||||
|
if (diff < 0) |
||||||
|
return -1; |
||||||
|
else if (diff > 0) |
||||||
|
return +1; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: timer->negate() |
||||||
|
* DESCRIPTION: invert the sign of a timer |
||||||
|
*/ |
||||||
|
void mad_timer_negate(mad_timer_t *timer) |
||||||
|
{ |
||||||
|
timer->seconds = -timer->seconds; |
||||||
|
|
||||||
|
if (timer->fraction) { |
||||||
|
timer->seconds -= 1; |
||||||
|
timer->fraction = MAD_TIMER_RESOLUTION - timer->fraction; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: timer->abs() |
||||||
|
* DESCRIPTION: return the absolute value of a timer |
||||||
|
*/ |
||||||
|
mad_timer_t mad_timer_abs(mad_timer_t timer) |
||||||
|
{ |
||||||
|
if (timer.seconds < 0) |
||||||
|
mad_timer_negate(&timer); |
||||||
|
|
||||||
|
return timer; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: reduce_timer() |
||||||
|
* DESCRIPTION: carry timer fraction into seconds |
||||||
|
*/ |
||||||
|
static |
||||||
|
void reduce_timer(mad_timer_t *timer) |
||||||
|
{ |
||||||
|
timer->seconds += timer->fraction / MAD_TIMER_RESOLUTION; |
||||||
|
timer->fraction %= MAD_TIMER_RESOLUTION; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: gcd() |
||||||
|
* DESCRIPTION: compute greatest common denominator |
||||||
|
*/ |
||||||
|
static |
||||||
|
unsigned long gcd(unsigned long num1, unsigned long num2) |
||||||
|
{ |
||||||
|
unsigned long tmp; |
||||||
|
|
||||||
|
while (num2) { |
||||||
|
tmp = num2; |
||||||
|
num2 = num1 % num2; |
||||||
|
num1 = tmp; |
||||||
|
} |
||||||
|
|
||||||
|
return num1; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: reduce_rational() |
||||||
|
* DESCRIPTION: convert rational expression to lowest terms |
||||||
|
*/ |
||||||
|
static |
||||||
|
void reduce_rational(unsigned long *numer, unsigned long *denom) |
||||||
|
{ |
||||||
|
unsigned long factor; |
||||||
|
|
||||||
|
factor = gcd(*numer, *denom); |
||||||
|
|
||||||
|
assert(factor != 0); |
||||||
|
|
||||||
|
*numer /= factor; |
||||||
|
*denom /= factor; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: scale_rational() |
||||||
|
* DESCRIPTION: solve numer/denom == ?/scale avoiding overflowing |
||||||
|
*/ |
||||||
|
static |
||||||
|
unsigned long scale_rational(unsigned long numer, unsigned long denom, |
||||||
|
unsigned long scale) |
||||||
|
{ |
||||||
|
reduce_rational(&numer, &denom); |
||||||
|
reduce_rational(&scale, &denom); |
||||||
|
|
||||||
|
assert(denom != 0); |
||||||
|
|
||||||
|
if (denom < scale) |
||||||
|
return numer * (scale / denom) + numer * (scale % denom) / denom; |
||||||
|
if (denom < numer) |
||||||
|
return scale * (numer / denom) + scale * (numer % denom) / denom; |
||||||
|
|
||||||
|
return numer * scale / denom; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: timer->set() |
||||||
|
* DESCRIPTION: set timer to specific (positive) value |
||||||
|
*/ |
||||||
|
void mad_timer_set(mad_timer_t *timer, unsigned long seconds, |
||||||
|
unsigned long numer, unsigned long denom) |
||||||
|
{ |
||||||
|
timer->seconds = seconds; |
||||||
|
if (numer >= denom && denom > 0) { |
||||||
|
timer->seconds += numer / denom; |
||||||
|
numer %= denom; |
||||||
|
} |
||||||
|
|
||||||
|
switch (denom) { |
||||||
|
case 0: |
||||||
|
case 1: |
||||||
|
timer->fraction = 0; |
||||||
|
break; |
||||||
|
|
||||||
|
case MAD_TIMER_RESOLUTION: |
||||||
|
timer->fraction = numer; |
||||||
|
break; |
||||||
|
|
||||||
|
case 1000: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 1000); |
||||||
|
break; |
||||||
|
|
||||||
|
case 8000: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 8000); |
||||||
|
break; |
||||||
|
|
||||||
|
case 11025: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 11025); |
||||||
|
break; |
||||||
|
|
||||||
|
case 12000: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 12000); |
||||||
|
break; |
||||||
|
|
||||||
|
case 16000: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 16000); |
||||||
|
break; |
||||||
|
|
||||||
|
case 22050: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 22050); |
||||||
|
break; |
||||||
|
|
||||||
|
case 24000: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 24000); |
||||||
|
break; |
||||||
|
|
||||||
|
case 32000: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 32000); |
||||||
|
break; |
||||||
|
|
||||||
|
case 44100: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 44100); |
||||||
|
break; |
||||||
|
|
||||||
|
case 48000: |
||||||
|
timer->fraction = numer * (MAD_TIMER_RESOLUTION / 48000); |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
timer->fraction = scale_rational(numer, denom, MAD_TIMER_RESOLUTION); |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
if (timer->fraction >= MAD_TIMER_RESOLUTION) |
||||||
|
reduce_timer(timer); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: timer->add() |
||||||
|
* DESCRIPTION: add one timer to another |
||||||
|
*/ |
||||||
|
void mad_timer_add(mad_timer_t *timer, mad_timer_t incr) |
||||||
|
{ |
||||||
|
timer->seconds += incr.seconds; |
||||||
|
timer->fraction += incr.fraction; |
||||||
|
|
||||||
|
if (timer->fraction >= MAD_TIMER_RESOLUTION) |
||||||
|
reduce_timer(timer); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: timer->multiply() |
||||||
|
* DESCRIPTION: multiply a timer by a scalar value |
||||||
|
*/ |
||||||
|
void mad_timer_multiply(mad_timer_t *timer, signed long scalar) |
||||||
|
{ |
||||||
|
mad_timer_t addend; |
||||||
|
unsigned long factor; |
||||||
|
|
||||||
|
factor = scalar; |
||||||
|
if (scalar < 0) { |
||||||
|
factor = -scalar; |
||||||
|
mad_timer_negate(timer); |
||||||
|
} |
||||||
|
|
||||||
|
addend = *timer; |
||||||
|
*timer = mad_timer_zero; |
||||||
|
|
||||||
|
while (factor) { |
||||||
|
if (factor & 1) |
||||||
|
mad_timer_add(timer, addend); |
||||||
|
|
||||||
|
mad_timer_add(&addend, addend); |
||||||
|
factor >>= 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: timer->count() |
||||||
|
* DESCRIPTION: return timer value in selected units |
||||||
|
*/ |
||||||
|
signed long mad_timer_count(mad_timer_t timer, enum mad_units units) |
||||||
|
{ |
||||||
|
switch (units) { |
||||||
|
case MAD_UNITS_HOURS: |
||||||
|
return timer.seconds / 60 / 60; |
||||||
|
|
||||||
|
case MAD_UNITS_MINUTES: |
||||||
|
return timer.seconds / 60; |
||||||
|
|
||||||
|
case MAD_UNITS_SECONDS: |
||||||
|
return timer.seconds; |
||||||
|
|
||||||
|
case MAD_UNITS_DECISECONDS: |
||||||
|
case MAD_UNITS_CENTISECONDS: |
||||||
|
case MAD_UNITS_MILLISECONDS: |
||||||
|
|
||||||
|
case MAD_UNITS_8000_HZ: |
||||||
|
case MAD_UNITS_11025_HZ: |
||||||
|
case MAD_UNITS_12000_HZ: |
||||||
|
case MAD_UNITS_16000_HZ: |
||||||
|
case MAD_UNITS_22050_HZ: |
||||||
|
case MAD_UNITS_24000_HZ: |
||||||
|
case MAD_UNITS_32000_HZ: |
||||||
|
case MAD_UNITS_44100_HZ: |
||||||
|
case MAD_UNITS_48000_HZ: |
||||||
|
|
||||||
|
case MAD_UNITS_24_FPS: |
||||||
|
case MAD_UNITS_25_FPS: |
||||||
|
case MAD_UNITS_30_FPS: |
||||||
|
case MAD_UNITS_48_FPS: |
||||||
|
case MAD_UNITS_50_FPS: |
||||||
|
case MAD_UNITS_60_FPS: |
||||||
|
case MAD_UNITS_75_FPS: |
||||||
|
return timer.seconds * (signed long) units + |
||||||
|
(signed long) scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, |
||||||
|
units); |
||||||
|
|
||||||
|
case MAD_UNITS_23_976_FPS: |
||||||
|
case MAD_UNITS_24_975_FPS: |
||||||
|
case MAD_UNITS_29_97_FPS: |
||||||
|
case MAD_UNITS_47_952_FPS: |
||||||
|
case MAD_UNITS_49_95_FPS: |
||||||
|
case MAD_UNITS_59_94_FPS: |
||||||
|
return (mad_timer_count(timer, -units) + 1) * 1000 / 1001; |
||||||
|
} |
||||||
|
|
||||||
|
/* unsupported units */ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: timer->fraction() |
||||||
|
* DESCRIPTION: return fractional part of timer in arbitrary terms |
||||||
|
*/ |
||||||
|
unsigned long mad_timer_fraction(mad_timer_t timer, unsigned long denom) |
||||||
|
{ |
||||||
|
timer = mad_timer_abs(timer); |
||||||
|
|
||||||
|
switch (denom) { |
||||||
|
case 0: |
||||||
|
return timer.fraction ? |
||||||
|
MAD_TIMER_RESOLUTION / timer.fraction : MAD_TIMER_RESOLUTION + 1; |
||||||
|
|
||||||
|
case MAD_TIMER_RESOLUTION: |
||||||
|
return timer.fraction; |
||||||
|
|
||||||
|
default: |
||||||
|
return scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, denom); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: timer->string() |
||||||
|
* DESCRIPTION: write a string representation of a timer using a template |
||||||
|
*/ |
||||||
|
void mad_timer_string(mad_timer_t timer, |
||||||
|
char *dest, char const *format, enum mad_units units, |
||||||
|
enum mad_units fracunits, unsigned long subparts) |
||||||
|
{ |
||||||
|
unsigned long hours, minutes, seconds, sub; |
||||||
|
unsigned int frac; |
||||||
|
|
||||||
|
timer = mad_timer_abs(timer); |
||||||
|
|
||||||
|
seconds = timer.seconds; |
||||||
|
frac = sub = 0; |
||||||
|
|
||||||
|
switch (fracunits) { |
||||||
|
case MAD_UNITS_HOURS: |
||||||
|
case MAD_UNITS_MINUTES: |
||||||
|
case MAD_UNITS_SECONDS: |
||||||
|
break; |
||||||
|
|
||||||
|
case MAD_UNITS_DECISECONDS: |
||||||
|
case MAD_UNITS_CENTISECONDS: |
||||||
|
case MAD_UNITS_MILLISECONDS: |
||||||
|
|
||||||
|
case MAD_UNITS_8000_HZ: |
||||||
|
case MAD_UNITS_11025_HZ: |
||||||
|
case MAD_UNITS_12000_HZ: |
||||||
|
case MAD_UNITS_16000_HZ: |
||||||
|
case MAD_UNITS_22050_HZ: |
||||||
|
case MAD_UNITS_24000_HZ: |
||||||
|
case MAD_UNITS_32000_HZ: |
||||||
|
case MAD_UNITS_44100_HZ: |
||||||
|
case MAD_UNITS_48000_HZ: |
||||||
|
|
||||||
|
case MAD_UNITS_24_FPS: |
||||||
|
case MAD_UNITS_25_FPS: |
||||||
|
case MAD_UNITS_30_FPS: |
||||||
|
case MAD_UNITS_48_FPS: |
||||||
|
case MAD_UNITS_50_FPS: |
||||||
|
case MAD_UNITS_60_FPS: |
||||||
|
case MAD_UNITS_75_FPS: |
||||||
|
{ |
||||||
|
unsigned long denom; |
||||||
|
|
||||||
|
denom = MAD_TIMER_RESOLUTION / fracunits; |
||||||
|
|
||||||
|
frac = timer.fraction / denom; |
||||||
|
sub = scale_rational(timer.fraction % denom, denom, subparts); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case MAD_UNITS_23_976_FPS: |
||||||
|
case MAD_UNITS_24_975_FPS: |
||||||
|
case MAD_UNITS_29_97_FPS: |
||||||
|
case MAD_UNITS_47_952_FPS: |
||||||
|
case MAD_UNITS_49_95_FPS: |
||||||
|
case MAD_UNITS_59_94_FPS: |
||||||
|
/* drop-frame encoding */ |
||||||
|
/* N.B. this is only well-defined for MAD_UNITS_29_97_FPS */ |
||||||
|
{ |
||||||
|
unsigned long frame, cycle, d, m; |
||||||
|
|
||||||
|
frame = mad_timer_count(timer, fracunits); |
||||||
|
|
||||||
|
cycle = -fracunits * 60 * 10 - (10 - 1) * 2; |
||||||
|
|
||||||
|
d = frame / cycle; |
||||||
|
m = frame % cycle; |
||||||
|
frame += (10 - 1) * 2 * d; |
||||||
|
if (m > 2) |
||||||
|
frame += 2 * ((m - 2) / (cycle / 10)); |
||||||
|
|
||||||
|
frac = frame % -fracunits; |
||||||
|
seconds = frame / -fracunits; |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
switch (units) { |
||||||
|
case MAD_UNITS_HOURS: |
||||||
|
minutes = seconds / 60; |
||||||
|
hours = minutes / 60; |
||||||
|
|
||||||
|
sprintf(dest, format, |
||||||
|
hours, |
||||||
|
(unsigned int) (minutes % 60), |
||||||
|
(unsigned int) (seconds % 60), |
||||||
|
frac, sub); |
||||||
|
break; |
||||||
|
|
||||||
|
case MAD_UNITS_MINUTES: |
||||||
|
minutes = seconds / 60; |
||||||
|
|
||||||
|
sprintf(dest, format, |
||||||
|
minutes, |
||||||
|
(unsigned int) (seconds % 60), |
||||||
|
frac, sub); |
||||||
|
break; |
||||||
|
|
||||||
|
case MAD_UNITS_SECONDS: |
||||||
|
sprintf(dest, format, |
||||||
|
seconds, |
||||||
|
frac, sub); |
||||||
|
break; |
||||||
|
|
||||||
|
case MAD_UNITS_23_976_FPS: |
||||||
|
case MAD_UNITS_24_975_FPS: |
||||||
|
case MAD_UNITS_29_97_FPS: |
||||||
|
case MAD_UNITS_47_952_FPS: |
||||||
|
case MAD_UNITS_49_95_FPS: |
||||||
|
case MAD_UNITS_59_94_FPS: |
||||||
|
if (fracunits < 0) { |
||||||
|
/* not yet implemented */ |
||||||
|
sub = 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* fall through */ |
||||||
|
|
||||||
|
case MAD_UNITS_DECISECONDS: |
||||||
|
case MAD_UNITS_CENTISECONDS: |
||||||
|
case MAD_UNITS_MILLISECONDS: |
||||||
|
|
||||||
|
case MAD_UNITS_8000_HZ: |
||||||
|
case MAD_UNITS_11025_HZ: |
||||||
|
case MAD_UNITS_12000_HZ: |
||||||
|
case MAD_UNITS_16000_HZ: |
||||||
|
case MAD_UNITS_22050_HZ: |
||||||
|
case MAD_UNITS_24000_HZ: |
||||||
|
case MAD_UNITS_32000_HZ: |
||||||
|
case MAD_UNITS_44100_HZ: |
||||||
|
case MAD_UNITS_48000_HZ: |
||||||
|
|
||||||
|
case MAD_UNITS_24_FPS: |
||||||
|
case MAD_UNITS_25_FPS: |
||||||
|
case MAD_UNITS_30_FPS: |
||||||
|
case MAD_UNITS_48_FPS: |
||||||
|
case MAD_UNITS_50_FPS: |
||||||
|
case MAD_UNITS_60_FPS: |
||||||
|
case MAD_UNITS_75_FPS: |
||||||
|
sprintf(dest, format, mad_timer_count(timer, units), sub); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,100 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: timer.h,v 1.16 2004/01/23 09:41:33 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_TIMER_H |
||||||
|
# define LIBMAD_TIMER_H |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
signed long seconds; /* whole seconds */ |
||||||
|
unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ |
||||||
|
} mad_timer_t; |
||||||
|
|
||||||
|
extern mad_timer_t const mad_timer_zero; |
||||||
|
|
||||||
|
# define MAD_TIMER_RESOLUTION 352800000UL |
||||||
|
|
||||||
|
enum mad_units { |
||||||
|
MAD_UNITS_HOURS = -2, |
||||||
|
MAD_UNITS_MINUTES = -1, |
||||||
|
MAD_UNITS_SECONDS = 0, |
||||||
|
|
||||||
|
/* metric units */ |
||||||
|
|
||||||
|
MAD_UNITS_DECISECONDS = 10, |
||||||
|
MAD_UNITS_CENTISECONDS = 100, |
||||||
|
MAD_UNITS_MILLISECONDS = 1000, |
||||||
|
|
||||||
|
/* audio sample units */ |
||||||
|
|
||||||
|
MAD_UNITS_8000_HZ = 8000, |
||||||
|
MAD_UNITS_11025_HZ = 11025, |
||||||
|
MAD_UNITS_12000_HZ = 12000, |
||||||
|
|
||||||
|
MAD_UNITS_16000_HZ = 16000, |
||||||
|
MAD_UNITS_22050_HZ = 22050, |
||||||
|
MAD_UNITS_24000_HZ = 24000, |
||||||
|
|
||||||
|
MAD_UNITS_32000_HZ = 32000, |
||||||
|
MAD_UNITS_44100_HZ = 44100, |
||||||
|
MAD_UNITS_48000_HZ = 48000, |
||||||
|
|
||||||
|
/* video frame/field units */ |
||||||
|
|
||||||
|
MAD_UNITS_24_FPS = 24, |
||||||
|
MAD_UNITS_25_FPS = 25, |
||||||
|
MAD_UNITS_30_FPS = 30, |
||||||
|
MAD_UNITS_48_FPS = 48, |
||||||
|
MAD_UNITS_50_FPS = 50, |
||||||
|
MAD_UNITS_60_FPS = 60, |
||||||
|
|
||||||
|
/* CD audio frames */ |
||||||
|
|
||||||
|
MAD_UNITS_75_FPS = 75, |
||||||
|
|
||||||
|
/* video drop-frame units */ |
||||||
|
|
||||||
|
MAD_UNITS_23_976_FPS = -24, |
||||||
|
MAD_UNITS_24_975_FPS = -25, |
||||||
|
MAD_UNITS_29_97_FPS = -30, |
||||||
|
MAD_UNITS_47_952_FPS = -48, |
||||||
|
MAD_UNITS_49_95_FPS = -50, |
||||||
|
MAD_UNITS_59_94_FPS = -60 |
||||||
|
}; |
||||||
|
|
||||||
|
# define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero)) |
||||||
|
|
||||||
|
int mad_timer_compare(mad_timer_t, mad_timer_t); |
||||||
|
|
||||||
|
# define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero) |
||||||
|
|
||||||
|
void mad_timer_negate(mad_timer_t *); |
||||||
|
mad_timer_t mad_timer_abs(mad_timer_t); |
||||||
|
|
||||||
|
void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); |
||||||
|
void mad_timer_add(mad_timer_t *, mad_timer_t); |
||||||
|
void mad_timer_multiply(mad_timer_t *, signed long); |
||||||
|
|
||||||
|
signed long mad_timer_count(mad_timer_t, enum mad_units); |
||||||
|
unsigned long mad_timer_fraction(mad_timer_t, unsigned long); |
||||||
|
void mad_timer_string(mad_timer_t, char *, char const *, |
||||||
|
enum mad_units, enum mad_units, unsigned long); |
||||||
|
|
||||||
|
# endif |
@ -0,0 +1,91 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: version.c,v 1.15 2004/01/23 09:41:33 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifdef HAVE_CONFIG_H |
||||||
|
# include "config.h" |
||||||
|
# endif |
||||||
|
|
||||||
|
# include "global.h" |
||||||
|
|
||||||
|
# include "version.h" |
||||||
|
|
||||||
|
char const mad_version[] = "MPEG Audio Decoder " MAD_VERSION; |
||||||
|
char const mad_copyright[] = "Copyright (C) " MAD_PUBLISHYEAR " " MAD_AUTHOR; |
||||||
|
char const mad_author[] = MAD_AUTHOR " <" MAD_EMAIL ">"; |
||||||
|
|
||||||
|
char const mad_build[] = "" |
||||||
|
# if defined(DEBUG) |
||||||
|
"DEBUG " |
||||||
|
# elif defined(NDEBUG) |
||||||
|
"NDEBUG " |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(EXPERIMENTAL) |
||||||
|
"EXPERIMENTAL " |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(FPM_64BIT) |
||||||
|
"FPM_64BIT " |
||||||
|
# elif defined(FPM_INTEL) |
||||||
|
"FPM_INTEL " |
||||||
|
# elif defined(FPM_ARM) |
||||||
|
"FPM_ARM " |
||||||
|
# elif defined(FPM_MIPS) |
||||||
|
"FPM_MIPS " |
||||||
|
# elif defined(FPM_SPARC) |
||||||
|
"FPM_SPARC " |
||||||
|
# elif defined(FPM_PPC) |
||||||
|
"FPM_PPC " |
||||||
|
# elif defined(FPM_DEFAULT) |
||||||
|
"FPM_DEFAULT " |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(ASO_IMDCT) |
||||||
|
"ASO_IMDCT " |
||||||
|
# endif |
||||||
|
# if defined(ASO_INTERLEAVE1) |
||||||
|
"ASO_INTERLEAVE1 " |
||||||
|
# endif |
||||||
|
# if defined(ASO_INTERLEAVE2) |
||||||
|
"ASO_INTERLEAVE2 " |
||||||
|
# endif |
||||||
|
# if defined(ASO_ZEROCHECK) |
||||||
|
"ASO_ZEROCHECK " |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_SPEED) |
||||||
|
"OPT_SPEED " |
||||||
|
# elif defined(OPT_ACCURACY) |
||||||
|
"OPT_ACCURACY " |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_SSO) |
||||||
|
"OPT_SSO " |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_DCTO) /* never defined here */ |
||||||
|
"OPT_DCTO " |
||||||
|
# endif |
||||||
|
|
||||||
|
# if defined(OPT_STRICT) |
||||||
|
"OPT_STRICT " |
||||||
|
# endif |
||||||
|
; |
@ -0,0 +1,47 @@ |
|||||||
|
/*
|
||||||
|
* libmad - MPEG audio decoder library |
||||||
|
* Copyright (C) 2000-2004 Underbit Technologies, Inc. |
||||||
|
* |
||||||
|
* 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 |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
* |
||||||
|
* $Id: version.h,v 1.26 2004/01/23 09:41:33 rob Exp $ |
||||||
|
*/ |
||||||
|
|
||||||
|
# ifndef LIBMAD_VERSION_H |
||||||
|
# define LIBMAD_VERSION_H |
||||||
|
|
||||||
|
# define MAD_VERSION_MAJOR 0 |
||||||
|
# define MAD_VERSION_MINOR 15 |
||||||
|
# define MAD_VERSION_PATCH 1 |
||||||
|
# define MAD_VERSION_EXTRA " (beta)" |
||||||
|
|
||||||
|
# define MAD_VERSION_STRINGIZE(str) #str |
||||||
|
# define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num) |
||||||
|
|
||||||
|
# define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ |
||||||
|
MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \
|
||||||
|
MAD_VERSION_STRING(MAD_VERSION_PATCH) \
|
||||||
|
MAD_VERSION_EXTRA |
||||||
|
|
||||||
|
# define MAD_PUBLISHYEAR "2000-2004" |
||||||
|
# define MAD_AUTHOR "Underbit Technologies, Inc." |
||||||
|
# define MAD_EMAIL "info@underbit.com" |
||||||
|
|
||||||
|
extern char const mad_version[]; |
||||||
|
extern char const mad_copyright[]; |
||||||
|
extern char const mad_author[]; |
||||||
|
extern char const mad_build[]; |
||||||
|
|
||||||
|
# endif |
Loading…
Reference in new issue