Add faad source.

Change-Id: Ibb19041b539d5ed22bb0e757bd957ee9ab8c92e6
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d5301a8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,33 @@
+/build
+/source/build
+*.mode1v3
+*.pbxuser
+*.pbxindex/
+!user.pbxuser
+/*.log
+*.user
+*.ncb
+*.suo
+*.pdb
+*.pdf
+*.html
+*.idb
+*.o
+*.lo
+*.a
+*.so
+*.so.0
+*.la
+.deps
+.libs
+*.pyc
+.DS_Store
+# Emacs and other editor backup files
+*~
+
+# builds on Windows
+Debug/
+Release/
+release/
+
+/mpeg4ip_config.h
\ No newline at end of file
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..bf50f20
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,482 @@
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 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.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, 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 library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, 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 companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, 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 library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+  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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+  If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  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.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+  9. 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 Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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.
+
+  11. 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 Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  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 library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library 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
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; 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.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f5ef5da
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,48 @@
+###################################################
+#
+# Makefile for libaacdec.so
+#
+###################################################
+
+C_SRCS= \
+	bits.c \
+	block.c \
+	config.c \
+	decdata.c \
+	decoder.c \
+	dolby_adapt.c \
+	fastfft.c \
+	huffdec.c \
+	huffinit.c \
+	hufftables.c \
+	intensity.c \
+	monopred.c \
+	nok_lt_prediction.c \
+	pns.c \
+	stereo.c \
+	tns.c \
+	transfo.c \
+	util.c 
+
+C_OPTIONS= -O2 -Wall -fexceptions -fno-strict-aliasing -shared -fPIC
+
+CPP_SRCS= 
+
+CPP_OPTIONS=
+
+INCLUDE= . 
+
+DYNLIB=libaacdec.so
+
+all: mpeg4ip_config.h libaacdec.so
+
+include ../../source/common.mak
+
+#
+# setup the correct config.h file
+#
+
+mpeg4ip_config.h: mpeg4ip_config_Linux32.h
+	cp  mpeg4ip_config_Linux32.h  mpeg4ip_config.h
+
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..a8eefc9
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,38 @@
+lib_LTLIBRARIES = libmpeg4ip_faad.la
+libmpeg4ip_faad_la_SOURCES = \
+	bits.c \
+	block.c \
+	config.c \
+	decdata.c \
+	decoder.c \
+	dolby_adapt.c \
+	fastfft.c \
+	huffdec.c \
+	huffinit.c \
+	hufftables.c \
+	intensity.c \
+	monopred.c \
+	nok_lt_prediction.c \
+	pns.c \
+	stereo.c \
+	tns.c \
+	transfo.c \
+	util.c \
+	all.h \
+	bits.h \
+	block.h \
+	fastfft.h \
+	interface.h \
+	kbd_win.h \
+	monopred.h \
+	nok_lt_prediction.h \
+	nok_ltp_common.h \
+	nok_ltp_common_internal.h \
+	port.h \
+	tns.h \
+	transfo.h\
+	util.h
+INCLUDES = -I$(top_srcdir)/include
+AM_CFLAGS = -O2 -Wall -fexceptions -fno-strict-aliasing
+
+EXTRA_DIST = COPYING libfaad60.dsp README libfaad.vcproj
diff --git a/README b/README
new file mode 100644
index 0000000..daf4fbd
--- /dev/null
+++ b/README
@@ -0,0 +1,18 @@
+Freeware Advanced Audio Coder/Decoder
+http://www.audiocoding.com/
+
+Currently maintained by
+M. Bakker (menno@audiocoding.com).
+
+Other contributors
+Tony Lenox (len0x@mail.ru)
+RageOMatic (rageamp@realedge.com)
+thebard (wmilas@rarcoa.com)
+Ivan Dimkovic (dim@psytel-research.co.yu)
+
+(If you feel your name should be here please mail me, I
+can't remember everyone)
+
+The modifications to the ISO MPEG4-AAC reference source code
+are distributed under the GNU General Public License
+(see the file COPYING for details).
diff --git a/all.h b/all.h
new file mode 100644
index 0000000..e103c50
--- /dev/null
+++ b/all.h
@@ -0,0 +1,458 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by 
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS and edited by
+Yoshiaki Oikawa (Sony Corporation),
+Mitsuyuki Hatanaka (Sony Corporation),
+in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 
+14496-1,2 and 3. This software module is an implementation of a part of one or more 
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio 
+standards free license to this software module or modifications thereof for use in 
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or 
+software products are advised that this use may infringe existing patents. 
+The original developer of this software module and his/her company, the subsequent 
+editors and their companies, and ISO/IEC have no liability for use of this software 
+module or modifications thereof in an implementation. Copyright is not released for 
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the 
+code to a third party and to inhibit third party from using the code for non 
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works." 
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+
+#ifndef	_all_h_
+#define _all_h_
+
+//#include "mpeg4ip.h"
+#ifdef _WIN32
+#include <conio.h>
+#include <io.h>
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int32 u_int32_t;
+#define WIN32_MEAN_AND_LEAN
+#include <windows.h>
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+typedef uint32_t u_int32_t;
+#endif
+
+#include <math.h>
+#include "interface.h"
+#include "tns.h"
+#include "nok_ltp_common.h"
+#include "monopred.h"
+#include "bits.h"
+#ifndef _POSIX_SOURCE
+#define                 _POSIX_SOURCE   /* stops repeat typdef of ulong */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef	float Float;
+typedef	unsigned char	byte;
+
+
+enum
+{
+    /*
+     * channels for 5.1 main profile configuration 
+     * (modify for any desired decoder configuration)
+     */
+#ifdef BIGDECODER
+    FChans	= 15,	/* front channels: left, center, right */
+    FCenter	= 1,	/* 1 if decoder has front center channel */
+    SChans	= 18,	/* side channels: */
+    BChans	= 15,	/* back channels: left surround, right surround */
+    BCenter	= 1,	/* 1 if decoder has back center channel */
+    LChans	= 1,	/* LFE channels */
+    XChans	= 1,	/* scratch space for parsing unused channels */  
+#else
+    FChans	= 3,	/* front channels: left, center, right */
+    FCenter	= 0,	/* 1 if decoder has front center channel */
+    SChans	= 2,	/* side channels: */
+    BChans	= 1,	/* back channels: left surround, right surround */
+    BCenter	= 0,	/* 1 if decoder has back center channel */
+    LChans	= 1,	/* LFE channels */
+    XChans	= 1,	/* scratch space for parsing unused channels */  
+#endif
+    
+    Chans	= FChans + SChans + BChans + LChans + XChans
+};
+
+/* #define is required in order to use these args in #if () directive */
+#if 0
+#define ICChans	1	/* independently switched coupling channels */
+#define DCChans	2	/* dependently switched coupling channels */
+#define XCChans	1	/* scratch space for parsing unused coupling channels */
+#define CChans	(ICChans + DCChans + XCChans)
+#else
+#define ICChans	0
+#define DCChans	0
+#define XCChans	0
+#define CChans	0
+#endif
+
+enum
+{
+    /* block switch windows for single channels or channel pairs */
+    Winds	= Chans,
+    
+    /* average channel block length, bytes */
+    Avjframe	= 341,	
+
+    TEXP	= 128, /* size of exp cache table */
+    MAX_IQ_TBL	= 8192+15, /* size of inv quant table */
+    MAXFFT	= LN4,
+
+    XXXXX
+};
+
+
+typedef struct
+{
+    int	    islong;			/* true if long block */
+    int	    nsbk;			/* sub-blocks (SB) per block */
+    int	    bins_per_bk;		/* coef's per block */
+    int	    sfb_per_bk;			/* sfb per block */
+    int	    bins_per_sbk[MAX_SBK];	/* coef's per SB */
+    int	    sfb_per_sbk[MAX_SBK];	/* sfb per SB */
+    int	    sectbits[MAX_SBK];
+    int   *sbk_sfb_top[MAX_SBK];	/* top coef per sfb per SB */
+    int   *sfb_width_128;		/* sfb width for short blocks */
+    int   bk_sfb_top[200];		/* cum version of above */
+    int	    num_groups;
+    int   group_len[8];
+    int   group_offs[8];
+} Info;
+
+typedef struct {
+    int	samp_rate;
+    int	nsfb1024;
+    int *SFbands1024;
+    int	nsfb128;
+    int *SFbands128;
+} SR_Info;
+
+typedef struct
+{
+    byte    this_bk;
+    byte    prev_bk;
+} Wnd_Shape;
+
+typedef struct
+{
+    int len;
+    unsigned long cw;
+	char x, y, v, w;
+} Huffman;
+
+typedef struct
+{
+    int len;
+    unsigned long cw;
+	int scl;
+} Huffscl;
+
+typedef	struct
+{
+	int dim;
+    int signed_cb;
+    Huffman *hcw;
+} Hcb;
+
+
+typedef struct
+{
+    int present;	/* channel present */
+    int tag;		/* element tag */
+    int cpe;		/* 0 if single channel, 1 if channel pair */
+    int	common_window;	/* 1 if common window for cpe */
+    int	ch_is_left;	/* 1 if left channel of cpe */
+    int	paired_ch;	/* index of paired channel in cpe */
+    int widx;		/* window element index for this channel */
+    int is_present;	/* intensity stereo is used */
+    int ncch;		/* number of coupling channels for this ch */
+    char *fext;		/* filename extension */
+} Ch_Info;
+
+typedef struct {
+    int nch;		/* total number of audio channels */
+    int nfsce;		/* number of front SCE's pror to first front CPE */
+    int nfch;		/* number of front channels */
+    int nsch;		/* number of side channels */
+    int nbch;		/* number of back channels */
+    int nlch;		/* number of lfe channels */
+    int ncch;		/* number of valid coupling channels */
+    int cch_tag[(1<<LEN_TAG)];	/* tags of valid CCE's */
+    int object_type;
+    int sampling_rate_idx;
+    Ch_Info ch_info[Chans];
+} MC_Info;
+
+typedef struct {
+    int num_ele;
+    int ele_is_cpe[(1<<LEN_TAG)];
+    int ele_tag[(1<<LEN_TAG)];
+} EleList;
+
+typedef struct {
+    int present;
+    int ele_tag;
+    int pseudo_enab;
+} MIXdown;
+
+typedef struct {
+    int object_type;
+    int sampling_rate_idx;
+    EleList front;
+    EleList side;
+    EleList back;
+    EleList lfe;
+    EleList data;
+    EleList coupling;
+    MIXdown mono_mix;
+    MIXdown stereo_mix;
+    MIXdown matrix_mix;
+    char comments[(1<<LEN_PC_COMM)+1];
+    long    buffer_fullness;	/* put this transport level info here */
+} ProgConfig;
+
+typedef struct {
+    char    adif_id[LEN_ADIF_ID+1];
+    int	    copy_id_present;
+    char    copy_id[LEN_COPYRT_ID+1];
+    int	    original_copy;
+    int	    home;
+    int	    bitstream_type;
+    long    bitrate;
+    int	    num_pce;
+    int	    prog_tags[(1<<LEN_TAG)];
+} ADIF_Header;
+
+typedef struct {
+    int	copy_id_bit;
+    int copy_id_start;
+	int frame_length;
+	int buffer_fullness;
+	int raw_blocks;
+} ADTS_Variable;
+
+typedef struct {
+	int ID;
+	int layer;
+	int protection_absent;
+	int object_type;
+	int sampling_rate_idx;
+	int private_bit;
+	int channel_configuration;
+	int original_copy;
+	int home;
+	int emphasis;
+} ADTS_Fixed;
+
+typedef struct {
+	ADTS_Fixed fixed;
+	ADTS_Variable variable;
+	int adts_error_check;
+} ADTS_Header;
+
+struct Pulse_Info
+{
+    int pulse_data_present;
+    int number_pulse;
+    int pulse_start_sfb;
+    int pulse_position[NUM_PULSE_LINES];
+    int pulse_offset[NUM_PULSE_LINES];
+    int pulse_amp[NUM_PULSE_LINES];
+};
+
+
+extern Huffman book1[];
+extern Huffman book2[];
+extern Huffman book3[];
+extern Huffman book4[];
+extern Huffman book5[];
+extern Huffman book6[];
+extern Huffman book7[];
+extern Huffman book8[];
+extern Huffman book9[];
+extern Huffman book10[];
+extern Huffman book11[];
+extern Huffscl bookscl[];
+extern Hcb book[NSPECBOOKS+2];
+extern int sfbwidth128[];
+extern SR_Info samp_rate_info[];
+extern int tns_max_bands_tbl[(1<<LEN_SAMP_IDX)][4];
+extern const int SampleRates[];
+extern int pred_max_bands_tbl[(1<<LEN_SAMP_IDX)];
+
+#ifdef _WIN32
+  #pragma pack(push, 8)
+  #ifndef FAADAPI
+    #ifdef DLL_EXPORTS
+      #define FAADAPI __declspec( dllexport ) 
+    #else
+      #define FAADAPI __declspec( dllimport ) 
+    #endif
+  #endif
+  // LIB case:    #define FAADAPI __stdcall
+#else
+  #ifndef FAADAPI
+    #define FAADAPI
+  #endif
+#endif
+
+#define FAAD_OK 0
+#define FAAD_OK_CHUPDATE 1
+#define FAAD_ERROR 2
+#define FAAD_FATAL_ERROR 3
+
+typedef void *faacProgConfig;
+
+typedef struct faacDecConfiguration
+{
+  unsigned int defObjectType;
+  unsigned int defSampleRate;
+} faacDecConfiguration, *faacDecConfigurationPtr;
+typedef enum {
+    WS_FHG, WS_DOLBY, N_WINDOW_SHAPES
+}
+Window_shape;
+
+typedef enum {
+    WT_LONG,
+    WT_SHORT,
+    WT_FLAT,
+    WT_ADV,         /* Advanced flat window */
+    N_WINDOW_TYPES
+}
+WINDOW_TYPE;
+
+typedef struct {
+	int isMpeg4;
+	int frameNum;
+	int pceChannels;
+	int numChannels;
+  int chans_inited;
+
+	/* Configuration data */
+	faacDecConfiguration config;
+
+	bitfile ld;
+
+	int adif_header_present;
+	int adts_header_present;
+	ADIF_Header adif_header;
+	ADTS_Header adts_header;
+
+	/* decoder data */
+	Float *coef[Chans];
+	Float *data[Chans];
+	Float *state[Chans];
+	byte hasmask[Winds];
+	byte *mask[Winds];
+	byte *group[Chans];
+	byte wnd[Chans];
+	byte max_sfb[Chans];
+	byte *cb_map[Chans];
+    int *lpflag[Chans];
+	int *prstflag[Chans];
+
+	/* prediction */
+	int last_rstgrp_num[Chans];
+	PRED_STATUS	*sp_status[Chans];
+	float *mnt_table;
+	float *exp_table;
+	int warn_flag;
+
+	/* long term prediction */
+	NOK_LT_PRED_STATUS *nok_lt_status[Chans];
+	/* Pulse coding */
+	struct Pulse_Info pulse_info;
+
+	MC_Info mc_info;
+	MC_Info save_mc_info;
+	int default_config;
+	int current_program;
+	ProgConfig prog_config;
+	Info eight_short_info;
+	Info *win_seq_info[NUM_WIN_SEQ];
+	Info *winmap[NUM_WIN_SEQ];
+	Info only_long_info;
+
+	Wnd_Shape wnd_shape[Chans];
+	int *factors[Chans];
+	TNS_frame_info *tns[Chans];
+
+	int dolbyShortOffset_f2t;
+	int dolbyShortOffset_t2f;
+	int first_cpe;
+
+	/* PNS data */
+    long cur_noise_state;
+    long noise_state_save[MAXBANDS];
+    int lp_store[MAXBANDS];
+
+	/* tables */
+	Float *iq_exp_tbl;
+	Float *exptable;
+
+	/* FFT data */
+	int *unscambled64;
+	int *unscambled512;
+  // block.c data
+  Float *sin_long;
+  Float *sin_short;
+#ifndef WIN_TABLE
+  Float *kbd_long;
+  Float *kbd_short;
+#endif
+  Float *sin_edler;
+  Float *kbd_edler;
+  Float *sin_adv;
+  Float *kbd_adv;
+
+Float *windowPtr[N_WINDOW_TYPES][N_WINDOW_SHAPES];
+
+} faacDecStruct, *faacDecHandle;
+
+faacDecHandle FAADAPI faacDecOpen(void);
+
+faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder);
+
+int FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,
+									faacDecConfigurationPtr config);
+
+int FAADAPI faacDecInit(faacDecHandle hDecoder,
+			unsigned char *buffer,
+			unsigned long *samplerate,
+			unsigned long *channels);
+
+int FAADAPI faacDecGetProgConfig(faacDecHandle hDecoder,
+				 faacProgConfig *progConfig);
+
+int FAADAPI faacDecDecode(faacDecHandle hDecoder,
+			  unsigned char *buffer,
+			  unsigned long *bytesconsumed,
+			  short *sample_buffer,
+			  unsigned long *samples);
+
+void FAADAPI faacDecClose(faacDecHandle hDecoder);
+
+
+#include "nok_lt_prediction.h"
+#include "port.h"
+
+#ifdef __cplusplus
+}
+#endif
+#endif	/* _all_h_ */
diff --git a/bits.c b/bits.c
new file mode 100644
index 0000000..9b9046d
--- /dev/null
+++ b/bits.c
@@ -0,0 +1,123 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * $Id: bits.c,v 1.6 2005/05/09 21:29:56 wmaycisco Exp $
+ */
+
+#include <assert.h>
+#include "all.h"
+/* to mask the n least significant bits of an integer */
+unsigned int faad_bit_msk[33] =
+{
+	0x00000000, 0x00000001, 0x00000003, 0x00000007,
+	0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
+	0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
+	0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
+	0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
+	0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
+	0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
+	0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
+	0xffffffff
+};
+
+/* initialize buffer, call once before first getbits or showbits */
+void faad_initbits(bitfile *ld, unsigned char *buffer, uint32_t buflen)
+{
+	ld->incnt = 0;
+	ld->framebits = 0;
+	ld->bitcnt = 0;
+	ld->buffer = buffer;
+	ld->rdptr = buffer;
+	ld->maxbits = buflen * 8;
+}
+
+
+/* return next n bits (right adjusted) */
+uint32_t faad_getbits(bitfile *ld, int n)
+{
+	long l;
+
+	l = faad_showbits(ld, n);
+	faad_flushbits(ld, n);
+
+	return l;
+}
+
+uint32_t faad_getbits_fast(bitfile *ld, int n)
+{
+	unsigned int l;
+
+	l =  (unsigned char) (ld->rdptr[0] << ld->bitcnt);
+	l |= ((unsigned int) ld->rdptr[1] << ld->bitcnt)>>8;
+	l <<= n;
+	l >>= 8;
+
+	ld->bitcnt += n;
+	ld->framebits += n;
+
+	ld->rdptr += (ld->bitcnt>>3);
+	ld->bitcnt &= 7;
+
+	return l;
+}
+
+uint32_t faad_get1bit(bitfile *ld)
+{
+	unsigned char l;
+	l = *ld->rdptr << ld->bitcnt;
+
+	ld->bitcnt++;
+	ld->framebits++;
+	ld->rdptr += (ld->bitcnt>>3);
+	ld->bitcnt &= 7;
+
+	return l>>7;
+}
+
+
+int faad_get_processed_bits(bitfile *ld)
+{
+	return (ld->framebits);
+}
+
+uint32_t faad_byte_align(bitfile *ld)
+{
+  int i;
+
+  if (ld->bitcnt == 0) return 0;
+  i = 8 - ld->bitcnt;
+
+  faad_flushbits(ld, i);
+  return i;
+}
+
+void faad_bitdump (bitfile *ld)
+{
+  #if 0
+  printf("processed %d %d bits left - %d\n",
+	 ld->m_total / 8,
+	 ld->m_total % 8,
+	 ld->m_uNumOfBitsInBuffer);
+  #endif
+}
+
+int faad_bits_done (bitfile *ld)
+{
+  if (ld->maxbits > ld->framebits) return 0;
+  return 1;
+}
diff --git a/bits.h b/bits.h
new file mode 100644
index 0000000..324dc0e
--- /dev/null
+++ b/bits.h
@@ -0,0 +1,81 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * $Id: bits.h,v 1.5 2005/05/09 21:29:56 wmaycisco Exp $
+ */
+
+#ifndef __BITS_H__
+#define __BITS_H__ 1
+#include "all.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _bitfile2
+{
+	/* bit input */
+  unsigned char *buffer;
+  unsigned char *rdptr;
+    int m_alignment_offset;
+  int incnt;
+  int bitcnt;
+  int framebits;
+  int maxbits;
+} bitfile;
+
+void faad_initbits(bitfile *ld, unsigned char *buffer, uint32_t buflen);
+uint32_t faad_getbits(bitfile *ld, int n);
+uint32_t faad_getbits_fast(bitfile *ld, int n);
+uint32_t faad_get1bit(bitfile *ld);
+uint32_t faad_byte_align(bitfile *ld);
+int faad_get_processed_bits(bitfile *ld);
+  int faad_bits_done(bitfile *ld);
+
+  void faad_bitdump(bitfile *ld);
+
+extern unsigned int faad_bit_msk[33];
+
+#define _SWAP(a) ((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3])
+
+static __inline uint32_t faad_showbits(bitfile *ld, int n)
+{
+        unsigned char *v;
+	int rbit = 32 - ld->bitcnt;
+	uint32_t b;
+
+	v = ld->rdptr;
+	b = _SWAP(v);
+	return ((b & faad_bit_msk[rbit]) >> (rbit-n));
+}
+
+static __inline void faad_flushbits(bitfile *ld, int n)
+{
+	ld->bitcnt += n;
+
+	if (ld->bitcnt >= 8) {
+		ld->rdptr += (ld->bitcnt>>3);
+		ld->bitcnt &= 7;
+	}
+
+	ld->framebits += n;
+}
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/block.c b/block.c
new file mode 100644
index 0000000..779eea1
--- /dev/null
+++ b/block.c
@@ -0,0 +1,376 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: block.c,v 1.8 2003/05/23 18:55:19 wmaycisco Exp $
+ */
+
+#include "all.h"
+#include "block.h"
+#include "kbd_win.h"
+#include "transfo.h"
+#include "util.h"
+
+#ifndef PI
+#define PI 3.14159265359f
+#endif
+
+
+
+const int windowLeng[N_WINDOW_TYPES] = {
+    1024,
+    128,
+    1024,
+    1024
+};
+
+
+#ifndef WIN_TABLE
+static float Izero(float x)
+{
+    float IzeroEPSILON = 1E-37f;  /* Max error acceptable in Izero */
+    float sum, u, halfx, temp;
+    int n;
+
+    sum = u = 1.f;
+    n = 1;
+    halfx = x/2.0f;
+    do {
+        temp = halfx/(float)n;
+        n += 1;
+        temp *= temp;
+        u *= temp;
+        sum += u;
+    } while (u >= IzeroEPSILON*sum);
+
+    return(sum);
+}
+
+static void CalculateKBDWindow(float* win, float alpha, int length)
+{
+    int i;
+    float IBeta;
+    float tmp;
+    float sum = 0.0;
+
+    alpha *= PI;
+    IBeta = 1.0f/Izero(alpha);
+
+    /* calculate lower half of Kaiser Bessel window */
+    for(i=0; i<(length>>1); i++) {
+        tmp = 4.0f*(float)i/(float)length - 1.0f;
+        win[i] = Izero(alpha*(float)sqrt(1.0f-tmp*tmp))*IBeta;
+        sum += win[i];
+    }
+
+    sum = 1.0f/sum;
+    tmp = 0.0f;
+
+    /* calculate lower half of window */
+    for(i=0; i<(length>>1); i++) {
+        tmp += win[i];
+        win[i] = (float)sqrt(tmp*sum);
+    }
+}
+#endif
+
+
+/*****************************************************************************
+*
+*   InitBlock
+*   calculate windows for use by Window()
+*   input: none
+*   output: none
+*   local static: none
+*   globals: shortWindow[], longWindow[]
+*
+*****************************************************************************/
+void InitBlock (faacDecHandle hDecoder)
+{
+
+    /* calc half-window data */
+    int     i, j;
+    float   phaseInc;
+
+    hDecoder->sin_long = AllocMemory(NWINLONG*sizeof(Float));
+    hDecoder->sin_short = AllocMemory(NWINSHORT*sizeof(Float));
+#ifndef WIN_TABLE
+    hDecoder->kbd_long = AllocMemory(NWINLONG*sizeof(Float));
+    hDecoder->kbd_short = AllocMemory(NWINSHORT*sizeof(Float));
+#endif
+    hDecoder->sin_edler = AllocMemory(NWINLONG*sizeof(Float));
+    hDecoder->kbd_edler = AllocMemory(NWINLONG*sizeof(Float));
+    hDecoder->sin_adv = AllocMemory(NWINADV*sizeof(Float));
+    hDecoder->kbd_adv = AllocMemory(NWINADV*sizeof(Float));
+
+/*
+Float *windowPtr[N_WINDOW_TYPES][N_WINDOW_SHAPES] = {
+    {sin_long,  kbd_long},
+    {sin_short, kbd_short},
+    {sin_edler, kbd_edler},
+    {sin_adv,   kbd_adv}
+};
+*/
+    hDecoder->windowPtr[0][0] = hDecoder->sin_long;
+    hDecoder->windowPtr[0][1] = hDecoder->kbd_long;
+    hDecoder->windowPtr[1][0] = hDecoder->sin_short;
+    hDecoder->windowPtr[1][1] = hDecoder->kbd_short;
+    hDecoder->windowPtr[2][0] = hDecoder->sin_edler;
+    hDecoder->windowPtr[2][1] = hDecoder->kbd_edler;
+    hDecoder->windowPtr[3][0] = hDecoder->sin_adv;
+    hDecoder->windowPtr[3][1] = hDecoder->kbd_adv;
+
+    /* init half-windows */
+
+    /* sin long window */
+    phaseInc = PI / (2.0f * NWINLONG);
+    for (i = 0; i < NWINLONG; i++) {
+        hDecoder->sin_long [i]  = (float)sin(phaseInc * (i + 0.5));
+    }
+
+    /* sin short window */
+    phaseInc = PI / (2.0f * NWINSHORT);
+    for (i = 0; i < NWINSHORT; i++) {
+        hDecoder->sin_short [i] = (float)sin(phaseInc * (i + 0.5));
+    }
+
+#ifndef WIN_TABLE
+    CalculateKBDWindow(hDecoder->kbd_long, 4.f, NWINLONG*2);
+    CalculateKBDWindow(hDecoder->kbd_short, 6.f, NWINSHORT*2);
+#endif
+
+    /* Edler windows */
+    for (i = 0, j = 0; i < NFLAT; i++, j++) {
+        hDecoder->sin_edler[j] = 0.0;
+        hDecoder->kbd_edler[j] = 0.0;
+    }
+    for (i = 0; i < NWINSHORT; i++, j++) {
+        hDecoder->sin_edler [j] = hDecoder->sin_short [i];
+        hDecoder->kbd_edler [j] = hDecoder->kbd_short [i];
+    }
+    for ( ; j < NWINFLAT; j++) {
+        hDecoder->sin_edler [j] = 1.0;
+        hDecoder->kbd_edler [j] = 1.0;
+    }
+
+    /* Advanced Edler windows */
+    for (i = 0, j = 0; i < NADV0; i++, j++) {
+        hDecoder->sin_adv [j] = 0.0;
+        hDecoder->kbd_adv [j] = 0.0;
+    }
+    for (i = 0; i < NWINSHORT; i++, j++) {
+        hDecoder->sin_adv[j] = hDecoder->sin_short[i];
+        hDecoder->kbd_adv[j] = hDecoder->kbd_short[i];
+    }
+    for ( ; j < NWINADV; j++) {
+        hDecoder->sin_adv[j] = 1.0;
+        hDecoder->kbd_adv[j] = 1.0;
+    }
+}
+
+void EndBlock(faacDecHandle hDecoder)
+{
+    FreeMemory(hDecoder->sin_long);
+    FreeMemory(hDecoder->sin_short);
+#ifndef WIN_TABLE
+    FreeMemory(hDecoder->kbd_long);
+    FreeMemory(hDecoder->kbd_short);
+#endif
+    FreeMemory(hDecoder->sin_edler);
+    FreeMemory(hDecoder->kbd_edler);
+    FreeMemory(hDecoder->sin_adv);
+    FreeMemory(hDecoder->kbd_adv);
+}
+
+/*****************************************************************************
+*
+*   Window
+*   window input sequence based on window type
+*   input: see below
+*   output: see below
+*   local static:
+*     firstTime             flag = need to initialize data structures
+*   globals: shortWindow[], longWindow[]
+*
+*****************************************************************************/
+
+void ITransformBlock (faacDecHandle hDecoder,
+    Float* dataPtr,             /* vector to be windowed in place   */
+    BLOCK_TYPE bT,              /* input: window type               */
+    Wnd_Shape *wnd_shape,
+    Float *state                /* input/output                     */
+    )
+{
+    int leng0, leng1;
+    int         i,leng;
+    Float       *windPtr;
+    WINDOW_TYPE beginWT, endWT;
+
+    if((bT==LONG_BLOCK) || (bT==START_FLAT_BLOCK)) {
+        beginWT = WT_LONG;
+    } else if(bT==STOP_FLAT_BLOCK) {
+        beginWT = WT_FLAT;
+    } else
+        beginWT = WT_SHORT;
+
+    if ((bT == LONG_BLOCK) || (bT == STOP_FLAT_BLOCK)) {
+        endWT = WT_LONG;
+    } else if (bT == START_FLAT_BLOCK)  {
+        endWT = WT_FLAT;
+    } else
+        endWT = WT_SHORT;
+
+    leng0 = windowLeng [beginWT];
+    leng1 = windowLeng [endWT];
+
+    switch(leng0 + leng1) {
+    case 2048: IMDCT_Long(hDecoder, dataPtr); break;
+    case 256: IMDCT_Short(hDecoder, dataPtr);
+    }
+
+    /*  first half of window */
+    /*     windPtr = windowPtr [0] [0];  */
+    windPtr = hDecoder->windowPtr [beginWT] [wnd_shape->prev_bk];
+
+  /* idimkovic: should be optimized with SSE memcpy() */
+    for (i = windowLeng [beginWT]/16 - 1; i>=0; --i)  {
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    }
+
+    /*  second half of window */
+    leng = windowLeng [endWT];
+    windPtr = hDecoder->windowPtr [endWT] [wnd_shape->this_bk] + leng - 1;
+  for (i = leng/16-1; i>=0; --i) {
+    *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+    *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+    *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+    *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+    *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+    *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+    *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+    *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+    }
+
+    wnd_shape->prev_bk = wnd_shape->this_bk;
+}
+
+/*****************************************************************************
+*
+*   MDCT
+*   window input sequence based on window type and perform MDCT
+*   This is adapted from ITransformBlock().
+*   (long term prediction needs this routine)
+*   input: see below
+*   output: see below
+*   local static:
+*     firstTime             flag = need to initialize data structures
+*   globals: -
+*
+*****************************************************************************/
+void TransformBlock(faacDecHandle hDecoder,
+    Float* dataPtr,             /* time domain signal   */
+    BLOCK_TYPE bT,              /* input: window type               */
+    Wnd_Shape *wnd_shape
+    )
+{
+    int leng0, leng1;
+    int i,leng;
+    Float *windPtr;
+    WINDOW_TYPE beginWT, endWT;
+
+    if((bT==LONG_BLOCK) || (bT==START_BLOCK) || (bT==START_FLAT_BLOCK)
+        || (bT==START_ADV_BLOCK))  {
+        beginWT = WT_LONG;
+        }
+    else if(bT==STOP_FLAT_BLOCK) {
+        beginWT = WT_FLAT;
+        }
+    else if(bT==STOP_ADV_BLOCK) {
+        beginWT = WT_ADV;
+        }
+    else
+        beginWT = WT_SHORT;
+
+    if ((bT == LONG_BLOCK) || (bT == STOP_BLOCK) || (bT == STOP_FLAT_BLOCK)
+        || (bT == STOP_ADV_BLOCK)) {
+        endWT = WT_LONG;
+        }
+    else if (bT == START_FLAT_BLOCK)  {
+        endWT = WT_FLAT;
+        }
+    else if (bT == START_ADV_BLOCK)  {
+        endWT = WT_ADV;
+        }
+    else
+        endWT = WT_SHORT;
+
+    leng0 = windowLeng[beginWT];
+    leng1 = windowLeng[endWT];
+
+/*  first half of window */
+/*     windPtr = windowPtr [0] [0];  */
+     windPtr = hDecoder->windowPtr [beginWT] [wnd_shape->prev_bk];
+
+    for (i = windowLeng [beginWT]/16 - 1; i>=0; --i)  {
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    *dataPtr++ *= *windPtr++;  *dataPtr++ *= *windPtr++;
+    }
+
+
+/*  second half of window */
+    leng = windowLeng[endWT];
+    windPtr = hDecoder->windowPtr[endWT][wnd_shape->this_bk] + leng - 1;
+
+    for (i = leng/16-1; i>=0; --i) {
+      *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+      *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+      *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+      *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+      *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+      *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+      *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+      *dataPtr++ *= *windPtr--; *dataPtr++ *= *windPtr--;
+    }
+
+    dataPtr -= (windowLeng [beginWT] + leng);
+
+    switch(leng0 + leng1) {
+    case 2048: MDCT_Long(hDecoder, dataPtr); break;
+    case 256: MDCT_Short(hDecoder, dataPtr);
+    }
+    wnd_shape->prev_bk = wnd_shape->this_bk;
+}
+
diff --git a/block.h b/block.h
new file mode 100644
index 0000000..8858e17
--- /dev/null
+++ b/block.h
@@ -0,0 +1,80 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: block.h,v 1.6 2003/05/23 18:55:19 wmaycisco Exp $
+ */
+
+#ifndef BLOCK_H
+#define BLOCK_H 1
+
+#define IN_DATATYPE  double
+#define OUT_DATATYPE double
+
+#ifndef BLOCK_LEN_LONG
+#define BLOCK_LEN_LONG   1024
+#endif
+#define BLOCK_LEN_SHORT  128
+
+
+#define NWINLONG    (BLOCK_LEN_LONG)
+#define ALFALONG    4.0
+#define NWINSHORT   (BLOCK_LEN_SHORT)
+#define ALFASHORT   7.0
+
+#define NWINFLAT    (NWINLONG)                  /* flat params */
+#define NWINADV     (NWINLONG-NWINSHORT)        /* Advanced flat params */
+#define NFLAT       ((NWINFLAT-NWINSHORT)/2)
+#define NADV0       ((NWINADV-NWINSHORT)/2)
+
+#define START_OFFSET 0
+#define SHORT_IN_START_OFFSET 5
+#define STOP_OFFSET 3
+#define SHORT_IN_STOP_OFFSET 0
+
+#define WEAVE_START 0       /* type parameter for start blocks */
+#define WEAVE_STOP  1       /* type paremeter for stop blocks */
+
+
+
+typedef enum {                  /* ADVanced transform types */
+    LONG_BLOCK,
+    START_BLOCK,
+    SHORT_BLOCK,
+    STOP_BLOCK,
+    START_ADV_BLOCK,
+    STOP_ADV_BLOCK,
+    START_FLAT_BLOCK,
+    STOP_FLAT_BLOCK,
+    N_BLOCK_TYPES
+}
+BLOCK_TYPE;
+
+
+void unfold (Float *data_in, Float *data_out, int inLeng);
+void InitBlock(faacDecHandle hDecoder);
+void EndBlock(faacDecHandle hDecoder);
+void ITransformBlock(faacDecHandle hDecoder,Float* dataPtr, BLOCK_TYPE wT, Wnd_Shape *ws, Float *state);
+void TransformBlock(faacDecHandle hDecoder,Float* dataPtr, BLOCK_TYPE bT, Wnd_Shape *wnd_shape);
+
+#endif  /*  BLOCK_H */
diff --git a/config.c b/config.c
new file mode 100755
index 0000000..a1a29dd
--- /dev/null
+++ b/config.c
@@ -0,0 +1,645 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: config.c,v 1.11 2003/04/09 00:44:38 wmaycisco Exp $
+ */
+
+#include "all.h"
+#include "bits.h"
+#include "util.h"
+
+static int ch_index(MC_Info *mip, int cpe, int tag);
+static int enter_chn(int cpe, int tag, char position, int common_window, MC_Info *mip);
+
+/*
+ * adts_header
+ */
+int get_adts_header(faacDecHandle hDecoder)
+{
+    int sync = 0;
+    ADTS_Header *p = &hDecoder->adts_header;
+
+    faad_byte_align(&hDecoder->ld);
+
+    sync = faad_showbits(&hDecoder->ld, 12);
+    while (sync != 4096 - 1) {
+      faad_flushbits(&hDecoder->ld, 8);
+      if (faad_bits_done(&hDecoder->ld) != 0) {
+	return -1;
+      }
+      sync = faad_showbits(&hDecoder->ld, 12);
+    }
+    faad_flushbits(&hDecoder->ld, 12);
+
+    if (hDecoder->frameNum) {
+        faad_getbits(&hDecoder->ld, 16);
+#if 0
+        if (p->fixed.ID == 0) /* MPEG2 AAC doesn't have this */
+            faad_getbits(&hDecoder->ld, 2);
+#endif
+    } else {
+        /* Syncword found, proceed to read in the fixed ADTS header */
+        p->fixed.ID = faad_get1bit(&hDecoder->ld); /* 0 -> MPEG4, 1 -> MPEG2 */
+        hDecoder->isMpeg4 = !p->fixed.ID;
+        p->fixed.layer = faad_getbits(&hDecoder->ld, 2);
+        p->fixed.protection_absent = faad_get1bit(&hDecoder->ld);
+        hDecoder->mc_info.object_type = p->fixed.object_type = faad_getbits(&hDecoder->ld, 2);
+        hDecoder->mc_info.sampling_rate_idx = p->fixed.sampling_rate_idx = faad_getbits(&hDecoder->ld, 4);
+        p->fixed.private_bit = faad_get1bit(&hDecoder->ld);
+        p->fixed.channel_configuration = faad_getbits(&hDecoder->ld, 3);
+        p->fixed.original_copy = faad_get1bit(&hDecoder->ld);
+        p->fixed.home = faad_get1bit(&hDecoder->ld);
+#if 0
+        if (p->fixed.ID == 0) /* MPEG2 AAC doesn't have this */
+            p->fixed.emphasis = faad_getbits(&hDecoder->ld, 2);
+#endif
+    }
+
+    /* ...and the variable ADTS header */
+    p->variable.copy_id_bit = faad_get1bit(&hDecoder->ld);
+    p->variable.copy_id_start = faad_get1bit(&hDecoder->ld);
+    p->variable.frame_length = faad_getbits(&hDecoder->ld, 13);
+    p->variable.buffer_fullness = faad_getbits(&hDecoder->ld, 11);
+    p->variable.raw_blocks = faad_getbits(&hDecoder->ld, 2);
+
+    /* ADTS error check (ignored) */
+    if(!p->fixed.protection_absent)
+        faad_getbits(&hDecoder->ld, 16);
+
+    return 0;
+}
+
+/*
+ * adif_header
+ */
+int get_adif_header(faacDecHandle hDecoder)
+{
+    int i, n, tag, select_status;
+    ProgConfig tmp_config;
+    ADIF_Header *p = &hDecoder->adif_header;
+
+    /* adif header */
+    for (i=0; i<LEN_ADIF_ID; i++)
+        p->adif_id[i] = (char)faad_getbits(&hDecoder->ld, LEN_BYTE);
+    p->adif_id[i] = 0;      /* null terminated string */
+    /* copyright string */
+    if ((p->copy_id_present = faad_getbits(&hDecoder->ld, LEN_COPYRT_PRES)) == 1) {
+        for (i=0; i<LEN_COPYRT_ID; i++)
+            p->copy_id[i] = (char)faad_getbits(&hDecoder->ld, LEN_BYTE);
+        p->copy_id[i] = 0;  /* null terminated string */
+    }
+    p->original_copy = faad_getbits(&hDecoder->ld, LEN_ORIG);
+    p->home = faad_getbits(&hDecoder->ld, LEN_HOME);
+    p->bitstream_type = faad_getbits(&hDecoder->ld, LEN_BS_TYPE);
+    p->bitrate = faad_getbits(&hDecoder->ld, LEN_BIT_RATE);
+
+    /* program config elements */
+    select_status = -1;
+    n = faad_getbits(&hDecoder->ld, LEN_NUM_PCE) + 1;
+    for (i=0; i<n; i++) {
+        tmp_config.buffer_fullness =
+            (p->bitstream_type == 0) ? faad_getbits(&hDecoder->ld, LEN_ADIF_BF) : 0;
+        tag = get_prog_config(hDecoder, &tmp_config);
+        if (hDecoder->current_program < 0)
+            hDecoder->current_program = tag;        /* default is first prog */
+        if (hDecoder->current_program == tag) {
+            CopyMemory(&hDecoder->prog_config, &tmp_config, sizeof(hDecoder->prog_config));
+            select_status = 1;
+        }
+    }
+
+    return select_status;
+}
+
+
+/*
+ * program configuration element
+ */
+static void get_ele_list(faacDecHandle hDecoder, EleList *p, int enable_cpe)
+{
+    int i, j;
+    for (i=0, j=p->num_ele; i<j; i++) {
+        if (enable_cpe)
+            p->ele_is_cpe[i] = faad_getbits(&hDecoder->ld, LEN_ELE_IS_CPE);
+        else
+            p->ele_is_cpe[i] = 0; /* sdb */
+        p->ele_tag[i] = faad_getbits(&hDecoder->ld, LEN_TAG);
+    }
+}
+
+int get_prog_config(faacDecHandle hDecoder, ProgConfig *p)
+{
+    int i, j, tag;
+
+    tag = faad_getbits(&hDecoder->ld, LEN_TAG);
+
+    p->object_type = faad_getbits(&hDecoder->ld, LEN_OBJECTTYPE);
+    p->sampling_rate_idx = faad_getbits(&hDecoder->ld, LEN_SAMP_IDX);
+    p->front.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_ELE);
+    p->side.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_ELE);
+    p->back.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_ELE);
+    p->lfe.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_LFE);
+    p->data.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_DAT);
+    p->coupling.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_CCE);
+    if ((p->mono_mix.present = faad_getbits(&hDecoder->ld, LEN_MIX_PRES)) == 1)
+        p->mono_mix.ele_tag = faad_getbits(&hDecoder->ld, LEN_TAG);
+    if ((p->stereo_mix.present = faad_getbits(&hDecoder->ld, LEN_MIX_PRES)) == 1)
+        p->stereo_mix.ele_tag = faad_getbits(&hDecoder->ld, LEN_TAG);
+    if ((p->matrix_mix.present = faad_getbits(&hDecoder->ld, LEN_MIX_PRES)) == 1) {
+        p->matrix_mix.ele_tag = faad_getbits(&hDecoder->ld, LEN_MMIX_IDX);
+        p->matrix_mix.pseudo_enab = faad_getbits(&hDecoder->ld, LEN_PSUR_ENAB);
+    }
+    get_ele_list(hDecoder, &p->front, 1);
+    get_ele_list(hDecoder, &p->side, 1);
+    get_ele_list(hDecoder, &p->back, 1);
+    get_ele_list(hDecoder, &p->lfe, 0);
+    get_ele_list(hDecoder, &p->data, 0);
+    get_ele_list(hDecoder, &p->coupling, 1);
+
+    /*
+     * if this is a MPEG4 file and the PCE is inside a raw_data_block()
+     * this should be aligned to beginning of raw_data_block() boundary,
+     * not byte boundary (FIXME!!!)
+     */
+    faad_byte_align(&hDecoder->ld);
+
+    j = faad_getbits(&hDecoder->ld, LEN_COMMENT_BYTES);
+    for (i=0; i<j; i++)
+        p->comments[i] = (char)faad_getbits(&hDecoder->ld, LEN_BYTE);
+    p->comments[i] = 0; /* null terminator for string */
+
+    /* activate new program configuration if appropriate */
+    if (hDecoder->current_program < 0)
+        hDecoder->current_program = tag;        /* always select new program */
+    if (tag == hDecoder->current_program) {
+        /* enter configuration into MC_Info structure */
+        if ((hDecoder->pceChannels = enter_mc_info(hDecoder, &hDecoder->mc_info, p)) < 0)
+            return -1;
+        /* inhibit default configuration */
+        hDecoder->default_config = 0;
+    }
+
+    return tag;
+}
+
+/* enter program configuration into MC_Info structure
+ *  only configures for channels specified in all.h
+ */
+int enter_mc_info(faacDecHandle hDecoder, MC_Info *mip, ProgConfig *pcp)
+{
+    int i, j, cpe, tag, cw;
+    EleList *elp;
+    MIXdown *mxp;
+    int channels = 0;
+
+    /* reset channel counts */
+    mip->nch = 0;
+    mip->nfch = 0;
+    mip->nfsce = 0;
+    mip->nsch = 0;
+    mip->nbch = 0;
+    mip->nlch = 0;
+    mip->ncch = 0;
+
+    /*  object type and sampling rate
+     *  re-configure if new sampling rate
+     */
+    mip->object_type = pcp->object_type;
+    if (mip->sampling_rate_idx != pcp->sampling_rate_idx) {
+        mip->sampling_rate_idx = pcp->sampling_rate_idx;
+        infoinit(hDecoder, &samp_rate_info[mip->sampling_rate_idx]);
+    }
+
+    cw = 0;             /* changed later */
+
+    /* front elements, center out */
+    elp = &pcp->front;
+    /* count number of leading SCE's */
+    for (i=0, j=elp->num_ele; i<j; i++) {
+        if (elp->ele_is_cpe[i])
+            break;
+        mip->nfsce++;
+    }
+    for (i=0, j=elp->num_ele; i<j; i++) {
+        cpe = elp->ele_is_cpe[i];
+        tag = elp->ele_tag[i];
+        if (enter_chn(cpe, tag, 'f', cw, mip) < 0)
+            return(-1);
+        if (cpe) channels+=2;
+        else channels++;
+    }
+
+    /* side elements, left to right then front to back */
+    elp = &pcp->side;
+    for (i=0, j=elp->num_ele; i<j; i++) {
+        cpe = elp->ele_is_cpe[i];
+        tag = elp->ele_tag[i];
+        if (enter_chn(cpe, tag, 's', cw, mip) < 0)
+            return(-1);
+        if (cpe) channels+=2;
+        else channels++;
+    }
+
+    /* back elements, outside to center */
+    elp = &pcp->back;
+    for (i=0, j=elp->num_ele; i<j; i++) {
+        cpe = elp->ele_is_cpe[i];
+        tag = elp->ele_tag[i];
+        if (enter_chn(cpe, tag, 'b', cw, mip) < 0)
+            return(-1);
+        if (cpe) channels+=2;
+        else channels++;
+    }
+
+    /* lfe elements */
+    elp = &pcp->lfe;
+    for (i=0, j=elp->num_ele; i<j; i++) {
+        cpe = elp->ele_is_cpe[i];
+        tag = elp->ele_tag[i];
+        if (enter_chn(cpe, tag, 'l', cw, mip) < 0)
+            return(-1);
+        if (cpe) channels+=2;
+        else channels++;
+    }
+
+    /* coupling channel elements */
+    elp = &pcp->coupling;
+    for (i=0, j=elp->num_ele; i<j; i++)
+        mip->cch_tag[i] = elp->ele_tag[i];
+    mip->ncch = j;
+    channels += j;
+
+    /* mono mixdown elements */
+    mxp = &pcp->mono_mix;
+    if (mxp->present) {
+/*      CommonWarning("Unanticipated mono mixdown channel"); */
+        return(-1);
+    }
+
+    /* stereo mixdown elements */
+    mxp = &pcp->stereo_mix;
+    if (mxp->present) {
+/*      CommonWarning("Unanticipated stereo mixdown channel"); */
+        return(-1);
+    }
+
+    /* matrix mixdown elements */
+    mxp = &pcp->matrix_mix;
+    if (mxp->present) {
+/*      CommonWarning("Unanticipated matrix mixdown channel"); */
+        return(-1);
+    }
+
+    /* save to check future consistency */
+    if (!check_mc_info(hDecoder, mip, 1))
+        return -1;
+
+    return channels;
+}
+
+/* translate prog config or default config
+ * into to multi-channel info structure
+ *  returns index of channel in MC_Info
+ */
+static int enter_chn(int cpe, int tag, char position, int common_window, MC_Info *mip)
+{
+    int nch, cidx=0;
+    Ch_Info *cip;
+
+    nch = (cpe == 1) ? 2 : 1;
+
+    switch (position) {
+    /* use configuration already in MC_Info, but now common_window is valid */
+    case 0:
+    cidx = ch_index(mip, cpe, tag);
+    if (common_window) {
+        mip->ch_info[cidx].widx = cidx; /* window info is left */
+        mip->ch_info[cidx+1].widx = cidx;
+    } else {
+        mip->ch_info[cidx].widx = cidx; /* each has window info */
+        mip->ch_info[cidx+1].widx = cidx+1;
+    }
+    return cidx;
+
+    /* build configuration */
+    case 'f':
+    if (mip->nfch + nch > FChans) {
+/*      CommonWarning("Unanticipated front channel"); */
+        return -1;
+    }
+    if (mip->nfch == 0) {
+        /* consider case of center channel */
+        if (FCenter) {
+        if (cpe) {
+            /* has center speaker but center channel missing */
+            cidx = 0 + 1;
+            mip->nfch = 1 + nch;
+        }
+        else {
+            if (mip->nfsce & 1) {
+            /* has center speaker and this is center channel */
+            /* odd number of leading SCE's */
+            cidx = 0;
+            mip->nfch = nch;
+            }
+            else {
+            /* has center speaker but center channel missing */
+            /* even number of leading SCE's */
+            /* (Note that in implicit congiguration
+             * channel to speaker mapping may be wrong
+             * for first block while count of SCE's prior
+             * to first CPE is being make. However first block
+             * is not written so it doesn't matter.
+             * Second block will be correct.
+             */
+            cidx = 0 + 1;
+            mip->nfch = 1 + nch;
+            }
+        }
+        }
+        else {
+        if (cpe) {
+            /* no center speaker and center channel missing */
+            cidx = 0;
+            mip->nfch = nch;
+        }
+        else {
+            /* no center speaker so this is left channel */
+            cidx = 0;
+            mip->nfch = nch;
+        }
+        }
+    }
+    else {
+        cidx = mip->nfch;
+        mip->nfch += nch;
+    }
+    break;
+    case 's':
+    if (mip->nsch + nch > SChans)  {
+/*      CommonWarning("Unanticipated side channel"); */
+        return -1;
+    }
+    cidx = FChans + mip->nsch;
+    mip->nsch += nch;
+    break;
+    case 'b':
+    if (mip->nbch + nch > BChans) {
+/*      CommonWarning("Unanticipated back channel"); */
+        return -1;
+    }
+    cidx = FChans + SChans + mip->nbch;
+    mip->nbch += nch;
+    break;
+    case 'l':
+    if (mip->nlch + nch > LChans) {
+/*      CommonWarning("Unanticipated LFE channel"); */
+        return -1;
+    }
+    cidx = FChans + SChans + BChans + mip->nlch; /* sdb */
+    mip->nlch += nch;
+    break;
+    default:
+/*      CommonExit(1,"2020: Error in channel configuration"); */
+        return -1;
+    }
+    mip->nch += nch;
+
+    if (cpe == 0) {
+    /* SCE */
+    cip = &mip->ch_info[cidx];
+    cip->present = 1;
+    cip->tag = tag;
+    cip->cpe = 0;
+    cip->common_window = common_window;
+    cip->widx = cidx;
+    mip->nch = cidx + 1;
+    }
+    else {
+        /* CPE */
+    /* left */
+    cip = &mip->ch_info[cidx];
+    cip->present = 1;
+    cip->tag = tag;
+    cip->cpe = 1;
+    cip->common_window = common_window;
+    cip->ch_is_left = 1;
+    cip->paired_ch = cidx+1;
+    /* right */
+    cip = &mip->ch_info[cidx+1];
+    cip->present = 1;
+    cip->tag = tag;
+    cip->cpe = 1;
+    cip->common_window = common_window;
+    cip->ch_is_left = 0;
+    cip->paired_ch = cidx;
+    if (common_window) {
+        mip->ch_info[cidx].widx = cidx; /* window info is left */
+        mip->ch_info[cidx+1].widx = cidx;
+    }
+    else {
+        mip->ch_info[cidx].widx = cidx; /* each has window info */
+        mip->ch_info[cidx+1].widx = cidx+1;
+    }
+    mip->nch = cidx + 2;
+    }
+
+    return cidx;
+}
+
+static char default_position(faacDecHandle hDecoder, MC_Info *mip, int id)
+{
+    if (mip->nch < FChans)
+    {
+        if (id == ID_CPE)   /* first CPE */
+            hDecoder->first_cpe = 1;
+        else if ((hDecoder->frameNum==0) && !hDecoder->first_cpe)
+            /* count number of SCE prior to first CPE in first block */
+            mip->nfsce++;
+
+        return('f'); /* front */
+    }
+    else if  (mip->nch < FChans+SChans)
+        return('s'); /* side */
+    else if  (mip->nch < FChans+SChans+BChans)
+        return('b'); /* back */
+
+    return 0;
+}
+
+/* retrieve appropriate channel index for the program
+ * and decoder configuration
+ */
+int chn_config(faacDecHandle hDecoder, int id, int tag, int common_window, MC_Info *mip)
+{
+    int cpe, cidx=0;
+    char position;
+
+    /* channel index to position mapping for 5.1 configuration is
+     *  0   center
+     *  1   left  front
+     *  2   right front
+     *  3   left surround
+     *  4   right surround
+     *  5   lfe
+     */
+
+    cpe = (id == ID_CPE) ? 1 : 0;
+
+    if (hDecoder->default_config)
+    {
+        switch (id)
+        {
+            case ID_SCE:
+            case ID_CPE:
+                if ((position = default_position(hDecoder, mip, id)) == 0)
+                {
+/*                  CommonExit(1,"2021: Unanticipated channel"); */
+                    return (-1);
+                }
+                cidx = enter_chn(cpe, tag, position, common_window, mip);
+            break;
+        }
+    }
+    else
+        cidx = enter_chn(cpe, tag, 0, common_window, mip);
+
+
+    return cidx;        /* index of chn in mc_info */
+}
+
+/*
+ * check continuity of configuration from one
+ * block to next
+ */
+void reset_mc_info(faacDecHandle hDecoder, MC_Info *mip)
+{
+    int i;
+    Ch_Info *p;
+
+    /* only reset for implicit configuration */
+    if (hDecoder->default_config)
+    {
+        /* reset channel counts */
+        mip->nch = 0;
+        mip->nfch = 0;
+        mip->nsch = 0;
+        mip->nbch = 0;
+        mip->nlch = 0;
+        mip->ncch = 0;
+
+        if (hDecoder->frameNum == 0)
+            /* reset prior to first block scan only! */
+            mip->nfsce = 0;
+
+        for (i=0; i<Chans; i++)
+        {
+            p = &mip->ch_info[i];
+            p->present = 0;
+            p->cpe = 0;
+            p->ch_is_left = 0;
+            p->paired_ch = 0;
+            p->is_present = 0;
+            p->widx = 0;
+            p->ncch = 0;
+        }
+    }
+}
+
+
+int check_mc_info(faacDecHandle hDecoder, MC_Info *mip, int new_config)
+{
+    int i, nch, err;
+    Ch_Info *s, *p;
+
+    nch = mip->nch;
+    if (new_config) {
+        /* enter valid configuration */
+        for (i=0; i<nch; i++) {
+            s = &hDecoder->save_mc_info.ch_info[i];
+            p = &mip->ch_info[i];
+            s->present = p->present;
+            s->cpe = p->cpe;
+            s->ch_is_left = p->ch_is_left;
+            s->paired_ch = p->paired_ch;
+        }
+    } else {
+        /* check this block's configuration */
+        err = 0;
+        for (i=0; i<nch; i++) {
+            s = &hDecoder->save_mc_info.ch_info[i];
+            p = &mip->ch_info[i];
+            if (s->present != p->present) err=1;
+            if (!s->present) continue; /* sdb */
+            if (s->cpe != p->cpe) err=1;
+            if (s->ch_is_left != p->ch_is_left) err=1;
+            if (s->paired_ch != p->paired_ch) err=1;
+        }
+        if (err) {
+            /* CommonExit(1,"Channel configuration inconsistency"); */
+            return 0;
+        }
+    }
+
+    return 1;
+}
+
+
+/* given cpe and tag,
+ *  returns channel index of SCE or left chn in CPE
+ */
+static int ch_index(MC_Info *mip, int cpe, int tag)
+{
+    int ch;
+
+    for (ch=0; ch<mip->nch; ch++) {
+
+    if (!(mip->ch_info[ch].present))
+        continue;
+
+    if ( (mip->ch_info[ch].cpe == cpe) &&
+        (mip->ch_info[ch].tag == tag) )
+        return ch;
+    }
+
+    /* no match, so channel is not in this program
+     *  dummy up the ch_info structure so rest of chn will parse
+     */
+    if (XChans > 0) {
+    ch = Chans - XChans;    /* left scratch channel */
+    mip->ch_info[ch].cpe = cpe;
+    mip->ch_info[ch].ch_is_left = 1;
+    mip->ch_info[ch].widx = ch;
+    if (cpe) {
+        mip->ch_info[ch].paired_ch = ch+1;
+        mip->ch_info[ch+1].ch_is_left = 0;
+        mip->ch_info[ch+1].paired_ch = ch;
+    }
+    }
+    else {
+    ch = -1;        /* error, no scratch space */
+    }
+
+    return ch;
+}
diff --git a/decdata.c b/decdata.c
new file mode 100644
index 0000000..79f360d
--- /dev/null
+++ b/decdata.c
@@ -0,0 +1,234 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS and edited by
+Yoshiaki Oikawa (Sony Corporation)
+,Mitsuyuki Hatanaka (Sony Corporation),
+in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+
+#include "all.h"
+
+Hcb book[NSPECBOOKS+2];
+int sfbwidth128[(1<<LEN_MAX_SFBS)];
+
+const int SampleRates[] = {
+    96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000,7350,0,0,0
+};
+
+/* Returns the sample rate index */
+int get_sr_index(unsigned int sampleRate)
+{
+    if (92017 <= sampleRate) return 0;
+    if (75132 <= sampleRate) return 1;
+    if (55426 <= sampleRate) return 2;
+    if (46009 <= sampleRate) return 3;
+    if (37566 <= sampleRate) return 4;
+    if (27713 <= sampleRate) return 5;
+    if (23004 <= sampleRate) return 6;
+    if (18783 <= sampleRate) return 7;
+    if (13856 <= sampleRate) return 8;
+    if (11502 <= sampleRate) return 9;
+    if (9391 <= sampleRate) return 10;
+
+    return 11;
+}
+static int sfb_96_1024[] =
+{
+  4, 8, 12, 16, 20, 24, 28,
+  32, 36, 40, 44, 48, 52, 56,
+  64, 72, 80, 88, 96, 108, 120,
+  132, 144, 156, 172, 188, 212, 240,
+  276, 320, 384, 448, 512, 576, 640,
+  704, 768, 832, 896, 960, 1024
+};   /* 41 scfbands */
+
+static int sfb_96_128[] =
+{
+  4, 8, 12, 16, 20, 24, 32,
+  40, 48, 64, 92, 128
+};   /* 12 scfbands */
+
+static int sfb_64_1024[] =
+{
+  4, 8, 12, 16, 20, 24, 28,
+  32, 36, 40, 44, 48, 52, 56,
+  64, 72, 80, 88, 100, 112, 124,
+  140, 156, 172, 192, 216, 240, 268,
+  304, 344, 384, 424, 464, 504, 544,
+  584, 624, 664, 704, 744, 784, 824,
+  864, 904, 944, 984, 1024
+};   /* 41 scfbands 47 */
+
+static int sfb_64_128[] =
+{
+  4, 8, 12, 16, 20, 24, 32,
+  40, 48, 64, 92, 128
+};   /* 12 scfbands */
+
+
+static int sfb_48_1024[] =
+{
+  4, 8, 12, 16, 20, 24, 28,
+  32,   36, 40, 48, 56, 64, 72,
+  80,   88, 96, 108,    120,    132,    144,
+  160,  176,    196,    216,    240,    264,    292,
+  320,  352,    384,    416,    448,    480,    512,
+  544,  576,    608,    640,    672,    704,    736,
+  768,  800,    832,    864,    896,    928,    1024
+};
+
+static int sfb_48_128[] =
+{
+          4,    8,  12, 16, 20, 28, 36,
+          44,   56, 68, 80, 96, 112,    128
+};
+
+static int sfb_32_1024[] =
+{
+        4,  8,  12, 16, 20, 24, 28,
+        32, 36, 40, 48, 56, 64, 72,
+        80, 88, 96, 108,    120,    132,    144,
+        160,    176,    196,    216,    240,    264,    292,
+        320,    352,    384,    416,    448,    480,    512,
+        544,    576,    608,    640,    672,    704,    736,
+        768,    800,    832,    864,    896,    928,    960,
+        992,    1024
+};
+
+static int sfb_24_1024[] =
+{
+  4, 8, 12, 16, 20, 24, 28,
+  32, 36, 40, 44, 52, 60, 68,
+  76, 84, 92, 100, 108, 116, 124,
+  136, 148, 160, 172, 188, 204, 220,
+  240, 260, 284, 308, 336, 364, 396,
+  432, 468, 508, 552, 600, 652, 704,
+  768, 832, 896, 960, 1024
+};   /* 47 scfbands */
+
+static int sfb_24_128[] =
+{
+  4, 8, 12, 16, 20, 24, 28,
+  36, 44, 52, 64, 76, 92, 108,
+  128
+};   /* 15 scfbands */
+
+static int sfb_16_1024[] =
+{
+  8, 16, 24, 32, 40, 48, 56,
+  64, 72, 80, 88, 100, 112, 124,
+  136, 148, 160, 172, 184, 196, 212,
+  228, 244, 260, 280, 300, 320, 344,
+  368, 396, 424, 456, 492, 532, 572,
+  616, 664, 716, 772, 832, 896, 960,
+  1024
+};   /* 43 scfbands */
+
+static int sfb_16_128[] =
+{
+  4, 8, 12, 16, 20, 24, 28,
+  32, 40, 48, 60, 72, 88, 108,
+  128
+};   /* 15 scfbands */
+
+static int sfb_8_1024[] =
+{
+  12, 24, 36, 48, 60, 72, 84,
+  96, 108, 120, 132, 144, 156, 172,
+  188, 204, 220, 236, 252, 268, 288,
+  308, 328, 348, 372, 396, 420, 448,
+  476, 508, 544, 580, 620, 664, 712,
+  764, 820, 880, 944, 1024
+};   /* 40 scfbands */
+
+static int sfb_8_128[] =
+{
+  4, 8, 12, 16, 20, 24, 28,
+  36, 44, 52, 60, 72, 88, 108,
+  128
+};   /* 15 scfbands */
+
+SR_Info samp_rate_info[(1<<LEN_SAMP_IDX)] =
+{
+    /* sampling_frequency, #long sfb, long sfb, #short sfb, short sfb */
+    /* samp_rate, nsfb1024, SFbands1024, nsfb128, SFbands128 */
+    {96000, 41, sfb_96_1024, 12, sfb_96_128},       /* 96000 */
+    {88200, 41, sfb_96_1024, 12, sfb_96_128},       /* 88200 */
+    {64000, 47, sfb_64_1024, 12, sfb_64_128},       /* 64000 */
+    {48000, 49, sfb_48_1024, 14, sfb_48_128},       /* 48000 */
+    {44100, 49, sfb_48_1024, 14, sfb_48_128},       /* 44100 */
+    {32000, 51, sfb_32_1024, 14, sfb_48_128},       /* 32000 */
+    {24000, 47, sfb_24_1024, 15, sfb_24_128},       /* 24000 */
+    {22050, 47, sfb_24_1024, 15, sfb_24_128},       /* 22050 */
+    {16000, 43, sfb_16_1024, 15, sfb_16_128},       /* 16000 */
+    {12000, 43, sfb_16_1024, 15, sfb_16_128},       /* 12000 */
+    {11025, 43, sfb_16_1024, 15, sfb_16_128},       /* 11025 */
+    {8000,  40, sfb_8_1024,  15, sfb_8_128 },       /* 8000  */
+    {0,0,0,0,0},
+    {0,0,0,0,0},
+    {0,0,0,0,0},
+    {0,0,0,0,0}
+};
+
+int tns_max_bands_tbl[(1<<LEN_SAMP_IDX)][4] =
+{
+    /* entry for each sampling rate
+     * 1    Main/LC long window
+     * 2    Main/LC short window
+     * 3    SSR long window
+     * 4    SSR short window
+     */
+    {31,  9, 28,  7},       /* 96000 */
+    {31,  9, 28,  7},       /* 88200 */
+    {34, 10, 27,  7},       /* 64000 */
+    {40, 14, 26,  6},       /* 48000 */
+    {42, 14, 26,  6},       /* 44100 */
+    {51, 14, 26,  6},       /* 32000 */
+    {46, 14, 29,  7},       /* 24000 */
+    {46, 14, 29,  7},       /* 22050 */
+    {42, 14, 23,  8},       /* 16000 */
+    {42, 14, 23,  8},       /* 12000 */
+    {42, 14, 23,  8},       /* 11025 */
+    {39, 14, 19,  7},       /* 8000  */
+    {0,0,0,0},
+    {0,0,0,0},
+    {0,0,0,0},
+    {0,0,0,0}
+};
+
+int pred_max_bands_tbl[(1<<LEN_SAMP_IDX)] = {
+  33,     /* 96000 */
+  33,     /* 88200 */
+  38,     /* 64000 */
+  40,     /* 48000 */
+  40,     /* 44100 */
+  40,     /* 32000 */
+  41,     /* 24000 */
+  41,     /* 22050 */
+  37,     /* 16000 */
+  37,     /* 12000 */
+  37,     /* 11025 */
+  34,     /* 8000  */
+  0,
+  0,
+  0,
+  0
+};
diff --git a/decoder.c b/decoder.c
new file mode 100644
index 0000000..689ba66
--- /dev/null
+++ b/decoder.c
@@ -0,0 +1,608 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS
+and edited by
+Yoshiaki Oikawa (Sony Corporation),
+Mitsuyuki Hatanaka (Sony Corporation)
+in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+
+#include "all.h"
+#include "block.h"
+#include "nok_lt_prediction.h"
+#include "transfo.h"
+#include "bits.h"
+#include "util.h"
+
+
+/* D E F I N E S */
+#define ftol(A,B) {tmp = *(int*) & A - 0x4B7F8000; B = (short)( (tmp==(short)tmp) ? tmp : (tmp>>31)^0x7FFF);}
+#define BYTE_NUMBIT 8       /* bits in byte (char) */
+#define bit2byte(a) ((a)/BYTE_NUMBIT) /* (((a)+BYTE_NUMBIT-1)/BYTE_NUMBIT) */
+
+static unsigned long ObjectTypesTable[32] = {0, 1, 1, 1, 1, };
+
+
+int parse_audio_decoder_specific_info(faacDecHandle hDecoder,unsigned long *samplerate,unsigned long *channels)
+{
+    unsigned long ObjectTypeIndex, SamplingFrequencyIndex, ChannelsConfiguration;
+
+    faad_byte_align(&hDecoder->ld);
+    ObjectTypeIndex = faad_getbits(&hDecoder->ld, 5);
+    SamplingFrequencyIndex = faad_getbits(&hDecoder->ld, 4);
+    ChannelsConfiguration = faad_getbits(&hDecoder->ld, 4);
+
+    if(ObjectTypesTable[ObjectTypeIndex] != 1){
+        return -1;
+    }
+
+    *samplerate = SampleRates[SamplingFrequencyIndex];
+    if(*samplerate == 0){
+        return -2;
+    }
+
+    hDecoder->numChannels = *channels = ChannelsConfiguration;
+
+    hDecoder->mc_info.object_type = ObjectTypeIndex - 1;
+    hDecoder->mc_info.sampling_rate_idx = SamplingFrequencyIndex;
+
+    if((ChannelsConfiguration != 1) && (ChannelsConfiguration != 2)){
+
+        return -3;
+
+    }
+
+    return 0;
+
+}
+
+int FAADAPI faacDecInit2(faacDecHandle hDecoder,
+                         unsigned char* pBuffer,unsigned long SizeOfDecoderSpecificInfo,
+                         unsigned long *samplerate, unsigned long *channels)
+{
+    int rc;
+
+    hDecoder->adif_header_present = 0;
+    hDecoder->adts_header_present = 0;
+
+    if((hDecoder == NULL)
+        || (pBuffer == NULL)
+        || (SizeOfDecoderSpecificInfo < 2)
+        || (samplerate == NULL)
+        || (channels == NULL)){
+        return -1;
+    }
+
+    /* get adif header */
+
+    faad_initbits(&hDecoder->ld, pBuffer, 0);
+
+    rc = parse_audio_decoder_specific_info(hDecoder,samplerate,channels);
+
+    if(rc != 0){
+        return rc;
+    }
+
+    huffbookinit(hDecoder);
+    nok_init_lt_pred(hDecoder->nok_lt_status, Chans);
+    init_pred(hDecoder, hDecoder->sp_status, Chans);
+    MakeFFTOrder(hDecoder);
+    InitBlock(hDecoder);  /* calculate windows */
+
+    hDecoder->winmap[0] = hDecoder->win_seq_info[ONLY_LONG_WINDOW];
+    hDecoder->winmap[1] = hDecoder->win_seq_info[ONLY_LONG_WINDOW];
+    hDecoder->winmap[2] = hDecoder->win_seq_info[EIGHT_SHORT_WINDOW];
+    hDecoder->winmap[3] = hDecoder->win_seq_info[ONLY_LONG_WINDOW];
+
+    return 0;
+}
+
+
+faacDecHandle FAADAPI faacDecOpen(void)
+{
+    int i;
+    faacDecHandle hDecoder = NULL;
+
+    hDecoder = (faacDecHandle)AllocMemory(sizeof(faacDecStruct));
+#ifndef _WIN32
+    SetMemory(hDecoder, 0, sizeof(faacDecStruct));
+#endif
+
+    hDecoder->frameNum = 0;
+    hDecoder->isMpeg4 = 1;
+
+    /* set defaults */
+    hDecoder->current_program = -1;
+    hDecoder->default_config = 1;
+    hDecoder->dolbyShortOffset_f2t = 1;
+    hDecoder->dolbyShortOffset_t2f = 1;
+    hDecoder->first_cpe = 0;
+    hDecoder->warn_flag = 1;
+
+    hDecoder->config.defObjectType = AACMAIN;
+    hDecoder->config.defSampleRate = 44100;
+
+    for(i=0; i < Chans; i++)
+    {
+        hDecoder->coef[i] = (Float*)AllocMemory(LN2*sizeof(Float));
+        hDecoder->data[i] = (Float*)AllocMemory(LN2*sizeof(Float));
+        hDecoder->state[i] = (Float*)AllocMemory(LN*sizeof(Float));
+        hDecoder->factors[i] = (int*)AllocMemory(MAXBANDS*sizeof(int));
+        hDecoder->cb_map[i] = (byte*)AllocMemory(MAXBANDS*sizeof(byte));
+        hDecoder->group[i] = (byte*)AllocMemory(NSHORT*sizeof(byte));
+        hDecoder->lpflag[i] = (int*)AllocMemory(MAXBANDS*sizeof(int));
+        hDecoder->prstflag[i] = (int*)AllocMemory((LEN_PRED_RSTGRP+1)*sizeof(int));
+        hDecoder->tns[i] = (TNS_frame_info*)AllocMemory(sizeof(TNS_frame_info));
+        hDecoder->nok_lt_status[i]  = (NOK_LT_PRED_STATUS*)AllocMemory(sizeof(NOK_LT_PRED_STATUS));
+        hDecoder->sp_status[i]  = (PRED_STATUS*)AllocMemory(LN*sizeof(PRED_STATUS));
+
+        hDecoder->last_rstgrp_num[i] = 0;
+        hDecoder->wnd_shape[i].prev_bk = 0;
+
+#ifndef _WIN32 /* WIN32 API sets memory to 0 in allocation */
+        SetMemory(hDecoder->coef[i],0,LN2*sizeof(Float));
+        SetMemory(hDecoder->data[i],0,LN2*sizeof(Float));
+        SetMemory(hDecoder->state[i],0,LN*sizeof(Float));
+        SetMemory(hDecoder->factors[i],0,MAXBANDS*sizeof(int));
+        SetMemory(hDecoder->cb_map[i],0,MAXBANDS*sizeof(byte));
+        SetMemory(hDecoder->group[i],0,NSHORT*sizeof(byte));
+        SetMemory(hDecoder->lpflag[i],0,MAXBANDS*sizeof(int));
+        SetMemory(hDecoder->prstflag[i],0,(LEN_PRED_RSTGRP+1)*sizeof(int));
+        SetMemory(hDecoder->tns[i],0,sizeof(TNS_frame_info));
+        SetMemory(hDecoder->nok_lt_status[i],0,sizeof(NOK_LT_PRED_STATUS));
+        SetMemory(hDecoder->sp_status[i],0,LN*sizeof(PRED_STATUS));
+#endif
+    }
+
+    hDecoder->mnt_table = AllocMemory(128*sizeof(float));
+    hDecoder->exp_table = AllocMemory(256*sizeof(float));
+    hDecoder->iq_exp_tbl = AllocMemory(MAX_IQ_TBL*sizeof(Float));
+    hDecoder->exptable = AllocMemory(TEXP*sizeof(Float));
+    hDecoder->unscambled64 = AllocMemory(64*sizeof(int));
+    hDecoder->unscambled512 = AllocMemory(512*sizeof(int));
+
+    SetMemory(hDecoder->lp_store, 0, MAXBANDS*sizeof(int));
+    SetMemory(hDecoder->noise_state_save, 0, MAXBANDS*sizeof(long));
+
+    for(i=0; i<Winds; i++)
+    {
+        hDecoder->mask[i] = (byte*)AllocMemory(MAXBANDS*sizeof(byte));
+        SetMemory(hDecoder->mask[i],0,MAXBANDS*sizeof(byte));
+    }
+
+    for (i = 0; i < NUM_WIN_SEQ; i++)
+        hDecoder->win_seq_info[i] = NULL;
+
+    return hDecoder;
+}
+
+faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder)
+{
+    faacDecConfigurationPtr config = &(hDecoder->config);
+
+    return config;
+}
+
+int FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,
+                                    faacDecConfigurationPtr config)
+{
+    hDecoder->config.defObjectType = config->defObjectType;
+    hDecoder->config.defSampleRate = config->defSampleRate;
+
+    /* OK */
+    return 1;
+}
+
+int FAADAPI faacDecInit(faacDecHandle hDecoder,
+			unsigned char *buffer,
+                        unsigned long *samplerate,
+			unsigned long *channels)
+{
+    int i, bits = 0;
+    char chk_header[4];
+
+    faad_initbits(&hDecoder->ld, buffer, 4);
+#if 0
+    faad_bookmark(&hDecoder->ld, 1);
+#endif
+    for (i = 0; i < 4; i++) {
+      chk_header[i] = buffer[i];
+    }
+
+    /* Check if an ADIF header is present */
+    if (stringcmp(chk_header, "ADIF", 4) == 0)
+        hDecoder->adif_header_present = 1;
+    else
+        hDecoder->adif_header_present = 0;
+
+    /* Check if an ADTS header is present */
+    if (hDecoder->adif_header_present == 0)
+    {
+        if (((int) ( chk_header[0] == (char) 0xFF)) &&
+            ((int) ( (chk_header[1] & (char) 0xF0) == (char) 0xF0)))
+        {
+            hDecoder->adts_header_present = 1;
+        } else {
+            hDecoder->adts_header_present = 0;
+        }
+    }
+
+    /* get adif header */
+    if (hDecoder->adif_header_present) {
+        hDecoder->pceChannels = 2;
+#if 0
+        faad_bookmark(&hDecoder->ld, 0);
+        faad_bookmark(&hDecoder->ld, 1);
+#else
+	faad_initbits(&hDecoder->ld, buffer, 4);
+#endif
+        get_adif_header(hDecoder);
+        /* only MPEG2 ADIF header uses byte_alignment */
+        /* but the PCE already byte aligns the data */
+        /*
+        if (!hDecoder->isMpeg4)
+            byte_align(&hDecoder->ld);
+        */
+        bits = faad_get_processed_bits(&hDecoder->ld);
+    } else if (hDecoder->adts_header_present) {
+#if 0
+        faad_bookmark(&hDecoder->ld, 0);
+        faad_bookmark(&hDecoder->ld, 1);
+#else
+	faad_initbits(&hDecoder->ld, buffer, 4);
+#endif
+        get_adts_header(hDecoder);
+        /* only MPEG2 ADTS header uses byte_alignment */
+        /* but it already is a multiple of 8 bits */
+        /*
+        if (!hDecoder->isMpeg4)
+            byte_align(&hDecoder->ld);
+        */
+        bits = 0;
+    } else {
+        hDecoder->mc_info.object_type = hDecoder->config.defObjectType;
+        hDecoder->mc_info.sampling_rate_idx = get_sr_index(hDecoder->config.defSampleRate);
+    }
+
+    *samplerate = hDecoder->config.defSampleRate;
+    hDecoder->numChannels = *channels = 2;
+    hDecoder->chans_inited = 0;
+    if (hDecoder->adif_header_present) {
+      hDecoder->chans_inited = 1;
+        *samplerate = SampleRates[hDecoder->prog_config.sampling_rate_idx];
+        hDecoder->numChannels = *channels = hDecoder->pceChannels;
+    } else if (hDecoder->adts_header_present) {
+      hDecoder->chans_inited = 1;
+        *samplerate = SampleRates[hDecoder->adts_header.fixed.sampling_rate_idx];
+        hDecoder->numChannels = *channels = hDecoder->adts_header.fixed.channel_configuration; /* This works up to 6 channels */
+    }
+
+    huffbookinit(hDecoder);
+    nok_init_lt_pred(hDecoder->nok_lt_status, Chans);
+    init_pred(hDecoder, hDecoder->sp_status, Chans);
+    MakeFFTOrder(hDecoder);
+    InitBlock(hDecoder);  /* calculate windows */
+
+    hDecoder->winmap[0] = hDecoder->win_seq_info[ONLY_LONG_WINDOW];
+    hDecoder->winmap[1] = hDecoder->win_seq_info[ONLY_LONG_WINDOW];
+    hDecoder->winmap[2] = hDecoder->win_seq_info[EIGHT_SHORT_WINDOW];
+    hDecoder->winmap[3] = hDecoder->win_seq_info[ONLY_LONG_WINDOW];
+
+#if 0
+    faad_bookmark(&hDecoder->ld, 0);
+#endif
+
+    return bit2byte(bits);
+}
+
+void FAADAPI faacDecClose(faacDecHandle hDecoder)
+{
+    int i;
+
+    EndBlock(hDecoder);
+    nok_end_lt_pred(hDecoder->nok_lt_status, Chans);
+
+    for(i=0; i < Chans; i++)
+    {
+        if (hDecoder->coef[i]) FreeMemory(hDecoder->coef[i]);
+        if (hDecoder->data[i]) FreeMemory(hDecoder->data[i]);
+        if (hDecoder->state[i]) FreeMemory(hDecoder->state[i]);
+        if (hDecoder->factors[i]) FreeMemory(hDecoder->factors[i]);
+        if (hDecoder->cb_map[i]) FreeMemory(hDecoder->cb_map[i]);
+        if (hDecoder->group[i]) FreeMemory(hDecoder->group[i]);
+        if (hDecoder->lpflag[i]) FreeMemory(hDecoder->lpflag[i]);
+        if (hDecoder->prstflag[i]) FreeMemory(hDecoder->prstflag[i]);
+        if (hDecoder->tns[i]) FreeMemory(hDecoder->tns[i]);
+        if (hDecoder->nok_lt_status[i]) FreeMemory(hDecoder->nok_lt_status[i]);
+        if (hDecoder->sp_status[i]) FreeMemory(hDecoder->sp_status[i]);
+    }
+
+    if (hDecoder->mnt_table) FreeMemory(hDecoder->mnt_table);
+    if (hDecoder->exp_table) FreeMemory(hDecoder->exp_table);
+    if (hDecoder->iq_exp_tbl) FreeMemory(hDecoder->iq_exp_tbl);
+    if (hDecoder->exptable) FreeMemory(hDecoder->exptable);
+    if (hDecoder->unscambled64) FreeMemory(hDecoder->unscambled64);
+    if (hDecoder->unscambled512) FreeMemory(hDecoder->unscambled512);
+
+    for(i=0; i<Winds; i++)
+    {
+        if (hDecoder->mask[i]) FreeMemory(hDecoder->mask[i]);
+    }
+
+    if (hDecoder) FreeMemory(hDecoder);
+}
+
+int FAADAPI faacDecGetProgConfig(faacDecHandle hDecoder,
+                                 faacProgConfig *progConfig)
+{
+    return hDecoder->numChannels;
+}
+
+int FAADAPI faacDecDecode(faacDecHandle hDecoder,
+                          unsigned char *buffer,
+                          unsigned long *bytesconsumed,
+                          short *sample_buffer,
+                          unsigned long *samples)
+{
+    unsigned char d_bytes[MAX_DBYTES];
+    int i, j, ch, wn, ele_id;
+    int left, right, tmp;
+    int d_tag, d_cnt;
+    int channels = 0;
+    Info *info;
+    MC_Info *mip = &(hDecoder->mc_info);
+    Ch_Info *cip;
+    int retCode = FAAD_OK;
+
+    faad_initbits(&hDecoder->ld, buffer, *bytesconsumed);
+
+    if (hDecoder->adts_header_present)
+    {
+        if (get_adts_header(hDecoder))
+        {
+            goto error;
+        }
+        /* MPEG2 does byte_alignment() here
+        * but ADTS header is always multiple of 8 bits in MPEG2
+        * so not needed
+        */
+    }
+
+    reset_mc_info(hDecoder, mip);
+    while ((ele_id=faad_getbits(&hDecoder->ld, LEN_SE_ID)) != ID_END)
+    {
+        /* get audio syntactic element */
+        switch (ele_id) {
+        case ID_SCE:        /* single channel */
+        case ID_CPE:        /* channel pair */
+        case ID_LFE:        /* low freq effects channel */
+            if (huffdecode(hDecoder, ele_id, mip, hDecoder->wnd, hDecoder->wnd_shape,
+                hDecoder->cb_map, hDecoder->factors, hDecoder->group, hDecoder->hasmask,
+                hDecoder->mask, hDecoder->max_sfb,
+                hDecoder->lpflag, hDecoder->prstflag, hDecoder->nok_lt_status,
+                hDecoder->tns, hDecoder->coef) < 0)
+                goto error;
+                /* CommonExit(1,"2022: Error in huffman decoder"); */
+            if (ele_id == ID_CPE)
+                channels += 2;
+            else
+                channels++;
+            break;
+        case ID_DSE:        /* data element */
+            if (getdata(hDecoder, &d_tag, &d_cnt, d_bytes) < 0)
+                goto error;
+            break;
+        case ID_PCE:        /* program config element */
+            get_prog_config(hDecoder, &hDecoder->prog_config);
+            break;
+        case ID_FIL:        /* fill element */
+            getfill(hDecoder, d_bytes);
+            break;
+        default:
+            /* CommonWarning("Element not supported"); */
+            goto error;
+        }
+    }
+
+    if ((channels != hDecoder->numChannels) &&
+	(hDecoder->chans_inited == 0)) {
+        hDecoder->numChannels = channels;
+        retCode = FAAD_OK_CHUPDATE;
+        *bytesconsumed = 0;
+
+#if 0
+	// wmay = fall through...
+        /* no errors, but channel update */
+        return retCode;
+#endif
+    }
+
+    if (!check_mc_info(hDecoder, mip, (hDecoder->frameNum==0 && hDecoder->default_config))) {
+        goto error;
+    }
+
+    /* m/s stereo */
+    for (ch=0; ch<Chans; ch++) {
+        cip = &mip->ch_info[ch];
+        if ((cip->present) && (cip->cpe) && (cip->ch_is_left)) {
+            wn = cip->widx;
+            if(hDecoder->hasmask[wn]) {
+                left = ch;
+                right = cip->paired_ch;
+                info = hDecoder->winmap[hDecoder->wnd[wn]];
+                if (hDecoder->hasmask[wn] == 1)
+                    map_mask(info, hDecoder->group[wn], hDecoder->mask[wn],
+                    hDecoder->cb_map[right]);
+                synt(info, hDecoder->group[wn], hDecoder->mask[wn],
+                    hDecoder->coef[right], hDecoder->coef[left]);
+            }
+        }
+    }
+
+    /* intensity stereo and prediction */
+    for (ch=0; ch<Chans; ch++) {
+        if (!(mip->ch_info[ch].present))
+            continue;
+
+        wn = mip->ch_info[ch].widx;
+        info = hDecoder->winmap[hDecoder->wnd[wn]];
+
+        pns(hDecoder, mip, info, wn, ch,
+            hDecoder->group[wn], hDecoder->cb_map[ch], hDecoder->factors[ch],
+            hDecoder->lpflag[wn], hDecoder->coef);
+
+        intensity(mip, info, wn, ch,
+            hDecoder->group[wn], hDecoder->cb_map[ch], hDecoder->factors[ch],
+            hDecoder->lpflag[wn], hDecoder->coef);
+
+        if (mip->object_type == AACLTP) {
+            nok_lt_predict(hDecoder, info, hDecoder->wnd[wn], &hDecoder->wnd_shape[wn],
+                hDecoder->nok_lt_status[ch]->sbk_prediction_used,
+                hDecoder->nok_lt_status[ch]->sfb_prediction_used,
+                hDecoder->nok_lt_status[ch], hDecoder->nok_lt_status[ch]->weight,
+                hDecoder->nok_lt_status[ch]->delay, hDecoder->coef[ch],
+                BLOCK_LEN_LONG, 0, BLOCK_LEN_SHORT, hDecoder->tns[ch]);
+        } else if (mip->object_type == AACMAIN) {
+            predict(hDecoder, info, mip->object_type, hDecoder->lpflag[wn],
+                hDecoder->sp_status[ch], hDecoder->coef[ch]);
+        }
+    }
+
+    for (ch = 0; ch < Chans; ch++) {
+        if (!(mip->ch_info[ch].present))
+            continue;
+
+        wn = mip->ch_info[ch].widx;
+        info = hDecoder->winmap[hDecoder->wnd[wn]];
+
+        /* predictor reset */
+        if (mip->object_type == AACMAIN) {
+            left = ch;
+            right = left;
+            if ((mip->ch_info[ch].cpe) && (mip->ch_info[ch].common_window))
+                /* prstflag's shared by channel pair */
+                right = mip->ch_info[ch].paired_ch;
+            predict_reset(hDecoder, info, hDecoder->prstflag[wn], hDecoder->sp_status,
+                left, right, hDecoder->last_rstgrp_num);
+
+            /* PNS predictor reset */
+            predict_pns_reset(info, hDecoder->sp_status[ch], hDecoder->cb_map[ch]);
+        }
+
+        /* tns */
+        for (i=j=0; i < hDecoder->tns[ch]->n_subblocks; i++) {
+
+            tns_decode_subblock(hDecoder, &hDecoder->coef[ch][j],
+                hDecoder->max_sfb[wn],
+                info->sbk_sfb_top[i],
+                info->islong,
+                &(hDecoder->tns[ch]->info[i]) );
+
+            j += info->bins_per_sbk[i];
+        }
+
+        /* inverse transform */
+        freq2time_adapt(hDecoder, hDecoder->wnd[wn], &hDecoder->wnd_shape[wn],
+            hDecoder->coef[ch], hDecoder->state[ch], hDecoder->data[ch]);
+
+        if (mip->object_type == AACLTP) {
+            nok_lt_update(hDecoder->nok_lt_status[ch], hDecoder->data[ch],
+                hDecoder->state[ch], BLOCK_LEN_LONG);
+        }
+    }
+
+    /* Copy output to a standard PCM buffer */
+    for(i=0; i < 1024; i++) /* prkoat */
+    {
+
+        for (ch=0; ch < mip->nch; ch++)
+        {
+/* much faster FTOL */
+#ifndef ENDIAN_SAFE
+            float ftemp;
+            /* ftemp = truncate(data[ch][i]) + 0xff8000; */
+            ftemp = hDecoder->data[ch][i] + 0xff8000;
+            ftol(ftemp, sample_buffer[(i*mip->nch)+ch]);
+#else
+            sample_buffer[(i*mip->nch)+ch] = (short)truncate(data[ch][i]);
+#endif
+
+        }
+    }
+
+    hDecoder->frameNum++;
+    faad_byte_align(&hDecoder->ld);
+
+    //printf("processed %d bits\n", faad_get_processed_bits(&hDecoder->ld));
+    *bytesconsumed = bit2byte(faad_get_processed_bits(&hDecoder->ld));
+    if (hDecoder->frameNum > 2)
+        *samples = 1024*mip->nch;
+    else
+        *samples = 0;
+
+    /* no errors */
+    return retCode;
+
+error:
+#if 0
+    //
+    // wmay - remove this error recovery, and let calling app handle this -
+    // with mpeg4ip, we can get better recovery, especially with RTP.
+    //
+    /* search for next ADTS header first, so decoding can be continued */
+    /* ADIF and RAW AAC files will not be able to continue playing */
+    if (hDecoder->adts_header_present) {
+        int k, sync = 0;
+
+        faad_byte_align(&hDecoder->ld);
+
+        for(k = 0; sync != 4096 - 1; k++)
+        {
+            sync = faad_getbits(&hDecoder->ld, 12); /* 12 bit SYNCWORD */
+            faad_getbits(&hDecoder->ld, 4);
+
+            /* Bail out if no syncword found */
+            if(k >= (6144 / 16))
+            {
+                SetMemory(sample_buffer, 0, sizeof(short)*mip->nch*1024);
+
+                /* unrecoverable error */
+                return FAAD_FATAL_ERROR;
+            }
+        }
+
+        *bytesconsumed = bit2byte(hDecoder->ld.framebits - 16);
+        SetMemory(sample_buffer, 0, sizeof(short)*mip->nch*1024);
+
+        /* error, but recoverable */
+        return FAAD_ERROR;
+    } else {
+        SetMemory(sample_buffer, 0, sizeof(short)*mip->nch*1024);
+
+        /* unrecoverable error */
+        return FAAD_FATAL_ERROR;
+    }
+#else
+    *bytesconsumed = bit2byte(faad_get_processed_bits(&hDecoder->ld));
+    return FAAD_ERROR;
+#endif
+}
+
diff --git a/dolby_adapt.c b/dolby_adapt.c
new file mode 100644
index 0000000..5f4ebe6
--- /dev/null
+++ b/dolby_adapt.c
@@ -0,0 +1,537 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: dolby_adapt.c,v 1.7 2003/02/18 18:51:30 wmaycisco Exp $
+ */
+
+#include "all.h"
+#include "block.h"
+#include "util.h"
+
+#define NORM_TYPE 0
+#define START_TYPE 1
+#define SHORT_TYPE 2
+#define STOP_TYPE 3
+
+/*
+*   Interleave Definitions for start and stop blocks
+*
+*   Start block contains 1 576-pt spectrum (A) and 4 128-pt spectra (B-E)
+*     Input spectra are interleaved in repeating segements of 17 bins,
+*       9 bins from A (A0-A8), and 2 bins from each of the shorts.
+*     Within the segments the bins are interleaved as:
+*       A0 A1 A2 A3 A4 B0 C0 D0 E0 A5 A6 A7 A8 B1 C1 D1 E1
+*
+*   Stop block contains 3 128-pt spectra (A-C) and 1 576-pt spectrum (D)
+*     Input spectra are interleaved in repeating segements of 15 bins,
+*       2 bins from each of the shorts, and 9 bins from D (D0-D8).
+*     Within the segments the bins are interleaved as:
+*       A0 B0 C0 D0 D1 D2 D3 D4 A1 B1 C1 D5 D6 D7 D8
+*     The last 64 bins are (should be) set to 0.
+*/
+
+#define N_SHORT_IN_START 4
+#define START_OFFSET 0
+#define SHORT_IN_START_OFFSET 5
+#define N_SHORT_IN_STOP 3
+#define STOP_OFFSET 3
+#define SHORT_IN_STOP_OFFSET 0
+#define N_SHORT_IN_4STOP    4
+
+/*****************************************************************************
+*
+*   unfold
+*   create full spectrum by reflecting-inverting first half over to second
+*   input: see below
+*   output: see below
+*   local static: none
+*   globals: none
+*
+*****************************************************************************/
+void unfold (
+    Float *data_in, /* input: 1/2 spectrum */
+    Float *data_out,    /* output: full spectrum */
+    int inLeng)         /* input: length of input vector */
+{
+    register int   i;
+
+    /* fill transBuff w/ full MDCT sequence from freqInPtr */
+    i=0;
+    do
+    {
+
+      data_out[i] = *data_in;
+      data_out[2*inLeng-i-1] = -(*data_in);
+      data_in++;
+      i++;
+
+      data_out[i] = *data_in;
+      data_out[2*inLeng-i-1] = -(*data_in);
+      data_in++;
+      i++;
+
+      data_out[i] = *data_in;
+      data_out[2*inLeng-i-1] = -(*data_in);
+      data_in++;
+      i++;
+
+      data_out[i] = *data_in;
+      data_out[2*inLeng-i-1] = -(*data_in);
+      data_in++;
+      i++;
+
+    }while (i<inLeng);
+} /* end of unfold */
+
+
+/*****************************************************************************
+*
+*   freq2time_adapt
+*   transform freq. domain data to time domain.
+*   Overlap and add transform output to recreate time sequence.
+*   Blocks composed of multiple segments (i.e. all but long) have
+*     input spectrums interleaved.
+*   input: see below
+*   output: see below
+*   local static:
+*     timeBuff      time domain data fifo
+*   globals: none
+*
+*****************************************************************************/
+void freq2time_adapt(faacDecHandle hDecoder,
+    byte blockType,         /* input: blockType 0-3                     */
+    Wnd_Shape *wnd_shape,   /* input/output                             */
+    Float *freqInPtr,       /* input: interleaved spectrum              */
+    Float *timeBuff,        /* transform state needed for each channel  */
+    Float *ftimeOutPtr)     /* output: 1/2 block of new time values     */
+{
+    Float *transBuff, *transBuffPtr;
+    int             i, j;
+    Float           *timeBuffPtr, *destPtr;
+    Float *timeOutPtr;
+
+    transBuff = AllocMemory(2*BLOCK_LEN_LONG*sizeof(Float));
+    timeOutPtr = AllocMemory(BLOCK_LEN_LONG*sizeof(Float));
+
+    if (blockType == NORM_TYPE)  {
+        unfold (freqInPtr, transBuff, BLOCK_LEN_LONG);
+        /* Do 1 LONG transform */
+        ITransformBlock (hDecoder, transBuff, LONG_BLOCK, wnd_shape, timeBuff); /* ch ); */
+
+        transBuffPtr = transBuff;
+        timeBuffPtr = timeBuff;     /*   [ch];  */
+        destPtr = timeOutPtr;
+
+    /* idimkovic: reduce loop overhead by unrolling */
+    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)
+    {
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+
+        }
+
+    /* Save second half as old data */
+        timeBuffPtr = timeBuff;     /*       [ch];      */
+    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+        }
+    }
+
+    else if (blockType == SHORT_TYPE)
+    {
+        /* Do 8 SHORT transforms */
+
+        if (hDecoder->dolbyShortOffset_f2t)
+            destPtr = timeBuff + 4 * BLOCK_LEN_SHORT;       /* DBS */
+        else
+            destPtr = timeBuff + (BLOCK_LEN_LONG - BLOCK_LEN_SHORT) / 2;    /*  448 */
+
+        for (i = 0; i < 8; i++) {
+            unfold (freqInPtr, transBuff, BLOCK_LEN_SHORT );
+            /*was freqinPtr++, 8 .. mfd */
+            freqInPtr += BLOCK_LEN_SHORT;   /*  added mfd   */
+            ITransformBlock (hDecoder, transBuff, SHORT_BLOCK, wnd_shape, timeBuff);
+
+            /* Add first half of short window and old data */
+            transBuffPtr = transBuff;
+
+      for (j = BLOCK_LEN_SHORT/16-1; j >= 0; --j)  {
+        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
+        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
+        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
+        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
+        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
+        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
+        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
+        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
+            }
+
+            /* Save second half of short window */
+      for (j = BLOCK_LEN_SHORT/16-1; j >= 0; --j)  {
+        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
+        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
+        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
+        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
+        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
+        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
+        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
+        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
+            }
+            destPtr -= BLOCK_LEN_SHORT;
+        }
+        /* Copy data to output buffer */
+        destPtr = timeOutPtr;
+        timeBuffPtr = timeBuff;     /*       [ch];      */
+
+    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+        }
+        /* Update timeBuff fifo */
+        destPtr = timeBuff;     /*       [ch];      */
+    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
+     }
+    }
+
+    else if (blockType == START_TYPE)  {
+        unfold(freqInPtr, transBuff, BLOCK_LEN_LONG);
+        ITransformBlock (hDecoder, transBuff, START_FLAT_BLOCK, wnd_shape, timeBuff);
+        /* Add first half and old data */
+        transBuffPtr = transBuff;
+        timeBuffPtr = timeBuff;
+        destPtr = timeOutPtr;
+    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+        }
+        /* Save second half as old data */
+        timeBuffPtr = timeBuff;
+    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
+      *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
+        }
+        hDecoder->dolbyShortOffset_f2t = 0;
+    }
+
+    else if (blockType == STOP_TYPE)  {
+        unfold (freqInPtr, transBuff, BLOCK_LEN_LONG);
+        /* Do 1 LONG transforms */
+        ITransformBlock (hDecoder, transBuff, STOP_FLAT_BLOCK, wnd_shape, timeBuff);
+        /* Add first half and old data */
+        transBuffPtr = transBuff;
+        timeBuffPtr = timeBuff;
+        destPtr = timeOutPtr;
+    for (i = (BLOCK_LEN_LONG - NFLAT)/16 - 1; i>=0;--i)
+    {
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+      *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
+    }
+    for ( i = NFLAT/16-1; i>=0;--i)  {
+      *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+      *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+      *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+      *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+      *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+      *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+      *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+      *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+        }
+
+        /* Save second half as old data */
+        timeBuffPtr = timeBuff;
+
+    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i )  {
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
+        }
+    }
+
+    i=0;
+    do
+    {
+      *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
+      *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
+      *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
+      *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
+      *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
+      *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
+      *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
+      *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
+    } while(i<BLOCK_LEN_LONG);
+
+    FreeMemory(timeOutPtr);
+    FreeMemory(transBuff);
+}
+
+/*****************************************************************************
+*
+*   time2freq_adapt
+*   transform to time domain data to freq. domain.
+*   Blocks composed of multiple segments (i.e. all but long) have
+*     input spectrums interleaved.
+*   Notice: currently verified only for certain blocktypes
+*   input: see below
+*   output: see below
+*   local static:
+*     none
+*   globals: none
+*
+*****************************************************************************/
+void time2freq_adapt(faacDecHandle hDecoder,
+    WINDOW_TYPE blockType,          /* input: blockType 0-3                     */
+    Wnd_Shape *wnd_shape,   /* input/output                             */
+    Float *timeInPtr,       /* input: time domain data              */
+    Float *ffreqOutPtr)     /* output: 1/2 block of new freq values     */
+{
+    Float *transBuff, *transBuffPtr;
+    int i, j;
+    Float *srcPtr;
+    Float *destPtr;
+    Float *freqOutPtr;
+
+    transBuff = AllocMemory(2*BLOCK_LEN_LONG*sizeof(Float));
+    freqOutPtr = AllocMemory(BLOCK_LEN_LONG*sizeof(Float));
+
+    if (blockType == NORM_TYPE)
+    {
+        srcPtr = timeInPtr;
+        destPtr = transBuff;
+    for (i = 2 * BLOCK_LEN_LONG / 16 - 1; i >= 0; --i)
+    {
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+        }
+        /* Do 1 LONG transform */
+        TransformBlock (hDecoder, transBuff, LONG_BLOCK, wnd_shape);
+
+        srcPtr = transBuff;
+        destPtr = freqOutPtr;
+    for (i = BLOCK_LEN_LONG/16-1; i>=0; --i)
+    {
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+      *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+        }
+    }
+
+    else if (blockType == SHORT_TYPE)  {
+    /* Do 8 SHORT transforms */
+
+        srcPtr = timeInPtr + (BLOCK_LEN_LONG - BLOCK_LEN_SHORT) / 2;
+    destPtr = freqOutPtr;
+
+    for (i = 0; i < 8; i++) {
+        transBuffPtr = transBuff;
+      for (i = 2 * BLOCK_LEN_SHORT/16-1; i>=0; --i)  {
+        *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
+        *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
+        *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
+        *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
+        *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
+        *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
+        *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
+        *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
+        }
+        srcPtr -= BLOCK_LEN_SHORT;
+        TransformBlock (hDecoder, transBuff, SHORT_BLOCK, wnd_shape);
+
+        /* Copy data to output buffer */
+        transBuffPtr = transBuff;
+      for (j = BLOCK_LEN_SHORT/16-1; j>=0;--j)  {
+    *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+    *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+    *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+    *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+    *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+    *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+    *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+    *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
+
+        }
+    }
+    }
+
+    else if (blockType == START_TYPE)  {
+        srcPtr = timeInPtr;
+    destPtr = transBuff;
+  for (i = 2 * BLOCK_LEN_LONG/16-1; i>=0;--i)  {
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+
+    }
+    TransformBlock (hDecoder, transBuff, START_FLAT_BLOCK, wnd_shape);
+
+    srcPtr = transBuff;
+    destPtr = freqOutPtr;
+  for (i = BLOCK_LEN_LONG/16-1; i>=0;--i)  {
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    }
+    hDecoder->dolbyShortOffset_t2f = 0;
+    }
+
+    else if (blockType == STOP_TYPE)  {
+        srcPtr = timeInPtr;
+    destPtr = transBuff;
+  for (i = 2 * BLOCK_LEN_LONG/16-1; i>=0;--i)  {
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
+    }
+    TransformBlock (hDecoder, transBuff, STOP_FLAT_BLOCK, wnd_shape);
+
+    srcPtr = transBuff;
+    destPtr = freqOutPtr;
+  for (i = BLOCK_LEN_LONG/16-1; i>=0;--i)  {
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+
+    }
+    }
+
+    srcPtr = freqOutPtr;
+    destPtr = ffreqOutPtr;
+  for (i = BLOCK_LEN_LONG/16-1; i>=0;--i)  {
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
+    }
+
+    FreeMemory(freqOutPtr);
+    FreeMemory(transBuff);
+}
diff --git a/fastfft.c b/fastfft.c
new file mode 100644
index 0000000..3a00e49
--- /dev/null
+++ b/fastfft.c
@@ -0,0 +1,2908 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * $Id: fastfft.c,v 1.4 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#include "fastfft.h"
+#include "all.h"
+
+#ifdef _MSC_VER
+#pragma warning(disable:4305)
+#endif
+
+
+static fftw_real K980785280[1] =
+{FFTW_KONST(+0.980785280403230449126182236134239036973933731)};
+static fftw_real K195090322[1] =
+{FFTW_KONST(+0.195090322016128267848284868477022240927691618)};
+static fftw_real K555570233[1] =
+{FFTW_KONST(+0.555570233019602224742830813948532874374937191)};
+static fftw_real K831469612[1] =
+{FFTW_KONST(+0.831469612302545237078788377617905756738560812)};
+static fftw_real K923879532[1] =
+{FFTW_KONST(+0.923879532511286756128183189396788286822416626)};
+static fftw_real K382683432[1] =
+{FFTW_KONST(+0.382683432365089771728459984030398866761344562)};
+static fftw_real K707106781[1] =
+{FFTW_KONST(+0.707106781186547524400844362104849039284835938)};
+
+static fftw_complex PFFTW(W_64)[30] = {
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.555570233019602, 0.831469612302545 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.38268343236509, 0.923879532511287 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.195090322016128, 0.98078528040323 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 6.12303176911189e-17, 1 },
+{ 0.634393284163645, 0.773010453362737 },
+{ -0.195090322016128, 0.98078528040323 },
+{ 0.555570233019602, 0.831469612302545 },
+{ -0.38268343236509, 0.923879532511287 },
+{ 0.471396736825998, 0.881921264348355 },
+{ -0.555570233019602, 0.831469612302545 },
+{ 0.38268343236509, 0.923879532511287 },
+{ -0.707106781186547, 0.707106781186548 },
+{ 0.290284677254462, 0.956940335732209 },
+{ -0.831469612302545, 0.555570233019602 },
+{ 0.195090322016128, 0.98078528040323 },
+{ -0.923879532511287, 0.38268343236509 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ -0.98078528040323, 0.195090322016129 },
+};
+
+static fftw_complex PFFTW(W_128)[62] = {
+{ 0.998795456205172, 0.049067674327418 },
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.989176509964781, 0.146730474455362 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.970031253194544, 0.242980179903264 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.941544065183021, 0.33688985339222 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 0.903989293123443, 0.427555093430282 },
+{ 0.634393284163645, 0.773010453362737 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.555570233019602, 0.831469612302545 },
+{ 0.857728610000272, 0.514102744193222 },
+{ 0.471396736825998, 0.881921264348355 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.38268343236509, 0.923879532511287 },
+{ 0.803207531480645, 0.595699304492433 },
+{ 0.290284677254462, 0.956940335732209 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.195090322016128, 0.98078528040323 },
+{ 0.740951125354959, 0.671558954847018 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 6.12303176911189e-17, 1 },
+{ 0.671558954847018, 0.740951125354959 },
+{ -0.0980171403295606, 0.995184726672197 },
+{ 0.634393284163645, 0.773010453362737 },
+{ -0.195090322016128, 0.98078528040323 },
+{ 0.595699304492433, 0.803207531480645 },
+{ -0.290284677254462, 0.956940335732209 },
+{ 0.555570233019602, 0.831469612302545 },
+{ -0.38268343236509, 0.923879532511287 },
+{ 0.514102744193222, 0.857728610000272 },
+{ -0.471396736825998, 0.881921264348355 },
+{ 0.471396736825998, 0.881921264348355 },
+{ -0.555570233019602, 0.831469612302545 },
+{ 0.427555093430282, 0.903989293123443 },
+{ -0.634393284163645, 0.773010453362737 },
+{ 0.38268343236509, 0.923879532511287 },
+{ -0.707106781186547, 0.707106781186548 },
+{ 0.33688985339222, 0.941544065183021 },
+{ -0.773010453362737, 0.634393284163645 },
+{ 0.290284677254462, 0.956940335732209 },
+{ -0.831469612302545, 0.555570233019602 },
+{ 0.242980179903264, 0.970031253194544 },
+{ -0.881921264348355, 0.471396736825998 },
+{ 0.195090322016128, 0.98078528040323 },
+{ -0.923879532511287, 0.38268343236509 },
+{ 0.146730474455362, 0.989176509964781 },
+{ -0.956940335732209, 0.290284677254462 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ -0.98078528040323, 0.195090322016129 },
+{ 0.0490676743274181, 0.998795456205172 },
+{ -0.995184726672197, 0.0980171403295608 },
+};
+
+static fftw_complex PFFTW(W_512)[254] = {
+{ 0.999924701839145, 0.0122715382857199 },
+{ 0.999698818696204, 0.0245412285229123 },
+{ 0.999698818696204, 0.0245412285229123 },
+{ 0.998795456205172, 0.049067674327418 },
+{ 0.99932238458835, 0.0368072229413588 },
+{ 0.99729045667869, 0.0735645635996674 },
+{ 0.998795456205172, 0.049067674327418 },
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.998118112900149, 0.0613207363022086 },
+{ 0.99247953459871, 0.122410675199216 },
+{ 0.99729045667869, 0.0735645635996674 },
+{ 0.989176509964781, 0.146730474455362 },
+{ 0.996312612182778, 0.0857973123444399 },
+{ 0.985277642388941, 0.170961888760301 },
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.993906970002356, 0.110222207293883 },
+{ 0.975702130038529, 0.21910124015687 },
+{ 0.99247953459871, 0.122410675199216 },
+{ 0.970031253194544, 0.242980179903264 },
+{ 0.99090263542778, 0.134580708507126 },
+{ 0.96377606579544, 0.266712757474898 },
+{ 0.989176509964781, 0.146730474455362 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.987301418157858, 0.158858143333861 },
+{ 0.949528180593037, 0.313681740398892 },
+{ 0.985277642388941, 0.170961888760301 },
+{ 0.941544065183021, 0.33688985339222 },
+{ 0.983105487431216, 0.183039887955141 },
+{ 0.932992798834739, 0.359895036534988 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.978317370719628, 0.207111376192219 },
+{ 0.914209755703531, 0.40524131400499 },
+{ 0.975702130038529, 0.21910124015687 },
+{ 0.903989293123443, 0.427555093430282 },
+{ 0.97293995220556, 0.231058108280671 },
+{ 0.893224301195515, 0.449611329654607 },
+{ 0.970031253194544, 0.242980179903264 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.966976471044852, 0.254865659604515 },
+{ 0.870086991108711, 0.492898192229784 },
+{ 0.96377606579544, 0.266712757474898 },
+{ 0.857728610000272, 0.514102744193222 },
+{ 0.960430519415566, 0.278519689385053 },
+{ 0.844853565249707, 0.534997619887097 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.953306040354194, 0.302005949319228 },
+{ 0.817584813151584, 0.575808191417845 },
+{ 0.949528180593037, 0.313681740398892 },
+{ 0.803207531480645, 0.595699304492433 },
+{ 0.945607325380521, 0.325310292162263 },
+{ 0.788346427626606, 0.615231590580627 },
+{ 0.941544065183021, 0.33688985339222 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.937339011912575, 0.348418680249435 },
+{ 0.757208846506485, 0.653172842953777 },
+{ 0.932992798834739, 0.359895036534988 },
+{ 0.740951125354959, 0.671558954847018 },
+{ 0.928506080473216, 0.371317193951838 },
+{ 0.724247082951467, 0.689540544737067 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 0.919113851690058, 0.393992040061048 },
+{ 0.689540544737067, 0.724247082951467 },
+{ 0.914209755703531, 0.40524131400499 },
+{ 0.671558954847018, 0.740951125354959 },
+{ 0.909167983090522, 0.416429560097637 },
+{ 0.653172842953777, 0.757208846506484 },
+{ 0.903989293123443, 0.427555093430282 },
+{ 0.634393284163645, 0.773010453362737 },
+{ 0.898674465693954, 0.438616238538528 },
+{ 0.615231590580627, 0.788346427626606 },
+{ 0.893224301195515, 0.449611329654607 },
+{ 0.595699304492433, 0.803207531480645 },
+{ 0.887639620402854, 0.46053871095824 },
+{ 0.575808191417845, 0.817584813151584 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.555570233019602, 0.831469612302545 },
+{ 0.876070094195407, 0.482183772079123 },
+{ 0.534997619887097, 0.844853565249707 },
+{ 0.870086991108711, 0.492898192229784 },
+{ 0.514102744193222, 0.857728610000272 },
+{ 0.863972856121587, 0.503538383725718 },
+{ 0.492898192229784, 0.870086991108711 },
+{ 0.857728610000272, 0.514102744193222 },
+{ 0.471396736825998, 0.881921264348355 },
+{ 0.851355193105265, 0.524589682678469 },
+{ 0.449611329654607, 0.893224301195515 },
+{ 0.844853565249707, 0.534997619887097 },
+{ 0.427555093430282, 0.903989293123443 },
+{ 0.838224705554838, 0.545324988422046 },
+{ 0.40524131400499, 0.914209755703531 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.38268343236509, 0.923879532511287 },
+{ 0.824589302785025, 0.565731810783613 },
+{ 0.359895036534988, 0.932992798834739 },
+{ 0.817584813151584, 0.575808191417845 },
+{ 0.33688985339222, 0.941544065183021 },
+{ 0.810457198252595, 0.585797857456439 },
+{ 0.313681740398892, 0.949528180593037 },
+{ 0.803207531480645, 0.595699304492433 },
+{ 0.290284677254462, 0.956940335732209 },
+{ 0.795836904608884, 0.605511041404326 },
+{ 0.266712757474898, 0.96377606579544 },
+{ 0.788346427626606, 0.615231590580627 },
+{ 0.242980179903264, 0.970031253194544 },
+{ 0.780737228572094, 0.624859488142386 },
+{ 0.21910124015687, 0.975702130038529 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.195090322016128, 0.98078528040323 },
+{ 0.765167265622459, 0.643831542889791 },
+{ 0.170961888760301, 0.985277642388941 },
+{ 0.757208846506485, 0.653172842953777 },
+{ 0.146730474455362, 0.989176509964781 },
+{ 0.749136394523459, 0.662415777590172 },
+{ 0.122410675199216, 0.99247953459871 },
+{ 0.740951125354959, 0.671558954847018 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ 0.732654271672413, 0.680600997795453 },
+{ 0.0735645635996675, 0.99729045667869 },
+{ 0.724247082951467, 0.689540544737067 },
+{ 0.0490676743274181, 0.998795456205172 },
+{ 0.715730825283819, 0.698376249408973 },
+{ 0.0245412285229123, 0.999698818696204 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 6.12303176911189e-17, 1 },
+{ 0.698376249408973, 0.715730825283819 },
+{ -0.0245412285229121, 0.999698818696204 },
+{ 0.689540544737067, 0.724247082951467 },
+{ -0.049067674327418, 0.998795456205172 },
+{ 0.680600997795453, 0.732654271672413 },
+{ -0.0735645635996673, 0.99729045667869 },
+{ 0.671558954847018, 0.740951125354959 },
+{ -0.0980171403295606, 0.995184726672197 },
+{ 0.662415777590172, 0.749136394523459 },
+{ -0.122410675199216, 0.99247953459871 },
+{ 0.653172842953777, 0.757208846506484 },
+{ -0.146730474455362, 0.989176509964781 },
+{ 0.643831542889791, 0.765167265622459 },
+{ -0.170961888760301, 0.985277642388941 },
+{ 0.634393284163645, 0.773010453362737 },
+{ -0.195090322016128, 0.98078528040323 },
+{ 0.624859488142386, 0.780737228572094 },
+{ -0.21910124015687, 0.975702130038529 },
+{ 0.615231590580627, 0.788346427626606 },
+{ -0.242980179903264, 0.970031253194544 },
+{ 0.605511041404326, 0.795836904608883 },
+{ -0.266712757474898, 0.96377606579544 },
+{ 0.595699304492433, 0.803207531480645 },
+{ -0.290284677254462, 0.956940335732209 },
+{ 0.585797857456439, 0.810457198252595 },
+{ -0.313681740398891, 0.949528180593037 },
+{ 0.575808191417845, 0.817584813151584 },
+{ -0.33688985339222, 0.941544065183021 },
+{ 0.565731810783613, 0.824589302785025 },
+{ -0.359895036534988, 0.932992798834739 },
+{ 0.555570233019602, 0.831469612302545 },
+{ -0.38268343236509, 0.923879532511287 },
+{ 0.545324988422046, 0.838224705554838 },
+{ -0.40524131400499, 0.914209755703531 },
+{ 0.534997619887097, 0.844853565249707 },
+{ -0.427555093430282, 0.903989293123443 },
+{ 0.524589682678469, 0.851355193105265 },
+{ -0.449611329654607, 0.893224301195515 },
+{ 0.514102744193222, 0.857728610000272 },
+{ -0.471396736825998, 0.881921264348355 },
+{ 0.503538383725718, 0.863972856121587 },
+{ -0.492898192229784, 0.870086991108711 },
+{ 0.492898192229784, 0.870086991108711 },
+{ -0.514102744193222, 0.857728610000272 },
+{ 0.482183772079123, 0.876070094195407 },
+{ -0.534997619887097, 0.844853565249707 },
+{ 0.471396736825998, 0.881921264348355 },
+{ -0.555570233019602, 0.831469612302545 },
+{ 0.46053871095824, 0.887639620402854 },
+{ -0.575808191417845, 0.817584813151584 },
+{ 0.449611329654607, 0.893224301195515 },
+{ -0.595699304492433, 0.803207531480645 },
+{ 0.438616238538528, 0.898674465693954 },
+{ -0.615231590580627, 0.788346427626606 },
+{ 0.427555093430282, 0.903989293123443 },
+{ -0.634393284163645, 0.773010453362737 },
+{ 0.416429560097637, 0.909167983090522 },
+{ -0.653172842953777, 0.757208846506485 },
+{ 0.40524131400499, 0.914209755703531 },
+{ -0.671558954847018, 0.740951125354959 },
+{ 0.393992040061048, 0.919113851690058 },
+{ -0.689540544737067, 0.724247082951467 },
+{ 0.38268343236509, 0.923879532511287 },
+{ -0.707106781186547, 0.707106781186548 },
+{ 0.371317193951838, 0.928506080473215 },
+{ -0.724247082951467, 0.689540544737067 },
+{ 0.359895036534988, 0.932992798834739 },
+{ -0.740951125354959, 0.671558954847019 },
+{ 0.348418680249435, 0.937339011912575 },
+{ -0.757208846506485, 0.653172842953777 },
+{ 0.33688985339222, 0.941544065183021 },
+{ -0.773010453362737, 0.634393284163645 },
+{ 0.325310292162263, 0.945607325380521 },
+{ -0.788346427626606, 0.615231590580627 },
+{ 0.313681740398892, 0.949528180593037 },
+{ -0.803207531480645, 0.595699304492433 },
+{ 0.302005949319228, 0.953306040354194 },
+{ -0.817584813151584, 0.575808191417845 },
+{ 0.290284677254462, 0.956940335732209 },
+{ -0.831469612302545, 0.555570233019602 },
+{ 0.278519689385053, 0.960430519415566 },
+{ -0.844853565249707, 0.534997619887097 },
+{ 0.266712757474898, 0.96377606579544 },
+{ -0.857728610000272, 0.514102744193222 },
+{ 0.254865659604515, 0.966976471044852 },
+{ -0.870086991108711, 0.492898192229784 },
+{ 0.242980179903264, 0.970031253194544 },
+{ -0.881921264348355, 0.471396736825998 },
+{ 0.231058108280671, 0.97293995220556 },
+{ -0.893224301195515, 0.449611329654607 },
+{ 0.21910124015687, 0.975702130038529 },
+{ -0.903989293123443, 0.427555093430282 },
+{ 0.207111376192219, 0.978317370719628 },
+{ -0.914209755703531, 0.40524131400499 },
+{ 0.195090322016128, 0.98078528040323 },
+{ -0.923879532511287, 0.38268343236509 },
+{ 0.183039887955141, 0.983105487431216 },
+{ -0.932992798834739, 0.359895036534988 },
+{ 0.170961888760301, 0.985277642388941 },
+{ -0.941544065183021, 0.33688985339222 },
+{ 0.158858143333861, 0.987301418157858 },
+{ -0.949528180593037, 0.313681740398891 },
+{ 0.146730474455362, 0.989176509964781 },
+{ -0.956940335732209, 0.290284677254462 },
+{ 0.134580708507126, 0.99090263542778 },
+{ -0.96377606579544, 0.266712757474898 },
+{ 0.122410675199216, 0.99247953459871 },
+{ -0.970031253194544, 0.242980179903264 },
+{ 0.110222207293883, 0.993906970002356 },
+{ -0.975702130038528, 0.21910124015687 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ -0.98078528040323, 0.195090322016129 },
+{ 0.0857973123444399, 0.996312612182778 },
+{ -0.985277642388941, 0.170961888760301 },
+{ 0.0735645635996675, 0.99729045667869 },
+{ -0.989176509964781, 0.146730474455362 },
+{ 0.0613207363022086, 0.998118112900149 },
+{ -0.99247953459871, 0.122410675199216 },
+{ 0.0490676743274181, 0.998795456205172 },
+{ -0.995184726672197, 0.0980171403295608 },
+{ 0.036807222941359, 0.99932238458835 },
+{ -0.99729045667869, 0.0735645635996677 },
+{ 0.0245412285229123, 0.999698818696204 },
+{ -0.998795456205172, 0.049067674327418 },
+{ 0.0122715382857199, 0.999924701839145 },
+{ -0.999698818696204, 0.0245412285229123 },
+};
+///////////////////////////////////////////////////////////////
+
+void PFFTW(16) (fftw_complex * input) {
+     fftw_real tmp332;
+     fftw_real tmp331;
+     fftw_real tmp330;
+     fftw_real tmp329;
+     fftw_real tmp328;
+     fftw_real tmp327;
+     fftw_real tmp326;
+     fftw_real tmp325;
+     fftw_real tmp324;
+     fftw_real tmp323;
+     fftw_real tmp322;
+     fftw_real tmp321;
+     fftw_real tmp320;
+     fftw_real tmp319;
+     fftw_real tmp318;
+     fftw_real tmp317;
+     fftw_real tmp316;
+     fftw_real tmp315;
+     fftw_real tmp314;
+     fftw_real tmp313;
+     fftw_real tmp312;
+     fftw_real tmp311;
+     fftw_real tmp310;
+     fftw_real tmp309;
+     fftw_real tmp308;
+     fftw_real tmp307;
+     fftw_real tmp306;
+     fftw_real tmp305;
+     fftw_real tmp304;
+     fftw_real tmp303;
+     fftw_real tmp302;
+     fftw_real tmp301;
+     fftw_real st1;
+     fftw_real st2;
+     fftw_real st3;
+     fftw_real st4;
+     fftw_real st5;
+     fftw_real st6;
+     fftw_real st7;
+     fftw_real st8;
+     st8 = c_re(input[0]);
+     st8 = st8 - c_re(input[8]);
+     st7 = c_im(input[4]);
+     st7 = st7 - c_im(input[12]);
+     st6 = c_re(input[4]);
+     st5 = st8 - st7;
+     st8 = st8 + st7;
+     st6 = st6 - c_re(input[12]);
+     st4 = c_im(input[0]);
+     st4 = st4 - c_im(input[8]);
+     st3 = c_re(input[0]);
+     st2 = st6 + st4;
+     st4 = st4 - st6;
+     st3 = st3 + c_re(input[8]);
+     st1 = c_re(input[4]);
+     st1 = st1 + c_re(input[12]);
+     st7 = c_im(input[0]);
+     st6 = st3 + st1;
+     st3 = st3 - st1;
+     st7 = st7 + c_im(input[8]);
+     st1 = c_im(input[4]);
+     st1 = st1 + c_im(input[12]);
+     tmp301 = st4;
+     st4 = c_re(input[2]);
+     tmp302 = st8;
+     st8 = st7 + st1;
+     st7 = st7 - st1;
+     st4 = st4 + c_re(input[10]);
+     st1 = c_re(input[6]);
+     st1 = st1 + c_re(input[14]);
+     tmp303 = st2;
+     st2 = c_im(input[2]);
+     tmp304 = st5;
+     st5 = st4 + st1;
+     st4 = st4 - st1;
+     st2 = st2 + c_im(input[10]);
+     st1 = st6 + st5;
+     st6 = st6 - st5;
+     st5 = st4 + st7;
+     st7 = st7 - st4;
+     st4 = c_im(input[6]);
+     st4 = st4 + c_im(input[14]);
+     tmp305 = st5;
+     st5 = c_re(input[6]);
+     tmp306 = st7;
+     st7 = st2 + st4;
+     st2 = st2 - st4;
+     st4 = st8 - st7;
+     st8 = st8 + st7;
+     st7 = st3 - st2;
+     st3 = st3 + st2;
+     st5 = st5 - c_re(input[14]);
+     st2 = c_im(input[2]);
+     st2 = st2 - c_im(input[10]);
+     tmp307 = st3;
+     st3 = c_re(input[2]);
+     tmp308 = st6;
+     st6 = st5 + st2;
+     st2 = st2 - st5;
+     st3 = st3 - c_re(input[10]);
+     st5 = c_im(input[6]);
+     st5 = st5 - c_im(input[14]);
+     tmp309 = st7;
+     st7 = c_re(input[5]);
+     tmp310 = st8;
+     st8 = st3 - st5;
+     st3 = st3 + st5;
+     st5 = st6 - st8;
+     st6 = st6 + st8;
+     st5 = st5 * K707106781[0];
+     st8 = st2 + st3;
+     st6 = st6 * K707106781[0];
+     st2 = st2 - st3;
+     st8 = st8 * K707106781[0];
+     st7 = st7 - c_re(input[13]);
+     st2 = st2 * K707106781[0];
+     st3 = tmp304 + st5;
+     tmp311 = st4;
+     st4 = tmp303 + st6;
+     st6 = tmp303 - st6;
+     st5 = tmp304 - st5;
+     tmp312 = st1;
+     st1 = tmp302 - st8;
+     st8 = tmp302 + st8;
+     tmp313 = st8;
+     st8 = tmp301 + st2;
+     st2 = tmp301 - st2;
+     tmp314 = st2;
+     st2 = c_im(input[1]);
+     st2 = st2 - c_im(input[9]);
+     tmp315 = st8;
+     st8 = c_re(input[1]);
+     tmp316 = st1;
+     st1 = st7 + st2;
+     st2 = st2 - st7;
+     st7 = st1 * K923879532[0];
+     st8 = st8 - c_re(input[9]);
+     st1 = st1 * K382683432[0];
+     tmp317 = st5;
+     st5 = c_im(input[5]);
+     tmp318 = st6;
+     st6 = st2 * K923879532[0];
+     st5 = st5 - c_im(input[13]);
+     st2 = st2 * K382683432[0];
+     tmp319 = st4;
+     st4 = st8 - st5;
+     st8 = st8 + st5;
+     st5 = st4 * K382683432[0];
+     tmp320 = st3;
+     st3 = c_re(input[7]);
+     st4 = st4 * K923879532[0];
+     st7 = st7 + st5;
+     st5 = st8 * K382683432[0];
+     st1 = st1 - st4;
+     st8 = st8 * K923879532[0];
+     st6 = st6 - st5;
+     st2 = st2 + st8;
+     st3 = st3 - c_re(input[15]);
+     st4 = c_im(input[3]);
+     st4 = st4 - c_im(input[11]);
+     st5 = c_re(input[3]);
+     st8 = st3 + st4;
+     st4 = st4 - st3;
+     st3 = st8 * K382683432[0];
+     st5 = st5 - c_re(input[11]);
+     st8 = st8 * K923879532[0];
+     tmp321 = st2;
+     st2 = c_im(input[7]);
+     tmp322 = st6;
+     st6 = st4 * K382683432[0];
+     st2 = st2 - c_im(input[15]);
+     st4 = st4 * K923879532[0];
+     tmp323 = st1;
+     st1 = st5 - st2;
+     st5 = st5 + st2;
+     st2 = st1 * K923879532[0];
+     tmp324 = st7;
+     st7 = c_re(input[1]);
+     st1 = st1 * K382683432[0];
+     st3 = st3 + st2;
+     st2 = st5 * K923879532[0];
+     st1 = st1 - st8;
+     st5 = st5 * K382683432[0];
+     st6 = st6 - st2;
+     st4 = st4 + st5;
+     st7 = st7 + c_re(input[9]);
+     st8 = tmp324 - st3;
+     st3 = tmp324 + st3;
+     st2 = tmp320 - st8;
+     st8 = tmp320 + st8;
+     st5 = tmp319 - st3;
+     st3 = tmp319 + st3;
+     tmp325 = st3;
+     st3 = tmp323 + st1;
+     st1 = tmp323 - st1;
+     tmp326 = st5;
+     st5 = tmp318 - st3;
+     st3 = tmp318 + st3;
+     tmp327 = st5;
+     st5 = tmp317 - st1;
+     st1 = tmp317 + st1;
+     tmp328 = st3;
+     st3 = tmp322 - st6;
+     tmp329 = st5;
+     st5 = tmp321 + st4;
+     tmp330 = st1;
+     st1 = tmp316 - st3;
+     st3 = tmp316 + st3;
+     tmp331 = st2;
+     st2 = tmp313 - st5;
+     st5 = tmp313 + st5;
+     st6 = tmp322 + st6;
+     c_re(input[9]) = st2;
+     c_re(input[1]) = st5;
+     st2 = tmp315 - st6;
+     st6 = tmp315 + st6;
+     st4 = tmp321 - st4;
+     st5 = c_re(input[5]);
+     c_re(input[5]) = st3;
+     st5 = st5 + c_re(input[13]);
+     c_re(input[13]) = st1;
+     st1 = st7 + st5;
+     st7 = st7 - st5;
+     st3 = tmp314 - st4;
+     st4 = tmp314 + st4;
+     st5 = c_im(input[1]);
+     c_im(input[1]) = st6;
+     st5 = st5 + c_im(input[9]);
+     c_im(input[9]) = st2;
+     st2 = c_im(input[5]);
+     c_im(input[5]) = st3;
+     st2 = st2 + c_im(input[13]);
+     c_im(input[13]) = st4;
+     st6 = st5 - st2;
+     st5 = st5 + st2;
+     st3 = c_re(input[3]);
+     c_re(input[3]) = st8;
+     st3 = st3 + c_re(input[11]);
+     c_re(input[11]) = tmp331;
+     st8 = c_re(input[7]);
+     c_re(input[7]) = tmp330;
+     st8 = st8 + c_re(input[15]);
+     c_re(input[15]) = tmp329;
+     st4 = st3 + st8;
+     st3 = st3 - st8;
+     st2 = st1 + st4;
+     st1 = st1 - st4;
+     st8 = st3 + st6;
+     st6 = st6 - st3;
+     st4 = tmp312 - st2;
+     st2 = tmp312 + st2;
+     st3 = tmp311 - st1;
+     c_re(input[8]) = st4;
+     c_re(input[0]) = st2;
+     c_im(input[4]) = st3;
+     st1 = st1 + tmp311;
+     st4 = c_im(input[3]);
+     c_im(input[3]) = tmp328;
+     c_im(input[12]) = st1;
+     st4 = st4 + c_im(input[11]);
+     c_im(input[11]) = tmp327;
+     st2 = c_im(input[7]);
+     c_im(input[7]) = tmp326;
+     st2 = st2 + c_im(input[15]);
+     c_im(input[15]) = tmp325;
+     st3 = st4 - st2;
+     st4 = st4 + st2;
+     st1 = st7 - st3;
+     st2 = st5 - st4;
+     tmp332 = st2;
+     st2 = st8 - st1;
+     st8 = st8 + st1;
+     st2 = st2 * K707106781[0];
+     st5 = st5 + st4;
+     st8 = st8 * K707106781[0];
+     st7 = st7 + st3;
+     st3 = tmp310 + st5;
+     st4 = st6 - st7;
+     st6 = st6 + st7;
+     c_im(input[0]) = st3;
+     st4 = st4 * K707106781[0];
+     st5 = tmp310 - st5;
+     st6 = st6 * K707106781[0];
+     st1 = tmp309 - st2;
+     c_im(input[8]) = st5;
+     c_re(input[14]) = st1;
+     st2 = tmp309 + st2;
+     st7 = tmp308 + tmp332;
+     st3 = tmp308 - tmp332;
+     c_re(input[6]) = st2;
+     c_re(input[4]) = st7;
+     c_re(input[12]) = st3;
+     st5 = tmp306 - st4;
+     st4 = tmp306 + st4;
+     st1 = tmp307 - st6;
+     c_im(input[10]) = st5;
+     c_im(input[2]) = st4;
+     c_re(input[10]) = st1;
+     st6 = tmp307 + st6;
+     st2 = tmp305 - st8;
+     st8 = tmp305 + st8;
+     c_re(input[2]) = st6;
+     c_im(input[6]) = st2;
+     c_im(input[14]) = st8;
+}
+
+void PFFTW(32) (fftw_complex * input) {
+     fftw_real tmp714;
+     fftw_real tmp713;
+     fftw_real tmp712;
+     fftw_real tmp711;
+     fftw_real tmp710;
+     fftw_real tmp709;
+     fftw_real tmp708;
+     fftw_real tmp707;
+     fftw_real tmp706;
+     fftw_real tmp705;
+     fftw_real tmp704;
+     fftw_real tmp703;
+     fftw_real tmp702;
+     fftw_real tmp701;
+     fftw_real tmp700;
+     fftw_real tmp699;
+     fftw_real tmp698;
+     fftw_real tmp697;
+     fftw_real tmp696;
+     fftw_real tmp695;
+     fftw_real tmp694;
+     fftw_real tmp693;
+     fftw_real tmp692;
+     fftw_real tmp691;
+     fftw_real tmp690;
+     fftw_real tmp689;
+     fftw_real tmp688;
+     fftw_real tmp687;
+     fftw_real tmp686;
+     fftw_real tmp685;
+     fftw_real tmp684;
+     fftw_real tmp683;
+     fftw_real tmp682;
+     fftw_real tmp681;
+     fftw_real tmp680;
+     fftw_real tmp679;
+     fftw_real tmp678;
+     fftw_real tmp677;
+     fftw_real tmp676;
+     fftw_real tmp675;
+     fftw_real tmp674;
+     fftw_real tmp673;
+     fftw_real tmp672;
+     fftw_real tmp671;
+     fftw_real tmp670;
+     fftw_real tmp669;
+     fftw_real tmp668;
+     fftw_real tmp667;
+     fftw_real tmp666;
+     fftw_real tmp665;
+     fftw_real tmp664;
+     fftw_real tmp663;
+     fftw_real tmp662;
+     fftw_real tmp661;
+     fftw_real tmp660;
+     fftw_real tmp659;
+     fftw_real tmp658;
+     fftw_real tmp657;
+     fftw_real tmp656;
+     fftw_real tmp655;
+     fftw_real tmp654;
+     fftw_real tmp653;
+     fftw_real tmp652;
+     fftw_real tmp651;
+     fftw_real tmp650;
+     fftw_real tmp649;
+     fftw_real tmp648;
+     fftw_real tmp647;
+     fftw_real tmp646;
+     fftw_real tmp645;
+     fftw_real tmp644;
+     fftw_real tmp643;
+     fftw_real tmp642;
+     fftw_real tmp641;
+     fftw_real tmp640;
+     fftw_real tmp639;
+     fftw_real tmp638;
+     fftw_real tmp637;
+     fftw_real tmp636;
+     fftw_real tmp635;
+     fftw_real tmp634;
+     fftw_real tmp633;
+     fftw_real tmp632;
+     fftw_real tmp631;
+     fftw_real tmp630;
+     fftw_real tmp629;
+     fftw_real tmp628;
+     fftw_real tmp627;
+     fftw_real tmp626;
+     fftw_real tmp625;
+     fftw_real tmp624;
+     fftw_real tmp623;
+     fftw_real tmp622;
+     fftw_real tmp621;
+     fftw_real st1;
+     fftw_real st2;
+     fftw_real st3;
+     fftw_real st4;
+     fftw_real st5;
+     fftw_real st6;
+     fftw_real st7;
+     fftw_real st8;
+     st8 = c_re(input[0]);
+     st8 = st8 - c_re(input[16]);
+     st7 = c_im(input[8]);
+     st7 = st7 - c_im(input[24]);
+     st6 = st8 - st7;
+     st8 = st8 + st7;
+     st5 = c_re(input[0]);
+     st5 = st5 + c_re(input[16]);
+     st4 = c_re(input[8]);
+     st4 = st4 + c_re(input[24]);
+     st3 = st5 + st4;
+     st5 = st5 - st4;
+     st2 = c_im(input[0]);
+     st2 = st2 + c_im(input[16]);
+     st1 = c_im(input[8]);
+     st1 = st1 + c_im(input[24]);
+     st7 = st2 + st1;
+     st2 = st2 - st1;
+     st4 = c_re(input[4]);
+     st4 = st4 + c_re(input[20]);
+     st1 = c_re(input[28]);
+     st1 = st1 + c_re(input[12]);
+     tmp621 = st6;
+     st6 = st4 + st1;
+     st1 = st1 - st4;
+     st4 = st3 + st6;
+     st3 = st3 - st6;
+     st6 = st2 - st1;
+     st1 = st1 + st2;
+     st2 = c_im(input[4]);
+     st2 = st2 + c_im(input[20]);
+     tmp622 = st1;
+     st1 = c_im(input[28]);
+     st1 = st1 + c_im(input[12]);
+     tmp623 = st6;
+     st6 = st2 + st1;
+     st2 = st2 - st1;
+     st1 = st7 + st6;
+     st7 = st7 - st6;
+     st6 = st5 - st2;
+     st5 = st5 + st2;
+     st2 = c_re(input[8]);
+     st2 = st2 - c_re(input[24]);
+     tmp624 = st5;
+     st5 = c_im(input[0]);
+     st5 = st5 - c_im(input[16]);
+     tmp625 = st6;
+     st6 = st2 + st5;
+     st5 = st5 - st2;
+     st2 = c_im(input[4]);
+     st2 = st2 - c_im(input[20]);
+     tmp626 = st3;
+     st3 = c_re(input[4]);
+     st3 = st3 - c_re(input[20]);
+     tmp627 = st1;
+     st1 = st2 - st3;
+     st3 = st3 + st2;
+     st2 = c_re(input[28]);
+     st2 = st2 - c_re(input[12]);
+     tmp628 = st7;
+     st7 = c_im(input[28]);
+     st7 = st7 - c_im(input[12]);
+     tmp629 = st4;
+     st4 = st2 + st7;
+     st2 = st2 - st7;
+     st7 = st1 - st4;
+     st7 = st7 * K707106781[0];
+     st1 = st1 + st4;
+     st1 = st1 * K707106781[0];
+     st4 = st2 - st3;
+     st4 = st4 * K707106781[0];
+     st3 = st3 + st2;
+     st3 = st3 * K707106781[0];
+     st2 = st8 - st3;
+     tmp630 = st2;
+     st2 = st5 - st1;
+     tmp631 = st2;
+     st2 = tmp621 - st7;
+     tmp632 = st2;
+     st2 = st6 - st4;
+     st7 = tmp621 + st7;
+     st6 = st6 + st4;
+     st8 = st8 + st3;
+     st5 = st5 + st1;
+     st1 = c_re(input[2]);
+     st1 = st1 + c_re(input[18]);
+     st4 = c_re(input[10]);
+     st4 = st4 + c_re(input[26]);
+     st3 = st1 + st4;
+     st1 = st1 - st4;
+     st4 = c_im(input[2]);
+     st4 = st4 + c_im(input[18]);
+     tmp633 = st5;
+     st5 = c_im(input[10]);
+     st5 = st5 + c_im(input[26]);
+     tmp634 = st8;
+     st8 = st4 + st5;
+     st4 = st4 - st5;
+     st5 = st1 + st4;
+     st4 = st4 - st1;
+     st1 = c_re(input[30]);
+     st1 = st1 + c_re(input[14]);
+     tmp635 = st6;
+     st6 = c_re(input[6]);
+     st6 = st6 + c_re(input[22]);
+     tmp636 = st7;
+     st7 = st1 + st6;
+     st1 = st1 - st6;
+     st6 = st3 + st7;
+     st7 = st7 - st3;
+     st3 = tmp629 + st6;
+     st6 = tmp629 - st6;
+     tmp637 = st6;
+     st6 = st7 + tmp628;
+     st7 = tmp628 - st7;
+     tmp638 = st7;
+     st7 = c_im(input[30]);
+     st7 = st7 + c_im(input[14]);
+     tmp639 = st6;
+     st6 = c_im(input[6]);
+     st6 = st6 + c_im(input[22]);
+     tmp640 = st3;
+     st3 = st7 + st6;
+     st7 = st7 - st6;
+     st6 = st8 + st3;
+     st8 = st8 - st3;
+     st3 = st1 - st7;
+     tmp641 = st2;
+     st2 = st3 - st5;
+     st2 = st2 * K707106781[0];
+     st5 = st5 + st3;
+     st5 = st5 * K707106781[0];
+     st1 = st1 + st7;
+     st7 = st4 - st1;
+     st7 = st7 * K707106781[0];
+     st4 = st4 + st1;
+     st4 = st4 * K707106781[0];
+     st3 = tmp627 - st6;
+     st6 = tmp627 + st6;
+     st1 = tmp626 - st8;
+     st8 = tmp626 + st8;
+     tmp642 = st8;
+     st8 = tmp625 + st7;
+     st7 = tmp625 - st7;
+     tmp643 = st7;
+     st7 = tmp623 - st2;
+     st2 = tmp623 + st2;
+     tmp644 = st2;
+     st2 = tmp624 + st5;
+     st5 = tmp624 - st5;
+     tmp645 = st5;
+     st5 = tmp622 - st4;
+     st4 = tmp622 + st4;
+     tmp646 = st4;
+     st4 = c_re(input[6]);
+     st4 = st4 - c_re(input[22]);
+     tmp647 = st5;
+     st5 = c_im(input[30]);
+     st5 = st5 - c_im(input[14]);
+     tmp648 = st2;
+     st2 = st4 + st5;
+     tmp649 = st7;
+     st7 = st2 * K382683432[0];
+     st5 = st5 - st4;
+     st2 = st2 * K923879532[0];
+     st4 = c_re(input[30]);
+     tmp650 = st8;
+     st8 = st5 * K923879532[0];
+     st4 = st4 - c_re(input[14]);
+     st5 = st5 * K382683432[0];
+     tmp651 = st1;
+     st1 = c_im(input[6]);
+     st1 = st1 - c_im(input[22]);
+     tmp652 = st6;
+     st6 = st4 - st1;
+     tmp653 = st3;
+     st3 = st6 * K923879532[0];
+     st4 = st4 + st1;
+     st6 = st6 * K382683432[0];
+     st7 = st7 + st3;
+     st1 = st4 * K382683432[0];
+     st6 = st6 - st2;
+     st4 = st4 * K923879532[0];
+     st8 = st8 + st1;
+     st4 = st4 - st5;
+     st2 = c_re(input[10]);
+     st2 = st2 - c_re(input[26]);
+     st5 = c_im(input[2]);
+     st5 = st5 - c_im(input[18]);
+     st3 = st2 + st5;
+     st1 = st3 * K382683432[0];
+     st5 = st5 - st2;
+     st3 = st3 * K923879532[0];
+     st2 = c_re(input[2]);
+     tmp654 = st6;
+     st6 = st5 * K923879532[0];
+     st2 = st2 - c_re(input[18]);
+     st5 = st5 * K382683432[0];
+     tmp655 = st7;
+     st7 = c_im(input[10]);
+     st7 = st7 - c_im(input[26]);
+     tmp656 = st4;
+     st4 = st2 - st7;
+     tmp657 = st8;
+     st8 = st4 * K923879532[0];
+     st2 = st2 + st7;
+     st4 = st4 * K382683432[0];
+     st1 = st1 - st8;
+     st7 = st2 * K382683432[0];
+     st3 = st3 + st4;
+     st2 = st2 * K923879532[0];
+     st6 = st6 - st7;
+     st5 = st5 + st2;
+     st8 = st6 - tmp657;
+     st4 = tmp630 + st8;
+     st8 = tmp630 - st8;
+     st7 = tmp656 - st5;
+     st2 = tmp631 - st7;
+     st7 = tmp631 + st7;
+     tmp658 = st7;
+     st7 = st1 - tmp655;
+     tmp659 = st8;
+     st8 = tmp632 + st7;
+     st7 = tmp632 - st7;
+     tmp660 = st7;
+     st7 = tmp654 - st3;
+     tmp661 = st8;
+     st8 = tmp641 - st7;
+     st7 = tmp641 + st7;
+     st3 = st3 + tmp654;
+     tmp662 = st7;
+     st7 = tmp636 + st3;
+     st3 = tmp636 - st3;
+     st1 = st1 + tmp655;
+     tmp663 = st3;
+     st3 = tmp635 - st1;
+     st1 = tmp635 + st1;
+     st5 = st5 + tmp656;
+     tmp664 = st1;
+     st1 = tmp634 + st5;
+     st5 = tmp634 - st5;
+     st6 = st6 + tmp657;
+     tmp665 = st5;
+     st5 = tmp633 - st6;
+     st6 = tmp633 + st6;
+     tmp666 = st6;
+     st6 = c_re(input[1]);
+     st6 = st6 + c_re(input[17]);
+     tmp667 = st5;
+     st5 = c_re(input[9]);
+     st5 = st5 + c_re(input[25]);
+     tmp668 = st1;
+     st1 = st6 + st5;
+     st6 = st6 - st5;
+     st5 = c_im(input[1]);
+     st5 = st5 + c_im(input[17]);
+     tmp669 = st3;
+     st3 = c_im(input[9]);
+     st3 = st3 + c_im(input[25]);
+     tmp670 = st7;
+     st7 = st5 - st3;
+     st5 = st5 + st3;
+     st3 = c_re(input[5]);
+     st3 = st3 + c_re(input[21]);
+     tmp671 = st8;
+     st8 = c_re(input[29]);
+     st8 = st8 + c_re(input[13]);
+     tmp672 = st2;
+     st2 = st3 + st8;
+     st8 = st8 - st3;
+     st3 = st1 + st2;
+     st1 = st1 - st2;
+     st2 = st8 + st7;
+     tmp673 = st4;
+     st4 = st2 * K382683432[0];
+     st7 = st7 - st8;
+     st2 = st2 * K923879532[0];
+     st8 = c_im(input[5]);
+     tmp674 = st3;
+     st3 = st7 * K923879532[0];
+     st8 = st8 + c_im(input[21]);
+     st7 = st7 * K382683432[0];
+     tmp675 = st4;
+     st4 = c_im(input[29]);
+     st4 = st4 + c_im(input[13]);
+     tmp676 = st7;
+     st7 = st8 - st4;
+     st8 = st8 + st4;
+     st4 = st5 + st8;
+     st5 = st5 - st8;
+     st8 = st1 + st5;
+     st5 = st5 - st1;
+     st1 = st6 + st7;
+     tmp677 = st8;
+     st8 = st1 * K923879532[0];
+     st6 = st6 - st7;
+     st1 = st1 * K382683432[0];
+     st2 = st2 - st1;
+     st7 = st6 * K382683432[0];
+     st3 = st3 + st7;
+     st6 = st6 * K923879532[0];
+     st6 = tmp676 - st6;
+     st8 = tmp675 + st8;
+     st1 = c_re(input[31]);
+     st1 = st1 + c_re(input[15]);
+     st7 = c_re(input[7]);
+     st7 = st7 + c_re(input[23]);
+     tmp678 = st8;
+     st8 = st1 + st7;
+     st1 = st1 - st7;
+     st7 = c_im(input[31]);
+     st7 = st7 + c_im(input[15]);
+     tmp679 = st2;
+     st2 = c_im(input[7]);
+     st2 = st2 + c_im(input[23]);
+     tmp680 = st3;
+     st3 = st7 - st2;
+     st7 = st7 + st2;
+     st2 = c_re(input[3]);
+     st2 = st2 + c_re(input[19]);
+     tmp681 = st6;
+     st6 = c_re(input[27]);
+     st6 = st6 + c_re(input[11]);
+     tmp682 = st5;
+     st5 = st2 + st6;
+     st6 = st6 - st2;
+     st2 = st8 + st5;
+     st8 = st8 - st5;
+     st5 = st6 + st3;
+     tmp683 = st4;
+     st4 = st5 * K382683432[0];
+     st3 = st3 - st6;
+     st5 = st5 * K923879532[0];
+     st6 = tmp674 + st2;
+     tmp684 = st4;
+     st4 = st3 * K923879532[0];
+     tmp685 = st5;
+     st5 = tmp640 - st6;
+     st3 = st3 * K382683432[0];
+     st6 = tmp640 + st6;
+     st2 = st2 - tmp674;
+     c_re(input[16]) = st5;
+     st5 = st2 + tmp653;
+     st2 = tmp653 - st2;
+     c_re(input[0]) = st6;
+     st6 = c_im(input[3]);
+     st6 = st6 + c_im(input[19]);
+     c_im(input[8]) = st5;
+     st5 = c_im(input[27]);
+     st5 = st5 + c_im(input[11]);
+     c_im(input[24]) = st2;
+     st2 = st6 - st5;
+     st6 = st6 + st5;
+     st5 = st7 + st6;
+     st7 = st7 - st6;
+     st6 = st8 - st7;
+     st8 = st8 + st7;
+     st7 = st1 + st2;
+     tmp686 = st4;
+     st4 = st7 * K923879532[0];
+     st1 = st1 - st2;
+     st7 = st7 * K382683432[0];
+     st2 = tmp683 + st5;
+     tmp687 = st4;
+     st4 = st1 * K382683432[0];
+     tmp688 = st7;
+     st7 = tmp652 - st2;
+     st1 = st1 * K923879532[0];
+     st2 = tmp652 + st2;
+     st5 = tmp683 - st5;
+     c_im(input[16]) = st7;
+     st7 = tmp637 - st5;
+     st5 = tmp637 + st5;
+     c_im(input[0]) = st2;
+     st2 = tmp682 + st8;
+     st2 = st2 * K707106781[0];
+     c_re(input[24]) = st7;
+     st7 = tmp639 - st2;
+     st2 = tmp639 + st2;
+     st8 = tmp682 - st8;
+     st8 = st8 * K707106781[0];
+     c_re(input[8]) = st5;
+     st5 = tmp651 - st8;
+     st8 = tmp651 + st8;
+     c_im(input[20]) = st7;
+     st7 = tmp677 + st6;
+     st7 = st7 * K707106781[0];
+     c_im(input[4]) = st2;
+     st2 = tmp642 - st7;
+     st7 = tmp642 + st7;
+     st6 = st6 - tmp677;
+     st6 = st6 * K707106781[0];
+     c_re(input[28]) = st5;
+     st5 = tmp638 - st6;
+     st6 = tmp638 + st6;
+     st3 = st3 + st1;
+     st1 = tmp681 - st3;
+     st3 = tmp681 + st3;
+     st4 = st4 - tmp686;
+     c_re(input[12]) = st8;
+     st8 = tmp680 + st4;
+     st4 = st4 - tmp680;
+     c_re(input[20]) = st2;
+     st2 = tmp650 - st8;
+     st8 = tmp650 + st8;
+     c_re(input[4]) = st7;
+     st7 = tmp649 - st4;
+     st4 = tmp649 + st4;
+     c_im(input[28]) = st5;
+     st5 = tmp643 - st1;
+     st1 = tmp643 + st1;
+     c_im(input[12]) = st6;
+     st6 = tmp644 - st3;
+     st3 = tmp644 + st3;
+     c_re(input[22]) = st2;
+     st2 = tmp685 + tmp688;
+     c_re(input[6]) = st8;
+     st8 = tmp679 - st2;
+     st2 = tmp679 + st2;
+     c_im(input[30]) = st7;
+     st7 = tmp687 - tmp684;
+     c_im(input[14]) = st4;
+     st4 = tmp678 + st7;
+     st7 = st7 - tmp678;
+     c_re(input[30]) = st5;
+     st5 = tmp648 - st4;
+     st4 = tmp648 + st4;
+     c_re(input[14]) = st1;
+     st1 = tmp647 - st7;
+     st7 = tmp647 + st7;
+     c_im(input[22]) = st6;
+     st6 = tmp645 - st8;
+     st8 = tmp645 + st8;
+     c_im(input[6]) = st3;
+     st3 = tmp646 - st2;
+     st2 = tmp646 + st2;
+     c_re(input[18]) = st5;
+     st5 = c_re(input[31]);
+     st5 = st5 - c_re(input[15]);
+     c_re(input[2]) = st4;
+     st4 = c_im(input[7]);
+     st4 = st4 - c_im(input[23]);
+     c_im(input[26]) = st1;
+     st1 = st5 - st4;
+     st5 = st5 + st4;
+     c_im(input[10]) = st7;
+     st7 = c_re(input[7]);
+     st7 = st7 - c_re(input[23]);
+     c_re(input[26]) = st6;
+     st6 = c_im(input[31]);
+     st6 = st6 - c_im(input[15]);
+     c_re(input[10]) = st8;
+     st8 = st7 + st6;
+     st6 = st6 - st7;
+     c_im(input[18]) = st3;
+     st3 = c_im(input[3]);
+     st3 = st3 - c_im(input[19]);
+     c_im(input[2]) = st2;
+     st2 = c_re(input[3]);
+     st2 = st2 - c_re(input[19]);
+     st4 = st3 - st2;
+     st2 = st2 + st3;
+     st7 = c_re(input[27]);
+     st7 = st7 - c_re(input[11]);
+     st3 = c_im(input[27]);
+     st3 = st3 - c_im(input[11]);
+     tmp689 = st5;
+     st5 = st7 + st3;
+     st7 = st7 - st3;
+     st3 = st4 - st5;
+     st3 = st3 * K707106781[0];
+     st4 = st4 + st5;
+     st4 = st4 * K707106781[0];
+     st5 = st7 - st2;
+     st5 = st5 * K707106781[0];
+     st2 = st2 + st7;
+     st2 = st2 * K707106781[0];
+     st7 = st1 - st3;
+     tmp690 = st2;
+     st2 = st7 * K980785280[0];
+     st1 = st1 + st3;
+     st7 = st7 * K195090322[0];
+     st3 = st6 - st4;
+     tmp691 = st7;
+     st7 = st3 * K555570233[0];
+     st6 = st6 + st4;
+     st3 = st3 * K831469612[0];
+     st4 = st8 - st5;
+     tmp692 = st6;
+     st6 = st4 * K195090322[0];
+     st8 = st8 + st5;
+     st4 = st4 * K980785280[0];
+     st5 = tmp689 - tmp690;
+     tmp693 = st4;
+     st4 = st5 * K831469612[0];
+     tmp694 = st2;
+     st2 = tmp689 + tmp690;
+     st5 = st5 * K555570233[0];
+     st4 = st4 + st7;
+     st7 = st8 * K831469612[0];
+     st5 = st5 - st3;
+     st3 = st1 * K555570233[0];
+     st6 = st6 + tmp694;
+     st1 = st1 * K831469612[0];
+     tmp695 = st6;
+     st6 = tmp691 - tmp693;
+     st8 = st8 * K555570233[0];
+     st7 = st7 + st3;
+     st3 = st2 * K195090322[0];
+     st1 = st1 - st8;
+     st8 = tmp692 * K980785280[0];
+     st3 = st3 + st8;
+     st2 = st2 * K980785280[0];
+     st8 = c_re(input[9]);
+     tmp696 = st3;
+     st3 = tmp692 * K195090322[0];
+     st8 = st8 - c_re(input[25]);
+     st2 = st2 - st3;
+     st3 = c_im(input[1]);
+     st3 = st3 - c_im(input[17]);
+     tmp697 = st2;
+     st2 = st8 + st3;
+     st3 = st3 - st8;
+     st8 = c_re(input[1]);
+     st8 = st8 - c_re(input[17]);
+     tmp698 = st1;
+     st1 = c_im(input[9]);
+     st1 = st1 - c_im(input[25]);
+     tmp699 = st7;
+     st7 = st8 - st1;
+     st8 = st8 + st1;
+     st1 = c_re(input[29]);
+     st1 = st1 - c_re(input[13]);
+     tmp700 = st6;
+     st6 = c_im(input[29]);
+     st6 = st6 - c_im(input[13]);
+     tmp701 = st5;
+     st5 = st1 - st6;
+     st1 = st1 + st6;
+     st6 = c_re(input[5]);
+     st6 = st6 - c_re(input[21]);
+     tmp702 = st4;
+     st4 = c_im(input[5]);
+     st4 = st4 - c_im(input[21]);
+     tmp703 = st8;
+     st8 = st6 + st4;
+     st4 = st4 - st6;
+     st6 = st5 - st8;
+     st6 = st6 * K707106781[0];
+     st8 = st8 + st5;
+     st8 = st8 * K707106781[0];
+     st5 = st4 - st1;
+     st5 = st5 * K707106781[0];
+     st4 = st4 + st1;
+     st4 = st4 * K707106781[0];
+     st1 = st2 - st6;
+     tmp704 = st8;
+     st8 = st1 * K195090322[0];
+     st2 = st2 + st6;
+     st1 = st1 * K980785280[0];
+     st6 = st3 - st4;
+     tmp705 = st1;
+     st1 = st6 * K555570233[0];
+     st3 = st3 + st4;
+     st6 = st6 * K831469612[0];
+     st4 = st7 - st5;
+     tmp706 = st8;
+     st8 = st4 * K980785280[0];
+     st7 = st7 + st5;
+     st4 = st4 * K195090322[0];
+     st5 = tmp703 - tmp704;
+     tmp707 = st4;
+     st4 = st5 * K831469612[0];
+     tmp708 = st8;
+     st8 = tmp703 + tmp704;
+     st5 = st5 * K555570233[0];
+     st1 = st1 - st4;
+     st4 = st2 * K831469612[0];
+     tmp709 = st4;
+     st4 = st1 - tmp702;
+     tmp710 = st4;
+     st4 = st7 * K555570233[0];
+     st1 = st1 + tmp702;
+     st2 = st2 * K555570233[0];
+     st5 = st5 + st6;
+     st7 = st7 * K831469612[0];
+     st6 = st5 + tmp701;
+     tmp711 = st2;
+     st2 = st3 * K980785280[0];
+     st5 = tmp701 - st5;
+     tmp712 = st2;
+     st2 = st8 * K195090322[0];
+     tmp713 = st2;
+     st2 = tmp673 - st6;
+     st8 = st8 * K980785280[0];
+     st3 = st3 * K195090322[0];
+     st6 = tmp673 + st6;
+     c_re(input[21]) = st2;
+     st2 = tmp672 - st5;
+     st5 = tmp672 + st5;
+     c_re(input[5]) = st6;
+     st6 = tmp659 - tmp710;
+     c_im(input[29]) = st2;
+     st2 = tmp659 + tmp710;
+     c_im(input[13]) = st5;
+     st5 = tmp658 - st1;
+     st1 = tmp658 + st1;
+     c_re(input[29]) = st6;
+     st6 = tmp706 - tmp708;
+     c_re(input[13]) = st2;
+     st2 = st6 - tmp695;
+     st6 = st6 + tmp695;
+     c_im(input[21]) = st5;
+     st5 = tmp705 + tmp707;
+     c_im(input[5]) = st1;
+     st1 = st5 + tmp700;
+     st5 = tmp700 - st5;
+     tmp714 = st8;
+     st8 = tmp661 - st1;
+     st1 = tmp661 + st1;
+     c_re(input[23]) = st8;
+     st8 = tmp671 - st5;
+     st5 = tmp671 + st5;
+     c_re(input[7]) = st1;
+     st1 = tmp660 - st2;
+     st2 = tmp660 + st2;
+     c_im(input[31]) = st8;
+     st8 = tmp662 - st6;
+     st6 = tmp662 + st6;
+     st4 = tmp709 - st4;
+     c_im(input[15]) = st5;
+     st5 = st4 - tmp699;
+     st4 = st4 + tmp699;
+     st7 = tmp711 + st7;
+     c_re(input[31]) = st1;
+     st1 = st7 + tmp698;
+     st7 = tmp698 - st7;
+     c_re(input[15]) = st2;
+     st2 = tmp670 - st1;
+     st1 = tmp670 + st1;
+     c_im(input[23]) = st8;
+     st8 = tmp669 - st7;
+     st7 = tmp669 + st7;
+     c_im(input[7]) = st6;
+     st6 = tmp663 - st5;
+     st5 = tmp663 + st5;
+     c_re(input[19]) = st2;
+     st2 = tmp664 - st4;
+     st4 = tmp664 + st4;
+     c_re(input[3]) = st1;
+     st1 = tmp712 - tmp713;
+     c_im(input[27]) = st8;
+     st8 = st1 - tmp696;
+     st1 = st1 + tmp696;
+     st3 = tmp714 + st3;
+     c_im(input[11]) = st7;
+     st7 = st3 + tmp697;
+     st3 = tmp697 - st3;
+     c_re(input[27]) = st6;
+     st6 = tmp668 - st7;
+     st7 = tmp668 + st7;
+     c_re(input[11]) = st5;
+     st5 = tmp667 - st3;
+     st3 = tmp667 + st3;
+     c_im(input[19]) = st2;
+     st2 = tmp665 - st8;
+     st8 = tmp665 + st8;
+     c_im(input[3]) = st4;
+     st4 = tmp666 - st1;
+     st1 = tmp666 + st1;
+     c_re(input[17]) = st6;
+     c_re(input[1]) = st7;
+     c_im(input[25]) = st5;
+     c_im(input[9]) = st3;
+     c_re(input[25]) = st2;
+     c_re(input[9]) = st8;
+     c_im(input[17]) = st4;
+     c_im(input[1]) = st1;
+}
+
+void  PFFTW(64)(fftw_complex *input)
+{
+     PFFTW(twiddle_4)(input, PFFTW(W_64), 16);
+     PFFTW(16)(input );
+     PFFTW(16)(input + 16);
+     PFFTW(16)(input + 32);
+     PFFTW(16)(input + 48);
+}
+
+void PFFTW(128)(fftw_complex *input)
+{
+     PFFTW(twiddle_4)(input, PFFTW(W_128), 32);
+     PFFTW(32)(input );
+     PFFTW(32)(input + 32);
+     PFFTW(32)(input + 64);
+     PFFTW(32)(input + 96);
+}
+
+void PFFTW(512)(fftw_complex *input)
+{
+     PFFTW(twiddle_4)(input, PFFTW(W_512), 128);
+     PFFTW(128)(input );
+     PFFTW(128)(input + 128);
+     PFFTW(128)(input + 256);
+     PFFTW(128)(input + 384);
+}
+///////////////////////////////////////////////////////////////
+void PFFTWI(16) (fftw_complex * input) {
+     fftw_real tmp333;
+     fftw_real tmp332;
+     fftw_real tmp331;
+     fftw_real tmp330;
+     fftw_real tmp329;
+     fftw_real tmp328;
+     fftw_real tmp327;
+     fftw_real tmp326;
+     fftw_real tmp325;
+     fftw_real tmp324;
+     fftw_real tmp323;
+     fftw_real tmp322;
+     fftw_real tmp321;
+     fftw_real tmp320;
+     fftw_real tmp319;
+     fftw_real tmp318;
+     fftw_real tmp317;
+     fftw_real tmp316;
+     fftw_real tmp315;
+     fftw_real tmp314;
+     fftw_real tmp313;
+     fftw_real tmp312;
+     fftw_real tmp311;
+     fftw_real tmp310;
+     fftw_real tmp309;
+     fftw_real tmp308;
+     fftw_real tmp307;
+     fftw_real tmp306;
+     fftw_real tmp305;
+     fftw_real tmp304;
+     fftw_real tmp303;
+     fftw_real tmp302;
+     fftw_real tmp301;
+     fftw_real st1;
+     fftw_real st2;
+     fftw_real st3;
+     fftw_real st4;
+     fftw_real st5;
+     fftw_real st6;
+     fftw_real st7;
+     fftw_real st8;
+     st8 = c_re(input[4]);
+     st8 = st8 - c_re(input[12]);
+     st7 = c_im(input[0]);
+     st7 = st7 - c_im(input[8]);
+     st6 = c_re(input[0]);
+     st6 = st6 - c_re(input[8]);
+     st5 = st8 + st7;
+     st7 = st7 - st8;
+     st4 = c_im(input[4]);
+     st4 = st4 - c_im(input[12]);
+     st3 = c_re(input[0]);
+     st3 = st3 + c_re(input[8]);
+     st2 = st6 - st4;
+     st6 = st6 + st4;
+     st1 = c_re(input[4]);
+     st1 = st1 + c_re(input[12]);
+     st8 = c_im(input[0]);
+     st8 = st8 + c_im(input[8]);
+     st4 = st3 + st1;
+     st3 = st3 - st1;
+     st1 = c_im(input[4]);
+     st1 = st1 + c_im(input[12]);
+     tmp301 = st6;
+     st6 = c_re(input[2]);
+     st6 = st6 + c_re(input[10]);
+     tmp302 = st7;
+     st7 = st8 + st1;
+     st8 = st8 - st1;
+     st1 = c_re(input[6]);
+     st1 = st1 + c_re(input[14]);
+     tmp303 = st2;
+     st2 = c_im(input[2]);
+     st2 = st2 + c_im(input[10]);
+     tmp304 = st5;
+     st5 = st6 + st1;
+     st6 = st6 - st1;
+     st1 = c_im(input[6]);
+     st1 = st1 + c_im(input[14]);
+     tmp305 = st3;
+     st3 = st4 + st5;
+     st4 = st4 - st5;
+     st5 = st2 + st1;
+     st2 = st2 - st1;
+     st1 = st6 + st8;
+     tmp306 = st1;
+     st1 = st7 - st5;
+     st7 = st7 + st5;
+     st5 = tmp305 - st2;
+     st2 = tmp305 + st2;
+     st8 = st8 - st6;
+     st6 = c_re(input[6]);
+     st6 = st6 - c_re(input[14]);
+     tmp307 = st8;
+     st8 = c_im(input[2]);
+     st8 = st8 - c_im(input[10]);
+     tmp308 = st2;
+     st2 = c_re(input[2]);
+     st2 = st2 - c_re(input[10]);
+     tmp309 = st4;
+     st4 = st6 + st8;
+     st8 = st8 - st6;
+     st6 = c_im(input[6]);
+     st6 = st6 - c_im(input[14]);
+     tmp310 = st5;
+     st5 = c_re(input[1]);
+     st5 = st5 - c_re(input[9]);
+     tmp311 = st7;
+     st7 = st2 - st6;
+     st2 = st2 + st6;
+     st6 = c_im(input[5]);
+     tmp312 = st1;
+     st1 = st4 + st7;
+     st7 = st7 - st4;
+     st4 = st2 - st8;
+     st1 = st1 * K707106781[0];
+     st8 = st8 + st2;
+     st7 = st7 * K707106781[0];
+     st6 = st6 - c_im(input[13]);
+     st4 = st4 * K707106781[0];
+     st2 = tmp304 - st1;
+     st8 = st8 * K707106781[0];
+     tmp313 = st3;
+     st3 = st5 - st6;
+     st5 = st5 + st6;
+     st6 = tmp303 + st7;
+     tmp314 = st6;
+     st6 = st3 * K923879532[0];
+     st7 = tmp303 - st7;
+     st3 = st3 * K382683432[0];
+     st1 = tmp304 + st1;
+     tmp315 = st1;
+     st1 = st5 * K382683432[0];
+     tmp316 = st7;
+     st7 = tmp302 - st4;
+     st5 = st5 * K923879532[0];
+     st4 = tmp302 + st4;
+     tmp317 = st4;
+     st4 = tmp301 - st8;
+     st8 = tmp301 + st8;
+     tmp318 = st8;
+     st8 = c_re(input[5]);
+     st8 = st8 - c_re(input[13]);
+     tmp319 = st4;
+     st4 = c_im(input[1]);
+     st4 = st4 - c_im(input[9]);
+     tmp320 = st7;
+     st7 = c_re(input[3]);
+     st7 = st7 - c_re(input[11]);
+     tmp321 = st2;
+     st2 = st8 + st4;
+     st4 = st4 - st8;
+     st8 = c_im(input[7]);
+     tmp322 = st5;
+     st5 = st2 * K382683432[0];
+     st8 = st8 - c_im(input[15]);
+     st2 = st2 * K923879532[0];
+     st6 = st6 - st5;
+     st5 = st4 * K923879532[0];
+     st2 = st2 + st3;
+     st4 = st4 * K382683432[0];
+     st1 = st1 - st5;
+     st3 = st7 - st8;
+     st4 = st4 + tmp322;
+     st7 = st7 + st8;
+     st8 = st3 * K382683432[0];
+     st5 = c_re(input[7]);
+     st3 = st3 * K923879532[0];
+     st5 = st5 - c_re(input[15]);
+     tmp323 = st4;
+     st4 = st7 * K923879532[0];
+     tmp324 = st1;
+     st1 = c_im(input[3]);
+     st7 = st7 * K382683432[0];
+     st1 = st1 - c_im(input[11]);
+     tmp325 = st2;
+     st2 = c_re(input[1]);
+     st2 = st2 + c_re(input[9]);
+     tmp326 = st6;
+     st6 = st5 + st1;
+     st1 = st1 - st5;
+     st5 = c_re(input[5]);
+     tmp327 = st7;
+     st7 = st6 * K923879532[0];
+     st5 = st5 + c_re(input[13]);
+     st6 = st6 * K382683432[0];
+     st8 = st8 - st7;
+     st7 = st1 * K382683432[0];
+     st6 = st6 + st3;
+     st1 = st1 * K923879532[0];
+     st7 = st7 - st4;
+     st3 = st2 + st5;
+     st1 = st1 + tmp327;
+     st2 = st2 - st5;
+     st4 = tmp326 - st8;
+     st8 = tmp326 + st8;
+     st5 = tmp325 - st6;
+     tmp328 = st2;
+     st2 = tmp321 - st4;
+     st4 = tmp321 + st4;
+     tmp329 = st3;
+     st3 = tmp314 - st8;
+     st8 = tmp314 + st8;
+     tmp330 = st2;
+     st2 = tmp316 - st5;
+     st5 = tmp316 + st5;
+     c_re(input[9]) = st3;
+     c_re(input[1]) = st8;
+     c_re(input[5]) = st2;
+     c_re(input[13]) = st5;
+     st6 = tmp325 + st6;
+     st3 = tmp324 - st7;
+     st8 = tmp323 - st1;
+     st2 = tmp315 - st6;
+     st6 = tmp315 + st6;
+     st5 = tmp320 - st3;
+     st3 = tmp320 + st3;
+     tmp331 = st5;
+     st5 = tmp317 - st8;
+     st8 = tmp317 + st8;
+     st7 = tmp324 + st7;
+     st1 = tmp323 + st1;
+     tmp332 = st3;
+     st3 = c_im(input[1]);
+     c_im(input[1]) = st6;
+     st3 = st3 + c_im(input[9]);
+     c_im(input[9]) = st2;
+     st2 = tmp319 - st7;
+     st7 = tmp319 + st7;
+     st6 = tmp318 - st1;
+     st1 = tmp318 + st1;
+     tmp333 = st5;
+     st5 = c_im(input[5]);
+     c_im(input[5]) = st4;
+     st5 = st5 + c_im(input[13]);
+     c_im(input[13]) = tmp330;
+     st4 = st3 - st5;
+     st3 = st3 + st5;
+     st5 = c_re(input[3]);
+     c_re(input[3]) = st7;
+     st5 = st5 + c_re(input[11]);
+     c_re(input[11]) = st2;
+     st2 = c_re(input[7]);
+     c_re(input[7]) = st6;
+     st2 = st2 + c_re(input[15]);
+     c_re(input[15]) = st1;
+     st7 = st5 + st2;
+     st5 = st5 - st2;
+     st6 = c_im(input[3]);
+     c_im(input[3]) = st8;
+     st6 = st6 + c_im(input[11]);
+     c_im(input[11]) = tmp333;
+     st8 = tmp329 + st7;
+     st7 = tmp329 - st7;
+     st1 = st5 + st4;
+     st4 = st4 - st5;
+     st2 = tmp313 - st8;
+     st8 = tmp313 + st8;
+     st5 = st7 + tmp312;
+     st7 = tmp312 - st7;
+     c_re(input[8]) = st2;
+     c_re(input[0]) = st8;
+     c_im(input[4]) = st5;
+     c_im(input[12]) = st7;
+     st2 = c_im(input[7]);
+     c_im(input[7]) = tmp332;
+     st2 = st2 + c_im(input[15]);
+     c_im(input[15]) = tmp331;
+     st8 = st6 - st2;
+     st6 = st6 + st2;
+     st5 = tmp328 - st8;
+     st8 = tmp328 + st8;
+     st7 = st3 - st6;
+     st2 = st5 - st1;
+     st1 = st1 + st5;
+     st3 = st3 + st6;
+     st2 = st2 * K707106781[0];
+     st6 = st4 + st8;
+     st1 = st1 * K707106781[0];
+     st8 = st8 - st4;
+     st6 = st6 * K707106781[0];
+     st4 = tmp311 + st3;
+     st8 = st8 * K707106781[0];
+     st3 = tmp311 - st3;
+     st5 = tmp310 - st2;
+     c_im(input[0]) = st4;
+     c_im(input[8]) = st3;
+     c_re(input[10]) = st5;
+     st2 = tmp310 + st2;
+     st4 = tmp309 + st7;
+     st7 = tmp309 - st7;
+     st3 = tmp308 - st6;
+     c_re(input[2]) = st2;
+     c_re(input[12]) = st4;
+     c_re(input[4]) = st7;
+     c_re(input[6]) = st3;
+     st6 = tmp308 + st6;
+     st5 = tmp307 - st8;
+     st8 = tmp307 + st8;
+     st2 = tmp306 - st1;
+     c_re(input[14]) = st6;
+     c_im(input[14]) = st5;
+     c_im(input[6]) = st8;
+     c_im(input[10]) = st2;
+     st1 = tmp306 + st1;
+     c_im(input[2]) = st1;
+}
+
+void PFFTWI(32) (fftw_complex * input) {
+     fftw_real tmp714;
+     fftw_real tmp713;
+     fftw_real tmp712;
+     fftw_real tmp711;
+     fftw_real tmp710;
+     fftw_real tmp709;
+     fftw_real tmp708;
+     fftw_real tmp707;
+     fftw_real tmp706;
+     fftw_real tmp705;
+     fftw_real tmp704;
+     fftw_real tmp703;
+     fftw_real tmp702;
+     fftw_real tmp701;
+     fftw_real tmp700;
+     fftw_real tmp699;
+     fftw_real tmp698;
+     fftw_real tmp697;
+     fftw_real tmp696;
+     fftw_real tmp695;
+     fftw_real tmp694;
+     fftw_real tmp693;
+     fftw_real tmp692;
+     fftw_real tmp691;
+     fftw_real tmp690;
+     fftw_real tmp689;
+     fftw_real tmp688;
+     fftw_real tmp687;
+     fftw_real tmp686;
+     fftw_real tmp685;
+     fftw_real tmp684;
+     fftw_real tmp683;
+     fftw_real tmp682;
+     fftw_real tmp681;
+     fftw_real tmp680;
+     fftw_real tmp679;
+     fftw_real tmp678;
+     fftw_real tmp677;
+     fftw_real tmp676;
+     fftw_real tmp675;
+     fftw_real tmp674;
+     fftw_real tmp673;
+     fftw_real tmp672;
+     fftw_real tmp671;
+     fftw_real tmp670;
+     fftw_real tmp669;
+     fftw_real tmp668;
+     fftw_real tmp667;
+     fftw_real tmp666;
+     fftw_real tmp665;
+     fftw_real tmp664;
+     fftw_real tmp663;
+     fftw_real tmp662;
+     fftw_real tmp661;
+     fftw_real tmp660;
+     fftw_real tmp659;
+     fftw_real tmp658;
+     fftw_real tmp657;
+     fftw_real tmp656;
+     fftw_real tmp655;
+     fftw_real tmp654;
+     fftw_real tmp653;
+     fftw_real tmp652;
+     fftw_real tmp651;
+     fftw_real tmp650;
+     fftw_real tmp649;
+     fftw_real tmp648;
+     fftw_real tmp647;
+     fftw_real tmp646;
+     fftw_real tmp645;
+     fftw_real tmp644;
+     fftw_real tmp643;
+     fftw_real tmp642;
+     fftw_real tmp641;
+     fftw_real tmp640;
+     fftw_real tmp639;
+     fftw_real tmp638;
+     fftw_real tmp637;
+     fftw_real tmp636;
+     fftw_real tmp635;
+     fftw_real tmp634;
+     fftw_real tmp633;
+     fftw_real tmp632;
+     fftw_real tmp631;
+     fftw_real tmp630;
+     fftw_real tmp629;
+     fftw_real tmp628;
+     fftw_real tmp627;
+     fftw_real tmp626;
+     fftw_real tmp625;
+     fftw_real tmp624;
+     fftw_real tmp623;
+     fftw_real tmp622;
+     fftw_real tmp621;
+     fftw_real st1;
+     fftw_real st2;
+     fftw_real st3;
+     fftw_real st4;
+     fftw_real st5;
+     fftw_real st6;
+     fftw_real st7;
+     fftw_real st8;
+     st8 = c_re(input[8]);
+     st8 = st8 - c_re(input[24]);
+     st7 = c_im(input[0]);
+     st7 = st7 - c_im(input[16]);
+     st6 = st8 + st7;
+     st7 = st7 - st8;
+     st5 = c_re(input[0]);
+     st5 = st5 + c_re(input[16]);
+     st4 = c_re(input[8]);
+     st4 = st4 + c_re(input[24]);
+     st3 = st5 + st4;
+     st5 = st5 - st4;
+     st2 = c_im(input[0]);
+     st2 = st2 + c_im(input[16]);
+     st1 = c_im(input[8]);
+     st1 = st1 + c_im(input[24]);
+     st8 = st2 + st1;
+     st2 = st2 - st1;
+     st4 = c_re(input[4]);
+     st4 = st4 + c_re(input[20]);
+     st1 = c_re(input[28]);
+     st1 = st1 + c_re(input[12]);
+     tmp621 = st6;
+     st6 = st4 + st1;
+     st4 = st4 - st1;
+     st1 = st3 + st6;
+     st3 = st3 - st6;
+     st6 = st2 - st4;
+     st4 = st4 + st2;
+     st2 = c_im(input[4]);
+     st2 = st2 + c_im(input[20]);
+     tmp622 = st4;
+     st4 = c_im(input[28]);
+     st4 = st4 + c_im(input[12]);
+     tmp623 = st6;
+     st6 = st2 + st4;
+     st4 = st4 - st2;
+     st2 = st8 + st6;
+     st8 = st8 - st6;
+     st6 = st5 - st4;
+     st5 = st5 + st4;
+     st4 = c_re(input[0]);
+     st4 = st4 - c_re(input[16]);
+     tmp624 = st5;
+     st5 = c_im(input[8]);
+     st5 = st5 - c_im(input[24]);
+     tmp625 = st6;
+     st6 = st4 - st5;
+     st4 = st4 + st5;
+     st5 = c_re(input[4]);
+     st5 = st5 - c_re(input[20]);
+     tmp626 = st3;
+     st3 = c_im(input[4]);
+     st3 = st3 - c_im(input[20]);
+     tmp627 = st2;
+     st2 = st5 + st3;
+     st5 = st5 - st3;
+     st3 = c_im(input[28]);
+     st3 = st3 - c_im(input[12]);
+     tmp628 = st8;
+     st8 = c_re(input[28]);
+     st8 = st8 - c_re(input[12]);
+     tmp629 = st1;
+     st1 = st3 - st8;
+     st8 = st8 + st3;
+     st3 = st2 + st1;
+     st3 = st3 * K707106781[0];
+     st1 = st1 - st2;
+     st1 = st1 * K707106781[0];
+     st2 = st5 + st8;
+     st2 = st2 * K707106781[0];
+     st5 = st5 - st8;
+     st5 = st5 * K707106781[0];
+     st8 = st7 - st5;
+     tmp630 = st8;
+     st8 = st4 - st1;
+     tmp631 = st8;
+     st8 = tmp621 - st3;
+     tmp632 = st8;
+     st8 = st6 - st2;
+     st3 = tmp621 + st3;
+     st6 = st6 + st2;
+     st7 = st7 + st5;
+     st4 = st4 + st1;
+     st1 = c_re(input[2]);
+     st1 = st1 + c_re(input[18]);
+     st2 = c_re(input[10]);
+     st2 = st2 + c_re(input[26]);
+     st5 = st1 + st2;
+     st1 = st1 - st2;
+     st2 = c_im(input[2]);
+     st2 = st2 + c_im(input[18]);
+     tmp633 = st4;
+     st4 = c_im(input[10]);
+     st4 = st4 + c_im(input[26]);
+     tmp634 = st7;
+     st7 = st2 + st4;
+     st2 = st2 - st4;
+     st4 = st1 + st2;
+     st1 = st1 - st2;
+     st2 = c_re(input[30]);
+     st2 = st2 + c_re(input[14]);
+     tmp635 = st6;
+     st6 = c_re(input[6]);
+     st6 = st6 + c_re(input[22]);
+     tmp636 = st3;
+     st3 = st2 + st6;
+     st2 = st2 - st6;
+     st6 = st5 + st3;
+     st5 = st5 - st3;
+     st3 = tmp629 + st6;
+     st6 = tmp629 - st6;
+     tmp637 = st6;
+     st6 = tmp628 - st5;
+     st5 = st5 + tmp628;
+     tmp638 = st5;
+     st5 = c_im(input[30]);
+     st5 = st5 + c_im(input[14]);
+     tmp639 = st6;
+     st6 = c_im(input[6]);
+     st6 = st6 + c_im(input[22]);
+     tmp640 = st3;
+     st3 = st5 + st6;
+     st5 = st5 - st6;
+     st6 = st7 + st3;
+     st3 = st3 - st7;
+     st7 = st5 - st2;
+     tmp641 = st8;
+     st8 = st7 - st4;
+     st8 = st8 * K707106781[0];
+     st4 = st4 + st7;
+     st4 = st4 * K707106781[0];
+     st2 = st2 + st5;
+     st5 = st1 - st2;
+     st5 = st5 * K707106781[0];
+     st1 = st1 + st2;
+     st1 = st1 * K707106781[0];
+     st7 = tmp627 - st6;
+     st6 = tmp627 + st6;
+     st2 = tmp626 + st3;
+     st3 = tmp626 - st3;
+     tmp642 = st3;
+     st3 = tmp623 + st5;
+     st5 = tmp623 - st5;
+     tmp643 = st5;
+     st5 = tmp625 - st8;
+     st8 = tmp625 + st8;
+     tmp644 = st8;
+     st8 = tmp622 + st4;
+     st4 = tmp622 - st4;
+     tmp645 = st4;
+     st4 = tmp624 - st1;
+     st1 = tmp624 + st1;
+     tmp646 = st1;
+     st1 = c_re(input[6]);
+     st1 = st1 - c_re(input[22]);
+     tmp647 = st4;
+     st4 = c_im(input[30]);
+     st4 = st4 - c_im(input[14]);
+     tmp648 = st8;
+     st8 = st1 + st4;
+     tmp649 = st5;
+     st5 = st8 * K382683432[0];
+     st4 = st4 - st1;
+     st8 = st8 * K923879532[0];
+     st1 = c_re(input[30]);
+     tmp650 = st3;
+     st3 = st4 * K923879532[0];
+     st1 = st1 - c_re(input[14]);
+     st4 = st4 * K382683432[0];
+     tmp651 = st2;
+     st2 = c_im(input[6]);
+     st2 = st2 - c_im(input[22]);
+     tmp652 = st6;
+     st6 = st1 - st2;
+     tmp653 = st7;
+     st7 = st6 * K923879532[0];
+     st1 = st1 + st2;
+     st6 = st6 * K382683432[0];
+     st5 = st5 + st7;
+     st2 = st1 * K382683432[0];
+     st8 = st8 - st6;
+     st1 = st1 * K923879532[0];
+     st3 = st3 + st2;
+     st4 = st4 - st1;
+     st7 = c_re(input[2]);
+     st7 = st7 - c_re(input[18]);
+     st6 = c_im(input[10]);
+     st6 = st6 - c_im(input[26]);
+     st2 = st7 - st6;
+     st1 = st2 * K923879532[0];
+     st7 = st7 + st6;
+     st2 = st2 * K382683432[0];
+     st6 = c_re(input[10]);
+     tmp654 = st8;
+     st8 = st7 * K382683432[0];
+     st6 = st6 - c_re(input[26]);
+     st7 = st7 * K923879532[0];
+     tmp655 = st5;
+     st5 = c_im(input[2]);
+     st5 = st5 - c_im(input[18]);
+     tmp656 = st4;
+     st4 = st6 + st5;
+     tmp657 = st3;
+     st3 = st4 * K382683432[0];
+     st5 = st5 - st6;
+     st4 = st4 * K923879532[0];
+     st1 = st1 - st3;
+     st6 = st5 * K923879532[0];
+     st4 = st4 + st2;
+     st5 = st5 * K382683432[0];
+     st8 = st8 - st6;
+     st5 = st5 + st7;
+     st2 = st8 - tmp657;
+     st7 = tmp630 + st2;
+     st2 = tmp630 - st2;
+     st3 = tmp656 - st5;
+     st6 = tmp631 - st3;
+     st3 = tmp631 + st3;
+     tmp658 = st3;
+     st3 = st1 - tmp655;
+     tmp659 = st2;
+     st2 = tmp632 - st3;
+     st3 = tmp632 + st3;
+     tmp660 = st3;
+     st3 = tmp654 - st4;
+     tmp661 = st2;
+     st2 = tmp641 + st3;
+     st3 = tmp641 - st3;
+     st4 = st4 + tmp654;
+     tmp662 = st3;
+     st3 = tmp636 - st4;
+     st4 = tmp636 + st4;
+     st1 = st1 + tmp655;
+     tmp663 = st4;
+     st4 = tmp635 + st1;
+     st1 = tmp635 - st1;
+     st5 = st5 + tmp656;
+     tmp664 = st1;
+     st1 = tmp634 + st5;
+     st5 = tmp634 - st5;
+     st8 = st8 + tmp657;
+     tmp665 = st5;
+     st5 = tmp633 - st8;
+     st8 = tmp633 + st8;
+     tmp666 = st8;
+     st8 = c_re(input[1]);
+     st8 = st8 + c_re(input[17]);
+     tmp667 = st5;
+     st5 = c_re(input[9]);
+     st5 = st5 + c_re(input[25]);
+     tmp668 = st1;
+     st1 = st8 + st5;
+     st8 = st8 - st5;
+     st5 = c_im(input[1]);
+     st5 = st5 + c_im(input[17]);
+     tmp669 = st4;
+     st4 = c_im(input[9]);
+     st4 = st4 + c_im(input[25]);
+     tmp670 = st3;
+     st3 = st5 + st4;
+     st5 = st5 - st4;
+     st4 = c_re(input[5]);
+     st4 = st4 + c_re(input[21]);
+     tmp671 = st2;
+     st2 = c_re(input[29]);
+     st2 = st2 + c_re(input[13]);
+     tmp672 = st6;
+     st6 = st4 + st2;
+     st4 = st4 - st2;
+     st2 = st1 + st6;
+     st1 = st1 - st6;
+     st6 = st4 + st5;
+     tmp673 = st7;
+     st7 = st6 * K923879532[0];
+     st5 = st5 - st4;
+     st6 = st6 * K382683432[0];
+     st4 = c_im(input[5]);
+     tmp674 = st2;
+     st2 = st5 * K382683432[0];
+     st4 = st4 + c_im(input[21]);
+     st5 = st5 * K923879532[0];
+     tmp675 = st7;
+     st7 = c_im(input[29]);
+     st7 = st7 + c_im(input[13]);
+     tmp676 = st5;
+     st5 = st4 + st7;
+     st7 = st7 - st4;
+     st4 = st3 + st5;
+     st3 = st3 - st5;
+     st5 = st1 - st3;
+     st1 = st1 + st3;
+     st3 = st8 + st7;
+     tmp677 = st1;
+     st1 = st3 * K382683432[0];
+     st8 = st8 - st7;
+     st3 = st3 * K923879532[0];
+     st3 = st3 - st6;
+     st6 = st8 * K923879532[0];
+     st2 = st2 + st6;
+     st8 = st8 * K382683432[0];
+     st8 = st8 - tmp676;
+     st1 = tmp675 + st1;
+     st7 = c_re(input[31]);
+     st7 = st7 + c_re(input[15]);
+     st6 = c_re(input[7]);
+     st6 = st6 + c_re(input[23]);
+     tmp678 = st1;
+     st1 = st7 + st6;
+     st7 = st7 - st6;
+     st6 = c_im(input[31]);
+     st6 = st6 + c_im(input[15]);
+     tmp679 = st3;
+     st3 = c_im(input[7]);
+     st3 = st3 + c_im(input[23]);
+     tmp680 = st2;
+     st2 = st6 + st3;
+     st6 = st6 - st3;
+     st3 = c_re(input[3]);
+     st3 = st3 + c_re(input[19]);
+     tmp681 = st8;
+     st8 = c_re(input[27]);
+     st8 = st8 + c_re(input[11]);
+     tmp682 = st5;
+     st5 = st3 + st8;
+     st3 = st3 - st8;
+     st8 = st1 + st5;
+     st1 = st1 - st5;
+     st5 = st3 + st6;
+     tmp683 = st4;
+     st4 = st5 * K923879532[0];
+     st6 = st6 - st3;
+     st5 = st5 * K382683432[0];
+     st3 = tmp674 + st8;
+     tmp684 = st4;
+     st4 = st6 * K382683432[0];
+     tmp685 = st5;
+     st5 = tmp640 - st3;
+     st6 = st6 * K923879532[0];
+     st3 = tmp640 + st3;
+     st8 = tmp674 - st8;
+     c_re(input[16]) = st5;
+     st5 = st8 + tmp653;
+     st8 = tmp653 - st8;
+     c_re(input[0]) = st3;
+     st3 = c_im(input[3]);
+     st3 = st3 + c_im(input[19]);
+     c_im(input[8]) = st5;
+     st5 = c_im(input[27]);
+     st5 = st5 + c_im(input[11]);
+     c_im(input[24]) = st8;
+     st8 = st3 + st5;
+     st5 = st5 - st3;
+     st3 = st2 + st8;
+     st2 = st2 - st8;
+     st8 = st1 + st2;
+     st2 = st2 - st1;
+     st1 = st7 + st5;
+     tmp686 = st4;
+     st4 = st1 * K382683432[0];
+     st7 = st7 - st5;
+     st1 = st1 * K923879532[0];
+     st5 = tmp683 + st3;
+     tmp687 = st4;
+     st4 = st7 * K923879532[0];
+     tmp688 = st1;
+     st1 = tmp652 - st5;
+     st7 = st7 * K382683432[0];
+     st5 = tmp652 + st5;
+     st3 = st3 - tmp683;
+     c_im(input[16]) = st1;
+     st1 = tmp637 - st3;
+     st3 = tmp637 + st3;
+     c_im(input[0]) = st5;
+     st5 = tmp682 - st8;
+     st5 = st5 * K707106781[0];
+     c_re(input[24]) = st1;
+     st1 = tmp639 - st5;
+     st5 = tmp639 + st5;
+     st8 = tmp682 + st8;
+     st8 = st8 * K707106781[0];
+     c_re(input[8]) = st3;
+     st3 = tmp651 - st8;
+     st8 = tmp651 + st8;
+     c_im(input[28]) = st1;
+     st1 = st2 - tmp677;
+     st1 = st1 * K707106781[0];
+     c_im(input[12]) = st5;
+     st5 = tmp642 - st1;
+     st1 = tmp642 + st1;
+     st2 = tmp677 + st2;
+     st2 = st2 * K707106781[0];
+     c_re(input[20]) = st3;
+     st3 = tmp638 - st2;
+     st2 = tmp638 + st2;
+     st6 = st6 + st7;
+     st7 = tmp681 - st6;
+     st6 = tmp681 + st6;
+     st4 = tmp686 - st4;
+     c_re(input[4]) = st8;
+     st8 = tmp680 + st4;
+     st4 = st4 - tmp680;
+     c_re(input[28]) = st5;
+     st5 = tmp650 - st8;
+     st8 = tmp650 + st8;
+     c_re(input[12]) = st1;
+     st1 = tmp649 - st4;
+     st4 = tmp649 + st4;
+     c_im(input[20]) = st3;
+     st3 = tmp643 - st7;
+     st7 = tmp643 + st7;
+     c_im(input[4]) = st2;
+     st2 = tmp644 - st6;
+     st6 = tmp644 + st6;
+     c_im(input[22]) = st5;
+     st5 = tmp685 + tmp688;
+     c_im(input[6]) = st8;
+     st8 = tmp679 - st5;
+     st5 = tmp679 + st5;
+     c_re(input[30]) = st1;
+     st1 = tmp684 - tmp687;
+     c_re(input[14]) = st4;
+     st4 = tmp678 + st1;
+     st1 = st1 - tmp678;
+     c_im(input[30]) = st3;
+     st3 = tmp648 - st4;
+     st4 = tmp648 + st4;
+     c_im(input[14]) = st7;
+     st7 = tmp647 - st1;
+     st1 = tmp647 + st1;
+     c_re(input[22]) = st2;
+     st2 = tmp645 - st8;
+     st8 = tmp645 + st8;
+     c_re(input[6]) = st6;
+     st6 = tmp646 - st5;
+     st5 = tmp646 + st5;
+     c_im(input[18]) = st3;
+     st3 = c_re(input[31]);
+     st3 = st3 - c_re(input[15]);
+     c_im(input[2]) = st4;
+     st4 = c_im(input[7]);
+     st4 = st4 - c_im(input[23]);
+     c_re(input[26]) = st7;
+     st7 = st3 - st4;
+     st3 = st3 + st4;
+     c_re(input[10]) = st1;
+     st1 = c_re(input[7]);
+     st1 = st1 - c_re(input[23]);
+     c_im(input[26]) = st2;
+     st2 = c_im(input[31]);
+     st2 = st2 - c_im(input[15]);
+     c_im(input[10]) = st8;
+     st8 = st1 + st2;
+     st2 = st2 - st1;
+     c_re(input[18]) = st6;
+     st6 = c_re(input[3]);
+     st6 = st6 - c_re(input[19]);
+     c_re(input[2]) = st5;
+     st5 = c_im(input[3]);
+     st5 = st5 - c_im(input[19]);
+     st4 = st6 - st5;
+     st6 = st6 + st5;
+     st1 = c_re(input[27]);
+     st1 = st1 - c_re(input[11]);
+     st5 = c_im(input[27]);
+     st5 = st5 - c_im(input[11]);
+     tmp689 = st2;
+     st2 = st1 + st5;
+     st5 = st5 - st1;
+     st1 = st4 + st2;
+     st1 = st1 * K707106781[0];
+     st4 = st4 - st2;
+     st4 = st4 * K707106781[0];
+     st2 = st6 + st5;
+     st2 = st2 * K707106781[0];
+     st5 = st5 - st6;
+     st5 = st5 * K707106781[0];
+     st6 = st7 - st1;
+     tmp690 = st4;
+     st4 = st6 * K831469612[0];
+     st7 = st7 + st1;
+     st6 = st6 * K555570233[0];
+     st1 = st3 - st5;
+     tmp691 = st6;
+     st6 = st1 * K195090322[0];
+     st3 = st3 + st5;
+     st1 = st1 * K980785280[0];
+     st5 = st8 - st2;
+     tmp692 = st3;
+     st3 = st5 * K555570233[0];
+     st8 = st8 + st2;
+     st5 = st5 * K831469612[0];
+     st2 = tmp689 - tmp690;
+     tmp693 = st5;
+     st5 = st2 * K980785280[0];
+     tmp694 = st4;
+     st4 = tmp689 + tmp690;
+     st2 = st2 * K195090322[0];
+     st5 = st5 + st6;
+     st6 = st8 * K980785280[0];
+     st2 = st2 - st1;
+     st1 = st7 * K195090322[0];
+     st3 = st3 - tmp694;
+     st7 = st7 * K980785280[0];
+     tmp695 = st3;
+     st3 = tmp691 + tmp693;
+     st8 = st8 * K195090322[0];
+     st6 = st6 - st1;
+     st1 = st4 * K555570233[0];
+     st7 = st7 + st8;
+     st8 = tmp692 * K831469612[0];
+     st1 = st1 + st8;
+     st4 = st4 * K831469612[0];
+     st8 = c_re(input[1]);
+     tmp696 = st1;
+     st1 = tmp692 * K555570233[0];
+     st8 = st8 - c_re(input[17]);
+     st4 = st4 - st1;
+     st1 = c_im(input[9]);
+     st1 = st1 - c_im(input[25]);
+     tmp697 = st4;
+     st4 = st8 - st1;
+     st8 = st8 + st1;
+     st1 = c_re(input[9]);
+     st1 = st1 - c_re(input[25]);
+     tmp698 = st7;
+     st7 = c_im(input[1]);
+     st7 = st7 - c_im(input[17]);
+     tmp699 = st6;
+     st6 = st1 + st7;
+     st7 = st7 - st1;
+     st1 = c_re(input[5]);
+     st1 = st1 - c_re(input[21]);
+     tmp700 = st3;
+     st3 = c_im(input[5]);
+     st3 = st3 - c_im(input[21]);
+     tmp701 = st2;
+     st2 = st1 - st3;
+     st1 = st1 + st3;
+     st3 = c_re(input[29]);
+     st3 = st3 - c_re(input[13]);
+     tmp702 = st5;
+     st5 = c_im(input[29]);
+     st5 = st5 - c_im(input[13]);
+     tmp703 = st7;
+     st7 = st3 + st5;
+     st5 = st5 - st3;
+     st3 = st2 + st7;
+     st3 = st3 * K707106781[0];
+     st2 = st2 - st7;
+     st2 = st2 * K707106781[0];
+     st7 = st1 + st5;
+     st7 = st7 * K707106781[0];
+     st5 = st5 - st1;
+     st5 = st5 * K707106781[0];
+     st1 = st4 - st3;
+     tmp704 = st2;
+     st2 = st1 * K831469612[0];
+     st4 = st4 + st3;
+     st1 = st1 * K555570233[0];
+     st3 = st8 - st5;
+     tmp705 = st1;
+     st1 = st3 * K195090322[0];
+     st8 = st8 + st5;
+     st3 = st3 * K980785280[0];
+     st5 = st6 - st7;
+     tmp706 = st2;
+     st2 = st5 * K555570233[0];
+     st6 = st6 + st7;
+     st5 = st5 * K831469612[0];
+     st7 = tmp703 - tmp704;
+     tmp707 = st5;
+     st5 = st7 * K980785280[0];
+     tmp708 = st2;
+     st2 = tmp703 + tmp704;
+     st7 = st7 * K195090322[0];
+     st1 = st1 - st5;
+     st5 = st4 * K195090322[0];
+     tmp709 = st5;
+     st5 = st1 - tmp702;
+     tmp710 = st5;
+     st5 = st6 * K980785280[0];
+     st1 = st1 + tmp702;
+     st4 = st4 * K980785280[0];
+     st7 = st7 + st3;
+     st6 = st6 * K195090322[0];
+     st3 = st7 + tmp701;
+     tmp711 = st4;
+     st4 = st8 * K831469612[0];
+     st7 = tmp701 - st7;
+     tmp712 = st4;
+     st4 = st2 * K555570233[0];
+     tmp713 = st4;
+     st4 = tmp673 - st3;
+     st2 = st2 * K831469612[0];
+     st8 = st8 * K555570233[0];
+     st3 = tmp673 + st3;
+     c_im(input[23]) = st4;
+     st4 = tmp672 - st7;
+     st7 = tmp672 + st7;
+     c_im(input[7]) = st3;
+     st3 = tmp659 - tmp710;
+     c_re(input[31]) = st4;
+     st4 = tmp659 + tmp710;
+     c_re(input[15]) = st7;
+     st7 = tmp658 - st1;
+     st1 = tmp658 + st1;
+     c_im(input[31]) = st3;
+     st3 = tmp706 + tmp708;
+     c_im(input[15]) = st4;
+     st4 = st3 + tmp695;
+     st3 = tmp695 - st3;
+     c_re(input[23]) = st7;
+     st7 = tmp705 - tmp707;
+     c_re(input[7]) = st1;
+     st1 = st7 - tmp700;
+     st7 = st7 + tmp700;
+     tmp714 = st2;
+     st2 = tmp661 - st1;
+     st1 = tmp661 + st1;
+     c_im(input[29]) = st2;
+     st2 = tmp671 - st7;
+     st7 = tmp671 + st7;
+     c_im(input[13]) = st1;
+     st1 = tmp660 - st4;
+     st4 = tmp660 + st4;
+     c_re(input[21]) = st2;
+     st2 = tmp662 - st3;
+     st3 = tmp662 + st3;
+     st5 = tmp709 + st5;
+     c_re(input[5]) = st7;
+     st7 = st5 + tmp699;
+     st5 = tmp699 - st5;
+     st6 = tmp711 - st6;
+     c_im(input[21]) = st1;
+     st1 = st6 - tmp698;
+     st6 = st6 + tmp698;
+     c_im(input[5]) = st4;
+     st4 = tmp670 - st1;
+     st1 = tmp670 + st1;
+     c_re(input[29]) = st2;
+     st2 = tmp669 - st6;
+     st6 = tmp669 + st6;
+     c_re(input[13]) = st3;
+     st3 = tmp663 - st7;
+     st7 = tmp663 + st7;
+     c_im(input[25]) = st4;
+     st4 = tmp664 - st5;
+     st5 = tmp664 + st5;
+     c_im(input[9]) = st1;
+     st1 = tmp712 - tmp713;
+     c_re(input[17]) = st2;
+     st2 = st1 - tmp696;
+     st1 = st1 + tmp696;
+     st8 = tmp714 + st8;
+     c_re(input[1]) = st6;
+     st6 = st8 + tmp697;
+     st8 = tmp697 - st8;
+     c_im(input[17]) = st3;
+     st3 = tmp668 - st6;
+     st6 = tmp668 + st6;
+     c_im(input[1]) = st7;
+     st7 = tmp667 - st8;
+     st8 = tmp667 + st8;
+     c_re(input[25]) = st4;
+     st4 = tmp665 - st2;
+     st2 = tmp665 + st2;
+     c_re(input[9]) = st5;
+     st5 = tmp666 - st1;
+     st1 = tmp666 + st1;
+     c_im(input[19]) = st3;
+     c_im(input[3]) = st6;
+     c_re(input[27]) = st7;
+     c_re(input[11]) = st8;
+     c_im(input[27]) = st4;
+     c_im(input[11]) = st2;
+     c_re(input[19]) = st5;
+     c_re(input[3]) = st1;
+}
+
+void PFFTWI(64)(fftw_complex *input)
+{
+     PFFTWI(16)(input );
+     PFFTWI(16)(input + 16);
+     PFFTWI(16)(input + 32);
+     PFFTWI(16)(input + 48);
+     PFFTWI(twiddle_4)(input, PFFTW(W_64), 16);
+}
+
+void PFFTWI(128)(fftw_complex *input)
+{
+     PFFTWI(32)(input );
+     PFFTWI(32)(input + 32);
+     PFFTWI(32)(input + 64);
+     PFFTWI(32)(input + 96);
+     PFFTWI(twiddle_4)(input, PFFTW(W_128), 32);
+}
+
+void PFFTWI(512)(fftw_complex *input)
+{
+     PFFTWI(128)(input );
+     PFFTWI(128)(input + 128);
+     PFFTWI(128)(input + 256);
+     PFFTWI(128)(input + 384);
+     PFFTWI(twiddle_4)(input, PFFTW(W_512), 128);
+}
+
+///////////////////////////////////////////////////////////////////////////
+void  PFFTW(twiddle_4) (fftw_complex * A, const fftw_complex * W, int iostride) {
+     int i;
+     fftw_complex *inout;
+     inout = A;
+     {
+      fftw_real st1;
+      fftw_real st2;
+      fftw_real st3;
+      fftw_real st4;
+      fftw_real st5;
+      fftw_real st6;
+      fftw_real st7;
+      fftw_real st8;
+      st8 = c_re(inout[0]);
+      st8 = st8 + c_re(inout[2 * iostride]);
+      st7 = c_re(inout[iostride]);
+      st7 = st7 + c_re(inout[3 * iostride]);
+      st6 = st8 - st7;
+      st8 = st8 + st7;
+      st5 = c_im(inout[0]);
+      st5 = st5 + c_im(inout[2 * iostride]);
+      st4 = c_im(inout[iostride]);
+      st4 = st4 + c_im(inout[3 * iostride]);
+      st3 = st5 - st4;
+      st5 = st5 + st4;
+      st2 = c_im(inout[0]);
+      st2 = st2 - c_im(inout[2 * iostride]);
+      st1 = c_re(inout[iostride]);
+      st1 = st1 - c_re(inout[3 * iostride]);
+      st7 = st2 - st1;
+      st1 = st1 + st2;
+      st4 = c_re(inout[0]);
+      st4 = st4 - c_re(inout[2 * iostride]);
+      c_re(inout[2 * iostride]) = st6;
+      st6 = c_im(inout[iostride]);
+      st6 = st6 - c_im(inout[3 * iostride]);
+      c_re(inout[0]) = st8;
+      st8 = st4 - st6;
+      st4 = st4 + st6;
+      c_im(inout[0]) = st5;
+      c_im(inout[2 * iostride]) = st3;
+      c_im(inout[iostride]) = st7;
+      c_im(inout[3 * iostride]) = st1;
+      c_re(inout[3 * iostride]) = st8;
+      c_re(inout[iostride]) = st4;
+     }
+     inout = inout + 1;
+     i = iostride - 1;
+     do {
+      {
+           fftw_real st1;
+           fftw_real st2;
+           fftw_real st3;
+           fftw_real st4;
+           fftw_real st5;
+           fftw_real st6;
+           fftw_real st7;
+           fftw_real st8;
+           st8 = c_re(inout[0]);
+           st8 = st8 + c_re(inout[2 * iostride]);
+           st7 = c_re(inout[iostride]);
+           st7 = st7 + c_re(inout[3 * iostride]);
+           st6 = st8 - st7;
+           st5 = st6 * c_im(W[1]);
+           st8 = st8 + st7;
+           st6 = st6 * c_re(W[1]);
+           st4 = c_im(inout[0]);
+           st4 = st4 + c_im(inout[2 * iostride]);
+           st3 = c_im(inout[iostride]);
+           st3 = st3 + c_im(inout[3 * iostride]);
+           st2 = st4 - st3;
+           st1 = st2 * c_im(W[1]);
+           st4 = st4 + st3;
+           st2 = st2 * c_re(W[1]);
+           st2 = st2 - st5;
+           st6 = st6 + st1;
+           st7 = c_re(inout[0]);
+           st7 = st7 - c_re(inout[2 * iostride]);
+           st5 = c_im(inout[iostride]);
+           st5 = st5 - c_im(inout[3 * iostride]);
+           c_re(inout[0]) = st8;
+           st8 = st7 - st5;
+           st3 = st8 * c_re(W[0]);
+           st7 = st7 + st5;
+           st8 = st8 * c_im(W[0]);
+           st1 = c_re(inout[iostride]);
+           c_re(inout[2 * iostride]) = st6;
+           st6 = st7 * c_im(W[0]);
+           st1 = st1 - c_re(inout[3 * iostride]);
+           st7 = st7 * c_re(W[0]);
+           st5 = c_im(inout[0]);
+           st5 = st5 - c_im(inout[2 * iostride]);
+           c_im(inout[0]) = st4;
+           st4 = st1 + st5;
+           c_im(inout[2 * iostride]) = st2;
+           st2 = st4 * c_im(W[0]);
+           st5 = st5 - st1;
+           st4 = st4 * c_re(W[0]);
+           st3 = st3 - st2;
+           st1 = st5 * c_re(W[0]);
+           st5 = st5 * c_im(W[0]);
+           st4 = st4 + st8;
+           st5 = st5 + st7;
+           st1 = st1 - st6;
+           c_re(inout[3 * iostride]) = st3;
+           c_im(inout[3 * iostride]) = st4;
+           c_re(inout[iostride]) = st5;
+           c_im(inout[iostride]) = st1;
+      }
+      i = i - 1, inout = inout + 1, W = W + 2;
+     } while (i > 0);
+}
+
+void PFFTWI(twiddle_4) (fftw_complex * A, const fftw_complex * W, int iostride) {
+     int i;
+     fftw_complex *inout;
+     inout = A;
+     {
+      fftw_real st1;
+      fftw_real st2;
+      fftw_real st3;
+      fftw_real st4;
+      fftw_real st5;
+      fftw_real st6;
+      fftw_real st7;
+      fftw_real st8;
+      st8 = c_re(inout[0]);
+      st8 = st8 + c_re(inout[2 * iostride]);
+      st7 = c_re(inout[iostride]);
+      st7 = st7 + c_re(inout[3 * iostride]);
+      st6 = st8 - st7;
+      st8 = st8 + st7;
+      st5 = c_im(inout[0]);
+      st5 = st5 + c_im(inout[2 * iostride]);
+      st4 = c_im(inout[iostride]);
+      st4 = st4 + c_im(inout[3 * iostride]);
+      st3 = st5 - st4;
+      st5 = st5 + st4;
+      st2 = c_re(inout[iostride]);
+      st2 = st2 - c_re(inout[3 * iostride]);
+      st1 = c_im(inout[0]);
+      st1 = st1 - c_im(inout[2 * iostride]);
+      st7 = st2 + st1;
+      st1 = st1 - st2;
+      st4 = c_re(inout[0]);
+      st4 = st4 - c_re(inout[2 * iostride]);
+      c_re(inout[2 * iostride]) = st6;
+      st6 = c_im(inout[iostride]);
+      st6 = st6 - c_im(inout[3 * iostride]);
+      c_re(inout[0]) = st8;
+      st8 = st4 - st6;
+      st4 = st4 + st6;
+      c_im(inout[0]) = st5;
+      c_im(inout[2 * iostride]) = st3;
+      c_im(inout[iostride]) = st7;
+      c_im(inout[3 * iostride]) = st1;
+      c_re(inout[iostride]) = st8;
+      c_re(inout[3 * iostride]) = st4;
+     }
+     inout = inout + 1;
+     i = iostride - 1;
+     do {
+      {
+           fftw_real st1;
+           fftw_real st2;
+           fftw_real st3;
+           fftw_real st4;
+           fftw_real st5;
+           fftw_real st6;
+           fftw_real st7;
+           fftw_real st8;
+           st8 = c_re(inout[2 * iostride]);
+           st8 = st8 * c_re(W[1]);
+           st7 = c_im(inout[2 * iostride]);
+           st7 = st7 * c_im(W[1]);
+           st8 = st8 - st7;
+           st6 = st8 + c_re(inout[0]);
+           st8 = c_re(inout[0]) - st8;
+           st5 = c_re(inout[2 * iostride]);
+           st5 = st5 * c_im(W[1]);
+           st4 = c_im(inout[2 * iostride]);
+           st4 = st4 * c_re(W[1]);
+           st5 = st5 + st4;
+           st3 = st5 + c_im(inout[0]);
+           st5 = c_im(inout[0]) - st5;
+           st2 = c_re(inout[iostride]);
+           st2 = st2 * c_re(W[0]);
+           st1 = c_im(inout[iostride]);
+           st1 = st1 * c_im(W[0]);
+           st2 = st2 - st1;
+           st7 = c_re(inout[3 * iostride]);
+           st7 = st7 * c_re(W[0]);
+           st4 = c_im(inout[3 * iostride]);
+           st4 = st4 * c_im(W[0]);
+           st7 = st7 + st4;
+           st1 = st2 + st7;
+           st2 = st2 - st7;
+           st4 = st6 - st1;
+           st6 = st6 + st1;
+           st7 = st2 + st5;
+           st5 = st5 - st2;
+           st1 = c_re(inout[iostride]);
+           st1 = st1 * c_im(W[0]);
+           st2 = c_im(inout[iostride]);
+           st2 = st2 * c_re(W[0]);
+           st1 = st1 + st2;
+           c_re(inout[2 * iostride]) = st4;
+           st4 = c_im(inout[3 * iostride]);
+           st4 = st4 * c_re(W[0]);
+           c_re(inout[0]) = st6;
+           st6 = c_re(inout[3 * iostride]);
+           st6 = st6 * c_im(W[0]);
+           st4 = st4 - st6;
+           c_im(inout[iostride]) = st7;
+           st7 = st1 - st4;
+           st1 = st1 + st4;
+           c_im(inout[3 * iostride]) = st5;
+           st5 = st8 - st7;
+           st8 = st8 + st7;
+           st2 = st1 + st3;
+           st3 = st3 - st1;
+           c_re(inout[iostride]) = st5;
+           c_re(inout[3 * iostride]) = st8;
+           c_im(inout[0]) = st2;
+           c_im(inout[2 * iostride]) = st3;
+      }
+      i = i - 1, inout = inout + 1, W = W + 2;
+     } while (i > 0);
+}
+//////////////////////////////////////////////////////////////////////
+int PFFTW(permutation_64)(int i)
+{
+    int i1 = i % 4;
+    int i2 = i / 4;
+    if (i1 <= 2)
+       return (i1 * 16 + i2);
+    else
+       return (i1 * 16 + ((i2 + 1) % 16));
+}
+
+int PFFTW(permutation_128)(int i)
+{
+    int i1 = i % 4;
+    int i2 = i / 4;
+    if (i1 <= 2)
+       return (i1 * 32 + i2);
+    else
+       return (i1 * 32 + ((i2 + 1) % 32));
+}
+
+int PFFTW(permutation_512)(int i)
+{
+    int i1 = i % 4;
+    int i2 = i / 4;
+    if (i1 <= 2)
+       return (i1 * 128 + PFFTW(permutation_128)(i2));
+    else
+       return (i1 * 128 + PFFTW(permutation_128)((i2 + 1) % 128));
+}
+/////////////////////////////////////////////////////////////////
+void MakeFFTOrder(faacDecHandle hDecoder)
+{
+    int i;
+
+    for (i=0 ; i < 512 ; i++)
+    {
+        if (i < 64)
+            hDecoder->unscambled64[i] = PFFTW(permutation_64)(i);
+        hDecoder->unscambled512[i] = PFFTW(permutation_512)(i);
+    }
+}
diff --git a/fastfft.h b/fastfft.h
new file mode 100644
index 0000000..8ed5eae
--- /dev/null
+++ b/fastfft.h
@@ -0,0 +1,32 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * $Id: fastfft.h,v 1.3 2001/06/28 23:54:22 wmaycisco Exp $
+ */
+
+#include "transfo.h"
+
+#define PFFTW(name)  CONCAT(pfftw_, name)
+#define PFFTWI(name)  CONCAT(pfftwi_, name)
+#define CONCAT_AUX(a, b) a ## b
+#define CONCAT(a, b) CONCAT_AUX(a,b)
+#define FFTW_KONST(x) ((fftw_real) x)
+
+void PFFTW(twiddle_4)(fftw_complex *A, const fftw_complex *W, int iostride);
+void PFFTWI(twiddle_4)(fftw_complex *A, const fftw_complex *W, int iostride);
+
diff --git a/huffdec.c b/huffdec.c
new file mode 100644
index 0000000..40346e3
--- /dev/null
+++ b/huffdec.c
@@ -0,0 +1,967 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS and edited by
+Yoshiaki Oikawa (Sony Corporation),
+Mitsuyuki Hatanaka (Sony Corporation)
+in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: huffdec.c,v 1.7 2003/02/18 18:51:31 wmaycisco Exp $
+ */
+
+#include "all.h"
+#include "port.h"
+#include "bits.h"
+#include "util.h"
+
+
+// wmay - add statics
+static int extension_payload(faacDecHandle hDecoder, int cnt, byte *data);
+static int getescape(faacDecHandle hDecoder, int q);
+static void getgroup(faacDecHandle hDecoder, Info *info, byte *group);
+static int getics(faacDecHandle hDecoder, Info *info, int common_window, byte *win, byte *wshape,
+   byte *group, byte *max_sfb, int *lpflag, int *prstflag,
+   byte *cb_map, Float *coef, int *global_gain,
+   int *factors,
+   NOK_LT_PRED_STATUS *nok_ltp_status,
+  TNS_frame_info *tns);
+static int get_ics_info(faacDecHandle hDecoder, byte *win, byte *wshape,
+byte *group, byte *max_sfb,
+int *lpflag, int *prstflag,
+NOK_LT_PRED_STATUS *nok_ltp_status,
+NOK_LT_PRED_STATUS *nok_ltp_status_right,
+int stereo_flag);
+static int getmask(faacDecHandle hDecoder, Info *info, byte *group, byte max_sfb, byte *mask);
+static void get_sign_bits(faacDecHandle hDecoder, int *q, int n);
+static int huffcb(faacDecHandle hDecoder, byte *sect, int *sectbits,
+  int tot_sfb, int sfb_per_sbk, byte max_sfb);
+static int hufffac(faacDecHandle hDecoder, Info *info, byte *group, int nsect, byte *sect,
+   int global_gain, int *factors);
+static int huffspec(faacDecHandle hDecoder, Info *info, int nsect, byte *sect,
+    int *factors, Float *coef);
+
+void getfill(faacDecHandle hDecoder, byte *data)
+{
+    int cnt;
+
+    if ((cnt = faad_getbits(&hDecoder->ld, LEN_F_CNT)) == (1<<LEN_F_CNT)-1)
+        cnt +=  faad_getbits(&hDecoder->ld, LEN_F_ESC) - 1;
+
+    while (cnt > 0)
+        cnt -= extension_payload(hDecoder, cnt, data);
+}
+
+int getdata(faacDecHandle hDecoder, int *tag, int *dt_cnt, byte *data_bytes)
+{
+    int i, align_flag, cnt;
+
+    *tag = faad_getbits(&hDecoder->ld, LEN_TAG);
+    align_flag = faad_getbits(&hDecoder->ld, LEN_D_ALIGN);
+
+    if ((cnt = faad_getbits(&hDecoder->ld, LEN_D_CNT)) == (1<<LEN_D_CNT)-1)
+        cnt +=  faad_getbits(&hDecoder->ld, LEN_D_ESC);
+
+    *dt_cnt = cnt;
+
+    if (align_flag)
+        faad_byte_align(&hDecoder->ld);
+
+    for (i=0; i<cnt; i++)
+        data_bytes[i] = faad_getbits(&hDecoder->ld, LEN_BYTE);
+
+    return 0;
+}
+
+static int extension_payload(faacDecHandle hDecoder, int cnt, byte *data)
+{
+    int type, i;
+
+    /* fill bytes should not emulate any EX types below! */
+    type = faad_getbits(&hDecoder->ld, LEN_EX_TYPE);
+
+    switch(type) {
+    case EX_FILL_DATA:
+        faad_getbits(&hDecoder->ld, LEN_NIBBLE);
+        for (i=0; i<cnt-1; i++)
+            data[i] = faad_getbits(&hDecoder->ld, LEN_BYTE);
+        return cnt;
+    default:
+        faad_getbits(&hDecoder->ld, LEN_NIBBLE);
+        for (i=0; i<cnt-1; i++)
+            faad_getbits(&hDecoder->ld, LEN_BYTE);
+        return cnt;
+    }
+}
+
+/*
+ * read and decode the data for the next 1024 output samples
+ * return -1 if there was an error
+ */
+int huffdecode(faacDecHandle hDecoder, int id, MC_Info *mip, byte *win,
+               Wnd_Shape *wshape,
+               byte **cb_map, int **factors,
+               byte **group, byte *hasmask, byte **mask, byte *max_sfb,
+               int **lpflag, int **prstflag,
+               NOK_LT_PRED_STATUS **nok_ltp_status,
+               TNS_frame_info **tns, Float **coef)
+{
+    int i, tag, common_window, ch, widx, first=0, last=0;
+
+    int global_gain;  /* not used in this routine */
+    Info info;
+
+    tag = faad_getbits(&hDecoder->ld, LEN_TAG);
+
+    switch(id) {
+    case ID_SCE:
+        common_window = 0;
+        break;
+    case ID_CPE:
+        common_window = faad_get1bit(&hDecoder->ld); /* common_window */
+        break;
+    default:
+        /* CommonWarning("Unknown id"); */
+        return(-1);
+    }
+
+    if ((ch = chn_config(hDecoder, id, tag, common_window, mip)) < 0)
+        return -1;
+
+    switch(id) {
+    case ID_SCE:
+        widx = mip->ch_info[ch].widx;
+        first = ch;
+        last = ch;
+        hasmask[widx] = 0;
+        break;
+    case ID_CPE:
+        first = ch;
+        last = mip->ch_info[ch].paired_ch;
+        if (common_window) {
+            widx = mip->ch_info[ch].widx;
+            if (!get_ics_info(hDecoder, &win[widx], &wshape[widx].this_bk, group[widx],
+                &max_sfb[widx], lpflag[widx], prstflag[widx],
+                nok_ltp_status[widx],nok_ltp_status[mip->ch_info[ch].paired_ch], common_window))
+                return -1;
+
+            hasmask[widx] = getmask(hDecoder, hDecoder->winmap[win[widx]], group[widx],
+                max_sfb[widx], mask[widx]);
+        }
+        else {
+            hasmask[mip->ch_info[first].widx] = 0;
+            hasmask[mip->ch_info[last].widx] = 0;
+        }
+        break;
+    }
+
+    for (i=first; i<=last; i++) {
+        widx = mip->ch_info[i].widx;
+        SetMemory(coef[i], 0, LN2*sizeof(Float));
+
+        if(!getics(hDecoder, &info, common_window, &win[widx], &wshape[widx].this_bk,
+            group[widx], &max_sfb[widx], lpflag[widx], prstflag[widx],
+            cb_map[i], coef[i], &global_gain, factors[i], nok_ltp_status[widx],
+            tns[i]))
+            return -1;
+    }
+
+    return 0;
+}
+
+static int get_ics_info(faacDecHandle hDecoder, byte *win, byte *wshape, byte *group, byte *max_sfb,
+                 int *lpflag, int *prstflag, NOK_LT_PRED_STATUS *nok_ltp_status,
+                 NOK_LT_PRED_STATUS *nok_ltp_status_right, int stereo_flag)
+{
+    Info *info;
+    int i, j;
+
+    int max_pred_sfb = pred_max_bands(hDecoder);
+
+    faad_get1bit(&hDecoder->ld); /* reserved bit */
+    *win = (unsigned char)faad_getbits(&hDecoder->ld, LEN_WIN_SEQ);
+    *wshape = (unsigned char)faad_get1bit(&hDecoder->ld); /* window shape */
+    if ((info = hDecoder->winmap[*win]) == NULL)
+        /* CommonExit(1, "bad window code"); */
+        return 0;
+
+    /*
+     * max scale factor, scale factor grouping and prediction flags
+     */
+    prstflag[0] = 0;
+    if (info->islong) {
+        *max_sfb = (unsigned char)faad_getbits(&hDecoder->ld, LEN_MAX_SFBL);
+        group[0] = 1;
+
+        if (hDecoder->mc_info.object_type != AACLTP) {
+            if ((lpflag[0] = faad_getbits(&hDecoder->ld, LEN_PRED_PRES))) {
+                if ((prstflag[0] = faad_getbits(&hDecoder->ld, LEN_PRED_RST))) {
+                    for(i=1; i<LEN_PRED_RSTGRP+1; i++)
+                        prstflag[i] = faad_getbits(&hDecoder->ld, LEN_PRED_RST);
+                }
+                j = ( (*max_sfb < max_pred_sfb) ?
+                    *max_sfb : max_pred_sfb ) + 1;
+                for (i = 1; i < j; i++)
+                    lpflag[i] = faad_getbits(&hDecoder->ld, LEN_PRED_ENAB);
+                for ( ; i < max_pred_sfb+1; i++)
+                    lpflag[i] = 0;
+            }
+        } else { /* AAC LTP */
+            if(faad_get1bit(&hDecoder->ld))
+            {
+                nok_lt_decode(hDecoder, *max_sfb, nok_ltp_status->sbk_prediction_used,
+                    nok_ltp_status->sfb_prediction_used,
+                    &nok_ltp_status->weight,
+                    nok_ltp_status->delay);
+
+                if(stereo_flag)
+                    nok_lt_decode(hDecoder, *max_sfb, nok_ltp_status_right->sbk_prediction_used,
+                        nok_ltp_status_right->sfb_prediction_used,
+                        &nok_ltp_status_right->weight,
+                        nok_ltp_status_right->delay);
+            } else {
+                nok_ltp_status->sbk_prediction_used[0] = 0;
+                if(stereo_flag)
+                    nok_ltp_status_right->sbk_prediction_used[0] = 0;
+            }
+        }
+    } else {
+        *max_sfb = (unsigned char)faad_getbits(&hDecoder->ld, LEN_MAX_SFBS);
+        getgroup(hDecoder, info, group);
+        lpflag[0] = 0;
+        nok_ltp_status->sbk_prediction_used[0] = 0;
+        if(stereo_flag)
+            nok_ltp_status_right->sbk_prediction_used[0] = 0;
+    }
+
+    return 1;
+}
+
+static void deinterleave(int inptr[], int outptr[], int ngroups,
+                  int nsubgroups[], int ncells[], int cellsize[])
+{
+    int i, j, k, l;
+    int *start_inptr, *start_subgroup_ptr, *subgroup_ptr;
+    int cell_inc, subgroup_inc;
+
+    start_subgroup_ptr = outptr;
+
+    for (i = 0; i < ngroups; i++)
+    {
+        cell_inc = 0;
+        start_inptr = inptr;
+
+        /* Compute the increment size for the subgroup pointer */
+        subgroup_inc = 0;
+        for (j = 0; j < ncells[i]; j++) {
+            subgroup_inc += cellsize[j];
+        }
+
+        /* Perform the deinterleaving across all subgroups in a group */
+        for (j = 0; j < ncells[i]; j++)
+        {
+            subgroup_ptr = start_subgroup_ptr;
+
+            for (k = 0; k < nsubgroups[i]; k++) {
+                outptr = subgroup_ptr + cell_inc;
+                for (l = 0; l < cellsize[j]; l++) {
+                    *outptr++ = *inptr++;
+                }
+                subgroup_ptr += subgroup_inc;
+            }
+            cell_inc += cellsize[j];
+        }
+        start_subgroup_ptr += (inptr - start_inptr);
+    }
+}
+
+static void calc_gsfb_table(Info *info, byte *group)
+{
+    int group_offset;
+    int group_idx;
+    int offset;
+    int *group_offset_p;
+    int sfb,len;
+
+    /* first calc the group length*/
+    if (info->islong){
+        return;
+    } else {
+        group_offset = 0;
+        group_idx =0;
+        do  {
+            info->group_len[group_idx] = group[group_idx]-group_offset;
+            group_offset=group[group_idx];
+            group_idx++;
+        } while (group_offset<8);
+
+        info->num_groups=group_idx;
+        group_offset_p = info->bk_sfb_top;
+        offset=0;
+
+        for (group_idx=0;group_idx<info->num_groups;group_idx++){
+            len = info->group_len[group_idx];
+            for (sfb=0;sfb<info->sfb_per_sbk[group_idx];sfb++){
+                offset += info->sfb_width_128[sfb] * len;
+                *group_offset_p++ = offset;
+            }
+        }
+    }
+}
+
+static void getgroup(faacDecHandle hDecoder, Info *info, byte *group)
+{
+    int i, j, first_short;
+
+    first_short=1;
+    for (i = 0; i < info->nsbk; i++) {
+        if (info->bins_per_sbk[i] > SN2) {
+            /* non-short windows are always their own group */
+            *group++ = i+1;
+        } else {
+            /* only short-window sequences are grouped! */
+            if (first_short) {
+                /* first short window is always a new group */
+                first_short=0;
+            } else {
+                if((j = faad_get1bit(&hDecoder->ld)) == 0) {
+                    *group++ = i;
+                }
+            }
+        }
+    }
+    *group = i;
+}
+
+/*
+ * read a synthesis mask
+ *  uses EXTENDED_MS_MASK
+ *  and grouped mask
+ */
+static int getmask(faacDecHandle hDecoder, Info *info, byte *group, byte max_sfb, byte *mask)
+{
+    int b, i, mp;
+
+    mp = faad_getbits(&hDecoder->ld, LEN_MASK_PRES);
+
+    /* special EXTENDED_MS_MASK cases */
+    if(mp == 0) { /* no ms at all */
+        return 0;
+    }
+    if(mp == 2) {/* MS for whole spectrum on, mask bits set to 1 */
+        for(b = 0; b < info->nsbk; b = *group++)
+            for(i = 0; i < info->sfb_per_sbk[b]; i ++)
+                *mask++ = 1;
+            return 2;
+    }
+
+    /* otherwise get mask */
+    for(b = 0; b < info->nsbk; b = *group++){
+        for(i = 0; i < max_sfb; i ++) {
+            *mask = (byte)faad_get1bit(&hDecoder->ld);
+            mask++;
+        }
+        for( ; i < info->sfb_per_sbk[b]; i++){
+            *mask = 0;
+            mask++;
+        }
+    }
+    return 1;
+}
+
+static void clr_tns( Info *info, TNS_frame_info *tns_frame_info )
+{
+    int s;
+
+    tns_frame_info->n_subblocks = info->nsbk;
+    for (s=0; s<tns_frame_info->n_subblocks; s++)
+        tns_frame_info->info[s].n_filt = 0;
+}
+
+static int get_tns(faacDecHandle hDecoder, Info *info, TNS_frame_info *tns_frame_info)
+{
+    int f, t, top, res, res2, compress;
+    int short_flag, s;
+    int *sp, tmp, s_mask, n_mask;
+    TNSfilt *tns_filt;
+    TNSinfo *tns_info;
+    static int sgn_mask[] = { 0x2, 0x4, 0x8 };
+    static int neg_mask[] = { 0xfffc, 0xfff8, 0xfff0 };
+
+
+    short_flag = (!info->islong);
+    tns_frame_info->n_subblocks = info->nsbk;
+
+    for (s=0; s<tns_frame_info->n_subblocks; s++) {
+        tns_info = &tns_frame_info->info[s];
+
+        if (!(tns_info->n_filt = faad_getbits(&hDecoder->ld, short_flag ? 1 : 2)))
+            continue;
+
+        tns_info -> coef_res = res = faad_get1bit(&hDecoder->ld) + 3;
+        top = info->sfb_per_sbk[s];
+        tns_filt = &tns_info->filt[ 0 ];
+        for (f=tns_info->n_filt; f>0; f--)  {
+            tns_filt->stop_band = top;
+            top = tns_filt->start_band = top - faad_getbits(&hDecoder->ld, short_flag ? 4 : 6);
+            tns_filt->order = faad_getbits(&hDecoder->ld, short_flag ? 3 : 5);
+
+            if (tns_filt->order)  {
+                tns_filt->direction = faad_get1bit(&hDecoder->ld);
+                compress = faad_get1bit(&hDecoder->ld);
+
+                res2 = res - compress;
+                s_mask = sgn_mask[ res2 - 2 ];
+                n_mask = neg_mask[ res2 - 2 ];
+
+                sp = tns_filt->coef;
+                for (t=tns_filt->order; t>0; t--)  {
+                    tmp = (short)faad_getbits(&hDecoder->ld, res2);
+                    *sp++ = (tmp & s_mask) ? (short)(tmp | n_mask) : (short)tmp;
+                }
+            }
+            tns_filt++;
+        }
+    }   /* subblock loop */
+
+    return 1;
+}
+
+static void get_pulse_nc(faacDecHandle hDecoder, struct Pulse_Info *pulse_info)
+{
+    int i;
+
+    pulse_info->number_pulse = faad_getbits(&hDecoder->ld, LEN_NPULSE);
+    pulse_info->pulse_start_sfb = faad_getbits(&hDecoder->ld, LEN_PULSE_ST_SFB);
+
+    for(i = 0; i < pulse_info->number_pulse + 1; i++) {
+        pulse_info->pulse_offset[i] = faad_getbits(&hDecoder->ld, LEN_POFF);
+        pulse_info->pulse_amp[i] = faad_getbits(&hDecoder->ld, LEN_PAMP);
+    }
+}
+
+static void pulse_nc(faacDecHandle hDecoder, int *coef, struct Pulse_Info *pulse_info)
+{
+    int i, k;
+
+    k = hDecoder->only_long_info.sbk_sfb_top[0][pulse_info->pulse_start_sfb];
+
+    for(i = 0; i <= pulse_info->number_pulse; i++) {
+        k += pulse_info->pulse_offset[i];
+        if (coef[k]>0)
+            coef[k] += pulse_info->pulse_amp[i];
+        else
+            coef[k] -= pulse_info->pulse_amp[i];
+    }
+}
+
+static int getics(faacDecHandle hDecoder, Info *info, int common_window, byte *win, byte *wshape,
+           byte *group, byte *max_sfb, int *lpflag, int *prstflag,
+           byte *cb_map, Float *coef, int *global_gain,
+           int *factors,
+           NOK_LT_PRED_STATUS *nok_ltp_status,
+           TNS_frame_info *tns)
+{
+    int nsect, i, cb, top, bot, tot_sfb;
+    byte sect[ 2*(MAXBANDS+1) ];
+
+    memset(sect, 0, sizeof(sect));
+
+    /*
+    * global gain
+    */
+    *global_gain = (short)faad_getbits(&hDecoder->ld, LEN_SCL_PCM);
+
+    if (!common_window) {
+        if (!get_ics_info(hDecoder, win, wshape, group, max_sfb, lpflag, prstflag,
+            nok_ltp_status, NULL, 0))
+            return 0;
+    }
+
+    CopyMemory(info, hDecoder->winmap[*win], sizeof(Info));
+
+    /* calculate total number of sfb for this grouping */
+    if (*max_sfb == 0) {
+        tot_sfb = 0;
+    }
+    else {
+        i=0;
+        tot_sfb = info->sfb_per_sbk[0];
+        while (group[i++] < info->nsbk) {
+            tot_sfb += info->sfb_per_sbk[0];
+        }
+    }
+
+    /*
+    * section data
+    */
+    nsect = huffcb(hDecoder, sect, info->sectbits, tot_sfb, info->sfb_per_sbk[0], *max_sfb);
+    if(nsect==0 && *max_sfb>0)
+        return 0;
+
+        /* generate "linear" description from section info
+        * stored as codebook for each scalefactor band and group
+    */
+    if (nsect) {
+        bot = 0;
+        for (i=0; i<nsect; i++) {
+            cb = sect[2*i];
+            top = sect[2*i + 1];
+            for (; bot<top; bot++)
+                *cb_map++ = cb;
+            bot = top;
+        }
+    }  else {
+        for (i=0; i<MAXBANDS; i++)
+            cb_map[i] = 0;
+    }
+
+    /* calculate band offsets
+    * (because of grouping and interleaving this cannot be
+    * a constant: store it in info.bk_sfb_top)
+    */
+    calc_gsfb_table(info, group);
+
+    /*
+    * scale factor data
+    */
+    if(!hufffac(hDecoder, info, group, nsect, sect, *global_gain, factors))
+        return 0;
+
+    /*
+     *  Pulse coding
+     */
+    if ((hDecoder->pulse_info.pulse_data_present = faad_get1bit(&hDecoder->ld))) { /* pulse data present */
+        if (info->islong) {
+            get_pulse_nc(hDecoder, &hDecoder->pulse_info);
+        } else {
+            /* CommonExit(1,"Pulse data not allowed for short blocks"); */
+            return 0;
+        }
+    }
+
+    /*
+    * tns data
+    */
+    if (faad_get1bit(&hDecoder->ld)) { /* tns present */
+        get_tns(hDecoder, info, tns);
+    }
+    else {
+        clr_tns(info, tns);
+    }
+
+    if (faad_get1bit(&hDecoder->ld)) { /* gain control present */
+        /* CommonExit(1, "Gain control not implemented"); */
+        return 0;
+    }
+
+    return huffspec(hDecoder, info, nsect, sect, factors, coef);
+}
+
+/*
+ * read the codebook and boundaries
+ */
+static int huffcb(faacDecHandle hDecoder, byte *sect, int *sectbits,
+           int tot_sfb, int sfb_per_sbk, byte max_sfb)
+{
+    int nsect, n, base, bits, len;
+
+    bits = sectbits[0];
+    len = (1 << bits) - 1;
+    nsect = 0;
+
+    for(base = 0; base < tot_sfb && nsect < tot_sfb; ) {
+        *sect++ = (byte)faad_getbits(&hDecoder->ld, LEN_CB);
+
+        n = faad_getbits(&hDecoder->ld, bits);
+        while(n == len && base < tot_sfb) {
+            base += len;
+            n = faad_getbits(&hDecoder->ld, bits);
+        }
+        base += n;
+        *sect++ = base;
+        nsect++;
+
+        /* insert a zero section for regions above max_sfb for each group */
+        if ((sect[-1] % sfb_per_sbk) == max_sfb) {
+            base += (sfb_per_sbk - max_sfb);
+            *sect++ = 0;
+            *sect++ = base;
+            nsect++;
+        }
+    }
+
+    if(base != tot_sfb || nsect > tot_sfb)
+        return 0;
+
+    return nsect;
+}
+
+/*
+ * get scale factors
+ */
+static int hufffac(faacDecHandle hDecoder, Info *info, byte *group, int nsect, byte *sect,
+        int global_gain, int *factors)
+{
+    Huffscl *hcw;
+    int i, b, bb, t, n, sfb, top, fac, is_pos;
+    int factor_transmitted[MAXBANDS], *fac_trans;
+    int noise_pcm_flag = 1;
+    int noise_nrg;
+
+    /* clear array for the case of max_sfb == 0 */
+    SetMemory(factor_transmitted, 0, MAXBANDS*sizeof(int));
+    SetMemory(factors, 0, MAXBANDS*sizeof(int));
+
+    sfb = 0;
+    fac_trans = factor_transmitted;
+    for(i = 0; i < nsect; i++){
+        top = sect[1];      /* top of section in sfb */
+        t = sect[0];        /* codebook for this section */
+        sect += 2;
+        for(; sfb < top; sfb++) {
+            fac_trans[sfb] = t;
+        }
+    }
+
+    /* scale factors are dpcm relative to global gain
+    * intensity positions are dpcm relative to zero
+    */
+    fac = global_gain;
+    is_pos = 0;
+    noise_nrg = global_gain - NOISE_OFFSET;
+
+    /* get scale factors */
+    hcw = bookscl;
+    bb = 0;
+    for(b = 0; b < info->nsbk; ){
+        n = info->sfb_per_sbk[b];
+        b = *group++;
+        for(i = 0; i < n; i++){
+            switch (fac_trans[i]) {
+            case ZERO_HCB:      /* zero book */
+                break;
+            default:            /* spectral books */
+                /* decode scale factor */
+                t = decode_huff_cw_scl(hDecoder, hcw);
+                fac += t - MIDFAC;    /* 1.5 dB */
+                if(fac >= 2*TEXP || fac < 0)
+                    return 0;
+                factors[i] = fac;
+                break;
+            case BOOKSCL:       /* invalid books */
+                return 0;
+            case INTENSITY_HCB:     /* intensity books */
+            case INTENSITY_HCB2:
+                /* decode intensity position */
+                t = decode_huff_cw_scl(hDecoder, hcw);
+                is_pos += t - MIDFAC;
+                factors[i] = is_pos;
+                break;
+            case NOISE_HCB:     /* noise books */
+                /* decode noise energy */
+                if (noise_pcm_flag) {
+                    noise_pcm_flag = 0;
+                    t = faad_getbits(&hDecoder->ld, NOISE_PCM_BITS) - NOISE_PCM_OFFSET;
+                } else
+                    t = decode_huff_cw_scl(hDecoder, hcw) - MIDFAC;
+                noise_nrg += t;
+                factors[i] = noise_nrg;
+                break;
+            }
+        }
+
+        /* expand short block grouping */
+        if (!(info->islong)) {
+            for(bb++; bb < b; bb++) {
+                for (i=0; i<n; i++) {
+                    factors[i+n] = factors[i];
+                }
+                factors += n;
+            }
+        }
+        fac_trans += n;
+        factors += n;
+    }
+    return 1;
+}
+
+__inline float esc_iquant(faacDecHandle hDecoder, int q)
+{
+    if (q > 0) {
+        if (q < MAX_IQ_TBL) {
+            return((float)hDecoder->iq_exp_tbl[q]);
+        } else {
+            return((float)pow(q, 4./3.));
+        }
+    } else {
+        q = -q;
+        if (q < MAX_IQ_TBL) {
+            return((float)(-hDecoder->iq_exp_tbl[q]));
+        } else {
+            return((float)(-pow(q, 4./3.)));
+        }
+    }
+}
+
+static int huffspec(faacDecHandle hDecoder, Info *info, int nsect, byte *sect,
+             int *factors, Float *coef)
+{
+    Hcb *hcb;
+    Huffman *hcw;
+    int i, j, k, table, step, stop, bottom, top;
+    int *bands, *bandp;
+    int *quant, *qp;
+    int *tmp_spec;
+    int *quantPtr;
+    int *tmp_specPtr;
+
+    quant = AllocMemory(LN2*sizeof(int));
+    tmp_spec = AllocMemory(LN2*sizeof(int));
+
+    quantPtr = quant;
+    tmp_specPtr = tmp_spec;
+
+#ifndef _WIN32
+    SetMemory(quant, 0, LN2*sizeof(int));
+#endif
+
+    bands = info->bk_sfb_top;
+    bottom = 0;
+    k = 0;
+    bandp = bands;
+    for(i = nsect; i; i--) {
+        table = sect[0];
+        top = sect[1];
+        sect += 2;
+        if( (table == 0) || (table == NOISE_HCB) ||
+            (table == INTENSITY_HCB) || (table == INTENSITY_HCB2) ) {
+            bandp = bands+top;
+            k = bandp[-1];
+            bottom = top;
+            continue;
+        }
+        if(table < BY4BOOKS+1) {
+            step = 4;
+        } else {
+            step = 2;
+        }
+        hcb = &book[table];
+        hcw = hcb->hcw;
+        qp = quant+k;
+        for(j = bottom; j < top; j++) {
+            stop = *bandp++;
+            while(k < stop) {
+                decode_huff_cw(hDecoder, hcw, qp, hcb);
+
+                if (!hcb->signed_cb)
+                    get_sign_bits(hDecoder, qp, step);
+                if(table == ESCBOOK){
+                    qp[0] = getescape(hDecoder, qp[0]);
+                    qp[1] = getescape(hDecoder, qp[1]);
+                }
+                qp += step;
+                k += step;
+            }
+        }
+        bottom = top;
+    }
+
+    /* pulse coding reconstruction */
+    if ((info->islong) && (hDecoder->pulse_info.pulse_data_present))
+        pulse_nc(hDecoder, quant, &hDecoder->pulse_info);
+
+    if (!info->islong) {
+        deinterleave (quant,tmp_spec,
+            (short)info->num_groups,
+            info->group_len,
+            info->sfb_per_sbk,
+            info->sfb_width_128);
+
+        for (i = LN2/16 - 1; i >= 0; --i)
+        {
+            *quantPtr++ = *tmp_specPtr++; *quantPtr++ = *tmp_specPtr++;
+            *quantPtr++ = *tmp_specPtr++; *quantPtr++ = *tmp_specPtr++;
+            *quantPtr++ = *tmp_specPtr++; *quantPtr++ = *tmp_specPtr++;
+            *quantPtr++ = *tmp_specPtr++; *quantPtr++ = *tmp_specPtr++;
+            *quantPtr++ = *tmp_specPtr++; *quantPtr++ = *tmp_specPtr++;
+            *quantPtr++ = *tmp_specPtr++; *quantPtr++ = *tmp_specPtr++;
+            *quantPtr++ = *tmp_specPtr++; *quantPtr++ = *tmp_specPtr++;
+            *quantPtr++ = *tmp_specPtr++; *quantPtr++ = *tmp_specPtr++;
+        }
+    }
+
+    /* inverse quantization */
+    for (i=0; i<info->bins_per_bk; i++) {
+        coef[i] = esc_iquant(hDecoder, quant[i]);
+    }
+
+    /* rescaling */
+    {
+        int sbk, nsbk, sfb, nsfb, fac, top;
+        Float *fp, scale;
+
+        i = 0;
+        fp = coef;
+        nsbk = info->nsbk;
+        for (sbk=0; sbk<nsbk; sbk++) {
+            nsfb = info->sfb_per_sbk[sbk];
+            k=0;
+            for (sfb=0; sfb<nsfb; sfb++) {
+                top = info->sbk_sfb_top[sbk][sfb];
+                fac = factors[i++]-SF_OFFSET;
+
+                if (fac >= 0 && fac < TEXP) {
+                    scale = hDecoder->exptable[fac];
+                }
+                else {
+                    if (fac == -SF_OFFSET) {
+                        scale = 0;
+                    }
+                    else {
+                        scale = (float)pow(2.0,  0.25*fac);
+                    }
+                }
+                for ( ; k<top; k++) {
+                    *fp++ *= scale;
+                }
+            }
+        }
+    }
+
+    if (quant) FreeMemory(quant);
+    if (tmp_spec) FreeMemory(tmp_spec);
+
+    return 1;
+}
+
+
+/*
+ * initialize the Hcb structure and sort the Huffman
+ * codewords by length, shortest (most probable) first
+ */
+void hufftab(Hcb *hcb, Huffman *hcw, int dim, int signed_cb)
+{
+    hcb->dim = dim;
+    hcb->signed_cb = signed_cb;
+    hcb->hcw = hcw;
+}
+
+__inline void decode_huff_cw(faacDecHandle hDecoder, Huffman *h, int *qp, Hcb *hcb)
+{
+    int i, j;
+    unsigned long cw;
+
+    i = h->len;
+    cw = faad_getbits_fast(&hDecoder->ld, i);
+
+    while (cw != h->cw)
+    {
+        h++;
+        j = h->len-i;
+        if (j!=0) {
+            i += j;
+            while (j--)
+                cw = (cw<<1)|faad_get1bit(&hDecoder->ld);
+        }
+    }
+
+    if(hcb->dim == 4)
+    {
+        qp[0] = h->x;
+        qp[1] = h->y;
+        qp[2] = h->v;
+        qp[3] = h->w;
+    } else {
+        qp[0] = h->x;
+        qp[1] = h->y;
+    }
+}
+
+__inline int decode_huff_cw_scl(faacDecHandle hDecoder, Huffscl *h)
+{
+    int i, j;
+    long cw;
+
+    i = h->len;
+    cw = faad_getbits_fast(&hDecoder->ld, i);
+
+    while ((unsigned long)cw != h->cw)
+    {
+        h++;
+        j = h->len-i;
+        if (j!=0) {
+            i += j;
+            while (j--)
+                cw = (cw<<1)|faad_get1bit(&hDecoder->ld);
+        }
+    }
+
+    return h->scl;
+}
+
+/* get sign bits */
+static void get_sign_bits(faacDecHandle hDecoder, int *q, int n)
+{
+    int i;
+
+    for(i=0; i < n; i++)
+    {
+        if(q[i])
+        {
+            if(faad_get1bit(&hDecoder->ld) & 1)
+            {
+                /* 1 signals negative, as in 2's complement */
+                q[i] = -q[i];
+            }
+        }
+    }
+}
+
+static int getescape(faacDecHandle hDecoder, int q)
+{
+    int i, off, neg;
+
+    if(q < 0){
+        if(q != -16)
+            return q;
+        neg = 1;
+    } else{
+        if(q != +16)
+            return q;
+        neg = 0;
+    }
+
+    for(i=4;; i++){
+        if(faad_get1bit(&hDecoder->ld) == 0)
+            break;
+    }
+
+    if(i > 16){
+        off = faad_getbits(&hDecoder->ld, i-16) << 16;
+        off |= faad_getbits(&hDecoder->ld, 16);
+    } else
+        off = faad_getbits(&hDecoder->ld, i);
+
+    i = off + (1<<i);
+    if(neg)
+        i = -i;
+    return i;
+}
diff --git a/huffinit.c b/huffinit.c
new file mode 100644
index 0000000..3fe2811
--- /dev/null
+++ b/huffinit.c
@@ -0,0 +1,121 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by 
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of 
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 
+14496-1,2 and 3. This software module is an implementation of a part of one or more 
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio 
+standards free license to this software module or modifications thereof for use in 
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or 
+software products are advised that this use may infringe existing patents. 
+The original developer of this software module and his/her company, the subsequent 
+editors and their companies, and ISO/IEC have no liability for use of this software 
+module or modifications thereof in an implementation. Copyright is not released for 
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the 
+code to a third party and to inhibit third party from using the code for non 
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works." 
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+#include <math.h>
+#include "all.h"
+
+void huffbookinit(faacDecHandle hDecoder)
+{
+    int i;
+
+	hufftab(&book[1], book1, 4, HUF1SGN);
+	hufftab(&book[2], book2, 4, HUF2SGN);
+	hufftab(&book[3], book3, 4, HUF3SGN);
+	hufftab(&book[4], book4, 4, HUF4SGN);
+	hufftab(&book[5], book5, 2, HUF5SGN);
+	hufftab(&book[6], book6, 2, HUF6SGN);
+	hufftab(&book[7], book7, 2, HUF7SGN);
+	hufftab(&book[8], book8, 2, HUF8SGN);
+	hufftab(&book[9], book9, 2, HUF9SGN);
+	hufftab(&book[10], book10, 2, HUF10SGN);
+	hufftab(&book[11], book11, 2, HUF11SGN);
+
+    for(i = 0; i < TEXP; i++)
+	{
+		hDecoder->exptable[i]  = (float)pow( 2.0, 0.25*i);
+    }
+
+    for(i = 0; i < MAX_IQ_TBL; i++)
+	{
+		hDecoder->iq_exp_tbl[i] = (float)pow(i, 4./3.);
+    }
+
+    infoinit(hDecoder, &samp_rate_info[hDecoder->mc_info.sampling_rate_idx]);
+}
+
+void infoinit(faacDecHandle hDecoder, SR_Info *sip)
+{ 
+    int i, j, k, n, ws;
+    int *sfbands;
+    Info *ip;
+
+    /* long block info */
+    ip = &hDecoder->only_long_info;
+    hDecoder->win_seq_info[ONLY_LONG_WINDOW] = ip;
+    ip->islong = 1;
+    ip->nsbk = 1;
+    ip->bins_per_bk = LN2;
+    for (i=0; i<ip->nsbk; i++) {
+		ip->sfb_per_sbk[i] = sip->nsfb1024;
+		ip->sectbits[i] = LONG_SECT_BITS;
+		ip->sbk_sfb_top[i] = sip->SFbands1024;
+    }
+    ip->sfb_width_128 = NULL;
+    ip->num_groups = 1;
+    ip->group_len[0] = 1;
+    ip->group_offs[0] = 0;
+    
+    /* short block info */
+    ip = &hDecoder->eight_short_info;
+    hDecoder->win_seq_info[EIGHT_SHORT_WINDOW] = ip;
+    ip->islong = 0;
+    ip->nsbk = NSHORT;
+    ip->bins_per_bk = LN2;
+    for (i=0; i<ip->nsbk; i++) {
+		ip->sfb_per_sbk[i] = sip->nsfb128;
+		ip->sectbits[i] = SHORT_SECT_BITS;
+		ip->sbk_sfb_top[i] = sip->SFbands128;
+    }
+    /* construct sfb width table */
+    ip->sfb_width_128 = sfbwidth128;
+    for (i=0, j=0, n=sip->nsfb128; i<n; i++) {
+		k = sip->SFbands128[i];
+		sfbwidth128[i] = k - j;
+		j = k;
+    }
+    
+    /* common to long and short */
+    for (ws=0; ws<NUM_WIN_SEQ; ws++) {
+        if ((ip = hDecoder->win_seq_info[ws]) == NULL)
+			continue;
+		
+		ip->sfb_per_bk = 0;   
+		k = 0;
+		n = 0;
+        for (i=0; i<ip->nsbk; i++) {
+            /* compute bins_per_sbk */
+			ip->bins_per_sbk[i] = ip->bins_per_bk / ip->nsbk;
+			
+            /* compute sfb_per_bk */
+            ip->sfb_per_bk += ip->sfb_per_sbk[i];
+
+            /* construct default (non-interleaved) bk_sfb_top[] */
+            sfbands = ip->sbk_sfb_top[i];
+            for (j=0; j < ip->sfb_per_sbk[i]; j++)
+                ip->bk_sfb_top[j+k] = sfbands[j] + n;
+
+            n += ip->bins_per_sbk[i];
+            k += ip->sfb_per_sbk[i];
+		}	    
+    }	    
+}
diff --git a/hufftables.c b/hufftables.c
new file mode 100644
index 0000000..50ade32
--- /dev/null
+++ b/hufftables.c
@@ -0,0 +1,1432 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * $Id: hufftables.c,v 1.6 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#include "all.h"
+
+Huffman book1[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:              1 0000 */  5,    16,  1,  0,  0,  0 },
+    { /*   2:              1 0001 */  5,    17, -1,  0,  0,  0 },
+    { /*   3:              1 0010 */  5,    18,  0,  0,  0, -1 },
+    { /*   4:              1 0011 */  5,    19,  0,  1,  0,  0 },
+    { /*   5:              1 0100 */  5,    20,  0,  0,  0,  1 },
+    { /*   6:              1 0101 */  5,    21,  0,  0, -1,  0 },
+    { /*   7:              1 0110 */  5,    22,  0,  0,  1,  0 },
+    { /*   8:              1 0111 */  5,    23,  0, -1,  0,  0 },
+    { /*   9:            110 0000 */  7,    96,  1, -1,  0,  0 },
+    { /*  10:            110 0001 */  7,    97, -1,  1,  0,  0 },
+    { /*  11:            110 0010 */  7,    98,  0,  0, -1,  1 },
+    { /*  12:            110 0011 */  7,    99,  0,  1, -1,  0 },
+    { /*  13:            110 0100 */  7,   100,  0, -1,  1,  0 },
+    { /*  14:            110 0101 */  7,   101,  0,  0,  1, -1 },
+    { /*  15:            110 0110 */  7,   102,  1,  1,  0,  0 },
+    { /*  16:            110 0111 */  7,   103,  0,  0, -1, -1 },
+    { /*  17:            110 1000 */  7,   104, -1, -1,  0,  0 },
+    { /*  18:            110 1001 */  7,   105,  0, -1, -1,  0 },
+    { /*  19:            110 1010 */  7,   106,  1,  0, -1,  0 },
+    { /*  20:            110 1011 */  7,   107,  0,  1,  0, -1 },
+    { /*  21:            110 1100 */  7,   108, -1,  0,  1,  0 },
+    { /*  22:            110 1101 */  7,   109,  0,  0,  1,  1 },
+    { /*  23:            110 1110 */  7,   110,  1,  0,  1,  0 },
+    { /*  24:            110 1111 */  7,   111,  0, -1,  0,  1 },
+    { /*  25:            111 0000 */  7,   112,  0,  1,  1,  0 },
+    { /*  26:            111 0001 */  7,   113,  0,  1,  0,  1 },
+    { /*  27:            111 0010 */  7,   114, -1,  0, -1,  0 },
+    { /*  28:            111 0011 */  7,   115,  1,  0,  0,  1 },
+    { /*  29:            111 0100 */  7,   116, -1,  0,  0, -1 },
+    { /*  30:            111 0101 */  7,   117,  1,  0,  0, -1 },
+    { /*  31:            111 0110 */  7,   118, -1,  0,  0,  1 },
+    { /*  32:            111 0111 */  7,   119,  0, -1,  0, -1 },
+    { /*  33:         1 1110 0000 */  9,   480,  1,  1, -1,  0 },
+    { /*  34:         1 1110 0001 */  9,   481, -1,  1, -1,  0 },
+    { /*  35:         1 1110 0010 */  9,   482,  1, -1,  1,  0 },
+    { /*  36:         1 1110 0011 */  9,   483,  0,  1,  1, -1 },
+    { /*  37:         1 1110 0100 */  9,   484,  0,  1, -1,  1 },
+    { /*  38:         1 1110 0101 */  9,   485,  0, -1,  1,  1 },
+    { /*  39:         1 1110 0110 */  9,   486,  0, -1,  1, -1 },
+    { /*  40:         1 1110 0111 */  9,   487,  1, -1, -1,  0 },
+    { /*  41:         1 1110 1000 */  9,   488,  1,  0, -1,  1 },
+    { /*  42:         1 1110 1001 */  9,   489,  0,  1, -1, -1 },
+    { /*  43:         1 1110 1010 */  9,   490, -1,  1,  1,  0 },
+    { /*  44:         1 1110 1011 */  9,   491, -1,  0,  1, -1 },
+    { /*  45:         1 1110 1100 */  9,   492, -1, -1,  1,  0 },
+    { /*  46:         1 1110 1101 */  9,   493,  0, -1, -1,  1 },
+    { /*  47:         1 1110 1110 */  9,   494,  1, -1,  0,  1 },
+    { /*  48:         1 1110 1111 */  9,   495,  1, -1,  0, -1 },
+    { /*  49:         1 1111 0000 */  9,   496, -1,  1,  0, -1 },
+    { /*  50:         1 1111 0001 */  9,   497, -1, -1, -1,  0 },
+    { /*  51:         1 1111 0010 */  9,   498,  0, -1, -1, -1 },
+    { /*  52:         1 1111 0011 */  9,   499,  0,  1,  1,  1 },
+    { /*  53:         1 1111 0100 */  9,   500,  1,  0,  1, -1 },
+    { /*  54:         1 1111 0101 */  9,   501,  1,  1,  0,  1 },
+    { /*  55:         1 1111 0110 */  9,   502, -1,  1,  0,  1 },
+    { /*  56:         1 1111 0111 */  9,   503,  1,  1,  1,  0 },
+    { /*  57:        11 1111 0000 */ 10,  1008, -1, -1,  0,  1 },
+    { /*  58:        11 1111 0001 */ 10,  1009, -1,  0, -1, -1 },
+    { /*  59:        11 1111 0010 */ 10,  1010,  1,  1,  0, -1 },
+    { /*  60:        11 1111 0011 */ 10,  1011,  1,  0, -1, -1 },
+    { /*  61:        11 1111 0100 */ 10,  1012, -1,  0, -1,  1 },
+    { /*  62:        11 1111 0101 */ 10,  1013, -1, -1,  0, -1 },
+    { /*  63:        11 1111 0110 */ 10,  1014, -1,  0,  1,  1 },
+    { /*  64:        11 1111 0111 */ 10,  1015,  1,  0,  1,  1 },
+    { /*  65:       111 1111 0000 */ 11,  2032,  1, -1,  1, -1 },
+    { /*  66:       111 1111 0001 */ 11,  2033, -1,  1, -1,  1 },
+    { /*  67:       111 1111 0010 */ 11,  2034, -1,  1,  1, -1 },
+    { /*  68:       111 1111 0011 */ 11,  2035,  1, -1, -1,  1 },
+    { /*  69:       111 1111 0100 */ 11,  2036,  1,  1,  1,  1 },
+    { /*  70:       111 1111 0101 */ 11,  2037, -1, -1,  1,  1 },
+    { /*  71:       111 1111 0110 */ 11,  2038,  1,  1, -1, -1 },
+    { /*  72:       111 1111 0111 */ 11,  2039, -1, -1,  1, -1 },
+    { /*  73:       111 1111 1000 */ 11,  2040, -1, -1, -1, -1 },
+    { /*  74:       111 1111 1001 */ 11,  2041,  1,  1, -1,  1 },
+    { /*  75:       111 1111 1010 */ 11,  2042,  1, -1,  1,  1 },
+    { /*  76:       111 1111 1011 */ 11,  2043, -1,  1,  1,  1 },
+    { /*  77:       111 1111 1100 */ 11,  2044, -1,  1, -1, -1 },
+    { /*  78:       111 1111 1101 */ 11,  2045, -1, -1, -1,  1 },
+    { /*  79:       111 1111 1110 */ 11,  2046,  1, -1, -1, -1 },
+    { /*  80:       111 1111 1111 */ 11,  2047,  1,  1,  1, -1 }
+};
+
+Huffman book2[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                 000 */  3,     0,  0,  0,  0,  0 },
+    { /*   1:                0010 */  4,     2,  1,  0,  0,  0 },
+    { /*   2:              0 0110 */  5,     6, -1,  0,  0,  0 },
+    { /*   3:              0 0111 */  5,     7,  0,  0,  0,  1 },
+    { /*   4:              0 1000 */  5,     8,  0,  0, -1,  0 },
+    { /*   5:              0 1001 */  5,     9,  0,  0,  0, -1 },
+    { /*   6:              0 1010 */  5,    10,  0, -1,  0,  0 },
+    { /*   7:              0 1011 */  5,    11,  0,  0,  1,  0 },
+    { /*   8:              0 1100 */  5,    12,  0,  1,  0,  0 },
+    { /*   9:             01 1010 */  6,    26,  0, -1,  1,  0 },
+    { /*  10:             01 1011 */  6,    27, -1,  1,  0,  0 },
+    { /*  11:             01 1100 */  6,    28,  0,  1, -1,  0 },
+    { /*  12:             01 1101 */  6,    29,  0,  0,  1, -1 },
+    { /*  13:             01 1110 */  6,    30,  0,  1,  0, -1 },
+    { /*  14:             01 1111 */  6,    31,  0,  0, -1,  1 },
+    { /*  15:             10 0000 */  6,    32, -1,  0,  0, -1 },
+    { /*  16:             10 0001 */  6,    33,  1, -1,  0,  0 },
+    { /*  17:             10 0010 */  6,    34,  1,  0, -1,  0 },
+    { /*  18:             10 0011 */  6,    35, -1, -1,  0,  0 },
+    { /*  19:             10 0100 */  6,    36,  0,  0, -1, -1 },
+    { /*  20:             10 0101 */  6,    37,  1,  0,  1,  0 },
+    { /*  21:             10 0110 */  6,    38,  1,  0,  0,  1 },
+    { /*  22:             10 0111 */  6,    39,  0, -1,  0,  1 },
+    { /*  23:             10 1000 */  6,    40, -1,  0,  1,  0 },
+    { /*  24:             10 1001 */  6,    41,  0,  1,  0,  1 },
+    { /*  25:             10 1010 */  6,    42,  0, -1, -1,  0 },
+    { /*  26:             10 1011 */  6,    43, -1,  0,  0,  1 },
+    { /*  27:             10 1100 */  6,    44,  0, -1,  0, -1 },
+    { /*  28:             10 1101 */  6,    45, -1,  0, -1,  0 },
+    { /*  29:             10 1110 */  6,    46,  1,  1,  0,  0 },
+    { /*  30:             10 1111 */  6,    47,  0,  1,  1,  0 },
+    { /*  31:             11 0000 */  6,    48,  0,  0,  1,  1 },
+    { /*  32:             11 0001 */  6,    49,  1,  0,  0, -1 },
+    { /*  33:            110 0100 */  7,   100,  0,  1, -1,  1 },
+    { /*  34:            110 0101 */  7,   101,  1,  0, -1,  1 },
+    { /*  35:            110 0110 */  7,   102, -1,  1, -1,  0 },
+    { /*  36:            110 0111 */  7,   103,  0, -1,  1, -1 },
+    { /*  37:            110 1000 */  7,   104,  1, -1,  1,  0 },
+    { /*  38:            110 1001 */  7,   105,  1,  1,  0, -1 },
+    { /*  39:            110 1010 */  7,   106,  1,  0,  1,  1 },
+    { /*  40:            110 1011 */  7,   107, -1,  1,  1,  0 },
+    { /*  41:            110 1100 */  7,   108,  0, -1, -1,  1 },
+    { /*  42:            110 1101 */  7,   109,  1,  1,  1,  0 },
+    { /*  43:            110 1110 */  7,   110, -1,  0,  1, -1 },
+    { /*  44:            110 1111 */  7,   111, -1, -1, -1,  0 },
+    { /*  45:            111 0000 */  7,   112, -1,  0, -1,  1 },
+    { /*  46:            111 0001 */  7,   113,  1, -1, -1,  0 },
+    { /*  47:            111 0010 */  7,   114,  1,  1, -1,  0 },
+    { /*  48:           1110 0110 */  8,   230,  1, -1,  0,  1 },
+    { /*  49:           1110 0111 */  8,   231, -1,  1,  0, -1 },
+    { /*  50:           1110 1000 */  8,   232, -1, -1,  1,  0 },
+    { /*  51:           1110 1001 */  8,   233, -1,  0,  1,  1 },
+    { /*  52:           1110 1010 */  8,   234, -1, -1,  0,  1 },
+    { /*  53:           1110 1011 */  8,   235, -1, -1,  0, -1 },
+    { /*  54:           1110 1100 */  8,   236,  0, -1, -1, -1 },
+    { /*  55:           1110 1101 */  8,   237,  1,  0,  1, -1 },
+    { /*  56:           1110 1110 */  8,   238,  1,  0, -1, -1 },
+    { /*  57:           1110 1111 */  8,   239,  0,  1, -1, -1 },
+    { /*  58:           1111 0000 */  8,   240,  0,  1,  1,  1 },
+    { /*  59:           1111 0001 */  8,   241, -1,  1,  0,  1 },
+    { /*  60:           1111 0010 */  8,   242, -1,  0, -1, -1 },
+    { /*  61:           1111 0011 */  8,   243,  0,  1,  1, -1 },
+    { /*  62:           1111 0100 */  8,   244,  1, -1,  0, -1 },
+    { /*  63:           1111 0101 */  8,   245,  0, -1,  1,  1 },
+    { /*  64:           1111 0110 */  8,   246,  1,  1,  0,  1 },
+    { /*  65:           1111 0111 */  8,   247,  1, -1,  1, -1 },
+    { /*  66:           1111 1000 */  8,   248, -1,  1, -1,  1 },
+    { /*  67:         1 1111 0010 */  9,   498,  1, -1, -1,  1 },
+    { /*  68:         1 1111 0011 */  9,   499, -1, -1, -1, -1 },
+    { /*  69:         1 1111 0100 */  9,   500, -1,  1,  1, -1 },
+    { /*  70:         1 1111 0101 */  9,   501, -1,  1,  1,  1 },
+    { /*  71:         1 1111 0110 */  9,   502,  1,  1,  1,  1 },
+    { /*  72:         1 1111 0111 */  9,   503, -1, -1,  1, -1 },
+    { /*  73:         1 1111 1000 */  9,   504,  1, -1,  1,  1 },
+    { /*  74:         1 1111 1001 */  9,   505, -1,  1, -1, -1 },
+    { /*  75:         1 1111 1010 */  9,   506, -1, -1,  1,  1 },
+    { /*  76:         1 1111 1011 */  9,   507,  1,  1, -1, -1 },
+    { /*  77:         1 1111 1100 */  9,   508,  1, -1, -1, -1 },
+    { /*  78:         1 1111 1101 */  9,   509, -1, -1, -1,  1 },
+    { /*  79:         1 1111 1110 */  9,   510,  1,  1, -1,  1 },
+    { /*  80:         1 1111 1111 */  9,   511,  1,  1,  1, -1 }
+};
+
+Huffman book3[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:                1000 */  4,     8,  1,  0,  0,  0 },
+    { /*   2:                1001 */  4,     9,  0,  0,  0,  1 },
+    { /*   3:                1010 */  4,    10,  0,  1,  0,  0 },
+    { /*   4:                1011 */  4,    11,  0,  0,  1,  0 },
+    { /*   5:              1 1000 */  5,    24,  1,  1,  0,  0 },
+    { /*   6:              1 1001 */  5,    25,  0,  0,  1,  1 },
+    { /*   7:             11 0100 */  6,    52,  0,  1,  1,  0 },
+    { /*   8:             11 0101 */  6,    53,  0,  1,  0,  1 },
+    { /*   9:             11 0110 */  6,    54,  1,  0,  1,  0 },
+    { /*  10:             11 0111 */  6,    55,  0,  1,  1,  1 },
+    { /*  11:             11 1000 */  6,    56,  1,  0,  0,  1 },
+    { /*  12:             11 1001 */  6,    57,  1,  1,  1,  0 },
+    { /*  13:            111 0100 */  7,   116,  1,  1,  1,  1 },
+    { /*  14:            111 0101 */  7,   117,  1,  0,  1,  1 },
+    { /*  15:            111 0110 */  7,   118,  1,  1,  0,  1 },
+    { /*  16:           1110 1110 */  8,   238,  2,  0,  0,  0 },
+    { /*  17:           1110 1111 */  8,   239,  0,  0,  0,  2 },
+    { /*  18:           1111 0000 */  8,   240,  0,  0,  1,  2 },
+    { /*  19:           1111 0001 */  8,   241,  2,  1,  0,  0 },
+    { /*  20:           1111 0010 */  8,   242,  1,  2,  1,  0 },
+    { /*  21:         1 1110 0110 */  9,   486,  0,  0,  2,  1 },
+    { /*  22:         1 1110 0111 */  9,   487,  0,  1,  2,  1 },
+    { /*  23:         1 1110 1000 */  9,   488,  1,  2,  0,  0 },
+    { /*  24:         1 1110 1001 */  9,   489,  0,  1,  1,  2 },
+    { /*  25:         1 1110 1010 */  9,   490,  2,  1,  1,  0 },
+    { /*  26:         1 1110 1011 */  9,   491,  0,  0,  2,  0 },
+    { /*  27:         1 1110 1100 */  9,   492,  0,  2,  1,  0 },
+    { /*  28:         1 1110 1101 */  9,   493,  0,  1,  2,  0 },
+    { /*  29:         1 1110 1110 */  9,   494,  0,  2,  0,  0 },
+    { /*  30:         1 1110 1111 */  9,   495,  0,  1,  0,  2 },
+    { /*  31:         1 1111 0000 */  9,   496,  2,  0,  1,  0 },
+    { /*  32:         1 1111 0001 */  9,   497,  1,  2,  1,  1 },
+    { /*  33:         1 1111 0010 */  9,   498,  0,  2,  1,  1 },
+    { /*  34:         1 1111 0011 */  9,   499,  1,  1,  2,  0 },
+    { /*  35:         1 1111 0100 */  9,   500,  1,  1,  2,  1 },
+    { /*  36:        11 1110 1010 */ 10,  1002,  1,  2,  0,  1 },
+    { /*  37:        11 1110 1011 */ 10,  1003,  1,  0,  2,  0 },
+    { /*  38:        11 1110 1100 */ 10,  1004,  1,  0,  2,  1 },
+    { /*  39:        11 1110 1101 */ 10,  1005,  0,  2,  0,  1 },
+    { /*  40:        11 1110 1110 */ 10,  1006,  2,  1,  1,  1 },
+    { /*  41:        11 1110 1111 */ 10,  1007,  1,  1,  1,  2 },
+    { /*  42:        11 1111 0000 */ 10,  1008,  2,  1,  0,  1 },
+    { /*  43:        11 1111 0001 */ 10,  1009,  1,  0,  1,  2 },
+    { /*  44:        11 1111 0010 */ 10,  1010,  0,  0,  2,  2 },
+    { /*  45:        11 1111 0011 */ 10,  1011,  0,  1,  2,  2 },
+    { /*  46:        11 1111 0100 */ 10,  1012,  2,  2,  1,  0 },
+    { /*  47:        11 1111 0101 */ 10,  1013,  1,  2,  2,  0 },
+    { /*  48:        11 1111 0110 */ 10,  1014,  1,  0,  0,  2 },
+    { /*  49:        11 1111 0111 */ 10,  1015,  2,  0,  0,  1 },
+    { /*  50:        11 1111 1000 */ 10,  1016,  0,  2,  2,  1 },
+    { /*  51:       111 1111 0010 */ 11,  2034,  2,  2,  0,  0 },
+    { /*  52:       111 1111 0011 */ 11,  2035,  1,  2,  2,  1 },
+    { /*  53:       111 1111 0100 */ 11,  2036,  1,  1,  0,  2 },
+    { /*  54:       111 1111 0101 */ 11,  2037,  2,  0,  1,  1 },
+    { /*  55:       111 1111 0110 */ 11,  2038,  1,  1,  2,  2 },
+    { /*  56:       111 1111 0111 */ 11,  2039,  2,  2,  1,  1 },
+    { /*  57:       111 1111 1000 */ 11,  2040,  0,  2,  2,  0 },
+    { /*  58:       111 1111 1001 */ 11,  2041,  0,  2,  1,  2 },
+    { /*  59:      1111 1111 0100 */ 12,  4084,  1,  0,  2,  2 },
+    { /*  60:      1111 1111 0101 */ 12,  4085,  2,  2,  0,  1 },
+    { /*  61:      1111 1111 0110 */ 12,  4086,  2,  1,  2,  0 },
+    { /*  62:      1111 1111 0111 */ 12,  4087,  2,  2,  2,  0 },
+    { /*  63:      1111 1111 1000 */ 12,  4088,  0,  2,  2,  2 },
+    { /*  64:      1111 1111 1001 */ 12,  4089,  2,  2,  2,  1 },
+    { /*  65:      1111 1111 1010 */ 12,  4090,  2,  1,  2,  1 },
+    { /*  66:      1111 1111 1011 */ 12,  4091,  1,  2,  1,  2 },
+    { /*  67:      1111 1111 1100 */ 12,  4092,  1,  2,  2,  2 },
+    { /*  68:    1 1111 1111 1010 */ 13,  8186,  0,  2,  0,  2 },
+    { /*  69:    1 1111 1111 1011 */ 13,  8187,  2,  0,  2,  0 },
+    { /*  70:    1 1111 1111 1100 */ 13,  8188,  1,  2,  0,  2 },
+    { /*  71:   11 1111 1111 1010 */ 14, 16378,  2,  0,  2,  1 },
+    { /*  72:   11 1111 1111 1011 */ 14, 16379,  2,  1,  1,  2 },
+    { /*  73:   11 1111 1111 1100 */ 14, 16380,  2,  1,  0,  2 },
+    { /*  74:  111 1111 1111 1010 */ 15, 32762,  2,  2,  2,  2 },
+    { /*  75:  111 1111 1111 1011 */ 15, 32763,  2,  2,  1,  2 },
+    { /*  76:  111 1111 1111 1100 */ 15, 32764,  2,  1,  2,  2 },
+    { /*  77:  111 1111 1111 1101 */ 15, 32765,  2,  0,  1,  2 },
+    { /*  78:  111 1111 1111 1110 */ 15, 32766,  2,  0,  0,  2 },
+    { /*  79: 1111 1111 1111 1110 */ 16, 65534,  2,  2,  0,  2 },
+    { /*  80: 1111 1111 1111 1111 */ 16, 65535,  2,  0,  2,  2 }
+};
+
+Huffman book4[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                0000 */  4,     0,  1,  1,  1,  1 },
+    { /*   1:                0001 */  4,     1,  0,  1,  1,  1 },
+    { /*   2:                0010 */  4,     2,  1,  1,  0,  1 },
+    { /*   3:                0011 */  4,     3,  1,  1,  1,  0 },
+    { /*   4:                0100 */  4,     4,  1,  0,  1,  1 },
+    { /*   5:                0101 */  4,     5,  1,  0,  0,  0 },
+    { /*   6:                0110 */  4,     6,  1,  1,  0,  0 },
+    { /*   7:                0111 */  4,     7,  0,  0,  0,  0 },
+    { /*   8:                1000 */  4,     8,  0,  0,  1,  1 },
+    { /*   9:                1001 */  4,     9,  1,  0,  1,  0 },
+    { /*  10:              1 0100 */  5,    20,  1,  0,  0,  1 },
+    { /*  11:              1 0101 */  5,    21,  0,  1,  1,  0 },
+    { /*  12:              1 0110 */  5,    22,  0,  0,  0,  1 },
+    { /*  13:              1 0111 */  5,    23,  0,  1,  0,  1 },
+    { /*  14:              1 1000 */  5,    24,  0,  0,  1,  0 },
+    { /*  15:              1 1001 */  5,    25,  0,  1,  0,  0 },
+    { /*  16:            110 1000 */  7,   104,  2,  1,  1,  1 },
+    { /*  17:            110 1001 */  7,   105,  1,  1,  2,  1 },
+    { /*  18:            110 1010 */  7,   106,  1,  2,  1,  1 },
+    { /*  19:            110 1011 */  7,   107,  1,  1,  1,  2 },
+    { /*  20:            110 1100 */  7,   108,  2,  1,  1,  0 },
+    { /*  21:            110 1101 */  7,   109,  2,  1,  0,  1 },
+    { /*  22:            110 1110 */  7,   110,  1,  2,  1,  0 },
+    { /*  23:            110 1111 */  7,   111,  2,  0,  1,  1 },
+    { /*  24:            111 0000 */  7,   112,  0,  1,  2,  1 },
+    { /*  25:           1110 0010 */  8,   226,  0,  1,  1,  2 },
+    { /*  26:           1110 0011 */  8,   227,  1,  1,  2,  0 },
+    { /*  27:           1110 0100 */  8,   228,  0,  2,  1,  1 },
+    { /*  28:           1110 0101 */  8,   229,  1,  0,  1,  2 },
+    { /*  29:           1110 0110 */  8,   230,  1,  2,  0,  1 },
+    { /*  30:           1110 0111 */  8,   231,  1,  1,  0,  2 },
+    { /*  31:           1110 1000 */  8,   232,  1,  0,  2,  1 },
+    { /*  32:           1110 1001 */  8,   233,  2,  1,  0,  0 },
+    { /*  33:           1110 1010 */  8,   234,  2,  0,  1,  0 },
+    { /*  34:           1110 1011 */  8,   235,  1,  2,  0,  0 },
+    { /*  35:           1110 1100 */  8,   236,  2,  0,  0,  1 },
+    { /*  36:           1110 1101 */  8,   237,  0,  1,  0,  2 },
+    { /*  37:           1110 1110 */  8,   238,  0,  2,  1,  0 },
+    { /*  38:           1110 1111 */  8,   239,  0,  0,  1,  2 },
+    { /*  39:           1111 0000 */  8,   240,  0,  1,  2,  0 },
+    { /*  40:           1111 0001 */  8,   241,  0,  2,  0,  1 },
+    { /*  41:           1111 0010 */  8,   242,  1,  0,  0,  2 },
+    { /*  42:           1111 0011 */  8,   243,  0,  0,  2,  1 },
+    { /*  43:           1111 0100 */  8,   244,  1,  0,  2,  0 },
+    { /*  44:           1111 0101 */  8,   245,  2,  0,  0,  0 },
+    { /*  45:           1111 0110 */  8,   246,  0,  0,  0,  2 },
+    { /*  46:         1 1110 1110 */  9,   494,  0,  2,  0,  0 },
+    { /*  47:         1 1110 1111 */  9,   495,  0,  0,  2,  0 },
+    { /*  48:         1 1111 0000 */  9,   496,  1,  2,  2,  1 },
+    { /*  49:         1 1111 0001 */  9,   497,  2,  2,  1,  1 },
+    { /*  50:         1 1111 0010 */  9,   498,  2,  1,  2,  1 },
+    { /*  51:         1 1111 0011 */  9,   499,  1,  1,  2,  2 },
+    { /*  52:         1 1111 0100 */  9,   500,  1,  2,  1,  2 },
+    { /*  53:         1 1111 0101 */  9,   501,  2,  1,  1,  2 },
+    { /*  54:        11 1110 1100 */ 10,  1004,  1,  2,  2,  0 },
+    { /*  55:        11 1110 1101 */ 10,  1005,  2,  2,  1,  0 },
+    { /*  56:        11 1110 1110 */ 10,  1006,  2,  1,  2,  0 },
+    { /*  57:        11 1110 1111 */ 10,  1007,  0,  2,  2,  1 },
+    { /*  58:        11 1111 0000 */ 10,  1008,  0,  1,  2,  2 },
+    { /*  59:        11 1111 0001 */ 10,  1009,  2,  2,  0,  1 },
+    { /*  60:        11 1111 0010 */ 10,  1010,  0,  2,  1,  2 },
+    { /*  61:        11 1111 0011 */ 10,  1011,  2,  0,  2,  1 },
+    { /*  62:        11 1111 0100 */ 10,  1012,  1,  0,  2,  2 },
+    { /*  63:        11 1111 0101 */ 10,  1013,  2,  2,  2,  1 },
+    { /*  64:        11 1111 0110 */ 10,  1014,  1,  2,  0,  2 },
+    { /*  65:        11 1111 0111 */ 10,  1015,  2,  0,  1,  2 },
+    { /*  66:        11 1111 1000 */ 10,  1016,  2,  1,  0,  2 },
+    { /*  67:        11 1111 1001 */ 10,  1017,  1,  2,  2,  2 },
+    { /*  68:       111 1111 0100 */ 11,  2036,  2,  1,  2,  2 },
+    { /*  69:       111 1111 0101 */ 11,  2037,  2,  2,  1,  2 },
+    { /*  70:       111 1111 0110 */ 11,  2038,  0,  2,  2,  0 },
+    { /*  71:       111 1111 0111 */ 11,  2039,  2,  2,  0,  0 },
+    { /*  72:       111 1111 1000 */ 11,  2040,  0,  0,  2,  2 },
+    { /*  73:       111 1111 1001 */ 11,  2041,  2,  0,  2,  0 },
+    { /*  74:       111 1111 1010 */ 11,  2042,  0,  2,  0,  2 },
+    { /*  75:       111 1111 1011 */ 11,  2043,  2,  0,  0,  2 },
+    { /*  76:       111 1111 1100 */ 11,  2044,  2,  2,  2,  2 },
+    { /*  77:       111 1111 1101 */ 11,  2045,  0,  2,  2,  2 },
+    { /*  78:       111 1111 1110 */ 11,  2046,  2,  2,  2,  0 },
+    { /*  79:      1111 1111 1110 */ 12,  4094,  2,  2,  0,  2 },
+    { /*  80:      1111 1111 1111 */ 12,  4095,  2,  0,  2,  2 }
+};
+
+Huffman book5[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:                1000 */  4,     8, -1,  0,  0,  0 },
+    { /*   2:                1001 */  4,     9,  1,  0,  0,  0 },
+    { /*   3:                1010 */  4,    10,  0,  1,  0,  0 },
+    { /*   4:                1011 */  4,    11,  0, -1,  0,  0 },
+    { /*   5:              1 1000 */  5,    24,  1, -1,  0,  0 },
+    { /*   6:              1 1001 */  5,    25, -1,  1,  0,  0 },
+    { /*   7:              1 1010 */  5,    26, -1, -1,  0,  0 },
+    { /*   8:              1 1011 */  5,    27,  1,  1,  0,  0 },
+    { /*   9:            111 0000 */  7,   112, -2,  0,  0,  0 },
+    { /*  10:            111 0001 */  7,   113,  0,  2,  0,  0 },
+    { /*  11:            111 0010 */  7,   114,  2,  0,  0,  0 },
+    { /*  12:            111 0011 */  7,   115,  0, -2,  0,  0 },
+    { /*  13:           1110 1000 */  8,   232, -2, -1,  0,  0 },
+    { /*  14:           1110 1001 */  8,   233,  2,  1,  0,  0 },
+    { /*  15:           1110 1010 */  8,   234, -1, -2,  0,  0 },
+    { /*  16:           1110 1011 */  8,   235,  1,  2,  0,  0 },
+    { /*  17:           1110 1100 */  8,   236, -2,  1,  0,  0 },
+    { /*  18:           1110 1101 */  8,   237,  2, -1,  0,  0 },
+    { /*  19:           1110 1110 */  8,   238, -1,  2,  0,  0 },
+    { /*  20:           1110 1111 */  8,   239,  1, -2,  0,  0 },
+    { /*  21:           1111 0000 */  8,   240, -3,  0,  0,  0 },
+    { /*  22:           1111 0001 */  8,   241,  3,  0,  0,  0 },
+    { /*  23:           1111 0010 */  8,   242,  0, -3,  0,  0 },
+    { /*  24:           1111 0011 */  8,   243,  0,  3,  0,  0 },
+    { /*  25:         1 1110 1000 */  9,   488, -3, -1,  0,  0 },
+    { /*  26:         1 1110 1001 */  9,   489,  1,  3,  0,  0 },
+    { /*  27:         1 1110 1010 */  9,   490,  3,  1,  0,  0 },
+    { /*  28:         1 1110 1011 */  9,   491, -1, -3,  0,  0 },
+    { /*  29:         1 1110 1100 */  9,   492, -3,  1,  0,  0 },
+    { /*  30:         1 1110 1101 */  9,   493,  3, -1,  0,  0 },
+    { /*  31:         1 1110 1110 */  9,   494,  1, -3,  0,  0 },
+    { /*  32:         1 1110 1111 */  9,   495, -1,  3,  0,  0 },
+    { /*  33:         1 1111 0000 */  9,   496, -2,  2,  0,  0 },
+    { /*  34:         1 1111 0001 */  9,   497,  2,  2,  0,  0 },
+    { /*  35:         1 1111 0010 */  9,   498, -2, -2,  0,  0 },
+    { /*  36:         1 1111 0011 */  9,   499,  2, -2,  0,  0 },
+    { /*  37:        11 1110 1000 */ 10,  1000, -3, -2,  0,  0 },
+    { /*  38:        11 1110 1001 */ 10,  1001,  3, -2,  0,  0 },
+    { /*  39:        11 1110 1010 */ 10,  1002, -2,  3,  0,  0 },
+    { /*  40:        11 1110 1011 */ 10,  1003,  2, -3,  0,  0 },
+    { /*  41:        11 1110 1100 */ 10,  1004,  3,  2,  0,  0 },
+    { /*  42:        11 1110 1101 */ 10,  1005,  2,  3,  0,  0 },
+    { /*  43:        11 1110 1110 */ 10,  1006, -3,  2,  0,  0 },
+    { /*  44:        11 1110 1111 */ 10,  1007, -2, -3,  0,  0 },
+    { /*  45:        11 1111 0000 */ 10,  1008,  0, -4,  0,  0 },
+    { /*  46:        11 1111 0001 */ 10,  1009, -4,  0,  0,  0 },
+    { /*  47:        11 1111 0010 */ 10,  1010,  4,  1,  0,  0 },
+    { /*  48:        11 1111 0011 */ 10,  1011,  4,  0,  0,  0 },
+    { /*  49:       111 1110 1000 */ 11,  2024, -4, -1,  0,  0 },
+    { /*  50:       111 1110 1001 */ 11,  2025,  0,  4,  0,  0 },
+    { /*  51:       111 1110 1010 */ 11,  2026,  4, -1,  0,  0 },
+    { /*  52:       111 1110 1011 */ 11,  2027, -1, -4,  0,  0 },
+    { /*  53:       111 1110 1100 */ 11,  2028,  1,  4,  0,  0 },
+    { /*  54:       111 1110 1101 */ 11,  2029, -1,  4,  0,  0 },
+    { /*  55:       111 1110 1110 */ 11,  2030, -4,  1,  0,  0 },
+    { /*  56:       111 1110 1111 */ 11,  2031,  1, -4,  0,  0 },
+    { /*  57:       111 1111 0000 */ 11,  2032,  3, -3,  0,  0 },
+    { /*  58:       111 1111 0001 */ 11,  2033, -3, -3,  0,  0 },
+    { /*  59:       111 1111 0010 */ 11,  2034, -3,  3,  0,  0 },
+    { /*  60:       111 1111 0011 */ 11,  2035, -2,  4,  0,  0 },
+    { /*  61:       111 1111 0100 */ 11,  2036, -4, -2,  0,  0 },
+    { /*  62:       111 1111 0101 */ 11,  2037,  4,  2,  0,  0 },
+    { /*  63:       111 1111 0110 */ 11,  2038,  2, -4,  0,  0 },
+    { /*  64:       111 1111 0111 */ 11,  2039,  2,  4,  0,  0 },
+    { /*  65:       111 1111 1000 */ 11,  2040,  3,  3,  0,  0 },
+    { /*  66:       111 1111 1001 */ 11,  2041, -4,  2,  0,  0 },
+    { /*  67:      1111 1111 0100 */ 12,  4084, -2, -4,  0,  0 },
+    { /*  68:      1111 1111 0101 */ 12,  4085,  4, -2,  0,  0 },
+    { /*  69:      1111 1111 0110 */ 12,  4086,  3, -4,  0,  0 },
+    { /*  70:      1111 1111 0111 */ 12,  4087, -4, -3,  0,  0 },
+    { /*  71:      1111 1111 1000 */ 12,  4088, -4,  3,  0,  0 },
+    { /*  72:      1111 1111 1001 */ 12,  4089,  3,  4,  0,  0 },
+    { /*  73:      1111 1111 1010 */ 12,  4090, -3,  4,  0,  0 },
+    { /*  74:      1111 1111 1011 */ 12,  4091,  4,  3,  0,  0 },
+    { /*  75:      1111 1111 1100 */ 12,  4092,  4, -3,  0,  0 },
+    { /*  76:      1111 1111 1101 */ 12,  4093, -3, -4,  0,  0 },
+    { /*  77:    1 1111 1111 1100 */ 13,  8188,  4, -4,  0,  0 },
+    { /*  78:    1 1111 1111 1101 */ 13,  8189, -4,  4,  0,  0 },
+    { /*  79:    1 1111 1111 1110 */ 13,  8190,  4,  4,  0,  0 },
+    { /*  80:    1 1111 1111 1111 */ 13,  8191, -4, -4,  0,  0 }
+};
+
+Huffman book6[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                0000 */  4,     0,  0,  0,  0,  0 },
+    { /*   1:                0001 */  4,     1,  1,  0,  0,  0 },
+    { /*   2:                0010 */  4,     2,  0, -1,  0,  0 },
+    { /*   3:                0011 */  4,     3,  0,  1,  0,  0 },
+    { /*   4:                0100 */  4,     4, -1,  0,  0,  0 },
+    { /*   5:                0101 */  4,     5,  1,  1,  0,  0 },
+    { /*   6:                0110 */  4,     6, -1,  1,  0,  0 },
+    { /*   7:                0111 */  4,     7,  1, -1,  0,  0 },
+    { /*   8:                1000 */  4,     8, -1, -1,  0,  0 },
+    { /*   9:             10 0100 */  6,    36,  2, -1,  0,  0 },
+    { /*  10:             10 0101 */  6,    37,  2,  1,  0,  0 },
+    { /*  11:             10 0110 */  6,    38, -2,  1,  0,  0 },
+    { /*  12:             10 0111 */  6,    39, -2, -1,  0,  0 },
+    { /*  13:             10 1000 */  6,    40, -2,  0,  0,  0 },
+    { /*  14:             10 1001 */  6,    41, -1,  2,  0,  0 },
+    { /*  15:             10 1010 */  6,    42,  2,  0,  0,  0 },
+    { /*  16:             10 1011 */  6,    43,  1, -2,  0,  0 },
+    { /*  17:             10 1100 */  6,    44,  1,  2,  0,  0 },
+    { /*  18:             10 1101 */  6,    45,  0, -2,  0,  0 },
+    { /*  19:             10 1110 */  6,    46, -1, -2,  0,  0 },
+    { /*  20:             10 1111 */  6,    47,  0,  2,  0,  0 },
+    { /*  21:             11 0000 */  6,    48,  2, -2,  0,  0 },
+    { /*  22:             11 0001 */  6,    49, -2,  2,  0,  0 },
+    { /*  23:             11 0010 */  6,    50, -2, -2,  0,  0 },
+    { /*  24:             11 0011 */  6,    51,  2,  2,  0,  0 },
+    { /*  25:            110 1000 */  7,   104, -3,  1,  0,  0 },
+    { /*  26:            110 1001 */  7,   105,  3,  1,  0,  0 },
+    { /*  27:            110 1010 */  7,   106,  3, -1,  0,  0 },
+    { /*  28:            110 1011 */  7,   107, -1,  3,  0,  0 },
+    { /*  29:            110 1100 */  7,   108, -3, -1,  0,  0 },
+    { /*  30:            110 1101 */  7,   109,  1,  3,  0,  0 },
+    { /*  31:            110 1110 */  7,   110,  1, -3,  0,  0 },
+    { /*  32:            110 1111 */  7,   111, -1, -3,  0,  0 },
+    { /*  33:            111 0000 */  7,   112,  3,  0,  0,  0 },
+    { /*  34:            111 0001 */  7,   113, -3,  0,  0,  0 },
+    { /*  35:            111 0010 */  7,   114,  0, -3,  0,  0 },
+    { /*  36:            111 0011 */  7,   115,  0,  3,  0,  0 },
+    { /*  37:            111 0100 */  7,   116,  3,  2,  0,  0 },
+    { /*  38:           1110 1010 */  8,   234, -3, -2,  0,  0 },
+    { /*  39:           1110 1011 */  8,   235, -2,  3,  0,  0 },
+    { /*  40:           1110 1100 */  8,   236,  2,  3,  0,  0 },
+    { /*  41:           1110 1101 */  8,   237,  3, -2,  0,  0 },
+    { /*  42:           1110 1110 */  8,   238,  2, -3,  0,  0 },
+    { /*  43:           1110 1111 */  8,   239, -2, -3,  0,  0 },
+    { /*  44:           1111 0000 */  8,   240, -3,  2,  0,  0 },
+    { /*  45:           1111 0001 */  8,   241,  3,  3,  0,  0 },
+    { /*  46:         1 1110 0100 */  9,   484,  3, -3,  0,  0 },
+    { /*  47:         1 1110 0101 */  9,   485, -3, -3,  0,  0 },
+    { /*  48:         1 1110 0110 */  9,   486, -3,  3,  0,  0 },
+    { /*  49:         1 1110 0111 */  9,   487,  1, -4,  0,  0 },
+    { /*  50:         1 1110 1000 */  9,   488, -1, -4,  0,  0 },
+    { /*  51:         1 1110 1001 */  9,   489,  4,  1,  0,  0 },
+    { /*  52:         1 1110 1010 */  9,   490, -4,  1,  0,  0 },
+    { /*  53:         1 1110 1011 */  9,   491, -4, -1,  0,  0 },
+    { /*  54:         1 1110 1100 */  9,   492,  1,  4,  0,  0 },
+    { /*  55:         1 1110 1101 */  9,   493,  4, -1,  0,  0 },
+    { /*  56:         1 1110 1110 */  9,   494, -1,  4,  0,  0 },
+    { /*  57:         1 1110 1111 */  9,   495,  0, -4,  0,  0 },
+    { /*  58:         1 1111 0000 */  9,   496, -4,  2,  0,  0 },
+    { /*  59:         1 1111 0001 */  9,   497, -4, -2,  0,  0 },
+    { /*  60:         1 1111 0010 */  9,   498,  2,  4,  0,  0 },
+    { /*  61:         1 1111 0011 */  9,   499, -2, -4,  0,  0 },
+    { /*  62:         1 1111 0100 */  9,   500, -4,  0,  0,  0 },
+    { /*  63:         1 1111 0101 */  9,   501,  4,  2,  0,  0 },
+    { /*  64:         1 1111 0110 */  9,   502,  4, -2,  0,  0 },
+    { /*  65:         1 1111 0111 */  9,   503, -2,  4,  0,  0 },
+    { /*  66:         1 1111 1000 */  9,   504,  4,  0,  0,  0 },
+    { /*  67:         1 1111 1001 */  9,   505,  2, -4,  0,  0 },
+    { /*  68:         1 1111 1010 */  9,   506,  0,  4,  0,  0 },
+    { /*  69:        11 1111 0110 */ 10,  1014, -3, -4,  0,  0 },
+    { /*  70:        11 1111 0111 */ 10,  1015, -3,  4,  0,  0 },
+    { /*  71:        11 1111 1000 */ 10,  1016,  3, -4,  0,  0 },
+    { /*  72:        11 1111 1001 */ 10,  1017,  4, -3,  0,  0 },
+    { /*  73:        11 1111 1010 */ 10,  1018,  3,  4,  0,  0 },
+    { /*  74:        11 1111 1011 */ 10,  1019,  4,  3,  0,  0 },
+    { /*  75:        11 1111 1100 */ 10,  1020, -4,  3,  0,  0 },
+    { /*  76:        11 1111 1101 */ 10,  1021, -4, -3,  0,  0 },
+    { /*  77:       111 1111 1100 */ 11,  2044,  4,  4,  0,  0 },
+    { /*  78:       111 1111 1101 */ 11,  2045, -4,  4,  0,  0 },
+    { /*  79:       111 1111 1110 */ 11,  2046, -4, -4,  0,  0 },
+    { /*  80:       111 1111 1111 */ 11,  2047,  4, -4,  0,  0 }
+};
+
+Huffman book7[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:                 100 */  3,     4,  1,  0,  0,  0 },
+    { /*   2:                 101 */  3,     5,  0,  1,  0,  0 },
+    { /*   3:                1100 */  4,    12,  1,  1,  0,  0 },
+    { /*   4:             11 0100 */  6,    52,  2,  1,  0,  0 },
+    { /*   5:             11 0101 */  6,    53,  1,  2,  0,  0 },
+    { /*   6:             11 0110 */  6,    54,  2,  0,  0,  0 },
+    { /*   7:             11 0111 */  6,    55,  0,  2,  0,  0 },
+    { /*   8:            111 0000 */  7,   112,  3,  1,  0,  0 },
+    { /*   9:            111 0001 */  7,   113,  1,  3,  0,  0 },
+    { /*  10:            111 0010 */  7,   114,  2,  2,  0,  0 },
+    { /*  11:            111 0011 */  7,   115,  3,  0,  0,  0 },
+    { /*  12:            111 0100 */  7,   116,  0,  3,  0,  0 },
+    { /*  13:           1110 1010 */  8,   234,  2,  3,  0,  0 },
+    { /*  14:           1110 1011 */  8,   235,  3,  2,  0,  0 },
+    { /*  15:           1110 1100 */  8,   236,  1,  4,  0,  0 },
+    { /*  16:           1110 1101 */  8,   237,  4,  1,  0,  0 },
+    { /*  17:           1110 1110 */  8,   238,  1,  5,  0,  0 },
+    { /*  18:           1110 1111 */  8,   239,  5,  1,  0,  0 },
+    { /*  19:           1111 0000 */  8,   240,  3,  3,  0,  0 },
+    { /*  20:           1111 0001 */  8,   241,  2,  4,  0,  0 },
+    { /*  21:           1111 0010 */  8,   242,  0,  4,  0,  0 },
+    { /*  22:           1111 0011 */  8,   243,  4,  0,  0,  0 },
+    { /*  23:         1 1110 1000 */  9,   488,  4,  2,  0,  0 },
+    { /*  24:         1 1110 1001 */  9,   489,  2,  5,  0,  0 },
+    { /*  25:         1 1110 1010 */  9,   490,  5,  2,  0,  0 },
+    { /*  26:         1 1110 1011 */  9,   491,  0,  5,  0,  0 },
+    { /*  27:         1 1110 1100 */  9,   492,  6,  1,  0,  0 },
+    { /*  28:         1 1110 1101 */  9,   493,  5,  0,  0,  0 },
+    { /*  29:         1 1110 1110 */  9,   494,  1,  6,  0,  0 },
+    { /*  30:         1 1110 1111 */  9,   495,  4,  3,  0,  0 },
+    { /*  31:         1 1111 0000 */  9,   496,  3,  5,  0,  0 },
+    { /*  32:         1 1111 0001 */  9,   497,  3,  4,  0,  0 },
+    { /*  33:         1 1111 0010 */  9,   498,  5,  3,  0,  0 },
+    { /*  34:         1 1111 0011 */  9,   499,  2,  6,  0,  0 },
+    { /*  35:         1 1111 0100 */  9,   500,  6,  2,  0,  0 },
+    { /*  36:         1 1111 0101 */  9,   501,  1,  7,  0,  0 },
+    { /*  37:        11 1110 1100 */ 10,  1004,  3,  6,  0,  0 },
+    { /*  38:        11 1110 1101 */ 10,  1005,  0,  6,  0,  0 },
+    { /*  39:        11 1110 1110 */ 10,  1006,  6,  0,  0,  0 },
+    { /*  40:        11 1110 1111 */ 10,  1007,  4,  4,  0,  0 },
+    { /*  41:        11 1111 0000 */ 10,  1008,  7,  1,  0,  0 },
+    { /*  42:        11 1111 0001 */ 10,  1009,  4,  5,  0,  0 },
+    { /*  43:        11 1111 0010 */ 10,  1010,  7,  2,  0,  0 },
+    { /*  44:        11 1111 0011 */ 10,  1011,  5,  4,  0,  0 },
+    { /*  45:        11 1111 0100 */ 10,  1012,  6,  3,  0,  0 },
+    { /*  46:        11 1111 0101 */ 10,  1013,  2,  7,  0,  0 },
+    { /*  47:        11 1111 0110 */ 10,  1014,  7,  3,  0,  0 },
+    { /*  48:        11 1111 0111 */ 10,  1015,  6,  4,  0,  0 },
+    { /*  49:        11 1111 1000 */ 10,  1016,  5,  5,  0,  0 },
+    { /*  50:        11 1111 1001 */ 10,  1017,  4,  6,  0,  0 },
+    { /*  51:        11 1111 1010 */ 10,  1018,  3,  7,  0,  0 },
+    { /*  52:       111 1111 0110 */ 11,  2038,  7,  0,  0,  0 },
+    { /*  53:       111 1111 0111 */ 11,  2039,  0,  7,  0,  0 },
+    { /*  54:       111 1111 1000 */ 11,  2040,  6,  5,  0,  0 },
+    { /*  55:       111 1111 1001 */ 11,  2041,  5,  6,  0,  0 },
+    { /*  56:       111 1111 1010 */ 11,  2042,  7,  4,  0,  0 },
+    { /*  57:       111 1111 1011 */ 11,  2043,  4,  7,  0,  0 },
+    { /*  58:       111 1111 1100 */ 11,  2044,  5,  7,  0,  0 },
+    { /*  59:       111 1111 1101 */ 11,  2045,  7,  5,  0,  0 },
+    { /*  60:      1111 1111 1100 */ 12,  4092,  7,  6,  0,  0 },
+    { /*  61:      1111 1111 1101 */ 12,  4093,  6,  6,  0,  0 },
+    { /*  62:      1111 1111 1110 */ 12,  4094,  6,  7,  0,  0 },
+    { /*  63:      1111 1111 1111 */ 12,  4095,  7,  7,  0,  0 }
+};
+
+Huffman book8[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                 000 */  3,     0,  1,  1,  0,  0 },
+    { /*   1:                0010 */  4,     2,  2,  1,  0,  0 },
+    { /*   2:                0011 */  4,     3,  1,  0,  0,  0 },
+    { /*   3:                0100 */  4,     4,  1,  2,  0,  0 },
+    { /*   4:                0101 */  4,     5,  0,  1,  0,  0 },
+    { /*   5:                0110 */  4,     6,  2,  2,  0,  0 },
+    { /*   6:              0 1110 */  5,    14,  0,  0,  0,  0 },
+    { /*   7:              0 1111 */  5,    15,  2,  0,  0,  0 },
+    { /*   8:              1 0000 */  5,    16,  0,  2,  0,  0 },
+    { /*   9:              1 0001 */  5,    17,  3,  1,  0,  0 },
+    { /*  10:              1 0010 */  5,    18,  1,  3,  0,  0 },
+    { /*  11:              1 0011 */  5,    19,  3,  2,  0,  0 },
+    { /*  12:              1 0100 */  5,    20,  2,  3,  0,  0 },
+    { /*  13:             10 1010 */  6,    42,  3,  3,  0,  0 },
+    { /*  14:             10 1011 */  6,    43,  4,  1,  0,  0 },
+    { /*  15:             10 1100 */  6,    44,  1,  4,  0,  0 },
+    { /*  16:             10 1101 */  6,    45,  4,  2,  0,  0 },
+    { /*  17:             10 1110 */  6,    46,  2,  4,  0,  0 },
+    { /*  18:             10 1111 */  6,    47,  3,  0,  0,  0 },
+    { /*  19:             11 0000 */  6,    48,  0,  3,  0,  0 },
+    { /*  20:             11 0001 */  6,    49,  4,  3,  0,  0 },
+    { /*  21:             11 0010 */  6,    50,  3,  4,  0,  0 },
+    { /*  22:             11 0011 */  6,    51,  5,  2,  0,  0 },
+    { /*  23:            110 1000 */  7,   104,  5,  1,  0,  0 },
+    { /*  24:            110 1001 */  7,   105,  2,  5,  0,  0 },
+    { /*  25:            110 1010 */  7,   106,  1,  5,  0,  0 },
+    { /*  26:            110 1011 */  7,   107,  5,  3,  0,  0 },
+    { /*  27:            110 1100 */  7,   108,  3,  5,  0,  0 },
+    { /*  28:            110 1101 */  7,   109,  4,  4,  0,  0 },
+    { /*  29:            110 1110 */  7,   110,  5,  4,  0,  0 },
+    { /*  30:            110 1111 */  7,   111,  0,  4,  0,  0 },
+    { /*  31:            111 0000 */  7,   112,  4,  5,  0,  0 },
+    { /*  32:            111 0001 */  7,   113,  4,  0,  0,  0 },
+    { /*  33:            111 0010 */  7,   114,  2,  6,  0,  0 },
+    { /*  34:            111 0011 */  7,   115,  6,  2,  0,  0 },
+    { /*  35:            111 0100 */  7,   116,  6,  1,  0,  0 },
+    { /*  36:            111 0101 */  7,   117,  1,  6,  0,  0 },
+    { /*  37:           1110 1100 */  8,   236,  3,  6,  0,  0 },
+    { /*  38:           1110 1101 */  8,   237,  6,  3,  0,  0 },
+    { /*  39:           1110 1110 */  8,   238,  5,  5,  0,  0 },
+    { /*  40:           1110 1111 */  8,   239,  5,  0,  0,  0 },
+    { /*  41:           1111 0000 */  8,   240,  6,  4,  0,  0 },
+    { /*  42:           1111 0001 */  8,   241,  0,  5,  0,  0 },
+    { /*  43:           1111 0010 */  8,   242,  4,  6,  0,  0 },
+    { /*  44:           1111 0011 */  8,   243,  7,  1,  0,  0 },
+    { /*  45:           1111 0100 */  8,   244,  7,  2,  0,  0 },
+    { /*  46:           1111 0101 */  8,   245,  2,  7,  0,  0 },
+    { /*  47:           1111 0110 */  8,   246,  6,  5,  0,  0 },
+    { /*  48:           1111 0111 */  8,   247,  7,  3,  0,  0 },
+    { /*  49:           1111 1000 */  8,   248,  1,  7,  0,  0 },
+    { /*  50:           1111 1001 */  8,   249,  5,  6,  0,  0 },
+    { /*  51:           1111 1010 */  8,   250,  3,  7,  0,  0 },
+    { /*  52:         1 1111 0110 */  9,   502,  6,  6,  0,  0 },
+    { /*  53:         1 1111 0111 */  9,   503,  7,  4,  0,  0 },
+    { /*  54:         1 1111 1000 */  9,   504,  6,  0,  0,  0 },
+    { /*  55:         1 1111 1001 */  9,   505,  4,  7,  0,  0 },
+    { /*  56:         1 1111 1010 */  9,   506,  0,  6,  0,  0 },
+    { /*  57:         1 1111 1011 */  9,   507,  7,  5,  0,  0 },
+    { /*  58:         1 1111 1100 */  9,   508,  7,  6,  0,  0 },
+    { /*  59:         1 1111 1101 */  9,   509,  6,  7,  0,  0 },
+    { /*  60:        11 1111 1100 */ 10,  1020,  5,  7,  0,  0 },
+    { /*  61:        11 1111 1101 */ 10,  1021,  7,  0,  0,  0 },
+    { /*  62:        11 1111 1110 */ 10,  1022,  0,  7,  0,  0 },
+    { /*  63:        11 1111 1111 */ 10,  1023,  7,  7,  0,  0 }
+};
+
+Huffman book9[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:                 100 */  3,     4,  1,  0,  0,  0 },
+    { /*   2:                 101 */  3,     5,  0,  1,  0,  0 },
+    { /*   3:                1100 */  4,    12,  1,  1,  0,  0 },
+    { /*   4:             11 0100 */  6,    52,  2,  1,  0,  0 },
+    { /*   5:             11 0101 */  6,    53,  1,  2,  0,  0 },
+    { /*   6:             11 0110 */  6,    54,  2,  0,  0,  0 },
+    { /*   7:             11 0111 */  6,    55,  0,  2,  0,  0 },
+    { /*   8:            111 0000 */  7,   112,  3,  1,  0,  0 },
+    { /*   9:            111 0001 */  7,   113,  2,  2,  0,  0 },
+    { /*  10:            111 0010 */  7,   114,  1,  3,  0,  0 },
+    { /*  11:           1110 0110 */  8,   230,  3,  0,  0,  0 },
+    { /*  12:           1110 0111 */  8,   231,  0,  3,  0,  0 },
+    { /*  13:           1110 1000 */  8,   232,  2,  3,  0,  0 },
+    { /*  14:           1110 1001 */  8,   233,  3,  2,  0,  0 },
+    { /*  15:           1110 1010 */  8,   234,  1,  4,  0,  0 },
+    { /*  16:           1110 1011 */  8,   235,  4,  1,  0,  0 },
+    { /*  17:           1110 1100 */  8,   236,  2,  4,  0,  0 },
+    { /*  18:           1110 1101 */  8,   237,  1,  5,  0,  0 },
+    { /*  19:         1 1101 1100 */  9,   476,  4,  2,  0,  0 },
+    { /*  20:         1 1101 1101 */  9,   477,  3,  3,  0,  0 },
+    { /*  21:         1 1101 1110 */  9,   478,  0,  4,  0,  0 },
+    { /*  22:         1 1101 1111 */  9,   479,  4,  0,  0,  0 },
+    { /*  23:         1 1110 0000 */  9,   480,  5,  1,  0,  0 },
+    { /*  24:         1 1110 0001 */  9,   481,  2,  5,  0,  0 },
+    { /*  25:         1 1110 0010 */  9,   482,  1,  6,  0,  0 },
+    { /*  26:         1 1110 0011 */  9,   483,  3,  4,  0,  0 },
+    { /*  27:         1 1110 0100 */  9,   484,  5,  2,  0,  0 },
+    { /*  28:         1 1110 0101 */  9,   485,  6,  1,  0,  0 },
+    { /*  29:         1 1110 0110 */  9,   486,  4,  3,  0,  0 },
+    { /*  30:        11 1100 1110 */ 10,   974,  0,  5,  0,  0 },
+    { /*  31:        11 1100 1111 */ 10,   975,  2,  6,  0,  0 },
+    { /*  32:        11 1101 0000 */ 10,   976,  5,  0,  0,  0 },
+    { /*  33:        11 1101 0001 */ 10,   977,  1,  7,  0,  0 },
+    { /*  34:        11 1101 0010 */ 10,   978,  3,  5,  0,  0 },
+    { /*  35:        11 1101 0011 */ 10,   979,  1,  8,  0,  0 },
+    { /*  36:        11 1101 0100 */ 10,   980,  8,  1,  0,  0 },
+    { /*  37:        11 1101 0101 */ 10,   981,  4,  4,  0,  0 },
+    { /*  38:        11 1101 0110 */ 10,   982,  5,  3,  0,  0 },
+    { /*  39:        11 1101 0111 */ 10,   983,  6,  2,  0,  0 },
+    { /*  40:        11 1101 1000 */ 10,   984,  7,  1,  0,  0 },
+    { /*  41:        11 1101 1001 */ 10,   985,  0,  6,  0,  0 },
+    { /*  42:        11 1101 1010 */ 10,   986,  8,  2,  0,  0 },
+    { /*  43:        11 1101 1011 */ 10,   987,  2,  8,  0,  0 },
+    { /*  44:        11 1101 1100 */ 10,   988,  3,  6,  0,  0 },
+    { /*  45:        11 1101 1101 */ 10,   989,  2,  7,  0,  0 },
+    { /*  46:        11 1101 1110 */ 10,   990,  4,  5,  0,  0 },
+    { /*  47:        11 1101 1111 */ 10,   991,  9,  1,  0,  0 },
+    { /*  48:        11 1110 0000 */ 10,   992,  1,  9,  0,  0 },
+    { /*  49:        11 1110 0001 */ 10,   993,  7,  2,  0,  0 },
+    { /*  50:       111 1100 0100 */ 11,  1988,  6,  0,  0,  0 },
+    { /*  51:       111 1100 0101 */ 11,  1989,  5,  4,  0,  0 },
+    { /*  52:       111 1100 0110 */ 11,  1990,  6,  3,  0,  0 },
+    { /*  53:       111 1100 0111 */ 11,  1991,  8,  3,  0,  0 },
+    { /*  54:       111 1100 1000 */ 11,  1992,  0,  7,  0,  0 },
+    { /*  55:       111 1100 1001 */ 11,  1993,  9,  2,  0,  0 },
+    { /*  56:       111 1100 1010 */ 11,  1994,  3,  8,  0,  0 },
+    { /*  57:       111 1100 1011 */ 11,  1995,  4,  6,  0,  0 },
+    { /*  58:       111 1100 1100 */ 11,  1996,  3,  7,  0,  0 },
+    { /*  59:       111 1100 1101 */ 11,  1997,  0,  8,  0,  0 },
+    { /*  60:       111 1100 1110 */ 11,  1998, 10,  1,  0,  0 },
+    { /*  61:       111 1100 1111 */ 11,  1999,  6,  4,  0,  0 },
+    { /*  62:       111 1101 0000 */ 11,  2000,  2,  9,  0,  0 },
+    { /*  63:       111 1101 0001 */ 11,  2001,  5,  5,  0,  0 },
+    { /*  64:       111 1101 0010 */ 11,  2002,  8,  0,  0,  0 },
+    { /*  65:       111 1101 0011 */ 11,  2003,  7,  0,  0,  0 },
+    { /*  66:       111 1101 0100 */ 11,  2004,  7,  3,  0,  0 },
+    { /*  67:       111 1101 0101 */ 11,  2005, 10,  2,  0,  0 },
+    { /*  68:       111 1101 0110 */ 11,  2006,  9,  3,  0,  0 },
+    { /*  69:       111 1101 0111 */ 11,  2007,  8,  4,  0,  0 },
+    { /*  70:       111 1101 1000 */ 11,  2008,  1, 10,  0,  0 },
+    { /*  71:       111 1101 1001 */ 11,  2009,  7,  4,  0,  0 },
+    { /*  72:       111 1101 1010 */ 11,  2010,  6,  5,  0,  0 },
+    { /*  73:       111 1101 1011 */ 11,  2011,  5,  6,  0,  0 },
+    { /*  74:       111 1101 1100 */ 11,  2012,  4,  8,  0,  0 },
+    { /*  75:       111 1101 1101 */ 11,  2013,  4,  7,  0,  0 },
+    { /*  76:       111 1101 1110 */ 11,  2014,  3,  9,  0,  0 },
+    { /*  77:       111 1101 1111 */ 11,  2015, 11,  1,  0,  0 },
+    { /*  78:       111 1110 0000 */ 11,  2016,  5,  8,  0,  0 },
+    { /*  79:       111 1110 0001 */ 11,  2017,  9,  0,  0,  0 },
+    { /*  80:       111 1110 0010 */ 11,  2018,  8,  5,  0,  0 },
+    { /*  81:      1111 1100 0110 */ 12,  4038, 10,  3,  0,  0 },
+    { /*  82:      1111 1100 0111 */ 12,  4039,  2, 10,  0,  0 },
+    { /*  83:      1111 1100 1000 */ 12,  4040,  0,  9,  0,  0 },
+    { /*  84:      1111 1100 1001 */ 12,  4041, 11,  2,  0,  0 },
+    { /*  85:      1111 1100 1010 */ 12,  4042,  9,  4,  0,  0 },
+    { /*  86:      1111 1100 1011 */ 12,  4043,  6,  6,  0,  0 },
+    { /*  87:      1111 1100 1100 */ 12,  4044, 12,  1,  0,  0 },
+    { /*  88:      1111 1100 1101 */ 12,  4045,  4,  9,  0,  0 },
+    { /*  89:      1111 1100 1110 */ 12,  4046,  8,  6,  0,  0 },
+    { /*  90:      1111 1100 1111 */ 12,  4047,  1, 11,  0,  0 },
+    { /*  91:      1111 1101 0000 */ 12,  4048,  9,  5,  0,  0 },
+    { /*  92:      1111 1101 0001 */ 12,  4049, 10,  4,  0,  0 },
+    { /*  93:      1111 1101 0010 */ 12,  4050,  5,  7,  0,  0 },
+    { /*  94:      1111 1101 0011 */ 12,  4051,  7,  5,  0,  0 },
+    { /*  95:      1111 1101 0100 */ 12,  4052,  2, 11,  0,  0 },
+    { /*  96:      1111 1101 0101 */ 12,  4053,  1, 12,  0,  0 },
+    { /*  97:      1111 1101 0110 */ 12,  4054, 12,  2,  0,  0 },
+    { /*  98:      1111 1101 0111 */ 12,  4055, 11,  3,  0,  0 },
+    { /*  99:      1111 1101 1000 */ 12,  4056,  3, 10,  0,  0 },
+    { /* 100:      1111 1101 1001 */ 12,  4057,  5,  9,  0,  0 },
+    { /* 101:      1111 1101 1010 */ 12,  4058,  6,  7,  0,  0 },
+    { /* 102:      1111 1101 1011 */ 12,  4059,  8,  7,  0,  0 },
+    { /* 103:      1111 1101 1100 */ 12,  4060, 11,  4,  0,  0 },
+    { /* 104:      1111 1101 1101 */ 12,  4061,  0, 10,  0,  0 },
+    { /* 105:      1111 1101 1110 */ 12,  4062,  7,  6,  0,  0 },
+    { /* 106:      1111 1101 1111 */ 12,  4063, 12,  3,  0,  0 },
+    { /* 107:      1111 1110 0000 */ 12,  4064, 10,  0,  0,  0 },
+    { /* 108:      1111 1110 0001 */ 12,  4065, 10,  5,  0,  0 },
+    { /* 109:      1111 1110 0010 */ 12,  4066,  4, 10,  0,  0 },
+    { /* 110:      1111 1110 0011 */ 12,  4067,  6,  8,  0,  0 },
+    { /* 111:      1111 1110 0100 */ 12,  4068,  2, 12,  0,  0 },
+    { /* 112:      1111 1110 0101 */ 12,  4069,  9,  6,  0,  0 },
+    { /* 113:      1111 1110 0110 */ 12,  4070,  9,  7,  0,  0 },
+    { /* 114:      1111 1110 0111 */ 12,  4071,  4, 11,  0,  0 },
+    { /* 115:      1111 1110 1000 */ 12,  4072, 11,  0,  0,  0 },
+    { /* 116:      1111 1110 1001 */ 12,  4073,  6,  9,  0,  0 },
+    { /* 117:      1111 1110 1010 */ 12,  4074,  3, 11,  0,  0 },
+    { /* 118:      1111 1110 1011 */ 12,  4075,  5, 10,  0,  0 },
+    { /* 119:    1 1111 1101 1000 */ 13,  8152,  8,  8,  0,  0 },
+    { /* 120:    1 1111 1101 1001 */ 13,  8153,  7,  8,  0,  0 },
+    { /* 121:    1 1111 1101 1010 */ 13,  8154, 12,  5,  0,  0 },
+    { /* 122:    1 1111 1101 1011 */ 13,  8155,  3, 12,  0,  0 },
+    { /* 123:    1 1111 1101 1100 */ 13,  8156, 11,  5,  0,  0 },
+    { /* 124:    1 1111 1101 1101 */ 13,  8157,  7,  7,  0,  0 },
+    { /* 125:    1 1111 1101 1110 */ 13,  8158, 12,  4,  0,  0 },
+    { /* 126:    1 1111 1101 1111 */ 13,  8159, 11,  6,  0,  0 },
+    { /* 127:    1 1111 1110 0000 */ 13,  8160, 10,  6,  0,  0 },
+    { /* 128:    1 1111 1110 0001 */ 13,  8161,  4, 12,  0,  0 },
+    { /* 129:    1 1111 1110 0010 */ 13,  8162,  7,  9,  0,  0 },
+    { /* 130:    1 1111 1110 0011 */ 13,  8163,  5, 11,  0,  0 },
+    { /* 131:    1 1111 1110 0100 */ 13,  8164,  0, 11,  0,  0 },
+    { /* 132:    1 1111 1110 0101 */ 13,  8165, 12,  6,  0,  0 },
+    { /* 133:    1 1111 1110 0110 */ 13,  8166,  6, 10,  0,  0 },
+    { /* 134:    1 1111 1110 0111 */ 13,  8167, 12,  0,  0,  0 },
+    { /* 135:    1 1111 1110 1000 */ 13,  8168, 10,  7,  0,  0 },
+    { /* 136:    1 1111 1110 1001 */ 13,  8169,  5, 12,  0,  0 },
+    { /* 137:    1 1111 1110 1010 */ 13,  8170,  7, 10,  0,  0 },
+    { /* 138:    1 1111 1110 1011 */ 13,  8171,  9,  8,  0,  0 },
+    { /* 139:    1 1111 1110 1100 */ 13,  8172,  0, 12,  0,  0 },
+    { /* 140:    1 1111 1110 1101 */ 13,  8173, 11,  7,  0,  0 },
+    { /* 141:    1 1111 1110 1110 */ 13,  8174,  8,  9,  0,  0 },
+    { /* 142:    1 1111 1110 1111 */ 13,  8175,  9,  9,  0,  0 },
+    { /* 143:    1 1111 1111 0000 */ 13,  8176, 10,  8,  0,  0 },
+    { /* 144:    1 1111 1111 0001 */ 13,  8177,  7, 11,  0,  0 },
+    { /* 145:    1 1111 1111 0010 */ 13,  8178, 12,  7,  0,  0 },
+    { /* 146:    1 1111 1111 0011 */ 13,  8179,  6, 11,  0,  0 },
+    { /* 147:    1 1111 1111 0100 */ 13,  8180,  8, 11,  0,  0 },
+    { /* 148:    1 1111 1111 0101 */ 13,  8181, 11,  8,  0,  0 },
+    { /* 149:    1 1111 1111 0110 */ 13,  8182,  7, 12,  0,  0 },
+    { /* 150:    1 1111 1111 0111 */ 13,  8183,  6, 12,  0,  0 },
+    { /* 151:   11 1111 1111 0000 */ 14, 16368,  8, 10,  0,  0 },
+    { /* 152:   11 1111 1111 0001 */ 14, 16369, 10,  9,  0,  0 },
+    { /* 153:   11 1111 1111 0010 */ 14, 16370,  8, 12,  0,  0 },
+    { /* 154:   11 1111 1111 0011 */ 14, 16371,  9, 10,  0,  0 },
+    { /* 155:   11 1111 1111 0100 */ 14, 16372,  9, 11,  0,  0 },
+    { /* 156:   11 1111 1111 0101 */ 14, 16373,  9, 12,  0,  0 },
+    { /* 157:   11 1111 1111 0110 */ 14, 16374, 10, 11,  0,  0 },
+    { /* 158:   11 1111 1111 0111 */ 14, 16375, 12,  9,  0,  0 },
+    { /* 159:   11 1111 1111 1000 */ 14, 16376, 10, 10,  0,  0 },
+    { /* 160:   11 1111 1111 1001 */ 14, 16377, 11,  9,  0,  0 },
+    { /* 161:   11 1111 1111 1010 */ 14, 16378, 12,  8,  0,  0 },
+    { /* 162:   11 1111 1111 1011 */ 14, 16379, 11, 10,  0,  0 },
+    { /* 163:   11 1111 1111 1100 */ 14, 16380, 12, 10,  0,  0 },
+    { /* 164:   11 1111 1111 1101 */ 14, 16381, 12, 11,  0,  0 },
+    { /* 165:  111 1111 1111 1100 */ 15, 32764, 10, 12,  0,  0 },
+    { /* 166:  111 1111 1111 1101 */ 15, 32765, 11, 11,  0,  0 },
+    { /* 167:  111 1111 1111 1110 */ 15, 32766, 11, 12,  0,  0 },
+    { /* 168:  111 1111 1111 1111 */ 15, 32767, 12, 12,  0,  0 }
+};
+
+Huffman book10[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                0000 */  4,     0,  1,  1,  0,  0 },
+    { /*   1:                0001 */  4,     1,  1,  2,  0,  0 },
+    { /*   2:                0010 */  4,     2,  2,  1,  0,  0 },
+    { /*   3:              0 0110 */  5,     6,  2,  2,  0,  0 },
+    { /*   4:              0 0111 */  5,     7,  1,  0,  0,  0 },
+    { /*   5:              0 1000 */  5,     8,  0,  1,  0,  0 },
+    { /*   6:              0 1001 */  5,     9,  1,  3,  0,  0 },
+    { /*   7:              0 1010 */  5,    10,  3,  2,  0,  0 },
+    { /*   8:              0 1011 */  5,    11,  3,  1,  0,  0 },
+    { /*   9:              0 1100 */  5,    12,  2,  3,  0,  0 },
+    { /*  10:              0 1101 */  5,    13,  3,  3,  0,  0 },
+    { /*  11:             01 1100 */  6,    28,  2,  0,  0,  0 },
+    { /*  12:             01 1101 */  6,    29,  0,  2,  0,  0 },
+    { /*  13:             01 1110 */  6,    30,  2,  4,  0,  0 },
+    { /*  14:             01 1111 */  6,    31,  4,  2,  0,  0 },
+    { /*  15:             10 0000 */  6,    32,  1,  4,  0,  0 },
+    { /*  16:             10 0001 */  6,    33,  4,  1,  0,  0 },
+    { /*  17:             10 0010 */  6,    34,  0,  0,  0,  0 },
+    { /*  18:             10 0011 */  6,    35,  4,  3,  0,  0 },
+    { /*  19:             10 0100 */  6,    36,  3,  4,  0,  0 },
+    { /*  20:             10 0101 */  6,    37,  3,  0,  0,  0 },
+    { /*  21:             10 0110 */  6,    38,  0,  3,  0,  0 },
+    { /*  22:             10 0111 */  6,    39,  4,  4,  0,  0 },
+    { /*  23:             10 1000 */  6,    40,  2,  5,  0,  0 },
+    { /*  24:             10 1001 */  6,    41,  5,  2,  0,  0 },
+    { /*  25:            101 0100 */  7,    84,  1,  5,  0,  0 },
+    { /*  26:            101 0101 */  7,    85,  5,  1,  0,  0 },
+    { /*  27:            101 0110 */  7,    86,  5,  3,  0,  0 },
+    { /*  28:            101 0111 */  7,    87,  3,  5,  0,  0 },
+    { /*  29:            101 1000 */  7,    88,  5,  4,  0,  0 },
+    { /*  30:            101 1001 */  7,    89,  4,  5,  0,  0 },
+    { /*  31:            101 1010 */  7,    90,  6,  2,  0,  0 },
+    { /*  32:            101 1011 */  7,    91,  2,  6,  0,  0 },
+    { /*  33:            101 1100 */  7,    92,  6,  3,  0,  0 },
+    { /*  34:            101 1101 */  7,    93,  4,  0,  0,  0 },
+    { /*  35:            101 1110 */  7,    94,  6,  1,  0,  0 },
+    { /*  36:            101 1111 */  7,    95,  0,  4,  0,  0 },
+    { /*  37:            110 0000 */  7,    96,  1,  6,  0,  0 },
+    { /*  38:            110 0001 */  7,    97,  3,  6,  0,  0 },
+    { /*  39:            110 0010 */  7,    98,  5,  5,  0,  0 },
+    { /*  40:            110 0011 */  7,    99,  6,  4,  0,  0 },
+    { /*  41:            110 0100 */  7,   100,  4,  6,  0,  0 },
+    { /*  42:           1100 1010 */  8,   202,  6,  5,  0,  0 },
+    { /*  43:           1100 1011 */  8,   203,  7,  2,  0,  0 },
+    { /*  44:           1100 1100 */  8,   204,  3,  7,  0,  0 },
+    { /*  45:           1100 1101 */  8,   205,  2,  7,  0,  0 },
+    { /*  46:           1100 1110 */  8,   206,  5,  6,  0,  0 },
+    { /*  47:           1100 1111 */  8,   207,  8,  2,  0,  0 },
+    { /*  48:           1101 0000 */  8,   208,  7,  3,  0,  0 },
+    { /*  49:           1101 0001 */  8,   209,  5,  0,  0,  0 },
+    { /*  50:           1101 0010 */  8,   210,  7,  1,  0,  0 },
+    { /*  51:           1101 0011 */  8,   211,  0,  5,  0,  0 },
+    { /*  52:           1101 0100 */  8,   212,  8,  1,  0,  0 },
+    { /*  53:           1101 0101 */  8,   213,  1,  7,  0,  0 },
+    { /*  54:           1101 0110 */  8,   214,  8,  3,  0,  0 },
+    { /*  55:           1101 0111 */  8,   215,  7,  4,  0,  0 },
+    { /*  56:           1101 1000 */  8,   216,  4,  7,  0,  0 },
+    { /*  57:           1101 1001 */  8,   217,  2,  8,  0,  0 },
+    { /*  58:           1101 1010 */  8,   218,  6,  6,  0,  0 },
+    { /*  59:           1101 1011 */  8,   219,  7,  5,  0,  0 },
+    { /*  60:           1101 1100 */  8,   220,  1,  8,  0,  0 },
+    { /*  61:           1101 1101 */  8,   221,  3,  8,  0,  0 },
+    { /*  62:           1101 1110 */  8,   222,  8,  4,  0,  0 },
+    { /*  63:           1101 1111 */  8,   223,  4,  8,  0,  0 },
+    { /*  64:           1110 0000 */  8,   224,  5,  7,  0,  0 },
+    { /*  65:           1110 0001 */  8,   225,  8,  5,  0,  0 },
+    { /*  66:           1110 0010 */  8,   226,  5,  8,  0,  0 },
+    { /*  67:         1 1100 0110 */  9,   454,  7,  6,  0,  0 },
+    { /*  68:         1 1100 0111 */  9,   455,  6,  7,  0,  0 },
+    { /*  69:         1 1100 1000 */  9,   456,  9,  2,  0,  0 },
+    { /*  70:         1 1100 1001 */  9,   457,  6,  0,  0,  0 },
+    { /*  71:         1 1100 1010 */  9,   458,  6,  8,  0,  0 },
+    { /*  72:         1 1100 1011 */  9,   459,  9,  3,  0,  0 },
+    { /*  73:         1 1100 1100 */  9,   460,  3,  9,  0,  0 },
+    { /*  74:         1 1100 1101 */  9,   461,  9,  1,  0,  0 },
+    { /*  75:         1 1100 1110 */  9,   462,  2,  9,  0,  0 },
+    { /*  76:         1 1100 1111 */  9,   463,  0,  6,  0,  0 },
+    { /*  77:         1 1101 0000 */  9,   464,  8,  6,  0,  0 },
+    { /*  78:         1 1101 0001 */  9,   465,  9,  4,  0,  0 },
+    { /*  79:         1 1101 0010 */  9,   466,  4,  9,  0,  0 },
+    { /*  80:         1 1101 0011 */  9,   467, 10,  2,  0,  0 },
+    { /*  81:         1 1101 0100 */  9,   468,  1,  9,  0,  0 },
+    { /*  82:         1 1101 0101 */  9,   469,  7,  7,  0,  0 },
+    { /*  83:         1 1101 0110 */  9,   470,  8,  7,  0,  0 },
+    { /*  84:         1 1101 0111 */  9,   471,  9,  5,  0,  0 },
+    { /*  85:         1 1101 1000 */  9,   472,  7,  8,  0,  0 },
+    { /*  86:         1 1101 1001 */  9,   473, 10,  3,  0,  0 },
+    { /*  87:         1 1101 1010 */  9,   474,  5,  9,  0,  0 },
+    { /*  88:         1 1101 1011 */  9,   475, 10,  4,  0,  0 },
+    { /*  89:         1 1101 1100 */  9,   476,  2, 10,  0,  0 },
+    { /*  90:         1 1101 1101 */  9,   477, 10,  1,  0,  0 },
+    { /*  91:         1 1101 1110 */  9,   478,  3, 10,  0,  0 },
+    { /*  92:         1 1101 1111 */  9,   479,  9,  6,  0,  0 },
+    { /*  93:         1 1110 0000 */  9,   480,  6,  9,  0,  0 },
+    { /*  94:         1 1110 0001 */  9,   481,  8,  0,  0,  0 },
+    { /*  95:         1 1110 0010 */  9,   482,  4, 10,  0,  0 },
+    { /*  96:         1 1110 0011 */  9,   483,  7,  0,  0,  0 },
+    { /*  97:         1 1110 0100 */  9,   484, 11,  2,  0,  0 },
+    { /*  98:        11 1100 1010 */ 10,   970,  7,  9,  0,  0 },
+    { /*  99:        11 1100 1011 */ 10,   971, 11,  3,  0,  0 },
+    { /* 100:        11 1100 1100 */ 10,   972, 10,  6,  0,  0 },
+    { /* 101:        11 1100 1101 */ 10,   973,  1, 10,  0,  0 },
+    { /* 102:        11 1100 1110 */ 10,   974, 11,  1,  0,  0 },
+    { /* 103:        11 1100 1111 */ 10,   975,  9,  7,  0,  0 },
+    { /* 104:        11 1101 0000 */ 10,   976,  0,  7,  0,  0 },
+    { /* 105:        11 1101 0001 */ 10,   977,  8,  8,  0,  0 },
+    { /* 106:        11 1101 0010 */ 10,   978, 10,  5,  0,  0 },
+    { /* 107:        11 1101 0011 */ 10,   979,  3, 11,  0,  0 },
+    { /* 108:        11 1101 0100 */ 10,   980,  5, 10,  0,  0 },
+    { /* 109:        11 1101 0101 */ 10,   981,  8,  9,  0,  0 },
+    { /* 110:        11 1101 0110 */ 10,   982, 11,  5,  0,  0 },
+    { /* 111:        11 1101 0111 */ 10,   983,  0,  8,  0,  0 },
+    { /* 112:        11 1101 1000 */ 10,   984, 11,  4,  0,  0 },
+    { /* 113:        11 1101 1001 */ 10,   985,  2, 11,  0,  0 },
+    { /* 114:        11 1101 1010 */ 10,   986,  7, 10,  0,  0 },
+    { /* 115:        11 1101 1011 */ 10,   987,  6, 10,  0,  0 },
+    { /* 116:        11 1101 1100 */ 10,   988, 10,  7,  0,  0 },
+    { /* 117:        11 1101 1101 */ 10,   989,  4, 11,  0,  0 },
+    { /* 118:        11 1101 1110 */ 10,   990,  1, 11,  0,  0 },
+    { /* 119:        11 1101 1111 */ 10,   991, 12,  2,  0,  0 },
+    { /* 120:        11 1110 0000 */ 10,   992,  9,  8,  0,  0 },
+    { /* 121:        11 1110 0001 */ 10,   993, 12,  3,  0,  0 },
+    { /* 122:        11 1110 0010 */ 10,   994, 11,  6,  0,  0 },
+    { /* 123:        11 1110 0011 */ 10,   995,  5, 11,  0,  0 },
+    { /* 124:        11 1110 0100 */ 10,   996, 12,  4,  0,  0 },
+    { /* 125:        11 1110 0101 */ 10,   997, 11,  7,  0,  0 },
+    { /* 126:        11 1110 0110 */ 10,   998, 12,  5,  0,  0 },
+    { /* 127:        11 1110 0111 */ 10,   999,  3, 12,  0,  0 },
+    { /* 128:        11 1110 1000 */ 10,  1000,  6, 11,  0,  0 },
+    { /* 129:        11 1110 1001 */ 10,  1001,  9,  0,  0,  0 },
+    { /* 130:        11 1110 1010 */ 10,  1002, 10,  8,  0,  0 },
+    { /* 131:        11 1110 1011 */ 10,  1003, 10,  0,  0,  0 },
+    { /* 132:        11 1110 1100 */ 10,  1004, 12,  1,  0,  0 },
+    { /* 133:        11 1110 1101 */ 10,  1005,  0,  9,  0,  0 },
+    { /* 134:        11 1110 1110 */ 10,  1006,  4, 12,  0,  0 },
+    { /* 135:        11 1110 1111 */ 10,  1007,  9,  9,  0,  0 },
+    { /* 136:        11 1111 0000 */ 10,  1008, 12,  6,  0,  0 },
+    { /* 137:        11 1111 0001 */ 10,  1009,  2, 12,  0,  0 },
+    { /* 138:        11 1111 0010 */ 10,  1010,  8, 10,  0,  0 },
+    { /* 139:       111 1110 0110 */ 11,  2022,  9, 10,  0,  0 },
+    { /* 140:       111 1110 0111 */ 11,  2023,  1, 12,  0,  0 },
+    { /* 141:       111 1110 1000 */ 11,  2024, 11,  8,  0,  0 },
+    { /* 142:       111 1110 1001 */ 11,  2025, 12,  7,  0,  0 },
+    { /* 143:       111 1110 1010 */ 11,  2026,  7, 11,  0,  0 },
+    { /* 144:       111 1110 1011 */ 11,  2027,  5, 12,  0,  0 },
+    { /* 145:       111 1110 1100 */ 11,  2028,  6, 12,  0,  0 },
+    { /* 146:       111 1110 1101 */ 11,  2029, 10,  9,  0,  0 },
+    { /* 147:       111 1110 1110 */ 11,  2030,  8, 11,  0,  0 },
+    { /* 148:       111 1110 1111 */ 11,  2031, 12,  8,  0,  0 },
+    { /* 149:       111 1111 0000 */ 11,  2032,  0, 10,  0,  0 },
+    { /* 150:       111 1111 0001 */ 11,  2033,  7, 12,  0,  0 },
+    { /* 151:       111 1111 0010 */ 11,  2034, 11,  0,  0,  0 },
+    { /* 152:       111 1111 0011 */ 11,  2035, 10, 10,  0,  0 },
+    { /* 153:       111 1111 0100 */ 11,  2036, 11,  9,  0,  0 },
+    { /* 154:       111 1111 0101 */ 11,  2037, 11, 10,  0,  0 },
+    { /* 155:       111 1111 0110 */ 11,  2038,  0, 11,  0,  0 },
+    { /* 156:       111 1111 0111 */ 11,  2039, 11, 11,  0,  0 },
+    { /* 157:       111 1111 1000 */ 11,  2040,  9, 11,  0,  0 },
+    { /* 158:       111 1111 1001 */ 11,  2041, 10, 11,  0,  0 },
+    { /* 159:       111 1111 1010 */ 11,  2042, 12,  0,  0,  0 },
+    { /* 160:       111 1111 1011 */ 11,  2043,  8, 12,  0,  0 },
+    { /* 161:      1111 1111 1000 */ 12,  4088, 12,  9,  0,  0 },
+    { /* 162:      1111 1111 1001 */ 12,  4089, 10, 12,  0,  0 },
+    { /* 163:      1111 1111 1010 */ 12,  4090,  9, 12,  0,  0 },
+    { /* 164:      1111 1111 1011 */ 12,  4091, 11, 12,  0,  0 },
+    { /* 165:      1111 1111 1100 */ 12,  4092, 12, 11,  0,  0 },
+    { /* 166:      1111 1111 1101 */ 12,  4093,  0, 12,  0,  0 },
+    { /* 167:      1111 1111 1110 */ 12,  4094, 12, 10,  0,  0 },
+    { /* 168:      1111 1111 1111 */ 12,  4095, 12, 12,  0,  0 }
+};
+
+Huffman book11[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                0000 */  4,     0,  0,  0,  0,  0 },
+    { /*   1:                0001 */  4,     1,  1,  1,  0,  0 },
+    { /*   2:              0 0100 */  5,     4, 16, 16,  0,  0 },
+    { /*   3:              0 0101 */  5,     5,  1,  0,  0,  0 },
+    { /*   4:              0 0110 */  5,     6,  0,  1,  0,  0 },
+    { /*   5:              0 0111 */  5,     7,  2,  1,  0,  0 },
+    { /*   6:              0 1000 */  5,     8,  1,  2,  0,  0 },
+    { /*   7:              0 1001 */  5,     9,  2,  2,  0,  0 },
+    { /*   8:             01 0100 */  6,    20,  1,  3,  0,  0 },
+    { /*   9:             01 0101 */  6,    21,  3,  1,  0,  0 },
+    { /*  10:             01 0110 */  6,    22,  3,  2,  0,  0 },
+    { /*  11:             01 0111 */  6,    23,  2,  0,  0,  0 },
+    { /*  12:             01 1000 */  6,    24,  2,  3,  0,  0 },
+    { /*  13:             01 1001 */  6,    25,  0,  2,  0,  0 },
+    { /*  14:             01 1010 */  6,    26,  3,  3,  0,  0 },
+    { /*  15:            011 0110 */  7,    54,  4,  1,  0,  0 },
+    { /*  16:            011 0111 */  7,    55,  1,  4,  0,  0 },
+    { /*  17:            011 1000 */  7,    56,  4,  2,  0,  0 },
+    { /*  18:            011 1001 */  7,    57,  2,  4,  0,  0 },
+    { /*  19:            011 1010 */  7,    58,  4,  3,  0,  0 },
+    { /*  20:            011 1011 */  7,    59,  3,  4,  0,  0 },
+    { /*  21:            011 1100 */  7,    60,  3,  0,  0,  0 },
+    { /*  22:            011 1101 */  7,    61,  0,  3,  0,  0 },
+    { /*  23:            011 1110 */  7,    62,  5,  1,  0,  0 },
+    { /*  24:            011 1111 */  7,    63,  5,  2,  0,  0 },
+    { /*  25:            100 0000 */  7,    64,  2,  5,  0,  0 },
+    { /*  26:            100 0001 */  7,    65,  4,  4,  0,  0 },
+    { /*  27:            100 0010 */  7,    66,  1,  5,  0,  0 },
+    { /*  28:            100 0011 */  7,    67,  5,  3,  0,  0 },
+    { /*  29:            100 0100 */  7,    68,  3,  5,  0,  0 },
+    { /*  30:            100 0101 */  7,    69,  5,  4,  0,  0 },
+    { /*  31:           1000 1100 */  8,   140,  4,  5,  0,  0 },
+    { /*  32:           1000 1101 */  8,   141,  6,  2,  0,  0 },
+    { /*  33:           1000 1110 */  8,   142,  2,  6,  0,  0 },
+    { /*  34:           1000 1111 */  8,   143,  6,  1,  0,  0 },
+    { /*  35:           1001 0000 */  8,   144,  6,  3,  0,  0 },
+    { /*  36:           1001 0001 */  8,   145,  3,  6,  0,  0 },
+    { /*  37:           1001 0010 */  8,   146,  1,  6,  0,  0 },
+    { /*  38:           1001 0011 */  8,   147,  4, 16,  0,  0 },
+    { /*  39:           1001 0100 */  8,   148,  3, 16,  0,  0 },
+    { /*  40:           1001 0101 */  8,   149, 16,  5,  0,  0 },
+    { /*  41:           1001 0110 */  8,   150, 16,  3,  0,  0 },
+    { /*  42:           1001 0111 */  8,   151, 16,  4,  0,  0 },
+    { /*  43:           1001 1000 */  8,   152,  6,  4,  0,  0 },
+    { /*  44:           1001 1001 */  8,   153, 16,  6,  0,  0 },
+    { /*  45:           1001 1010 */  8,   154,  4,  0,  0,  0 },
+    { /*  46:           1001 1011 */  8,   155,  4,  6,  0,  0 },
+    { /*  47:           1001 1100 */  8,   156,  0,  4,  0,  0 },
+    { /*  48:           1001 1101 */  8,   157,  2, 16,  0,  0 },
+    { /*  49:           1001 1110 */  8,   158,  5,  5,  0,  0 },
+    { /*  50:           1001 1111 */  8,   159,  5, 16,  0,  0 },
+    { /*  51:           1010 0000 */  8,   160, 16,  7,  0,  0 },
+    { /*  52:           1010 0001 */  8,   161, 16,  2,  0,  0 },
+    { /*  53:           1010 0010 */  8,   162, 16,  8,  0,  0 },
+    { /*  54:           1010 0011 */  8,   163,  2,  7,  0,  0 },
+    { /*  55:           1010 0100 */  8,   164,  7,  2,  0,  0 },
+    { /*  56:           1010 0101 */  8,   165,  3,  7,  0,  0 },
+    { /*  57:           1010 0110 */  8,   166,  6,  5,  0,  0 },
+    { /*  58:           1010 0111 */  8,   167,  5,  6,  0,  0 },
+    { /*  59:           1010 1000 */  8,   168,  6, 16,  0,  0 },
+    { /*  60:           1010 1001 */  8,   169, 16, 10,  0,  0 },
+    { /*  61:           1010 1010 */  8,   170,  7,  3,  0,  0 },
+    { /*  62:           1010 1011 */  8,   171,  7,  1,  0,  0 },
+    { /*  63:           1010 1100 */  8,   172, 16,  9,  0,  0 },
+    { /*  64:           1010 1101 */  8,   173,  7, 16,  0,  0 },
+    { /*  65:           1010 1110 */  8,   174,  1, 16,  0,  0 },
+    { /*  66:           1010 1111 */  8,   175,  1,  7,  0,  0 },
+    { /*  67:           1011 0000 */  8,   176,  4,  7,  0,  0 },
+    { /*  68:           1011 0001 */  8,   177, 16, 11,  0,  0 },
+    { /*  69:           1011 0010 */  8,   178,  7,  4,  0,  0 },
+    { /*  70:           1011 0011 */  8,   179, 16, 12,  0,  0 },
+    { /*  71:           1011 0100 */  8,   180,  8, 16,  0,  0 },
+    { /*  72:           1011 0101 */  8,   181, 16,  1,  0,  0 },
+    { /*  73:           1011 0110 */  8,   182,  6,  6,  0,  0 },
+    { /*  74:           1011 0111 */  8,   183,  9, 16,  0,  0 },
+    { /*  75:           1011 1000 */  8,   184,  2,  8,  0,  0 },
+    { /*  76:           1011 1001 */  8,   185,  5,  7,  0,  0 },
+    { /*  77:           1011 1010 */  8,   186, 10, 16,  0,  0 },
+    { /*  78:           1011 1011 */  8,   187, 16, 13,  0,  0 },
+    { /*  79:           1011 1100 */  8,   188,  8,  3,  0,  0 },
+    { /*  80:           1011 1101 */  8,   189,  8,  2,  0,  0 },
+    { /*  81:           1011 1110 */  8,   190,  3,  8,  0,  0 },
+    { /*  82:           1011 1111 */  8,   191,  5,  0,  0,  0 },
+    { /*  83:           1100 0000 */  8,   192, 16, 14,  0,  0 },
+    { /*  84:           1100 0001 */  8,   193, 11, 16,  0,  0 },
+    { /*  85:           1100 0010 */  8,   194,  7,  5,  0,  0 },
+    { /*  86:           1100 0011 */  8,   195,  4,  8,  0,  0 },
+    { /*  87:           1100 0100 */  8,   196,  6,  7,  0,  0 },
+    { /*  88:           1100 0101 */  8,   197,  7,  6,  0,  0 },
+    { /*  89:           1100 0110 */  8,   198,  0,  5,  0,  0 },
+    { /*  90:         1 1000 1110 */  9,   398,  8,  4,  0,  0 },
+    { /*  91:         1 1000 1111 */  9,   399, 16, 15,  0,  0 },
+    { /*  92:         1 1001 0000 */  9,   400, 12, 16,  0,  0 },
+    { /*  93:         1 1001 0001 */  9,   401,  1,  8,  0,  0 },
+    { /*  94:         1 1001 0010 */  9,   402,  8,  1,  0,  0 },
+    { /*  95:         1 1001 0011 */  9,   403, 14, 16,  0,  0 },
+    { /*  96:         1 1001 0100 */  9,   404,  5,  8,  0,  0 },
+    { /*  97:         1 1001 0101 */  9,   405, 13, 16,  0,  0 },
+    { /*  98:         1 1001 0110 */  9,   406,  3,  9,  0,  0 },
+    { /*  99:         1 1001 0111 */  9,   407,  8,  5,  0,  0 },
+    { /* 100:         1 1001 1000 */  9,   408,  7,  7,  0,  0 },
+    { /* 101:         1 1001 1001 */  9,   409,  2,  9,  0,  0 },
+    { /* 102:         1 1001 1010 */  9,   410,  8,  6,  0,  0 },
+    { /* 103:         1 1001 1011 */  9,   411,  9,  2,  0,  0 },
+    { /* 104:         1 1001 1100 */  9,   412,  9,  3,  0,  0 },
+    { /* 105:         1 1001 1101 */  9,   413, 15, 16,  0,  0 },
+    { /* 106:         1 1001 1110 */  9,   414,  4,  9,  0,  0 },
+    { /* 107:         1 1001 1111 */  9,   415,  6,  8,  0,  0 },
+    { /* 108:         1 1010 0000 */  9,   416,  6,  0,  0,  0 },
+    { /* 109:         1 1010 0001 */  9,   417,  9,  4,  0,  0 },
+    { /* 110:         1 1010 0010 */  9,   418,  5,  9,  0,  0 },
+    { /* 111:         1 1010 0011 */  9,   419,  8,  7,  0,  0 },
+    { /* 112:         1 1010 0100 */  9,   420,  7,  8,  0,  0 },
+    { /* 113:         1 1010 0101 */  9,   421,  1,  9,  0,  0 },
+    { /* 114:         1 1010 0110 */  9,   422, 10,  3,  0,  0 },
+    { /* 115:         1 1010 0111 */  9,   423,  0,  6,  0,  0 },
+    { /* 116:         1 1010 1000 */  9,   424, 10,  2,  0,  0 },
+    { /* 117:         1 1010 1001 */  9,   425,  9,  1,  0,  0 },
+    { /* 118:         1 1010 1010 */  9,   426,  9,  5,  0,  0 },
+    { /* 119:         1 1010 1011 */  9,   427,  4, 10,  0,  0 },
+    { /* 120:         1 1010 1100 */  9,   428,  2, 10,  0,  0 },
+    { /* 121:         1 1010 1101 */  9,   429,  9,  6,  0,  0 },
+    { /* 122:         1 1010 1110 */  9,   430,  3, 10,  0,  0 },
+    { /* 123:         1 1010 1111 */  9,   431,  6,  9,  0,  0 },
+    { /* 124:         1 1011 0000 */  9,   432, 10,  4,  0,  0 },
+    { /* 125:         1 1011 0001 */  9,   433,  8,  8,  0,  0 },
+    { /* 126:         1 1011 0010 */  9,   434, 10,  5,  0,  0 },
+    { /* 127:         1 1011 0011 */  9,   435,  9,  7,  0,  0 },
+    { /* 128:         1 1011 0100 */  9,   436, 11,  3,  0,  0 },
+    { /* 129:         1 1011 0101 */  9,   437,  1, 10,  0,  0 },
+    { /* 130:         1 1011 0110 */  9,   438,  7,  0,  0,  0 },
+    { /* 131:         1 1011 0111 */  9,   439, 10,  6,  0,  0 },
+    { /* 132:         1 1011 1000 */  9,   440,  7,  9,  0,  0 },
+    { /* 133:         1 1011 1001 */  9,   441,  3, 11,  0,  0 },
+    { /* 134:         1 1011 1010 */  9,   442,  5, 10,  0,  0 },
+    { /* 135:         1 1011 1011 */  9,   443, 10,  1,  0,  0 },
+    { /* 136:         1 1011 1100 */  9,   444,  4, 11,  0,  0 },
+    { /* 137:         1 1011 1101 */  9,   445, 11,  2,  0,  0 },
+    { /* 138:         1 1011 1110 */  9,   446, 13,  2,  0,  0 },
+    { /* 139:         1 1011 1111 */  9,   447,  6, 10,  0,  0 },
+    { /* 140:         1 1100 0000 */  9,   448, 13,  3,  0,  0 },
+    { /* 141:         1 1100 0001 */  9,   449,  2, 11,  0,  0 },
+    { /* 142:         1 1100 0010 */  9,   450, 16,  0,  0,  0 },
+    { /* 143:         1 1100 0011 */  9,   451,  5, 11,  0,  0 },
+    { /* 144:         1 1100 0100 */  9,   452, 11,  5,  0,  0 },
+    { /* 145:        11 1000 1010 */ 10,   906, 11,  4,  0,  0 },
+    { /* 146:        11 1000 1011 */ 10,   907,  9,  8,  0,  0 },
+    { /* 147:        11 1000 1100 */ 10,   908,  7, 10,  0,  0 },
+    { /* 148:        11 1000 1101 */ 10,   909,  8,  9,  0,  0 },
+    { /* 149:        11 1000 1110 */ 10,   910,  0, 16,  0,  0 },
+    { /* 150:        11 1000 1111 */ 10,   911,  4, 13,  0,  0 },
+    { /* 151:        11 1001 0000 */ 10,   912,  0,  7,  0,  0 },
+    { /* 152:        11 1001 0001 */ 10,   913,  3, 13,  0,  0 },
+    { /* 153:        11 1001 0010 */ 10,   914, 11,  6,  0,  0 },
+    { /* 154:        11 1001 0011 */ 10,   915, 13,  1,  0,  0 },
+    { /* 155:        11 1001 0100 */ 10,   916, 13,  4,  0,  0 },
+    { /* 156:        11 1001 0101 */ 10,   917, 12,  3,  0,  0 },
+    { /* 157:        11 1001 0110 */ 10,   918,  2, 13,  0,  0 },
+    { /* 158:        11 1001 0111 */ 10,   919, 13,  5,  0,  0 },
+    { /* 159:        11 1001 1000 */ 10,   920,  8, 10,  0,  0 },
+    { /* 160:        11 1001 1001 */ 10,   921,  6, 11,  0,  0 },
+    { /* 161:        11 1001 1010 */ 10,   922, 10,  8,  0,  0 },
+    { /* 162:        11 1001 1011 */ 10,   923, 10,  7,  0,  0 },
+    { /* 163:        11 1001 1100 */ 10,   924, 14,  2,  0,  0 },
+    { /* 164:        11 1001 1101 */ 10,   925, 12,  4,  0,  0 },
+    { /* 165:        11 1001 1110 */ 10,   926,  1, 11,  0,  0 },
+    { /* 166:        11 1001 1111 */ 10,   927,  4, 12,  0,  0 },
+    { /* 167:        11 1010 0000 */ 10,   928, 11,  1,  0,  0 },
+    { /* 168:        11 1010 0001 */ 10,   929,  3, 12,  0,  0 },
+    { /* 169:        11 1010 0010 */ 10,   930,  1, 13,  0,  0 },
+    { /* 170:        11 1010 0011 */ 10,   931, 12,  2,  0,  0 },
+    { /* 171:        11 1010 0100 */ 10,   932,  7, 11,  0,  0 },
+    { /* 172:        11 1010 0101 */ 10,   933,  3, 14,  0,  0 },
+    { /* 173:        11 1010 0110 */ 10,   934,  5, 12,  0,  0 },
+    { /* 174:        11 1010 0111 */ 10,   935,  5, 13,  0,  0 },
+    { /* 175:        11 1010 1000 */ 10,   936, 14,  4,  0,  0 },
+    { /* 176:        11 1010 1001 */ 10,   937,  4, 14,  0,  0 },
+    { /* 177:        11 1010 1010 */ 10,   938, 11,  7,  0,  0 },
+    { /* 178:        11 1010 1011 */ 10,   939, 14,  3,  0,  0 },
+    { /* 179:        11 1010 1100 */ 10,   940, 12,  5,  0,  0 },
+    { /* 180:        11 1010 1101 */ 10,   941, 13,  6,  0,  0 },
+    { /* 181:        11 1010 1110 */ 10,   942, 12,  6,  0,  0 },
+    { /* 182:        11 1010 1111 */ 10,   943,  8,  0,  0,  0 },
+    { /* 183:        11 1011 0000 */ 10,   944, 11,  8,  0,  0 },
+    { /* 184:        11 1011 0001 */ 10,   945,  2, 12,  0,  0 },
+    { /* 185:        11 1011 0010 */ 10,   946,  9,  9,  0,  0 },
+    { /* 186:        11 1011 0011 */ 10,   947, 14,  5,  0,  0 },
+    { /* 187:        11 1011 0100 */ 10,   948,  6, 13,  0,  0 },
+    { /* 188:        11 1011 0101 */ 10,   949, 10, 10,  0,  0 },
+    { /* 189:        11 1011 0110 */ 10,   950, 15,  2,  0,  0 },
+    { /* 190:        11 1011 0111 */ 10,   951,  8, 11,  0,  0 },
+    { /* 191:        11 1011 1000 */ 10,   952,  9, 10,  0,  0 },
+    { /* 192:        11 1011 1001 */ 10,   953, 14,  6,  0,  0 },
+    { /* 193:        11 1011 1010 */ 10,   954, 10,  9,  0,  0 },
+    { /* 194:        11 1011 1011 */ 10,   955,  5, 14,  0,  0 },
+    { /* 195:        11 1011 1100 */ 10,   956, 11,  9,  0,  0 },
+    { /* 196:        11 1011 1101 */ 10,   957, 14,  1,  0,  0 },
+    { /* 197:        11 1011 1110 */ 10,   958,  2, 14,  0,  0 },
+    { /* 198:        11 1011 1111 */ 10,   959,  6, 12,  0,  0 },
+    { /* 199:        11 1100 0000 */ 10,   960,  1, 12,  0,  0 },
+    { /* 200:        11 1100 0001 */ 10,   961, 13,  8,  0,  0 },
+    { /* 201:        11 1100 0010 */ 10,   962,  0,  8,  0,  0 },
+    { /* 202:        11 1100 0011 */ 10,   963, 13,  7,  0,  0 },
+    { /* 203:        11 1100 0100 */ 10,   964,  7, 12,  0,  0 },
+    { /* 204:        11 1100 0101 */ 10,   965, 12,  7,  0,  0 },
+    { /* 205:        11 1100 0110 */ 10,   966,  7, 13,  0,  0 },
+    { /* 206:        11 1100 0111 */ 10,   967, 15,  3,  0,  0 },
+    { /* 207:        11 1100 1000 */ 10,   968, 12,  1,  0,  0 },
+    { /* 208:        11 1100 1001 */ 10,   969,  6, 14,  0,  0 },
+    { /* 209:        11 1100 1010 */ 10,   970,  2, 15,  0,  0 },
+    { /* 210:        11 1100 1011 */ 10,   971, 15,  5,  0,  0 },
+    { /* 211:        11 1100 1100 */ 10,   972, 15,  4,  0,  0 },
+    { /* 212:        11 1100 1101 */ 10,   973,  1, 14,  0,  0 },
+    { /* 213:        11 1100 1110 */ 10,   974,  9, 11,  0,  0 },
+    { /* 214:        11 1100 1111 */ 10,   975,  4, 15,  0,  0 },
+    { /* 215:        11 1101 0000 */ 10,   976, 14,  7,  0,  0 },
+    { /* 216:        11 1101 0001 */ 10,   977,  8, 13,  0,  0 },
+    { /* 217:        11 1101 0010 */ 10,   978, 13,  9,  0,  0 },
+    { /* 218:        11 1101 0011 */ 10,   979,  8, 12,  0,  0 },
+    { /* 219:        11 1101 0100 */ 10,   980,  5, 15,  0,  0 },
+    { /* 220:        11 1101 0101 */ 10,   981,  3, 15,  0,  0 },
+    { /* 221:        11 1101 0110 */ 10,   982, 10, 11,  0,  0 },
+    { /* 222:        11 1101 0111 */ 10,   983, 11, 10,  0,  0 },
+    { /* 223:        11 1101 1000 */ 10,   984, 12,  8,  0,  0 },
+    { /* 224:        11 1101 1001 */ 10,   985, 15,  6,  0,  0 },
+    { /* 225:        11 1101 1010 */ 10,   986, 15,  7,  0,  0 },
+    { /* 226:        11 1101 1011 */ 10,   987,  8, 14,  0,  0 },
+    { /* 227:        11 1101 1100 */ 10,   988, 15,  1,  0,  0 },
+    { /* 228:        11 1101 1101 */ 10,   989,  7, 14,  0,  0 },
+    { /* 229:        11 1101 1110 */ 10,   990,  9,  0,  0,  0 },
+    { /* 230:        11 1101 1111 */ 10,   991,  0,  9,  0,  0 },
+    { /* 231:        11 1110 0000 */ 10,   992,  9, 13,  0,  0 },
+    { /* 232:        11 1110 0001 */ 10,   993,  9, 12,  0,  0 },
+    { /* 233:        11 1110 0010 */ 10,   994, 12,  9,  0,  0 },
+    { /* 234:        11 1110 0011 */ 10,   995, 14,  8,  0,  0 },
+    { /* 235:        11 1110 0100 */ 10,   996, 10, 13,  0,  0 },
+    { /* 236:        11 1110 0101 */ 10,   997, 14,  9,  0,  0 },
+    { /* 237:        11 1110 0110 */ 10,   998, 12, 10,  0,  0 },
+    { /* 238:        11 1110 0111 */ 10,   999,  6, 15,  0,  0 },
+    { /* 239:        11 1110 1000 */ 10,  1000,  7, 15,  0,  0 },
+    { /* 240:       111 1101 0010 */ 11,  2002,  9, 14,  0,  0 },
+    { /* 241:       111 1101 0011 */ 11,  2003, 15,  8,  0,  0 },
+    { /* 242:       111 1101 0100 */ 11,  2004, 11, 11,  0,  0 },
+    { /* 243:       111 1101 0101 */ 11,  2005, 11, 14,  0,  0 },
+    { /* 244:       111 1101 0110 */ 11,  2006,  1, 15,  0,  0 },
+    { /* 245:       111 1101 0111 */ 11,  2007, 10, 12,  0,  0 },
+    { /* 246:       111 1101 1000 */ 11,  2008, 10, 14,  0,  0 },
+    { /* 247:       111 1101 1001 */ 11,  2009, 13, 11,  0,  0 },
+    { /* 248:       111 1101 1010 */ 11,  2010, 13, 10,  0,  0 },
+    { /* 249:       111 1101 1011 */ 11,  2011, 11, 13,  0,  0 },
+    { /* 250:       111 1101 1100 */ 11,  2012, 11, 12,  0,  0 },
+    { /* 251:       111 1101 1101 */ 11,  2013,  8, 15,  0,  0 },
+    { /* 252:       111 1101 1110 */ 11,  2014, 14, 11,  0,  0 },
+    { /* 253:       111 1101 1111 */ 11,  2015, 13, 12,  0,  0 },
+    { /* 254:       111 1110 0000 */ 11,  2016, 12, 13,  0,  0 },
+    { /* 255:       111 1110 0001 */ 11,  2017, 15,  9,  0,  0 },
+    { /* 256:       111 1110 0010 */ 11,  2018, 14, 10,  0,  0 },
+    { /* 257:       111 1110 0011 */ 11,  2019, 10,  0,  0,  0 },
+    { /* 258:       111 1110 0100 */ 11,  2020, 12, 11,  0,  0 },
+    { /* 259:       111 1110 0101 */ 11,  2021,  9, 15,  0,  0 },
+    { /* 260:       111 1110 0110 */ 11,  2022,  0, 10,  0,  0 },
+    { /* 261:       111 1110 0111 */ 11,  2023, 12, 12,  0,  0 },
+    { /* 262:       111 1110 1000 */ 11,  2024, 11,  0,  0,  0 },
+    { /* 263:       111 1110 1001 */ 11,  2025, 12, 14,  0,  0 },
+    { /* 264:       111 1110 1010 */ 11,  2026, 10, 15,  0,  0 },
+    { /* 265:       111 1110 1011 */ 11,  2027, 13, 13,  0,  0 },
+    { /* 266:       111 1110 1100 */ 11,  2028,  0, 13,  0,  0 },
+    { /* 267:       111 1110 1101 */ 11,  2029, 14, 12,  0,  0 },
+    { /* 268:       111 1110 1110 */ 11,  2030, 15, 10,  0,  0 },
+    { /* 269:       111 1110 1111 */ 11,  2031, 15, 11,  0,  0 },
+    { /* 270:       111 1111 0000 */ 11,  2032, 11, 15,  0,  0 },
+    { /* 271:       111 1111 0001 */ 11,  2033, 14, 13,  0,  0 },
+    { /* 272:       111 1111 0010 */ 11,  2034, 13,  0,  0,  0 },
+    { /* 273:       111 1111 0011 */ 11,  2035,  0, 11,  0,  0 },
+    { /* 274:       111 1111 0100 */ 11,  2036, 13, 14,  0,  0 },
+    { /* 275:       111 1111 0101 */ 11,  2037, 15, 12,  0,  0 },
+    { /* 276:       111 1111 0110 */ 11,  2038, 15, 13,  0,  0 },
+    { /* 277:       111 1111 0111 */ 11,  2039, 12, 15,  0,  0 },
+    { /* 278:       111 1111 1000 */ 11,  2040, 14,  0,  0,  0 },
+    { /* 279:       111 1111 1001 */ 11,  2041, 14, 14,  0,  0 },
+    { /* 280:       111 1111 1010 */ 11,  2042, 13, 15,  0,  0 },
+    { /* 281:       111 1111 1011 */ 11,  2043, 12,  0,  0,  0 },
+    { /* 282:       111 1111 1100 */ 11,  2044, 14, 15,  0,  0 },
+    { /* 283:      1111 1111 1010 */ 12,  4090,  0, 14,  0,  0 },
+    { /* 284:      1111 1111 1011 */ 12,  4091,  0, 12,  0,  0 },
+    { /* 285:      1111 1111 1100 */ 12,  4092, 15, 14,  0,  0 },
+    { /* 286:      1111 1111 1101 */ 12,  4093, 15,  0,  0,  0 },
+    { /* 287:      1111 1111 1110 */ 12,  4094,  0, 15,  0,  0 },
+    { /* 288:      1111 1111 1111 */ 12,  4095, 15, 15,  0,  0 }
+};
+
+Huffscl bookscl[] = {
+      /* idx                 codeword   len   codew  idx */
+    { /*   0:                       0 */  1,      0,  60 },
+    { /*   1:                     100 */  3,      4,  59 },
+    { /*   2:                    1010 */  4,     10,  61 },
+    { /*   3:                    1011 */  4,     11,  58 },
+    { /*   4:                    1100 */  4,     12,  62 },
+    { /*   5:                  1 1010 */  5,     26,  57 },
+    { /*   6:                  1 1011 */  5,     27,  63 },
+    { /*   7:                 11 1000 */  6,     56,  56 },
+    { /*   8:                 11 1001 */  6,     57,  64 },
+    { /*   9:                 11 1010 */  6,     58,  55 },
+    { /*  10:                 11 1011 */  6,     59,  65 },
+    { /*  11:                111 1000 */  7,    120,  66 },
+    { /*  12:                111 1001 */  7,    121,  54 },
+    { /*  13:                111 1010 */  7,    122,  67 },
+    { /*  14:               1111 0110 */  8,    246,  53 },
+    { /*  15:               1111 0111 */  8,    247,  68 },
+    { /*  16:               1111 1000 */  8,    248,  52 },
+    { /*  17:               1111 1001 */  8,    249,  69 },
+    { /*  18:               1111 1010 */  8,    250,  51 },
+    { /*  19:             1 1111 0110 */  9,    502,  70 },
+    { /*  20:             1 1111 0111 */  9,    503,  50 },
+    { /*  21:             1 1111 1000 */  9,    504,  49 },
+    { /*  22:             1 1111 1001 */  9,    505,  71 },
+    { /*  23:            11 1111 0100 */ 10,   1012,  72 },
+    { /*  24:            11 1111 0101 */ 10,   1013,  48 },
+    { /*  25:            11 1111 0110 */ 10,   1014,  73 },
+    { /*  26:            11 1111 0111 */ 10,   1015,  47 },
+    { /*  27:            11 1111 1000 */ 10,   1016,  74 },
+    { /*  28:            11 1111 1001 */ 10,   1017,  46 },
+    { /*  29:           111 1111 0100 */ 11,   2036,  76 },
+    { /*  30:           111 1111 0101 */ 11,   2037,  75 },
+    { /*  31:           111 1111 0110 */ 11,   2038,  77 },
+    { /*  32:           111 1111 0111 */ 11,   2039,  78 },
+    { /*  33:           111 1111 1000 */ 11,   2040,  45 },
+    { /*  34:           111 1111 1001 */ 11,   2041,  43 },
+    { /*  35:          1111 1111 0100 */ 12,   4084,  44 },
+    { /*  36:          1111 1111 0101 */ 12,   4085,  79 },
+    { /*  37:          1111 1111 0110 */ 12,   4086,  42 },
+    { /*  38:          1111 1111 0111 */ 12,   4087,  41 },
+    { /*  39:          1111 1111 1000 */ 12,   4088,  80 },
+    { /*  40:          1111 1111 1001 */ 12,   4089,  40 },
+    { /*  41:        1 1111 1111 0100 */ 13,   8180,  81 },
+    { /*  42:        1 1111 1111 0101 */ 13,   8181,  39 },
+    { /*  43:        1 1111 1111 0110 */ 13,   8182,  82 },
+    { /*  44:        1 1111 1111 0111 */ 13,   8183,  38 },
+    { /*  45:        1 1111 1111 1000 */ 13,   8184,  83 },
+    { /*  46:       11 1111 1111 0010 */ 14,  16370,  37 },
+    { /*  47:       11 1111 1111 0011 */ 14,  16371,  35 },
+    { /*  48:       11 1111 1111 0100 */ 14,  16372,  85 },
+    { /*  49:       11 1111 1111 0101 */ 14,  16373,  33 },
+    { /*  50:       11 1111 1111 0110 */ 14,  16374,  36 },
+    { /*  51:       11 1111 1111 0111 */ 14,  16375,  34 },
+    { /*  52:       11 1111 1111 1000 */ 14,  16376,  84 },
+    { /*  53:       11 1111 1111 1001 */ 14,  16377,  32 },
+    { /*  54:      111 1111 1111 0100 */ 15,  32756,  87 },
+    { /*  55:      111 1111 1111 0101 */ 15,  32757,  89 },
+    { /*  56:      111 1111 1111 0110 */ 15,  32758,  30 },
+    { /*  57:      111 1111 1111 0111 */ 15,  32759,  31 },
+    { /*  58:     1111 1111 1111 0000 */ 16,  65520,  86 },
+    { /*  59:     1111 1111 1111 0001 */ 16,  65521,  29 },
+    { /*  60:     1111 1111 1111 0010 */ 16,  65522,  26 },
+    { /*  61:     1111 1111 1111 0011 */ 16,  65523,  27 },
+    { /*  62:     1111 1111 1111 0100 */ 16,  65524,  28 },
+    { /*  63:     1111 1111 1111 0101 */ 16,  65525,  24 },
+    { /*  64:     1111 1111 1111 0110 */ 16,  65526,  88 },
+    { /*  65:   1 1111 1111 1110 1110 */ 17, 131054,  25 },
+    { /*  66:   1 1111 1111 1110 1111 */ 17, 131055,  22 },
+    { /*  67:   1 1111 1111 1111 0000 */ 17, 131056,  23 },
+    { /*  68:  11 1111 1111 1110 0010 */ 18, 262114,  90 },
+    { /*  69:  11 1111 1111 1110 0011 */ 18, 262115,  21 },
+    { /*  70:  11 1111 1111 1110 0100 */ 18, 262116,  19 },
+    { /*  71:  11 1111 1111 1110 0101 */ 18, 262117,   3 },
+    { /*  72:  11 1111 1111 1110 0110 */ 18, 262118,   1 },
+    { /*  73:  11 1111 1111 1110 0111 */ 18, 262119,   2 },
+    { /*  74:  11 1111 1111 1110 1000 */ 18, 262120,   0 },
+    { /*  75: 111 1111 1111 1101 0010 */ 19, 524242,  98 },
+    { /*  76: 111 1111 1111 1101 0011 */ 19, 524243,  99 },
+    { /*  77: 111 1111 1111 1101 0100 */ 19, 524244, 100 },
+    { /*  78: 111 1111 1111 1101 0101 */ 19, 524245, 101 },
+    { /*  79: 111 1111 1111 1101 0110 */ 19, 524246, 102 },
+    { /*  80: 111 1111 1111 1101 0111 */ 19, 524247, 117 },
+    { /*  81: 111 1111 1111 1101 1000 */ 19, 524248,  97 },
+    { /*  82: 111 1111 1111 1101 1001 */ 19, 524249,  91 },
+    { /*  83: 111 1111 1111 1101 1010 */ 19, 524250,  92 },
+    { /*  84: 111 1111 1111 1101 1011 */ 19, 524251,  93 },
+    { /*  85: 111 1111 1111 1101 1100 */ 19, 524252,  94 },
+    { /*  86: 111 1111 1111 1101 1101 */ 19, 524253,  95 },
+    { /*  87: 111 1111 1111 1101 1110 */ 19, 524254,  96 },
+    { /*  88: 111 1111 1111 1101 1111 */ 19, 524255, 104 },
+    { /*  89: 111 1111 1111 1110 0000 */ 19, 524256, 111 },
+    { /*  90: 111 1111 1111 1110 0001 */ 19, 524257, 112 },
+    { /*  91: 111 1111 1111 1110 0010 */ 19, 524258, 113 },
+    { /*  92: 111 1111 1111 1110 0011 */ 19, 524259, 114 },
+    { /*  93: 111 1111 1111 1110 0100 */ 19, 524260, 115 },
+    { /*  94: 111 1111 1111 1110 0101 */ 19, 524261, 116 },
+    { /*  95: 111 1111 1111 1110 0110 */ 19, 524262, 110 },
+    { /*  96: 111 1111 1111 1110 0111 */ 19, 524263, 105 },
+    { /*  97: 111 1111 1111 1110 1000 */ 19, 524264, 106 },
+    { /*  98: 111 1111 1111 1110 1001 */ 19, 524265, 107 },
+    { /*  99: 111 1111 1111 1110 1010 */ 19, 524266, 108 },
+    { /* 100: 111 1111 1111 1110 1011 */ 19, 524267, 109 },
+    { /* 101: 111 1111 1111 1110 1100 */ 19, 524268, 118 },
+    { /* 102: 111 1111 1111 1110 1101 */ 19, 524269,   6 },
+    { /* 103: 111 1111 1111 1110 1110 */ 19, 524270,   8 },
+    { /* 104: 111 1111 1111 1110 1111 */ 19, 524271,   9 },
+    { /* 105: 111 1111 1111 1111 0000 */ 19, 524272,  10 },
+    { /* 106: 111 1111 1111 1111 0001 */ 19, 524273,   5 },
+    { /* 107: 111 1111 1111 1111 0010 */ 19, 524274, 103 },
+    { /* 108: 111 1111 1111 1111 0011 */ 19, 524275, 120 },
+    { /* 109: 111 1111 1111 1111 0100 */ 19, 524276, 119 },
+    { /* 110: 111 1111 1111 1111 0101 */ 19, 524277,   4 },
+    { /* 111: 111 1111 1111 1111 0110 */ 19, 524278,   7 },
+    { /* 112: 111 1111 1111 1111 0111 */ 19, 524279,  15 },
+    { /* 113: 111 1111 1111 1111 1000 */ 19, 524280,  16 },
+    { /* 114: 111 1111 1111 1111 1001 */ 19, 524281,  18 },
+    { /* 115: 111 1111 1111 1111 1010 */ 19, 524282,  20 },
+    { /* 116: 111 1111 1111 1111 1011 */ 19, 524283,  17 },
+    { /* 117: 111 1111 1111 1111 1100 */ 19, 524284,  11 },
+    { /* 118: 111 1111 1111 1111 1101 */ 19, 524285,  12 },
+    { /* 119: 111 1111 1111 1111 1110 */ 19, 524286,  14 },
+    { /* 120: 111 1111 1111 1111 1111 */ 19, 524287,  13 }
+};
diff --git a/intensity.c b/intensity.c
new file mode 100644
index 0000000..93b0f85
--- /dev/null
+++ b/intensity.c
@@ -0,0 +1,89 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: intensity.c,v 1.6 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#include <math.h>
+#include "all.h"
+
+/*
+ * if (chan==RIGHT) {
+ *  do IS decoding for this channel (scale left ch. values with
+ *  factor(SFr-SFl) )
+ *  reset all lpflags for which IS is on
+ *  pass decoded IS values to predict
+ * }
+ */
+void intensity( MC_Info *mip, Info *info, int widx, int ch,
+               byte *group, byte *cb_map, int *factors,
+               int *lpflag, Float *coef[Chans] )
+{
+    Ch_Info *cip = &mip->ch_info[ch];
+    Float   *left, *right, *r, *l, scale;
+    int     cb, sign_sfb, sfb, n, nn, b, bb, nband;
+    int   *band;
+
+    if (!(cip->cpe && !cip->ch_is_left))
+        return;
+
+    right = coef[ ch ];
+    left  = coef[ cip->paired_ch ];
+
+    /* Intensity goes by group */
+    bb = 0;
+    for (b = 0; b < info->nsbk; ) {
+    nband = info->sfb_per_sbk[b];
+    band = info->sbk_sfb_top[b];
+
+    b = *group++;       /* b = index of last sbk in group */
+    for (; bb < b; bb++) {  /* bb = sbk index */
+        n = 0;
+        for (sfb = 0; sfb < nband; sfb++){
+        nn = band[sfb]; /* band is offset table, nn is last coef in band */
+        cb = cb_map[sfb];
+        if (cb == INTENSITY_HCB  ||  cb == INTENSITY_HCB2) {
+            /* found intensity code book */
+            /* disable prediction (only important for long blocks) */
+            lpflag[1+sfb] = 0;
+
+                sign_sfb = (cb == INTENSITY_HCB) ? 1 : -1;
+                scale = sign_sfb * (float)pow( 0.5, 0.25*(factors[sfb]) );
+
+            /* reconstruct right intensity values */
+            r = right + n;
+            l = left + n;
+            for (; n < nn; n++) {   /* n is coef index */
+            *r++ = *l++ * scale;
+            }
+        }
+        n = nn;
+        }
+        right += info->bins_per_sbk[bb];
+        left += info->bins_per_sbk[bb];
+        factors += nband;
+    }
+    cb_map += info->sfb_per_sbk[bb-1];
+    }
+}
diff --git a/interface.h b/interface.h
new file mode 100644
index 0000000..334f45d
--- /dev/null
+++ b/interface.h
@@ -0,0 +1,236 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: interface.h,v 1.6 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#ifndef _interface_h_
+#define _interface_h_
+
+/*
+ * interface between the encoder and decoder
+ */
+
+#define C_LN10      2.30258509299404568402      /* ln(10) */
+#define C_PI        3.14159265358979323846f     /* pi */
+#define C_SQRT2     1.41421356237309504880      /* sqrt(2) */
+
+#define MINTHR      .5
+#define SF_C1       (13.33333/1.333333)
+
+/* prediction */
+#define PRED_ORDER  2
+#define PRED_ALPHA  0.90625f
+#define PRED_A      0.953125f
+#define PRED_B      0.953125f
+
+enum
+{
+    /*
+     * block switching
+     */
+    LN          = 2048,
+    SN          = 256,
+    LN2         = LN/2,
+    SN2         = SN/2,
+    LN4         = LN/4,
+    SN4         = SN/4,
+    NSHORT      = LN/SN,
+    MAX_SBK     = NSHORT,
+
+    ONLY_LONG_WINDOW    = 0,
+    LONG_START_WINDOW,
+    EIGHT_SHORT_WINDOW,
+    LONG_STOP_WINDOW,
+    NUM_WIN_SEQ,
+
+    WLONG       = ONLY_LONG_WINDOW,
+    WSTART,
+    WSHORT,
+    WSTOP,
+
+    MAXBANDS        = 16*NSHORT,    /* max number of scale factor bands */
+    MAXFAC      = 121,      /* maximum scale factor */
+    MIDFAC      = (MAXFAC-1)/2,
+    SF_OFFSET       = 100,      /* global gain must be positive */
+
+    /*
+     * specify huffman tables as signed (1) or unsigned (0)
+     */
+    HUF1SGN     = 1,
+    HUF2SGN     = 1,
+    HUF3SGN     = 0,
+    HUF4SGN     = 0,
+    HUF5SGN     = 1,
+    HUF6SGN     = 1,
+    HUF7SGN     = 0,
+    HUF8SGN     = 0,
+    HUF9SGN     = 0,
+    HUF10SGN        = 0,
+    HUF11SGN        = 0,
+
+    ZERO_HCB        = 0,
+    BY4BOOKS        = 4,
+    ESCBOOK     = 11,
+    NSPECBOOKS      = ESCBOOK + 1,
+    BOOKSCL     = NSPECBOOKS,
+    NBOOKS      = NSPECBOOKS+1,
+    INTENSITY_HCB2  = 14,
+    INTENSITY_HCB   = 15,
+    NOISE_HCB       = 13,
+
+    NOISE_PCM_BITS      = 9,
+    NOISE_PCM_OFFSET    = (1 << (NOISE_PCM_BITS-1)),
+
+    NOISE_OFFSET        = 90,
+
+    LONG_SECT_BITS  = 5,
+    SHORT_SECT_BITS = 3,
+
+    /*
+     * Program Configuration
+     */
+    AACMAIN = 0,
+    AACLC = 1,
+    AACSSR = 2,
+    AACLTP = 3,
+
+    Fs_48       = 3,
+    Fs_44       = 4,
+    Fs_32       = 5,
+
+    /*
+     * Misc constants
+     */
+    CC_DOM      = 0,    /* before TNS */
+    CC_IND      = 1,
+
+    /*
+     * Raw bitstream constants
+     */
+    LEN_SE_ID       = 3,
+    LEN_TAG     = 4,
+    LEN_COM_WIN     = 1,
+    LEN_ICS_RESERV  = 1,
+    LEN_WIN_SEQ     = 2,
+    LEN_WIN_SH      = 1,
+    LEN_MAX_SFBL    = 6,
+    LEN_MAX_SFBS    = 4,
+    LEN_CB      = 4,
+    LEN_SCL_PCM     = 8,
+    LEN_PRED_PRES   = 1,
+    LEN_PRED_RST    = 1,
+    LEN_PRED_RSTGRP = 5,
+    LEN_PRED_ENAB   = 1,
+    LEN_MASK_PRES   = 2,
+    LEN_MASK        = 1,
+    LEN_PULSE_PRES  = 1,
+    LEN_TNS_PRES    = 1,
+    LEN_GAIN_PRES   = 1,
+
+    LEN_NPULSE  = 2,
+    LEN_PULSE_ST_SFB    = 6,
+    LEN_POFF    = 5,
+    LEN_PAMP    = 4,
+    NUM_PULSE_LINES = 4,
+    PULSE_OFFSET_AMP    = 4,
+
+    LEN_IND_CCE_FLG = 1,
+    LEN_NCC     = 3,
+    LEN_IS_CPE      = 1,
+    LEN_CC_LR       = 1,
+    LEN_CC_DOM      = 1,
+    LEN_CC_SGN      = 1,
+    LEN_CCH_GES     = 2,
+    LEN_CCH_CGP     = 1,
+
+    LEN_D_ALIGN     = 1,
+    LEN_D_CNT       = 8,
+    LEN_D_ESC       = 8,
+    LEN_F_CNT       = 4,
+    LEN_F_ESC       = 8,
+    LEN_NIBBLE      = 4,
+    LEN_BYTE        = 8,
+    LEN_PAD_DATA    = 8,
+    MAX_DBYTES  = ((1<<LEN_D_CNT) + (1<<LEN_D_ESC)),
+
+    LEN_PC_COMM     = 8,
+
+    /* FILL */
+    LEN_EX_TYPE     = 4,    /* don't use 0x0 or 0xA as extension type! */
+    EX_FILL     = 0,
+    EX_FILL_DATA    = 1,
+    EX_DRC      = 11,
+
+    /* sfb 40, coef 672, pred bw of 15.75 kHz at 48 kHz
+     * this is also the highest number of bins used
+     * by predictor for any sampling rate
+     */
+    MAX_PRED_SFB    = 40,   /* 48 kHz only, now obsolete */
+    MAX_PRED_BINS   = 672,
+
+    ID_SCE      = 0,
+    ID_CPE,
+    ID_CCE,
+    ID_LFE,
+    ID_DSE,
+    ID_PCE,
+    ID_FIL,
+    ID_END,
+
+    /* PLL's don't like idle channels! */
+    FILL_VALUE      = 0x55,
+
+    /*
+     * program configuration element
+     */
+    LEN_OBJECTTYPE = 2,
+    LEN_SAMP_IDX = 4,
+    LEN_NUM_ELE = 4,
+    LEN_NUM_LFE = 2,
+    LEN_NUM_DAT = 3,
+    LEN_NUM_CCE = 4,
+    LEN_MIX_PRES = 1,
+    LEN_MMIX_IDX = 2,
+    LEN_PSUR_ENAB = 1,
+    LEN_ELE_IS_CPE = 1,
+    LEN_IND_SW_CCE = 1,
+    LEN_COMMENT_BYTES = 8,
+
+    /*
+     * audio data interchange format header
+     */
+    LEN_ADIF_ID     = (32/8),
+    LEN_COPYRT_PRES = 1,
+    LEN_COPYRT_ID   = (72/8),
+    LEN_ORIG        = 1,
+    LEN_HOME        = 1,
+    LEN_BS_TYPE     = 1,
+    LEN_BIT_RATE    = 23,
+    LEN_NUM_PCE     = 4,
+    LEN_ADIF_BF     = 20,
+    XXX
+};
+
+#endif   /* #ifndef _interface_h_ */
diff --git a/kbd_win.h b/kbd_win.h
new file mode 100644
index 0000000..62f4f4e
--- /dev/null
+++ b/kbd_win.h
@@ -0,0 +1,1198 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: kbd_win.h,v 1.2 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#ifndef _KBD_WIN_H_
+#define _KBD_WIN_H_
+
+#ifdef WIN_TABLE
+
+#ifdef _MSC_VER
+#pragma warning(disable:4305)
+#endif
+
+float kbd_long[] = {  /* IBLEN = 1024 */
+    0.00029256153896361,
+    0.00042998567353047,
+    0.00054674074589540,
+    0.00065482304299792,
+    0.00075870195068747,
+    0.00086059331713336,
+    0.00096177541439010,
+    0.0010630609410878,
+    0.0011650036308132,
+    0.0012680012194148,
+    0.0013723517232956,
+    0.0014782864109136,
+    0.0015859901976719,
+    0.0016956148252373,
+    0.0018072876903517,
+    0.0019211179405514,
+    0.0020372007924215,
+    0.0021556206591754,
+    0.0022764534599614,
+    0.0023997683540995,
+    0.0025256290631156,
+    0.0026540948920831,
+    0.0027852215281403,
+    0.0029190616715331,
+    0.0030556655443223,
+    0.0031950812943391,
+    0.0033373553240392,
+    0.0034825325586930,
+    0.0036306566699199,
+    0.0037817702604646,
+    0.0039359150179719,
+    0.0040931318437260,
+    0.0042534609610026,
+    0.0044169420066964,
+    0.0045836141091341,
+    0.0047535159544086,
+    0.0049266858431214,
+    0.0051031617390698,
+    0.0052829813111335,
+    0.0054661819693975,
+    0.0056528008963682,
+    0.0058428750739943,
+    0.0060364413070882,
+    0.0062335362436492,
+    0.0064341963925079,
+    0.0066384581386503,
+    0.0068463577565218,
+    0.0070579314215715,
+    0.0072732152202559,
+    0.0074922451586909,
+    0.0077150571701162,
+    0.0079416871213115,
+    0.0081721708180857,
+    0.0084065440099458,
+    0.0086448423940363,
+    0.0088871016184291,
+    0.0091333572848345,
+    0.0093836449507939,
+    0.0096380001314086,
+    0.0098964583006517,
+    0.010159054892306,
+    0.010425825300561,
+    0.010696804880310,
+    0.010972028947167,
+    0.011251532777236,
+    0.011535351606646,
+    0.011823520630897,
+    0.012116075003993,
+    0.012413049837429,
+    0.012714480198999,
+    0.013020401111478,
+    0.013330847551161,
+    0.013645854446288,
+    0.013965456675352,
+    0.014289689065314,
+    0.014618586389712,
+    0.014952183366697,
+    0.015290514656976,
+    0.015633614861688,
+    0.015981518520214,
+    0.016334260107915,
+    0.016691874033817,
+    0.017054394638241,
+    0.017421856190380,
+    0.017794292885832,
+    0.018171738844085,
+    0.018554228105962,
+    0.018941794631032,
+    0.019334472294980,
+    0.019732294886947,
+    0.020135296106839,
+    0.020543509562604,
+    0.020956968767488,
+    0.021375707137257,
+    0.021799757987407,
+    0.022229154530343,
+    0.022663929872540,
+    0.023104117011689,
+    0.023549748833816,
+    0.024000858110398,
+    0.024457477495451,
+    0.024919639522613,
+    0.025387376602207,
+    0.025860721018295,
+    0.026339704925726,
+    0.026824360347160,
+    0.027314719170100,
+    0.027810813143900,
+    0.028312673876775,
+    0.028820332832801,
+    0.029333821328905,
+    0.029853170531859,
+    0.030378411455255,
+    0.030909574956490,
+    0.031446691733739,
+    0.031989792322926,
+    0.032538907094693,
+    0.033094066251369,
+    0.033655299823935,
+    0.034222637668991,
+    0.034796109465717,
+    0.035375744712844,
+    0.035961572725616,
+    0.036553622632758,
+    0.037151923373446,
+    0.037756503694277,
+    0.038367392146243,
+    0.038984617081711,
+    0.039608206651398,
+    0.040238188801359,
+    0.040874591269976,
+    0.041517441584950,
+    0.042166767060301,
+    0.042822594793376,
+    0.043484951661852,
+    0.044153864320760,
+    0.044829359199509,
+    0.045511462498913,
+    0.046200200188234,
+    0.046895598002228,
+    0.047597681438201,
+    0.048306475753074,
+    0.049022005960455,
+    0.049744296827725,
+    0.050473372873129,
+    0.051209258362879,
+    0.051951977308273,
+    0.052701553462813,
+    0.053458010319350,
+    0.054221371107223,
+    0.054991658789428,
+    0.055768896059787,
+    0.056553105340134,
+    0.057344308777513,
+    0.058142528241393,
+    0.058947785320893,
+    0.059760101322019,
+    0.060579497264926,
+    0.061405993881180,
+    0.062239611611049,
+    0.063080370600799,
+    0.063928290700012,
+    0.064783391458919,
+    0.065645692125747,
+    0.066515211644086,
+    0.067391968650269,
+    0.068275981470777,
+    0.069167268119652,
+    0.070065846295935,
+    0.070971733381121,
+    0.071884946436630,
+    0.072805502201299,
+    0.073733417088896,
+    0.074668707185649,
+    0.075611388247794,
+    0.076561475699152,
+    0.077518984628715,
+    0.078483929788261,
+    0.079456325589986,
+    0.080436186104162,
+    0.081423525056808,
+    0.082418355827392,
+    0.083420691446553,
+    0.084430544593841,
+    0.085447927595483,
+    0.086472852422178,
+    0.087505330686900,
+    0.088545373642744,
+    0.089592992180780,
+    0.090648196827937,
+    0.091710997744919,
+    0.092781404724131,
+    0.093859427187640,
+    0.094945074185163,
+    0.096038354392069,
+    0.097139276107423,
+    0.098247847252041,
+    0.099364075366580,
+    0.10048796760965,
+    0.10161953075597,
+    0.10275877119451,
+    0.10390569492671,
+    0.10506030756469,
+    0.10622261432949,
+    0.10739262004941,
+    0.10857032915821,
+    0.10975574569357,
+    0.11094887329534,
+    0.11214971520402,
+    0.11335827425914,
+    0.11457455289772,
+    0.11579855315274,
+    0.11703027665170,
+    0.11826972461510,
+    0.11951689785504,
+    0.12077179677383,
+    0.12203442136263,
+    0.12330477120008,
+    0.12458284545102,
+    0.12586864286523,
+    0.12716216177615,
+    0.12846340009971,
+    0.12977235533312,
+    0.13108902455375,
+    0.13241340441801,
+    0.13374549116025,
+    0.13508528059173,
+    0.13643276809961,
+    0.13778794864595,
+    0.13915081676677,
+    0.14052136657114,
+    0.14189959174027,
+    0.14328548552671,
+    0.14467904075349,
+    0.14608024981336,
+    0.14748910466804,
+    0.14890559684750,
+    0.15032971744929,
+    0.15176145713790,
+    0.15320080614414,
+    0.15464775426459,
+    0.15610229086100,
+    0.15756440485987,
+    0.15903408475193,
+    0.16051131859170,
+    0.16199609399712,
+    0.16348839814917,
+    0.16498821779156,
+    0.16649553923042,
+    0.16801034833404,
+    0.16953263053270,
+    0.17106237081842,
+    0.17259955374484,
+    0.17414416342714,
+    0.17569618354193,
+    0.17725559732720,
+    0.17882238758238,
+    0.18039653666830,
+    0.18197802650733,
+    0.18356683858343,
+    0.18516295394233,
+    0.18676635319174,
+    0.18837701650148,
+    0.18999492360384,
+    0.19162005379380,
+    0.19325238592940,
+    0.19489189843209,
+    0.19653856928714,
+    0.19819237604409,
+    0.19985329581721,
+    0.20152130528605,
+    0.20319638069594,
+    0.20487849785865,
+    0.20656763215298,
+    0.20826375852540,
+    0.20996685149083,
+    0.21167688513330,
+    0.21339383310678,
+    0.21511766863598,
+    0.21684836451719,
+    0.21858589311922,
+    0.22033022638425,
+    0.22208133582887,
+    0.22383919254503,
+    0.22560376720111,
+    0.22737503004300,
+    0.22915295089517,
+    0.23093749916189,
+    0.23272864382838,
+    0.23452635346201,
+    0.23633059621364,
+    0.23814133981883,
+    0.23995855159925,
+    0.24178219846403,
+    0.24361224691114,
+    0.24544866302890,
+    0.24729141249740,
+    0.24914046059007,
+    0.25099577217522,
+    0.25285731171763,
+    0.25472504328019,
+    0.25659893052556,
+    0.25847893671788,
+    0.26036502472451,
+    0.26225715701781,
+    0.26415529567692,
+    0.26605940238966,
+    0.26796943845439,
+    0.26988536478190,
+    0.27180714189742,
+    0.27373472994256,
+    0.27566808867736,
+    0.27760717748238,
+    0.27955195536071,
+    0.28150238094021,
+    0.28345841247557,
+    0.28542000785059,
+    0.28738712458038,
+    0.28935971981364,
+    0.29133775033492,
+    0.29332117256704,
+    0.29530994257338,
+    0.29730401606034,
+    0.29930334837974,
+    0.30130789453132,
+    0.30331760916521,
+    0.30533244658452,
+    0.30735236074785,
+    0.30937730527195,
+    0.31140723343430,
+    0.31344209817583,
+    0.31548185210356,
+    0.31752644749341,
+    0.31957583629288,
+    0.32162997012390,
+    0.32368880028565,
+    0.32575227775738,
+    0.32782035320134,
+    0.32989297696566,
+    0.33197009908736,
+    0.33405166929523,
+    0.33613763701295,
+    0.33822795136203,
+    0.34032256116495,
+    0.34242141494820,
+    0.34452446094547,
+    0.34663164710072,
+    0.34874292107143,
+    0.35085823023181,
+    0.35297752167598,
+    0.35510074222129,
+    0.35722783841160,
+    0.35935875652060,
+    0.36149344255514,
+    0.36363184225864,
+    0.36577390111444,
+    0.36791956434930,
+    0.37006877693676,
+    0.37222148360070,
+    0.37437762881878,
+    0.37653715682603,
+    0.37870001161834,
+    0.38086613695607,
+    0.38303547636766,
+    0.38520797315322,
+    0.38738357038821,
+    0.38956221092708,
+    0.39174383740701,
+    0.39392839225157,
+    0.39611581767449,
+    0.39830605568342,
+    0.40049904808370,
+    0.40269473648218,
+    0.40489306229101,
+    0.40709396673153,
+    0.40929739083810,
+    0.41150327546197,
+    0.41371156127524,
+    0.41592218877472,
+    0.41813509828594,
+    0.42035022996702,
+    0.42256752381274,
+    0.42478691965848,
+    0.42700835718423,
+    0.42923177591866,
+    0.43145711524314,
+    0.43368431439580,
+    0.43591331247564,
+    0.43814404844658,
+    0.44037646114161,
+    0.44261048926688,
+    0.44484607140589,
+    0.44708314602359,
+    0.44932165147057,
+    0.45156152598727,
+    0.45380270770813,
+    0.45604513466581,
+    0.45828874479543,
+    0.46053347593880,
+    0.46277926584861,
+    0.46502605219277,
+    0.46727377255861,
+    0.46952236445718,
+    0.47177176532752,
+    0.47402191254100,
+    0.47627274340557,
+    0.47852419517009,
+    0.48077620502869,
+    0.48302871012505,
+    0.48528164755674,
+    0.48753495437962,
+    0.48978856761212,
+    0.49204242423966,
+    0.49429646121898,
+    0.49655061548250,
+    0.49880482394273,
+    0.50105902349665,
+    0.50331315103004,
+    0.50556714342194,
+    0.50782093754901,
+    0.51007447028990,
+    0.51232767852971,
+    0.51458049916433,
+    0.51683286910489,
+    0.51908472528213,
+    0.52133600465083,
+    0.52358664419420,
+    0.52583658092832,
+    0.52808575190648,
+    0.53033409422367,
+    0.53258154502092,
+    0.53482804148974,
+    0.53707352087652,
+    0.53931792048690,
+    0.54156117769021,
+    0.54380322992385,
+    0.54604401469766,
+    0.54828346959835,
+    0.55052153229384,
+    0.55275814053768,
+    0.55499323217338,
+    0.55722674513883,
+    0.55945861747062,
+    0.56168878730842,
+    0.56391719289930,
+    0.56614377260214,
+    0.56836846489188,
+    0.57059120836390,
+    0.57281194173835,
+    0.57503060386439,
+    0.57724713372458,
+    0.57946147043912,
+    0.58167355327012,
+    0.58388332162591,
+    0.58609071506528,
+    0.58829567330173,
+    0.59049813620770,
+    0.59269804381879,
+    0.59489533633802,
+    0.59708995413996,
+    0.59928183777495,
+    0.60147092797329,
+    0.60365716564937,
+    0.60584049190582,
+    0.60802084803764,
+    0.61019817553632,
+    0.61237241609393,
+    0.61454351160718,
+    0.61671140418155,
+    0.61887603613527,
+    0.62103735000336,
+    0.62319528854167,
+    0.62534979473088,
+    0.62750081178042,
+    0.62964828313250,
+    0.63179215246597,
+    0.63393236370030,
+    0.63606886099946,
+    0.63820158877577,
+    0.64033049169379,
+    0.64245551467413,
+    0.64457660289729,
+    0.64669370180740,
+    0.64880675711607,
+    0.65091571480603,
+    0.65302052113494,
+    0.65512112263906,
+    0.65721746613689,
+    0.65930949873289,
+    0.66139716782102,
+    0.66348042108842,
+    0.66555920651892,
+    0.66763347239664,
+    0.66970316730947,
+    0.67176824015260,
+    0.67382864013196,
+    0.67588431676768,
+    0.67793521989751,
+    0.67998129968017,
+    0.68202250659876,
+    0.68405879146403,
+    0.68609010541774,
+    0.68811639993588,
+    0.69013762683195,
+    0.69215373826012,
+    0.69416468671849,
+    0.69617042505214,
+    0.69817090645634,
+    0.70016608447958,
+    0.70215591302664,
+    0.70414034636163,
+    0.70611933911096,
+    0.70809284626630,
+    0.71006082318751,
+    0.71202322560554,
+    0.71398000962530,
+    0.71593113172842,
+    0.71787654877613,
+    0.71981621801195,
+    0.72175009706445,
+    0.72367814394990,
+    0.72560031707496,
+    0.72751657523927,
+    0.72942687763803,
+    0.73133118386457,
+    0.73322945391280,
+    0.73512164817975,
+    0.73700772746796,
+    0.73888765298787,
+    0.74076138636020,
+    0.74262888961827,
+    0.74449012521027,
+    0.74634505600152,
+    0.74819364527663,
+    0.75003585674175,
+    0.75187165452661,
+    0.75370100318668,
+    0.75552386770515,
+    0.75734021349500,
+    0.75915000640095,
+    0.76095321270137,
+    0.76274979911019,
+    0.76453973277875,
+    0.76632298129757,
+    0.76809951269819,
+    0.76986929545481,
+    0.77163229848604,
+    0.77338849115651,
+    0.77513784327849,
+    0.77688032511340,
+    0.77861590737340,
+    0.78034456122283,
+    0.78206625827961,
+    0.78378097061667,
+    0.78548867076330,
+    0.78718933170643,
+    0.78888292689189,
+    0.79056943022564,
+    0.79224881607494,
+    0.79392105926949,
+    0.79558613510249,
+    0.79724401933170,
+    0.79889468818046,
+    0.80053811833858,
+    0.80217428696334,
+    0.80380317168028,
+    0.80542475058405,
+    0.80703900223920,
+    0.80864590568089,
+    0.81024544041560,
+    0.81183758642175,
+    0.81342232415032,
+    0.81499963452540,
+    0.81656949894467,
+    0.81813189927991,
+    0.81968681787738,
+    0.82123423755821,
+    0.82277414161874,
+    0.82430651383076,
+    0.82583133844180,
+    0.82734860017528,
+    0.82885828423070,
+    0.83036037628369,
+    0.83185486248609,
+    0.83334172946597,
+    0.83482096432759,
+    0.83629255465130,
+    0.83775648849344,
+    0.83921275438615,
+    0.84066134133716,
+    0.84210223882952,
+    0.84353543682130,
+    0.84496092574524,
+    0.84637869650833,
+    0.84778874049138,
+    0.84919104954855,
+    0.85058561600677,
+    0.85197243266520,
+    0.85335149279457,
+    0.85472279013653,
+    0.85608631890295,
+    0.85744207377513,
+    0.85879004990298,
+    0.86013024290422,
+    0.86146264886346,
+    0.86278726433124,
+    0.86410408632306,
+    0.86541311231838,
+    0.86671434025950,
+    0.86800776855046,
+    0.86929339605590,
+    0.87057122209981,
+    0.87184124646433,
+    0.87310346938840,
+    0.87435789156650,
+    0.87560451414719,
+    0.87684333873173,
+    0.87807436737261,
+    0.87929760257204,
+    0.88051304728038,
+    0.88172070489456,
+    0.88292057925645,
+    0.88411267465117,
+    0.88529699580537,
+    0.88647354788545,
+    0.88764233649580,
+    0.88880336767692,
+    0.88995664790351,
+    0.89110218408260,
+    0.89223998355154,
+    0.89337005407600,
+    0.89449240384793,
+    0.89560704148345,
+    0.89671397602074,
+    0.89781321691786,
+    0.89890477405053,
+    0.89998865770993,
+    0.90106487860034,
+    0.90213344783689,
+    0.90319437694315,
+    0.90424767784873,
+    0.90529336288690,
+    0.90633144479201,
+    0.90736193669708,
+    0.90838485213119,
+    0.90940020501694,
+    0.91040800966776,
+    0.91140828078533,
+    0.91240103345685,
+    0.91338628315231,
+    0.91436404572173,
+    0.91533433739238,
+    0.91629717476594,
+    0.91725257481564,
+    0.91820055488334,
+    0.91914113267664,
+    0.92007432626589,
+    0.92100015408120,
+    0.92191863490944,
+    0.92282978789113,
+    0.92373363251740,
+    0.92463018862687,
+    0.92551947640245,
+    0.92640151636824,
+    0.92727632938624,
+    0.92814393665320,
+    0.92900435969727,
+    0.92985762037477,
+    0.93070374086684,
+    0.93154274367610,
+    0.93237465162328,
+    0.93319948784382,
+    0.93401727578443,
+    0.93482803919967,
+    0.93563180214841,
+    0.93642858899043,
+    0.93721842438279,
+    0.93800133327637,
+    0.93877734091223,
+    0.93954647281807,
+    0.94030875480458,
+    0.94106421296182,
+    0.94181287365556,
+    0.94255476352362,
+    0.94328990947213,
+    0.94401833867184,
+    0.94474007855439,
+    0.94545515680855,
+    0.94616360137644,
+    0.94686544044975,
+    0.94756070246592,
+    0.94824941610434,
+    0.94893161028248,
+    0.94960731415209,
+    0.95027655709525,
+    0.95093936872056,
+    0.95159577885924,
+    0.95224581756115,
+    0.95288951509097,
+    0.95352690192417,
+    0.95415800874314,
+    0.95478286643320,
+    0.95540150607863,
+    0.95601395895871,
+    0.95662025654373,
+    0.95722043049100,
+    0.95781451264084,
+    0.95840253501260,
+    0.95898452980058,
+    0.95956052937008,
+    0.96013056625336,
+    0.96069467314557,
+    0.96125288290073,
+    0.96180522852773,
+    0.96235174318622,
+    0.96289246018262,
+    0.96342741296604,
+    0.96395663512424,
+    0.96448016037959,
+    0.96499802258499,
+    0.96551025571985,
+    0.96601689388602,
+    0.96651797130376,
+    0.96701352230768,
+    0.96750358134269,
+    0.96798818295998,
+    0.96846736181297,
+    0.96894115265327,
+    0.96940959032667,
+    0.96987270976912,
+    0.97033054600270,
+    0.97078313413161,
+    0.97123050933818,
+    0.97167270687887,
+    0.97210976208030,
+    0.97254171033525,
+    0.97296858709871,
+    0.97339042788392,
+    0.97380726825843,
+    0.97421914384017,
+    0.97462609029350,
+    0.97502814332534,
+    0.97542533868127,
+    0.97581771214160,
+    0.97620529951759,
+    0.97658813664749,
+    0.97696625939282,
+    0.97733970363445,
+    0.97770850526884,
+    0.97807270020427,
+    0.97843232435704,
+    0.97878741364771,
+    0.97913800399743,
+    0.97948413132414,
+    0.97982583153895,
+    0.98016314054243,
+    0.98049609422096,
+    0.98082472844313,
+    0.98114907905608,
+    0.98146918188197,
+    0.98178507271438,
+    0.98209678731477,
+    0.98240436140902,
+    0.98270783068385,
+    0.98300723078342,
+    0.98330259730589,
+    0.98359396579995,
+    0.98388137176152,
+    0.98416485063031,
+    0.98444443778651,
+    0.98472016854752,
+    0.98499207816463,
+    0.98526020181980,
+    0.98552457462240,
+    0.98578523160609,
+    0.98604220772560,
+    0.98629553785362,
+    0.98654525677772,
+    0.98679139919726,
+    0.98703399972035,
+    0.98727309286089,
+    0.98750871303556,
+    0.98774089456089,
+    0.98796967165036,
+    0.98819507841154,
+    0.98841714884323,
+    0.98863591683269,
+    0.98885141615285,
+    0.98906368045957,
+    0.98927274328896,
+    0.98947863805473,
+    0.98968139804554,
+    0.98988105642241,
+    0.99007764621618,
+    0.99027120032501,
+    0.99046175151186,
+    0.99064933240208,
+    0.99083397548099,
+    0.99101571309153,
+    0.99119457743191,
+    0.99137060055337,
+    0.99154381435784,
+    0.99171425059582,
+    0.99188194086414,
+    0.99204691660388,
+    0.99220920909823,
+    0.99236884947045,
+    0.99252586868186,
+    0.99268029752989,
+    0.99283216664606,
+    0.99298150649419,
+    0.99312834736847,
+    0.99327271939167,
+    0.99341465251338,
+    0.99355417650825,
+    0.99369132097430,
+    0.99382611533130,
+    0.99395858881910,
+    0.99408877049612,
+    0.99421668923778,
+    0.99434237373503,
+    0.99446585249289,
+    0.99458715382906,
+    0.99470630587254,
+    0.99482333656229,
+    0.99493827364600,
+    0.99505114467878,
+    0.99516197702200,
+    0.99527079784214,
+    0.99537763410962,
+    0.99548251259777,
+    0.99558545988178,
+    0.99568650233767,
+    0.99578566614138,
+    0.99588297726783,
+    0.99597846149005,
+    0.99607214437834,
+    0.99616405129947,
+    0.99625420741595,
+    0.99634263768527,
+    0.99642936685928,
+    0.99651441948352,
+    0.99659781989663,
+    0.99667959222978,
+    0.99675976040620,
+    0.99683834814063,
+    0.99691537893895,
+    0.99699087609774,
+    0.99706486270391,
+    0.99713736163442,
+    0.99720839555593,
+    0.99727798692461,
+    0.99734615798589,
+    0.99741293077431,
+    0.99747832711337,
+    0.99754236861541,
+    0.99760507668158,
+    0.99766647250181,
+    0.99772657705478,
+    0.99778541110799,
+    0.99784299521785,
+    0.99789934972976,
+    0.99795449477828,
+    0.99800845028730,
+    0.99806123597027,
+    0.99811287133042,
+    0.99816337566108,
+    0.99821276804596,
+    0.99826106735952,
+    0.99830829226732,
+    0.99835446122649,
+    0.99839959248609,
+    0.99844370408765,
+    0.99848681386566,
+    0.99852893944805,
+    0.99857009825685,
+    0.99861030750869,
+    0.99864958421549,
+    0.99868794518504,
+    0.99872540702178,
+    0.99876198612738,
+    0.99879769870160,
+    0.99883256074295,
+    0.99886658804953,
+    0.99889979621983,
+    0.99893220065356,
+    0.99896381655254,
+    0.99899465892154,
+    0.99902474256924,
+    0.99905408210916,
+    0.99908269196056,
+    0.99911058634952,
+    0.99913777930986,
+    0.99916428468421,
+    0.99919011612505,
+    0.99921528709576,
+    0.99923981087174,
+    0.99926370054150,
+    0.99928696900779,
+    0.99930962898876,
+    0.99933169301910,
+    0.99935317345126,
+    0.99937408245662,
+    0.99939443202674,
+    0.99941423397457,
+    0.99943349993572,
+    0.99945224136972,
+    0.99947046956130,
+    0.99948819562171,
+    0.99950543049000,
+    0.99952218493439,
+    0.99953846955355,
+    0.99955429477803,
+    0.99956967087154,
+    0.99958460793242,
+    0.99959911589494,
+    0.99961320453077,
+    0.99962688345035,
+    0.99964016210433,
+    0.99965304978499,
+    0.99966555562769,
+    0.99967768861231,
+    0.99968945756473,
+    0.99970087115825,
+    0.99971193791510,
+    0.99972266620792,
+    0.99973306426121,
+    0.99974314015288,
+    0.99975290181568,
+    0.99976235703876,
+    0.99977151346914,
+    0.99978037861326,
+    0.99978895983845,
+    0.99979726437448,
+    0.99980529931507,
+    0.99981307161943,
+    0.99982058811377,
+    0.99982785549283,
+    0.99983488032144,
+    0.99984166903600,
+    0.99984822794606,
+    0.99985456323584,
+    0.99986068096572,
+    0.99986658707386,
+    0.99987228737764,
+    0.99987778757524,
+    0.99988309324717,
+    0.99988820985777,
+    0.99989314275675,
+    0.99989789718072,
+    0.99990247825468,
+    0.99990689099357,
+    0.99991114030376,
+    0.99991523098456,
+    0.99991916772971,
+    0.99992295512891,
+    0.99992659766930,
+    0.99993009973692,
+    0.99993346561824,
+    0.99993669950161,
+    0.99993980547870,
+    0.99994278754604,
+    0.99994564960642,
+    0.99994839547033,
+    0.99995102885747,
+    0.99995355339809,
+    0.99995597263451,
+    0.99995829002249,
+    0.99996050893264,
+    0.99996263265183,
+    0.99996466438460,
+    0.99996660725452,
+    0.99996846430558,
+    0.99997023850356,
+    0.99997193273736,
+    0.99997354982037,
+    0.99997509249183,
+    0.99997656341810,
+    0.99997796519400,
+    0.99997930034415,
+    0.99998057132421,
+    0.99998178052220,
+    0.99998293025975,
+    0.99998402279338,
+    0.99998506031574,
+    0.99998604495686,
+    0.99998697878536,
+    0.99998786380966,
+    0.99998870197921,
+    0.99998949518567,
+    0.99999024526408,
+    0.99999095399401,
+    0.99999162310077,
+    0.99999225425649,
+    0.99999284908128,
+    0.99999340914435,
+    0.99999393596510,
+    0.99999443101421,
+    0.99999489571473,
+    0.99999533144314,
+    0.99999573953040,
+    0.99999612126300,
+    0.99999647788395,
+    0.99999681059383,
+    0.99999712055178,
+    0.99999740887647,
+    0.99999767664709,
+    0.99999792490431,
+    0.99999815465123,
+    0.99999836685427,
+    0.99999856244415,
+    0.99999874231676,
+    0.99999890733405,
+    0.99999905832493,
+    0.99999919608613,
+    0.99999932138304,
+    0.99999943495056,
+    0.99999953749392,
+    0.99999962968950,
+    0.99999971218563,
+    0.99999978560337,
+    0.99999985053727,
+    0.99999990755616,
+    0.99999995720387
+};
+
+
+float kbd_short [] = {  /* 128 pt half window */
+    4.3795702929468881e-005,
+    0.00011867384265436617,
+    0.0002307165763996192,
+    0.00038947282760568383,
+    0.00060581272288302553,
+    0.00089199695169487453,
+    0.0012617254423430522,
+    0.0017301724373162003,
+    0.0023140071937421476,
+    0.0030313989666022221,
+    0.0039020049735530842,
+    0.0049469401815512024,
+    0.0061887279335368318,
+    0.0076512306364647726,
+    0.0093595599562652423,
+    0.011339966208377799,
+    0.013619706891715299,
+    0.016226894586323766,
+    0.019190324717288168,
+    0.022539283975960878,
+    0.026303340480472455,
+    0.030512117046644357,
+    0.03519504922365594,
+    0.040381130021856941,
+    0.046098643518702249,
+    0.052374889768730587,
+    0.059235903660769147,
+    0.066706170556282418,
+    0.074808341703430481,
+    0.083562952548726227,
+    0.092988147159339674,
+    0.1030994120216919,
+    0.11390932249409955,
+    0.12542730516149531,
+    0.13765941926783826,
+    0.15060816028651081,
+    0.16427228853114245,
+    0.17864668550988483,
+    0.19372224048676889,
+    0.20948576943658073,
+    0.22591996826744942,
+    0.24300340184133981,
+    0.26071052995068139,
+    0.27901177101369551,
+    0.29787360383626599,
+    0.3172587073594233,
+    0.33712613787396362,
+    0.35743154274286698,
+    0.37812740923363009,
+    0.39916334663203618,
+    0.42048639939189658,
+    0.4420413886774246,
+    0.4637712792815169,
+    0.4856175685594023,
+    0.50752069370766872,
+    0.52942045344797806,
+    0.55125643994680196,
+    0.57296847662071559,
+    0.59449705734411495,
+    0.61578378249506627,
+    0.63677178724712891,
+    0.65740615754163356,
+    0.67763432925662526,
+    0.69740646622548552,
+    0.71667581294953808,
+    0.73539901809352737,
+    0.75353642514900732,
+    0.77105232699609816,
+    0.78791518148597028,
+    0.80409778560147072,
+    0.81957740622770781,
+    0.83433586607383625,
+    0.84835958382689225,
+    0.86163956818294229,
+    0.87417136598406997,
+    0.88595496528524853,
+    0.89699465477567619,
+    0.90729884157670959,
+    0.91687983002436779,
+    0.92575356460899649,
+    0.93393934077779084,
+    0.94145948779657318,
+    0.94833902830402828,
+    0.95460531956280026,
+    0.96028768170574896,
+    0.96541701848104766,
+    0.97002543610646474,
+    0.97414586584250062,
+    0.97781169577969584,
+    0.98105641710392333,
+    0.98391328975491177,
+    0.98641503193166202,
+    0.98859353733226141,
+    0.99047962335771556,
+    0.9921028127769449,
+    0.99349115056397752,
+    0.99467105680259038,
+    0.9956672157341897,
+    0.99650250022834352,
+    0.99719793020823266,
+    0.99777266288955657,
+    0.99824401211201486,
+    0.99862749357391212,
+    0.99893689243401962,
+    0.99918434952623147,
+    0.99938046234161726,
+    0.99953439696357238,
+    0.99965400728430465,
+    0.99974595807027455,
+    0.99981584876278362,
+    0.99986833527824281,
+    0.99990724749057802,
+    0.99993570051598468,
+    0.99995619835942084,
+    0.99997072890647543,
+    0.9999808496399144,
+    0.99998776381655818,
+    0.99999238714961569,
+    0.99999540529959718,
+    0.99999732268176988,
+    0.99999850325054862,
+    0.99999920402413744,
+    0.9999996021706401,
+    0.99999981649545566,
+    0.99999992415545547,
+    0.99999997338493041,
+    0.99999999295825959,
+    0.99999999904096815
+};
+
+#endif /* WIN_TABLE */
+
+#endif  /* _KBD_WIN_H_ */
diff --git a/libfaad.sln b/libfaad.sln
new file mode 100644
index 0000000..7cc3391
--- /dev/null
+++ b/libfaad.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "libfaad.vcproj", "{0CE7E9C6-140D-4656-9492-17488614608E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0CE7E9C6-140D-4656-9492-17488614608E}.Debug|Win32.ActiveCfg = Debug|Win32
+		{0CE7E9C6-140D-4656-9492-17488614608E}.Debug|Win32.Build.0 = Debug|Win32
+		{0CE7E9C6-140D-4656-9492-17488614608E}.Release|Win32.ActiveCfg = Release|Win32
+		{0CE7E9C6-140D-4656-9492-17488614608E}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/libfaad.vcproj b/libfaad.vcproj
new file mode 100644
index 0000000..9ee9576
--- /dev/null
+++ b/libfaad.vcproj
@@ -0,0 +1,634 @@
+<?xml version="1.0" encoding="Windows-1252"?>

+<VisualStudioProject

+	ProjectType="Visual C++"

+	Version="9.00"

+	Name="libfaad"

+	ProjectGUID="{0CE7E9C6-140D-4656-9492-17488614608E}"

+	RootNamespace="libfaad"

+	TargetFrameworkVersion="131072"

+	>

+	<Platforms>

+		<Platform

+			Name="Win32"

+		/>

+	</Platforms>

+	<ToolFiles>

+	</ToolFiles>

+	<Configurations>

+		<Configuration

+			Name="Debug|Win32"

+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"

+			IntermediateDirectory="$(ConfigurationName)"

+			ConfigurationType="2"

+			UseOfMFC="0"

+			CharacterSet="1"

+			>

+			<Tool

+				Name="VCPreBuildEventTool"

+			/>

+			<Tool

+				Name="VCCustomBuildTool"

+			/>

+			<Tool

+				Name="VCXMLDataGeneratorTool"

+			/>

+			<Tool

+				Name="VCWebServiceProxyGeneratorTool"

+			/>

+			<Tool

+				Name="VCMIDLTool"

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				Optimization="0"

+				AdditionalIncludeDirectories="..\,..\..\..\..\include"

+				PreprocessorDefinitions="WIN32;_DEBUG;_USRDLL;DLL_EXPORTS"

+				StringPooling="false"

+				RuntimeLibrary="3"

+				EnableEnhancedInstructionSet="1"

+				Detect64BitPortabilityProblems="false"

+			/>

+			<Tool

+				Name="VCManagedResourceCompilerTool"

+			/>

+			<Tool

+				Name="VCResourceCompilerTool"

+			/>

+			<Tool

+				Name="VCPreLinkEventTool"

+			/>

+			<Tool

+				Name="VCLinkerTool"

+				OutputFile="$(SolutionDir)..\..\build\products\$(ConfigurationName)\libaacdec.dll"

+			/>

+			<Tool

+				Name="VCALinkTool"

+			/>

+			<Tool

+				Name="VCManifestTool"

+			/>

+			<Tool

+				Name="VCXDCMakeTool"

+			/>

+			<Tool

+				Name="VCBscMakeTool"

+			/>

+			<Tool

+				Name="VCFxCopTool"

+			/>

+			<Tool

+				Name="VCAppVerifierTool"

+			/>

+			<Tool

+				Name="VCPostBuildEventTool"

+			/>

+		</Configuration>

+		<Configuration

+			Name="Release|Win32"

+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"

+			IntermediateDirectory="$(ConfigurationName)"

+			ConfigurationType="2"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			CharacterSet="2"

+			WholeProgramOptimization="1"

+			>

+			<Tool

+				Name="VCPreBuildEventTool"

+			/>

+			<Tool

+				Name="VCCustomBuildTool"

+			/>

+			<Tool

+				Name="VCXMLDataGeneratorTool"

+			/>

+			<Tool

+				Name="VCWebServiceProxyGeneratorTool"

+			/>

+			<Tool

+				Name="VCMIDLTool"

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				Optimization="2"

+				InlineFunctionExpansion="0"

+				WholeProgramOptimization="true"

+				AdditionalIncludeDirectories="..\..\..\..\include"

+				PreprocessorDefinitions="WIN32;NDEBUG;_USRDLL;DLL_EXPORTS"

+				StringPooling="true"

+				RuntimeLibrary="2"

+				EnableEnhancedInstructionSet="1"

+				FloatingPointModel="0"

+				Detect64BitPortabilityProblems="false"

+			/>

+			<Tool

+				Name="VCManagedResourceCompilerTool"

+			/>

+			<Tool

+				Name="VCResourceCompilerTool"

+			/>

+			<Tool

+				Name="VCPreLinkEventTool"

+			/>

+			<Tool

+				Name="VCLinkerTool"

+				OutputFile="$(SolutionDir)..\..\build\products\$(ConfigurationName)\libaacdec.dll"

+				ImportLibrary="$(SolutionDir)..\..\build\products\$(ConfigurationName)\$(ProjectName).lib"

+			/>

+			<Tool

+				Name="VCALinkTool"

+			/>

+			<Tool

+				Name="VCManifestTool"

+			/>

+			<Tool

+				Name="VCXDCMakeTool"

+			/>

+			<Tool

+				Name="VCBscMakeTool"

+			/>

+			<Tool

+				Name="VCFxCopTool"

+			/>

+			<Tool

+				Name="VCAppVerifierTool"

+			/>

+			<Tool

+				Name="VCPostBuildEventTool"

+			/>

+		</Configuration>

+	</Configurations>

+	<References>

+	</References>

+	<Files>

+		<Filter

+			Name="Source Files"

+			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"

+			>

+			<File

+				RelativePath="bits.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="block.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="config.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="decdata.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="decoder.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="dolby_adapt.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="fastfft.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+						ExceptionHandling="0"

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="huffdec.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="huffinit.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="hufftables.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="intensity.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="monopred.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="nok_lt_prediction.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="pns.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="stereo.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="tns.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="transfo.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+			<File

+				RelativePath="util.c"

+				>

+				<FileConfiguration

+					Name="Debug|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+				<FileConfiguration

+					Name="Release|Win32"

+					>

+					<Tool

+						Name="VCCLCompilerTool"

+						AdditionalIncludeDirectories=""

+						PreprocessorDefinitions=""

+					/>

+				</FileConfiguration>

+			</File>

+		</Filter>

+		<Filter

+			Name="Header Files"

+			Filter="h;hpp;hxx;hm;inl"

+			>

+			<File

+				RelativePath="All.h"

+				>

+			</File>

+			<File

+				RelativePath="bits.h"

+				>

+			</File>

+			<File

+				RelativePath="Block.h"

+				>

+			</File>

+			<File

+				RelativePath="Fastfft.h"

+				>

+			</File>

+			<File

+				RelativePath="interface.h"

+				>

+			</File>

+			<File

+				RelativePath="kbd_win.h"

+				>

+			</File>

+			<File

+				RelativePath="monopred.h"

+				>

+			</File>

+			<File

+				RelativePath="mpeg4ip_bits.h"

+				>

+			</File>

+			<File

+				RelativePath="nok_lt_prediction.h"

+				>

+			</File>

+			<File

+				RelativePath="nok_ltp_common.h"

+				>

+			</File>

+			<File

+				RelativePath="nok_ltp_common_internal.h"

+				>

+			</File>

+			<File

+				RelativePath="Port.h"

+				>

+			</File>

+			<File

+				RelativePath="Tns.h"

+				>

+			</File>

+			<File

+				RelativePath="Transfo.h"

+				>

+			</File>

+			<File

+				RelativePath="util.h"

+				>

+			</File>

+		</Filter>

+	</Files>

+	<Globals>

+	</Globals>

+</VisualStudioProject>

diff --git a/libfaad60.dsp b/libfaad60.dsp
new file mode 100644
index 0000000..21cb38d
--- /dev/null
+++ b/libfaad60.dsp
@@ -0,0 +1,235 @@
+# Microsoft Developer Studio Project File - Name="libfaad" - Package Owner=<4>

+# Microsoft Developer Studio Generated Build File, Format Version 6.00

+# ** DO NOT EDIT **

+

+# TARGTYPE "Win32 (x86) Static Library" 0x0104

+

+CFG=libfaad - Win32 Debug

+!MESSAGE This is not a valid makefile. To build this project using NMAKE,

+!MESSAGE use the Export Makefile command and run

+!MESSAGE 

+!MESSAGE NMAKE /f "libfaad60.mak".

+!MESSAGE 

+!MESSAGE You can specify a configuration when running NMAKE

+!MESSAGE by defining the macro CFG on the command line. For example:

+!MESSAGE 

+!MESSAGE NMAKE /f "libfaad60.mak" CFG="libfaad - Win32 Debug"

+!MESSAGE 

+!MESSAGE Possible choices for configuration are:

+!MESSAGE 

+!MESSAGE "libfaad - Win32 Release" (based on "Win32 (x86) Static Library")

+!MESSAGE "libfaad - Win32 Debug" (based on "Win32 (x86) Static Library")

+!MESSAGE 

+

+# Begin Project

+# PROP AllowPerConfigDependencies 0

+# PROP Scc_ProjName ""

+# PROP Scc_LocalPath ""

+CPP=cl.exe

+RSC=rc.exe

+

+!IF  "$(CFG)" == "libfaad - Win32 Release"

+

+# PROP BASE Use_MFC 0

+# PROP BASE Use_Debug_Libraries 0

+# PROP BASE Output_Dir "Release"

+# PROP BASE Intermediate_Dir "Release"

+# PROP BASE Target_Dir ""

+# PROP Use_MFC 0

+# PROP Use_Debug_Libraries 0

+# PROP Output_Dir "Release"

+# PROP Intermediate_Dir "Release"

+# PROP Target_Dir ""

+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c

+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\..\include" /D "_MBCS" /D "_LIB" /D "WIN32" /D "NDEBUG" /YX /FD /c

+# SUBTRACT CPP /Fr

+# ADD BASE RSC /l 0x809 /d "NDEBUG"

+# ADD RSC /l 0x809 /d "NDEBUG"

+BSC32=bscmake.exe

+# ADD BASE BSC32 /nologo

+# ADD BSC32 /nologo

+LIB32=link.exe -lib

+# ADD BASE LIB32 /nologo

+# ADD LIB32 /nologo

+

+!ELSEIF  "$(CFG)" == "libfaad - Win32 Debug"

+

+# PROP BASE Use_MFC 0

+# PROP BASE Use_Debug_Libraries 1

+# PROP BASE Output_Dir "Debug"

+# PROP BASE Intermediate_Dir "Debug"

+# PROP BASE Target_Dir ""

+# PROP Use_MFC 0

+# PROP Use_Debug_Libraries 1

+# PROP Output_Dir "Debug"

+# PROP Intermediate_Dir "Debug"

+# PROP Target_Dir ""

+# ADD BASE CPP /nologo /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c

+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "..\\" /I "..\..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /YX /FD /GZ /c

+# ADD BASE RSC /l 0x809 /d "_DEBUG"

+# ADD RSC /l 0x809 /d "_DEBUG"

+BSC32=bscmake.exe

+# ADD BASE BSC32 /nologo

+# ADD BSC32 /nologo

+LIB32=link.exe -lib

+# ADD BASE LIB32 /nologo

+# ADD LIB32 /nologo

+

+!ENDIF 

+

+# Begin Target

+

+# Name "libfaad - Win32 Release"

+# Name "libfaad - Win32 Debug"

+# Begin Group "Source Files"

+

+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"

+# Begin Source File

+

+SOURCE=.\bits.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\block.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\config.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\decdata.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\decoder.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\dolby_adapt.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\fastfft.c

+

+!IF  "$(CFG)" == "libfaad - Win32 Release"

+

+# ADD CPP /GX-

+# SUBTRACT CPP /O<none>

+

+!ELSEIF  "$(CFG)" == "libfaad - Win32 Debug"

+

+!ENDIF 

+

+# End Source File

+# Begin Source File

+

+SOURCE=.\huffdec.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\huffinit.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\hufftables.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\intensity.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\monopred.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\nok_lt_prediction.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\pns.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\stereo.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\tns.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\transfo.c

+# End Source File

+# Begin Source File

+

+SOURCE=.\util.c

+# End Source File

+# End Group

+# Begin Group "Header Files"

+

+# PROP Default_Filter "h;hpp;hxx;hm;inl"

+# Begin Source File

+

+SOURCE=.\All.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\bits.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\Block.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\Fastfft.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\interface.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\kbd_win.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\monopred.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\mpeg4ip_bits.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\nok_lt_prediction.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\nok_ltp_common.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\nok_ltp_common_internal.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\Port.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\Tns.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\Transfo.h

+# End Source File

+# Begin Source File

+

+SOURCE=.\util.h

+# End Source File

+# End Group

+# End Target

+# End Project

diff --git a/monopred.c b/monopred.c
new file mode 100644
index 0000000..92c91cf
--- /dev/null
+++ b/monopred.c
@@ -0,0 +1,418 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+Bernd Edler and Hendrik Fuchs, University of Hannover in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: monopred.c,v 1.4 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+/***********************************************************************************
+ * MONOPRED                                    *
+ *                                         *
+ *  Contains the core functions for an intra channel (or mono) predictor       *
+ *  using a backward adaptive lattice predictor.                   *
+ *                                         *
+ *  init_pred_stat():   initialisation of all predictor parameters     *
+ *  monopred():     calculation of a predicted value from          *
+ *              preceeding (quantised) samples             *
+ *  predict():      carry out prediction for all spectral lines    *
+ *  predict_reset():    carry out cyclic predictor reset mechanism     *
+ *              (long blocks) resp. full reset (short blocks)      *
+ *                                         *
+ *  Internal Functions:                            *
+ *    reset_pred_state():   reset the predictor state variables        *
+ *                                         *
+ **********************************************************************************/
+
+#include "all.h"
+#include "util.h"
+
+#define GRAD PRED_ORDER
+#define ALPHA PRED_ALPHA
+#define A PRED_A
+#define B PRED_B
+
+
+/* this works for all float values,
+ * but does not conform to IEEE conventions of
+ * round to nearest, even
+ */
+
+/* Schuyler's bug fix */
+static void flt_round(float *pf)
+{
+    int flg;
+    u_int32_t tmp;
+    float *pt = (float *)&tmp;
+    *pt = *pf;
+    flg = tmp & (u_int32_t)0x00008000;
+    tmp &= (u_int32_t)0xffff0000;
+    *pf = *pt;
+    /* round 1/2 lsb toward infinity */
+    if (flg) {
+        tmp &= (u_int32_t)0xff800000;       /* extract exponent and sign */
+        tmp |= (u_int32_t)0x00010000;       /* insert 1 lsb */
+        *pf += *pt;                     /* add 1 lsb and elided one */
+        tmp &= (u_int32_t)0xff800000;       /* extract exponent and sign */
+        *pf -= *pt;                     /* subtract elided one */
+    }
+}
+
+
+/* This only works for 1.0 < float < 2.0 - 2^-24 !
+ *
+ * Comparison of the performance of the two rounding routines:
+ *      old (above) new (below)
+ * Max error    0.00385171  0.00179992
+ * RMS error    0.00194603  0.00109221
+ */
+
+/* New bug fixed version */
+static void inv_table_flt_round(float *ftmp)
+{
+    int exp;
+    double mnt;
+    float descale;
+
+    mnt = frexp((double)*ftmp, &exp);
+    descale = (float)ldexp(1.0, exp + 15);
+    *ftmp += descale;
+    *ftmp -= descale;
+}
+
+static void make_inv_tables(faacDecHandle hDecoder)
+{
+    int i;
+    u_int32_t tmp1, tmp;
+    float *pf = (float *)&tmp;
+    float ftmp;
+
+    *pf = 1.0;
+    tmp1 = tmp;             /* float 1.0 */
+    for (i=0; i<128; i++) {
+        tmp = tmp1 + (i<<16);       /* float 1.m, 7 msb only */
+        ftmp = B / *pf;
+        inv_table_flt_round(&ftmp); /* round to 16 bits */
+        hDecoder->mnt_table[i] = ftmp;
+        /* printf("%3d %08x %f\n", i, tmp, ftmp); */
+    }
+    for (i=0; i<256; i++) {
+        tmp = (i<<23);          /* float 1.0 * 2^exp */
+        if (*pf > MINVAR) {
+            ftmp = 1.0f / *pf;
+        } else {
+            ftmp = 0;
+        }
+        hDecoder->exp_table[i] = ftmp;
+        /* printf("%3d %08x %g\n", i, tmp, ftmp); */
+    }
+}
+
+/* Bug-fixed version (big-little endian problem) */
+static void inv_quant_pred_state(TMP_PRED_STATUS *tmp_psp, PRED_STATUS *psp)
+{
+    int i;
+    short *p2;
+    u_int32_t *p1_tmp;
+
+    p1_tmp = (u_int32_t *)tmp_psp;
+    p2 = (short *) psp;
+
+    for (i=0; i<MAX_PRED_BINS*6; i++)
+        p1_tmp[i] = ((u_int32_t)p2[i])<<16;
+}
+
+#define FAST_QUANT
+
+/* Bug-fixed version (big-little endian problem) */
+static void quant_pred_state(PRED_STATUS *psp, TMP_PRED_STATUS *tmp_psp)
+{
+    int i;
+    short *p1;
+    u_int32_t *p2_tmp;
+
+#ifdef  FAST_QUANT
+    p1 = (short *) psp;
+    p2_tmp = (u_int32_t *)tmp_psp;
+
+    for (i=0; i<MAX_PRED_BINS*6;i++)
+      p1[i] = (short) (p2_tmp[i]>>16);
+
+#else
+    int j;
+    for (i=0; i<MAX_PRED_BINS; i++) {
+    p1 = (short *) &psp[i];
+      p2_tmp = (u_int32_t *)tmp_psp;
+
+  for (j=0; j<6; j++)
+        p1[j] = (short) (p2_tmp[i]>>16);
+    }
+#endif
+}
+
+/********************************************************************************
+ *** FUNCTION: reset_pred_state()                       *
+ ***                                        *
+ ***    reset predictor state variables                     *
+ ***                                        *
+ ********************************************************************************/
+void reset_pred_state(PRED_STATUS *psp)
+{
+    psp->r[0] = Q_ZERO;
+    psp->r[1] = Q_ZERO;
+    psp->kor[0] = Q_ZERO;
+    psp->kor[1] = Q_ZERO;
+    psp->var[0] = Q_ONE;
+    psp->var[1] = Q_ONE;
+}
+
+/********************************************************************************
+ *** FUNCTION: init_pred_stat()                         *
+ ***                                        *
+ ***    initialisation of all predictor parameter               *
+ ***                                        *
+ ********************************************************************************/
+void init_pred_stat(faacDecHandle hDecoder, PRED_STATUS *psp, int first_time)
+{
+    /* Initialisation */
+    if (first_time) {
+        make_inv_tables(hDecoder);
+    }
+
+    reset_pred_state(psp);
+}
+
+void init_pred(faacDecHandle hDecoder, PRED_STATUS **sp_status, int channels)
+{
+    int i, ch;
+
+    for (ch = 0; ch < channels; ch++) {
+        for (i = 0; i < LN2; i++) {
+            init_pred_stat(hDecoder, &sp_status[ch][i], ((ch==0)&&(i==0)));
+        }
+    }
+}
+
+/********************************************************************************
+ *** FUNCTION: monopred()                           *
+ ***                                        *
+ ***    calculation of a predicted value from preceeding (quantised) samples    *
+ ***    using a second order backward adaptive lattice predictor with full  *
+ ***    LMS adaption algorithm for calculation of predictor coefficients    *
+ ***                                        *
+ ***    parameters: pc: pointer to this quantised sample        *
+ ***            psp:    pointer to structure with predictor status  *
+ ***            pred_flag:  1 if prediction is used         *
+ ***                                        *
+ ********************************************************************************/
+
+static void monopred(faacDecHandle hDecoder, Float *pc, PRED_STATUS *psp, TMP_PRED_STATUS *pst, int pred_flag)
+{
+    float qc = *pc;     /* quantized coef */
+    float pv;           /* predicted value */
+    float dr1;          /* difference in the R-branch */
+    float e0,e1;        /* "partial" prediction errors (E-branch) */
+    float r0,r1;        /* content of delay elements */
+    float k1,k2;        /* predictor coefficients */
+
+    float *R = pst->r;      /* content of delay elements */
+    float *KOR = pst->kor;  /* estimates of correlations */
+    float *VAR = pst->var;  /* estimates of variances */
+    u_int32_t tmp;
+    int i, j;
+
+    r0=R[0];
+    r1=R[1];
+
+    /* Calculation of predictor coefficients to be used for the
+     * calculation of the current predicted value based on previous
+     * block's state
+     */
+
+    /* the test, division and rounding is be pre-computed in the tables
+     * equivalent calculation is:
+     * k1 = (VAR[1-1]>MINVAR) ? KOR[1-1]/VAR[1-1]*B : 0.0F;
+     * k2 = (VAR[2-1]>MINVAR) ? KOR[2-1]/VAR[2-1]*B : 0.0F;
+     */
+    tmp = psp->var[1-1];
+    j = (tmp >> 7);
+    i = tmp & 0x7f;
+    k1 = KOR[1-1] * hDecoder->exp_table[j] * hDecoder->mnt_table[i];
+
+    tmp = psp->var[2-1];
+    j = (tmp >> 7);
+    i = tmp & 0x7f;
+    k2 = KOR[2-1] * hDecoder->exp_table[j] * hDecoder->mnt_table[i];
+
+    /* Predicted value */
+    pv  = k1*r0 + k2*r1;
+    flt_round(&pv);
+    if (pred_flag)
+        *pc = qc + pv;
+/* printf("P1: %8.2f %8.2f\n", pv, *pc); */
+
+    /* Calculate state for use in next block */
+
+    /* E-Branch:
+     *  Calculate the partial prediction errors using the old predictor coefficients
+     *  and the old r-values in order to reconstruct the predictor status of the
+     *  previous step
+     */
+
+    e0 = *pc;
+    e1 = e0-k1*r0;
+
+    /* Difference in the R-Branch:
+     *  Calculate the difference in the R-Branch using the old predictor coefficients and
+     *  the old partial prediction errors as calculated above in order to reconstruct the
+     *  predictor status of the previous step
+     */
+
+    dr1 = k1*e0;
+
+    /* Adaption of variances and correlations for predictor coefficients:
+     *  These calculations are based on the predictor status of the previous step and give
+     *  the new estimates of variances and correlations used for the calculations of the
+     *  new predictor coefficients to be used for calculating the current predicted value
+     */
+
+    VAR[1-1] = ALPHA*VAR[1-1]+(0.5F)*(r0*r0 + e0*e0);   /* float const */
+    KOR[1-1] = ALPHA*KOR[1-1] + r0*e0;
+    VAR[2-1] = ALPHA*VAR[2-1]+(0.5F)*(r1*r1 + e1*e1);   /* float const */
+    KOR[2-1] = ALPHA*KOR[2-1] + r1*e1;
+
+    /* Summation and delay in the R-Branch => new R-values */
+
+    r1 = A*(r0-dr1);
+    r0 = A*e0;
+
+    R[0]=r0;
+    R[1]=r1;
+}
+
+
+
+
+/********************************************************************************
+ *** FUNCTION: predict()                            *
+ ***                                        *
+ ***    carry out prediction for all allowed spectral lines         *
+ ***                                        *
+ ********************************************************************************/
+
+
+int predict(faacDecHandle hDecoder, Info* info, int profile, int *lpflag, PRED_STATUS *psp, Float *coef)
+{
+    int j, k, b, to, flag0;
+    int *top;
+
+    if (hDecoder->mc_info.object_type != AACMAIN) {
+        if (*lpflag == 0) {
+            /* prediction calculations not required */
+            return 0;
+        }
+        else {
+            return -1;
+        }
+    }
+
+    if (info->islong) {
+        TMP_PRED_STATUS tmp_ps[MAX_PRED_BINS];
+        inv_quant_pred_state(tmp_ps, psp);
+        b = 0;
+        k = 0;
+        top = info->sbk_sfb_top[b];
+        flag0 = *lpflag++;
+        for (j = 0; j < pred_max_bands(hDecoder); j++) {
+            to = *top++;
+            if (flag0 && *lpflag++) {
+                for ( ; k < to; k++) {
+                    monopred(hDecoder, &coef[k], &psp[k], &tmp_ps[k], 1);
+                }
+            } else {
+                for ( ; k < to; k++) {
+                    monopred(hDecoder, &coef[k], &psp[k], &tmp_ps[k], 0);
+                }
+            }
+        }
+        quant_pred_state(psp, tmp_ps);
+    }
+    return 0;
+}
+
+
+
+
+
+/********************************************************************************
+ *** FUNCTION: predict_reset()                          *
+ ***                                        *
+ ***    carry out cyclic predictor reset mechanism (long blocks)        *
+ ***    resp. full reset (short blocks)                     *
+ ***                                        *
+ ********************************************************************************/
+int predict_reset(faacDecHandle hDecoder, Info* info, int *prstflag, PRED_STATUS **psp,
+                   int firstCh, int lastCh, int *last_rstgrp_num)
+{
+    int j, prstflag0, prstgrp, ch;
+
+    prstgrp = 0;
+    if (info->islong) {
+        prstflag0 = *prstflag++;
+        if (prstflag0) {
+
+            /* for loop modified because of bit-reversed group number */
+            for (j=0; j<LEN_PRED_RSTGRP-1; j++) {
+                prstgrp |= prstflag[j];
+                prstgrp <<= 1;
+            }
+            prstgrp |= prstflag[LEN_PRED_RSTGRP-1];
+
+            if ( (prstgrp<1) || (prstgrp>30) ) {
+                return -1;
+            }
+
+            for (ch=firstCh; ch<=lastCh; ch++) {
+                /* check if two consecutive reset group numbers are incremented by one
+                   (this is a poor check, but we don't have much alternatives) */
+                if ((hDecoder->warn_flag) && (last_rstgrp_num[ch] < 30) && (last_rstgrp_num[ch] != 0)) {
+                    if ((last_rstgrp_num[ch] + 1) != prstgrp) {
+                        hDecoder->warn_flag = 0;
+                    }
+                }
+                last_rstgrp_num[ch] = prstgrp;
+                for (j=prstgrp-1; j<LN2; j+=30) {
+                    reset_pred_state(&psp[ch][j]);
+                }
+            }
+        } /* end predictor reset */
+    } /* end islong */
+    else { /* short blocks */
+        /* complete prediction reset in all bins */
+        for (ch=firstCh; ch<=lastCh; ch++) {
+            last_rstgrp_num[ch] = 0;
+            for (j=0; j<LN2; j++)
+                reset_pred_state(&psp[ch][j]);
+        }
+    }
+    return 0;
+}
diff --git a/monopred.h b/monopred.h
new file mode 100644
index 0000000..e5fdff5
--- /dev/null
+++ b/monopred.h
@@ -0,0 +1,49 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+Bernd Edler and Hendrik Fuchs, University of Hannover in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: monopred.h,v 1.2 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#ifndef _monopred_h_
+#define _monopred_h_
+
+#define MAX_PGRAD   2
+#define MINVAR      1
+#define Q_ZERO      0x0000
+#define Q_ONE       0x3F80
+
+/* Predictor status information for mono predictor */
+typedef struct {
+    short   r[MAX_PGRAD];       /* contents of delay elements */
+    short   kor[MAX_PGRAD];         /* estimates of correlations */
+    short   var[MAX_PGRAD];         /* estimates of variances */
+} PRED_STATUS;
+
+typedef struct {
+    float   r[MAX_PGRAD];       /* contents of delay elements */
+    float   kor[MAX_PGRAD];         /* estimates of correlations */
+    float   var[MAX_PGRAD];         /* estimates of variances */
+} TMP_PRED_STATUS;
+
+#endif /* _monopred_h_ */
diff --git a/mpeg4ip_config_Linux32.h b/mpeg4ip_config_Linux32.h
new file mode 100644
index 0000000..704cdaf
--- /dev/null
+++ b/mpeg4ip_config_Linux32.h
@@ -0,0 +1,245 @@
+/* mpeg4ip_config.h.  Generated by configure.  */
+/* mpeg4ip_config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define to 1 if the system has the type `addrinfo'. */
+/* #undef HAVE_ADDRINFO */
+
+/* have alsa enabled for mp4live */
+/* #undef HAVE_ALSA */
+
+/* Define to 1 if `time_base' is member of `AVCodecContext'. */
+/* #undef HAVE_AVCODECCONTEXT_TIME_BASE */
+
+/* Define to 1 if the system has the type `AVRational'. */
+/* #undef HAVE_AVRATIONAL */
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+#define HAVE_BYTESWAP_H 1
+
+/* Define to 1 if you have the declaration of `avcodec_decode_audio2', and to
+   0 if you don't. */
+/* #undef HAVE_DECL_AVCODEC_DECODE_AUDIO2 */
+
+/* have /dev/urandom */
+#define HAVE_DEV_URANDOM 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* enable faac for mp4live */
+/* #undef HAVE_FAAC */
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* enable ffmpeg for mp4live */
+/* #undef HAVE_FFMPEG */
+
+/* defined if ffmpeg is installed */
+/* #undef HAVE_FFMPEG_INSTALLED */
+
+/* Define to 1 if `__pos' is member of `fpos_t'. */
+#define HAVE_FPOS_T___POS 1
+
+/* have getipnodebyname */
+/* #undef HAVE_GETIPNODEBYNAME */
+
+/* Define to 1 if you have the `getopt' function. */
+#define HAVE_GETOPT 1
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#define HAVE_GETOPT_H 1
+
+/* Define to 1 if you have the `getopt_long' function. */
+#define HAVE_GETOPT_LONG 1
+
+/* Define to 1 if you have the `getopt_long_only' function. */
+#define HAVE_GETOPT_LONG_ONLY 1
+
+/* Define to 1 if you have the <glib.h> header file. */
+/* #undef HAVE_GLIB_H */
+
+/* Have GTK on system */
+/* #undef HAVE_GTK */
+
+/* Have GTK 2.0 on system */
+/* #undef HAVE_GTK_2_0 */
+
+/* have id3/tag.h */
+/* #undef HAVE_ID3_TAG_H */
+
+/* IGMPv3 definition */
+/* #undef HAVE_IGMP_V3 */
+
+/* Define to 1 if you have the `inet_aton' function. */
+#define HAVE_INET_ATON 1
+
+/* Define to 1 if you have the `inet_ntoa' function. */
+#define HAVE_INET_NTOA 1
+
+/* Define to 1 if you have the `inet_ntop' function. */
+#define HAVE_INET_NTOP 1
+
+/* Define to 1 if you have the `inet_pton' function. */
+#define HAVE_INET_PTON 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if the system has the type `in_port_t'. */
+#define HAVE_IN_PORT_T 1
+
+/* enable IPv6 architecture */
+/* #undef HAVE_IPv6 */
+
+/* enable lame for mp4live */
+/* #undef HAVE_LAME */
+
+/* Define to 1 if you have the `asound' library (-lasound). */
+/* #undef HAVE_LIBASOUND */
+
+/* Define to 1 if you have the `gnugetopt' library (-lgnugetopt). */
+/* #undef HAVE_LIBGNUGETOPT */
+
+/* have libmpeg2 decoder library */
+/* #undef HAVE_LIBMPEG2 */
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+/* #undef HAVE_LIBSOCKET */
+
+/* have mac */
+/* #undef HAVE_MACOSX */
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* mp4live can be used */
+#define HAVE_MP4LIVE 1
+
+/* Define to 1 if you have the <netinet6/in6.h> header file. */
+/* #undef HAVE_NETINET6_IN6_H */
+
+/* Define to 1 if you have the <netinet/ip6.h> header file. */
+/* #undef HAVE_NETINET_IP6_H */
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* have sin6_len */
+/* #undef HAVE_SIN6_LEN */
+
+/* Define to 1 if you have the `snd_pcm_hw_params_set_rate_resample' function.
+   */
+/* #undef HAVE_SND_PCM_HW_PARAMS_SET_RATE_RESAMPLE */
+
+/* Define to 1 if you have the `socketpair' function. */
+#define HAVE_SOCKETPAIR 1
+
+/* Define to 1 if the system has the type `socklen_t'. */
+#define HAVE_SOCKLEN_T 1
+
+/* enable use of srtp library */
+/* #undef HAVE_SRTP */
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strcasestr' function. */
+#define HAVE_STRCASESTR 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strsep' function. */
+#define HAVE_STRSEP 1
+
+/* Define to 1 if the system has the type `struct iovec'. */
+#define HAVE_STRUCT_IOVEC 1
+
+/* Define to 1 if the system has the type `struct ip_mreq_source'. */
+/* #undef HAVE_STRUCT_IP_MREQ_SOURCE */
+
+/* Define to 1 if the system has the type `struct sockaddr_storage'. */
+#define HAVE_STRUCT_SOCKADDR_STORAGE 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* enable twolame for mp4live */
+/* #undef HAVE_TWOLAME */
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* enable x264 for mp4live */
+/* #undef HAVE_X264 */
+
+/* Define to 1 if `rc.i_rc_method' is member of `x264_param_t'. */
+/* #undef HAVE_X264_PARAM_T_RC_I_RC_METHOD */
+
+/* have xvid.h with 1.0 API */
+/* #undef HAVE_XVID10 */
+
+/* have xvid.h */
+/* #undef HAVE_XVID_H */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "mpeg4ip"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "mpeg4ip 1.6.1"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "mpeg4ip"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "1.6.1"
+
+/* The size of a `bool', as computed by sizeof. */
+#define SIZEOF_BOOL 1
+
+/* The size of a `long', as computed by sizeof. */
+#define SIZEOF_LONG 4
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define to 1 if your processor stores words with the most significant byte
+   first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef WORDS_BIGENDIAN */
+
+/* Define to 1 if the X Window System is missing or not being used. */
+#define X_DISPLAY_MISSING 1
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
diff --git a/nok_lt_prediction.c b/nok_lt_prediction.c
new file mode 100644
index 0000000..3b415e4
--- /dev/null
+++ b/nok_lt_prediction.c
@@ -0,0 +1,178 @@
+/**************************************************************************
+
+This software module was originally developed by
+Nokia in the course of development of the MPEG-2 AAC/MPEG-4
+Audio standard ISO/IEC13818-7, 14496-1, 2 and 3.
+This software module is an implementation of a part
+of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the
+MPEG-2 aac/MPEG-4 Audio standard. ISO/IEC  gives users of the
+MPEG-2aac/MPEG-4 Audio standards free license to this software module
+or modifications thereof for use in hardware or software products
+claiming conformance to the MPEG-2 aac/MPEG-4 Audio  standards. Those
+intending to use this software module in hardware or software products
+are advised that this use may infringe existing patents. The original
+developer of this software module, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of
+this software module or modifications thereof in an
+implementation. Copyright is not released for non MPEG-2 aac/MPEG-4
+Audio conforming products. The original developer retains full right to
+use the code for the developer's own purpose, assign or donate the code to a
+third party and to inhibit third party from using the code for non
+MPEG-2 aac/MPEG-4 Audio conforming products. This copyright notice
+must be included in all copies or derivative works.
+Copyright (c)1997.
+
+***************************************************************************/
+/*
+ * $Id: nok_lt_prediction.c,v 1.9 2003/02/18 18:51:31 wmaycisco Exp $
+ */
+
+#include "all.h"
+#include "tns.h"
+#include "block.h"
+#include "nok_ltp_common.h"
+#include "nok_lt_prediction.h"
+#include "nok_ltp_common_internal.h"
+#include "port.h"
+#include "bits.h"
+#include "util.h"
+
+/*
+  Initialize the history buffer for long term prediction
+ */
+
+void nok_init_lt_pred(NOK_LT_PRED_STATUS **lt_status, int channels)
+{
+    int ch;
+
+    for (ch = 0; ch < channels; ch++) {
+        lt_status[ch]->buffer = AllocMemory(NOK_LT_BLEN*sizeof(float));
+#ifndef _WIN32
+        SetMemory(lt_status[ch]->buffer, 0, NOK_LT_BLEN*sizeof(float));
+#endif
+    }
+}
+
+void nok_end_lt_pred(NOK_LT_PRED_STATUS **lt_status, int channels)
+{
+    int ch;
+
+    for (ch = 0; ch < channels; ch++) {
+        if (lt_status[ch]->buffer) FreeMemory(lt_status[ch]->buffer);
+    }
+}
+
+
+/**************************************************************************
+  nok_lt_prediction
+ *************************************************************************/
+
+void nok_lt_predict(faacDecHandle hDecoder, Info *info, WINDOW_TYPE win_type, Wnd_Shape *win_shape,
+                    int *sbk_prediction_used, int *sfb_prediction_used,
+                    NOK_LT_PRED_STATUS *lt_status, Float weight, int *delay,
+                    Float *current_frame, int block_size_long, int block_size_medium,
+                    int block_size_short, TNS_frame_info *tns_frame_info)
+{
+    int i, j, num_samples;
+    float_ext *mdct_predicted;
+    float_ext *predicted_samples;
+
+    mdct_predicted = AllocMemory(2*NOK_MAX_BLOCK_LEN_LONG*sizeof(float_ext));
+    predicted_samples = AllocMemory(2*NOK_MAX_BLOCK_LEN_LONG*sizeof(float_ext));
+
+
+    switch(win_type) {
+
+    case ONLY_LONG_WINDOW:
+    case LONG_START_WINDOW:
+    case LONG_STOP_WINDOW:
+        if (sbk_prediction_used[0])
+        {
+            /* Prediction for time domain signal */
+            num_samples =  2 * block_size_long;
+            j = NOK_LT_BLEN - 2 * block_size_long - (delay[0] - MAX_LTP_DELAY / 2);
+            if(NOK_LT_BLEN - j <  2 * block_size_long)
+                num_samples = NOK_LT_BLEN - j;
+
+            for(i = 0; i < num_samples; i++)
+                predicted_samples[i] = weight * lt_status->buffer[i + j];
+            for( ; i < 2 * block_size_long; i++)
+                predicted_samples[i] = 0.0f;
+
+            /* Transform prediction to frequency domain. */
+            time2freq_adapt(hDecoder, win_type, win_shape, predicted_samples, mdct_predicted);
+
+            /* Apply the TNS analysis filter to the predicted spectrum. */
+            if(tns_frame_info != NULL)
+                tns_filter_subblock(hDecoder, mdct_predicted, info->sfb_per_bk, info->sbk_sfb_top[0],
+                1, &tns_frame_info->info[0]);
+
+            /* Clean those sfb's where prediction is not used. */
+            for (i = 0, j = 0; i < info->sfb_per_bk; i++) {
+                if (sfb_prediction_used[i + 1] == 0) {
+                    for (; j < info->sbk_sfb_top[0][i]; j++)
+                        mdct_predicted[j] = 0.0;
+                } else {
+                    j = info->sbk_sfb_top[0][i];
+                }
+            }
+
+            /* Add the prediction to dequantized spectrum. */
+            for (i = 0; i < block_size_long; i++)
+                current_frame[i] = current_frame[i] + mdct_predicted[i];
+        }
+        break;
+
+    default:
+        break;
+    }
+
+    FreeMemory(mdct_predicted);
+    FreeMemory(predicted_samples);
+}
+
+/**************************************************************************
+  nok_lt_update
+ *************************************************************************/
+
+void nok_lt_update(NOK_LT_PRED_STATUS *lt_status, Float *time_signal,
+                   Float *overlap_signal, int block_size_long)
+{
+    int i;
+
+    for(i = 0; i < NOK_LT_BLEN - 2 * block_size_long; i++)
+        lt_status->buffer[i] = lt_status->buffer[i + block_size_long];
+
+    for(i = 0; i < block_size_long; i++)
+    {
+        lt_status->buffer[NOK_LT_BLEN - 2 * block_size_long + i] =
+            time_signal[i];
+
+        lt_status->buffer[NOK_LT_BLEN - block_size_long + i] =
+            overlap_signal[i];
+    }
+}
+
+/**************************************************************************
+  nok_lt_decode
+ *************************************************************************/
+void nok_lt_decode(faacDecHandle hDecoder, int max_sfb, int *sbk_prediction_used,
+                   int *sfb_prediction_used, Float *weight, int *delay)
+{
+    int i, last_band;
+
+    if ((sbk_prediction_used[0] = faad_getbits(&hDecoder->ld, LEN_LTP_DATA_PRESENT)))
+    {
+        delay[0] = faad_getbits(&hDecoder->ld, 11);
+        *weight = codebook[faad_getbits(&hDecoder->ld, 3)];
+
+        last_band = (max_sfb < NOK_MAX_LT_PRED_LONG_SFB
+            ? max_sfb : NOK_MAX_LT_PRED_LONG_SFB) + 1;
+
+        sfb_prediction_used[0] = sbk_prediction_used[0];
+        for (i = 1; i < last_band; i++)
+            sfb_prediction_used[i] = faad_getbits(&hDecoder->ld, LEN_LTP_LONG_USED);
+        for (; i < max_sfb + 1; i++)
+            sfb_prediction_used[i] = 0;
+    }
+}
diff --git a/nok_lt_prediction.h b/nok_lt_prediction.h
new file mode 100644
index 0000000..00fae12
--- /dev/null
+++ b/nok_lt_prediction.h
@@ -0,0 +1,56 @@
+/************************************************************************
+
+This software module was originally developed by
+Nokia in the course of development of the MPEG-2 AAC/MPEG-4 
+Audio standard ISO/IEC13818-7, 14496-1, 2 and 3.
+This software module is an implementation of a part
+of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the
+MPEG-2 aac/MPEG-4 Audio standard. ISO/IEC  gives users of the
+MPEG-2aac/MPEG-4 Audio standards free license to this software module
+or modifications thereof for use in hardware or software products
+claiming conformance to the MPEG-2 aac/MPEG-4 Audio  standards. Those
+intending to use this software module in hardware or software products
+are advised that this use may infringe existing patents. The original
+developer of this software module, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of
+this software module or modifications thereof in an
+implementation. Copyright is not released for non MPEG-2 aac/MPEG-4
+Audio conforming products. The original developer retains full right to
+use the code for the developer's own purpose, assign or donate the code to a
+third party and to inhibit third party from using the code for non
+MPEG-2 aac/MPEG-4 Audio conforming products. This copyright notice
+must be included in all copies or derivative works.
+Copyright (c)1997.  
+
+***************************************************************************/
+
+#ifndef _NOK_LT_PREDICTION_H
+#define _NOK_LT_PREDICTION_H
+
+#include "all.h"
+#include "block.h"
+#include "nok_ltp_common.h"
+
+#define truncate(sig_in) \
+         ((sig_in) > 32767 ? 32767 : ( \
+         (sig_in) < -32768 ? -32768 : ( \
+         (sig_in) > 0.0 ? (sig_in)+0.5 : ( \
+         (sig_in) <= 0.0 ? (sig_in)-0.5 : 0)))) 
+
+
+extern void nok_init_lt_pred(NOK_LT_PRED_STATUS **lt_status, int channels);
+extern void nok_end_lt_pred(NOK_LT_PRED_STATUS **lt_status, int channels);
+
+extern void nok_lt_predict(faacDecHandle hDecoder, Info *info, WINDOW_TYPE win_type, Wnd_Shape *win_shape,
+						   int *sbk_prediction_used, int *sfb_prediction_used, 
+						   NOK_LT_PRED_STATUS *lt_status, Float weight, int *delay, 
+						   Float *current_frame, int block_size_long, int block_size_medium, 
+						   int block_size_short, TNS_frame_info *tns_frame_info);
+
+extern void nok_lt_update(NOK_LT_PRED_STATUS *lt_status, Float *time_signal, 
+						  Float *overlap_signal, int block_size_long);
+
+extern void nok_lt_decode(faacDecHandle hDecoder, int max_sfb, int *sbk_prediction_used, 
+						  int *sfb_prediction_used, Float *weight, int *delay);
+
+#endif /* not defined _NOK_LT_PREDICTION_H */
diff --git a/nok_ltp_common.h b/nok_ltp_common.h
new file mode 100644
index 0000000..e20ba02
--- /dev/null
+++ b/nok_ltp_common.h
@@ -0,0 +1,88 @@
+/**************************************************************************
+
+This software module was originally developed by
+
+Mikko Suonio (Nokia)
+
+in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard
+ISO/IEC 13818-7, 14496-1,2 and 3. This software module is an
+implementation of a part of one or more MPEG-2 NBC/MPEG-4 Audio tools
+as specified by the MPEG-2 NBC/MPEG-4 Audio standard. ISO/IEC gives
+users of the MPEG-2 NBC/MPEG-4 Audio standards free license to this
+software module or modifications thereof for use in hardware or
+software products claiming conformance to the MPEG-2 NBC/ MPEG-4 Audio
+standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing
+patents. The original developer of this software module and his/her
+company, the subsequent editors and their companies, and ISO/IEC have
+no liability for use of this software module or modifications thereof
+in an implementation. Copyright is not released for non MPEG-2
+NBC/MPEG-4 Audio conforming products. The original developer retains
+full right to use the code for his/her own purpose, assign or donate
+the code to a third party and to inhibit third party from using the
+code for non MPEG-2 NBC/MPEG-4 Audio conforming products. This
+copyright notice must be included in all copies or derivative works.
+
+Copyright (c) 1997.
+
+***************************************************************************/
+#ifndef _NOK_LTP_COMMON_H
+#define _NOK_LTP_COMMON_H
+
+/*
+  Macro:	MAX_SHORT_WINDOWS
+  Purpose:	Number of short windows in one long window.
+  Explanation:	-  */
+#ifndef MAX_SHORT_WINDOWS
+#define MAX_SHORT_WINDOWS NSHORT
+#endif
+
+/*
+  Macro:	MAX_SCFAC_BANDS
+  Purpose:	Maximum number of scalefactor bands in one frame.
+  Explanation:	-  */
+#ifndef MAX_SCFAC_BANDS
+#define MAX_SCFAC_BANDS MAXBANDS
+#endif
+
+/*
+  Macro:	BLOCK_LEN_LONG
+  Purpose:	Length of one long window
+  Explanation:	-  */
+#ifndef BLOCK_LEN_LONG
+#define BLOCK_LEN_LONG LN2
+#endif
+
+/*
+  Macro:	NOK_MAX_BLOCK_LEN_LONG
+  Purpose:	Informs the routine of the maximum block size used.
+  Explanation:	-  */
+#define	NOK_MAX_BLOCK_LEN_LONG (BLOCK_LEN_LONG) 
+
+/*
+  Macro:	NOK_LT_BLEN
+  Purpose:	Length of the history buffer.
+  Explanation:	Has to hold 1.5 long windows of time domain data. */
+#ifndef	NOK_LT_BLEN
+#define NOK_LT_BLEN (3 * NOK_MAX_BLOCK_LEN_LONG)
+#endif
+
+/*
+  Type:		NOK_LT_PRED_STATUS
+  Purpose:	Type of the struct holding the LTP encoding parameters.
+  Explanation:	-  */
+typedef struct
+  {
+    int weight_idx;
+    float weight;
+    int sbk_prediction_used[MAX_SHORT_WINDOWS];
+    int sfb_prediction_used[MAX_SCFAC_BANDS];
+    int delay[MAX_SHORT_WINDOWS];
+    int global_pred_flag;
+    int side_info;
+    float *buffer;
+  }
+NOK_LT_PRED_STATUS;
+
+
+#endif /* _NOK_LTP_COMMON_H */
diff --git a/nok_ltp_common_internal.h b/nok_ltp_common_internal.h
new file mode 100644
index 0000000..540dcb1
--- /dev/null
+++ b/nok_ltp_common_internal.h
@@ -0,0 +1,117 @@
+/**************************************************************************
+
+This software module was originally developed by
+
+Mikko Suonio (Nokia)
+
+in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard
+ISO/IEC 13818-7, 14496-1,2 and 3. This software module is an
+implementation of a part of one or more MPEG-2 NBC/MPEG-4 Audio tools
+as specified by the MPEG-2 NBC/MPEG-4 Audio standard. ISO/IEC gives
+users of the MPEG-2 NBC/MPEG-4 Audio standards free license to this
+software module or modifications thereof for use in hardware or
+software products claiming conformance to the MPEG-2 NBC/ MPEG-4 Audio
+standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing
+patents. The original developer of this software module and his/her
+company, the subsequent editors and their companies, and ISO/IEC have
+no liability for use of this software module or modifications thereof
+in an implementation. Copyright is not released for non MPEG-2
+NBC/MPEG-4 Audio conforming products. The original developer retains
+full right to use the code for his/her own purpose, assign or donate
+the code to a third party and to inhibit third party from using the
+code for non MPEG-2 NBC/MPEG-4 Audio conforming products. This
+copyright notice must be included in all copies or derivative works.
+
+Copyright (c) 1997.
+
+***************************************************************************/
+/*
+ * $Id: nok_ltp_common_internal.h,v 1.5 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#ifndef _NOK_LTP_COMMON_INTERNAL_H
+#define _NOK_LTP_COMMON_INTERNAL_H
+
+
+/*
+  Purpose:      Number of LTP coefficients. */
+#define LPC 1
+
+/*
+  Purpose:      Maximum LTP lag.  */
+#define MAX_LTP_DELAY 2048
+
+/*
+  Purpose:  Length of the bitstream element ltp_data_present.  */
+#define LEN_LTP_DATA_PRESENT 1
+
+/*
+  Purpose:  Length of the bitstream element ltp_lag.  */
+#define LEN_LTP_LAG 11
+
+/*
+  Purpose:  Length of the bitstream element ltp_coef.  */
+#define LEN_LTP_COEF 3
+
+/*
+  Purpose:  Length of the bitstream element ltp_short_used.  */
+#define LEN_LTP_SHORT_USED 1
+
+/*
+  Purpose:  Length of the bitstream element ltp_short_lag_present.  */
+#define LEN_LTP_SHORT_LAG_PRESENT 1
+
+/*
+  Purpose:  Length of the bitstream element ltp_short_lag.  */
+#define LEN_LTP_SHORT_LAG 5
+
+/*
+  Purpose:  Offset of the lags written in the bitstream.  */
+#define NOK_LTP_LAG_OFFSET 16
+
+/*
+  Purpose:  Length of the bitstream element ltp_long_used.  */
+#define LEN_LTP_LONG_USED 1
+
+/*
+  Purpose:  Upper limit for the number of scalefactor bands
+        which can use lt prediction with long windows.
+  Explanation:  Bands 0..NOK_MAX_LT_PRED_SFB-1 can use lt prediction.  */
+#define NOK_MAX_LT_PRED_LONG_SFB 40
+
+/*
+  Purpose:  Upper limit for the number of scalefactor bands
+        which can use lt prediction with short windows.
+  Explanation:  Bands 0..NOK_MAX_LT_PRED_SFB-1 can use lt prediction.  */
+#define NOK_MAX_LT_PRED_SHORT_SFB 8
+
+/*
+   Purpose:      Buffer offset to maintain block alignment.
+   Explanation:  This is only used for a short window sequence.  */
+#define SHORT_SQ_OFFSET (BLOCK_LEN_LONG-(BLOCK_LEN_SHORT*4+BLOCK_LEN_SHORT/2))
+
+/*
+  Purpose:  Number of codes for LTP weight. */
+#define CODESIZE 8
+
+/*
+   Purpose:      Float type for external data.
+   Explanation:  - */
+typedef Float float_ext;
+
+/*
+  Purpose:  Codebook for LTP weight coefficients.  */
+static Float codebook[CODESIZE] =
+{
+  0.570829f,
+  0.696616f,
+  0.813004f,
+  0.911304f,
+  0.984900f,
+  1.067894f,
+  1.194601f,
+  1.369533f
+};
+
+#endif /* _NOK_LTP_COMMON_INTERNAL_H */
diff --git a/pns.c b/pns.c
new file mode 100644
index 0000000..ccf5bb0
--- /dev/null
+++ b/pns.c
@@ -0,0 +1,176 @@
+/************************* MPEG-4 AAC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 AAC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 AAC/MPEG-4 Audio tools as specified by the MPEG-2 AAC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 AAC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 AAC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 AAC/MPEG-4 Audio conforming products. The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 AAC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: pns.c,v 1.6 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#include "all.h"
+
+
+#define MEAN_NRG 1.5625e+18      /* Theory: (2^31)^2 / 3 = 1.537228e+18 */
+
+static void random2(long *seed)
+{
+    *seed = (1664525L * *seed) + 1013904223L;  /* Numerical recipes */
+}
+
+
+static void gen_rand_vector(float *spec, int size, long *state)
+/* Noise generator, generating vector with unity energy */
+{
+    int i;
+    float s, norm, nrg= 0.0;
+
+    norm = 1.0f / (float)sqrt( size * MEAN_NRG );
+
+    for (i=0; i<size; i++)
+    {
+        random2(state);
+        spec[i] = (float)(*state * norm);
+        nrg += spec[i] * spec[i];
+    }
+
+    s = 1.0f / (float)sqrt( nrg );
+    for (i=0; i<size; i++)
+        spec[i] *= s;
+}
+
+
+
+/*
+ * if (noise correlated) {
+ *   restore saved left channel random generator state
+ *   generate random values
+ * } else {
+ *   save current random generator state
+ *   generate random values
+ * }
+ * scale according to scalefactor
+ *
+ * Important: needs to be called left channel, then right channel
+ *            for each channel pair
+ */
+
+void pns(faacDecHandle hDecoder, MC_Info *mip, Info *info, int widx, int ch,
+         byte *group, byte *cb_map, int *factors,
+         int *lpflag, Float *coef[Chans] )
+{
+    Ch_Info *cip = &mip->ch_info[ch];
+    Float   *spec, *fp, scale;
+    int     cb, corr_flag, sfb, n, nn, b, bb, nband;
+    int   *band;
+    long    *nsp;
+
+    /* store original predictor flags when left channel of a channel pair */
+    if ((cip->cpe  &&  cip->ch_is_left  &&  info->islong))
+        for (sfb=0; sfb<info->sfb_per_sbk[0]; sfb++)
+            hDecoder->lp_store[sfb+1] = lpflag[sfb+1];
+
+    /* restore original predictor flags when right channel of a channel pair */
+    if ((cip->cpe  &&  !cip->ch_is_left  &&  info->islong))
+        for (sfb=0; sfb<info->sfb_per_sbk[0]; sfb++)
+            lpflag[sfb+1] = hDecoder->lp_store[sfb+1];
+
+    spec = coef[ ch ];
+    nsp = hDecoder->noise_state_save;
+
+    /* PNS goes by group */
+    bb = 0;
+    for (b = 0; b < info->nsbk; ) {
+        nband = info->sfb_per_sbk[b];
+        band = info->sbk_sfb_top[b];
+
+        b = *group++;       /* b = index of last sbk in group */
+        for (; bb < b; bb++) {  /* bb = sbk index */
+            n = 0;
+            for (sfb = 0; sfb < nband; sfb++){
+                nn = band[sfb]; /* band is offset table, nn is last coef in band */
+                cb = cb_map[sfb];
+                if (cb == NOISE_HCB  ||  cb == NOISE_HCB+100) {
+                    /* found noise  substitution code book */
+
+                    /* disable prediction (only important for long blocks) */
+                    if (info->islong)  lpflag[1+sfb] = 0;
+
+                    /* determine left/right correlation */
+                    corr_flag = (cb != NOISE_HCB);
+
+                    /* reconstruct noise substituted values */
+                    /* generate random noise */
+                    fp = spec + n;
+                    if (corr_flag)  {
+                        /* Start with stored state */
+                        gen_rand_vector( fp, nn-n, nsp+sfb );
+                    } else {
+                        /* Store current state and go */
+                        nsp[sfb] = hDecoder->cur_noise_state;
+                        gen_rand_vector( fp, nn-n, &hDecoder->cur_noise_state );
+                    }
+
+                    /* scale to target energy */
+                    scale = (float)pow( 2.0, 0.25*(factors[sfb]) );
+                    for (; n < nn; n++) {   /* n is coef index */
+                        *fp++ *= scale;
+                    }
+                }
+                n = nn;
+            }
+            spec += info->bins_per_sbk[bb];
+            factors += nband;
+        }
+        nsp += info->sfb_per_sbk[bb-1];
+        cb_map += info->sfb_per_sbk[bb-1];
+    }
+}
+
+
+/********************************************************************************
+ *** FUNCTION: predict_pns_reset()                                              *
+ ***                                        *
+ ***    carry out predictor reset for PNS scalefactor bands (long blocks)       *
+ ***                                        *
+ ********************************************************************************/
+void predict_pns_reset(Info* info, PRED_STATUS *psp, byte *cb_map)
+{
+    int    nband, sfb, i, top;
+    int    *band;
+
+    if (info->islong) {
+
+        nband = info->sfb_per_sbk[0];
+        band = info->sbk_sfb_top[0];
+
+        for (i=0,sfb=0; sfb<nband; sfb++)  {
+
+            top = band[sfb];
+            if (cb_map[sfb] == NOISE_HCB  ||  cb_map[sfb] == NOISE_HCB+100) {
+                for (; i<top; i++)
+                    reset_pred_state(&psp[i]);
+            }
+            i = top;
+        }
+
+    } /* end islong */
+}
+
diff --git a/port.h b/port.h
new file mode 100644
index 0000000..ad2d6d7
--- /dev/null
+++ b/port.h
@@ -0,0 +1,83 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS and edited by
+Yoshiaki Oikawa (Sony Corporaion),
+Mitsuyuki Hatanaka (Sony Corporation),
+in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: port.h,v 1.5 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#ifndef _port_h_
+#define _port_h_
+
+#ifndef min
+#define min(a,b) ( (a) < (b) ? (a) : (b) )
+#endif
+
+#include "all.h"
+
+
+int check_mc_info(faacDecHandle hDecoder, MC_Info *mip, int new_config);
+int chn_config(faacDecHandle hDecoder, int id, int tag,
+               int common_window, MC_Info *mip);
+__inline void decode_huff_cw(faacDecHandle hDecoder, Huffman *h, int *qp, Hcb *hcb);
+__inline int decode_huff_cw_scl(faacDecHandle hDecoder, Huffscl *h);
+int enter_mc_info(faacDecHandle hDecoder, MC_Info *mip, ProgConfig *pcp);
+int get_adif_header(faacDecHandle hDecoder);
+int get_adts_header(faacDecHandle hDecoder);
+int get_prog_config(faacDecHandle hDecoder, ProgConfig *p);
+void getfill(faacDecHandle hDecoder, byte *data);
+int getdata(faacDecHandle hDecoder, int *tag, int *dt_cnt, byte *data_bytes);
+void huffbookinit(faacDecHandle hDecoder);
+int huffdecode(faacDecHandle hDecoder, int id, MC_Info *mip, byte *win,
+               Wnd_Shape *wshape, byte **cb_map, int **factors,
+               byte **group, byte *hasmask, byte **mask, byte *max_sfb,
+               int **lpflag, int **prstflag, NOK_LT_PRED_STATUS **nok_ltp,
+               TNS_frame_info **tns, Float **coef);
+void hufftab(Hcb *hcb, Huffman *hcw, int dim, int signed_cb);
+void infoinit(faacDecHandle hDecoder, SR_Info *sip);
+void intensity(MC_Info *mip, Info *info, int widx, int ch, byte *group, byte *cb_map,
+               int *factors, int *lpflag, Float *coef[Chans]);
+void map_mask(Info *info, byte *group, byte *mask, byte *cb_map);
+void reset_mc_info(faacDecHandle hDecoder, MC_Info *mip);
+void reset_bits(void);
+void synt(Info *info, byte *group, byte *mask, Float *right, Float *left);
+void tns_decode_subblock(faacDecHandle hDecoder, Float *spec, int nbands,
+                         int *sfb_top, int islong, TNSinfo *tns_info);
+void tns_filter_subblock(faacDecHandle hDecoder, Float *spec, int nbands,
+                         int *sfb_top, int islong, TNSinfo *tns_info);
+void pns(faacDecHandle hDecoder, MC_Info *mip, Info *info, int widx, int ch, byte *group, byte *cb_map,
+         int *factors, int *lpflag, Float *coef[Chans]);
+void freq2time_adapt(faacDecHandle hDecoder,byte wnd, Wnd_Shape *wnd_shape,
+                     Float *coef, Float *state, Float *data);
+void time2freq_adapt(faacDecHandle hDecoder,WINDOW_TYPE blockType, Wnd_Shape *wnd_shape,
+                     Float *timeInPtr, Float *ffreqOutPtr);
+int predict(faacDecHandle hDecoder, Info* info, int profile, int *lpflag, PRED_STATUS *psp, Float *coef);
+void predict_pns_reset(Info* info, PRED_STATUS *psp, byte *cb_map);
+void init_pred(faacDecHandle hDecoder, PRED_STATUS **sp_status, int channels);
+int predict_reset(faacDecHandle hDecoder, Info* info, int *prstflag, PRED_STATUS **psp,
+                  int firstCh, int lastCh, int *last_rstgrp_num);
+void reset_pred_state(PRED_STATUS *psp);
+int get_sr_index(unsigned int sampleRate);
+
+#endif  /* _port_h_ */
diff --git a/stereo.c b/stereo.c
new file mode 100644
index 0000000..f62cc2f
--- /dev/null
+++ b/stereo.c
@@ -0,0 +1,99 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: stereo.c,v 1.6 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#include "all.h"
+
+void synt(Info *info, byte *group, byte *mask, Float *right, Float *left)
+{
+    Float vrr, vrl, *r, *l;
+    int *band;
+    int i, n, nn, b, bb, nband;
+
+    /*mask is grouped */
+    bb = 0;
+    for(b = 0; b < info->nsbk; ){
+        nband = info->sfb_per_sbk[b];
+        band = info->sbk_sfb_top[b];
+
+        b = *group++;       /*b = index of last sbk in group */
+        for(; bb < b; bb++){    /* bb = sbk index */
+            n = 0;
+            for(i = 0; i < nband; i++){
+                nn = band[i];   /* band is offset table, nn is last coef in band */
+                if(mask[i]){
+                    r = right + n;
+                    l = left + n;
+                    for(; n < nn; n++){ /* n is coef index */
+                        vrr = *r;
+                        vrl = *l;
+                        *l = vrr + vrl;
+                        *r = vrl - vrr;
+                        r++;
+                        l++;
+                    }
+                }
+                n = nn;
+            }
+            right += info->bins_per_sbk[bb];
+            left += info->bins_per_sbk[bb];
+
+        }
+        mask += info->sfb_per_sbk[bb-1];
+    }
+}
+
+
+/* Map mask to intensity stereo signalling */
+void map_mask(Info *info, byte *group, byte *mask, byte *cb_map)
+{
+    int sfb, b, nband;
+
+    /* mask goes by group */
+    for (b = 0; b < info->nsbk; ) {
+        nband = info->sfb_per_sbk[b];
+
+        for (sfb = 0; sfb<nband; sfb++){
+            if (mask[sfb]) {
+                if (cb_map[sfb] == INTENSITY_HCB)  {
+                    cb_map[sfb] = INTENSITY_HCB2;
+                    mask[sfb] = 0;
+                } else if (cb_map[sfb] == INTENSITY_HCB2)  {
+                    cb_map[sfb] = INTENSITY_HCB;
+                    mask[sfb] = 0;
+                } else if (cb_map[sfb] == NOISE_HCB)  {
+                    cb_map[sfb] = NOISE_HCB + 100;
+                    mask[sfb] = 0;
+                }
+            }
+        }
+
+        mask += info->sfb_per_sbk[b];
+        cb_map += info->sfb_per_sbk[b];
+        b = *group++;       /* b = index of last sbk in group */
+    }
+}
+
diff --git a/tns.c b/tns.c
new file mode 100644
index 0000000..dcbc220
--- /dev/null
+++ b/tns.c
@@ -0,0 +1,245 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: tns.c,v 1.8 2003/02/18 18:51:31 wmaycisco Exp $
+ */
+
+#include "all.h"
+#include "util.h"
+
+#define sfb_offset(x) ( ((x) > 0) ? sfb_top[(x)-1] : 0 )
+
+/* Decoder transmitted coefficients for one TNS filter */
+static void tns_decode_coef( int order, int coef_res, int *coef, Float *a )
+{
+    int i, m;
+    Float iqfac,  iqfac_m;
+    Float tmp[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1];
+
+    /* Inverse quantization */
+    iqfac   = ((1 << (coef_res-1)) - 0.5f) / (C_PI/2.0f);
+    iqfac_m = ((1 << (coef_res-1)) + 0.5f) / (C_PI/2.0f);
+    for (i=0; i<order; i++)  {
+        tmp[i+1] = (float)sin( coef[i] / ((coef[i] >= 0) ? iqfac : iqfac_m) );
+    }
+    /* Conversion to LPC coefficients
+     * Markel and Gray,  pg. 95
+     */
+    a[0] = 1;
+    for (m=1; m<=order; m++)  {
+        b[0] = a[0];
+        for (i=1; i<m; i++)  {
+            b[i] = a[i] + tmp[m] * a[m-i];
+        }
+        b[m] = tmp[m];
+        for (i=0; i<=m; i++)  {
+            a[i] = b[i];
+        }
+    }
+}
+
+/* apply the TNS filter */
+static void tns_ar_filter( Float *spec, int size, int inc, Float *lpc, int order )
+{
+    /*
+     *  - Simple all-pole filter of order "order" defined by
+     *    y(n) =  x(n) - a(2)*y(n-1) - ... - a(order+1)*y(n-order)
+     *
+     *  - The state variables of the filter are initialized to zero every time
+     *
+     *  - The output data is written over the input data ("in-place operation")
+     *
+     *  - An input vector of "size" samples is processed and the index increment
+     *    to the next data sample is given by "inc"
+     */
+    int i, j;
+    Float y, state[TNS_MAX_ORDER];
+
+    for (i=0; i<order; i++)
+        state[i] = 0;
+
+    if (inc == -1)
+        spec += size-1;
+
+    for (i=0; i<size; i++) {
+        y = *spec;
+        for (j=0; j<order; j++)
+            y -= lpc[j+1] * state[j];
+        for (j=order-1; j>0; j--)
+            state[j] = state[j-1];
+        state[0] = y;
+        *spec = y;
+        spec += inc;
+    }
+}
+
+/* TNS decoding for one channel and frame */
+void tns_decode_subblock(faacDecHandle hDecoder, Float *spec, int nbands,
+                         int *sfb_top, int islong, TNSinfo *tns_info)
+{
+    int f, m, start, stop, size, inc;
+    int n_filt, coef_res, order, direction;
+    int *coef;
+    Float lpc[TNS_MAX_ORDER+1];
+    TNSfilt *filt;
+
+    n_filt = tns_info->n_filt;
+    for (f=0; f<n_filt; f++)  {
+        coef_res = tns_info->coef_res;
+        filt = &tns_info->filt[f];
+        order = filt->order;
+        direction = filt->direction;
+        coef = filt->coef;
+        start = filt->start_band;
+        stop = filt->stop_band;
+
+        m = tns_max_order(hDecoder, islong);
+        if (order > m) {
+            order = m;
+        }
+        if (!order)  continue;
+
+        tns_decode_coef(order, coef_res, coef, lpc);
+
+        start = min(start, tns_max_bands(hDecoder, islong));
+        start = min(start, nbands);
+        start = sfb_offset( start );
+
+        stop = min(stop, tns_max_bands(hDecoder, islong));
+        stop = min(stop, nbands);
+        stop = sfb_offset( stop );
+        if ((size = stop - start) <= 0)  continue;
+
+        if (direction)  {
+            inc = -1;
+        }  else {
+            inc =  1;
+        }
+
+        tns_ar_filter( &spec[start], size, inc, lpc, order );
+    }
+}
+
+
+/********************************************************/
+/* TnsInvFilter:                                        */
+/*   Inverse filter the given spec with specified       */
+/*   length using the coefficients specified in filter. */
+/*   Not that the order and direction are specified     */
+/*   withing the TNS_FILTER_DATA structure.             */
+/********************************************************/
+static void TnsInvFilter(int length, Float *spec, TNSfilt *filter, Float *coef)
+{
+    int i,j,k = 0;
+    int order = filter->order;
+    Float *a = coef;
+    Float *temp;
+
+    temp = (Float *)AllocMemory(length * sizeof (Float));
+
+    /* Determine loop parameters for given direction */
+    if (filter->direction)
+    {
+        /* Startup, initial state is zero */
+        temp[length-1]=spec[length-1];
+        for (i=length-2;i>(length-1-order);i--) {
+            temp[i]=spec[i];
+            k++;
+            for (j=1;j<=k;j++) {
+                spec[i]+=temp[i+j]*a[j];
+            }
+        }
+
+        /* Now filter the rest */
+        for (i=length-1-order;i>=0;i--) {
+            temp[i]=spec[i];
+            for (j=1;j<=order;j++) {
+                spec[i]+=temp[i+j]*a[j];
+            }
+        }
+
+    } else {
+        /* Startup, initial state is zero */
+        temp[0]=spec[0];
+        for (i=1;i<order;i++) {
+            temp[i]=spec[i];
+            for (j=1;j<=i;j++) {
+                spec[i]+=temp[i-j]*a[j];
+            }
+        }
+
+        /* Now filter the rest */
+        for (i=order;i<length;i++) {
+            temp[i]=spec[i];
+            for (j=1;j<=order;j++) {
+                spec[i]+=temp[i-j]*a[j];
+            }
+        }
+    }
+
+    FreeMemory(temp);
+}
+
+
+void tns_filter_subblock(faacDecHandle hDecoder, Float *spec, int nbands,
+                         int *sfb_top, int islong, TNSinfo *tns_info)
+{
+    int f, m, start, stop, size;
+    int n_filt, coef_res, order;
+    int *coef;
+    Float lpc[TNS_MAX_ORDER+1];
+    TNSfilt *filt;
+
+    n_filt = tns_info->n_filt;
+    for (f=0; f<n_filt; f++)
+    {
+        coef_res = tns_info->coef_res;
+        filt = &tns_info->filt[f];
+        order = filt->order;
+        coef = filt->coef;
+        start = filt->start_band;
+        stop = filt->stop_band;
+
+        m = tns_max_order(hDecoder, islong);
+        if (order > m)
+            order = m;
+
+        if (!order)  continue;
+
+        tns_decode_coef(order, coef_res, coef, lpc);
+
+        start = min(start, tns_max_bands(hDecoder, islong));
+        start = min(start, nbands);
+        start = sfb_offset( start );
+
+        stop = min(stop, tns_max_bands(hDecoder, islong));
+        stop = min(stop, nbands);
+        stop = sfb_offset( stop );
+        if ((size = stop - start) <= 0)
+            continue;
+
+        TnsInvFilter(size, spec + start, filt, lpc);
+    }
+}
+
diff --git a/tns.h b/tns.h
new file mode 100644
index 0000000..4428613
--- /dev/null
+++ b/tns.h
@@ -0,0 +1,59 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: tns.h,v 1.5 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#ifndef _tns_h_
+#define _tns_h_
+
+#define TNS_MAX_BANDS   49
+#define TNS_MAX_ORDER   31
+#define TNS_MAX_WIN 8
+#define TNS_MAX_FILT    3
+
+typedef struct
+{
+    int start_band;
+    int stop_band;
+    int order;
+    int direction;
+    int coef_compress;
+    int coef[TNS_MAX_ORDER];
+} TNSfilt;
+
+typedef struct
+{
+    int n_filt;
+    int coef_res;
+    TNSfilt filt[TNS_MAX_FILT];
+} TNSinfo;
+
+typedef struct
+{
+    int n_subblocks;
+    TNSinfo info[TNS_MAX_WIN];
+} TNS_frame_info;
+
+#endif  /* _tns_h_ */
diff --git a/transfo.c b/transfo.c
new file mode 100644
index 0000000..8ef6241
--- /dev/null
+++ b/transfo.c
@@ -0,0 +1,461 @@
+/************************* MPEG-2 NBC Audio Decoder **************************
+ *                                                                           *
+"This software module was originally developed by
+AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
+development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
+14496-1,2 and 3. This software module is an implementation of a part of one or more
+MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+standards free license to this software module or modifications thereof for use in
+hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
+Audio  standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing patents.
+The original developer of this software module and his/her company, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of this software
+module or modifications thereof in an implementation. Copyright is not released for
+non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
+retains full right to use the code for his/her  own purpose, assign or donate the
+code to a third party and to inhibit third party from using the code for non
+MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
+be included in all copies or derivative works."
+Copyright(c)1996.
+ *                                                                           *
+ ****************************************************************************/
+/*
+ * $Id: transfo.c,v 1.5 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#include <math.h>
+#include "all.h"
+#include "transfo.h"
+#include "fastfft.h"
+
+/*
+#define INTEL_SPL
+*/
+
+#ifdef INTEL_SPL
+#define nsp_UsesAll
+#include <nsp.h>
+#include <nspwin.h>
+
+/* choose the library that best fits your processor */
+#pragma comment (lib, "nsppxl.lib")
+#endif
+
+
+#ifndef M_PI
+#define M_PI        3.14159265358979323846
+#endif
+
+#ifndef M_PI_2
+#define M_PI_2      1.57079632679489661923
+#endif
+
+void MDCT_Long(faacDecHandle hDecoder, fftw_real *data)
+{
+#ifdef INTEL_SPL
+    SCplx FFT_data[512];
+#else
+    fftw_complex FFTarray[512];    /* the array for in-place FFT */
+#endif
+    fftw_real tempr, tempi, c, s, cold, cfreq, sfreq; /* temps for pre and post twiddle */
+/*  fftw_real freq = 0.0030679616611450911f; */
+    fftw_real fac,cosfreq8,sinfreq8;
+    int i, n;
+    int b = 2048 >> 1;
+    int N4 = 2048 >> 2;
+    int N2 = 2048 >> 1;
+    int a = 2048 - b;
+    int a2 = a >> 1;
+    int a4 = a >> 2;
+    int b4 = b >> 2;
+    int unscambled;
+
+
+    /* Choosing to allocate 2/N factor to Inverse Xform! */
+    fac = 2.; /* 2 from MDCT inverse  to forward */
+
+    /* prepare for recurrence relation in pre-twiddle */
+    cfreq = 0.99999529123306274f;
+    sfreq = 0.0030679567717015743f;
+    cosfreq8 = 0.99999994039535522f;
+    sinfreq8 = 0.00038349519824312089f;
+
+    c = cosfreq8;
+    s = sinfreq8;
+
+    for (i = 0; i < N4; i++)
+    {
+        /* calculate real and imaginary parts of g(n) or G(p) */
+
+    n = 2048 / 2 - 1 - 2 * i;
+        if (i < b4) {
+      tempr = data [a2 + n] + data [2048 + a2 - 1 - n]; /* use second form of e(n) for n = N / 2 - 1 - 2i */
+        } else {
+            tempr = data [a2 + n] - data [a2 - 1 - n]; /* use first form of e(n) for n = N / 2 - 1 - 2i */
+        }
+        n = 2 * i;
+        if (i < a4) {
+            tempi = data [a2 + n] - data [a2 - 1 - n]; /* use first form of e(n) for n=2i */
+        } else {
+      tempi = data [a2 + n] + data [2048 + a2 - 1 - n]; /* use second form of e(n) for n=2i*/
+        }
+
+        /* calculate pre-twiddled FFT input */
+#ifdef INTEL_SPL
+    FFT_data[i].re = tempr * c + tempi * s;
+    FFT_data[i].im = tempi * c - tempr * s;
+#else
+        FFTarray [i].re = tempr * c + tempi * s;
+        FFTarray [i].im = tempi * c - tempr * s;
+#endif
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+
+    /* Perform in-place complex FFT of length N/4 */
+#ifdef INTEL_SPL
+    nspcFft(FFT_data, 9, NSP_Forw);
+#else
+    pfftw_512(FFTarray);
+#endif
+
+
+    /* prepare for recurrence relations in post-twiddle */
+    c = cosfreq8;
+    s = sinfreq8;
+
+    /* post-twiddle FFT output and then get output data */
+    for (i = 0; i < N4; i++)
+    {
+
+      /* get post-twiddled FFT output  */
+      /* Note: fac allocates 4/N factor from IFFT to forward and inverse */
+#ifdef INTEL_SPL
+      tempr = fac * (FFT_data[i].re * c + FFT_data[i].im * s);
+      tempi = fac * (FFT_data[i].im * c - FFT_data[i].re * s);
+#else
+      unscambled = hDecoder->unscambled512[i];
+
+      tempr = fac * (FFTarray [unscambled].re * c + FFTarray [unscambled].im * s);
+      tempi = fac * (FFTarray [unscambled].im * c - FFTarray [unscambled].re * s);
+#endif
+
+      /* fill in output values */
+      data [2 * i] = -tempr;   /* first half even */
+      data [N2 - 1 - 2 * i] = tempi;  /* first half odd */
+      data [N2 + 2 * i] = -tempi;  /* second half even */
+      data [2048 - 1 - 2 * i] = tempr;  /* second half odd */
+
+      /* use recurrence to prepare cosine and sine for next value of i */
+      cold = c;
+      c = c * cfreq - s * sfreq;
+      s = s * cfreq + cold * sfreq;
+    }
+}
+
+void MDCT_Short(faacDecHandle hDecoder, fftw_real *data)
+{
+#ifdef INTEL_SPL
+    SCplx FFT_data[64];
+#else
+    fftw_complex FFTarray[64];    /* the array for in-place FFT */
+#endif
+    fftw_real tempr, tempi, c, s, cold, cfreq, sfreq; /* temps for pre and post twiddle */
+/*  fftw_real freq = 0.024543693289160728f; */
+    fftw_real fac,cosfreq8,sinfreq8;
+    int i, n;
+    int b = 256 >> 1;
+    int N4 = 256 >> 2;
+    int N2 = 256 >> 1;
+    int a = 256 - b;
+    int a2 = a >> 1;
+    int a4 = a >> 2;
+    int b4 = b >> 2;
+    int unscambled;
+
+
+    /* Choosing to allocate 2/N factor to Inverse Xform! */
+    fac = 2.; /* 2 from MDCT inverse  to forward */
+
+    /* prepare for recurrence relation in pre-twiddle */
+    cfreq = 0.99969881772994995f;
+    sfreq = 0.024541229009628296f;
+    cosfreq8 = 0.99999529123306274f;
+    sinfreq8 = 0.0030679568483393833f;
+
+    c = cosfreq8;
+    s = sinfreq8;
+
+    for (i = 0; i < N4; i++)
+    {
+        /* calculate real and imaginary parts of g(n) or G(p) */
+
+    n = 256 / 2 - 1 - 2 * i;
+        if (i < b4) {
+      tempr = data [a2 + n] + data [256 + a2 - 1 - n]; /* use second form of e(n) for n = N / 2 - 1 - 2i */
+        } else {
+            tempr = data [a2 + n] - data [a2 - 1 - n]; /* use first form of e(n) for n = N / 2 - 1 - 2i */
+        }
+        n = 2 * i;
+        if (i < a4) {
+            tempi = data [a2 + n] - data [a2 - 1 - n]; /* use first form of e(n) for n=2i */
+        } else {
+      tempi = data [a2 + n] + data [256 + a2 - 1 - n]; /* use second form of e(n) for n=2i*/
+        }
+
+        /* calculate pre-twiddled FFT input */
+#ifdef INTEL_SPL
+    FFT_data[i].re = tempr * c + tempi * s;
+    FFT_data[i].im = tempi * c - tempr * s;
+#else
+        FFTarray [i].re = tempr * c + tempi * s;
+        FFTarray [i].im = tempi * c - tempr * s;
+#endif
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+
+    /* Perform in-place complex FFT of length N/4 */
+#ifdef INTEL_SPL
+    nspcFft(FFT_data, 6, NSP_Forw);
+#else
+    pfftw_64(FFTarray);
+#endif
+
+    /* prepare for recurrence relations in post-twiddle */
+    c = cosfreq8;
+    s = sinfreq8;
+
+    /* post-twiddle FFT output and then get output data */
+    for (i = 0; i < N4; i++) {
+
+        /* get post-twiddled FFT output  */
+        /* Note: fac allocates 4/N factor from IFFT to forward and inverse */
+#ifdef INTEL_SPL
+    tempr = fac * (FFT_data[i].re * c + FFT_data[i].im * s);
+    tempi = fac * (FFT_data[i].im * c - FFT_data[i].re * s);
+#else
+        unscambled = hDecoder->unscambled64[i];
+
+    tempr = fac * (FFTarray [unscambled].re * c + FFTarray [unscambled].im * s);
+    tempi = fac * (FFTarray [unscambled].im * c - FFTarray [unscambled].re * s);
+#endif
+
+        /* fill in output values */
+        data [2 * i] = -tempr;   /* first half even */
+        data [N2 - 1 - 2 * i] = tempi;  /* first half odd */
+        data [N2 + 2 * i] = -tempi;  /* second half even */
+    data [256 - 1 - 2 * i] = tempr;  /* second half odd */
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+}
+
+
+void IMDCT_Long(faacDecHandle hDecoder, fftw_real *data)
+{
+#ifdef INTEL_SPL
+  SCplx FFT_data[512];    /* the array for in-place FFT */
+#else
+    fftw_complex FFTarray[512];    /* the array for in-place FFT */
+#endif
+    fftw_real tempr, tempi, c, s, cold, cfreq, sfreq; /* temps for pre and post twiddle */
+
+/*  fftw_real freq = 0.0030679616611450911f; */
+    fftw_real fac, cosfreq8, sinfreq8;
+    int i;
+  int Nd2 = 2048 >> 1;
+  int Nd4 = 2048 >> 2;
+  int Nd8 = 2048 >> 3;
+    int unscambled;
+
+    /* Choosing to allocate 2/N factor to Inverse Xform! */
+  fac = 0.0009765625f;
+
+    /* prepare for recurrence relation in pre-twiddle */
+  cfreq = 0.99999529123306274f;
+  sfreq = 0.0030679567717015743f;
+  cosfreq8 = 0.99999994039535522f;
+  sinfreq8 = 0.00038349519824312089f;
+
+    c = cosfreq8;
+    s = sinfreq8;
+
+
+    for (i = 0; i < Nd4; i++) {
+
+        /* calculate real and imaginary parts of g(n) or G(p) */
+        tempr = -data [2 * i];
+        tempi = data [Nd2 - 1 - 2 * i];
+
+        /* calculate pre-twiddled FFT input */
+#ifdef INTEL_SPL
+    FFT_data[i].re = tempr * c - tempi * s;
+    FFT_data[i].im = tempi * c + tempr * s;
+#else
+        unscambled = hDecoder->unscambled512[i];
+
+        FFTarray [unscambled].re = tempr * c - tempi * s;
+        FFTarray [unscambled].im = tempi * c + tempr * s;
+#endif
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+
+    /* Perform in-place complex IFFT of length N/4 */
+#ifdef INTEL_SPL
+  nspcFft(FFT_data, 9, NSP_Inv | NSP_NoScale);
+#else
+  pfftwi_512(FFTarray);
+#endif
+
+    /* prepare for recurrence relations in post-twiddle */
+    c = cosfreq8;
+    s = sinfreq8;
+
+    /* post-twiddle FFT output and then get output data */
+    for (i = 0; i < Nd4; i++) {
+
+        /* get post-twiddled FFT output  */
+#ifdef INTEL_SPL
+  tempr = fac * (FFT_data[i].re * c - FFT_data[i].im * s);
+      tempi = fac * (FFT_data[i].im * c + FFT_data[i].re * s);
+#else
+    tempr = fac * (FFTarray[i].re * c - FFTarray[i].im * s);
+        tempi = fac * (FFTarray[i].im * c + FFTarray[i].re * s);
+#endif
+
+        /* fill in output values */
+        data [Nd2 + Nd4 - 1 - 2 * i] = tempr;
+        if (i < Nd8) {
+            data [Nd2 + Nd4 + 2 * i] = tempr;
+        } else {
+            data [2 * i - Nd4] = -tempr;
+        }
+        data [Nd4 + 2 * i] = tempi;
+        if (i < Nd8) {
+            data [Nd4 - 1 - 2 * i] = -tempi;
+        } else {
+      data [Nd4 + 2048 - 1 - 2*i] = tempi;
+        }
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+  }
+}
+
+
+void IMDCT_Short(faacDecHandle hDecoder, fftw_real *data)
+{
+#ifdef INTEL_SPL
+  SCplx FFT_data[64];    /* the array for in-place FFT */
+#else
+    fftw_complex FFTarray[64];    /* the array for in-place FFT */
+#endif
+    fftw_real tempr, tempi, c, s, cold, cfreq, sfreq; /* temps for pre and post twiddle */
+/*  fftw_real freq = 0.024543693289160728f; */
+    fftw_real fac, cosfreq8, sinfreq8;
+    int i;
+    int Nd2 = 256 >> 1;
+    int Nd4 = 256 >> 2;
+    int Nd8 = 256 >> 3;
+    int unscambled;
+
+    /* Choosing to allocate 2/N factor to Inverse Xform! */
+  fac = 0.0078125f; /* remaining 2/N from 4/N IFFT factor */
+
+    /* prepare for recurrence relation in pre-twiddle */
+  cfreq = 0.99969881772994995f;
+  sfreq = 0.024541229009628296f;
+  cosfreq8 = 0.99999529123306274f;
+  sinfreq8 = 0.0030679568483393833f;
+
+    c = cosfreq8;
+    s = sinfreq8;
+
+    for (i = 0; i < Nd4; i++)
+  {
+
+        /* calculate real and imaginary parts of g(n) or G(p) */
+        tempr = -data [2 * i];
+        tempi = data [Nd2 - 1 - 2 * i];
+
+        /* calculate pre-twiddled FFT input */
+#ifdef INTEL_SPL
+    FFT_data[i].re = tempr * c - tempi * s;
+    FFT_data[i].im = tempi * c + tempr * s;
+#else
+        unscambled = hDecoder->unscambled64[i];
+
+        FFTarray [unscambled].re = tempr * c - tempi * s;
+        FFTarray [unscambled].im = tempi * c + tempr * s;
+#endif
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+
+    /* Perform in-place complex IFFT of length N/4 */
+
+#ifdef INTEL_SPL
+  nspcFft(FFT_data, 6, NSP_Inv | NSP_NoScale);
+#else
+    pfftwi_64(FFTarray);
+#endif
+
+    /* prepare for recurrence relations in post-twiddle */
+    c = cosfreq8;
+    s = sinfreq8;
+
+    /* post-twiddle FFT output and then get output data */
+    for (i = 0; i < Nd4; i++) {
+
+        /* get post-twiddled FFT output  */
+#ifdef INTEL_SPL
+      tempr = fac * (FFT_data[i].re * c - FFT_data[i].im * s);
+      tempi = fac * (FFT_data[i].im * c + FFT_data[i].re * s);
+#else
+    tempr = fac * (FFTarray[i].re * c - FFTarray[i].im * s);
+        tempi = fac * (FFTarray[i].im * c + FFTarray[i].re * s);
+#endif
+
+        /* fill in output values */
+        data [Nd2 + Nd4 - 1 - 2 * i] = tempr;
+        if (i < Nd8) {
+            data [Nd2 + Nd4 + 2 * i] = tempr;
+        } else {
+            data [2 * i - Nd4] = -tempr;
+        }
+        data [Nd4 + 2 * i] = tempi;
+        if (i < Nd8) {
+            data [Nd4 - 1 - 2 * i] = -tempi;
+        } else {
+      data [Nd4 + 256 - 1 - 2*i] = tempi;
+        }
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+}
+
+
diff --git a/transfo.h b/transfo.h
new file mode 100644
index 0000000..fb27f12
--- /dev/null
+++ b/transfo.h
@@ -0,0 +1,58 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * $Id: transfo.h,v 1.4 2002/01/11 00:55:17 wmaycisco Exp $
+ */
+
+#ifndef TRANSFORM_H
+#define TRANSFORM_H
+
+/* Use this for decoder - single precision */
+typedef float fftw_real;
+
+/* Use this for encoder - double precision */
+/* typedef double fftw_real; */
+
+typedef struct {
+     fftw_real re, im;
+} fftw_complex;
+
+#include "all.h"
+
+#define c_re(c)  ((c).re)
+#define c_im(c)  ((c).im)
+
+#define DEFINE_PFFTW(size)          \
+ void pfftwi_##size(fftw_complex *input);   \
+ void pfftw_##size(fftw_complex *input);    \
+ int  pfftw_permutation_##size(int i);
+
+DEFINE_PFFTW(16)
+DEFINE_PFFTW(32)
+DEFINE_PFFTW(64)
+DEFINE_PFFTW(128)
+DEFINE_PFFTW(512)
+
+void MakeFFTOrder(faacDecHandle hDecoder);
+void IMDCT_Long(faacDecHandle hDecoder, fftw_real *data);
+void IMDCT_Short(faacDecHandle hDecoder, fftw_real *data);
+
+void MDCT_Long(faacDecHandle hDecoder, fftw_real *data);
+void MDCT_Short(faacDecHandle hDecoder, fftw_real *data);
+
+#endif    /*    TRANSFORM_H     */
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..40c07a3
--- /dev/null
+++ b/util.c
@@ -0,0 +1,89 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * $Id: util.c,v 1.1 2001/06/28 23:54:22 wmaycisco Exp $
+ */
+
+#include "all.h"
+
+/*
+ * object_type dependent parameters
+ */
+int tns_max_bands(faacDecHandle hDecoder, int islong)
+{
+    int i;
+
+    /* construct second index */
+    i = islong ? 0 : 1;
+    
+    return tns_max_bands_tbl[hDecoder->mc_info.sampling_rate_idx][i];
+}
+
+int tns_max_order(faacDecHandle hDecoder, int islong)
+{
+	if (hDecoder->isMpeg4) {
+		switch (hDecoder->mc_info.object_type) {
+		case AACMAIN:
+		case AACLC:
+		case AACLTP:
+			if (islong) {
+				if (hDecoder->mc_info.sampling_rate_idx <= 5) /* sr > 32000Hz */
+					return 12;
+				else
+					return 20;
+			} else
+				return 7;
+		case AACSSR:
+			return 12;
+		}
+	} else {
+		if (islong) {
+			switch (hDecoder->mc_info.object_type) {
+			case AACMAIN:
+				return 20;
+			case AACLC:
+			case AACSSR:
+				return 12;
+			}
+		} else { /* MPEG2 short window */
+			return 7;
+		}
+    }
+
+    return 0;
+}
+
+int pred_max_bands(faacDecHandle hDecoder)
+{
+    return pred_max_bands_tbl[hDecoder->mc_info.sampling_rate_idx];
+}
+
+int stringcmp(char const *str1, char const *str2, unsigned long len)
+{
+	signed int c1 = 0, c2 = 0;
+
+	while (len--) {
+		c1 = *str1++;
+		c2 = *str2++;
+
+		if (c1 == 0 || c1 != c2)
+			break;
+	}
+
+	return c1 - c2;
+}
diff --git a/util.h b/util.h
new file mode 100644
index 0000000..7d060ff
--- /dev/null
+++ b/util.h
@@ -0,0 +1,43 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * $Id: util.h,v 1.3 2003/01/23 22:33:51 wmaycisco Exp $
+ */
+
+#ifndef _UTIL_H_
+#define _UTIL_H_
+
+int tns_max_bands(faacDecHandle hDecoder, int islong);
+int tns_max_order(faacDecHandle hDecoder, int islong);
+int pred_max_bands(faacDecHandle hDecoder);
+int stringcmp(char const *str1, char const *str2, unsigned long len);
+
+/* Memory functions */
+#ifdef _WIN32
+#define AllocMemory(size) LocalAlloc(LPTR, size)
+#define FreeMemory(block) LocalFree(block)
+//#define SetMemory(block, value, size) FillMemory(block, size, value)
+#define SetMemory(block, value, size) memset(block, value, size)
+#else
+#define AllocMemory(size) malloc(size)
+#define FreeMemory(block) free(block)
+#define SetMemory(block, value, size) memset(block, value, size)
+#define CopyMemory(dest, source, len) memcpy(dest, source, len)
+#endif
+
+#endif