forked from len0rd/rockbox
Initial check-in of unmodified libmad code (libmad-0.15.1b)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5955 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
6416099f3f
commit
98c4f65f3a
41 changed files with 23761 additions and 0 deletions
338
apps/codecs/libmad/CHANGES
Normal file
338
apps/codecs/libmad/CHANGES
Normal file
|
|
@ -0,0 +1,338 @@
|
||||||
|
|
||||||
|
libmad - MPEG audio decoder library
|
||||||
|
Copyright (C) 2000-2004 Underbit Technologies, Inc.
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
340
apps/codecs/libmad/COPYING
Normal file
340
apps/codecs/libmad/COPYING
Normal file
|
|
@ -0,0 +1,340 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
||||||
21
apps/codecs/libmad/COPYRIGHT
Normal file
21
apps/codecs/libmad/COPYRIGHT
Normal file
|
|
@ -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>
|
||||||
|
|
||||||
116
apps/codecs/libmad/CREDITS
Normal file
116
apps/codecs/libmad/CREDITS
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
|
||||||
|
libmad - MPEG audio decoder library
|
||||||
|
Copyright (C) 2000-2004 Underbit Technologies, Inc.
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
607
apps/codecs/libmad/D.dat
Normal file
607
apps/codecs/libmad/D.dat
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 */ }
|
||||||
183
apps/codecs/libmad/INSTALL
Normal file
183
apps/codecs/libmad/INSTALL
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
241
apps/codecs/libmad/README
Normal file
241
apps/codecs/libmad/README
Normal file
|
|
@ -0,0 +1,241 @@
|
||||||
|
|
||||||
|
libmad - MPEG audio decoder library
|
||||||
|
Copyright (C) 2000-2004 Underbit Technologies, Inc.
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
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/
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
23
apps/codecs/libmad/README.rockbox
Normal file
23
apps/codecs/libmad/README.rockbox
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
Library: libmad-0.15.1b (2004-02-17)
|
||||||
|
Imported: 2005-02-15 by Dave Chapman
|
||||||
|
|
||||||
|
|
||||||
|
This directory contains a local version of libmad for use by Rockbox
|
||||||
|
targets needing software MPEG audio decoding.
|
||||||
|
|
||||||
|
|
||||||
|
LICENSING INFORMATION
|
||||||
|
|
||||||
|
libmad is (C) 2000-2004 Unibit Technologies, Inc. and licensed under
|
||||||
|
the terms of the GNU General Public License. See file "COPYRIGHT" in
|
||||||
|
this directory for more information.
|
||||||
|
|
||||||
|
|
||||||
|
IMPORT DETAILS
|
||||||
|
|
||||||
|
The base version first imported into Rockbox was libmad-0.15.1b
|
||||||
|
(released on 2004-02-17), downloaded on 2005-02-15 from the files
|
||||||
|
section at http://sourceforge.net/projects/mad/
|
||||||
|
|
||||||
|
The autoconf/automake files were removed from the official source
|
||||||
|
tarball, as well as the "msvc++" subdirectory.
|
||||||
69
apps/codecs/libmad/TODO
Normal file
69
apps/codecs/libmad/TODO
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
|
||||||
|
libmad - MPEG audio decoder library
|
||||||
|
Copyright (C) 2000-2004 Underbit Technologies, Inc.
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
7
apps/codecs/libmad/VERSION
Normal file
7
apps/codecs/libmad/VERSION
Normal file
|
|
@ -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
|
||||||
237
apps/codecs/libmad/bit.c
Normal file
237
apps/codecs/libmad/bit.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
47
apps/codecs/libmad/bit.h
Normal file
47
apps/codecs/libmad/bit.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
582
apps/codecs/libmad/decoder.c
Normal file
582
apps/codecs/libmad/decoder.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
|
}
|
||||||
91
apps/codecs/libmad/decoder.h
Normal file
91
apps/codecs/libmad/decoder.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
81
apps/codecs/libmad/fixed.c
Normal file
81
apps/codecs/libmad/fixed.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
499
apps/codecs/libmad/fixed.h
Normal file
499
apps/codecs/libmad/fixed.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
503
apps/codecs/libmad/frame.c
Normal file
503
apps/codecs/libmad/frame.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
118
apps/codecs/libmad/frame.h
Normal file
118
apps/codecs/libmad/frame.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
58
apps/codecs/libmad/global.h
Normal file
58
apps/codecs/libmad/global.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
3109
apps/codecs/libmad/huffman.c
Normal file
3109
apps/codecs/libmad/huffman.c
Normal file
File diff suppressed because it is too large
Load diff
66
apps/codecs/libmad/huffman.h
Normal file
66
apps/codecs/libmad/huffman.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
1000
apps/codecs/libmad/imdct_l_arm.S
Normal file
1000
apps/codecs/libmad/imdct_l_arm.S
Normal file
File diff suppressed because it is too large
Load diff
62
apps/codecs/libmad/imdct_s.dat
Normal file
62
apps/codecs/libmad/imdct_s.dat
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* 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 */ }
|
||||||
534
apps/codecs/libmad/layer12.c
Normal file
534
apps/codecs/libmad/layer12.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
31
apps/codecs/libmad/layer12.h
Normal file
31
apps/codecs/libmad/layer12.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
2698
apps/codecs/libmad/layer3.c
Normal file
2698
apps/codecs/libmad/layer3.c
Normal file
File diff suppressed because it is too large
Load diff
30
apps/codecs/libmad/layer3.h
Normal file
30
apps/codecs/libmad/layer3.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
964
apps/codecs/libmad/mad.h
Normal file
964
apps/codecs/libmad/mad.h
Normal file
|
|
@ -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
|
||||||
36
apps/codecs/libmad/mad.h.sed
Normal file
36
apps/codecs/libmad/mad.h.sed
Normal file
|
|
@ -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$
|
||||||
|
#
|
||||||
|
|
||||||
|
/^\/\*$/{
|
||||||
|
N
|
||||||
|
s/ \* libmad - /&/
|
||||||
|
t copy
|
||||||
|
b next
|
||||||
|
: copy
|
||||||
|
g
|
||||||
|
n
|
||||||
|
s|^ \* \$\(Id: .*\) \$$|/* \1 */|p
|
||||||
|
/^ \*\/$/d
|
||||||
|
b copy
|
||||||
|
}
|
||||||
|
/^# *include "/d
|
||||||
|
: next
|
||||||
|
p
|
||||||
222
apps/codecs/libmad/minimad.c
Normal file
222
apps/codecs/libmad/minimad.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
77
apps/codecs/libmad/qc_table.dat
Normal file
77
apps/codecs/libmad/qc_table.dat
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 */ }
|
||||||
8747
apps/codecs/libmad/rq_table.dat
Normal file
8747
apps/codecs/libmad/rq_table.dat
Normal file
File diff suppressed because it is too large
Load diff
106
apps/codecs/libmad/sf_table.dat
Normal file
106
apps/codecs/libmad/sf_table.dat
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 */
|
||||||
161
apps/codecs/libmad/stream.c
Normal file
161
apps/codecs/libmad/stream.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
108
apps/codecs/libmad/stream.h
Normal file
108
apps/codecs/libmad/stream.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
857
apps/codecs/libmad/synth.c
Normal file
857
apps/codecs/libmad/synth.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
69
apps/codecs/libmad/synth.h
Normal file
69
apps/codecs/libmad/synth.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
485
apps/codecs/libmad/timer.c
Normal file
485
apps/codecs/libmad/timer.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
100
apps/codecs/libmad/timer.h
Normal file
100
apps/codecs/libmad/timer.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
91
apps/codecs/libmad/version.c
Normal file
91
apps/codecs/libmad/version.c
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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
|
||||||
|
;
|
||||||
47
apps/codecs/libmad/version.h
Normal file
47
apps/codecs/libmad/version.h
Normal file
|
|
@ -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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
# 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…
Add table
Add a link
Reference in a new issue