diff options
author | Lucas Eckels <eckels@google.com> | 2012-08-06 15:08:56 -0700 |
---|---|---|
committer | Lucas Eckels <eckels@google.com> | 2012-08-08 09:28:53 -0700 |
commit | 52a7faa517bcf8485d3c627cc94427f780b68eb8 (patch) | |
tree | 86d14121952c53e0a6ee895b23e426c4fdc3c258 | |
parent | d00984d120b98bb0464d7e96d2a9c446a7001099 (diff) | |
download | faad-52a7faa517bcf8485d3c627cc94427f780b68eb8.tar.gz |
Add faad source.
Change-Id: Ibb19041b539d5ed22bb0e757bd957ee9ab8c92e6
-rw-r--r-- | .gitignore | 33 | ||||
-rw-r--r-- | COPYING | 482 | ||||
-rw-r--r-- | Makefile | 48 | ||||
-rw-r--r-- | Makefile.am | 38 | ||||
-rw-r--r-- | README | 18 | ||||
-rw-r--r-- | all.h | 458 | ||||
-rw-r--r-- | bits.c | 123 | ||||
-rw-r--r-- | bits.h | 81 | ||||
-rw-r--r-- | block.c | 376 | ||||
-rw-r--r-- | block.h | 80 | ||||
-rwxr-xr-x | config.c | 645 | ||||
-rw-r--r-- | decdata.c | 234 | ||||
-rw-r--r-- | decoder.c | 608 | ||||
-rw-r--r-- | dolby_adapt.c | 537 | ||||
-rw-r--r-- | fastfft.c | 2908 | ||||
-rw-r--r-- | fastfft.h | 32 | ||||
-rw-r--r-- | huffdec.c | 967 | ||||
-rw-r--r-- | huffinit.c | 121 | ||||
-rw-r--r-- | hufftables.c | 1432 | ||||
-rw-r--r-- | intensity.c | 89 | ||||
-rw-r--r-- | interface.h | 236 | ||||
-rw-r--r-- | kbd_win.h | 1198 | ||||
-rw-r--r-- | libfaad.sln | 20 | ||||
-rw-r--r-- | libfaad.vcproj | 634 | ||||
-rw-r--r-- | libfaad60.dsp | 235 | ||||
-rw-r--r-- | monopred.c | 418 | ||||
-rw-r--r-- | monopred.h | 49 | ||||
-rw-r--r-- | mpeg4ip_config_Linux32.h | 245 | ||||
-rw-r--r-- | nok_lt_prediction.c | 178 | ||||
-rw-r--r-- | nok_lt_prediction.h | 56 | ||||
-rw-r--r-- | nok_ltp_common.h | 88 | ||||
-rw-r--r-- | nok_ltp_common_internal.h | 117 | ||||
-rw-r--r-- | pns.c | 176 | ||||
-rw-r--r-- | port.h | 83 | ||||
-rw-r--r-- | stereo.c | 99 | ||||
-rw-r--r-- | tns.c | 245 | ||||
-rw-r--r-- | tns.h | 59 | ||||
-rw-r--r-- | transfo.c | 461 | ||||
-rw-r--r-- | transfo.h | 58 | ||||
-rw-r--r-- | util.c | 89 | ||||
-rw-r--r-- | util.h | 43 |
41 files changed, 14097 insertions, 0 deletions
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 @@ -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 @@ -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). @@ -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_ */ @@ -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; +} @@ -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 @@ -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; +} + @@ -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 */ @@ -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 */ +} + @@ -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 */ + } +} + @@ -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); + } +} + @@ -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 */ @@ -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; +} @@ -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 |